From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by sourceware.org (Postfix) with ESMTPS id 97F873846083; Wed, 26 Jun 2024 20:38:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 97F873846083 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 97F873846083 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::32d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719434326; cv=none; b=WurB1E249D5gIcSmKu8bSH7NzSpIAk/2DskyePVwdIBQ3NMXwB9nCMvSh4vKM5FAOaR1zOSu6Th0bqq0+f3XMQc9N8PILOR7+06P/5hFWC4lI4Thp5mhmgJKiLUTZi9EZhNUwm05q8QAtWRstyfvUANFgdPF3r5GSVm+sle/xzA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719434326; c=relaxed/simple; bh=jbgzOp3DW6er6odXzkQKA65TiClM74r98NktoxNajoA=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=LvJZ8XuJsJWlO2UZGBV1DUjKR+JVtffkr29/Hwh8jHftTDEcQvRTcBvsJxejOgDwPhXEOAcfjscxb279xiP9liFrlVy50fBI0WtLSC0pQJHWlUDZeWcKryM3biR3j5csfzq5UsqHkkEiKUt8RDcr8Ta9i1cKruuWZwszFq3dYO4= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-421820fc26dso55724955e9.2; Wed, 26 Jun 2024 13:38:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719434319; x=1720039119; darn=gcc.gnu.org; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=69QVyVyvDlXICIcFM5kcbk7O7Z6EfgfNSHtBaX9R0Ss=; b=lDah6kU4QdT8EeZzFFgJa6Qxmc0RfSM+hQeibvms2jtr3lqPV9Os4H/FMwNHY3INNo TRlciCAjBdrHgoyCtWPP236YRW1X8UCSGp/ifo4TTOL+2iZpSd7zqAA7KslwEaf2YR9R YvBlcEav7UufJ13YH2SUHdo+WuLMYPV4T+5Jlr/lw8Ktl737rO85xRfViQvgGa6le+Ft NVH1siFBXU88u3hWxiUaY8zx9gvlGfpFZA8Q24q5g2VYSx+MNt49ZufVfrcKayGyYto4 VIDztJdpQ5K5rHoatsX45jqm5AZOz9NZ/U7D8SfJ0t6UDVoz90QiCyYNvwukaNrA35pM aq7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719434319; x=1720039119; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=69QVyVyvDlXICIcFM5kcbk7O7Z6EfgfNSHtBaX9R0Ss=; b=DXGmQuGbdydBQ7pIaF5g+nCkKtk+Aoq4cVQPVwfJMeO7gQbxK2QoDNCzCAZcK5il+z RW9aZ0qfHb8mRXUuxACtplVZ0tjjKw6GnCnnfOg5R86X2KtBIoGJntx0x8YWO7WfRmNU Xb87tXGixwAVedG+qSpMnd4fBHfJUyWQg+GO5dl5QRIEEko9pZ4SpEwFFYxzZZwVlBx/ BK/KJsGxbVhH5JTAunQ7L0U+j41S8+ch2xqhaLjatVIutd0vEns1oAnhu3Mk3+os24aC BrcGRgNVW4IQKZKlAHvappiLG7QAJPLxXrkbVuZyRkGEVTsU4c96IfQi6HLl6gSFSd/x 2kLw== X-Gm-Message-State: AOJu0Yz3HZcCdgr6i4kGShs3XP7LrOQkEIoD0CQfQBqAuNHuxUNEjSRA UlxWO6mxrGjUJkPcvkV5cE12iNHMoznhNpD+W0yZazrvXcVsBIBl8VQOgw== X-Google-Smtp-Source: AGHT+IEKB0mXZDVOHlJ7i4WLDUtyRBMlDnDCasf+7aWPEl8UAXLHTa9ya0MMAfIKPBYyG2EcyTS4RA== X-Received: by 2002:a05:6000:2ab:b0:366:ec2f:dbd3 with SMTP id ffacd0b85a97d-366ec2fdc08mr9795263f8f.47.1719434318425; Wed, 26 Jun 2024 13:38:38 -0700 (PDT) Received: from ?IPV6:2a01:e0a:1dc:b1c0:54d0:b672:75b6:7309? ([2a01:e0a:1dc:b1c0:54d0:b672:75b6:7309]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-367292e5a62sm2380587f8f.99.2024.06.26.13.38.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 Jun 2024 13:38:37 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------F0cM8DDgrpPxlMOmV4Ehavts" Message-ID: <8ed737bd-4b8e-4233-833b-c44d10b37aca@gmail.com> Date: Wed, 26 Jun 2024 22:38:37 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: libstdc++ Cc: gcc-patches From: =?UTF-8?Q?Fran=C3=A7ois_Dumont?= Subject: [PATCH] _Hashtable fancy pointer support X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FILL_THIS_FORM,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP 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: This is a multi-part message in MIME format. --------------F0cM8DDgrpPxlMOmV4Ehavts Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Here is my proposal to add support for fancy allocator pointer. The only place where we still have C pointers is at the iterator::pointer level but it's consistent with std::list implementation and also logical considering that we do not get value_type pointers from the allocator. I also wondered if it was ok to use nullptr in different places or if I should rather do __node_ptr{}. But recent modifications are using nullptr so I think it's fine.     libstdc++: Use allocator::pointer in hashtable implementation     In _Hashtable implementation store the allocator::pointer returned by the allocate     call as-is and return it on the deallocate when necessary. This is true for both     the allocated nodes and the bucket array.     libstdc++-v3/ChangeLog:             * include/bits/hashtable_policy.h: Include .             (__alloc_val_ptr<>): New template alias.             (_Hash_pnode_base<>): New.             (_Hash_node<>::__node_ptr): New.             (_Hash_node<>::__node_type): New.             (_Hash_pnode): New.             (__get_node_type<>): New, template alias to _Hash_node<> if allocator pointer             type is a native pointer, _Hash_pnode<> otherwise.             (_Hashtable_iterator_base): New.             (_Node_iterator_base<>): Inherits from latter.             (_Hashtable_iterator):             New.             (_Hashtable_const_iterator):             New.             (_Insert_base<>::__alloc_ptr): New.             (_Insert_base<>::__hashtable_alloc): Remove.             (_Insert_base<>::__node_type): New.             (_Insert_base<>::__node_ptr): New.             (_Insert_base<>::iterator): Define conditionally to _Node_iterator<>             or _Hashtable_iterator<> depending on __alloc_ptr being a raw pointer.             (_Insert_base<>::const_iterator): Define conditionally to             _Node_const_iterator<> or _Hashtable_const_iterator<> depending on             __alloc_ptr being a raw pointer.             (_Hashtable_local_iter_base<>): New.             (_Hashtable_local_iterator<>): New.             (_Hashtable_const_local_iterator<>): New.             (__local_iterator<>): New template alias.             (__const_local_iterator<>): New template alias.             (_Hashtable_alloc<>::__get_node_base): New struct.             (_Hashtable_alloc<>::__value_alloc_traits): Remove.             (_Hashtable_alloc<>::__node_ptr): Define as __node_alloc_traits::pointer.             (_Hashtable_alloc<>::__node_base): Define as __get_node_base<>::pointer.             (_Hashtable_alloc<>::__node_base_ptr): Define as             __ptr_rebind<__node_ptr, __node_base>.             * include/bits/hashtable.h (_Hashtable<>): Adapt.             * testsuite/23_containers/unordered_map/allocator/ext_ptr.cc: New test.             * testsuite/23_containers/unordered_multimap/allocator/ext_ptr.cc:             New test.             * testsuite/23_containers/unordered_multiset/allocator/ext_ptr.cc:             New test.             * testsuite/23_containers/unordered_set/allocator/ext_ptr.cc: Adapt. Tested under Linux x64, ok to commit ? François --------------F0cM8DDgrpPxlMOmV4Ehavts Content-Type: text/plain; charset=UTF-8; name="hashtable_cust_ptr_patch.txt" Content-Disposition: attachment; filename="hashtable_cust_ptr_patch.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlLmggYi9s aWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5oCmluZGV4IDM2MWRhMmIzYjRk Li5jOTgxN2FkZjkxMCAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9o YXNodGFibGUuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5o CkBAIC0yMDAsOCArMjAwLDggQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04K IAkJCQkgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz4sCiAgICAgICBwcml2YXRlIF9fZGV0YWls OjpfSGFzaHRhYmxlX2FsbG9jPAogCV9fYWxsb2NfcmViaW5kPF9BbGxvYywKLQkJICAgICAg IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwKLQkJCQkJICAgIF9UcmFpdHM6Ol9faGFz aF9jYWNoZWQ6OnZhbHVlPj4+LAorCQkgICAgICAgX19kZXRhaWw6Ol9fZ2V0X25vZGVfdHlw ZTxfQWxsb2MsIF9WYWx1ZSwKKwkJCQkJCSBfVHJhaXRzOjpfX2hhc2hfY2FjaGVkOjp2YWx1 ZT4+PiwKICAgICAgIHByaXZhdGUgX0hhc2h0YWJsZV9lbmFibGVfZGVmYXVsdF9jdG9yPF9F cXVhbCwgX0hhc2gsIF9BbGxvYz4KICAgICB7CiAgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3Nh bWU8dHlwZW5hbWUgcmVtb3ZlX2N2PF9WYWx1ZT46OnR5cGUsIF9WYWx1ZT46OnZhbHVlLApA QCAtMjE2LDIxICsyMTYsMjMgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04K ICAgICAgIHVzaW5nIF9fdHJhaXRzX3R5cGUgPSBfVHJhaXRzOwogICAgICAgdXNpbmcgX19o YXNoX2NhY2hlZCA9IHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6Ol9faGFzaF9jYWNoZWQ7CiAg ICAgICB1c2luZyBfX2NvbnN0YW50X2l0ZXJhdG9ycyA9IHR5cGVuYW1lIF9fdHJhaXRzX3R5 cGU6Ol9fY29uc3RhbnRfaXRlcmF0b3JzOwotICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSBf X2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIF9faGFzaF9jYWNoZWQ6OnZhbHVlPjsKKyAg ICAgIHVzaW5nIF9fbm9kZV90eXBlID0gX19kZXRhaWw6Ol9fZ2V0X25vZGVfdHlwZTxfQWxs b2MsIF9WYWx1ZSwKKwkJCQkJCV9UcmFpdHM6Ol9faGFzaF9jYWNoZWQ6OnZhbHVlPjsKICAg ICAgIHVzaW5nIF9fbm9kZV9hbGxvY190eXBlID0gX19hbGxvY19yZWJpbmQ8X0FsbG9jLCBf X25vZGVfdHlwZT47Ci0KICAgICAgIHVzaW5nIF9faGFzaHRhYmxlX2FsbG9jID0gX19kZXRh aWw6Ol9IYXNodGFibGVfYWxsb2M8X19ub2RlX2FsbG9jX3R5cGU+OwogCiAgICAgICB1c2lu ZyBfX25vZGVfdmFsdWVfdHlwZSA9CiAJX19kZXRhaWw6Ol9IYXNoX25vZGVfdmFsdWU8X1Zh bHVlLCBfX2hhc2hfY2FjaGVkOjp2YWx1ZT47CiAgICAgICB1c2luZyBfX25vZGVfcHRyID0g dHlwZW5hbWUgX19oYXNodGFibGVfYWxsb2M6Ol9fbm9kZV9wdHI7Ci0gICAgICB1c2luZyBf X3ZhbHVlX2FsbG9jX3RyYWl0cyA9Ci0JdHlwZW5hbWUgX19oYXNodGFibGVfYWxsb2M6Ol9f dmFsdWVfYWxsb2NfdHJhaXRzOwogICAgICAgdXNpbmcgX19ub2RlX2FsbG9jX3RyYWl0cyA9 CiAJdHlwZW5hbWUgX19oYXNodGFibGVfYWxsb2M6Ol9fbm9kZV9hbGxvY190cmFpdHM7Cisg ICAgICB1c2luZyBfX3ZhbHVlX2FsbG9jX3RyYWl0cyA9CisJdHlwZW5hbWUgX19ub2RlX2Fs bG9jX3RyYWl0czo6dGVtcGxhdGUgcmViaW5kX3RyYWl0czxfVmFsdWU+OwogICAgICAgdXNp bmcgX19ub2RlX2Jhc2UgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9hbGxvYzo6X19ub2RlX2Jh c2U7CiAgICAgICB1c2luZyBfX25vZGVfYmFzZV9wdHIgPSB0eXBlbmFtZSBfX2hhc2h0YWJs ZV9hbGxvYzo6X19ub2RlX2Jhc2VfcHRyOworICAgICAgdXNpbmcgX19ub2RlX2Jhc2VfcHRy X3RyYWl0cyA9IHN0ZDo6cG9pbnRlcl90cmFpdHM8X19ub2RlX2Jhc2VfcHRyPjsKICAgICAg IHVzaW5nIF9fYnVja2V0c19wdHIgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9hbGxvYzo6X19i dWNrZXRzX3B0cjsKKyAgICAgIHVzaW5nIF9fYnVja2V0c19wdHJfdHJhaXRzID0gc3RkOjpw b2ludGVyX3RyYWl0czxfX2J1Y2tldHNfcHRyPjsKIAogICAgICAgdXNpbmcgX19pbnNlcnRf YmFzZSA9IF9fZGV0YWlsOjpfSW5zZXJ0PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFj dEtleSwKIAkJCQkJICAgICAgX0VxdWFsLCBfSGFzaCwKQEAgLTI1OCwxNSArMjYwLDE1IEBA IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAKICAgICAgIHVzaW5nIGNvbnN0 X2l0ZXJhdG9yID0gdHlwZW5hbWUgX19pbnNlcnRfYmFzZTo6Y29uc3RfaXRlcmF0b3I7CiAK LSAgICAgIHVzaW5nIGxvY2FsX2l0ZXJhdG9yID0gX19kZXRhaWw6Ol9Mb2NhbF9pdGVyYXRv cjxrZXlfdHlwZSwgX1ZhbHVlLAotCQkJX0V4dHJhY3RLZXksIF9IYXNoLCBfUmFuZ2VIYXNo LCBfVW51c2VkLAotCQkJCQkgICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzOjp2YWx1ZSwKLQkJ CQkJICAgICBfX2hhc2hfY2FjaGVkOjp2YWx1ZT47CisgICAgICB1c2luZyBsb2NhbF9pdGVy YXRvciA9IF9fZGV0YWlsOjpfX2xvY2FsX2l0ZXJhdG9yPAorCV9fbm9kZV9wdHIsIGtleV90 eXBlLCB2YWx1ZV90eXBlLAorCV9FeHRyYWN0S2V5LCBfSGFzaCwgX1JhbmdlSGFzaCwgX1Vu dXNlZCwKKwlfX2NvbnN0YW50X2l0ZXJhdG9yczo6dmFsdWUsIF9faGFzaF9jYWNoZWQ6OnZh bHVlPjsKIAotICAgICAgdXNpbmcgY29uc3RfbG9jYWxfaXRlcmF0b3IgPSBfX2RldGFpbDo6 X0xvY2FsX2NvbnN0X2l0ZXJhdG9yPAotCQkJa2V5X3R5cGUsIF9WYWx1ZSwKLQkJCV9FeHRy YWN0S2V5LCBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNlZCwKLQkJCV9fY29uc3RhbnRfaXRl cmF0b3JzOjp2YWx1ZSwgX19oYXNoX2NhY2hlZDo6dmFsdWU+OworICAgICAgdXNpbmcgY29u c3RfbG9jYWxfaXRlcmF0b3IgPSBfX2RldGFpbDo6X19jb25zdF9sb2NhbF9pdGVyYXRvcjwK KwlfX25vZGVfcHRyLCBrZXlfdHlwZSwgdmFsdWVfdHlwZSwKKwlfRXh0cmFjdEtleSwgX0hh c2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsCisJX19jb25zdGFudF9pdGVyYXRvcnM6OnZhbHVl LCBfX2hhc2hfY2FjaGVkOjp2YWx1ZT47CiAKICAgICBwcml2YXRlOgogICAgICAgdXNpbmcg X19yZWhhc2hfdHlwZSA9IF9SZWhhc2hQb2xpY3k7CkBAIC0zOTIsNyArMzk0LDggQEAgX0dM SUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICNlbmRpZgogCiAgICAgcHJpdmF0ZToK LSAgICAgIF9fYnVja2V0c19wdHIJCV9NX2J1Y2tldHMJCT0gJl9NX3NpbmdsZV9idWNrZXQ7 CisgICAgICBfX2J1Y2tldHNfcHRyCQlfTV9idWNrZXRzID0KKwkJCV9fYnVja2V0c19wdHJf dHJhaXRzOjpwb2ludGVyX3RvKF9NX3NpbmdsZV9idWNrZXQpOwogICAgICAgc2l6ZV90eXBl CQkJX01fYnVja2V0X2NvdW50CQk9IDE7CiAgICAgICBfX25vZGVfYmFzZQkJX01fYmVmb3Jl X2JlZ2luOwogICAgICAgc2l6ZV90eXBlCQkJX01fZWxlbWVudF9jb3VudAk9IDA7CkBAIC00 MDYsMTEgKzQwOSwxOSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAg ICAgLy8gbnVtZXJvdXMgY2hlY2tzIGluIHRoZSBjb2RlIHRvIGF2b2lkIDAgbW9kdWx1cy4K ICAgICAgIF9fbm9kZV9iYXNlX3B0cgkJX01fc2luZ2xlX2J1Y2tldAk9IG51bGxwdHI7CiAK KyAgICAgIF9fYnVja2V0c19wdHIKKyAgICAgIF9NX3NpbmdsZV9idWNrZXRfcHRyKCkKKyAg ICAgIHsgcmV0dXJuIF9fYnVja2V0c19wdHJfdHJhaXRzOjpwb2ludGVyX3RvKF9NX3Npbmds ZV9idWNrZXQpOyB9CisKKyAgICAgIF9fbm9kZV9iYXNlX3B0cgorICAgICAgX01fYmVmb3Jl X2JlZ2luX3B0cigpCisgICAgICB7IHJldHVybiBfX25vZGVfYmFzZV9wdHJfdHJhaXRzOjpw b2ludGVyX3RvKF9NX2JlZm9yZV9iZWdpbik7IH0KKwogICAgICAgdm9pZAogICAgICAgX01f dXBkYXRlX2JiZWdpbigpCiAgICAgICB7CiAJaWYgKGF1dG8gX19iZWdpbiA9IF9NX2JlZ2lu KCkpCi0JICBfTV9idWNrZXRzW19NX2J1Y2tldF9pbmRleCgqX19iZWdpbildID0gJl9NX2Jl Zm9yZV9iZWdpbjsKKwkgIF9NX2J1Y2tldHNbX01fYnVja2V0X2luZGV4KCpfX2JlZ2luKV0g PSBfTV9iZWZvcmVfYmVnaW5fcHRyKCk7CiAgICAgICB9CiAKICAgICAgIHZvaWQKQEAgLTQy Miw3ICs0MzMsMTEgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAogICAg ICAgYm9vbAogICAgICAgX01fdXNlc19zaW5nbGVfYnVja2V0KF9fYnVja2V0c19wdHIgX19i a3RzKSBjb25zdAotICAgICAgeyByZXR1cm4gX19idWlsdGluX2V4cGVjdChfX2JrdHMgPT0g Jl9NX3NpbmdsZV9idWNrZXQsIGZhbHNlKTsgfQorICAgICAgeworCXJldHVybiBfX2J1aWx0 aW5fZXhwZWN0CisJICAoc3RkOjpfX3RvX2FkZHJlc3MoX19ia3RzKSA9PSBzdGQ6OmFkZHJl c3NvZihfTV9zaW5nbGVfYnVja2V0KSwKKwkgICBmYWxzZSk7CisgICAgICB9CiAKICAgICAg IGJvb2wKICAgICAgIF9NX3VzZXNfc2luZ2xlX2J1Y2tldCgpIGNvbnN0CkBAIC00NDQsNyAr NDU5LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAlpZiAoX19idWls dGluX2V4cGVjdChfX2JrdF9jb3VudCA9PSAxLCBmYWxzZSkpCiAJICB7CiAJICAgIF9NX3Np bmdsZV9idWNrZXQgPSBudWxscHRyOwotCSAgICByZXR1cm4gJl9NX3NpbmdsZV9idWNrZXQ7 CisJICAgIHJldHVybiBfTV9zaW5nbGVfYnVja2V0X3B0cigpOwogCSAgfQogCiAJcmV0dXJu IF9faGFzaHRhYmxlX2FsbG9jOjpfTV9hbGxvY2F0ZV9idWNrZXRzKF9fYmt0X2NvdW50KTsK QEAgLTQ2MywxOCArNDc4LDI2IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9O CiAgICAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoKQogICAgICAgeyBfTV9kZWFsbG9jYXRl X2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsgfQogCisgICAgICBzdGF0 aWMgX19ub2RlX3B0cgorICAgICAgX1NfY2FzdChfX25vZGVfcHRyIF9fbikKKyAgICAgIHsg cmV0dXJuIF9fbjsgfQorCisgICAgICBzdGF0aWMgX19ub2RlX3B0cgorICAgICAgX1NfY2Fz dChfX2RldGFpbDo6X0hhc2hfbm9kZV9iYXNlKiBfX24pCisgICAgICB7IHJldHVybiBzdGF0 aWNfY2FzdDxfX25vZGVfcHRyPihfX24pOyB9CisKICAgICAgIC8vIEdldHMgYnVja2V0IGJl Z2luLCBkZWFscyB3aXRoIHRoZSBmYWN0IHRoYXQgbm9uLWVtcHR5IGJ1Y2tldHMgY29udGFp bgogICAgICAgLy8gdGhlaXIgYmVmb3JlIGJlZ2luIG5vZGUuCiAgICAgICBfX25vZGVfcHRy CiAgICAgICBfTV9idWNrZXRfYmVnaW4oc2l6ZV90eXBlIF9fYmt0KSBjb25zdAogICAgICAg ewogCV9fbm9kZV9iYXNlX3B0ciBfX24gPSBfTV9idWNrZXRzW19fYmt0XTsKLQlyZXR1cm4g X19uID8gc3RhdGljX2Nhc3Q8X19ub2RlX3B0cj4oX19uLT5fTV9ueHQpIDogbnVsbHB0cjsK KwlyZXR1cm4gX19uID8gX1NfY2FzdChfX24tPl9NX254dCkgOiBudWxscHRyOwogICAgICAg fQogCiAgICAgICBfX25vZGVfcHRyCiAgICAgICBfTV9iZWdpbigpIGNvbnN0Ci0gICAgICB7 IHJldHVybiBzdGF0aWNfY2FzdDxfX25vZGVfcHRyPihfTV9iZWZvcmVfYmVnaW4uX01fbnh0 KTsgfQorICAgICAgeyByZXR1cm4gX1NfY2FzdChfTV9iZWZvcmVfYmVnaW4uX01fbnh0KTsg fQogCiAgICAgICAvLyBBc3NpZ24gKnRoaXMgdXNpbmcgYW5vdGhlciBfSGFzaHRhYmxlIGlu c3RhbmNlLiBXaGV0aGVyIGVsZW1lbnRzCiAgICAgICAvLyBhcmUgY29waWVkIG9yIG1vdmVk IGRlcGVuZHMgb24gdGhlIF9IdCByZWZlcmVuY2UuCkBAIC04MjQsNyArODQ3LDcgQEAgX0dM SUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIHsKIAlfX25vZGVfYmFzZV9w dHIgX19iZWZvcmVfbiA9IF9NX2ZpbmRfYmVmb3JlX25vZGUoX19ia3QsIF9fa2V5LCBfX2Mp OwogCWlmIChfX2JlZm9yZV9uKQotCSAgcmV0dXJuIHN0YXRpY19jYXN0PF9fbm9kZV9wdHI+ KF9fYmVmb3JlX24tPl9NX254dCk7CisJICByZXR1cm4gX1NfY2FzdChfX2JlZm9yZV9uLT5f TV9ueHQpOwogCXJldHVybiBudWxscHRyOwogICAgICAgfQogCkBAIC04MzUsNyArODU4LDcg QEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAl7CiAJICBhdXRvIF9fYmVm b3JlX24gPSBfTV9maW5kX2JlZm9yZV9ub2RlX3RyKF9fYmt0LCBfX2tleSwgX19jKTsKIAkg IGlmIChfX2JlZm9yZV9uKQotCSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X19ub2RlX3B0cj4o X19iZWZvcmVfbi0+X01fbnh0KTsKKwkgICAgcmV0dXJuIF9TX2Nhc3QoX19iZWZvcmVfbi0+ X01fbnh0KTsKIAkgIHJldHVybiBudWxscHRyOwogCX0KIApAQCAtODYzLDcgKzg4Niw3IEBA IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJICAgICAgLy8gX01fYmVmb3Jl X2JlZ2luLgogCSAgICAgIF9NX2J1Y2tldHNbX01fYnVja2V0X2luZGV4KCpfX25vZGUtPl9N X25leHQoKSldID0gX19ub2RlOwogCi0JICAgIF9NX2J1Y2tldHNbX19ia3RdID0gJl9NX2Jl Zm9yZV9iZWdpbjsKKwkgICAgX01fYnVja2V0c1tfX2JrdF0gPSBfTV9iZWZvcmVfYmVnaW5f cHRyKCk7CiAJICB9CiAgICAgICB9CiAKQEAgLTExMDksNyArMTEzMiw3IEBAIF9HTElCQ1hY X0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBub2RlX3R5cGUKICAgICAgIF9NX2V4 dHJhY3Rfbm9kZShzaXplX3QgX19ia3QsIF9fbm9kZV9iYXNlX3B0ciBfX3ByZXZfbikKICAg ICAgIHsKLQlfX25vZGVfcHRyIF9fbiA9IHN0YXRpY19jYXN0PF9fbm9kZV9wdHI+KF9fcHJl dl9uLT5fTV9ueHQpOworCV9fbm9kZV9wdHIgX19uID0gX1NfY2FzdChfX3ByZXZfbi0+X01f bnh0KTsKIAlpZiAoX19wcmV2X24gPT0gX01fYnVja2V0c1tfX2JrdF0pCiAJICBfTV9yZW1v dmVfYnVja2V0X2JlZ2luKF9fYmt0LCBfX24tPl9NX25leHQoKSwKIAkgICAgIF9fbi0+X01f bnh0ID8gX01fYnVja2V0X2luZGV4KCpfX24tPl9NX25leHQoKSkgOiAwKTsKQEAgLTExNTcs NyArMTE4MCw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJbm9kZV90 eXBlIF9fbmg7CiAJX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9f ayk7CiAJc3RkOjpzaXplX3QgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19jb2RlKTsKLQlp ZiAoX19ub2RlX2Jhc2VfcHRyIF9fcHJldl9ub2RlID0gX01fZmluZF9iZWZvcmVfbm9kZShf X2JrdCwgX19rLCBfX2NvZGUpKQorCWlmIChhdXRvIF9fcHJldl9ub2RlID0gX01fZmluZF9i ZWZvcmVfbm9kZShfX2JrdCwgX19rLCBfX2NvZGUpKQogCSAgX19uaCA9IF9NX2V4dHJhY3Rf bm9kZShfX2JrdCwgX19wcmV2X25vZGUpOwogCXJldHVybiBfX25oOwogICAgICAgfQpAQCAt MTQ2OCw3ICsxNDkxLDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAg ICAgIF9NX3JlaGFzaF9wb2xpY3kuX01fcmVzZXQoKTsKICAgICAgIF9NX2J1Y2tldF9jb3Vu dCA9IDE7CiAgICAgICBfTV9zaW5nbGVfYnVja2V0ID0gbnVsbHB0cjsKLSAgICAgIF9NX2J1 Y2tldHMgPSAmX01fc2luZ2xlX2J1Y2tldDsKKyAgICAgIF9NX2J1Y2tldHMgPSBfTV9zaW5n bGVfYnVja2V0X3B0cigpOwogICAgICAgX01fYmVmb3JlX2JlZ2luLl9NX254dCA9IG51bGxw dHI7CiAgICAgICBfTV9lbGVtZW50X2NvdW50ID0gMDsKICAgICB9CkBAIC0xNDkzLDcgKzE1 MTYsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCV9NX2J1Y2tldHMg PSBfX2h0Ll9NX2J1Y2tldHM7CiAgICAgICBlbHNlCiAJewotCSAgX01fYnVja2V0cyA9ICZf TV9zaW5nbGVfYnVja2V0OworCSAgX01fYnVja2V0cyA9IF9NX3NpbmdsZV9idWNrZXRfcHRy KCk7CiAJICBfTV9zaW5nbGVfYnVja2V0ID0gX19odC5fTV9zaW5nbGVfYnVja2V0OwogCX0K IApAQCAtMTU3MSw3ICsxNTk0LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJ T04KICAgICAgIC8vIFVwZGF0ZSBidWNrZXRzIGlmIF9faHQgaXMgdXNpbmcgaXRzIHNpbmds ZSBidWNrZXQuCiAgICAgICBpZiAoX19odC5fTV91c2VzX3NpbmdsZV9idWNrZXQoKSkKIAl7 Ci0JICBfTV9idWNrZXRzID0gJl9NX3NpbmdsZV9idWNrZXQ7CisJICBfTV9idWNrZXRzID0g X01fc2luZ2xlX2J1Y2tldF9wdHIoKTsKIAkgIF9NX3NpbmdsZV9idWNrZXQgPSBfX2h0Ll9N X3NpbmdsZV9idWNrZXQ7CiAJfQogCkBAIC0xNjI0LDcgKzE2NDcsNyBAQCBfR0xJQkNYWF9C RUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCXsKIAkgIGlmIChfX2h0Ll9NX3VzZXNfc2luZ2xl X2J1Y2tldCgpKQogCSAgICB7Ci0JICAgICAgX01fYnVja2V0cyA9ICZfTV9zaW5nbGVfYnVj a2V0OworCSAgICAgIF9NX2J1Y2tldHMgPSBfTV9zaW5nbGVfYnVja2V0X3B0cigpOwogCSAg ICAgIF9NX3NpbmdsZV9idWNrZXQgPSBfX2h0Ll9NX3NpbmdsZV9idWNrZXQ7CiAJICAgIH0K IAkgIGVsc2UKQEAgLTE2OTQsMTMgKzE3MTcsMTMgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQ QUNFX1ZFUlNJT04KIAkgIGlmICghX194Ll9NX3VzZXNfc2luZ2xlX2J1Y2tldCgpKQogCSAg ICB7CiAJICAgICAgX01fYnVja2V0cyA9IF9feC5fTV9idWNrZXRzOwotCSAgICAgIF9feC5f TV9idWNrZXRzID0gJl9feC5fTV9zaW5nbGVfYnVja2V0OworCSAgICAgIF9feC5fTV9idWNr ZXRzID0gX194Ll9NX3NpbmdsZV9idWNrZXRfcHRyKCk7CiAJICAgIH0KIAl9CiAgICAgICBl bHNlIGlmIChfX3guX01fdXNlc19zaW5nbGVfYnVja2V0KCkpCiAJewogCSAgX194Ll9NX2J1 Y2tldHMgPSBfTV9idWNrZXRzOwotCSAgX01fYnVja2V0cyA9ICZfTV9zaW5nbGVfYnVja2V0 OworCSAgX01fYnVja2V0cyA9IF9NX3NpbmdsZV9idWNrZXRfcHRyKCk7CiAJfQkKICAgICAg IGVsc2UKIAlzdGQ6OnN3YXAoX01fYnVja2V0cywgX194Ll9NX2J1Y2tldHMpOwpAQCAtMjAz NSwxMiArMjA1OCwxMSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAg IF9NX2ZpbmRfYmVmb3JlX25vZGUoY29uc3Qga2V5X3R5cGUmIF9faykKICAgICAtPiBfX25v ZGVfYmFzZV9wdHIKICAgICB7Ci0gICAgICBfX25vZGVfYmFzZV9wdHIgX19wcmV2X3AgPSAm X01fYmVmb3JlX2JlZ2luOworICAgICAgX19ub2RlX2Jhc2VfcHRyIF9fcHJldl9wID0gX01f YmVmb3JlX2JlZ2luX3B0cigpOwogICAgICAgaWYgKCFfX3ByZXZfcC0+X01fbnh0KQogCXJl dHVybiBudWxscHRyOwogCi0gICAgICBmb3IgKF9fbm9kZV9wdHIgX19wID0gc3RhdGljX2Nh c3Q8X19ub2RlX3B0cj4oX19wcmV2X3AtPl9NX254dCk7Ci0JICAgX19wICE9IG51bGxwdHI7 CisgICAgICBmb3IgKF9fbm9kZV9wdHIgX19wID0gX1NfY2FzdChfX3ByZXZfcC0+X01fbnh0 KTsgX19wICE9IG51bGxwdHI7CiAJICAgX19wID0gX19wLT5fTV9uZXh0KCkpCiAJewogCSAg aWYgKHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19wKSkKQEAgLTIwNjksOCArMjA5MSw3 IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBpZiAoIV9fcHJl dl9wKQogCXJldHVybiBudWxscHRyOwogCi0gICAgICBmb3IgKF9fbm9kZV9wdHIgX19wID0g c3RhdGljX2Nhc3Q8X19ub2RlX3B0cj4oX19wcmV2X3AtPl9NX254dCk7OwotCSAgIF9fcCA9 IF9fcC0+X01fbmV4dCgpKQorICAgICAgZm9yIChfX25vZGVfcHRyIF9fcCA9IF9TX2Nhc3Qo X19wcmV2X3AtPl9NX254dCk7OyBfX3AgPSBfX3AtPl9NX25leHQoKSkKIAl7CiAJICBpZiAo dGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCAqX19wKSkKIAkgICAgcmV0dXJuIF9fcHJl dl9wOwpAQCAtMjA5OSw4ICsyMTIwLDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZF UlNJT04KIAlpZiAoIV9fcHJldl9wKQogCSAgcmV0dXJuIG51bGxwdHI7CiAKLQlmb3IgKF9f bm9kZV9wdHIgX19wID0gc3RhdGljX2Nhc3Q8X19ub2RlX3B0cj4oX19wcmV2X3AtPl9NX254 dCk7OwotCSAgICAgX19wID0gX19wLT5fTV9uZXh0KCkpCisJZm9yIChfX25vZGVfcHRyIF9f cCA9IF9TX2Nhc3QoX19wcmV2X3AtPl9NX254dCk7OyBfX3AgPSBfX3AtPl9NX25leHQoKSkK IAkgIHsKIAkgICAgaWYgKHRoaXMtPl9NX2VxdWFsc190cihfX2ssIF9fY29kZSwgKl9fcCkp CiAJICAgICAgcmV0dXJuIF9fcHJldl9wOwpAQCAtMjI3MywxMCArMjI5MywxMSBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAgICAgICAvLyBGaW5kIHRoZSBub2Rl IGJlZm9yZSBhbiBlcXVpdmFsZW50IG9uZSBvciB1c2UgaGludCBpZiBpdCBleGlzdHMgYW5k CiAgICAgICAvLyBpZiBpdCBpcyBlcXVpdmFsZW50LgorICAgICAgX19ub2RlX2Jhc2VfcHRy IF9faGludF9iYXNlID0gX19oaW50OwogICAgICAgX19ub2RlX2Jhc2VfcHRyIF9fcHJldgog CT0gX19idWlsdGluX2V4cGVjdChfX2hpbnQgIT0gbnVsbHB0ciwgZmFsc2UpCiAJICAmJiB0 aGlzLT5fTV9lcXVhbHMoX19rLCBfX2NvZGUsICpfX2hpbnQpCi0JICAgID8gX19oaW50CisJ ICAgID8gX19oaW50X2Jhc2UKIAkgICAgOiBfTV9maW5kX2JlZm9yZV9ub2RlKF9fYmt0LCBf X2ssIF9fY29kZSk7CiAKICAgICAgIGlmIChfX3ByZXYpCkBAIC0yNDM3LDcgKzI0NTgsNyBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICByZXR1cm4gMDsKIAog CSAgLy8gV2UgZm91bmQgYSBtYXRjaGluZyBub2RlLCBlcmFzZSBpdC4KLQkgIF9fbiA9IHN0 YXRpY19jYXN0PF9fbm9kZV9wdHI+KF9fcHJldl9uLT5fTV9ueHQpOworCSAgX19uID0gX1Nf Y2FzdChfX3ByZXZfbi0+X01fbnh0KTsKIAkgIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KCpf X24pOwogCX0KICAgICAgIGVsc2UKQEAgLTI0NTEsNyArMjQ3Miw3IEBAIF9HTElCQ1hYX0JF R0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJICAgIHJldHVybiAwOwogCiAJICAvLyBXZSBmb3Vu ZCBhIG1hdGNoaW5nIG5vZGUsIGVyYXNlIGl0LgotCSAgX19uID0gc3RhdGljX2Nhc3Q8X19u b2RlX3B0cj4oX19wcmV2X24tPl9NX254dCk7CisJICBfX24gPSBfU19jYXN0KF9fcHJldl9u LT5fTV9ueHQpOwogCX0KIAogICAgICAgX01fZXJhc2UoX19ia3QsIF9fcHJldl9uLCBfX24p OwpAQCAtMjQ3OCw3ICsyNDk5LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJ T04KIAkgICAgcmV0dXJuIDA7CiAKIAkgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcgbm9kZSwg ZXJhc2UgaXQuCi0JICBfX24gPSBzdGF0aWNfY2FzdDxfX25vZGVfcHRyPihfX3ByZXZfbi0+ X01fbnh0KTsKKwkgIF9fbiA9IF9TX2Nhc3QoX19wcmV2X24tPl9NX254dCk7CiAJICBfX2Jr dCA9IF9NX2J1Y2tldF9pbmRleCgqX19uKTsKIAl9CiAgICAgICBlbHNlCkBAIC0yNDkxLDcg KzI1MTIsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgaWYgKCFf X3ByZXZfbikKIAkgICAgcmV0dXJuIDA7CiAKLQkgIF9fbiA9IHN0YXRpY19jYXN0PF9fbm9k ZV9wdHI+KF9fcHJldl9uLT5fTV9ueHQpOworCSAgX19uID0gX1NfY2FzdChfX3ByZXZfbi0+ X01fbnh0KTsKIAl9CiAKICAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMK QEAgLTI2MzMsNyArMjY1NCw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9O CiAJICAgIHsKIAkgICAgICBfX3AtPl9NX254dCA9IF9NX2JlZm9yZV9iZWdpbi5fTV9ueHQ7 CiAJICAgICAgX01fYmVmb3JlX2JlZ2luLl9NX254dCA9IF9fcDsKLQkgICAgICBfX25ld19i dWNrZXRzW19fYmt0XSA9ICZfTV9iZWZvcmVfYmVnaW47CisJICAgICAgX19uZXdfYnVja2V0 c1tfX2JrdF0gPSBfTV9iZWZvcmVfYmVnaW5fcHRyKCk7CiAJICAgICAgaWYgKF9fcC0+X01f bnh0KQogCQlfX25ld19idWNrZXRzW19fYmJlZ2luX2JrdF0gPSBfX3A7CiAJICAgICAgX19i YmVnaW5fYmt0ID0gX19ia3Q7CkBAIC0yNzEzLDcgKzI3MzQsNyBAQCBfR0xJQkNYWF9CRUdJ Tl9OQU1FU1BBQ0VfVkVSU0lPTgogCQl7CiAJCSAgX19wLT5fTV9ueHQgPSBfTV9iZWZvcmVf YmVnaW4uX01fbnh0OwogCQkgIF9NX2JlZm9yZV9iZWdpbi5fTV9ueHQgPSBfX3A7Ci0JCSAg X19uZXdfYnVja2V0c1tfX2JrdF0gPSAmX01fYmVmb3JlX2JlZ2luOworCQkgIF9fbmV3X2J1 Y2tldHNbX19ia3RdID0gX01fYmVmb3JlX2JlZ2luX3B0cigpOwogCQkgIGlmIChfX3AtPl9N X254dCkKIAkJICAgIF9fbmV3X2J1Y2tldHNbX19iYmVnaW5fYmt0XSA9IF9fcDsKIAkJICBf X2JiZWdpbl9ia3QgPSBfX2JrdDsKZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRl L2JpdHMvaGFzaHRhYmxlX3BvbGljeS5oIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9o YXNodGFibGVfcG9saWN5LmgKaW5kZXggMjZkZWYyNGYyNGUuLjIyNTM4MWNjYjcyIDEwMDY0 NAotLS0gYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaAor KysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaApAQCAt MzMsOCArMzMsOSBAQAogCiAjaW5jbHVkZSA8dHVwbGU+CQkvLyBmb3Igc3RkOjp0dXBsZSwg c3RkOjpmb3J3YXJkX2FzX3R1cGxlCiAjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2gu aD4gLy8gZm9yIF9faXNfZmFzdF9oYXNoCi0jaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2Uu aD4JLy8gZm9yIHN0ZDo6bWluLCBzdGQ6OmlzX3Blcm11dGF0aW9uLgorI2luY2x1ZGUgPGJp dHMvc3RsX2FsZ29iYXNlLmg+CS8vIGZvciBzdGQ6Om1pbiwgc3RkOjppc19wZXJtdXRhdGlv bgogI2luY2x1ZGUgPGJpdHMvc3RsX3BhaXIuaD4JLy8gZm9yIHN0ZDo6cGFpcgorI2luY2x1 ZGUgPGJpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaD4gLy8gZm9yIF9fdW5pbml0aWFsaXplZF9k ZWZhdWx0X24KICNpbmNsdWRlIDxleHQvYWxpZ25lZF9idWZmZXIuaD4JLy8gZm9yIF9fZ251 X2N4eDo6X19hbGlnbmVkX2J1ZmZlcgogI2luY2x1ZGUgPGV4dC9hbGxvY190cmFpdHMuaD4J Ly8gZm9yIHN0ZDo6X19hbGxvY19yZWJpbmQKICNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFp dHMuaD4JLy8gZm9yIF9fZ251X2N4eDo6X19pbnRfdHJhaXRzCkBAIC04Miw2ICs4MywxMSBA QCBuYW1lc3BhY2UgX19kZXRhaWwKICAgICB7IHJldHVybiBfX2Rpc3RhbmNlX2Z3KF9fZmly c3QsIF9fbGFzdCwKIAkJCSAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7 IH0KIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9WYWx1ZT4KKyAg ICB1c2luZyBfX2FsbG9jX3ZhbF9wdHIgPQorICAgICAgdHlwZW5hbWUgc3RkOjphbGxvY2F0 b3JfdHJhaXRzPF9fYWxsb2NfcmViaW5kPF9BbGxvYywKKwkJCQkJCSAgICBfVmFsdWU+Pjo6 cG9pbnRlcjsKKwogICBzdHJ1Y3QgX0lkZW50aXR5CiAgIHsKICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBfVHA+CkBAIC0zMjEsNiArMzI3LDI4IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogICAg IF9IYXNoX25vZGVfYmFzZShfSGFzaF9ub2RlX2Jhc2UqIF9fbmV4dCkgbm9leGNlcHQgOiBf TV9ueHQoX19uZXh0KSB7IH0KICAgfTsKIAorICAvKioKKyAgICogc3RydWN0IF9IYXNoX3Bu b2RlX2Jhc2UKKyAgICoKKyAgICogTGlrZSBfSGFzaF9ub2RlX2Jhc2UgYnV0IHVzZWQgaW4g Y2FzZSBvZiBjdXN0b20gcG9pbnRlciB0eXBlIGRlZmluZWQgYnkgdGhlCisgICAqIGFsbG9j YXRvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlUHRyPgorICAgIHN0cnVj dCBfSGFzaF9wbm9kZV9iYXNlCisgICAgeworICAgICAgdXNpbmcgX19ub2RlX3B0ciA9IF9O b2RlUHRyOworCisgICAgICBfX25vZGVfcHRyIF9NX254dDsKKworICAgICAgX0hhc2hfcG5v ZGVfYmFzZSgpCisgICAgICBub2V4Y2VwdChzdGQ6OmlzX25vdGhyb3dfZGVmYXVsdF9jb25z dHJ1Y3RpYmxlPF9fbm9kZV9wdHI+Ojp2YWx1ZSkKKyAgICAgIDogX01fbnh0KCkgeyB9CisK KyAgICAgIF9IYXNoX3Bub2RlX2Jhc2UoX19ub2RlX3B0ciBfX25leHQpCisgICAgICBub2V4 Y2VwdChzdGQ6OmlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9fbm9kZV9wdHI+Ojp2 YWx1ZSkKKyAgICAgIDogX01fbnh0KF9fbmV4dCkgeyB9CisgICAgfTsKKwogICAvKioKICAg ICogIHN0cnVjdCBfSGFzaF9ub2RlX3ZhbHVlX2Jhc2UKICAgICoKQEAgLTM1NiwxOCArMzg0 LDIzIEBAIG5hbWVzcGFjZSBfX2RldGFpbAogCiAgIC8qKgogICAgKiAgUHJpbWFyeSB0ZW1w bGF0ZSBzdHJ1Y3QgX0hhc2hfbm9kZV9jb2RlX2NhY2hlLgorICAgKgorICAgKiAgTm8gY2Fj aGUuCiAgICAqLwogICB0ZW1wbGF0ZTxib29sIF9DYWNoZV9oYXNoX2NvZGU+CiAgICAgc3Ry dWN0IF9IYXNoX25vZGVfY29kZV9jYWNoZQogICAgIHsgfTsKIAogICAvKioKLSAgICogIFNw ZWNpYWxpemF0aW9uIGZvciBub2RlIHdpdGggY2FjaGUsIHN0cnVjdCBfSGFzaF9ub2RlX2Nv ZGVfY2FjaGUuCisgICAqICBTcGVjaWFsaXphdGlvbiBmb3Igbm9kZSB3aXRoIGNhY2hlLgog ICAgKi8KICAgdGVtcGxhdGU8PgogICAgIHN0cnVjdCBfSGFzaF9ub2RlX2NvZGVfY2FjaGU8 dHJ1ZT4KICAgICB7IHN0ZDo6c2l6ZV90ICBfTV9oYXNoX2NvZGU7IH07CiAKKyAgLyoqCisg ICAqIE5vZGUgd2l0aCB2YWx1ZSBhbmQgb3B0aW9uYWxseSBhIGNhY2hlIGZvciB0aGUgaGFz aCBjb2RlLgorICAgKi8KICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNo ZV9oYXNoX2NvZGU+CiAgICAgc3RydWN0IF9IYXNoX25vZGVfdmFsdWUKICAgICA6IF9IYXNo X25vZGVfdmFsdWVfYmFzZTxfVmFsdWU+CkBAIC0zNzUsMjggKzQwOCw2NCBAQCBuYW1lc3Bh Y2UgX19kZXRhaWwKICAgICB7IH07CiAKICAgLyoqCi0gICAqICBQcmltYXJ5IHRlbXBsYXRl IHN0cnVjdCBfSGFzaF9ub2RlLgorICAgKiAgc3RydWN0IF9IYXNoX25vZGUuCisgICAqCisg ICAqICBUaGUgbm9kZSBkZWZpbml0aW9uIHdoZW4gdGhlIGFsbG9jYXRvciBpcyB1c2luZyBy YXcgcG9pbnRlcnMuCiAgICAqLwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wg X0NhY2hlX2hhc2hfY29kZT4KICAgICBzdHJ1Y3QgX0hhc2hfbm9kZQogICAgIDogX0hhc2hf bm9kZV9iYXNlCiAgICAgLCBfSGFzaF9ub2RlX3ZhbHVlPF9WYWx1ZSwgX0NhY2hlX2hhc2hf Y29kZT4KICAgICB7Ci0gICAgICBfSGFzaF9ub2RlKgorICAgICAgdXNpbmcgX19ub2RlX3B0 ciA9IF9IYXNoX25vZGUqOworICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSBfSGFzaF9ub2Rl OworCisgICAgICBfX25vZGVfcHRyCisgICAgICBfTV9uZXh0KCkgY29uc3Qgbm9leGNlcHQK KyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9fbm9kZV9wdHI+KHRoaXMtPl9NX254dCk7 IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgc3RydWN0IF9IYXNoX3Bub2RlLgorICAgKgor ICAgKiAgVGhlIG5vZGUgZGVmaW5pdGlvbiB1c2VkIHdoZW4gdGhlIGFsbG9jYXRvciBkZWZp bmUgYSBjdXN0b20gcG9pbnRlciB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUg X1ZhbHVlUHRyLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgc3RydWN0IF9IYXNoX3Bu b2RlCisgICAgOiBfSGFzaF9wbm9kZV9iYXNlPF9fcHRyX3JlYmluZDwKKwlfVmFsdWVQdHIs IF9IYXNoX3Bub2RlPF9WYWx1ZVB0ciwgX0NhY2hlX2hhc2hfY29kZT4+PgorICAgICwgX0hh c2hfbm9kZV92YWx1ZTwKKwl0eXBlbmFtZSBzdGQ6OnBvaW50ZXJfdHJhaXRzPF9WYWx1ZVB0 cj46OmVsZW1lbnRfdHlwZSwgX0NhY2hlX2hhc2hfY29kZT4KKyAgICB7CisgICAgICB1c2lu ZyBfX25vZGVfcHRyID0gX19wdHJfcmViaW5kPAorCV9WYWx1ZVB0ciwgX0hhc2hfcG5vZGU8 X1ZhbHVlUHRyLCBfQ2FjaGVfaGFzaF9jb2RlPj47CisgICAgICB1c2luZyBfX25vZGVfdHlw ZSA9CisJdHlwZW5hbWUgc3RkOjpwb2ludGVyX3RyYWl0czxfX25vZGVfcHRyPjo6ZWxlbWVu dF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnBvaW50ZXJfdHJhaXRzPF9f bm9kZV9wdHI+OjpkaWZmZXJlbmNlX3R5cGUKKwkJCQkJCQlkaWZmZXJlbmNlX3R5cGU7CisK KyAgICAgIF9fbm9kZV9wdHIKICAgICAgIF9NX25leHQoKSBjb25zdCBub2V4Y2VwdAotICAg ICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0hhc2hfbm9kZSo+KHRoaXMtPl9NX254dCk7IH0K KyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX254dDsgfQogICAgIH07CiAKKyAgdGVtcGxhdGU8 dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19oYXNoX2NhY2hlZD4K KyAgICB1c2luZyBfX2dldF9ub2RlX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFs PAorICAgICAgc3RkOjppc19wb2ludGVyPF9fYWxsb2NfdmFsX3B0cjxfQWxsb2MsIF9WYWx1 ZT4+Ojp2YWx1ZSwKKyAgICAgIF9IYXNoX25vZGU8X1ZhbHVlLCBfX2hhc2hfY2FjaGVkPiwK KyAgICAgIF9IYXNoX3Bub2RlPF9fYWxsb2NfdmFsX3B0cjxfQWxsb2MsIF9WYWx1ZT4sIF9f aGFzaF9jYWNoZWQ+Pjo6dHlwZTsKKwogICAvLy8gQmFzZSBjbGFzcyBmb3Igbm9kZSBpdGVy YXRvcnMuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfQ2FjaGVfaGFzaF9j b2RlPgotICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcl9iYXNlCisgIHRlbXBsYXRlPHR5cGVu YW1lIF9Ob2RlUHRyPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2UKICAg ICB7Ci0gICAgICB1c2luZyBfX25vZGVfdHlwZSA9IF9IYXNoX25vZGU8X1ZhbHVlLCBfQ2Fj aGVfaGFzaF9jb2RlPjsKKyAgICAgIHVzaW5nIF9fbm9kZV9wdHIgPSBfTm9kZVB0cjsKKyAg ICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5hbWUgc3RkOjpwb2ludGVyX3RyYWl0czxf Tm9kZVB0cj46OmVsZW1lbnRfdHlwZTsKIAotICAgICAgX19ub2RlX3R5cGUqIF9NX2N1cjsK KyAgICAgIF9fbm9kZV9wdHIgX01fY3VyOwogCi0gICAgICBfTm9kZV9pdGVyYXRvcl9iYXNl KCkgOiBfTV9jdXIobnVsbHB0cikgeyB9Ci0gICAgICBfTm9kZV9pdGVyYXRvcl9iYXNlKF9f bm9kZV90eXBlKiBfX3ApIG5vZXhjZXB0CisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jh c2UoKSA6IF9NX2N1cigpIHsgfQorICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlKF9f bm9kZV9wdHIgX19wKSBub2V4Y2VwdAogICAgICAgOiBfTV9jdXIoX19wKSB7IH0KIAogICAg ICAgdm9pZApAQCAtNDA0LDE4ICs0NzMsMzMgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAgICAg ICB7IF9NX2N1ciA9IF9NX2N1ci0+X01fbmV4dCgpOyB9CiAKICAgICAgIGZyaWVuZCBib29s Ci0gICAgICBvcGVyYXRvcj09KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29u c3QgX05vZGVfaXRlcmF0b3JfYmFzZSYgX195KQotICAgICAgbm9leGNlcHQKKyAgICAgIG9w ZXJhdG9yPT0oY29uc3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlJiBfX3gsCisJCSBjb25z dCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2UmIF9feSkgbm9leGNlcHQKICAgICAgIHsgcmV0 dXJuIF9feC5fTV9jdXIgPT0gX195Ll9NX2N1cjsgfQogCiAjaWYgX19jcHBfaW1wbF90aHJl ZV93YXlfY29tcGFyaXNvbiA8IDIwMTkwN0wKICAgICAgIGZyaWVuZCBib29sCi0gICAgICBv cGVyYXRvciE9KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2UmIF9feCwgY29uc3QgX05vZGVf aXRlcmF0b3JfYmFzZSYgX195KQotICAgICAgbm9leGNlcHQKKyAgICAgIG9wZXJhdG9yIT0o Y29uc3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlJiBfX3gsCisJCSBjb25zdCBfSGFzaHRh YmxlX2l0ZXJhdG9yX2Jhc2UmIF9feSkgbm9leGNlcHQKICAgICAgIHsgcmV0dXJuIF9feC5f TV9jdXIgIT0gX195Ll9NX2N1cjsgfQogI2VuZGlmCiAgICAgfTsKIAorICAvLy8gQmFzZSBj bGFzcyBmb3Igbm9kZSBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwg Ym9vbCBfQ2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcl9iYXNl CisgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X0hhc2hfbm9kZTxfVmFsdWUsIF9D YWNoZV9oYXNoX2NvZGU+Kj4KKyAgICB7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZSA9CisJ X0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9IYXNoX25vZGU8X1ZhbHVlLCBfQ2FjaGVfaGFz aF9jb2RlPio+OworICAgICAgdXNpbmcgX19ub2RlX3B0ciA9IHR5cGVuYW1lIF9fYmFzZV90 eXBlOjpfX25vZGVfcHRyOworICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBf X2Jhc2VfdHlwZTo6X19ub2RlX3B0cjsKKworICAgICAgX05vZGVfaXRlcmF0b3JfYmFzZSgp ID0gZGVmYXVsdDsKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yX2Jhc2UoX19ub2RlX3B0ciBfX3Ap IG5vZXhjZXB0CisgICAgICA6IF9fYmFzZV90eXBlKF9fcCkgeyB9CisgICAgfTsKKwogICAv Ly8gTm9kZSBpdGVyYXRvcnMsIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgaGFz aHRhYmxlLgogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jb25zdGFudF9p dGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KICAgICBzdHJ1Y3QgX05vZGVfaXRlcmF0b3IKQEAg LTQyNCw2ICs1MDgsNyBAQCBuYW1lc3BhY2UgX19kZXRhaWwKICAgICBwcml2YXRlOgogICAg ICAgdXNpbmcgX19iYXNlX3R5cGUgPSBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19j YWNoZT47CiAgICAgICB1c2luZyBfX25vZGVfdHlwZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBl OjpfX25vZGVfdHlwZTsKKyAgICAgIHVzaW5nIF9fbm9kZV9wdHIgPSB0eXBlbmFtZSBfX2Jh c2VfdHlwZTo6X19ub2RlX3B0cjsKIAogICAgIHB1YmxpYzoKICAgICAgIHVzaW5nIHZhbHVl X3R5cGUgPSBfVmFsdWU7CkBAIC00MzksNyArNTI0LDcgQEAgbmFtZXNwYWNlIF9fZGV0YWls CiAgICAgICBfTm9kZV9pdGVyYXRvcigpID0gZGVmYXVsdDsKIAogICAgICAgZXhwbGljaXQK LSAgICAgIF9Ob2RlX2l0ZXJhdG9yKF9fbm9kZV90eXBlKiBfX3ApIG5vZXhjZXB0CisgICAg ICBfTm9kZV9pdGVyYXRvcihfX25vZGVfcHRyIF9fcCkgbm9leGNlcHQKICAgICAgIDogX19i YXNlX3R5cGUoX19wKSB7IH0KIAogICAgICAgcmVmZXJlbmNlCkBAIC00NzQsNiArNTU5LDcg QEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAgICAgcHJpdmF0ZToKICAgICAgIHVzaW5nIF9fYmFz ZV90eXBlID0gX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+OwogICAgICAg dXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19ub2RlX3R5cGU7 CisgICAgICB1c2luZyBfX25vZGVfcHRyID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9fbm9k ZV9wdHI7CiAKICAgICBwdWJsaWM6CiAgICAgICB0eXBlZGVmIF9WYWx1ZQkJCQkJdmFsdWVf dHlwZTsKQEAgLTQ4Niw3ICs1NzIsNyBAQCBuYW1lc3BhY2UgX19kZXRhaWwKICAgICAgIF9O b2RlX2NvbnN0X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OwogCiAgICAgICBleHBsaWNpdAotICAg ICAgX05vZGVfY29uc3RfaXRlcmF0b3IoX19ub2RlX3R5cGUqIF9fcCkgbm9leGNlcHQKKyAg ICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yKF9fbm9kZV9wdHIgX19wKSBub2V4Y2VwdAogICAg ICAgOiBfX2Jhc2VfdHlwZShfX3ApIHsgfQogCiAgICAgICBfTm9kZV9jb25zdF9pdGVyYXRv cihjb25zdCBfTm9kZV9pdGVyYXRvcjxfVmFsdWUsIF9fY29uc3RhbnRfaXRlcmF0b3JzLApA QCAtNTE3LDYgKzYwMywxMTAgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAgICAgICB9CiAgICAg fTsKIAorICAvLy8gTm9kZSBpdGVyYXRvcnMsIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFs bCB0aGUgaGFzaHRhYmxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZVB0ciwgYm9vbCBf X2NvbnN0YW50X2l0ZXJhdG9ycz4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9pdGVyYXRvcgor ICAgIDogcHVibGljIF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfTm9kZVB0cj4KKyAgICB7 CisgICAgcHJpdmF0ZToKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX0hhc2h0YWJsZV9p dGVyYXRvcl9iYXNlPF9Ob2RlUHRyPjsKKyAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlw ZW5hbWUgX19iYXNlX3R5cGU6Ol9fbm9kZV90eXBlOworICAgICAgdXNpbmcgX19ub2RlX3B0 ciA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX25vZGVfcHRyOworCisgICAgcHVibGljOgor ICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX25vZGVfdHlwZTo6dmFsdWVfdHlwZQkJdmFsdWVf dHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19ub2RlX3R5cGU6OmRpZmZlcmVuY2Vf dHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVy YXRvcl90YWcJCQlpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgdXNpbmcgcG9pbnRlciA9 IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJ ICBjb25zdCB2YWx1ZV90eXBlKiwgdmFsdWVfdHlwZSo+Ojp0eXBlOworCisgICAgICB1c2lu ZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fY29uc3RhbnRfaXRl cmF0b3JzLAorCQkJCSAgY29uc3QgdmFsdWVfdHlwZSYsIHZhbHVlX3R5cGUmPjo6dHlwZTsK KworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgZXhw bGljaXQKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3IoX19ub2RlX3B0ciBfX3ApIG5vZXhj ZXB0CisgICAgICA6IF9fYmFzZV90eXBlKF9fcCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQor ICAgICAgb3BlcmF0b3IqKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMt Pl9NX2N1ci0+X01fdigpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4o KSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyLT5fTV92YWxw dHIoKTsgfQorCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3Ir KygpIG5vZXhjZXB0CisgICAgICB7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhp czsKKyAgICAgIH0KKworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcgorICAgICAgb3BlcmF0 b3IrKyhpbnQpIG5vZXhjZXB0CisgICAgICB7CisJX0hhc2h0YWJsZV9pdGVyYXRvciBfX3Rt cCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0K KyAgICB9OworCisgIC8vLyBOb2RlIGNvbnN0X2l0ZXJhdG9ycywgdXNlZCB0byBpdGVyYXRl IHRocm91Z2ggYWxsIHRoZSBoYXNodGFibGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2Rl UHRyLCBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzPgorICAgIHN0cnVjdCBfSGFzaHRhYmxl X2NvbnN0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNl PF9Ob2RlUHRyPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdXNpbmcgX19iYXNlX3R5 cGUgPSBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X05vZGVQdHI+OworICAgICAgdXNpbmcg X19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19ub2RlX3R5cGU7CisgICAg ICB1c2luZyBfX25vZGVfcHRyID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9fbm9kZV9wdHI7 CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbm9kZV90eXBlOjp2 YWx1ZV90eXBlCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX25vZGVf dHlwZTo6ZGlmZmVyZW5jZV90eXBlCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYg c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZwkJCWl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAg ICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqCQkJCXBvaW50ZXI7CisgICAgICB0eXBlZGVm IGNvbnN0IHZhbHVlX3R5cGUmCQkJCXJlZmVyZW5jZTsKKworICAgICAgX0hhc2h0YWJsZV9j b25zdF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9I YXNodGFibGVfY29uc3RfaXRlcmF0b3IoX19ub2RlX3B0ciBfX3ApIG5vZXhjZXB0CisgICAg ICA6IF9fYmFzZV90eXBlKF9fcCkgeyB9CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRl cmF0b3IoCisJY29uc3QgX0hhc2h0YWJsZV9pdGVyYXRvcjxfTm9kZVB0ciwKKwkJCQkgIF9f Y29uc3RhbnRfaXRlcmF0b3JzPiYgX194KSBub2V4Y2VwdAorICAgICAgOiBfX2Jhc2VfdHlw ZShfX3guX01fY3VyKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcioo KSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyLT5fTV92KCk7 IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IG5vZXhjZXB0 CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9jdXItPl9NX3ZhbHB0cigpOyB9CisKKyAgICAg IF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkgbm9leGNl cHQKKyAgICAgIHsKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuICp0aGlzOworICAgICAg fQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisr KGludCkgbm9leGNlcHQKKyAgICAgIHsKKwlfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yIF9f dG1wKCp0aGlzKTsKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuIF9fdG1wOworICAgICAg fQorICAgIH07CisKICAgLy8gTWFueSBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlJ3Mg dGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcG9saWN5CiAgIC8vIGNsYXNzZXMuICBUaGVzZSBh cmUgZGVmYXVsdHMgZm9yIHRoZSBwb2xpY2llcy4KIApAQCAtOTEyLDE2ICsxMTAyLDE2IEBA IG5hbWVzcGFjZSBfX2RldGFpbAogCiAgICAgICB1c2luZyBfX2hhc2hfY2FjaGVkID0gdHlw ZW5hbWUgX1RyYWl0czo6X19oYXNoX2NhY2hlZDsKICAgICAgIHVzaW5nIF9fY29uc3RhbnRf aXRlcmF0b3JzID0gdHlwZW5hbWUgX1RyYWl0czo6X19jb25zdGFudF9pdGVyYXRvcnM7Cisg ICAgICB1c2luZyBfX2FsbG9jX3B0ciA9IF9fYWxsb2NfdmFsX3B0cjxfQWxsb2MsIF9WYWx1 ZT47CiAKLSAgICAgIHVzaW5nIF9faGFzaHRhYmxlX2FsbG9jID0gX0hhc2h0YWJsZV9hbGxv YzwKLQlfX2FsbG9jX3JlYmluZDxfQWxsb2MsIF9IYXNoX25vZGU8X1ZhbHVlLAotCQkJCQkg IF9faGFzaF9jYWNoZWQ6OnZhbHVlPj4+OworICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSBf X2dldF9ub2RlX3R5cGU8X0FsbG9jLCBfVmFsdWUsIF9faGFzaF9jYWNoZWQ6OnZhbHVlPjsK KyAgICAgIHVzaW5nIF9fbm9kZV9wdHIgPSBfX3B0cl9yZWJpbmQ8X19hbGxvY19wdHIsIF9f bm9kZV90eXBlPjsKKyAgICAgIHVzaW5nIF9fbm9kZV9hbGxvY190eXBlID0gX19hbGxvY19y ZWJpbmQ8X0FsbG9jLCBfX25vZGVfdHlwZT47CiAKICAgICAgIHVzaW5nIHZhbHVlX3R5cGUg PSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjp2YWx1ZV90eXBlOwogICAgICAgdXNpbmcg c2l6ZV90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6c2l6ZV90eXBlOwogCiAg ICAgICB1c2luZyBfX3VuaXF1ZV9rZXlzID0gdHlwZW5hbWUgX1RyYWl0czo6X191bmlxdWVf a2V5czsKLSAgICAgIHVzaW5nIF9fbm9kZV9hbGxvY190eXBlID0gdHlwZW5hbWUgX19oYXNo dGFibGVfYWxsb2M6Ol9fbm9kZV9hbGxvY190eXBlOwogICAgICAgdXNpbmcgX19ub2RlX2dl bl90eXBlID0gX0FsbG9jTm9kZTxfX25vZGVfYWxsb2NfdHlwZT47CiAKICAgICAgIF9faGFz aHRhYmxlJgpAQCAtOTM5LDEyICsxMTI5LDE5IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogCQkJ Y29uc3QgX05vZGVHZXR0ZXImLCBmYWxzZV90eXBlIF9fdWtzKTsKIAogICAgIHB1YmxpYzoK LSAgICAgIHVzaW5nIGl0ZXJhdG9yID0gX05vZGVfaXRlcmF0b3I8X1ZhbHVlLCBfX2NvbnN0 YW50X2l0ZXJhdG9yczo6dmFsdWUsCi0JCQkJICAgICAgX19oYXNoX2NhY2hlZDo6dmFsdWU+ OwotCi0gICAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IF9Ob2RlX2NvbnN0X2l0ZXJhdG9y PF9WYWx1ZSwKLQkJCQkJCSAgX19jb25zdGFudF9pdGVyYXRvcnM6OnZhbHVlLAotCQkJCQkJ ICBfX2hhc2hfY2FjaGVkOjp2YWx1ZT47CisgICAgICB1c2luZyBpdGVyYXRvciA9CisJdHlw ZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX3BvaW50ZXI8X19hbGxvY19wdHI+Ojp2 YWx1ZSwKKwkgIF9Ob2RlX2l0ZXJhdG9yPF9WYWx1ZSwKKwkJCSBfX2NvbnN0YW50X2l0ZXJh dG9yczo6dmFsdWUsIF9faGFzaF9jYWNoZWQ6OnZhbHVlPiwKKwkgIF9IYXNodGFibGVfaXRl cmF0b3I8X19ub2RlX3B0ciwKKwkJCSAgICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzOjp2YWx1 ZT4+Ojp0eXBlOworCisgICAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9CisJdHlwZW5hbWUg c3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX3BvaW50ZXI8X19hbGxvY19wdHI+Ojp2YWx1ZSwK KwkgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yPF9WYWx1ZSwKKwkJCSAgICAgX19jb25zdGFudF9p dGVyYXRvcnM6OnZhbHVlLCBfX2hhc2hfY2FjaGVkOjp2YWx1ZT4sCisJICBfSGFzaHRhYmxl X2NvbnN0X2l0ZXJhdG9yPF9fbm9kZV9wdHIsCisJCQkJICAgIF9fY29uc3RhbnRfaXRlcmF0 b3JzOjp2YWx1ZT4+Ojp0eXBlOwogCiAgICAgICB1c2luZyBfX2lyZXR1cm5fdHlwZSA9IF9f Y29uZGl0aW9uYWxfdDxfX3VuaXF1ZV9rZXlzOjp2YWx1ZSwKIAkJCQkJICAgICBzdGQ6OnBh aXI8aXRlcmF0b3IsIGJvb2w+LApAQCAtMTI4MCw2ICsxNDc3LDE3IEBAIG5hbWVzcGFjZSBf X2RldGFpbAogCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CiAgICAgc3RydWN0IF9Mb2Nh bF9pdGVyYXRvcl9iYXNlOwogCisgIC8qKgorICAgKiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0 ZSBfSGFzaHRhYmxlX2xvY2FsX2l0ZXJfYmFzZS4KKyAgICoKKyAgICogIEJhc2UgY2xhc3Mg Zm9yIGxvY2FsIGl0ZXJhdG9ycywgdXNlZCB0byBpdGVyYXRlIHdpdGhpbiBhIGJ1Y2tldAor ICAgKiAgYnV0IG5vdCBiZXR3ZWVuIGJ1Y2tldHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBl bmFtZSBfS2V5LCB0eXBlbmFtZSBfTm9kZVB0ciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJ ICAgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SYW5nZUhhc2gsIHR5cGVuYW1lIF9VbnVz ZWQsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJs ZV9sb2NhbF9pdGVyX2Jhc2U7CisKICAgLyoqCiAgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBs YXRlIF9IYXNoX2NvZGVfYmFzZS4KICAgICoKQEAgLTE0NDAsNiArMTY0OCw0OSBAQCBuYW1l c3BhY2UgX19kZXRhaWwKICAgICAgIF9NX2dldF9idWNrZXQoKSBjb25zdCB7IHJldHVybiBf TV9idWNrZXQ7IH0gIC8vIGZvciBkZWJ1ZyBtb2RlCiAgICAgfTsKIAorICAvLy8gUGFydGlh bCBzcGVjaWFsaXphdGlvbiB1c2VkIHdoZW4gbm9kZXMgY29udGFpbiBhIGNhY2hlZCBoYXNo IGNvZGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Ob2RlUHRyLCB0 eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1Jh bmdlSGFzaCwgdHlwZW5hbWUgX1VudXNlZD4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9sb2Nh bF9pdGVyX2Jhc2U8X0tleSwgX05vZGVQdHIsIF9FeHRyYWN0S2V5LAorCQkJCSAgICAgIF9I YXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCB0cnVlPgorICAgIDogcHVibGljIF9IYXNodGFi bGVfaXRlcmF0b3JfYmFzZTxfTm9kZVB0cj4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAg ICAgdXNpbmcgX19iYXNlX25vZGVfaXRlciA9IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxf Tm9kZVB0cj47CisgICAgICB1c2luZyBfX25vZGVfcHRyID0gdHlwZW5hbWUgX19iYXNlX25v ZGVfaXRlcjo6X19ub2RlX3B0cjsKKyAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5h bWUgX19iYXNlX25vZGVfaXRlcjo6X19ub2RlX3R5cGU7CisgICAgICB1c2luZyB2YWx1ZV90 eXBlID0gdHlwZW5hbWUgX19ub2RlX3R5cGU6OnZhbHVlX3R5cGU7CisgICAgICB1c2luZyBf X2hhc2hfY29kZV9iYXNlID0gX0hhc2hfY29kZV9iYXNlPF9LZXksIHZhbHVlX3R5cGUsIF9F eHRyYWN0S2V5LAorCQkJCQkgICAgICBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNlZCwgdHJ1 ZT47CisKKyAgICAgIF9IYXNodGFibGVfbG9jYWxfaXRlcl9iYXNlKCkgPSBkZWZhdWx0Owor ICAgICAgX0hhc2h0YWJsZV9sb2NhbF9pdGVyX2Jhc2UoY29uc3QgX19oYXNoX2NvZGVfYmFz ZSYsCisJCQkJIF9fbm9kZV9wdHIgX19wLAorCQkJCSBzdGQ6OnNpemVfdCBfX2JrdCwgc3Rk OjpzaXplX3QgX19ia3RfY291bnQpCisgICAgICA6IF9fYmFzZV9ub2RlX2l0ZXIoX19wKSwg X01fYnVja2V0KF9fYmt0KSwgX01fYnVja2V0X2NvdW50KF9fYmt0X2NvdW50KQorICAgICAg eyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IoKQorICAgICAgeworCV9fYmFzZV9u b2RlX2l0ZXI6Ol9NX2luY3IoKTsKKwlpZiAodGhpcy0+X01fY3VyKQorCSAgeworCSAgICBz dGQ6OnNpemVfdCBfX2JrdAorCSAgICAgID0gX1JhbmdlSGFzaHt9KHRoaXMtPl9NX2N1ci0+ X01faGFzaF9jb2RlLCBfTV9idWNrZXRfY291bnQpOworCSAgICBpZiAoX19ia3QgIT0gX01f YnVja2V0KQorCSAgICAgIHRoaXMtPl9NX2N1ciA9IG51bGxwdHI7CisJICB9CisgICAgICB9 CisKKyAgICAgIHN0ZDo6c2l6ZV90IF9NX2J1Y2tldDsKKyAgICAgIHN0ZDo6c2l6ZV90IF9N X2J1Y2tldF9jb3VudDsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAg ICBfTV9nZXRfYnVja2V0KCkgY29uc3QgeyByZXR1cm4gX01fYnVja2V0OyB9ICAvLyBmb3Ig ZGVidWcgbW9kZQorICAgIH07CisKICAgLy8gVW5pbml0aWFsaXplZCBzdG9yYWdlIGZvciBh IF9IYXNoX2NvZGVfYmFzZS4KICAgLy8gVGhpcyB0eXBlIGlzIERlZmF1bHRDb25zdHJ1Y3Rp YmxlIGFuZCBBc3NpZ25hYmxlIGV2ZW4gaWYgdGhlCiAgIC8vIF9IYXNoX2NvZGVfYmFzZSB0 eXBlIGlzbid0LCBzbyB0aGF0IF9Mb2NhbF9pdGVyYXRvcl9iYXNlPC4uLiwgZmFsc2U+CkBA IC0xNTU0LDYgKzE4MDUsODYgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAgICAgICBfTV9nZXRf YnVja2V0KCkgY29uc3QgeyByZXR1cm4gX01fYnVja2V0OyB9ICAvLyBmb3IgZGVidWcgbW9k ZQogICAgIH07CiAKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiB1c2VkIHdoZW4gaGFz aCBjb2RlcyBhcmUgbm90IGNhY2hlZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBl bmFtZSBfTm9kZVB0ciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0hh c2gsIHR5cGVuYW1lIF9SYW5nZUhhc2gsIHR5cGVuYW1lIF9VbnVzZWQ+CisgICAgc3RydWN0 IF9IYXNodGFibGVfbG9jYWxfaXRlcl9iYXNlPF9LZXksIF9Ob2RlUHRyLCBfRXh0cmFjdEtl eSwKKwkJCQkgICAgICBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNlZCwgZmFsc2U+CisgICAg OiBfSGFzaF9jb2RlX3N0b3JhZ2U8X0hhc2g+CisgICAgLCBfSGFzaHRhYmxlX2l0ZXJhdG9y X2Jhc2U8X05vZGVQdHI+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHVzaW5nIF9f bm9kZV9pdGVyX2Jhc2UgPSBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X05vZGVQdHI+Owor ICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX25vZGVfaXRlcl9iYXNlOjpf X25vZGVfdHlwZTsKKyAgICAgIHVzaW5nIF9fbm9kZV9wdHIgPSB0eXBlbmFtZSBfX25vZGVf aXRlcl9iYXNlOjpfX25vZGVfcHRyOworICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVu YW1lIF9fbm9kZV90eXBlOjp2YWx1ZV90eXBlOworICAgICAgdXNpbmcgX19oYXNoX2NvZGVf YmFzZSA9IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCB2YWx1ZV90eXBlLCBfRXh0cmFjdEtleSwK KwkJCQkJICAgICBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNlZCwgZmFsc2U+OworCisgICAg ICBfSGFzaHRhYmxlX2xvY2FsX2l0ZXJfYmFzZSgpIDogX01fYnVja2V0X2NvdW50KC0xKSB7 IH0KKworICAgICAgX0hhc2h0YWJsZV9sb2NhbF9pdGVyX2Jhc2UoY29uc3QgX19oYXNoX2Nv ZGVfYmFzZSYgX19iYXNlLAorCQkJCSBfX25vZGVfcHRyIF9fcCwKKwkJCQkgc3RkOjpzaXpl X3QgX19ia3QsIHN0ZDo6c2l6ZV90IF9fYmt0X2NvdW50KQorICAgICAgOiBfX25vZGVfaXRl cl9iYXNlKF9fcCksIF9NX2J1Y2tldChfX2JrdCksIF9NX2J1Y2tldF9jb3VudChfX2JrdF9j b3VudCkKKyAgICAgIHsgX01faW5pdChfX2Jhc2UuaGFzaF9mdW5jdGlvbigpKTsgfQorCisg ICAgICB+X0hhc2h0YWJsZV9sb2NhbF9pdGVyX2Jhc2UoKQorICAgICAgeworCWlmIChfTV9i dWNrZXRfY291bnQgIT0gLTEpCisJICBfTV9kZXN0cm95KCk7CisgICAgICB9CisKKyAgICAg IF9IYXNodGFibGVfbG9jYWxfaXRlcl9iYXNlKGNvbnN0IF9IYXNodGFibGVfbG9jYWxfaXRl cl9iYXNlJiBfX2l0ZXIpCisgICAgICA6IF9fbm9kZV9pdGVyX2Jhc2UoX19pdGVyLl9NX2N1 ciksIF9NX2J1Y2tldChfX2l0ZXIuX01fYnVja2V0KQorICAgICAgLCBfTV9idWNrZXRfY291 bnQoX19pdGVyLl9NX2J1Y2tldF9jb3VudCkKKyAgICAgIHsKKwlpZiAoX01fYnVja2V0X2Nv dW50ICE9IC0xKQorCSAgX01faW5pdCgqX19pdGVyLl9NX2goKSk7CisgICAgICB9CisKKyAg ICAgIF9IYXNodGFibGVfbG9jYWxfaXRlcl9iYXNlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0 IF9IYXNodGFibGVfbG9jYWxfaXRlcl9iYXNlJiBfX2l0ZXIpCisgICAgICB7CisJaWYgKF9N X2J1Y2tldF9jb3VudCAhPSAtMSkKKwkgIF9NX2Rlc3Ryb3koKTsKKwl0aGlzLT5fTV9jdXIg PSBfX2l0ZXIuX01fY3VyOworCV9NX2J1Y2tldCA9IF9faXRlci5fTV9idWNrZXQ7CisJX01f YnVja2V0X2NvdW50ID0gX19pdGVyLl9NX2J1Y2tldF9jb3VudDsKKwlpZiAoX01fYnVja2V0 X2NvdW50ICE9IC0xKQorCSAgX01faW5pdCgqX19pdGVyLl9NX2goKSk7CisJcmV0dXJuICp0 aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyKCkKKyAgICAgIHsK KwlfX25vZGVfaXRlcl9iYXNlOjpfTV9pbmNyKCk7CisJaWYgKHRoaXMtPl9NX2N1cikKKwkg IHsKKwkgICAgc3RkOjpzaXplX3QgX19ia3QgPQorCSAgICAgIF9SYW5nZUhhc2h7fSgoKnRo aXMtPl9NX2goKSkoX0V4dHJhY3RLZXl7fSh0aGlzLT5fTV9jdXItPl9NX3YoKSkpLAorCQkJ ICAgX01fYnVja2V0X2NvdW50KTsKKwkgICAgaWYgKF9fYmt0ICE9IF9NX2J1Y2tldCkKKwkg ICAgICB0aGlzLT5fTV9jdXIgPSBudWxscHRyOworCSAgfQorICAgICAgfQorCisgICAgICBz dGQ6OnNpemVfdCBfTV9idWNrZXQ7CisgICAgICBzdGQ6OnNpemVfdCBfTV9idWNrZXRfY291 bnQ7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXQoY29uc3QgX0hhc2gmIF9faCkKKyAg ICAgIHsgOjpuZXcodGhpcy0+X01faCgpKSBfSGFzaChfX2gpOyB9CisKKyAgICAgIHZvaWQK KyAgICAgIF9NX2Rlc3Ryb3koKSB7IHRoaXMtPl9NX2goKS0+fl9IYXNoKCk7IH0KKworICAg IHB1YmxpYzoKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9nZXRfYnVja2V0KCkgY29u c3QgeyByZXR1cm4gX01fYnVja2V0OyB9ICAvLyBmb3IgZGVidWcgbW9kZQorICAgIH07CisK ICAgLy8vIGxvY2FsIGl0ZXJhdG9ycwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBl bmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAogCSAgIHR5cGVuYW1lIF9IYXNo LCB0eXBlbmFtZSBfUmFuZ2VIYXNoLCB0eXBlbmFtZSBfVW51c2VkLApAQCAtMTY2Nyw2ICsx OTk4LDE1NiBAQCBuYW1lc3BhY2UgX19kZXRhaWwKICAgICAgIH0KICAgICB9OwogCisgIC8v LyBsb2NhbCBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUg X05vZGVQdHIsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IYXNoLCB0 eXBlbmFtZSBfUmFuZ2VIYXNoLCB0eXBlbmFtZSBfVW51c2VkLAorCSAgIGJvb2wgX19jb25z dGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9s b2NhbF9pdGVyYXRvcgorICAgIDogcHVibGljIF9IYXNodGFibGVfbG9jYWxfaXRlcl9iYXNl PF9LZXksIF9Ob2RlUHRyLCBfRXh0cmFjdEtleSwKKwkJCQkJX0hhc2gsIF9SYW5nZUhhc2gs IF9VbnVzZWQsIF9fY2FjaGU+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB1c2luZyBf X2Jhc2VfdHlwZSA9CisJX0hhc2h0YWJsZV9sb2NhbF9pdGVyX2Jhc2U8X0tleSwgX05vZGVQ dHIsIF9FeHRyYWN0S2V5LAorCQkJCSAgIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBf X2NhY2hlPjsKKyAgICAgIHVzaW5nIF9faGFzaF9jb2RlX2Jhc2UgPSB0eXBlbmFtZSBfX2Jh c2VfdHlwZTo6X19oYXNoX2NvZGVfYmFzZTsKKyAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0g dHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9fbm9kZV90eXBlOworICAgICAgdXNpbmcgX19ub2Rl X3B0ciA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX25vZGVfcHRyOworCisgICAgcHVibGlj OgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6dmFsdWVfdHlwZQkJdmFs dWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxfX2Nv bnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJY29uc3QgdmFsdWVfdHlwZSosIHZhbHVlX3R5cGUq Pjo6dHlwZQorCQkJCQkJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6 Y29uZGl0aW9uYWw8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCWNvbnN0IHZhbHVlX3R5 cGUmLCB2YWx1ZV90eXBlJj46OnR5cGUKKwkJCQkJCQlyZWZlcmVuY2U7CisgICAgICB0eXBl ZGVmIHR5cGVuYW1lIF9fbm9kZV90eXBlOjpkaWZmZXJlbmNlX3R5cGUJZGlmZmVyZW5jZV90 eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnCQkJaXRlcmF0 b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9IYXNodGFibGVfbG9jYWxfaXRlcmF0b3IoKSA9IGRl ZmF1bHQ7CisKKyAgICAgIF9IYXNodGFibGVfbG9jYWxfaXRlcmF0b3IoY29uc3QgX19oYXNo X2NvZGVfYmFzZSYgX19iYXNlLAorCQkJCV9fbm9kZV9wdHIgX19uLAorCQkJCXN0ZDo6c2l6 ZV90IF9fYmt0LCBzdGQ6OnNpemVfdCBfX2JrdF9jb3VudCkKKyAgICAgIDogX19iYXNlX3R5 cGUoX19iYXNlLCBfX24sIF9fYmt0LCBfX2JrdF9jb3VudCkKKyAgICAgIHsgfQorCisgICAg ICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiB0 aGlzLT5fTV9jdXItPl9NX3YoKTsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRv ci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdmFscHRyKCk7 IH0KKworICAgICAgX0hhc2h0YWJsZV9sb2NhbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9y KysoKQorICAgICAgeworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAg ICB9CisKKyAgICAgIF9IYXNodGFibGVfbG9jYWxfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9y KysoaW50KQorICAgICAgeworCV9IYXNodGFibGVfbG9jYWxfaXRlcmF0b3IgX190bXAoKnRo aXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAg fTsKKworICAvLy8gbG9jYWwgY29uc3RfaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1l IF9LZXksIHR5cGVuYW1lIF9Ob2RlUHRyLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0 eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JhbmdlSGFzaCwgdHlwZW5hbWUgX1VudXNlZCwK KwkgICBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLCBib29sIF9fY2FjaGU+CisgICAgc3Ry dWN0IF9IYXNodGFibGVfY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfSGFz aHRhYmxlX2xvY2FsX2l0ZXJfYmFzZTxfS2V5LCBfTm9kZVB0ciwgX0V4dHJhY3RLZXksCisJ CQkJCV9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBfX2NhY2hlPgorICAgIHsKKyAgICBw cml2YXRlOgorICAgICAgdXNpbmcgX19iYXNlX3R5cGUgPQorCV9IYXNodGFibGVfbG9jYWxf aXRlcl9iYXNlPF9LZXksIF9Ob2RlUHRyLCBfRXh0cmFjdEtleSwKKwkJCQkgICBfSGFzaCwg X1JhbmdlSGFzaCwgX1VudXNlZCwgX19jYWNoZT47CisgICAgICB1c2luZyBfX2hhc2hfY29k ZV9iYXNlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faGFzaF9jb2RlX2Jhc2U7CisgICAg ICB1c2luZyBfX25vZGVfdHlwZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX25vZGVfdHlw ZTsKKyAgICAgIHVzaW5nIF9fbm9kZV9wdHIgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19u b2RlX3B0cjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19iYXNl X3R5cGU6OnZhbHVlX3R5cGUJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IHZh bHVlX3R5cGUqCQkJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUm CQkJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19ub2RlX3R5cGU6OmRp ZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9y d2FyZF9pdGVyYXRvcl90YWcJCQlpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX0hhc2h0 YWJsZV9jb25zdF9sb2NhbF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgX0hhc2h0 YWJsZV9jb25zdF9sb2NhbF9pdGVyYXRvcihjb25zdCBfX2hhc2hfY29kZV9iYXNlJiBfX2Jh c2UsCisJCQkJICAgICAgX19ub2RlX3B0ciBfX24sCisJCQkJICAgIHN0ZDo6c2l6ZV90IF9f Ymt0LCBzdGQ6OnNpemVfdCBfX2JrdF9jb3VudCkKKyAgICAgIDogX19iYXNlX3R5cGUoX19i YXNlLCBfX24sIF9fYmt0LCBfX2JrdF9jb3VudCkKKyAgICAgIHsgfQorCisgICAgICBfSGFz aHRhYmxlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yKGNvbnN0IF9IYXNodGFibGVfbG9jYWxfaXRl cmF0b3I8CisJCQkJICAgICAgX0tleSwgX05vZGVQdHIsIF9FeHRyYWN0S2V5LAorCQkJCSAg ICAgIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLAorCQkJCSAgICAgIF9fY29uc3RhbnRf aXRlcmF0b3JzLAorCQkJCSAgICAgIF9fY2FjaGU+JiBfX3gpCisgICAgICA6IF9fYmFzZV90 eXBlKF9feCkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9y KigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9jdXItPl9NX3YoKTsgfQorCisg ICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJu IHRoaXMtPl9NX2N1ci0+X01fdmFscHRyKCk7IH0KKworICAgICAgX0hhc2h0YWJsZV9jb25z dF9sb2NhbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRoaXMt Pl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9IYXNodGFi bGVfY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAg eworCV9IYXNodGFibGVfY29uc3RfbG9jYWxfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRo aXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICB0 ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZVB0ciwgdHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1Zh bHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0 eXBlbmFtZSBfUmFuZ2VIYXNoLCB0eXBlbmFtZSBfVW51c2VkLAorCSAgIGJvb2wgX19jb25z dGFudF9pdGVyYXRvcnMsIGJvb2wgX19oYXNoX2NhY2hlZD4KKyAgICB1c2luZyBfX2xvY2Fs X2l0ZXJhdG9yID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKKyAgICAgIHN0ZDo6aXNf cG9pbnRlcjxfTm9kZVB0cj46OnZhbHVlLAorICAgICAgX0xvY2FsX2l0ZXJhdG9yPF9LZXks IF9WYWx1ZSwKKwkJICAgICAgX0V4dHJhY3RLZXksIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51 c2VkLAorCQkgICAgICBfX2NvbnN0YW50X2l0ZXJhdG9ycywgX19oYXNoX2NhY2hlZD4sCisg ICAgICBfSGFzaHRhYmxlX2xvY2FsX2l0ZXJhdG9yPF9LZXksIF9Ob2RlUHRyLAorCQkJCV9F eHRyYWN0S2V5LCBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNlZCwKKwkJCQlfX2NvbnN0YW50 X2l0ZXJhdG9ycywKKwkJCQlfX2hhc2hfY2FjaGVkPj46OnR5cGU7CisKKyAgdGVtcGxhdGU8 dHlwZW5hbWUgX05vZGVQdHIsIHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkg ICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUg X1JhbmdlSGFzaCwgdHlwZW5hbWUgX1VudXNlZCwKKwkgICBib29sIF9fY29uc3RhbnRfaXRl cmF0b3JzLCBib29sIF9faGFzaF9jYWNoZWQ+CisgICAgdXNpbmcgX19jb25zdF9sb2NhbF9p dGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICBzdGQ6OmlzX3Bv aW50ZXI8X05vZGVQdHI+Ojp2YWx1ZSwKKyAgICAgIF9Mb2NhbF9jb25zdF9pdGVyYXRvcjxf S2V5LCBfVmFsdWUsCisJCQkgICAgX0V4dHJhY3RLZXksIF9IYXNoLCBfUmFuZ2VIYXNoLCBf VW51c2VkLAorCQkJICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzLCBfX2hhc2hfY2FjaGVkPiwK KyAgICAgIF9IYXNodGFibGVfY29uc3RfbG9jYWxfaXRlcmF0b3I8X0tleSwgX05vZGVQdHIs CisJCQkJICAgICAgX0V4dHJhY3RLZXksIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLAor CQkJCSAgICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCSAgICAgIF9faGFzaF9jYWNo ZWQ+Pjo6dHlwZTsKKwogICAvKioKICAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgX0hh c2h0YWJsZV9iYXNlLgogICAgKgpAQCAtMTk0MywxMCArMjQyNCwxNiBAQCBuYW1lc3BhY2Ug X19kZXRhaWwKICAgICAgIHVzaW5nIF9fZWJvX25vZGVfYWxsb2MgPSBfSGFzaHRhYmxlX2Vi b19oZWxwZXI8MCwgX05vZGVBbGxvYz47CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPgot CXN0cnVjdCBfX2dldF92YWx1ZV90eXBlOworCXN0cnVjdCBfX2dldF9ub2RlX2Jhc2U7CiAg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+Ci0J c3RydWN0IF9fZ2V0X3ZhbHVlX3R5cGU8X0hhc2hfbm9kZTxfVmFsLCBfQ2FjaGVfaGFzaF9j b2RlPj4KLQl7IHVzaW5nIHR5cGUgPSBfVmFsOyB9OworCXN0cnVjdCBfX2dldF9ub2RlX2Jh c2U8X0hhc2hfbm9kZTxfVmFsLCBfQ2FjaGVfaGFzaF9jb2RlPj4KKwl7IHVzaW5nIHR5cGUg PSBfSGFzaF9ub2RlX2Jhc2U7IH07CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVQ dHIsIGJvb2wgX0NhY2hlX2hhc2hfY29kZT4KKwlzdHJ1Y3QgX19nZXRfbm9kZV9iYXNlPF9I YXNoX3Bub2RlPF9WYWx1ZVB0ciwgX0NhY2hlX2hhc2hfY29kZT4+CisJeworCSAgdXNpbmcg dHlwZSA9IF9IYXNoX3Bub2RlX2Jhc2U8X19wdHJfcmViaW5kPAorCQkJX1ZhbHVlUHRyLCBf SGFzaF9wbm9kZTxfVmFsdWVQdHIsIF9DYWNoZV9oYXNoX2NvZGU+Pj47CisJfTsKIAogICAg IHB1YmxpYzoKICAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5hbWUgX05vZGVBbGxv Yzo6dmFsdWVfdHlwZTsKQEAgLTE5NTQsMTYgKzI0NDEsMTMgQEAgbmFtZXNwYWNlIF9fZGV0 YWlsCiAgICAgICAvLyBVc2UgX19nbnVfY3h4IHRvIGJlbmVmaXQgZnJvbSBfU19hbHdheXNf ZXF1YWwgYW5kIGFsLgogICAgICAgdXNpbmcgX19ub2RlX2FsbG9jX3RyYWl0cyA9IF9fZ251 X2N4eDo6X19hbGxvY190cmFpdHM8X19ub2RlX2FsbG9jX3R5cGU+OwogCi0gICAgICB1c2lu ZyBfX3ZhbHVlX2FsbG9jX3RyYWl0cyA9IHR5cGVuYW1lIF9fbm9kZV9hbGxvY190cmFpdHM6 OnRlbXBsYXRlCi0JcmViaW5kX3RyYWl0czx0eXBlbmFtZSBfX2dldF92YWx1ZV90eXBlPF9f bm9kZV90eXBlPjo6dHlwZT47Ci0KLSAgICAgIHVzaW5nIF9fbm9kZV9wdHIgPSBfX25vZGVf dHlwZSo7Ci0gICAgICB1c2luZyBfX25vZGVfYmFzZSA9IF9IYXNoX25vZGVfYmFzZTsKLSAg ICAgIHVzaW5nIF9fbm9kZV9iYXNlX3B0ciA9IF9fbm9kZV9iYXNlKjsKKyAgICAgIHVzaW5n IF9fbm9kZV9wdHIgPSB0eXBlbmFtZSBfX25vZGVfYWxsb2NfdHJhaXRzOjpwb2ludGVyOwor ICAgICAgdXNpbmcgX19ub2RlX2Jhc2UgPSB0eXBlbmFtZSBfX2dldF9ub2RlX2Jhc2U8X19u b2RlX3R5cGU+Ojp0eXBlOworICAgICAgdXNpbmcgX19ub2RlX2Jhc2VfcHRyID0gX19wdHJf cmViaW5kPF9fbm9kZV9wdHIsIF9fbm9kZV9iYXNlPjsKICAgICAgIHVzaW5nIF9fYnVja2V0 c19hbGxvY190eXBlID0KIAlfX2FsbG9jX3JlYmluZDxfX25vZGVfYWxsb2NfdHlwZSwgX19u b2RlX2Jhc2VfcHRyPjsKICAgICAgIHVzaW5nIF9fYnVja2V0c19hbGxvY190cmFpdHMgPSBz dGQ6OmFsbG9jYXRvcl90cmFpdHM8X19idWNrZXRzX2FsbG9jX3R5cGU+OwotICAgICAgdXNp bmcgX19idWNrZXRzX3B0ciA9IF9fbm9kZV9iYXNlX3B0cio7CisgICAgICB1c2luZyBfX2J1 Y2tldHNfcHRyID0gdHlwZW5hbWUgX19idWNrZXRzX2FsbG9jX3RyYWl0czo6cG9pbnRlcjsK IAogICAgICAgX0hhc2h0YWJsZV9hbGxvYygpID0gZGVmYXVsdDsKICAgICAgIF9IYXNodGFi bGVfYWxsb2MoY29uc3QgX0hhc2h0YWJsZV9hbGxvYyYpID0gZGVmYXVsdDsKQEAgLTIwMTcs MTcgKzI1MDEsMTYgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAgICAgICB7CiAJYXV0byYgX19h bGxvYyA9IF9NX25vZGVfYWxsb2NhdG9yKCk7CiAJYXV0byBfX25wdHIgPSBfX25vZGVfYWxs b2NfdHJhaXRzOjphbGxvY2F0ZShfX2FsbG9jLCAxKTsKLQlfX25vZGVfcHRyIF9fbiA9IHN0 ZDo6X190b19hZGRyZXNzKF9fbnB0cik7CiAJX190cnkKIAkgIHsKLQkgICAgOjpuZXcgKCh2 b2lkKilfX24pIF9fbm9kZV90eXBlOwotCSAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25z dHJ1Y3QoX19hbGxvYywgX19uLT5fTV92YWxwdHIoKSwKKwkgICAgX19ub2RlX2FsbG9jX3Ry YWl0czo6Y29uc3RydWN0KF9fYWxsb2MsIHN0ZDo6X190b19hZGRyZXNzKF9fbnB0cikpOwor CSAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX19hbGxvYywgX19ucHRyLT5f TV92YWxwdHIoKSwKIAkJCQkJICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsK LQkgICAgcmV0dXJuIF9fbjsKKwkgICAgcmV0dXJuIF9fbnB0cjsKIAkgIH0KIAlfX2NhdGNo KC4uLikKIAkgIHsKLQkgICAgX19uLT5+X19ub2RlX3R5cGUoKTsKKwkgICAgX19ub2RlX2Fs bG9jX3RyYWl0czo6ZGVzdHJveShfX2FsbG9jLCBzdGQ6Ol9fdG9fYWRkcmVzcyhfX25wdHIp KTsKIAkgICAgX19ub2RlX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2FsbG9jLCBfX25w dHIsIDEpOwogCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKIAkgIH0KQEAgLTIwNDUs MTAgKzI1MjgsOSBAQCBuYW1lc3BhY2UgX19kZXRhaWwKICAgICB2b2lkCiAgICAgX0hhc2h0 YWJsZV9hbGxvYzxfTm9kZUFsbG9jPjo6X01fZGVhbGxvY2F0ZV9ub2RlX3B0cihfX25vZGVf cHRyIF9fbikKICAgICB7Ci0gICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbm9kZV9hbGxvY190 cmFpdHM6OnBvaW50ZXIgX1B0cjsKLSAgICAgIGF1dG8gX19wdHIgPSBzdGQ6OnBvaW50ZXJf dHJhaXRzPF9QdHI+Ojpwb2ludGVyX3RvKCpfX24pOwotICAgICAgX19uLT5+X19ub2RlX3R5 cGUoKTsKLSAgICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX01fbm9kZV9h bGxvY2F0b3IoKSwgX19wdHIsIDEpOworICAgICAgYXV0byYgX19hbGxvYyA9IF9NX25vZGVf YWxsb2NhdG9yKCk7CisgICAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpkZXN0cm95KF9fYWxs b2MsIHN0ZDo6X190b19hZGRyZXNzKF9fbikpOworICAgICAgX19ub2RlX2FsbG9jX3RyYWl0 czo6ZGVhbGxvY2F0ZShfX2FsbG9jLCBfX24sIDEpOwogICAgIH0KIAogICB0ZW1wbGF0ZTx0 eXBlbmFtZSBfTm9kZUFsbG9jPgpAQCAtMjA2OSwxMSArMjU1MSw5IEBAIG5hbWVzcGFjZSBf X2RldGFpbAogICAgIC0+IF9fYnVja2V0c19wdHIKICAgICB7CiAgICAgICBfX2J1Y2tldHNf YWxsb2NfdHlwZSBfX2FsbG9jKF9NX25vZGVfYWxsb2NhdG9yKCkpOwotCiAgICAgICBhdXRv IF9fcHRyID0gX19idWNrZXRzX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19hbGxvYywgX19i a3RfY291bnQpOwotICAgICAgX19idWNrZXRzX3B0ciBfX3AgPSBzdGQ6Ol9fdG9fYWRkcmVz cyhfX3B0cik7Ci0gICAgICBfX2J1aWx0aW5fbWVtc2V0KF9fcCwgMCwgX19ia3RfY291bnQg KiBzaXplb2YoX19ub2RlX2Jhc2VfcHRyKSk7Ci0gICAgICByZXR1cm4gX19wOworICAgICAg c3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uKF9fcHRyLCBfX2JrdF9jb3VudCk7Cisg ICAgICByZXR1cm4gX19wdHI7CiAgICAgfQogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2Rl QWxsb2M+CkBAIC0yMDgyLDEwICsyNTYyLDkgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAgICAg X01fZGVhbGxvY2F0ZV9idWNrZXRzKF9fYnVja2V0c19wdHIgX19ia3RzLAogCQkJICBzdGQ6 OnNpemVfdCBfX2JrdF9jb3VudCkKICAgICB7Ci0gICAgICB0eXBlZGVmIHR5cGVuYW1lIF9f YnVja2V0c19hbGxvY190cmFpdHM6OnBvaW50ZXIgX1B0cjsKLSAgICAgIGF1dG8gX19wdHIg PSBzdGQ6OnBvaW50ZXJfdHJhaXRzPF9QdHI+Ojpwb2ludGVyX3RvKCpfX2JrdHMpOwogICAg ICAgX19idWNrZXRzX2FsbG9jX3R5cGUgX19hbGxvYyhfTV9ub2RlX2FsbG9jYXRvcigpKTsK LSAgICAgIF9fYnVja2V0c19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hbGxvYywgX19w dHIsIF9fYmt0X2NvdW50KTsKKyAgICAgIHN0ZDo6X0Rlc3Ryb3lfbihfX2JrdHMsIF9fYmt0 X2NvdW50KTsKKyAgICAgIF9fYnVja2V0c19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19h bGxvYywgX19ia3RzLCBfX2JrdF9jb3VudCk7CiAgICAgfQogCiAgLy8vQH0gaGFzaHRhYmxl LWRldGFpbApkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWlu ZXJzL3Vub3JkZXJlZF9tYXAvYWxsb2NhdG9yL2V4dF9wdHIuY2MgYi9saWJzdGRjKystdjMv dGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX21hcC9hbGxvY2F0b3IvZXh0X3B0 ci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNWE3MDk2YTUx ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRh aW5lcnMvdW5vcmRlcmVkX21hcC9hbGxvY2F0b3IvZXh0X3B0ci5jYwpAQCAtMCwwICsxLDQw IEBACisvLyB7IGRnLWRvIHJ1biB7IHRhcmdldCBjKysxMSB9IH0KKworI2luY2x1ZGUgPHVu b3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRlc3RzdWl0ZV9o b29rcy5oPgorI2luY2x1ZGUgPHRlc3RzdWl0ZV9hbGxvY2F0b3IuaD4KKworc3RydWN0IFQg eyBpbnQgaTsgfTsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQmIGwsIGNvbnN0IFQmIHIp Cit7IHJldHVybiBsLmkgPT0gci5pOyB9CisKK3N0cnVjdCBICit7CisgIHN0ZDo6c2l6ZV90 CisgIG9wZXJhdG9yKCkoY29uc3QgVCYgdCkgY29uc3Qgbm9leGNlcHQKKyAgeyByZXR1cm4g dC5pOyB9Cit9OworCitzdHJ1Y3QgRSA6IHN0ZDo6ZXF1YWxfdG88VD4KK3sgfTsKKwordXNp bmcgX19nbnVfdGVzdDo6Q3VzdG9tUG9pbnRlckFsbG9jOworCit0ZW1wbGF0ZSBjbGFzcyBz dGQ6OnVub3JkZXJlZF9tYXA8VCwgaW50LCBILCBFLAorCQkJCSAgQ3VzdG9tUG9pbnRlckFs bG9jPHN0ZDo6cGFpcjxjb25zdCBULCBpbnQ+Pj47CisKK3ZvaWQgdGVzdDAxKCkKK3sKKyAg dHlwZWRlZiBDdXN0b21Qb2ludGVyQWxsb2M8c3RkOjpwYWlyPGNvbnN0IFQsIGludD4+IGFs bG9jX3R5cGU7CisgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPFQsIGludCwgSCwgRSwg YWxsb2NfdHlwZT4gdGVzdF90eXBlOworICB0ZXN0X3R5cGUgdjsKKyAgdi5pbnNlcnQoeyBU KCksIDAgfSk7CisgIFZFUklGWSggKyt2LmJlZ2luKCkgPT0gdi5lbmQoKSApOworfQorCitp bnQgbWFpbigpCit7CisgIHRlc3QwMSgpOworfQpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYz L3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tdWx0aW1hcC9hbGxvY2F0b3Iv ZXh0X3B0ci5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9y ZGVyZWRfbXVsdGltYXAvYWxsb2NhdG9yL2V4dF9wdHIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjUwMzQxNzViOGE5Ci0tLSAvZGV2L251bGwKKysrIGIv bGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tdWx0aW1h cC9hbGxvY2F0b3IvZXh0X3B0ci5jYwpAQCAtMCwwICsxLDQwIEBACisvLyB7IGRnLWRvIHJ1 biB7IHRhcmdldCBjKysxMSB9IH0KKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5j bHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgorI2luY2x1ZGUg PHRlc3RzdWl0ZV9hbGxvY2F0b3IuaD4KKworc3RydWN0IFQgeyBpbnQgaTsgfTsKKworYm9v bCBvcGVyYXRvcj09KGNvbnN0IFQmIGwsIGNvbnN0IFQmIHIpCit7IHJldHVybiBsLmkgPT0g ci5pOyB9CisKK3N0cnVjdCBICit7CisgIHN0ZDo6c2l6ZV90CisgIG9wZXJhdG9yKCkoY29u c3QgVCYgdCkgY29uc3Qgbm9leGNlcHQKKyAgeyByZXR1cm4gdC5pOyB9Cit9OworCitzdHJ1 Y3QgRSA6IHN0ZDo6ZXF1YWxfdG88VD4KK3sgfTsKKwordXNpbmcgX19nbnVfdGVzdDo6Q3Vz dG9tUG9pbnRlckFsbG9jOworCit0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnVub3JkZXJlZF9tdWx0 aW1hcDxULCBpbnQsIEgsIEUsCisJCQkJICAgICAgIEN1c3RvbVBvaW50ZXJBbGxvYzxzdGQ6 OnBhaXI8Y29uc3QgVCwgaW50Pj4+OworCit2b2lkIHRlc3QwMSgpCit7CisgIHR5cGVkZWYg Q3VzdG9tUG9pbnRlckFsbG9jPHN0ZDo6cGFpcjxjb25zdCBULCBpbnQ+PiBhbGxvY190eXBl OworICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPFQsIGludCwgSCwgRSwgYWxs b2NfdHlwZT4gdGVzdF90eXBlOworICB0ZXN0X3R5cGUgdjsKKyAgdi5pbnNlcnQoeyBUKCks IDAgfSk7CisgIFZFUklGWSggKyt2LmJlZ2luKCkgPT0gdi5lbmQoKSApOworfQorCitpbnQg bWFpbigpCit7CisgIHRlc3QwMSgpOworfQpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL3Rl c3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tdWx0aXNldC9hbGxvY2F0b3IvZXh0 X3B0ci5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVy ZWRfbXVsdGlzZXQvYWxsb2NhdG9yL2V4dF9wdHIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLjhlOGNlYjFlZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGli c3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tdWx0aXNldC9h bGxvY2F0b3IvZXh0X3B0ci5jYwpAQCAtMCwwICsxLDM5IEBACisvLyB7IGRnLWRvIHJ1biB7 IHRhcmdldCBjKysxMSB9IH0KKworI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVk ZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgorI2luY2x1ZGUgPHRl c3RzdWl0ZV9hbGxvY2F0b3IuaD4KKworc3RydWN0IFQgeyBpbnQgaTsgfTsKKworYm9vbCBv cGVyYXRvcj09KGNvbnN0IFQmIGwsIGNvbnN0IFQmIHIpCit7IHJldHVybiBsLmkgPT0gci5p OyB9CisKK3N0cnVjdCBICit7CisgIHN0ZDo6c2l6ZV90CisgIG9wZXJhdG9yKCkoY29uc3Qg VCYgdCkgY29uc3Qgbm9leGNlcHQKKyAgeyByZXR1cm4gdC5pOyB9Cit9OworCitzdHJ1Y3Qg RSA6IHN0ZDo6ZXF1YWxfdG88VD4KK3sgfTsKKwordXNpbmcgX19nbnVfdGVzdDo6Q3VzdG9t UG9pbnRlckFsbG9jOworCit0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnVub3JkZXJlZF9tdWx0aXNl dDxULCBILCBFLCBDdXN0b21Qb2ludGVyQWxsb2M8VD4+OworCit2b2lkIHRlc3QwMSgpCit7 CisgIHR5cGVkZWYgQ3VzdG9tUG9pbnRlckFsbG9jPFQ+IGFsbG9jX3R5cGU7CisgIHR5cGVk ZWYgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQ8VCwgSCwgRSwgYWxsb2NfdHlwZT4gdGVzdF90 eXBlOworICB0ZXN0X3R5cGUgdjsKKyAgdi5pbnNlcnQoVCgpKTsKKyAgVkVSSUZZKCArK3Yu YmVnaW4oKSA9PSB2LmVuZCgpICk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgdGVzdDAxKCk7 Cit9CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMv dW5vcmRlcmVkX3NldC9hbGxvY2F0b3IvZXh0X3B0ci5jYyBiL2xpYnN0ZGMrKy12My90ZXN0 c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVyZWRfc2V0L2FsbG9jYXRvci9leHRfcHRyLmNj CmluZGV4IGFmY2M1OGUzOWY0Li4yYzFiYmU5YWQzZSAxMDA2NDQKLS0tIGEvbGlic3RkYysr LXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9zZXQvYWxsb2NhdG9yL2V4 dF9wdHIuY2MKKysrIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vu b3JkZXJlZF9zZXQvYWxsb2NhdG9yL2V4dF9wdHIuY2MKQEAgLTEsMjQgKzEsNCBAQAotLy8g Q29weXJpZ2h0IChDKSAyMDEzLTIwMjQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu Ci0vLwotLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnku ICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi0vLyB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotLy8gRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRp b24pCi0vLyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0vLyBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv ZgotLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQotLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy4KLQotLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLS8vIHdpdGggdGhpcyBsaWJyYXJ5 OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCi0vLyA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uCi0KLS8vIFRoaXMgdGVzdCBmYWlscyB0byBjb21waWxlIHNp bmNlIEMrKzE3IChzZWUgeGZhaWwtaWYgYmVsb3cpIHNvIHdlIGNhbiBvbmx5Ci0vLyBkbyBh ICJydW4iIHRlc3QgZm9yIEMrKzExIGFuZCBDKysxNCwgYW5kIGEgImNvbXBpbGUiIHRlc3Qg Zm9yIEMrKzE3IGFuZCB1cC4KLS8vIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYysrMTFfb25s eSB8fCBjKysxNF9vbmx5IH0gfSB9Ci0vLyB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgYysr MTcgfSB9CisvLyB7IGRnLWRvIHJ1biB7IHRhcmdldCB7IGMrKzExIH0gfSB9CiAKICNpbmNs dWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPG1lbW9yeT4KQEAgLTI2LDE1ICs2LDIy IEBACiAjaW5jbHVkZSA8dGVzdHN1aXRlX2FsbG9jYXRvci5oPgogCiBzdHJ1Y3QgVCB7IGlu dCBpOyB9OwotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQmIGwsIGNvbnN0IFQmIHIpIHsgcmV0 dXJuIGwuaSA9PSByLmk7IH0KLXN0cnVjdCBIIHsgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShj b25zdCBUJiB0KSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiB0Lmk7IH0KKworYm9vbCBvcGVy YXRvcj09KGNvbnN0IFQmIGwsIGNvbnN0IFQmIHIpCit7IHJldHVybiBsLmkgPT0gci5pOyB9 CisKK3N0cnVjdCBICit7CisgIHN0ZDo6c2l6ZV90CisgIG9wZXJhdG9yKCkoY29uc3QgVCYg dCkgY29uc3Qgbm9leGNlcHQKKyAgeyByZXR1cm4gdC5pOyB9CiB9Owotc3RydWN0IEUgOiBz dGQ6OmVxdWFsX3RvPFQ+IHsgfTsKKworc3RydWN0IEUgOiBzdGQ6OmVxdWFsX3RvPFQ+Cit7 IH07CiAKIHVzaW5nIF9fZ251X3Rlc3Q6OkN1c3RvbVBvaW50ZXJBbGxvYzsKIAotLy8geyBk Zy14ZmFpbC1pZiAibm9kZSByZWluc2VydGlvbiBhc3N1bWVzIHJhdyBwb2ludGVycyIgeyBj KysxNyB9IH0KLS8vIFRPRE8gd2hlbiByZW1vdmluZyB0aGlzIHhmYWlsIGNoYW5nZSB0aGUg dGVzdCBiYWNrIHRvICJkZy1kbyBydW4iLgogdGVtcGxhdGUgY2xhc3Mgc3RkOjp1bm9yZGVy ZWRfc2V0PFQsIEgsIEUsIEN1c3RvbVBvaW50ZXJBbGxvYzxUPj47CiAKIHZvaWQgdGVzdDAx KCkK --------------F0cM8DDgrpPxlMOmV4Ehavts--