From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id A3364383A0E1 for ; Fri, 16 Dec 2022 17:18:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A3364383A0E1 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1671211099; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=p4xjVhslGIDGqfjA8KgPg9CaRUi6h4TpfJsHR5qPy2o=; b=OYSjF8+Mqj3gXQkZrzuFXYTIs31rGGKcQjTpiJDFcAsCuH/QkY4wPggEPLP2Cr5g5QAL9N 0wKiYmSSVawqcxH05xEdoaiVotRk3heHDQwmZqdak+9Zs4A8RlN1FMwgdP3RlAmSVTqO4N oRI+k9tYRbyxgjKMDCOyl1j0YIZY7l4= Received: from mail-oa1-f72.google.com (mail-oa1-f72.google.com [209.85.160.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-561-t5UgahVuNRixuJXdEV7PTw-1; Fri, 16 Dec 2022 12:18:17 -0500 X-MC-Unique: t5UgahVuNRixuJXdEV7PTw-1 Received: by mail-oa1-f72.google.com with SMTP id 586e51a60fabf-144da30bb39so1575483fac.10 for ; Fri, 16 Dec 2022 09:18:17 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=p4xjVhslGIDGqfjA8KgPg9CaRUi6h4TpfJsHR5qPy2o=; b=EaEk6sHWr6PBAgkTkAsB35/n2+/oxBxwBcqPkyoWDCUqHG+tHLMrGpv9xDLqas0MxT ahnRE9hHCCgltP6uotPAXhGcg0dwPINiSWyzGeRUisjHgGHChPYBG1DbQ7gTQrsqIFsI NkwTAmCUOc4vO9GfTLwaC3oJ3k2vtFTLshL51k25L0m6OoiE1JROf6p1e5fGu65lCQCZ nlTcKuhWiZS2igcC+00V9mPP1tHXM+ep1tpp4xrf9GG1FQ/24SHzep3xixtEB3FG3uJw 7ggdcUUcIKy8Er0apZM7Vk5t3uqS8XV/rzgmzyLhYakGzm4edRybskVWUxSqzTM0hp0M fmaA== X-Gm-Message-State: ANoB5pl7mz3B79WObFwQKQRGwSG3pz9K1KX94jzRPl9dTOs/S+CvAwZy K3W/nLZBWJo5hcv09GPFIY60u68C7/l1pQGlkhQf+CeJmQuhsN9UJ61/wCamQjYhznDCQGifNk6 BbIYeW0OExBPXwQYQ9EflHdB8XKy85ho= X-Received: by 2002:a05:6808:1a20:b0:354:4a36:aa32 with SMTP id bk32-20020a0568081a2000b003544a36aa32mr552285oib.15.1671211096898; Fri, 16 Dec 2022 09:18:16 -0800 (PST) X-Google-Smtp-Source: AA0mqf6zRTnADkoRWlYBKNvgh9CkrYTYJMZJefpgsqgJ5c17injiGIcO1IRXphBJ41B6bse65/7mUGDJ/vvTqRB5zfk= X-Received: by 2002:a05:6808:1a20:b0:354:4a36:aa32 with SMTP id bk32-20020a0568081a2000b003544a36aa32mr552282oib.15.1671211096430; Fri, 16 Dec 2022 09:18:16 -0800 (PST) MIME-Version: 1.0 References: <0f1f223a-3756-1da3-bd1d-b87edd34e1f9@126.com> <4435122.LvFx2qVVIh@fomalhaut> <5795a640ae545b07f11763c310825cc9@autistici.org> <21655510.EfDdHjke4D@fomalhaut> In-Reply-To: <21655510.EfDdHjke4D@fomalhaut> From: Jonathan Wakely Date: Fri, 16 Dec 2022 17:18:04 +0000 Message-ID: Subject: Re: Adding a new thread model to GCC To: Eric Botcazou Cc: i.nixman@autistici.org, libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org, Jonathan Yong <10walls@gmail.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000bf952805eff52739" X-Spam-Status: No, score=-5.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP,URIBL_SBL_A autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000bf952805eff52739 Content-Type: text/plain; charset="UTF-8" On Mon, 31 Oct 2022 at 09:19, Eric Botcazou via Libstdc++ wrote: > I have attached a revised version of the original patch at: > https://gcc.gnu.org/legacy-ml/gcc-patches/2019-06/msg01840.html > > This reimplements the GNU threads library on native Windows (except for the > Objective-C specific subset) using direct Win32 API calls, in lieu of the > implementation based on semaphores. This base implementations requires > Windows XP/Server 2003, which was the default minimal setting of MinGW-W64 > until end of 2020. This also adds the support required for the C++11 threads, > using again direct Win32 API calls; this additional layer requires Windows > Vista/Server 2008 and is enabled only if _WIN32_WINNT >= 0x0600. > > This also changes libstdc++ to pass -D_WIN32_WINNT=0x0600 but only when the > switch --enable-libstdcxx-threads is passed, which means that C++11 threads > are still disabled by default *unless* MinGW-W64 itself is configured for > Windows Vista/Server 2008 or later by default (this has been the case in > the development version since end of 2020, for earlier versions you can > configure it --with-default-win32-winnt=0x0600 to get the same effect). > > I only manually tested it on i686-w64-mingw32 and x86_64-w64-mingw32 but > AdaCore has used it in their C/C++/Ada compilers for 3 years now and the > 30_threads chapter of the libstdc++ testsuite was clean at the time. The libgcc parts look reasonable to me, but I can't approve them. Maybe Jonathan Yong can approve those parts as mingw-w64 target maintainer, or maybe a libgcc approver can do so. The libstdc++ parts are OK for trunk. IIUC they could go in separately, they just wouldn't be very much use without the libgcc changes. > 2022-10-31 Eric Botcazou > > libgcc/ > * config.host (i[34567]86-*-mingw*): Add thread fragment after EH one > as well as new i386/t-slibgcc-mingw fragment. > (x86_64-*-mingw*): Likewise. > * config/i386/gthr-win32.h: If _WIN32_WINNT is at least 0x0600, define > both __GTHREAD_HAS_COND and __GTHREADS_CXX0X to 1. > Error out if _GTHREAD_USE_MUTEX_TIMEDLOCK is 1. > Include stdlib.h instead of errno.h and do not include _mingw.h. > (CONST_CAST2): Add specific definition for C++. > (ATTRIBUTE_UNUSED): New macro. > (__UNUSED_PARAM): Delete. > Define WIN32_LEAN_AND_MEAN before including windows.h. > (__gthread_objc_data_tls): Use TLS_OUT_OF_INDEXES instead of (DWORD)-1. > (__gthread_objc_init_thread_system): Likewise. > (__gthread_objc_thread_get_data): Minor tweak. > (__gthread_objc_condition_allocate): Use ATTRIBUTE_UNUSED. > (__gthread_objc_condition_deallocate): Likewise. > (__gthread_objc_condition_wait): Likewise. > (__gthread_objc_condition_broadcast): Likewise. > (__gthread_objc_condition_signal): Likewise. > Include sys/time.h. > (__gthr_win32_DWORD): New typedef. > (__gthr_win32_HANDLE): Likewise. > (__gthr_win32_CRITICAL_SECTION): Likewise. > (__gthr_win32_CONDITION_VARIABLE): Likewise. > (__gthread_t): Adjust. > (__gthread_key_t): Likewise. > (__gthread_mutex_t): Likewise. > (__gthread_recursive_mutex_t): Likewise. > (__gthread_cond_t): New typedef. > (__gthread_time_t): Likewise. > (__GTHREAD_MUTEX_INIT_DEFAULT): Delete. > (__GTHREAD_RECURSIVE_MUTEX_INIT_DEFAULT): Likewise. > (__GTHREAD_COND_INIT_FUNCTION): Define. > (__GTHREAD_TIME_INIT): Likewise. > (__gthr_i486_lock_cmp_xchg): Delete. > (__gthr_win32_create): Declare. > (__gthr_win32_join): Likewise. > (__gthr_win32_self): Likewise. > (__gthr_win32_detach): Likewise. > (__gthr_win32_equal): Likewise. > (__gthr_win32_yield): Likewise. > (__gthr_win32_mutex_destroy): Likewise. > (__gthr_win32_cond_init_function): Likewise if __GTHREADS_HAS_COND is 1. > (__gthr_win32_cond_broadcast): Likewise. > (__gthr_win32_cond_signal): Likewise. > (__gthr_win32_cond_wait): Likewise. > (__gthr_win32_cond_timedwait): Likewise. > (__gthr_win32_recursive_mutex_init_function): Delete. > (__gthr_win32_recursive_mutex_lock): Likewise. > (__gthr_win32_recursive_mutex_unlock): Likewise. > (__gthr_win32_recursive_mutex_destroy): Likewise. > (__gthread_create): New inline function. > (__gthread_join): Likewise. > (__gthread_self): Likewise. > (__gthread_detach): Likewise. > (__gthread_equal): Likewise. > (__gthread_yield): Likewise. > (__gthread_cond_init_function): Likewise if __GTHREADS_HAS_COND is 1. > (__gthread_cond_broadcast): Likewise. > (__gthread_cond_signal): Likewise. > (__gthread_cond_wait): Likewise. > (__gthread_cond_timedwait): Likewise. > (__GTHREAD_WIN32_INLINE): New macro. > (__GTHREAD_WIN32_COND_INLINE): Likewise. > (__GTHREAD_WIN32_ACTIVE_P): Likewise. > Define WIN32_LEAN_AND_MEAN before including windows.h. > (__gthread_once): Minor tweaks. > (__gthread_key_create): Use ATTRIBUTE_UNUSED and TLS_OUT_OF_INDEXES. > (__gthread_key_delete): Minor tweak. > (__gthread_getspecific): Likewise. > (__gthread_setspecific): Likewise. > (__gthread_mutex_init_function): Reimplement. > (__gthread_mutex_destroy): Likewise. > (__gthread_mutex_lock): Likewise. > (__gthread_mutex_trylock): Likewise. > (__gthread_mutex_unlock): Likewise. > (__gthr_win32_abs_to_rel_time): Declare. > (__gthread_recursive_mutex_init_function): Reimplement. > (__gthread_recursive_mutex_destroy): Likewise. > (__gthread_recursive_mutex_lock): Likewise. > (__gthread_recursive_mutex_trylock): Likewise. > (__gthread_recursive_mutex_unlock): Likewise. > (__gthread_cond_destroy): New inline function. > (__gthread_cond_wait_recursive): Likewise. > * config/i386/gthr-win32.c: Delete everything. > Include gthr-win32.h to get the out-of-line version of inline routines. > Add compile-time checks for the local version of the Win32 types. > * config/i386/gthr-win32-cond.c: New file. > * config/i386/gthr-win32-thread.c: Likewise. > * config/i386/t-gthr-win32: Add config/i386/gthr-win32-thread.c to the > EH part, config/i386/gthr-win32-cond.c and config/i386/gthr-win32.c to > the static version of libgcc. > * config/i386/t-slibgcc-mingw: New file. > * config/i386/libgcc-mingw.ver: Likewise. > libstdc++-v3/ > * acinclude.m4 (GLIBCXX_EXPORT_FLAGS): Substitute CPPFLAGS. > (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Set ac_has_sched_yield and > ac_has_win32_sleep to yes for MinGW. Change HAVE_WIN32_SLEEP > into _GLIBCXX_USE_WIN32_SLEEP. > (GLIBCXX_CHECK_GTHREADS): Add _WIN32_THREADS to compilation flags for > Win32 threads and force _GTHREAD_USE_MUTEX_TIMEDLOCK to 0 for them. > Add -D_WIN32_WINNT=0x0600 to compilation flags if yes was configured > and add it to CPPFLAGS on success. > * config.h.in: Regenerate. > * configure: Likewise. > * config/os/mingw32-w64/os_defines.h (_GLIBCXX_USE_GET_NPROCS_WIN32): > Define to 1. > * config/os/mingw32/os_defines.h (_GLIBCXX_USE_GET_NPROCS_WIN32): Ditto > * src/c++11/thread.cc (get_nprocs): Provide Win32 implementation if > _GLIBCXX_USE_GET_NPROCS_WIN32 is defined. Replace HAVE_WIN32_SLEEP > with USE_WIN32_SLEEP. > * testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc: Add > missing conditional compilation. > * testsuite/lib/libstdc++.exp (check_v3_target_sleep): Add support for > _GLIBCXX_USE_WIN32_SLEEP. > (check_v3_target_nprocs): Likewise for _GLIBCXX_USE_GET_NPROCS_WIN32. > > -- > Eric Botcazou --000000000000bf952805eff52739 Content-Type: application/x-patch; name="p13.diff" Content-Disposition: attachment; filename="p13.diff" Content-Transfer-Encoding: base64 Content-ID: <1851bf14464ec5365e12> X-Attachment-Id: 1851bf14464ec5365e12 ZGlmZiAtLWdpdCBhL2xpYmdjYy9jb25maWcuaG9zdCBiL2xpYmdjYy9jb25maWcuaG9zdA0KaW5k ZXggZWIyM2FiZTg5ZjUuLmQyMDg3NjU0YzQwIDEwMDY0NA0KLS0tIGEvbGliZ2NjL2NvbmZpZy5o b3N0DQorKysgYi9saWJnY2MvY29uZmlnLmhvc3QNCkBAIC04MjAsMTMgKzgyMCwxMyBAQCBpWzM0 NTY3XTg2LSotbWluZ3cqKQ0KIAlmaQ0KIAljYXNlICR7dGFyZ2V0X3RocmVhZF9maWxlfSBpbg0K IAkgIHdpbjMyKQ0KLQkgICAgdG1ha2VfZmlsZT0iJHRtYWtlX2ZpbGUgaTM4Ni90LWd0aHItd2lu MzIiDQorCSAgICB0bWFrZV90aHJfZmlsZT0iaTM4Ni90LWd0aHItd2luMzIiDQogCSAgICA7Ow0K IAkgIHBvc2l4KQ0KLQkgICAgdG1ha2VfZmlsZT0iaTM4Ni90LW1pbmd3LXB0aHJlYWQgJHRtYWtl X2ZpbGUiDQorCSAgICB0bWFrZV90aHJfZmlsZT0iaTM4Ni90LW1pbmd3LXB0aHJlYWQiDQogCSAg ICA7Ow0KIAkgIG1jZikNCi0JICAgIHRtYWtlX2ZpbGU9ImkzODYvdC1taW5ndy1tY2ZndGhyZWFk ICR0bWFrZV9maWxlIg0KKwkgICAgdG1ha2VfdGhyX2ZpbGU9ImkzODYvdC1taW5ndy1tY2ZndGhy ZWFkIg0KIAkgICAgOzsNCiAJZXNhYw0KIAkjIFRoaXMgaGFzIHRvIG1hdGNoIHRoZSBsb2dpYyBm b3IgRFdBUkYyX1VOV0lORF9JTkZPIGluIGdjYy9jb25maWcvaTM4Ni9jeWdtaW5nLmgNCkBAIC04 NDIsMTggKzg0MiwxOCBAQCBpWzM0NTY3XTg2LSotbWluZ3cqKQ0KIAllbHNlDQogCQl0bWFrZV9k bGxkaXJfZmlsZT0iaTM4Ni90LWRsbGRpci14Ig0KIAlmaQ0KLQl0bWFrZV9maWxlPSIke3RtYWtl X2ZpbGV9ICR7dG1ha2VfZWhfZmlsZX0gJHt0bWFrZV9kbGxkaXJfZmlsZX0gaTM4Ni90LXNsaWJn Y2MtY3lnbWluZyBpMzg2L3QtY3lnbWluZyBpMzg2L3QtbWluZ3czMiB0LWNydGZtIGkzODYvdC1j aGtzdGsgdC1kZnBydWxlcyINCisJdG1ha2VfZmlsZT0iJHt0bWFrZV9maWxlfSAke3RtYWtlX2Vo X2ZpbGV9ICR7dG1ha2VfdGhyX2ZpbGV9ICR7dG1ha2VfZGxsZGlyX2ZpbGV9IGkzODYvdC1zbGli Z2NjLWN5Z21pbmcgaTM4Ni90LXNsaWJnY2MtbWluZ3cgaTM4Ni90LWN5Z21pbmcgaTM4Ni90LW1p bmd3MzIgdC1jcnRmbSBpMzg2L3QtY2hrc3RrIHQtZGZwcnVsZXMiDQogCTs7DQogeDg2XzY0LSot bWluZ3cqKQ0KIAljYXNlICR7dGFyZ2V0X3RocmVhZF9maWxlfSBpbg0KIAkgIHdpbjMyKQ0KLQkg ICAgdG1ha2VfZmlsZT0iJHRtYWtlX2ZpbGUgaTM4Ni90LWd0aHItd2luMzIiDQorCSAgICB0bWFr ZV90aHJfZmlsZT0iaTM4Ni90LWd0aHItd2luMzIiDQogCSAgICA7Ow0KIAkgIHBvc2l4KQ0KLQkg ICAgdG1ha2VfZmlsZT0iaTM4Ni90LW1pbmd3LXB0aHJlYWQgJHRtYWtlX2ZpbGUiDQorCSAgICB0 bWFrZV90aHJfZmlsZT0iaTM4Ni90LW1pbmd3LXB0aHJlYWQiDQogCSAgICA7Ow0KIAkgIG1jZikN Ci0JICAgIHRtYWtlX2ZpbGU9ImkzODYvdC1taW5ndy1tY2ZndGhyZWFkICR0bWFrZV9maWxlIg0K KwkgICAgdG1ha2VfdGhyX2ZpbGU9ImkzODYvdC1taW5ndy1tY2ZndGhyZWFkIg0KIAkgICAgOzsN CiAJZXNhYw0KIAkjIFRoaXMgaGFzIHRvIG1hdGNoIHRoZSBsb2dpYyBmb3IgRFdBUkYyX1VOV0lO RF9JTkZPIGluIGdjYy9jb25maWcvaTM4Ni9jeWdtaW5nLmgNCkBAIC04NzIsNyArODcyLDcgQEAg eDg2XzY0LSotbWluZ3cqKQ0KIAllbHNlDQogCQl0bWFrZV9kbGxkaXJfZmlsZT0iaTM4Ni90LWRs bGRpci14Ig0KIAlmaQ0KLQl0bWFrZV9maWxlPSIke3RtYWtlX2ZpbGV9ICR7dG1ha2VfZWhfZmls ZX0gJHt0bWFrZV9kbGxkaXJfZmlsZX0gaTM4Ni90LXNsaWJnY2MtY3lnbWluZyBpMzg2L3QtY3ln bWluZyBpMzg2L3QtbWluZ3czMiB0LWRmcHJ1bGVzIHQtY3J0Zm0gaTM4Ni90LWNoa3N0ayINCisJ dG1ha2VfZmlsZT0iJHt0bWFrZV9maWxlfSAke3RtYWtlX2VoX2ZpbGV9ICR7dG1ha2VfdGhyX2Zp bGV9ICR7dG1ha2VfZGxsZGlyX2ZpbGV9IGkzODYvdC1zbGliZ2NjLWN5Z21pbmcgaTM4Ni90LXNs aWJnY2MtbWluZ3cgaTM4Ni90LWN5Z21pbmcgaTM4Ni90LW1pbmd3MzIgdC1kZnBydWxlcyB0LWNy dGZtIGkzODYvdC1jaGtzdGsiDQogCWV4dHJhX3BhcnRzPSIkZXh0cmFfcGFydHMgY3J0YmVnaW4u byBjcnRlbmQubyBjcnRmYXN0bWF0aC5vIg0KIAlpZiB0ZXN0IHgkZW5hYmxlX3Z0YWJsZV92ZXJp ZnkgPSB4eWVzOyB0aGVuDQogCQlleHRyYV9wYXJ0cz0iJGV4dHJhX3BhcnRzIHZ0dl9zdGFydC5v IHZ0dl9lbmQubyB2dHZfc3RhcnRfcHJlaW5pdC5vIHZ0dl9lbmRfcHJlaW5pdC5vIg0KZGlmZiAt LWdpdCBhL2xpYmdjYy9jb25maWcvaTM4Ni9ndGhyLXdpbjMyLWNvbmQuYyBiL2xpYmdjYy9jb25m aWcvaTM4Ni9ndGhyLXdpbjMyLWNvbmQuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAw MDAwMDAwMDAwLi42YjZmYjQ1ZDVkMw0KLS0tIC9kZXYvbnVsbA0KKysrIGIvbGliZ2NjL2NvbmZp Zy9pMzg2L2d0aHItd2luMzItY29uZC5jDQpAQCAtMCwwICsxLDg5IEBADQorLyogSW1wbGVtZW50 YXRpb24gb2YgdGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciBsaWJnY2MyLiAgKi8N CisNCisvKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s IEluYy4NCisNCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQorDQorR0NDIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCit0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eSB0aGUgRnJlZQ0KK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQordmVyc2lvbi4NCisNCitHQ0MgaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQor V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFC SUxJVFkgb3INCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCitmb3IgbW9yZSBkZXRhaWxzLg0KKw0KK1VuZGVyIFNl Y3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbA0KK3Bl cm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24s IHZlcnNpb24NCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLg0KKw0KK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFuZA0KK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFy eSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07DQorc2VlIHRoZSBmaWxlcyBDT1BZ SU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlDQorPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8NCisNCisvKiBUaGlzIG1vZHVsZSBpcyBz ZXBhcmF0ZSBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIGl0DQor ICAgcmVmZXJlbmNlcyBzeW1ib2xzIGluIHN5c3RlbSBsaWJyYXJpZXMgdGhhdCBhcmUgb25seSBh dmFpbGFibGUgb24gVmlzdGENCisgICBhbmQgU2VydmVyIDIwMDggb3IgbGF0ZXIgdmVyc2lvbnMu ICAqLw0KKw0KKy8qIEdldCB0aGUgb3V0LW9mLWxpbmUgdmVyc2lvbiBvZiB0aGUgaW5saW5lIHJv dXRpbmVzLiAgKi8NCisNCisjaWYgX1dJTjMyX1dJTk5UIDwgMHgwNjAwDQorI3VuZGVmIF9XSU4z Ml9XSU5OVA0KKyNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDYwMA0KKyNlbmRpZg0KKw0KKyNkZWZp bmUgX19HVEhSRUFEX1dJTjMyX0NPTkRfSU5MSU5FDQorDQorI2RlZmluZSBfX2d0aHJlYWRfY29u ZF9pbml0X2Z1bmN0aW9uIF9fZ3Rocl93aW4zMl9jb25kX2luaXRfZnVuY3Rpb24NCisjZGVmaW5l IF9fZ3RocmVhZF9jb25kX2Jyb2FkY2FzdCBfX2d0aHJfd2luMzJfY29uZF9icm9hZGNhc3QNCisj ZGVmaW5lIF9fZ3RocmVhZF9jb25kX3NpZ25hbCBfX2d0aHJfd2luMzJfY29uZF9zaWduYWwNCisj ZGVmaW5lIF9fZ3RocmVhZF9jb25kX3dhaXQgX19ndGhyX3dpbjMyX2NvbmRfd2FpdA0KKyNkZWZp bmUgX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IF9fZ3Rocl93aW4zMl9jb25kX3RpbWVkd2FpdA0K Kw0KKyNpbmNsdWRlICJndGhyLXdpbjMyLmgiDQorDQorLyogVGhlIG51bWJlciBvZiAxMDAtbmFu b3NlY29uZHMgYmV0d2VlbiAxLzEvMTYwMSBhbmQgMS8xLzE5NzAuICovDQorI2RlZmluZSBGSUxF VElNRV8xOTcwIDExNjQ0NDczNjAwMDAwMDAwMFVMTA0KKw0KKy8qIFRoZSBudW1iZXIgb2YgMTAw LW5hbm9zZWNvbmRzIHBlciBzZWNvbmQuICAqLw0KKyNkZWZpbmUgTlNFQzEwMF9QRVJfU0VDICgx MDAwMDAwMDAwVUxMIC8gMTAwKQ0KKw0KKy8qIFRoZSBudW1iZXIgb2YgMTAwLW5hbm9zZWNvbmRz IHBlciBtaWxsaXNlY29uZC4gICovDQorI2RlZmluZSBOU0VDMTAwX1BFUl9NU0VDIChOU0VDMTAw X1BFUl9TRUMgLyAxMDAwKQ0KKw0KKy8qIFRoZSBjZWlsaW5nIGRpdmlzaW9uIG9mIFggYnkgWS4g ICovDQorI2RlZmluZSBDRUlMX0RJVihYLCBZKSAoKChYKSArIChZKSAtIDEpIC8gKFkpKQ0KKw0K Ky8qIENvbnZlcnQgYWJzb2x1dGUgdGhyZWFkIHRpbWUgdG8gcmVsYXRpdmUgdGltZSBpbiBtaWxs aXNlY29uZC4gICovDQorDQorRFdPUkQNCitfX2d0aHJfd2luMzJfYWJzX3RvX3JlbF90aW1lIChj b25zdCBfX2d0aHJlYWRfdGltZV90ICphYnNfdGltZSkNCit7DQorICB1bmlvbiB7DQorICAgIFVM T05HTE9ORyBuc2VjMTAwOw0KKyAgICBGSUxFVElNRSBmdDsNCisgIH0gbm93Ow0KKyAgVUxPTkdM T05HIGFic190aW1lX25zZWMxMDA7DQorDQorICAvKiBUaGUgV2luZG93cyBlcG9jaCBpcyAxLzEv MTYwMSB3aGlsZSB0aGUgVW5peCBlcG9jaCBpcyAxLzEvMTk3MC4gICovDQorICBHZXRTeXN0ZW1U aW1lQXNGaWxlVGltZSAoJm5vdy5mdCk7DQorICBub3cubnNlYzEwMCAtPSBGSUxFVElNRV8xOTcw Ow0KKw0KKyAgYWJzX3RpbWVfbnNlYzEwMA0KKyAgICA9IChVTE9OR0xPTkcpIGFic190aW1lLT50 dl9zZWMgKiBOU0VDMTAwX1BFUl9TRUMNCisJKyBDRUlMX0RJViAoYWJzX3RpbWUtPnR2X25zZWMs IDEwMCk7DQorDQorICBpZiAoYWJzX3RpbWVfbnNlYzEwMCA8IG5vdy5uc2VjMTAwKQ0KKyAgICBy ZXR1cm4gMDsNCisNCisgIHJldHVybiAoRFdPUkQpIENFSUxfRElWIChhYnNfdGltZV9uc2VjMTAw IC0gbm93Lm5zZWMxMDAsIE5TRUMxMDBfUEVSX1NFQyk7DQorfQ0KKw0KKy8qIENoZWNrIHRoZSBz aXplcyBvZiB0aGUgbG9jYWwgdmVyc2lvbiBvZiB0aGUgV2luMzIgdHlwZXMuICAqLw0KKw0KKyNk ZWZpbmUgQ0hFQ0tfU0laRV9PRihUWVBFKSBcDQorICB0eXBlZGVmIGludCBhc3NlcnRpb25bc2l6 ZW9mKF9fZ3Rocl93aW4zMl8jI1RZUEUpID09IHNpemVvZihUWVBFKSA/IDEgOiAtMV07DQorDQor Q0hFQ0tfU0laRV9PRiAoQ09ORElUSU9OX1ZBUklBQkxFKQ0KZGlmZiAtLWdpdCBhL2xpYmdjYy9j b25maWcvaTM4Ni9ndGhyLXdpbjMyLXRocmVhZC5jIGIvbGliZ2NjL2NvbmZpZy9pMzg2L2d0aHIt d2luMzItdGhyZWFkLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMC4u ODFlNmZkMDk0YzcNCi0tLSAvZGV2L251bGwNCisrKyBiL2xpYmdjYy9jb25maWcvaTM4Ni9ndGhy LXdpbjMyLXRocmVhZC5jDQpAQCAtMCwwICsxLDE2MiBAQA0KKy8qIEltcGxlbWVudGF0aW9uIG9m IHRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMi4gICovDQorDQorLyog Q29weXJpZ2h0IChDKSAxOTk5LTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQor DQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KKw0KK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQordGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUNCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlcg0KK3ZlcnNpb24uDQorDQorR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KK1dBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9y DQorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlDQorZm9yIG1vcmUgZGV0YWlscy4NCisNCitVbmRlciBTZWN0aW9uIDcg b2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwNCitwZXJtaXNzaW9u cyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9u DQorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4NCisN CitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhbmQNCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0 aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOw0KK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5k IENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQ0KKzxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4gICovDQorDQorLyogVGhpcyBtb2R1bGUgaXMgc2VwYXJhdGUg ZnJvbSB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBvbmx5DQorICAgb25l IGNvcHkgb2YgaXQgb3VnaHQgdG8gYmUgbGlua2VkLiAgKi8NCisNCisvKiBUaGUgaW1wbGVtZW50 YXRpb24gc3RyYXRlZ3kgZm9yIHRoZSBjKysweCB0aHJlYWQgc3VwcG9ydCBpcyBhcyBmb2xsb3dz Lg0KKw0KKyAgIEEgR05VIHRocmVhZCBpcyByZXByZXNlbnRlZCBieSBhIFdpbjMyIEhBTkRMRSB0 aGF0IGlzIG9idGFpbmVkIHdoZW4gdGhlDQorICAgV2luMzIgdGhyZWFkIGlzIGNyZWF0ZWQsIGV4 Y2VwdCBvZiBjb3Vyc2UgZm9yIHRoZSBpbml0aWFsIHRocmVhZC4gIFRoaXMNCisgICBXaW4zMiBI QU5ETEUgaXMgc3RvcmVkIGluIGEgZGVzY3JpcHRvciBrZXllZCBmcm9tIFRMUyBtZW1vcnkgZm9y IGV2ZXJ5DQorICAgdGhyZWFkLCBzbyB0aGUgc2VsZiByb3V0aW5lIGNhbiByZXR1cm4gaXQgaW5z dGVhZCBvZiBoYXZpbmcgdG8gZHVwbGljYXRlDQorICAgdGhlIHBzZXVkby1oYW5kbGUgcmV0dXJu ZWQgYnkgR2V0Q3VycmVudFRocmVhZCBlYWNoIHRpbWUgaXQgaXMgaW52b2tlZC4NCisgICBGb3Ig dGhlIGluaXRpYWwgdGhyZWFkLCB0aGlzIFdpbjMyIEhBTkRMRSBpcyBjcmVhdGVkIGR1cmluZyB0 aGUgZmlyc3QNCisgICBjYWxsIHRvIHRoZSBzZWxmIHJvdXRpbmUgdXNpbmcgdGhlIGFmb3JlbWVu dGlvbmVkIHRlY2huaXF1ZS4NCisNCisgICBOb3RlIHRoYXQgdGhlIGVxdWFsIHJvdXRpbmUgY29t cGFyZXMgdGhlIGlkZW50aWZpZXIgb2YgdGhyZWFkcyBpbnN0ZWFkDQorICAgb2YgdGhlaXIgV2lu MzIgSEFORExFLCB3aGljaCB3aWxsIGdpdmUgdGhlIGNvcnJlY3QgcG9zaXRpdmUgYW5zd2VyIGV2 ZW4NCisgICBpbiB0aGUgY2FzZSB3aGVyZSBkaXN0aW5jdCBXaW4zMiBIQU5ETEVzIGhhdmUgYmVl biBjcmVhdGVkIGZvciB0aGUgc2FtZQ0KKyAgIHRocmVhZCBieSBtdWx0aXBsZSBpbnN0YW5jZXMg b2YgbGliZ2NjIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8NCisNCisjaW5jbHVkZSAiZ3Roci13 aW4zMi5oIg0KKw0KKy8qIFRoZSB0aHJlYWQgZGVzY3JpcHRvciBrZXllZCBmcm9tIFRMUyBtZW1v cnkuICAqLw0KK3N0cnVjdCBfX2d0aHJfd2luMzJfdGhyX2Rlc2MNCit7DQorICB2b2lkICooKmZ1 bmMpICh2b2lkKik7DQorICB2b2lkICphcmdzOw0KKyAgSEFORExFIGg7DQorfTsNCisNCisvKiBU aGUgVExTIGtleSB1c2VkIGJ5IG9uZSBpbnN0YW5jZSBvZiB0aGUgbGlicmFyeS4gICovDQorc3Rh dGljIF9fZ3RocmVhZF9rZXlfdCBfX2d0aHJfd2luMzJfdGxzID0gVExTX09VVF9PRl9JTkRFWEVT Ow0KKw0KKy8qIFRoZSBpbml0aWFsaXphdGlvbiBkZXZpY2UgZm9yIHRoZSBUTFMga2V5LiAgKi8N CitzdGF0aWMgX19ndGhyZWFkX29uY2VfdCBfX2d0aHJfd2luMzJfdGxzX29uY2UgPSBfX0dUSFJF QURfT05DRV9JTklUOw0KKw0KKy8qIEluaXRpYWxpemUgdGhlIFRMUyBrZXkuICAqLw0KKw0KK3N0 YXRpYyB2b2lkDQorX19ndGhyX3dpbjMyX3Rsc19pbml0ICh2b2lkKQ0KK3sNCisgIGlmIChfX2d0 aHJlYWRfa2V5X2NyZWF0ZSAoJl9fZ3Rocl93aW4zMl90bHMsIGZyZWUpKQ0KKyAgICBhYm9ydCAo KTsNCit9DQorDQorLyogV3JhcHBlciByb3V0aW5lIGFyb3VuZCB0aHJlYWQgZnVuY3Rpb25zLiAg Ki8NCisNCitzdGF0aWMgRFdPUkQNCitfX2d0aHJfd2luMzJfdGhyZWFkX3dyYXBwZXIgKHZvaWQg KmFyZ3MpDQorew0KKyAgc3RydWN0IF9fZ3Rocl93aW4zMl90aHJfZGVzYyAqdGQgPSAoc3RydWN0 IF9fZ3Rocl93aW4zMl90aHJfZGVzYyAqKSBhcmdzOw0KKw0KKyAgX19ndGhyZWFkX3NldHNwZWNp ZmljIChfX2d0aHJfd2luMzJfdGxzLCB0ZCk7DQorDQorICBEV09SRCBleGl0X2NvZGUgPSAoRFdP UkQpIChVTE9OR19QVFIpICgqdGQtPmZ1bmMpICh0ZC0+YXJncyk7DQorDQorICBFeGl0VGhyZWFk IChleGl0X2NvZGUpOw0KKyAgcmV0dXJuIGV4aXRfY29kZTsNCit9DQorDQorLyogSW1wbGVtZW50 IHRoZSBfX2d0aHJlYWRfY3JlYXRlIHJvdXRpbmUuICAqLw0KKw0KK2ludA0KK19fZ3Rocl93aW4z Ml9jcmVhdGUgKF9fZ3RocmVhZF90ICp0aHIsIHZvaWQgKigqZnVuYykgKHZvaWQqKSwgdm9pZCAq YXJncykNCit7DQorICBzdHJ1Y3QgX19ndGhyX3dpbjMyX3Rocl9kZXNjICp0ZDsNCisNCisgIF9f Z3RocmVhZF9vbmNlICgmX19ndGhyX3dpbjMyX3Rsc19vbmNlLCBfX2d0aHJfd2luMzJfdGxzX2lu aXQpOw0KKw0KKyAgdGQgPSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IF9fZ3Rocl93aW4zMl90aHJf ZGVzYykpOw0KKyAgdGQtPmZ1bmMgPSBmdW5jOw0KKyAgdGQtPmFyZ3MgPSBhcmdzOw0KKyAgdGQt PmggPSBDcmVhdGVUaHJlYWQgKE5VTEwsIDAsDQorCQkJKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUp IF9fZ3Rocl93aW4zMl90aHJlYWRfd3JhcHBlciwNCisJCQkoTFBWT0lEKSB0ZCwgQ1JFQVRFX1NV U1BFTkRFRCwgTlVMTCk7DQorICBpZiAodGQtPmgpDQorICAgIHsNCisgICAgICBSZXN1bWVUaHJl YWQgKHRkLT5oKTsNCisgICAgICAqdGhyID0gKF9fZ3RocmVhZF90KSB0ZC0+aDsNCisgICAgICBy ZXR1cm4gMDsNCisgICAgfQ0KKyAgZWxzZQ0KKyAgICB7DQorICAgICAgZnJlZSAodGQpOw0KKyAg ICAgIHJldHVybiAoaW50KSBHZXRMYXN0RXJyb3IgKCk7DQorICAgIH0NCit9DQorDQorLyogSW1w bGVtZW50IHRoZSBfX2d0aHJlYWRfam9pbiByb3V0aW5lLiAgKi8NCisNCitpbnQNCitfX2d0aHJf d2luMzJfam9pbiAoX19ndGhyZWFkX3QgdGhyLCB2b2lkICoqdmFsdWVfcHRyKQ0KK3sNCisgIGlu dCBzdGF0dXMgPSAwOw0KKw0KKyAgaWYgKEdldFRocmVhZElkICgoSEFORExFKSB0aHIpID09IEdl dEN1cnJlbnRUaHJlYWRJZCAoKSkNCisgICAgcmV0dXJuIDE7DQorDQorICBpZiAoV2FpdEZvclNp bmdsZU9iamVjdCAoKEhBTkRMRSkgdGhyLCBJTkZJTklURSkgPT0gV0FJVF9PQkpFQ1RfMCkNCisg ICAgew0KKyAgICAgIGlmICh2YWx1ZV9wdHIpDQorCXsNCisJICBEV09SRCBleGl0X2NvZGU7DQor CSAgaWYgKEdldEV4aXRDb2RlVGhyZWFkICgoSEFORExFKSB0aHIsICZleGl0X2NvZGUpKQ0KKwkg ICAgKnZhbHVlX3B0ciA9ICh2b2lkICopIChVTE9OR19QVFIpIGV4aXRfY29kZTsNCisJICBlbHNl DQorCSAgICBzdGF0dXMgPSAoaW50KSBHZXRMYXN0RXJyb3IgKCk7DQorCX0NCisgICAgfQ0KKyAg ZWxzZQ0KKyAgICBzdGF0dXMgPSAoaW50KSBHZXRMYXN0RXJyb3IgKCk7DQorDQorICBDbG9zZUhh bmRsZSAoKEhBTkRMRSkgdGhyKTsNCisgIHJldHVybiBzdGF0dXM7DQorfQ0KKw0KKy8qIEltcGxl bWVudCB0aGUgX19ndGhyZWFkX3NlbGYgcm91dGluZS4gICovDQorDQorX19ndGhyZWFkX3QNCitf X2d0aHJfd2luMzJfc2VsZiAodm9pZCkNCit7DQorICBzdHJ1Y3QgX19ndGhyX3dpbjMyX3Rocl9k ZXNjICp0ZDsNCisNCisgIF9fZ3RocmVhZF9vbmNlICgmX19ndGhyX3dpbjMyX3Rsc19vbmNlLCBf X2d0aHJfd2luMzJfdGxzX2luaXQpOw0KKw0KKyAgaWYgKCEodGQgPSBfX2d0aHJlYWRfZ2V0c3Bl Y2lmaWMgKF9fZ3Rocl93aW4zMl90bHMpKSkNCisgICAgew0KKyAgICAgIEhBTkRMRSBwcm9jID0g R2V0Q3VycmVudFByb2Nlc3MgKCk7DQorICAgICAgdGQgPSBtYWxsb2MgKHNpemVvZiAoc3RydWN0 IF9fZ3Rocl93aW4zMl90aHJfZGVzYykpOw0KKyAgICAgIHRkLT5mdW5jID0gTlVMTDsNCisgICAg ICB0ZC0+YXJncyA9IE5VTEw7DQorICAgICAgaWYgKCFEdXBsaWNhdGVIYW5kbGUgKHByb2MsIEdl dEN1cnJlbnRUaHJlYWQoKSwgcHJvYywgJnRkLT5oLCAwLCBGQUxTRSwNCisJCQkgICAgRFVQTElD QVRFX1NBTUVfQUNDRVNTKSkNCisJYWJvcnQgKCk7DQorICAgICAgX19ndGhyZWFkX3NldHNwZWNp ZmljIChfX2d0aHJfd2luMzJfdGxzLCB0ZCk7DQorICAgIH0NCisNCisgIHJldHVybiB0ZC0+aDsN Cit9DQpkaWZmIC0tZ2l0IGEvbGliZ2NjL2NvbmZpZy9pMzg2L2d0aHItd2luMzIuYyBiL2xpYmdj Yy9jb25maWcvaTM4Ni9ndGhyLXdpbjMyLmMNCmluZGV4IGZhZDhmOGFjYTFlLi5kZjA2ZTIwZDE4 YSAxMDA2NDQNCi0tLSBhL2xpYmdjYy9jb25maWcvaTM4Ni9ndGhyLXdpbjMyLmMNCisrKyBiL2xp YmdjYy9jb25maWcvaTM4Ni9ndGhyLXdpbjMyLmMNCkBAIC0xLDEwICsxLDYgQEANCi0vKiBJbXBs ZW1lbnRhdGlvbiBvZiBXMzItc3BlY2lmaWMgdGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVz IGZvcg0KLSAgIGxpYmdjYzIuICAqLw0KKy8qIEltcGxlbWVudGF0aW9uIG9mIHRocmVhZHMgY29t cGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMi4gICovDQogDQogLyogQ29weXJpZ2h0IChD KSAxOTk5LTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQotICAgQ29udHJpYnV0 ZWQgYnkgTXVtaXQgS2hhbiA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4uDQotICAgTW9kaWZpZWQg YW5kIG1vdmVkIHRvIHNlcGFyYXRlIGZpbGUgYnkgRGFubnkgU21pdGgNCi0gICA8ZGFubnlzbWl0 aEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Lg0KIA0KIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4N CiANCkBAIC0yNywyMzkgKzIzLDMzIEBAIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFy eSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07DQogc2VlIHRoZSBmaWxlcyBDT1BZ SU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlDQogPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8NCiANCi0jaW5jbHVkZSA8d2luZG93cy5o Pg0KLSNpZm5kZWYgX19HVEhSRUFEX0hJREVfV0lOMzJBUEkNCi0jIGRlZmluZSBfX0dUSFJFQURf SElERV9XSU4zMkFQSSAxDQotI2VuZGlmDQotI2luY2x1ZGUgImd0aHItd2luMzIuaCINCi0NCi0v KiBXaW5kb3dzMzIgdGhyZWFkcyBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhlIHdpbmRvd3MzMiB0 aHJlYWRpbmcgbW9kZWwNCi0gICBkb2VzIG5vdCBtYXAgd2VsbCBpbnRvIHB0aHJlYWQtaW5zcGly ZWQgZ2NjJ3MgdGhyZWFkaW5nIG1vZGVsLCBhbmQgc28gDQotICAgdGhlcmUgYXJlIGNhdmVhdHMg b25lIG5lZWRzIHRvIGJlIGF3YXJlIG9mLg0KLQ0KLSAgIDEuIFRoZSBkZXN0cnVjdG9yIHN1cHBs aWVkIHRvIF9fZ3RocmVhZF9rZXlfY3JlYXRlIGlzIGlnbm9yZWQgZm9yDQotICAgICAgZ2VuZXJp YyB4ODYtd2luMzIgcG9ydHMuIFRoaXMgd2lsbCBjZXJ0YWlubHkgY2F1c2UgbWVtb3J5IGxlYWtz IA0KLSAgICAgIGR1ZSB0byB1bnJlY2xhaW1lZCBlaCBjb250ZXh0cyAoc2l6ZW9mIChlaF9jb250 ZXh0KSBpcyBhdCBsZWFzdCANCi0gICAgICAyNCBieXRlcyBmb3IgeDg2IGN1cnJlbnRseSkuDQot DQotICAgICAgVGhpcyBtZW1vcnkgbGVhayBtYXkgYmUgc2lnbmlmaWNhbnQgZm9yIGxvbmctcnVu bmluZyBhcHBsaWNhdGlvbnMNCi0gICAgICB0aGF0IG1ha2UgaGVhdnkgdXNlIG9mIEMrKyBFSC4N Ci0NCi0gICAgICBIb3dldmVyLCBNaW5ndyBydW50aW1lICh2ZXJzaW9uIDAuMyBvciBuZXdlcikg cHJvdmlkZXMgYSBtZWNoYW5pc20NCi0gICAgICB0byBlbXVsYXRlIHB0aHJlYWRzIGtleSBkdG9y czsgdGhlIHJ1bnRpbWUgcHJvdmlkZXMgYSBzcGVjaWFsIERMTCwNCi0gICAgICBsaW5rZWQgaW4g aWYgLW10aHJlYWRzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoYXQgcnVucyB0aGUgZHRvcnMgaW4N Ci0gICAgICB0aGUgcmV2ZXJzZSBvcmRlciBvZiByZWdpc3RyYXRpb24gd2hlbiBlYWNoIHRocmVh ZCBleGl0cy4gSWYNCi0gICAgICAtbXRocmVhZHMgb3B0aW9uIGlzIG5vdCBnaXZlbiwgYSBzdHVi IGlzIGxpbmtlZCBpbiBpbnN0ZWFkIG9mIHRoZQ0KLSAgICAgIERMTCwgd2hpY2ggcmVzdWx0cyBp biBtZW1vcnkgbGVhay4gT3RoZXIgeDg2LXdpbjMyIHBvcnRzIGNhbiB1c2UgDQotICAgICAgdGhl IHNhbWUgdGVjaG5pcXVlIG9mIGNvdXJzZSB0byBhdm9pZCB0aGUgbGVhay4NCi0NCi0gICAyLiBU aGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgYXJlIG5vbi1QT1NJWCBsaWtlLCBhbmQgY2FzdCBpbnRv IGludHMuDQotICAgICAgVGhpcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGVycm9yIHJldHVybiBkdWUg dG8gdHJ1bmNhdGlvbiB2YWx1ZXMgb24gDQotICAgICAgaHcgd2hlcmUgc2l6ZW9mIChEV09SRCkg PiBzaXplb2YgKGludCkuDQotICAgDQotICAgMy4gV2UgYXJlIGN1cnJlbnRseSB1c2luZyBhIHNw ZWNpYWwgbXV0ZXggaW5zdGVhZCBvZiB0aGUgQ3JpdGljYWwNCi0gICAgICBTZWN0aW9ucywgc2lu Y2UgV2luOXggZG9lcyBub3Qgc3VwcG9ydCBUcnlFbnRlckNyaXRpY2FsU2VjdGlvbg0KLSAgICAg ICh3aGlsZSBOVCBkb2VzKS4NCi0gIA0KLSAgIFRoZSBiYXNpYyBmcmFtZXdvcmsgc2hvdWxkIHdv cmsgd2VsbCBlbm91Z2guIEluIHRoZSBsb25nIHRlcm0sIEdDQw0KLSAgIG5lZWRzIHRvIHVzZSBT dHJ1Y3R1cmVkIEV4Y2VwdGlvbiBIYW5kbGluZyBvbiBXaW5kb3dzMzIuICAqLw0KLQ0KLWludA0K LV9fZ3Rocl93aW4zMl9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpvbmNlLCB2b2lkICgqZnVuYykg KHZvaWQpKQ0KLXsNCi0gIGlmIChvbmNlID09IE5VTEwgfHwgZnVuYyA9PSBOVUxMKQ0KLSAgICBy ZXR1cm4gRUlOVkFMOw0KLQ0KLSAgaWYgKCEgb25jZS0+ZG9uZSkNCi0gICAgew0KLSAgICAgIGlm IChJbnRlcmxvY2tlZEluY3JlbWVudCAoJihvbmNlLT5zdGFydGVkKSkgPT0gMCkNCi0gICAgICAg IHsNCi0JICAoKmZ1bmMpICgpOw0KLQkgIG9uY2UtPmRvbmUgPSBUUlVFOw0KLQl9DQotICAgICAg ZWxzZQ0KLQl7DQotCSAgLyogQW5vdGhlciB0aHJlYWQgaXMgY3VycmVudGx5IGV4ZWN1dGluZyB0 aGUgY29kZSwgc28gd2FpdCBmb3IgaXQgDQotCSAgICAgdG8gZmluaXNoOyB5aWVsZCB0aGUgQ1BV IGluIHRoZSBtZWFudGltZS4gIElmIHBlcmZvcm1hbmNlIA0KLQkgICAgIGRvZXMgYmVjb21lIGFu IGlzc3VlLCB0aGUgc29sdXRpb24gaXMgdG8gdXNlIGFuIEV2ZW50IHRoYXQgDQotCSAgICAgd2Ug d2FpdCBvbiBoZXJlIChhbmQgc2V0IGFib3ZlKSwgYnV0IHRoYXQgaW1wbGllcyBhIHBsYWNlIHRv IA0KLQkgICAgIGNyZWF0ZSB0aGUgZXZlbnQgYmVmb3JlIHRoaXMgcm91dGluZSBpcyBjYWxsZWQu ICAqLyANCi0JICB3aGlsZSAoISBvbmNlLT5kb25lKQ0KLQkgICAgU2xlZXAgKDApOw0KLQl9DQot ICAgIH0NCi0gIHJldHVybiAwOw0KLX0NCi0NCi0vKiBXaW5kb3dzMzIgdGhyZWFkIGxvY2FsIGtl eXMgZG9uJ3Qgc3VwcG9ydCBkZXN0cnVjdG9yczsgdGhpcyBsZWFkcyB0bw0KLSAgIGxlYWtzLCBl c3BlY2lhbGx5IGluIHRocmVhZGVkIGFwcGxpY2F0aW9ucyBtYWtpbmcgZXh0ZW5zaXZlIHVzZSBv ZiANCi0gICBDKysgRUguIE1pbmd3IHVzZXMgYSB0aHJlYWQtc3VwcG9ydCBETEwgdG8gd29yay1h cm91bmQgdGhpcyBwcm9ibGVtLiAgKi8NCi0NCi1pbnQNCi1fX2d0aHJfd2luMzJfa2V5X2NyZWF0 ZSAoX19ndGhyZWFkX2tleV90ICprZXksDQotCQkJIHZvaWQgKCpkdG9yKSAodm9pZCAqKSBfX2F0 dHJpYnV0ZV9fKCh1bnVzZWQpKSkNCi17DQotICBpbnQgc3RhdHVzID0gMDsNCi0gIERXT1JEIHRs c19pbmRleCA9IFRsc0FsbG9jICgpOw0KLSAgaWYgKHRsc19pbmRleCAhPSAweEZGRkZGRkZGKQ0K LSAgICB7DQotICAgICAgKmtleSA9IHRsc19pbmRleDsNCi0jaWZkZWYgTUlOR1czMl9TVVBQT1JU U19NVF9FSA0KLSAgICAgIC8qIE1pbmd3IHJ1bnRpbWUgd2lsbCBydW4gdGhlIGR0b3JzIGluIHJl dmVyc2Ugb3JkZXIgZm9yIGVhY2ggdGhyZWFkDQotICAgICAgICAgd2hlbiB0aGUgdGhyZWFkIGV4 aXRzLiAgKi8NCi0gICAgICBzdGF0dXMgPSBfX21pbmd3dGhyX2tleV9kdG9yICgqa2V5LCBkdG9y KTsNCi0jZW5kaWYNCi0gICAgfQ0KLSAgZWxzZQ0KLSAgICBzdGF0dXMgPSAoaW50KSBHZXRMYXN0 RXJyb3IgKCk7DQotICByZXR1cm4gc3RhdHVzOw0KLX0NCi0NCi1pbnQNCi1fX2d0aHJfd2luMzJf a2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IGtleSkNCi17DQotICByZXR1cm4gKFRsc0ZyZWUg KGtleSkgIT0gMCkgPyAwIDogKGludCkgR2V0TGFzdEVycm9yICgpOw0KLX0NCi0NCi12b2lkICoN Ci1fX2d0aHJfd2luMzJfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBrZXkpDQotew0KLSAg RFdPUkQgbGFzdGVycm9yOw0KLSAgdm9pZCAqcHRyOw0KLSAgbGFzdGVycm9yID0gR2V0TGFzdEVy cm9yKCk7DQotICBwdHIgPSBUbHNHZXRWYWx1ZShrZXkpOw0KLSAgU2V0TGFzdEVycm9yKCBsYXN0 ZXJyb3IgKTsNCi0gIHJldHVybiBwdHI7DQotfQ0KKy8qIEdldCB0aGUgb3V0LW9mLWxpbmUgdmVy c2lvbiBvZiB0aGUgaW5saW5lIHJvdXRpbmVzLiAgKi8NCisNCisjZGVmaW5lIF9fR1RIUkVBRF9X SU4zMl9BQ1RJVkVfUCgpIDENCisjZGVmaW5lIF9fR1RIUkVBRF9XSU4zMl9JTkxJTkUNCisNCisj ZGVmaW5lIF9fZ3RocmVhZF9kZXRhY2ggX19ndGhyX3dpbjMyX2RldGFjaA0KKyNkZWZpbmUgX19n dGhyZWFkX2VxdWFsIF9fZ3Rocl93aW4zMl9lcXVhbA0KKyNkZWZpbmUgX19ndGhyZWFkX3lpZWxk IF9fZ3Rocl93aW4zMl95aWVsZA0KKyNkZWZpbmUgX19ndGhyZWFkX29uY2UgX19ndGhyX3dpbjMy X29uY2UNCisjZGVmaW5lIF9fZ3RocmVhZF9rZXlfY3JlYXRlIF9fZ3Rocl93aW4zMl9rZXlfY3Jl YXRlDQorI2RlZmluZSBfX2d0aHJlYWRfa2V5X2RlbGV0ZSBfX2d0aHJfd2luMzJfa2V5X2RlbGV0 ZQ0KKyNkZWZpbmUgX19ndGhyZWFkX2dldHNwZWNpZmljIF9fZ3Rocl93aW4zMl9nZXRzcGVjaWZp Yw0KKyNkZWZpbmUgX19ndGhyZWFkX3NldHNwZWNpZmljIF9fZ3Rocl93aW4zMl9zZXRzcGVjaWZp Yw0KKyNkZWZpbmUgX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24gX19ndGhyX3dpbjMyX211 dGV4X2luaXRfZnVuY3Rpb24NCisjZGVmaW5lIF9fZ3RocmVhZF9tdXRleF9kZXN0cm95IF9fZ3Ro cl93aW4zMl9tdXRleF9kZXN0cm95DQorI2RlZmluZSBfX2d0aHJlYWRfbXV0ZXhfbG9jayBfX2d0 aHJfd2luMzJfbXV0ZXhfbG9jaw0KKyNkZWZpbmUgX19ndGhyZWFkX211dGV4X3RyeWxvY2sgX19n dGhyX3dpbjMyX211dGV4X3RyeWxvY2sNCisjZGVmaW5lIF9fZ3RocmVhZF9tdXRleF91bmxvY2sg X19ndGhyX3dpbjMyX211dGV4X3VubG9jaw0KKyNkZWZpbmUgX19ndGhyZWFkX3JlY3Vyc2l2ZV9t dXRleF90cnlsb2NrIF9fZ3Rocl93aW4zMl9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jaw0KIA0KLWlu dA0KLV9fZ3Rocl93aW4zMl9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IGtleSwgY29uc3Qg dm9pZCAqcHRyKQ0KLXsNCi0gIGlmIChUbHNTZXRWYWx1ZSAoa2V5LCBDT05TVF9DQVNUMih2b2lk ICosIGNvbnN0IHZvaWQgKiwgcHRyKSkgIT0gMCkNCi0gICAgcmV0dXJuIDA7DQotICBlbHNlDQot ICAgIHJldHVybiBHZXRMYXN0RXJyb3IgKCk7DQotfQ0KLQ0KLXZvaWQNCi1fX2d0aHJfd2luMzJf bXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KQ0KLXsNCi0gIG11 dGV4LT5jb3VudGVyID0gLTE7DQotICBtdXRleC0+c2VtYSA9IENyZWF0ZVNlbWFwaG9yZVcgKE5V TEwsIDAsIDY1NTM1LCBOVUxMKTsNCi19DQotDQotdm9pZA0KLV9fZ3Rocl93aW4zMl9tdXRleF9k ZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpDQotew0KLSAgQ2xvc2VIYW5kbGUgKChI QU5ETEUpIG11dGV4LT5zZW1hKTsNCi19DQotDQotaW50DQotX19ndGhyX3dpbjMyX211dGV4X2xv Y2sgKF9fZ3RocmVhZF9tdXRleF90ICptdXRleCkNCi17DQotICBpZiAoSW50ZXJsb2NrZWRJbmNy ZW1lbnQgKCZtdXRleC0+Y291bnRlcikgPT0gMCB8fA0KLSAgICAgIFdhaXRGb3JTaW5nbGVPYmpl Y3QgKG11dGV4LT5zZW1hLCBJTkZJTklURSkgPT0gV0FJVF9PQkpFQ1RfMCkNCi0gICAgcmV0dXJu IDA7DQotICBlbHNlDQotICAgIHsNCi0gICAgICAvKiBXYWl0Rm9yU2luZ2xlT2JqZWN0IHJldHVy bnMgV0FJVF9GQUlMRUQsIGFuZCB3ZSBjYW4gb25seSBkbw0KLSAgICAgICAgIHNvbWUgYmVzdC1l ZmZvcnQgY2xlYW51cCBoZXJlLiAgKi8NCi0gICAgICBJbnRlcmxvY2tlZERlY3JlbWVudCAoJm11 dGV4LT5jb3VudGVyKTsNCi0gICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLX0NCi0NCi1pbnQNCi1f X2d0aHJfd2luMzJfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KQ0KLXsN Ci0gIGlmIChfX0dUSFJfVzMyX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlICgmbXV0ZXgtPmNv dW50ZXIsIDAsIC0xKSA8IDApDQotICAgIHJldHVybiAwOw0KLSAgZWxzZQ0KLSAgICByZXR1cm4g MTsNCi19DQotDQotaW50DQotX19ndGhyX3dpbjMyX211dGV4X3VubG9jayAoX19ndGhyZWFkX211 dGV4X3QgKm11dGV4KQ0KLXsNCi0gIGlmIChJbnRlcmxvY2tlZERlY3JlbWVudCAoJm11dGV4LT5j b3VudGVyKSA+PSAwKQ0KLSAgICByZXR1cm4gUmVsZWFzZVNlbWFwaG9yZSAobXV0ZXgtPnNlbWEs IDEsIE5VTEwpID8gMCA6IDE7DQotICBlbHNlDQotICAgIHJldHVybiAwOw0KLX0NCi0NCi12b2lk DQotX19ndGhyX3dpbjMyX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRf cmVjdXJzaXZlX211dGV4X3QgKm11dGV4KQ0KLXsNCi0gIG11dGV4LT5jb3VudGVyID0gLTE7DQot ICBtdXRleC0+ZGVwdGggPSAwOw0KLSAgbXV0ZXgtPm93bmVyID0gMDsNCi0gIG11dGV4LT5zZW1h ID0gQ3JlYXRlU2VtYXBob3JlVyAoTlVMTCwgMCwgNjU1MzUsIE5VTEwpOw0KLX0NCi0NCi1pbnQN Ci1fX2d0aHJfd2luMzJfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVf bXV0ZXhfdCAqbXV0ZXgpDQotew0KLSAgRFdPUkQgbWUgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsN Ci0gIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCAoJm11dGV4LT5jb3VudGVyKSA9PSAwKQ0KLSAg ICB7DQotICAgICAgbXV0ZXgtPmRlcHRoID0gMTsNCi0gICAgICBtdXRleC0+b3duZXIgPSBtZTsN Ci0gICAgfQ0KLSAgZWxzZSBpZiAobXV0ZXgtPm93bmVyID09IG1lKQ0KLSAgICB7DQotICAgICAg SW50ZXJsb2NrZWREZWNyZW1lbnQgKCZtdXRleC0+Y291bnRlcik7DQotICAgICAgKysobXV0ZXgt PmRlcHRoKTsNCi0gICAgfQ0KLSAgZWxzZSBpZiAoV2FpdEZvclNpbmdsZU9iamVjdCAobXV0ZXgt PnNlbWEsIElORklOSVRFKSA9PSBXQUlUX09CSkVDVF8wKQ0KLSAgICB7DQotICAgICAgbXV0ZXgt PmRlcHRoID0gMTsNCi0gICAgICBtdXRleC0+b3duZXIgPSBtZTsNCi0gICAgfQ0KLSAgZWxzZQ0K LSAgICB7DQotICAgICAgLyogV2FpdEZvclNpbmdsZU9iamVjdCByZXR1cm5zIFdBSVRfRkFJTEVE LCBhbmQgd2UgY2FuIG9ubHkgZG8NCi0gICAgICAgICBzb21lIGJlc3QtZWZmb3J0IGNsZWFudXAg aGVyZS4gICovDQotICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQgKCZtdXRleC0+Y291bnRlcik7 DQotICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0gIHJldHVybiAwOw0KLX0NCi0NCi1pbnQNCi1f X2d0aHJfd2luMzJfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVf bXV0ZXhfdCAqbXV0ZXgpDQotew0KLSAgRFdPUkQgbWUgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsN Ci0gIGlmIChfX0dUSFJfVzMyX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlICgmbXV0ZXgtPmNv dW50ZXIsIDAsIC0xKSA8IDApDQotICAgIHsNCi0gICAgICBtdXRleC0+ZGVwdGggPSAxOw0KLSAg ICAgIG11dGV4LT5vd25lciA9IG1lOw0KLSAgICB9DQotICBlbHNlIGlmIChtdXRleC0+b3duZXIg PT0gbWUpDQotICAgICsrKG11dGV4LT5kZXB0aCk7DQotICBlbHNlDQotICAgIHJldHVybiAxOw0K LQ0KLSAgcmV0dXJuIDA7DQotfQ0KLQ0KLWludA0KLV9fZ3Rocl93aW4zMl9yZWN1cnNpdmVfbXV0 ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KQ0KLXsNCi0gIC0t KG11dGV4LT5kZXB0aCk7DQotICBpZiAobXV0ZXgtPmRlcHRoID09IDApDQotICAgIHsNCi0gICAg ICBtdXRleC0+b3duZXIgPSAwOw0KKyNpbmNsdWRlICJndGhyLXdpbjMyLmgiDQogDQotICAgICAg aWYgKEludGVybG9ja2VkRGVjcmVtZW50ICgmbXV0ZXgtPmNvdW50ZXIpID49IDApDQotCXJldHVy biBSZWxlYXNlU2VtYXBob3JlIChtdXRleC0+c2VtYSwgMSwgTlVMTCkgPyAwIDogMTsNCi0gICAg fQ0KKy8qIENoZWNrIHRoZSBzaXplcyBvZiB0aGUgbG9jYWwgdmVyc2lvbiBvZiB0aGUgV2luMzIg dHlwZXMuICAqLw0KIA0KLSAgcmV0dXJuIDA7DQotfQ0KKyNkZWZpbmUgQ0hFQ0tfU0laRV9PRihU WVBFKSBcDQorICB0eXBlZGVmIGludCBhc3NlcnRpb25bc2l6ZW9mKF9fZ3Rocl93aW4zMl8jI1RZ UEUpID09IHNpemVvZihUWVBFKSA/IDEgOiAtMV07DQogDQotaW50DQotX19ndGhyX3dpbjMyX3Jl Y3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4 KQ0KLXsNCi0gIENsb3NlSGFuZGxlICgoSEFORExFKSBtdXRleC0+c2VtYSk7DQotICByZXR1cm4g MDsNCi19DQorQ0hFQ0tfU0laRV9PRiAoRFdPUkQpDQorQ0hFQ0tfU0laRV9PRiAoSEFORExFKQ0K K0NIRUNLX1NJWkVfT0YgKENSSVRJQ0FMX1NFQ1RJT04pDQpkaWZmIC0tZ2l0IGEvbGliZ2NjL2Nv bmZpZy9pMzg2L2d0aHItd2luMzIuaCBiL2xpYmdjYy9jb25maWcvaTM4Ni9ndGhyLXdpbjMyLmgN CmluZGV4IDZmNzBlOWI5ZGVhLi45NDg1ZGQ1MGJmOSAxMDA2NDQNCi0tLSBhL2xpYmdjYy9jb25m aWcvaTM4Ni9ndGhyLXdpbjMyLmgNCisrKyBiL2xpYmdjYy9jb25maWcvaTM4Ni9ndGhyLXdpbjMy LmgNCkBAIC0yOCwxOCArMjgsMTUgQEAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlO Ry5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlDQogI2lmbmRlZiBHQ0NfR1RIUl9X SU4zMl9IDQogI2RlZmluZSBHQ0NfR1RIUl9XSU4zMl9IDQogDQotLyogTWFrZSBzdXJlIENPTlNU X0NBU1QyIChvcmlnaW4gaW4gc3lzdGVtLmgpIGlzIGRlY2xhcmVkLiAgKi8NCi0jaWZuZGVmIENP TlNUX0NBU1QyDQotI2RlZmluZSBDT05TVF9DQVNUMihUT1RZUEUsRlJPTVRZUEUsWCkgKChfX2V4 dGVuc2lvbl9fKHVuaW9uIHtGUk9NVFlQRSBfcTsgVE9UWVBFIF9ucTt9KShYKSkuX25xKQ0KLSNl bmRpZg0KKy8qIFNvIHdlIGNhbiB0ZXN0IFdpbmRvd3MgdmVyc2lvbiBudW1iZXJzLiAgKi8NCisj aW5jbHVkZSA8c3RkbGliLmg+DQogDQotLyogV2luZG93czMyIHRocmVhZHMgc3BlY2lmaWMgZGVm aW5pdGlvbnMuIFRoZSB3aW5kb3dzMzIgdGhyZWFkaW5nIG1vZGVsDQotICAgZG9lcyBub3QgbWFw IHdlbGwgaW50byBwdGhyZWFkLWluc3BpcmVkIGdjYydzIHRocmVhZGluZyBtb2RlbCwgYW5kIHNv DQotICAgdGhlcmUgYXJlIGNhdmVhdHMgb25lIG5lZWRzIHRvIGJlIGF3YXJlIG9mLg0KKy8qIFRo ZSBXaW5kb3dzIHRocmVhZGluZyBtb2RlbCBkb2VzIG5vdCBtYXAgd2VsbCBpbnRvIHRoZSBQT1NJ WCBpbnNwaXJlZA0KKyAgIEdDQyB0aHJlYWRpbmcgbW9kZWwsIHNvIHRoZXJlIGFyZSBjYXZlYXRz IG9uZSBuZWVkcyB0byBiZSBhd2FyZSBvZi4NCiANCiAgICAxLiBUaGUgZGVzdHJ1Y3RvciBzdXBw bGllZCB0byBfX2d0aHJlYWRfa2V5X2NyZWF0ZSBpcyBpZ25vcmVkIGZvcg0KLSAgICAgIGdlbmVy aWMgeDg2LXdpbjMyIHBvcnRzLiBUaGlzIHdpbGwgY2VydGFpbmx5IGNhdXNlIG1lbW9yeSBsZWFr cw0KLSAgICAgIGR1ZSB0byB1bnJlY2xhaW1lZCBlaCBjb250ZXh0cyAoc2l6ZW9mIChlaF9jb250 ZXh0KSBpcyBhdCBsZWFzdA0KKyAgICAgIGdlbmVyaWMgV2luZG93cyBwb3J0cy4gIFRoaXMgd2ls bCBjZXJ0YWlubHkgY2F1c2UgbWVtb3J5IGxlYWtzDQorICAgICAgZHVlIHRvIHVucmVjbGFpbWVk IEVIIGNvbnRleHRzIChzaXplb2YgKGVoX2NvbnRleHQpIGlzIGF0IGxlYXN0DQogICAgICAgMjQg Ynl0ZXMgZm9yIHg4NiBjdXJyZW50bHkpLg0KIA0KICAgICAgIFRoaXMgbWVtb3J5IGxlYWsgbWF5 IGJlIHNpZ25pZmljYW50IGZvciBsb25nLXJ1bm5pbmcgYXBwbGljYXRpb25zDQpAQCAtNTAsMjkg KzQ3LDQxIEBAIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNw ZWN0aXZlbHkuICBJZiBub3QsIHNlZQ0KICAgICAgIGxpbmtlZCBpbiBpZiAtbXRocmVhZHMgb3B0 aW9uIGlzIHNwZWNpZmllZCwgdGhhdCBydW5zIHRoZSBkdG9ycyBpbg0KICAgICAgIHRoZSByZXZl cnNlIG9yZGVyIG9mIHJlZ2lzdHJhdGlvbiB3aGVuIGVhY2ggdGhyZWFkIGV4aXRzLiBJZg0KICAg ICAgIC1tdGhyZWFkcyBvcHRpb24gaXMgbm90IGdpdmVuLCBhIHN0dWIgaXMgbGlua2VkIGluIGlu c3RlYWQgb2YgdGhlDQotICAgICAgRExMLCB3aGljaCByZXN1bHRzIGluIG1lbW9yeSBsZWFrLiBP dGhlciB4ODYtd2luMzIgcG9ydHMgY2FuIHVzZQ0KKyAgICAgIERMTCwgd2hpY2ggcmVzdWx0cyBp biBtZW1vcnkgbGVhay4gIE90aGVyIFdpbmRvd3MgcG9ydHMgY2FuIHVzZQ0KICAgICAgIHRoZSBz YW1lIHRlY2huaXF1ZSBvZiBjb3Vyc2UgdG8gYXZvaWQgdGhlIGxlYWsuDQogDQogICAgMi4gVGhl IGVycm9yIGNvZGVzIHJldHVybmVkIGFyZSBub24tUE9TSVggbGlrZSwgYW5kIGNhc3QgaW50byBp bnRzLg0KICAgICAgIFRoaXMgbWF5IGNhdXNlIGluY29ycmVjdCBlcnJvciByZXR1cm4gZHVlIHRv IHRydW5jYXRpb24gdmFsdWVzIG9uDQogICAgICAgaHcgd2hlcmUgc2l6ZW9mIChEV09SRCkgPiBz aXplb2YgKGludCkuDQogDQotICAgMy4gV2UgYXJlIGN1cnJlbnRseSB1c2luZyBhIHNwZWNpYWwg bXV0ZXggaW5zdGVhZCBvZiB0aGUgQ3JpdGljYWwNCi0gICAgICBTZWN0aW9ucywgc2luY2UgV2lu OXggZG9lcyBub3Qgc3VwcG9ydCBUcnlFbnRlckNyaXRpY2FsU2VjdGlvbg0KLSAgICAgICh3aGls ZSBOVCBkb2VzKS4NCisgICAzLiBQT1NJWC1saWtlIGNvbmRpdGlvbiB2YXJpYWJsZXMgYXJlIHN1 cHBvcnRlZCwgYnV0IG9ubHkgb24gVmlzdGEgYW5kDQorICAgICAgU2VydmVyIDIwMDggb3IgbGF0 ZXIgdmVyc2lvbnMuDQogDQotICAgVGhlIGJhc2ljIGZyYW1ld29yayBzaG91bGQgd29yayB3ZWxs IGVub3VnaC4gSW4gdGhlIGxvbmcgdGVybSwgR0NDDQotICAgbmVlZHMgdG8gdXNlIFN0cnVjdHVy ZWQgRXhjZXB0aW9uIEhhbmRsaW5nIG9uIFdpbmRvd3MzMi4gICovDQorICAgNC4gVGltZWQgbG9j ayBwcmltaXRpdmVzIGFyZSBub3Qgc3VwcG9ydGVkLiAgKi8NCiANCiAjZGVmaW5lIF9fR1RIUkVB RFMgMQ0KIA0KLSNpbmNsdWRlIDxlcnJuby5oPg0KLSNpZmRlZiBfX01JTkdXMzJfXw0KLSNpbmNs dWRlIDxfbWluZ3cuaD4NCisvKiBDb25kaXRpb24gdmFyaWFibGVzIGFyZSBzdXBwb3J0ZWQgb24g VmlzdGEgYW5kIFNlcnZlciAyMDA4IG9yIGxhdGVyLiAgKi8NCisjaWYgX1dJTjMyX1dJTk5UID49 IDB4MDYwMA0KKyNkZWZpbmUgX19HVEhSRUFEX0hBU19DT05EIDENCisjZGVmaW5lIF9fR1RIUkVB RFNfQ1hYMFggMQ0KKyNlbmRpZg0KKw0KKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NL DQorI2Vycm9yIFRpbWVkIGxvY2sgcHJpbWl0aXZlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5k b3dzIHRhcmdldHMNCisjZW5kaWYNCisNCisvKiBNYWtlIHN1cmUgQ09OU1RfQ0FTVDIgKG9yaWdp biBpbiBzeXN0ZW0uaCkgaXMgZGVjbGFyZWQuICAqLw0KKyNpZm5kZWYgQ09OU1RfQ0FTVDINCisj aWZkZWYgX19jcGx1c3BsdXMNCisjZGVmaW5lIENPTlNUX0NBU1QyKFRPVFlQRSxGUk9NVFlQRSxY KSAoY29uc3RfY2FzdDxUT1RZUEU+IChYKSkNCisjZWxzZQ0KKyNkZWZpbmUgQ09OU1RfQ0FTVDIo VE9UWVBFLEZST01UWVBFLFgpICgoX19leHRlbnNpb25fXyh1bmlvbiB7RlJPTVRZUEUgX3E7IFRP VFlQRSBfbnE7fSkoWCkpLl9ucSkNCisjZW5kaWYNCiAjZW5kaWYNCiANCi0jaWZuZGVmIF9fVU5V U0VEX1BBUkFNDQotI2RlZmluZSBfX1VOVVNFRF9QQVJBTSh4KSB4DQorI2lmbmRlZiBBVFRSSUJV VEVfVU5VU0VEDQorI2RlZmluZSBBVFRSSUJVVEVfVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3Vu dXNlZF9fKSkNCiAjZW5kaWYNCiANCiAjaWZkZWYgX0xJQk9CSkMNCkBAIC04MiwxMiArOTEsMTMg QEAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVs eS4gIElmIG5vdCwgc2VlDQogI2lmbmRlZiBfX09CSkNfXw0KICNkZWZpbmUgX19PQkpDX18NCiAj ZW5kaWYNCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4NCiAjaW5jbHVkZSA8d2luZG93cy5o Pg0KIC8qIE5vdyB1bmRlZiB0aGUgd2luZG93cyBCT09MLiAgKi8NCiAjdW5kZWYgQk9PTA0KIA0K IC8qIEtleSBzdHJ1Y3R1cmUgZm9yIG1haW50YWluaW5nIHRocmVhZCBzcGVjaWZpYyBzdG9yYWdl ICovDQotc3RhdGljIERXT1JECV9fZ3RocmVhZF9vYmpjX2RhdGFfdGxzID0gKERXT1JEKSAtMTsN CitzdGF0aWMgRFdPUkQgX19ndGhyZWFkX29iamNfZGF0YV90bHMgPSBUTFNfT1VUX09GX0lOREVY RVM7DQogDQogLyogQmFja2VuZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8NCiANCkBAIC05 Niw3ICsxMDYsNyBAQCBpbnQNCiBfX2d0aHJlYWRfb2JqY19pbml0X3RocmVhZF9zeXN0ZW0gKHZv aWQpDQogew0KICAgLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIHN0b3JhZ2Uga2V5LiAgKi8NCi0g IGlmICgoX19ndGhyZWFkX29iamNfZGF0YV90bHMgPSBUbHNBbGxvYyAoKSkgIT0gKERXT1JEKSAt MSkNCisgIGlmICgoX19ndGhyZWFkX29iamNfZGF0YV90bHMgPSBUbHNBbGxvYyAoKSkgIT0gVExT X09VVF9PRl9JTkRFWEVTKQ0KICAgICByZXR1cm4gMDsNCiAgIGVsc2UNCiAgICAgcmV0dXJuIC0x Ow0KQEAgLTEwNiw3ICsxMTYsNyBAQCBfX2d0aHJlYWRfb2JqY19pbml0X3RocmVhZF9zeXN0ZW0g KHZvaWQpDQogaW50DQogX19ndGhyZWFkX29iamNfY2xvc2VfdGhyZWFkX3N5c3RlbSAodm9pZCkN CiB7DQotICBpZiAoX19ndGhyZWFkX29iamNfZGF0YV90bHMgIT0gKERXT1JEKSAtMSkNCisgIGlm IChfX2d0aHJlYWRfb2JqY19kYXRhX3RscyAhPSBUTFNfT1VUX09GX0lOREVYRVMpDQogICAgIFRs c0ZyZWUgKF9fZ3RocmVhZF9vYmpjX2RhdGFfdGxzKTsNCiAgIHJldHVybiAwOw0KIH0NCkBAIC0y MjIsMTUgKzIzMiw5IEBAIF9fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfZGF0YSAodm9pZCAqdmFs dWUpDQogdm9pZCAqDQogX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9kYXRhICh2b2lkKQ0KIHsN Ci0gIERXT1JEIGxhc3RlcnJvcjsNCi0gIHZvaWQgKnB0cjsNCi0NCi0gIGxhc3RlcnJvciA9IEdl dExhc3RFcnJvciAoKTsNCi0NCi0gIHB0ciA9IFRsc0dldFZhbHVlIChfX2d0aHJlYWRfb2JqY19k YXRhX3Rscyk7ICAgICAgICAgIC8qIFJldHVybiB0aHJlYWQgZGF0YS4gICovDQotDQorICBEV09S RCBsYXN0ZXJyb3IgPSBHZXRMYXN0RXJyb3IgKCk7DQorICB2b2lkICogcHRyID0gVGxzR2V0VmFs dWUgKF9fZ3RocmVhZF9vYmpjX2RhdGFfdGxzKTsNCiAgIFNldExhc3RFcnJvciAobGFzdGVycm9y KTsNCi0NCiAgIHJldHVybiBwdHI7DQogfQ0KIA0KQEAgLTI5NCw3ICsyOTgsNyBAQCBfX2d0aHJl YWRfb2JqY19tdXRleF91bmxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkNCiANCiAvKiBBbGxvY2F0 ZSBhIGNvbmRpdGlvbi4gICovDQogaW50DQotX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2FsbG9j YXRlIChvYmpjX2NvbmRpdGlvbl90IF9fVU5VU0VEX1BBUkFNKGNvbmRpdGlvbikpDQorX19ndGhy ZWFkX29iamNfY29uZGl0aW9uX2FsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBB VFRSSUJVVEVfVU5VU0VEKQ0KIHsNCiAgIC8qIFVuaW1wbGVtZW50ZWQuICAqLw0KICAgcmV0dXJu IC0xOw0KQEAgLTMwMiw3ICszMDYsNyBAQCBfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYWxsb2Nh dGUgKG9iamNfY29uZGl0aW9uX3QgX19VTlVTRURfUEFSQU0oY29uZGl0aW9uKSkNCiANCiAvKiBE ZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8NCiBpbnQNCi1fX2d0aHJlYWRfb2JqY19jb25kaXRp b25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBfX1VOVVNFRF9QQVJBTShjb25kaXRpb24p KQ0KK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9kZWFsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90 IGNvbmRpdGlvbiBBVFRSSUJVVEVfVU5VU0VEKQ0KIHsNCiAgIC8qIFVuaW1wbGVtZW50ZWQuICAq Lw0KICAgcmV0dXJuIC0xOw0KQEAgLTMxMCw4ICszMTQsOCBAQCBfX2d0aHJlYWRfb2JqY19jb25k aXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBfX1VOVVNFRF9QQVJBTShjb25kaXRp b24pKQ0KIA0KIC8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiAqLw0KIGludA0KLV9fZ3RocmVhZF9v YmpjX2NvbmRpdGlvbl93YWl0IChvYmpjX2NvbmRpdGlvbl90IF9fVU5VU0VEX1BBUkFNKGNvbmRp dGlvbiksDQotCQkJICAgICAgIG9iamNfbXV0ZXhfdCBfX1VOVVNFRF9QQVJBTShtdXRleCkpDQor X19ndGhyZWFkX29iamNfY29uZGl0aW9uX3dhaXQgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9u IEFUVFJJQlVURV9VTlVTRUQsDQorCQkJICAgICAgIG9iamNfbXV0ZXhfdCBtdXRleCBBVFRSSUJV VEVfVU5VU0VEKQ0KIHsNCiAgIC8qIFVuaW1wbGVtZW50ZWQuICAqLw0KICAgcmV0dXJuIC0xOw0K QEAgLTMxOSw3ICszMjMsNyBAQCBfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fd2FpdCAob2JqY19j b25kaXRpb25fdCBfX1VOVVNFRF9QQVJBTShjb25kaXRpb24pLA0KIA0KIC8qIFdha2UgdXAgYWxs IHRocmVhZHMgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4gICovDQogaW50DQotX19ndGhyZWFk X29iamNfY29uZGl0aW9uX2Jyb2FkY2FzdCAob2JqY19jb25kaXRpb25fdCBfX1VOVVNFRF9QQVJB TShjb25kaXRpb24pKQ0KK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNf Y29uZGl0aW9uX3QgY29uZGl0aW9uIEFUVFJJQlVURV9VTlVTRUQpDQogew0KICAgLyogVW5pbXBs ZW1lbnRlZC4gICovDQogICByZXR1cm4gLTE7DQpAQCAtMzI3LDcgKzMzMSw3IEBAIF9fZ3RocmVh ZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgX19VTlVTRURfUEFS QU0oY29uZGl0aW9uKSkNCiANCiAvKiBXYWtlIHVwIG9uZSB0aHJlYWQgd2FpdGluZyBvbiB0aGlz IGNvbmRpdGlvbi4gICovDQogaW50DQotX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3NpZ25hbCAo b2JqY19jb25kaXRpb25fdCBfX1VOVVNFRF9QQVJBTShjb25kaXRpb24pKQ0KK19fZ3RocmVhZF9v YmpjX2NvbmRpdGlvbl9zaWduYWwgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIEFUVFJJQlVU RV9VTlVTRUQpDQogew0KICAgLyogVW5pbXBsZW1lbnRlZC4gICovDQogICByZXR1cm4gLTE7DQpA QCAtMzM1LDM1ICszMzksNDYgQEAgX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3NpZ25hbCAob2Jq Y19jb25kaXRpb25fdCBfX1VOVVNFRF9QQVJBTShjb25kaXRpb24pKQ0KIA0KICNlbHNlIC8qIF9M SUJPQkpDICovDQogDQorLyogRm9yIHN0cnVjdCB0aW1lc3BlYy4gIERvIG5vdCBpbmNsdWRlIDxz eXMvdGltZS5oPiBoZXJlIHNpbmNlIEdudWxpYiBwcm92aWRlcw0KKyAgIGl0cyBvd24gdmVyc2lv biB3aGljaCBkcmFncyB0aGUgV2luMzIgQVBJIGRlZmluaXRpb25zLiAgKi8NCisjaW5jbHVkZSA8 c3lzL3RpbWViLmg+DQorDQogI2lmZGVmIF9fY3BsdXNwbHVzDQogZXh0ZXJuICJDIiB7DQogI2Vu ZGlmDQogDQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fZ3RocmVhZF9rZXlfdDsNCit0eXBlZGVm IHVuc2lnbmVkIGludCBfX2d0aHJfd2luMzJfRFdPUkQ7DQordHlwZWRlZiB2b2lkICpfX2d0aHJf d2luMzJfSEFORExFOw0KIA0KIHR5cGVkZWYgc3RydWN0IHsNCi0gIGludCBkb25lOw0KLSAgbG9u ZyBzdGFydGVkOw0KLX0gX19ndGhyZWFkX29uY2VfdDsNCisgIHZvaWQgKkRlYnVnSW5mbzsNCisg IGludCBMb2NrQ291bnQ7DQorICBpbnQgUmVjdXJzaW9uQ291bnQ7DQorICBfX2d0aHJfd2luMzJf SEFORExFIE93bmluZ1RocmVhZDsNCisgIF9fZ3Rocl93aW4zMl9IQU5ETEUgTG9ja1NlbWFwaG9y ZTsNCisgIHZvaWQgKlNwaW5Db3VudDsNCit9IF9fZ3Rocl93aW4zMl9DUklUSUNBTF9TRUNUSU9O Ow0KIA0KIHR5cGVkZWYgc3RydWN0IHsNCi0gIGxvbmcgY291bnRlcjsNCi0gIHZvaWQgKnNlbWE7 DQotfSBfX2d0aHJlYWRfbXV0ZXhfdDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICBsb25nIGNv dW50ZXI7DQotICBsb25nIGRlcHRoOw0KLSAgdW5zaWduZWQgbG9uZyBvd25lcjsNCi0gIHZvaWQg KnNlbWE7DQotfSBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3Q7DQorICB2b2lkICpQdHI7DQor fSBfX2d0aHJfd2luMzJfQ09ORElUSU9OX1ZBUklBQkxFOw0KKw0KK3R5cGVkZWYgX19ndGhyX3dp bjMyX0hBTkRMRSBfX2d0aHJlYWRfdDsNCit0eXBlZGVmIF9fZ3Rocl93aW4zMl9EV09SRCBfX2d0 aHJlYWRfa2V5X3Q7DQordHlwZWRlZiBzdHJ1Y3QgeyBpbnQgZG9uZTsgbG9uZyBzdGFydGVkOyB9 IF9fZ3RocmVhZF9vbmNlX3Q7DQordHlwZWRlZiBfX2d0aHJfd2luMzJfQ1JJVElDQUxfU0VDVElP TiBfX2d0aHJlYWRfbXV0ZXhfdDsNCit0eXBlZGVmIF9fZ3Rocl93aW4zMl9DUklUSUNBTF9TRUNU SU9OIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdDsNCisjaWYgX19HVEhSRUFEX0hBU19DT05E DQordHlwZWRlZiBfX2d0aHJfd2luMzJfQ09ORElUSU9OX1ZBUklBQkxFIF9fZ3RocmVhZF9jb25k X3Q7DQorI2VuZGlmDQordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgX19ndGhyZWFkX3RpbWVfdDsN CiANCiAjZGVmaW5lIF9fR1RIUkVBRF9PTkNFX0lOSVQgezAsIC0xfQ0KICNkZWZpbmUgX19HVEhS RUFEX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24NCi0j ZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUX0RFRkFVTFQgey0xLCAwfQ0KICNkZWZpbmUgX19H VEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OIFwNCiAgIF9fZ3RocmVhZF9yZWN1 cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbg0KLSNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9N VVRFWF9JTklUX0RFRkFVTFQgey0xLCAwLCAwLCAwfQ0KKyNkZWZpbmUgX19HVEhSRUFEX0NPTkRf SU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfY29uZF9pbml0X2Z1bmN0aW9uDQorI2RlZmluZSBfX0dU SFJFQURfVElNRV9JTklUIHswLCAwfQ0KIA0KICNpZiBkZWZpbmVkIChfV0lOMzIpICYmICFkZWZp bmVkKF9fQ1lHV0lOX18pDQogI2RlZmluZSBNSU5HVzMyX1NVUFBPUlRTX01UX0VIIDENCkBAIC0z ODgsMzAgKzQwMyw3NCBAQCBfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpDQogI2VuZGlmDQogfQ0K IA0KLSNpZiBfX0dUSFJFQURfSElERV9XSU4zMkFQSQ0KLQ0KLS8qIFRoZSBpbXBsZW1lbnRhdGlv bnMgYXJlIGluIGNvbmZpZy9pMzg2L2d0aHItd2luMzIuYyBpbiBsaWJnY2MuYS4NCi0gICBPbmx5 IHN0dWJzIGFyZSBleHBvc2VkIHRvIGF2b2lkIHBvbGx1dGluZyB0aGUgQysrIG5hbWVzcGFjZSB3 aXRoDQotICAgd2luZG93cyBhcGkgZGVmaW5pdGlvbnMuICAqLw0KLQ0KK2V4dGVybiBpbnQgX19n dGhyX3dpbjMyX2NyZWF0ZSAoX19ndGhyZWFkX3QgKiwgdm9pZCAqKCopICh2b2lkKiksIHZvaWQg Kik7DQorZXh0ZXJuIGludCBfX2d0aHJfd2luMzJfam9pbiAoX19ndGhyZWFkX3QsIHZvaWQgKiop Ow0KK2V4dGVybiBfX2d0aHJlYWRfdCBfX2d0aHJfd2luMzJfc2VsZiAodm9pZCk7DQogZXh0ZXJu IGludCBfX2d0aHJfd2luMzJfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqLCB2b2lkICgqKSAodm9p ZCkpOw0KK2V4dGVybiBpbnQgX19ndGhyX3dpbjMyX2RldGFjaCAoX19ndGhyZWFkX3QpOw0KK2V4 dGVybiBpbnQgX19ndGhyX3dpbjMyX2VxdWFsIChfX2d0aHJlYWRfdCwgX19ndGhyZWFkX3QpOw0K K2V4dGVybiBpbnQgX19ndGhyX3dpbjMyX3lpZWxkICh2b2lkKTsNCiBleHRlcm4gaW50IF9fZ3Ro cl93aW4zMl9rZXlfY3JlYXRlIChfX2d0aHJlYWRfa2V5X3QgKiwgdm9pZCAoKikgKHZvaWQqKSk7 DQogZXh0ZXJuIGludCBfX2d0aHJfd2luMzJfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90KTsN CiBleHRlcm4gdm9pZCAqIF9fZ3Rocl93aW4zMl9nZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90 KTsNCiBleHRlcm4gaW50IF9fZ3Rocl93aW4zMl9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90 LCBjb25zdCB2b2lkICopOw0KIGV4dGVybiB2b2lkIF9fZ3Rocl93aW4zMl9tdXRleF9pbml0X2Z1 bmN0aW9uIChfX2d0aHJlYWRfbXV0ZXhfdCAqKTsNCitleHRlcm4gdm9pZCBfX2d0aHJfd2luMzJf bXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKik7DQogZXh0ZXJuIGludCBfX2d0aHJf d2luMzJfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKik7DQogZXh0ZXJuIGludCBfX2d0 aHJfd2luMzJfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKik7DQogZXh0ZXJuIGlu dCBfX2d0aHJfd2luMzJfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqKTsNCi1leHRl cm4gdm9pZA0KLSAgX19ndGhyX3dpbjMyX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uIChf X2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKik7DQotZXh0ZXJuIGludCBfX2d0aHJfd2luMzJf cmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqKTsNCi1l eHRlcm4gaW50DQotICBfX2d0aHJfd2luMzJfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3Ro cmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqKTsNCi1leHRlcm4gaW50IF9fZ3Rocl93aW4zMl9yZWN1 cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKik7DQotZXh0 ZXJuIHZvaWQgX19ndGhyX3dpbjMyX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9tdXRleF90ICop Ow0KLWV4dGVybiBpbnQNCi0gIF9fZ3Rocl93aW4zMl9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveSAo X19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICopOw0KK2V4dGVybiBpbnQgX19ndGhyX3dpbjMy X3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKik7 DQorI2lmIF9fR1RIUkVBRF9IQVNfQ09ORA0KK2V4dGVybiB2b2lkIF9fZ3Rocl93aW4zMl9jb25k X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9jb25kX3QgKik7DQorZXh0ZXJuIGludCBfX2d0aHJf d2luMzJfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKik7DQorZXh0ZXJuIGludCBf X2d0aHJfd2luMzJfY29uZF9zaWduYWwgKF9fZ3RocmVhZF9jb25kX3QgKik7DQorZXh0ZXJuIGlu dCBfX2d0aHJfd2luMzJfY29uZF93YWl0IChfX2d0aHJlYWRfY29uZF90ICosIF9fZ3RocmVhZF9t dXRleF90ICopOw0KK2V4dGVybiBpbnQgX19ndGhyX3dpbjMyX2NvbmRfdGltZWR3YWl0IChfX2d0 aHJlYWRfY29uZF90ICosIF9fZ3RocmVhZF9tdXRleF90ICosDQorCQkJCQljb25zdCBfX2d0aHJl YWRfdGltZV90ICopOw0KKyNlbmRpZg0KKw0KK3N0YXRpYyBpbmxpbmUgaW50DQorX19ndGhyZWFk X2NyZWF0ZSAoX19ndGhyZWFkX3QgKl9fdGhyLCB2b2lkICooKl9fZnVuYykgKHZvaWQqKSwNCisJ CSAgdm9pZCAqX19hcmdzKQ0KK3sNCisgIHJldHVybiBfX2d0aHJfd2luMzJfY3JlYXRlIChfX3Ro ciwgX19mdW5jLCBfX2FyZ3MpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGludA0KK19fZ3RocmVh ZF9qb2luIChfX2d0aHJlYWRfdCBfX3Rociwgdm9pZCAqKl9fdmFsdWVfcHRyKQ0KK3sNCisgIHJl dHVybiBfX2d0aHJfd2luMzJfam9pbiAoX190aHIsIF9fdmFsdWVfcHRyKTsNCit9DQorDQorc3Rh dGljIGlubGluZSBfX2d0aHJlYWRfdA0KK19fZ3RocmVhZF9zZWxmICh2b2lkKQ0KK3sNCisgIHJl dHVybiBfX2d0aHJfd2luMzJfc2VsZiAoKTsNCit9DQorDQorI2lmIF9fR1RIUkVBRF9ISURFX1dJ TjMyQVBJDQorDQorLyogVGhlIGltcGxlbWVudGF0aW9ucyBhcmUgaW4gY29uZmlnL2kzODYvZ3Ro ci13aW4zMi5jIGluIGxpYmdjYy5hLg0KKyAgIE9ubHkgc3R1YnMgYXJlIGV4cG9zZWQgdG8gYXZv aWQgcG9sbHV0aW5nIHRoZSBDKysgbmFtZXNwYWNlIHdpdGgNCisgICBXaW4zMiBBUEkgZGVmaW5p dGlvbnMuICAqLw0KKw0KK3N0YXRpYyBpbmxpbmUgaW50DQorX19ndGhyZWFkX2RldGFjaCAoX19n dGhyZWFkX3QgX190aHIpDQorew0KKyAgcmV0dXJuIF9fZ3Rocl93aW4zMl9kZXRhY2ggKF9fdGhy KTsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQNCitfX2d0aHJlYWRfZXF1YWwgKF9fZ3RocmVh ZF90IF9fdGhyMSwgX19ndGhyZWFkX3QgX190aHIyKQ0KK3sNCisgIHJldHVybiBfX2d0aHJfd2lu MzJfZXF1YWwgKF9fdGhyMSwgX190aHIyKTsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQNCitf X2d0aHJlYWRfeWllbGQgKHZvaWQpDQorew0KKyAgcmV0dXJuIF9fZ3Rocl93aW4zMl95aWVsZCAo KTsNCit9DQogDQogc3RhdGljIGlubGluZSBpbnQNCiBfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFk X29uY2VfdCAqX19vbmNlLCB2b2lkICgqX19mdW5jKSAodm9pZCkpDQpAQCAtNDg1LDI3OSArNTQ0 LDMyMCBAQCBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRl eCkNCiAgICAgcmV0dXJuIDA7DQogfQ0KIA0KK3N0YXRpYyBpbmxpbmUgaW50DQorX19ndGhyZWFk X3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9f bXV0ZXgpDQorew0KKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkNCisgICAgcmV0dXJuIF9f Z3Rocl93aW4zMl9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19tdXRleCk7DQorICBlbHNlDQor ICAgIHJldHVybiAwOw0KK30NCisNCisjaWYgX19HVEhSRUFEX0hBU19DT05EDQorDQogc3RhdGlj IGlubGluZSB2b2lkDQotX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uIChf X2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpDQorX19ndGhyZWFkX2NvbmRfaW5p dF9mdW5jdGlvbiAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQ0KIHsNCi0gICBfX2d0aHJfd2lu MzJfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24gKF9fbXV0ZXgpOw0KKyAgX19ndGhyX3dp bjMyX2NvbmRfaW5pdF9mdW5jdGlvbiAoX19jb25kKTsNCiB9DQogDQogc3RhdGljIGlubGluZSBp bnQNCi1fX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVf bXV0ZXhfdCAqX19tdXRleCkNCitfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9j b25kX3QgKl9fY29uZCkNCiB7DQotICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQ0KLSAgICBy ZXR1cm4gX19ndGhyX3dpbjMyX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX211dGV4KTsNCi0gIGVs c2UNCi0gICAgcmV0dXJuIDA7DQorICByZXR1cm4gX19ndGhyX3dpbjMyX2NvbmRfYnJvYWRjYXN0 IChfX2NvbmQpOw0KIH0NCiANCiBzdGF0aWMgaW5saW5lIGludA0KLV9fZ3RocmVhZF9yZWN1cnNp dmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQ0K K19fZ3RocmVhZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQ0KIHsNCi0g IGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpDQotICAgIHJldHVybiBfX2d0aHJfd2luMzJfcmVj dXJzaXZlX211dGV4X3RyeWxvY2sgKF9fbXV0ZXgpOw0KLSAgZWxzZQ0KLSAgICByZXR1cm4gMDsN CisgIHJldHVybiBfX2d0aHJfd2luMzJfY29uZF9zaWduYWwgKF9fY29uZCk7DQogfQ0KIA0KIHN0 YXRpYyBpbmxpbmUgaW50DQotX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3Ro cmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkNCitfX2d0aHJlYWRfY29uZF93YWl0IChf X2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQ0KIHsN Ci0gIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpDQotICAgIHJldHVybiBfX2d0aHJfd2luMzJf cmVjdXJzaXZlX211dGV4X3VubG9jayAoX19tdXRleCk7DQotICBlbHNlDQotICAgIHJldHVybiAw Ow0KKyAgcmV0dXJuIF9fZ3Rocl93aW4zMl9jb25kX3dhaXQgKF9fY29uZCwgX19tdXRleCk7DQog fQ0KIA0KIHN0YXRpYyBpbmxpbmUgaW50DQotX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0 cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpDQorX19ndGhyZWFkX2Nv bmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90 ICpfX211dGV4LA0KKwkJCSAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqX19hYnNfdGltZSkNCiB7 DQotICByZXR1cm4gX19ndGhyX3dpbjMyX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX211dGV4 KTsNCisgIHJldHVybiBfX2d0aHJfd2luMzJfY29uZF90aW1lZHdhaXQgKF9fY29uZCwgX19tdXRl eCwgX19hYnNfdGltZSk7DQogfQ0KIA0KKyNlbmRpZiAvKiBfX0dUSFJFQURfSEFTX0NPTkQgKi8N CisNCiAjZWxzZSAvKiAhIF9fR1RIUkVBRF9ISURFX1dJTjMyQVBJICovDQogDQotI2RlZmluZSBO T0dESQ0KKyNpZm5kZWYgX19HVEhSRUFEX1dJTjMyX0lOTElORQ0KKyNkZWZpbmUgX19HVEhSRUFE X1dJTjMyX0lOTElORSBzdGF0aWMgaW5saW5lDQorI2VuZGlmDQorDQorI2lmbmRlZiBfX0dUSFJF QURfV0lOMzJfQ09ORF9JTkxJTkUNCisjZGVmaW5lIF9fR1RIUkVBRF9XSU4zMl9DT05EX0lOTElO RSBzdGF0aWMgaW5saW5lDQorI2VuZGlmDQorDQorI2lmbmRlZiBfX0dUSFJFQURfV0lOMzJfQUNU SVZFX1ANCisjZGVmaW5lIF9fR1RIUkVBRF9XSU4zMl9BQ1RJVkVfUCBfX2d0aHJlYWRfYWN0aXZl X3ANCisjZW5kaWYNCisNCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4NCiAjaW5jbHVkZSA8 d2luZG93cy5oPg0KLSNpbmNsdWRlIDxlcnJuby5oPg0KIA0KLXN0YXRpYyBpbmxpbmUgaW50DQor X19HVEhSRUFEX1dJTjMyX0lOTElORSBpbnQNCitfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRf dCBfX3RocikNCit7DQorICBDbG9zZUhhbmRsZSAoKEhBTkRMRSkgX190aHIpOw0KKyAgcmV0dXJu IDA7DQorfQ0KKw0KK19fR1RIUkVBRF9XSU4zMl9JTkxJTkUgaW50DQorX19ndGhyZWFkX2VxdWFs IChfX2d0aHJlYWRfdCBfX3QxLCBfX2d0aHJlYWRfdCBfX3QyKQ0KK3sNCisgIHJldHVybiBHZXRU aHJlYWRJZCAoKEhBTkRMRSkgX190MSkgPT0gR2V0VGhyZWFkSWQgKChIQU5ETEUpIF9fdDIpOw0K K30NCisNCitfX0dUSFJFQURfV0lOMzJfSU5MSU5FIGludA0KK19fZ3RocmVhZF95aWVsZCAodm9p ZCkNCit7DQorICBTbGVlcCAoMCk7DQorICByZXR1cm4gMDsNCit9DQorDQorX19HVEhSRUFEX1dJ TjMyX0lOTElORSBpbnQNCiBfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqX19vbmNl LCB2b2lkICgqX19mdW5jKSAodm9pZCkpDQogew0KLSAgaWYgKCEgX19ndGhyZWFkX2FjdGl2ZV9w ICgpKQ0KKyAgaWYgKCFfX0dUSFJFQURfV0lOMzJfQUNUSVZFX1AgKCkpDQogICAgIHJldHVybiAt MTsNCi0gIGVsc2UgaWYgKF9fb25jZSA9PSBOVUxMIHx8IF9fZnVuYyA9PSBOVUxMKQ0KLSAgICBy ZXR1cm4gRUlOVkFMOw0KIA0KLSAgaWYgKCEgX19vbmNlLT5kb25lKQ0KKyAgaWYgKF9fYnVpbHRp bl9leHBlY3QgKCFfX29uY2UtPmRvbmUsIDApKQ0KICAgICB7DQotICAgICAgaWYgKEludGVybG9j a2VkSW5jcmVtZW50ICgmKF9fb25jZS0+c3RhcnRlZCkpID09IDApDQorICAgICAgLyogV2UgcmVs eSBvbiB0aGUgbWVtb3J5IG1vZGVsIG9mIHRoZSB4ODYgYXJjaGl0ZWN0dXJlIHdoZXJlIGV2ZXJ5 IGxvYWQNCisJIGhhcyBhY3F1aXJlIHNlbWFudGljcyBhbmQgZXZlcnkgc3RvcmUgaGFzIHJlbGVh c2Ugc2VtYW50aWNzLiAgKi8NCisgICAgICBpZiAoX19hdG9taWNfYWRkX2ZldGNoICgmX19vbmNl LT5zdGFydGVkLCAxLCBfX0FUT01JQ19BQ1FfUkVMKSA9PSAwKQ0KIAl7DQogCSAgKCpfX2Z1bmMp ICgpOw0KLQkgIF9fb25jZS0+ZG9uZSA9IFRSVUU7DQorCSAgX19vbmNlLT5kb25lID0gMTsNCiAJ fQ0KICAgICAgIGVsc2UNCiAJew0KIAkgIC8qIEFub3RoZXIgdGhyZWFkIGlzIGN1cnJlbnRseSBl eGVjdXRpbmcgdGhlIGNvZGUsIHNvIHdhaXQgZm9yIGl0DQotCSAgICAgdG8gZmluaXNoOyB5aWVs ZCB0aGUgQ1BVIGluIHRoZSBtZWFudGltZS4gIElmIHBlcmZvcm1hbmNlDQorCSAgICAgdG8gZmlu aXNoIGFuZCB5aWVsZCB0aGUgQ1BVIGluIHRoZSBtZWFudGltZS4gIElmIHBlcmZvcm1hbmNlDQog CSAgICAgZG9lcyBiZWNvbWUgYW4gaXNzdWUsIHRoZSBzb2x1dGlvbiBpcyB0byB1c2UgYW4gRXZl bnQgdGhhdA0KIAkgICAgIHdlIHdhaXQgb24gaGVyZSAoYW5kIHNldCBhYm92ZSksIGJ1dCB0aGF0 IGltcGxpZXMgYSBwbGFjZSB0bw0KIAkgICAgIGNyZWF0ZSB0aGUgZXZlbnQgYmVmb3JlIHRoaXMg cm91dGluZSBpcyBjYWxsZWQuICAqLw0KLQkgIHdoaWxlICghIF9fb25jZS0+ZG9uZSkNCi0JICAg IFNsZWVwICgwKTsNCisJICB3aGlsZSAoIV9fb25jZS0+ZG9uZSkNCisJICAgIF9fZ3RocmVhZF95 aWVsZCAoKTsNCiAJfQ0KICAgICB9DQogDQogICByZXR1cm4gMDsNCiB9DQogDQotLyogV2luZG93 czMyIHRocmVhZCBsb2NhbCBrZXlzIGRvbid0IHN1cHBvcnQgZGVzdHJ1Y3RvcnM7IHRoaXMgbGVh ZHMgdG8NCisvKiBXaW5kb3dzIHRocmVhZCBsb2NhbCBrZXlzIGRvbid0IHN1cHBvcnQgZGVzdHJ1 Y3RvcnM7IHRoaXMgbGVhZHMgdG8NCiAgICBsZWFrcywgZXNwZWNpYWxseSBpbiB0aHJlYWRlZCBh cHBsaWNhdGlvbnMgbWFraW5nIGV4dGVuc2l2ZSB1c2Ugb2YNCiAgICBDKysgRUguIE1pbmd3IHVz ZXMgYSB0aHJlYWQtc3VwcG9ydCBETEwgdG8gd29yay1hcm91bmQgdGhpcyBwcm9ibGVtLiAgKi8N Ci1zdGF0aWMgaW5saW5lIGludA0KK19fR1RIUkVBRF9XSU4zMl9JTkxJTkUgaW50DQogX19ndGhy ZWFkX2tleV9jcmVhdGUgKF9fZ3RocmVhZF9rZXlfdCAqX19rZXksDQotCQkgICAgICB2b2lkICgq X19kdG9yKSAodm9pZCAqKSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkpDQorCQkgICAgICB2 b2lkICgqX19kdG9yKSAodm9pZCAqKSBBVFRSSUJVVEVfVU5VU0VEKQ0KIHsNCi0gIGludCBfX3N0 YXR1cyA9IDA7DQogICBEV09SRCBfX3Rsc19pbmRleCA9IFRsc0FsbG9jICgpOw0KLSAgaWYgKF9f dGxzX2luZGV4ICE9IDB4RkZGRkZGRkYpDQorICBpZiAoX190bHNfaW5kZXggIT0gVExTX09VVF9P Rl9JTkRFWEVTKQ0KICAgICB7DQogICAgICAgKl9fa2V5ID0gX190bHNfaW5kZXg7DQogI2lmZGVm IE1JTkdXMzJfU1VQUE9SVFNfTVRfRUgNCiAgICAgICAvKiBNaW5ndyBydW50aW1lIHdpbGwgcnVu IHRoZSBkdG9ycyBpbiByZXZlcnNlIG9yZGVyIGZvciBlYWNoIHRocmVhZA0KICAgICAgICAgIHdo ZW4gdGhlIHRocmVhZCBleGl0cy4gICovDQotICAgICAgX19zdGF0dXMgPSBfX21pbmd3dGhyX2tl eV9kdG9yICgqX19rZXksIF9fZHRvcik7DQorICAgICAgcmV0dXJuIF9fbWluZ3d0aHJfa2V5X2R0 b3IgKCpfX2tleSwgX19kdG9yKTsNCisjZWxzZQ0KKyAgICAgIHJldHVybiAwOw0KICNlbmRpZg0K ICAgICB9DQogICBlbHNlDQotICAgIF9fc3RhdHVzID0gKGludCkgR2V0TGFzdEVycm9yICgpOw0K LSAgcmV0dXJuIF9fc3RhdHVzOw0KKyAgICByZXR1cm4gKGludCkgR2V0TGFzdEVycm9yICgpOw0K IH0NCiANCi1zdGF0aWMgaW5saW5lIGludA0KK19fR1RIUkVBRF9XSU4zMl9JTkxJTkUgaW50DQog X19ndGhyZWFkX2tleV9kZWxldGUgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkNCiB7DQotICByZXR1 cm4gKFRsc0ZyZWUgKF9fa2V5KSAhPSAwKSA/IDAgOiAoaW50KSBHZXRMYXN0RXJyb3IgKCk7DQor ICBpZiAoVGxzRnJlZSAoX19rZXkpKQ0KKyAgICByZXR1cm4gMDsNCisgIGVsc2UNCisgICAgcmV0 dXJuIChpbnQpIEdldExhc3RFcnJvciAoKTsNCiB9DQogDQotc3RhdGljIGlubGluZSB2b2lkICoN CitfX0dUSFJFQURfV0lOMzJfSU5MSU5FIHZvaWQgKg0KIF9fZ3RocmVhZF9nZXRzcGVjaWZpYyAo X19ndGhyZWFkX2tleV90IF9fa2V5KQ0KIHsNCi0gIERXT1JEIF9fbGFzdGVycm9yOw0KLSAgdm9p ZCAqX19wdHI7DQotDQotICBfX2xhc3RlcnJvciA9IEdldExhc3RFcnJvciAoKTsNCi0NCi0gIF9f cHRyID0gVGxzR2V0VmFsdWUgKF9fa2V5KTsNCi0NCisgIERXT1JEIF9fbGFzdGVycm9yID0gR2V0 TGFzdEVycm9yICgpOw0KKyAgdm9pZCAqX19wdHIgPSBUbHNHZXRWYWx1ZSAoX19rZXkpOw0KICAg U2V0TGFzdEVycm9yIChfX2xhc3RlcnJvcik7DQotDQogICByZXR1cm4gX19wdHI7DQogfQ0KIA0K LXN0YXRpYyBpbmxpbmUgaW50DQorX19HVEhSRUFEX1dJTjMyX0lOTElORSBpbnQNCiBfX2d0aHJl YWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSwgY29uc3Qgdm9pZCAqX19wdHIp DQogew0KLSAgaWYgKFRsc1NldFZhbHVlIChfX2tleSwgQ09OU1RfQ0FTVDIodm9pZCAqLCBjb25z dCB2b2lkICosIF9fcHRyKSkgIT0gMCkNCisgIGlmIChUbHNTZXRWYWx1ZSAoX19rZXksIENPTlNU X0NBU1QyKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX3B0cikpKQ0KICAgICByZXR1cm4gMDsNCiAg IGVsc2UNCi0gICAgcmV0dXJuIEdldExhc3RFcnJvciAoKTsNCisgICAgcmV0dXJuIChpbnQpIEdl dExhc3RFcnJvciAoKTsNCiB9DQogDQotc3RhdGljIGlubGluZSB2b2lkDQorX19HVEhSRUFEX1dJ TjMyX0lOTElORSB2b2lkDQogX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVh ZF9tdXRleF90ICpfX211dGV4KQ0KIHsNCi0gIF9fbXV0ZXgtPmNvdW50ZXIgPSAtMTsNCi0gIF9f bXV0ZXgtPnNlbWEgPSBDcmVhdGVTZW1hcGhvcmVXIChOVUxMLCAwLCA2NTUzNSwgTlVMTCk7DQor ICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgoTFBDUklUSUNBTF9TRUNUSU9OKSBfX211dGV4 KTsNCiB9DQogDQotc3RhdGljIGlubGluZSB2b2lkDQorX19HVEhSRUFEX1dJTjMyX0lOTElORSB2 b2lkDQogX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4 KQ0KIHsNCi0gIENsb3NlSGFuZGxlICgoSEFORExFKSBfX211dGV4LT5zZW1hKTsNCisgIERlbGV0 ZUNyaXRpY2FsU2VjdGlvbiAoKExQQ1JJVElDQUxfU0VDVElPTikgX19tdXRleCk7DQogfQ0KIA0K LXN0YXRpYyBpbmxpbmUgaW50DQorX19HVEhSRUFEX1dJTjMyX0lOTElORSBpbnQNCiBfX2d0aHJl YWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpDQogew0KLSAgaW50IF9f c3RhdHVzID0gMDsNCisgIGlmIChfX0dUSFJFQURfV0lOMzJfQUNUSVZFX1AgKCkpDQorICAgIEVu dGVyQ3JpdGljYWxTZWN0aW9uICgoTFBDUklUSUNBTF9TRUNUSU9OKSBfX211dGV4KTsNCisgIHJl dHVybiAwOw0KK30NCiANCi0gIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpDQorX19HVEhSRUFE X1dJTjMyX0lOTElORSBpbnQNCitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211 dGV4X3QgKl9fbXV0ZXgpDQorew0KKyAgaWYgKF9fR1RIUkVBRF9XSU4zMl9BQ1RJVkVfUCAoKSkN CiAgICAgew0KLSAgICAgIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCAoJl9fbXV0ZXgtPmNvdW50 ZXIpID09IDAgfHwNCi0JICBXYWl0Rm9yU2luZ2xlT2JqZWN0IChfX211dGV4LT5zZW1hLCBJTkZJ TklURSkgPT0gV0FJVF9PQkpFQ1RfMCkNCi0JX19zdGF0dXMgPSAwOw0KLSAgICAgIGVsc2UNCisg ICAgICBCT09MIF9fcmV0ID0gVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24gKChMUENSSVRJQ0FMX1NF Q1RJT04pIF9fbXV0ZXgpOw0KKyAgICAgIGlmIChfX3JldCkNCiAJew0KLQkgIC8qIFdhaXRGb3JT aW5nbGVPYmplY3QgcmV0dXJucyBXQUlUX0ZBSUxFRCwgYW5kIHdlIGNhbiBvbmx5IGRvDQotCSAg ICAgc29tZSBiZXN0LWVmZm9ydCBjbGVhbnVwIGhlcmUuICAqLw0KLQkgIEludGVybG9ja2VkRGVj cmVtZW50ICgmX19tdXRleC0+Y291bnRlcik7DQotCSAgX19zdGF0dXMgPSAxOw0KKwkgIGlmIChf X211dGV4LT5SZWN1cnNpb25Db3VudCA+IDEpDQorCSAgICB7DQorCSAgICAgIExlYXZlQ3JpdGlj YWxTZWN0aW9uICgoTFBDUklUSUNBTF9TRUNUSU9OKSBfX211dGV4KTsNCisJICAgICAgcmV0dXJu IDE7DQorCSAgICB9DQorCSAgZWxzZQ0KKwkgICAgcmV0dXJuIDA7DQogCX0NCisgICAgICBlbHNl DQorCXJldHVybiAxOw0KICAgICB9DQotICByZXR1cm4gX19zdGF0dXM7DQorICBlbHNlDQorICAg IHJldHVybiAwOw0KIH0NCiANCi1zdGF0aWMgaW5saW5lIGludA0KLV9fZ3RocmVhZF9tdXRleF90 cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkNCitfX0dUSFJFQURfV0lOMzJfSU5M SU5FIGludA0KK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211 dGV4KQ0KIHsNCi0gIGludCBfX3N0YXR1cyA9IDA7DQorICBpZiAoX19HVEhSRUFEX1dJTjMyX0FD VElWRV9QICgpKQ0KKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoKExQQ1JJVElDQUxfU0VDVElP TikgX19tdXRleCk7DQorICByZXR1cm4gMDsNCit9DQogDQotICBpZiAoX19ndGhyZWFkX2FjdGl2 ZV9wICgpKQ0KLSAgICB7DQotICAgICAgaWYgKF9fR1RIUl9XMzJfSW50ZXJsb2NrZWRDb21wYXJl RXhjaGFuZ2UgKCZfX211dGV4LT5jb3VudGVyLCAwLCAtMSkgPCAwKQ0KLQlfX3N0YXR1cyA9IDA7 DQotICAgICAgZWxzZQ0KLQlfX3N0YXR1cyA9IDE7DQotICAgIH0NCi0gIHJldHVybiBfX3N0YXR1 czsNCitfX0dUSFJFQURfV0lOMzJfSU5MSU5FIGludA0KK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0 ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQ0KK3sNCisg IGlmIChfX0dUSFJFQURfV0lOMzJfQUNUSVZFX1AgKCkpDQorICAgIHJldHVybiBUcnlFbnRlckNy aXRpY2FsU2VjdGlvbiAoKExQQ1JJVElDQUxfU0VDVElPTikgX19tdXRleCkgPyAwIDogMTsNCisg IGVsc2UNCisgICAgcmV0dXJuIDA7DQogfQ0KIA0KLXN0YXRpYyBpbmxpbmUgaW50DQotX19ndGhy ZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpDQorI2lmIF9fR1RI UkVBRF9IQVNfQ09ORA0KKw0KK19fR1RIUkVBRF9XSU4zMl9DT05EX0lOTElORSB2b2lkDQorX19n dGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQ0KIHsN Ci0gIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpDQotICAgIHsNCi0gICAgICBpZiAoSW50ZXJs b2NrZWREZWNyZW1lbnQgKCZfX211dGV4LT5jb3VudGVyKSA+PSAwKQ0KLQlyZXR1cm4gUmVsZWFz ZVNlbWFwaG9yZSAoX19tdXRleC0+c2VtYSwgMSwgTlVMTCkgPyAwIDogMTsNCi0gICAgfQ0KKyAg SW5pdGlhbGl6ZUNvbmRpdGlvblZhcmlhYmxlICgoUENPTkRJVElPTl9WQVJJQUJMRSkgX19jb25k KTsNCit9DQorDQorX19HVEhSRUFEX1dJTjMyX0NPTkRfSU5MSU5FIGludA0KK19fZ3RocmVhZF9j b25kX2Jyb2FkY2FzdCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQ0KK3sNCisgIFdha2VBbGxD b25kaXRpb25WYXJpYWJsZSAoKFBDT05ESVRJT05fVkFSSUFCTEUpIF9fY29uZCk7DQogICByZXR1 cm4gMDsNCiB9DQogDQorX19HVEhSRUFEX1dJTjMyX0NPTkRfSU5MSU5FIGludA0KK19fZ3RocmVh ZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQ0KK3sNCisgIFdha2VDb25k aXRpb25WYXJpYWJsZSAoKFBDT05ESVRJT05fVkFSSUFCTEUpIF9fY29uZCk7DQorICByZXR1cm4g MDsNCit9DQorDQorX19HVEhSRUFEX1dJTjMyX0NPTkRfSU5MSU5FIGludA0KK19fZ3RocmVhZF9j b25kX3dhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9f bXV0ZXgpDQorew0KKyAgaWYgKFNsZWVwQ29uZGl0aW9uVmFyaWFibGVDUyAoKFBDT05ESVRJT05f VkFSSUFCTEUpIF9fY29uZCwNCisJCQkJKFBDUklUSUNBTF9TRUNUSU9OKSBfX211dGV4LA0KKwkJ CQlJTkZJTklURSkpDQorICAgIHJldHVybiAwOw0KKyAgZWxzZQ0KKyAgICByZXR1cm4gKGludCkg R2V0TGFzdEVycm9yICgpOw0KK30NCisNCitleHRlcm4gRFdPUkQgX19ndGhyX3dpbjMyX2Fic190 b19yZWxfdGltZSAoY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqKTsNCisNCitfX0dUSFJFQURfV0lO MzJfQ09ORF9JTkxJTkUgaW50DQorX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRf Y29uZF90ICpfX2NvbmQsDQorCQkJICBfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwNCisJCQkg IGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWUpDQorew0KKyAgRFdPUkQgX19yZWxf dGltZSA9IF9fZ3Rocl93aW4zMl9hYnNfdG9fcmVsX3RpbWUgKF9fYWJzX3RpbWUpOw0KKyAgaWYg KFNsZWVwQ29uZGl0aW9uVmFyaWFibGVDUyAoKFBDT05ESVRJT05fVkFSSUFCTEUpIF9fY29uZCwN CisJCQkJKFBDUklUSUNBTF9TRUNUSU9OKSBfX211dGV4LA0KKwkJCQlfX3JlbF90aW1lKSkNCisg ICAgcmV0dXJuIDA7DQorICBlbHNlDQorICAgIHJldHVybiAoaW50KSBHZXRMYXN0RXJyb3IgKCk7 DQorfQ0KKw0KKyNlbmRpZiAvKiBfX0dUSFJFQURfSEFTX0NPTkQgKi8NCisNCisjZW5kaWYgLyog IF9fR1RIUkVBRF9ISURFX1dJTjMyQVBJICovDQorDQogc3RhdGljIGlubGluZSB2b2lkDQogX19n dGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRfcmVjdXJzaXZl X211dGV4X3QgKl9fbXV0ZXgpDQogew0KLSAgX19tdXRleC0+Y291bnRlciA9IC0xOw0KLSAgX19t dXRleC0+ZGVwdGggPSAwOw0KLSAgX19tdXRleC0+b3duZXIgPSAwOw0KLSAgX19tdXRleC0+c2Vt YSA9IENyZWF0ZVNlbWFwaG9yZVcgKE5VTEwsIDAsIDY1NTM1LCBOVUxMKTsNCisgIF9fZ3RocmVh ZF9tdXRleF9pbml0X2Z1bmN0aW9uIChfX211dGV4KTsNCiB9DQogDQotc3RhdGljIGlubGluZSBp bnQNCi1fX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVf bXV0ZXhfdCAqX19tdXRleCkNCitzdGF0aWMgaW5saW5lIHZvaWQNCitfX2d0aHJlYWRfcmVjdXJz aXZlX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkN CiB7DQotICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQ0KLSAgICB7DQotICAgICAgRFdPUkQg X19tZSA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOw0KLSAgICAgIGlmIChJbnRlcmxvY2tlZEluY3Jl bWVudCAoJl9fbXV0ZXgtPmNvdW50ZXIpID09IDApDQotCXsNCi0JICBfX211dGV4LT5kZXB0aCA9 IDE7DQotCSAgX19tdXRleC0+b3duZXIgPSBfX21lOw0KLQl9DQotICAgICAgZWxzZSBpZiAoX19t dXRleC0+b3duZXIgPT0gX19tZSkNCi0Jew0KLQkgIEludGVybG9ja2VkRGVjcmVtZW50ICgmX19t dXRleC0+Y291bnRlcik7DQotCSAgKysoX19tdXRleC0+ZGVwdGgpOw0KLQl9DQotICAgICAgZWxz ZSBpZiAoV2FpdEZvclNpbmdsZU9iamVjdCAoX19tdXRleC0+c2VtYSwgSU5GSU5JVEUpID09IFdB SVRfT0JKRUNUXzApDQotCXsNCi0JICBfX211dGV4LT5kZXB0aCA9IDE7DQotCSAgX19tdXRleC0+ b3duZXIgPSBfX21lOw0KLQl9DQotICAgICAgZWxzZQ0KLQl7DQotCSAgLyogV2FpdEZvclNpbmds ZU9iamVjdCByZXR1cm5zIFdBSVRfRkFJTEVELCBhbmQgd2UgY2FuIG9ubHkgZG8NCi0JICAgICBz b21lIGJlc3QtZWZmb3J0IGNsZWFudXAgaGVyZS4gICovDQotCSAgSW50ZXJsb2NrZWREZWNyZW1l bnQgKCZfX211dGV4LT5jb3VudGVyKTsNCi0JICByZXR1cm4gMTsNCi0JfQ0KLSAgICB9DQotICBy ZXR1cm4gMDsNCisgIF9fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX211dGV4KTsNCiB9DQogDQog c3RhdGljIGlubGluZSBpbnQNCi1fX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9f Z3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkNCitfX2d0aHJlYWRfcmVjdXJzaXZl X211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkNCiB7DQot ICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQ0KLSAgICB7DQotICAgICAgRFdPUkQgX19tZSA9 IEdldEN1cnJlbnRUaHJlYWRJZCgpOw0KLSAgICAgIGlmIChfX0dUSFJfVzMyX0ludGVybG9ja2Vk Q29tcGFyZUV4Y2hhbmdlICgmX19tdXRleC0+Y291bnRlciwgMCwgLTEpIDwgMCkNCi0Jew0KLQkg IF9fbXV0ZXgtPmRlcHRoID0gMTsNCi0JICBfX211dGV4LT5vd25lciA9IF9fbWU7DQotCX0NCi0g ICAgICBlbHNlIGlmIChfX211dGV4LT5vd25lciA9PSBfX21lKQ0KLQkrKyhfX211dGV4LT5kZXB0 aCk7DQotICAgICAgZWxzZQ0KLQlyZXR1cm4gMTsNCi0gICAgfQ0KLSAgcmV0dXJuIDA7DQorICBy ZXR1cm4gX19ndGhyZWFkX211dGV4X2xvY2sgKF9fbXV0ZXgpOw0KIH0NCiANCiBzdGF0aWMgaW5s aW5lIGludA0KIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVj dXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpDQogew0KLSAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAo KSkNCi0gICAgew0KLSAgICAgIC0tKF9fbXV0ZXgtPmRlcHRoKTsNCi0gICAgICBpZiAoX19tdXRl eC0+ZGVwdGggPT0gMCkNCi0Jew0KLQkgIF9fbXV0ZXgtPm93bmVyID0gMDsNCisgIHJldHVybiBf X2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX211dGV4KTsNCit9DQogDQotCSAgaWYgKEludGVybG9j a2VkRGVjcmVtZW50ICgmX19tdXRleC0+Y291bnRlcikgPj0gMCkNCi0JICAgIHJldHVybiBSZWxl YXNlU2VtYXBob3JlIChfX211dGV4LT5zZW1hLCAxLCBOVUxMKSA/IDAgOiAxOw0KLQl9DQotICAg IH0NCisjaWYgX19HVEhSRUFEX0hBU19DT05EDQorDQorc3RhdGljIGlubGluZSBpbnQNCitfX2d0 aHJlYWRfY29uZF9kZXN0cm95IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQgQVRUUklCVVRFX1VO VVNFRCkNCit7DQogICByZXR1cm4gMDsNCiB9DQogDQogc3RhdGljIGlubGluZSBpbnQNCi1fX2d0 aHJlYWRfcmVjdXJzaXZlX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhf dCAqX19tdXRleCkNCitfX2d0aHJlYWRfY29uZF93YWl0X3JlY3Vyc2l2ZSAoX19ndGhyZWFkX2Nv bmRfdCAqX19jb25kLA0KKwkJCSAgICAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9f bXV0ZXgpDQogew0KLSAgQ2xvc2VIYW5kbGUgKChIQU5ETEUpIF9fbXV0ZXgtPnNlbWEpOw0KLSAg cmV0dXJuIDA7DQorICByZXR1cm4gX19ndGhyZWFkX2NvbmRfd2FpdCAoX19jb25kLCBfX211dGV4 KTsNCiB9DQogDQotI2VuZGlmIC8qICBfX0dUSFJFQURfSElERV9XSU4zMkFQSSAqLw0KKyNlbmRp Zg0KIA0KICNpZmRlZiBfX2NwbHVzcGx1cw0KIH0NCmRpZmYgLS1naXQgYS9saWJnY2MvY29uZmln L2kzODYvbGliZ2NjLW1pbmd3LnZlciBiL2xpYmdjYy9jb25maWcvaTM4Ni9saWJnY2MtbWluZ3cu dmVyDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAuLjg5Zjg3NDFmOWRl DQotLS0gL2Rldi9udWxsDQorKysgYi9saWJnY2MvY29uZmlnL2kzODYvbGliZ2NjLW1pbmd3LnZl cg0KQEAgLTAsMCArMSwyMyBAQA0KKyMgQ29weXJpZ2h0IChDKSAyMDIyIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLg0KKyMNCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCisjDQor IyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQ0KKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikNCisjIGFueSBsYXRlciB2ZXJzaW9u Lg0KKyMNCisjIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLA0KKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YNCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuDQorIw0KKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisjIGFsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQorIyA8aHR0cDovL3d3dy5nbnUub3Jn L2xpY2Vuc2VzLz4uDQorDQorR0NDXzEzIHsNCisgIF9fZ3Rocl93aW4zMl9jcmVhdGUNCisgIF9f Z3Rocl93aW4zMl9qb2luDQorICBfX2d0aHJfd2luMzJfc2VsZg0KK30NCmRpZmYgLS1naXQgYS9s aWJnY2MvY29uZmlnL2kzODYvdC1ndGhyLXdpbjMyIGIvbGliZ2NjL2NvbmZpZy9pMzg2L3QtZ3Ro ci13aW4zMg0KaW5kZXggZTczODBkNmY2ZTQuLmMyNzI2ZTIzNzk0IDEwMDY0NA0KLS0tIGEvbGli Z2NjL2NvbmZpZy9pMzg2L3QtZ3Roci13aW4zMg0KKysrIGIvbGliZ2NjL2NvbmZpZy9pMzg2L3Qt Z3Roci13aW4zMg0KQEAgLTEsMiArMSw2IEBADQotIyBXZSBoaWRlIGNhbGxzIHRvIHczMmFwaSBu ZWVkZWQgZm9yIHczMiB0aHJlYWQgc3VwcG9ydCBoZXJlOg0KLUxJQjJBREQgPSAkKHNyY2Rpcikv Y29uZmlnL2kzODYvZ3Roci13aW4zMi5jDQorIyBXZSBuZWVkIGEgdW5pcXVlIG1vZHVsZSBpbnRl cmZhY2luZyB3aXRoIHRoZSBXaW4zMiBBUEkgZm9yIHRocmVhZCBzdXBwb3J0Lg0KK0xJQjJBRERF SCArPSAkKHNyY2RpcikvY29uZmlnL2kzODYvZ3Roci13aW4zMi10aHJlYWQuYw0KKyMgV2UgaGlk ZSBjYWxscyB0byB0aGUgV2luMzIgQVBJIG5lZWRlZCBmb3IgY29uZGl0aW9uIHZhcmlhYmxlIHN1 cHBvcnQgaGVyZS4NCitMSUIyQUREX1NUICs9ICQoc3JjZGlyKS9jb25maWcvaTM4Ni9ndGhyLXdp bjMyLWNvbmQuYw0KKyMgV2UgaGlkZSBjYWxscyB0byB0aGUgV2luMzIgQVBJIG5lZWRlZCBmb3Ig dGhlIHJlc3QgaGVyZS4NCitMSUIyQUREX1NUICs9ICQoc3JjZGlyKS9jb25maWcvaTM4Ni9ndGhy LXdpbjMyLmMNCmRpZmYgLS1naXQgYS9saWJnY2MvY29uZmlnL2kzODYvdC1zbGliZ2NjLW1pbmd3 IGIvbGliZ2NjL2NvbmZpZy9pMzg2L3Qtc2xpYmdjYy1taW5ndw0KbmV3IGZpbGUgbW9kZSAxMDA2 NDQNCmluZGV4IDAwMDAwMDAwMDAwLi5mNGFkMGE4ZWRlMw0KLS0tIC9kZXYvbnVsbA0KKysrIGIv bGliZ2NjL2NvbmZpZy9pMzg2L3Qtc2xpYmdjYy1taW5ndw0KQEAgLTAsMCArMSBAQA0KK1NITElC X01BUEZJTEVTICs9ICQoc3JjZGlyKS9jb25maWcvaTM4Ni9saWJnY2MtbWluZ3cudmVyDQpkaWZm IC0tZ2l0IGEvbGlic3RkYysrLXYzL2FjaW5jbHVkZS5tNCBiL2xpYnN0ZGMrKy12My9hY2luY2x1 ZGUubTQNCmluZGV4IDZmNjcyOTI0YTczLi5kMzU1NjQ0MTc3NyAxMDA2NDQNCi0tLSBhL2xpYnN0 ZGMrKy12My9hY2luY2x1ZGUubTQNCisrKyBiL2xpYnN0ZGMrKy12My9hY2luY2x1ZGUubTQNCkBA IC02NzgsMTAgKzY3OCwxMyBAQCBkbmwgU2V0IHVwICpfRkxBR1MgYW5kICpGTEFHUyB2YXJpYWJs ZXMgZm9yIGFsbCBzdW5kcnkgTWFrZWZpbGUuYW0ncy4NCiBkbmwgKFNFQ1RJT05fRkxBR1MgaXMg ZG9uZSB1bmRlciBDSEVDS19DT01QSUxFUl9GRUFUVVJFUy4pDQogZG5sDQogZG5sIFN1YnN0czoN CitkbmwgIENQUEZMQUdTDQogZG5sICBPUFRJTUlaRV9DWFhGTEFHUw0KIGRubCAgV0FSTl9GTEFH Uw0KIGRubA0KIEFDX0RFRlVOKFtHTElCQ1hYX0VYUE9SVF9GTEFHU10sIFsNCisgIEFDX1NVQlNU KENQUEZMQUdTKQ0KKw0KICAgIyBPcHRpbWl6YXRpb24gZmxhZ3MgdGhhdCBhcmUgcHJvYmFibHkg YSBnb29kIGlkZWEgZm9yIHRocmlsbC1zZWVrZXJzLiBKdXN0DQogICAjIHVuY29tbWVudCB0aGUg bGluZXMgYmVsb3cgYW5kIG1ha2UsIGV2ZXJ5dGhpbmcgZWxzZSBpcyByZWFkeSB0byBnby4uLg0K ICAgIyBBbHRlcm5hdGl2ZWx5IE9QVElNSVpFX0NYWEZMQUdTIGNhbiBiZSBzZXQgaW4gY29uZmln dXJlLmhvc3QuDQpAQCAtMTM1Miw2ICsxMzU1LDEwIEBAIEFDX0RFRlVOKFtHTElCQ1hYX0VOQUJM RV9MSUJTVERDWFhfVElNRV0sIFsNCiAgICAgICBjeWd3aW4qKQ0KICAgICAgICAgYWNfaGFzX25h bm9zbGVlcD15ZXMNCiAgICAgICAgIDs7DQorICAgICAgbWluZ3cqKQ0KKyAgICAgICAgYWNfaGFz X3dpbjMyX3NsZWVwPXllcw0KKyAgICAgICAgYWNfaGFzX3NjaGVkX3lpZWxkPXllcw0KKyAgICAg ICAgOzsNCiAgICAgICBkYXJ3aW4qKQ0KICAgICAgICAgYWNfaGFzX25hbm9zbGVlcD15ZXMNCiAg ICAgICAgIGFjX2hhc19zY2hlZF95aWVsZD15ZXMNCkBAIC0xNTM3LDYgKzE1NDQsOSBAQCBBQ19E RUZVTihbR0xJQkNYWF9FTkFCTEVfTElCU1REQ1hYX1RJTUVdLCBbDQogICBpZiB0ZXN0IHgiJGFj X2hhc19uYW5vc2xlZXAiID0geCJ5ZXMiOyB0aGVuDQogICAgIEFDX0RFRklORShfR0xJQkNYWF9V U0VfTkFOT1NMRUVQLCAxLA0KICAgICAgIFsgRGVmaW5lZCBpZiBuYW5vc2xlZXAgaXMgYXZhaWxh YmxlLiBdKQ0KKyAgZWxpZiB0ZXN0IHgiJGFjX2hhc193aW4zMl9zbGVlcCIgPSB4InllcyI7IHRo ZW4NCisgICAgQUNfREVGSU5FKF9HTElCQ1hYX1VTRV9XSU4zMl9TTEVFUCwgMSwNCisgICAgICBb RGVmaW5lZCBpZiBTbGVlcCBleGlzdHMuXSkNCiAgIGVsc2UNCiAgICAgICBBQ19NU0dfQ0hFQ0tJ TkcoW2ZvciBzbGVlcF0pDQogICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx1bmlzdGQu aD5dLA0KQEAgLTE1NTcsMjAgKzE1NjcsNyBAQCBBQ19ERUZVTihbR0xJQkNYWF9FTkFCTEVfTElC U1REQ1hYX1RJTUVdLCBbDQogICAgICAgQUNfTVNHX1JFU1VMVCgkYWNfaGFzX3VzbGVlcCkNCiAg IGZpDQogDQotICBpZiB0ZXN0IHgiJGFjX2hhc19uYW5vc2xlZXAkYWNfaGFzX3NsZWVwIiA9IHgi bm9ubyI7IHRoZW4NCi0gICAgICBhY19ub19zbGVlcD15ZXMNCi0gICAgICBBQ19NU0dfQ0hFQ0tJ TkcoW2ZvciBTbGVlcF0pDQotICAgICAgQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3aW5kb3dz Lmg+XSwNCi0gICAgICAgICAgICAgICAgICAgICBbU2xlZXAoMSldLA0KLSAgICAgICAgICAgICAg ICAgICAgIFthY19oYXNfd2luMzJfc2xlZXA9eWVzXSxbYWNfaGFzX3dpbjMyX3NsZWVwPW5vXSkN Ci0gICAgICBpZiB0ZXN0IHgiJGFjX2hhc193aW4zMl9zbGVlcCIgPSB4InllcyI7IHRoZW4NCi0g ICAgICAgIEFDX0RFRklORShIQVZFX1dJTjMyX1NMRUVQLDEsIFtEZWZpbmVkIGlmIFNsZWVwIGV4 aXN0cy5dKQ0KLQlhY19ub19zbGVlcD1ubw0KLSAgICAgIGZpDQotICAgICAgQUNfTVNHX1JFU1VM VCgkYWNfaGFzX3dpbjMyX3NsZWVwKQ0KLSAgZmkNCi0NCi0gIGlmIHRlc3QgeCIkYWNfbm9fc2xl ZXAiID0geCJ5ZXMiOyB0aGVuDQorICBpZiB0ZXN0IHgiJGFjX2hhc19uYW5vc2xlZXAkYWNfaGFz X3dpbjMyX3NsZWVwJGFjX2hhc19zbGVlcCIgPSB4Im5vbm9ubyI7IHRoZW4NCiAgICAgQUNfREVG SU5FKF9HTElCQ1hYX05PX1NMRUVQLDEsIFtEZWZpbmVkIGlmIG5vIHdheSB0byBzbGVlcCBpcyBh dmFpbGFibGUuXSkNCiAgIGZpDQogDQpAQCAtMzk4Nyw2ICszOTg0LDE1IEBAIEFDX0RFRlVOKFtH TElCQ1hYX0NIRUNLX0dUSFJFQURTXSwgWw0KICAgY2FzZSAkdGFyZ2V0X3RocmVhZF9maWxlIGlu DQogICAgIHBvc2l4KQ0KICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLURTVVBQT1JUU19XRUFL IC1ER1RIUkVBRF9VU0VfV0VBSyAtRF9QVEhSRUFEUyINCisgICAgICA7Ow0KKyAgICB3aW4zMikN CisgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTIC1EX1dJTjMyX1RIUkVBRFMiDQorICAgICAgIyBU aGUgc3VwcG9ydCBvZiBjb25kaXRpb24gdmFyaWFibGVzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQg aW4NCisgICAgICAjIHRoZSBXaW4zMiBndGhyZWFkcyBsaWJyYXJ5LCBzbyBlbmFibGUgaXQgb24g ZXhwbGljaXQgcmVxdWVzdC4NCisgICAgICBpZiB0ZXN0IHgkZW5hYmxlX2xpYnN0ZGN4eF90aHJl YWRzID0geHllczsgdGhlbg0KKyAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtRF9XSU4zMl9X SU5OVD0weDA2MDAiDQorICAgICAgZmkNCisgICAgICA7Ow0KICAgZXNhYw0KIA0KICAgQUNfTVNH X0NIRUNLSU5HKFt3aGV0aGVyIGl0IGNhbiBiZSBzYWZlbHkgYXNzdW1lZCB0aGF0IG11dGV4X3Rp bWVkbG9jayBpcyBhdmFpbGFibGVdKQ0KQEAgLTM5OTcsNiArNDAwMyw5IEBAIEFDX0RFRlVOKFtH TElCQ1hYX0NIRUNLX0dUSFJFQURTXSwgWw0KICAgICAgICNpZiAoZGVmaW5lZChfUFRIUkVBRFMp IFwNCiAJICAmJiAoIWRlZmluZWQoX1BPU0lYX1RJTUVPVVRTKSB8fCBfUE9TSVhfVElNRU9VVFMg PD0gMCkpDQogICAgICAgI2Vycm9yDQorICAgICAgLy8gSW4gY2FzZSBvZiBXaW4zMiB0aHJlYWRz IHRoZXJlIGlzIG5vIHN1cHBvcnQuDQorICAgICAgI2VsaWYgZGVmaW5lZChfV0lOMzJfVEhSRUFE UykNCisgICAgICAjZXJyb3INCiAgICAgICAjZW5kaWYNCiAgICAgXSwgW2FjX2d0aHJlYWRfdXNl X211dGV4X3RpbWVkbG9jaz0xXSwgW2FjX2d0aHJlYWRfdXNlX211dGV4X3RpbWVkbG9jaz0wXSkN CiANCkBAIC00MDQzLDYgKzQwNTIsMTEgQEAgQUNfREVGVU4oW0dMSUJDWFhfQ0hFQ0tfR1RIUkVB RFNdLCBbDQogICAgICAgICAgICAgIFtdLA0KICAgICAgICAgICAgICBbI2luY2x1ZGUgImd0aHIu aCJdKQ0KICAgICBmaQ0KKw0KKyAgICAjIFNlZSBhYm92ZSBmb3IgdGhlIHJhdGlvbmFsZS4NCisg ICAgaWYgdGVzdCAkdGFyZ2V0X3RocmVhZF9maWxlID0gd2luMzI7IHRoZW4NCisgICAgICBDUFBG TEFHUz0iJENQUEZMQUdTIC1EX1dJTjMyX1dJTk5UPTB4MDYwMCINCisgICAgZmkNCiAgIGZpDQog DQogICBBQ19DSEVDS19IRUFERVIoc2VtYXBob3JlLmgsIFsNCmRpZmYgLS1naXQgYS9saWJzdGRj KystdjMvY29uZmlnLmguaW4gYi9saWJzdGRjKystdjMvY29uZmlnLmguaW4NCmluZGV4IGFjZGZh OTk5NTQzLi44YmVjMWIyYzYwMSAxMDA2NDQNCi0tLSBhL2xpYnN0ZGMrKy12My9jb25maWcuaC5p bg0KKysrIGIvbGlic3RkYysrLXYzL2NvbmZpZy5oLmluDQpAQCAtNTI1LDkgKzUyNSw2IEBADQog LyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3Y3R5cGUuaD4gaGVhZGVyIGZpbGUuICov DQogI3VuZGVmIEhBVkVfV0NUWVBFX0gNCiANCi0vKiBEZWZpbmVkIGlmIFNsZWVwIGV4aXN0cy4g Ki8NCi0jdW5kZWYgSEFWRV9XSU4zMl9TTEVFUA0KLQ0KIC8qIERlZmluZSBpZiB3cml0ZXYgaXMg YXZhaWxhYmxlIGluIDxzeXMvdWlvLmg+LiAqLw0KICN1bmRlZiBIQVZFX1dSSVRFVg0KIA0KQEAg LTEwMjgsNiArMTAyNSw5IEBADQogLyogRGVmaW5lIGlmIGNvZGUgc3BlY2lhbGl6ZWQgZm9yIHdj aGFyX3Qgc2hvdWxkIGJlIHVzZWQuICovDQogI3VuZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UDQog DQorLyogRGVmaW5lZCBpZiBTbGVlcCBleGlzdHMuICovDQorI3VuZGVmIF9HTElCQ1hYX1VTRV9X SU4zMl9TTEVFUA0KKw0KIC8qIERlZmluZSB0byAxIGlmIGEgdmVyYm9zZSBsaWJyYXJ5IGlzIGJ1 aWx0LCBvciAwIG90aGVyd2lzZS4gKi8NCiAjdW5kZWYgX0dMSUJDWFhfVkVSQk9TRQ0KIA0KZGlm ZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9jb25maWcvb3MvbWluZ3czMi13NjQvb3NfZGVmaW5lcy5o IGIvbGlic3RkYysrLXYzL2NvbmZpZy9vcy9taW5ndzMyLXc2NC9vc19kZWZpbmVzLmgNCmluZGV4 IGY5Y2NjMDhlZjhlLi5lZTAyZmY4MmU4NiAxMDA2NDQNCi0tLSBhL2xpYnN0ZGMrKy12My9jb25m aWcvb3MvbWluZ3czMi13NjQvb3NfZGVmaW5lcy5oDQorKysgYi9saWJzdGRjKystdjMvY29uZmln L29zL21pbmd3MzItdzY0L29zX2RlZmluZXMuaA0KQEAgLTg1LDYgKzg1LDkgQEANCiAvLyB0aGVp ciBkdG9ycyBhcmUgY2FsbGVkDQogI2RlZmluZSBfR0xJQkNYWF9USFJFQURfQVRFWElUX1dJTjMy IDENCiANCisvLyBFbmFibGUgdXNlIG9mIEdldFN5c3RlbUluZm8gdG8gaW1wbGVtZW50IGdldF9u cHJvY3MNCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9HRVRfTlBST0NTX1dJTjMyIDENCisNCiAvLyBT ZWUgbGlic3RkYysrLzU5ODA3DQogI2RlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfSU5JVF9GVU5D IDENCiANCmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvY29uZmlnL29zL21pbmd3MzIvb3NfZGVm aW5lcy5oIGIvbGlic3RkYysrLXYzL2NvbmZpZy9vcy9taW5ndzMyL29zX2RlZmluZXMuaA0KaW5k ZXggNTkwYWEzMWY4MWYuLjY5ZjRiYzBhYmVhIDEwMDY0NA0KLS0tIGEvbGlic3RkYysrLXYzL2Nv bmZpZy9vcy9taW5ndzMyL29zX2RlZmluZXMuaA0KKysrIGIvbGlic3RkYysrLXYzL2NvbmZpZy9v cy9taW5ndzMyL29zX2RlZmluZXMuaA0KQEAgLTc1LDYgKzc1LDkgQEANCiAjZGVmaW5lIF9HTElC Q1hYX0xMUDY0IDENCiAjZW5kaWYNCiANCisvLyBFbmFibGUgdXNlIG9mIEdldFN5c3RlbUluZm8g dG8gaW1wbGVtZW50IGdldF9ucHJvY3MNCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9HRVRfTlBST0NT X1dJTjMyIDENCisNCiAvLyBTZWUgbGlic3RkYysrLzU5ODA3DQogI2RlZmluZSBfR1RIUkVBRF9V U0VfTVVURVhfSU5JVF9GVU5DIDENCiANCmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvc3JjL2Mr KzExL3RocmVhZC5jYyBiL2xpYnN0ZGMrKy12My9zcmMvYysrMTEvdGhyZWFkLmNjDQppbmRleCBh NTRiYzNlOTM5YS4uYTgwMzg5NzkwOTAgMTAwNjQ0DQotLS0gYS9saWJzdGRjKystdjMvc3JjL2Mr KzExL3RocmVhZC5jYw0KKysrIGIvbGlic3RkYysrLXYzL3NyYy9jKysxMS90aHJlYWQuY2MNCkBA IC0zNCw3ICszNCw3IEBADQogI2lmbmRlZiBfR0xJQkNYWF9VU0VfTkFOT1NMRUVQDQogIyBpZmRl ZiBfR0xJQkNYWF9IQVZFX1NMRUVQDQogIyAgaW5jbHVkZSA8dW5pc3RkLmg+DQotIyBlbGlmIGRl ZmluZWQoX0dMSUJDWFhfSEFWRV9XSU4zMl9TTEVFUCkNCisjIGVsaWYgZGVmaW5lZChfR0xJQkNY WF9VU0VfV0lOMzJfU0xFRVApDQogIyAgaW5jbHVkZSA8d2luZG93cy5oPg0KICMgZWxpZiBkZWZp bmVkIF9HTElCQ1hYX05PX1NMRUVQICYmIGRlZmluZWQgX0dMSUJDWFhfSEFTX0dUSFJFQURTDQog Ly8gV2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gc2xlZXAgZm9yIHRhcmdldHMgdGhhdCBzdXBwb3J0 IG11bHRpcGxlIHRocmVhZHM6DQpAQCAtNjIsNiArNjIsMTYgQEAgc3RhdGljIGlubGluZSBpbnQg Z2V0X25wcm9jcygpDQogIHJldHVybiAwOw0KIH0NCiAjIGRlZmluZSBfR0xJQkNYWF9OUFJPQ1Mg Z2V0X25wcm9jcygpDQorI2VsaWYgZGVmaW5lZChfR0xJQkNYWF9VU0VfR0VUX05QUk9DU19XSU4z MikNCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4NCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4N CitzdGF0aWMgaW5saW5lIGludCBnZXRfbnByb2NzKCkNCit7DQorICBTWVNURU1fSU5GTyBzeXNp bmZvOw0KKyAgR2V0U3lzdGVtSW5mbyAoJnN5c2luZm8pOw0KKyAgcmV0dXJuIChpbnQpc3lzaW5m by5kd051bWJlck9mUHJvY2Vzc29yczsNCit9DQorIyBkZWZpbmUgX0dMSUJDWFhfTlBST0NTIGdl dF9ucHJvY3MoKQ0KICNlbGlmIGRlZmluZWQoX0dMSUJDWFhfVVNFX1NDX05QUk9DRVNTT1JTX09O TE4pDQogIyBpbmNsdWRlIDx1bmlzdGQuaD4NCiAjIGRlZmluZSBfR0xJQkNYWF9OUFJPQ1Mgc3lz Y29uZihfU0NfTlBST0NFU1NPUlNfT05MTikNCkBAIC0yNTQsNyArMjY0LDcgQEAgbmFtZXNwYWNl IHRoaXNfdGhyZWFkDQogCV9fcyA9IGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86OnNlY29u ZHM+KHRhcmdldCAtIG5vdyk7DQogCV9fbnMgPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25v OjpuYW5vc2Vjb25kcz4odGFyZ2V0IC0gKG5vdyArIF9fcykpOw0KICAgICB9DQotI2VsaWYgZGVm aW5lZChfR0xJQkNYWF9IQVZFX1dJTjMyX1NMRUVQKQ0KKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhf VVNFX1dJTjMyX1NMRUVQKQ0KICAgICB1bnNpZ25lZCBsb25nIG1zID0gX19ucy5jb3VudCgpIC8g MTAwMDAwMDsNCiAgICAgaWYgKF9fbnMuY291bnQoKSA+IDAgJiYgbXMgPT0gMCkNCiAgICAgICBt cyA9IDE7DQpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8xOV9kaWFnbm9zdGlj cy9oZWFkZXJzL3N5c3RlbV9lcnJvci9lcnJjX3N0ZF9jKysweC5jYyBiL2xpYnN0ZGMrKy12My90 ZXN0c3VpdGUvMTlfZGlhZ25vc3RpY3MvaGVhZGVycy9zeXN0ZW1fZXJyb3IvZXJyY19zdGRfYysr MHguY2MNCmluZGV4IDY2NzBiMjJjZTdmLi5lYmY3MTQ3Y2RjMCAxMDA2NDQNCi0tLSBhL2xpYnN0 ZGMrKy12My90ZXN0c3VpdGUvMTlfZGlhZ25vc3RpY3MvaGVhZGVycy9zeXN0ZW1fZXJyb3IvZXJy Y19zdGRfYysrMHguY2MNCisrKyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMTlfZGlhZ25vc3Rp Y3MvaGVhZGVycy9zeXN0ZW1fZXJyb3IvZXJyY19zdGRfYysrMHguY2MNCkBAIC03MCw3ICs3MCwx MCBAQCB2b2lkIHRlc3QwMSgpDQogICBURVNUX0VSUkMobmV0d29ya19yZXNldCk7DQogICBURVNU X0VSUkMobmV0d29ya191bnJlYWNoYWJsZSk7DQogICBURVNUX0VSUkMobm9fYnVmZmVyX3NwYWNl KTsNCisNCisjaWZkZWYgRUNISUxEDQogICBURVNUX0VSUkMobm9fY2hpbGRfcHJvY2Vzcyk7DQor I2VuZGlmDQogDQogI2lmZGVmIEVOT0xJTksNCiAgIFRFU1RfRVJSQyhub19saW5rKTsNCkBAIC04 Niw3ICs4OSwxMCBAQCB2b2lkIHRlc3QwMSgpDQogICBURVNUX0VSUkMobm9fbWVzc2FnZSk7DQog I2VuZGlmDQogICBURVNUX0VSUkMobm9fcHJvdG9jb2xfb3B0aW9uKTsNCisNCisjaWZkZWYgRU5P U1BDDQogICBURVNUX0VSUkMobm9fc3BhY2Vfb25fZGV2aWNlKTsNCisjZW5kaWYNCiANCiAjaWZk ZWYgRU5PU1INCiAgIFRFU1RfRVJSQyhub19zdHJlYW1fcmVzb3VyY2VzKTsNCkBAIC0xMDUsMTYg KzExMSwyNiBAQCB2b2lkIHRlc3QwMSgpDQogDQogICBURVNUX0VSUkMobm90X2Nvbm5lY3RlZCk7 DQogICBURVNUX0VSUkMobm90X2Vub3VnaF9tZW1vcnkpOw0KKw0KKyNpZmRlZiBFTk9UU1VQDQog ICBURVNUX0VSUkMobm90X3N1cHBvcnRlZCk7DQorI2VuZGlmDQogDQogI2lmZGVmIEVDQU5DRUxF RA0KICAgVEVTVF9FUlJDKG9wZXJhdGlvbl9jYW5jZWxlZCk7DQogI2VuZGlmDQogDQogICBURVNU X0VSUkMob3BlcmF0aW9uX2luX3Byb2dyZXNzKTsNCisNCisjaWZkZWYgRVBFUk0NCiAgIFRFU1Rf RVJSQyhvcGVyYXRpb25fbm90X3Blcm1pdHRlZCk7DQorI2VuZGlmDQorDQogICBURVNUX0VSUkMo b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQpOw0KKw0KKyNpZmRlZiBFV09VTERCTE9DSw0KICAgVEVT VF9FUlJDKG9wZXJhdGlvbl93b3VsZF9ibG9jayk7DQorI2VuZGlmDQogDQogI2lmZGVmIEVPV05F UkRFQUQNCiAgIFRFU1RfRVJSQyhvd25lcl9kZWFkKTsNCkBAIC0xNDQsNyArMTYwLDEwIEBAIHZv aWQgdGVzdDAxKCkNCiAgIFRFU1RfRVJSQyh0ZXh0X2ZpbGVfYnVzeSk7DQogI2VuZGlmDQogDQor I2lmZGVmIEVUSU1FRE9VVA0KICAgVEVTVF9FUlJDKHRpbWVkX291dCk7DQorI2VuZGlmDQorDQog ICBURVNUX0VSUkModG9vX21hbnlfZmlsZXNfb3Blbl9pbl9zeXN0ZW0pOw0KICAgVEVTVF9FUlJD KHRvb19tYW55X2ZpbGVzX29wZW4pOw0KICAgVEVTVF9FUlJDKHRvb19tYW55X2xpbmtzKTsNCmRp ZmYgLS1naXQgYS9saWJzdGRjKystdjMvdGVzdHN1aXRlL2xpYi9saWJzdGRjKysuZXhwIGIvbGli c3RkYysrLXYzL3Rlc3RzdWl0ZS9saWIvbGlic3RkYysrLmV4cA0KaW5kZXggNjM1ZjE2ZGI0ZTgu LmViYmYxMmFjN2QwIDEwMDY0NA0KLS0tIGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS9saWIvbGli c3RkYysrLmV4cA0KKysrIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS9saWIvbGlic3RkYysrLmV4 cA0KQEAgLTUxMCw2ICs1MTAsMTUgQEAgcHJvYyB2M190YXJnZXRfY29tcGlsZSB7IHNvdXJjZSBk ZXN0IHR5cGUgb3B0aW9ucyB9IHsNCiAJfQ0KICAgICB9DQogDQorICAgICMgU21hbGwgYWRqdXN0 bWVudCBmb3IgTWluR1cgaG9zdHMuDQorICAgIGlmIHsgJGRlc3QgPT0gIi9kZXYvbnVsbCIgJiYg W2lzaG9zdCAiKi0qLW1pbmd3KiJdIH0gew0KKwlpZiB7ICR0eXBlID09ICJleGVjdXRhYmxlIiB9 IHsNCisJICAgIHNldCBkZXN0ICJ4LmV4ZSINCisJfSBlbHNlIHsNCisJICAgIHNldCBkZXN0ICJu dWwiDQorCX0NCisgICAgfQ0KKw0KICAgICBsYXBwZW5kIG9wdGlvbnMgImNvbXBpbGVyPSRjeHhf ZmluYWwiDQogICAgIGxhcHBlbmQgb3B0aW9ucyAidGltZW91dD1bdGltZW91dF92YWx1ZV0iDQog DQpAQCAtMTE0Nyw3ICsxMTU2LDkgQEAgcHJvYyBjaGVja19lZmZlY3RpdmVfdGFyZ2V0X2d0aHJl YWRzX3RpbWVkIHsgfSB7DQogIyBSZXR1cm4gMSBpZiBlaXRoZXIgbmFub3NsZWVwIG9yIHNsZWVw IGlzIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuDQogcHJvYyBjaGVja192M190YXJnZXRfc2xlZXAg eyB9IHsNCiAgICAgcmV0dXJuIFtjaGVja192M190YXJnZXRfcHJvcF9jYWNoZWQgZXRfc2xlZXAg ew0KLQlzZXQgY29uZCAiZGVmaW5lZCBfR0xJQkNYWF9VU0VfTkFOT1NMRUVQIHx8IGRlZmluZWQg X0dMSUJDWFhfSEFWRV9TTEVFUCINCisJc2V0IGNvbmQgImRlZmluZWQgX0dMSUJDWFhfVVNFX05B Tk9TTEVFUCINCisJc2V0IGNvbmQgIiRjb25kIHx8IGRlZmluZWQgX0dMSUJDWFhfVVNFX1dJTjMy X1NMRUVQIg0KKwlzZXQgY29uZCAiJGNvbmQgfHwgZGVmaW5lZCBfR0xJQkNYWF9IQVZFX1NMRUVQ Ig0KIAlyZXR1cm4gW3YzX2NoZWNrX3ByZXByb2Nlc3Nvcl9jb25kaXRpb24gc2xlZXAgJGNvbmRd DQogICAgIH1dDQogfQ0KQEAgLTExOTEsNiArMTIwMiw3IEBAIHByb2MgY2hlY2tfdjNfdGFyZ2V0 X2JpbmFyeV9pbyB7IH0gew0KIHByb2MgY2hlY2tfdjNfdGFyZ2V0X25wcm9jcyB7IH0gew0KICAg ICByZXR1cm4gW2NoZWNrX3YzX3RhcmdldF9wcm9wX2NhY2hlZCBldF9ucHJvY3Mgew0KIAlzZXQg Y29uZCAiZGVmaW5lZCBfR0xJQkNYWF9VU0VfR0VUX05QUk9DUyINCisJc2V0IGNvbmQgIiRjb25k IHx8IGRlZmluZWQgX0dMSUJDWFhfVVNFX0dFVF9OUFJPQ1NfV0lOMzIiDQogCXNldCBjb25kICIk Y29uZCB8fCBkZWZpbmVkIF9HTElCQ1hYX1VTRV9QVEhSRUFEU19OVU1fUFJPQ0VTU09SU19OUCIN CiAJc2V0IGNvbmQgIiRjb25kIHx8IGRlZmluZWQgX0dMSUJDWFhfVVNFX1NZU0NUTF9IV19OQ1BV Ig0KIAlzZXQgY29uZCAiJGNvbmQgfHwgZGVmaW5lZCBfR0xJQkNYWF9VU0VfU0NfTlBST0NFU1NP UlNfT05MTiINCg== --000000000000bf952805eff52739--