From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: [PATCH v2 05/12] libxl: carve out scheduler specific functions from libxl.c Date: Thu, 9 Feb 2017 10:30:18 +0100 Message-ID: <20170209093025.20849-6-jgross@suse.com> References: <20170209093025.20849-1-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cbl3h-0004i9-51 for xen-devel@lists.xenproject.org; Thu, 09 Feb 2017 09:30:33 +0000 In-Reply-To: <20170209093025.20849-1-jgross@suse.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: Juergen Gross , haozhong.zhang@intel.com, wei.liu2@citrix.com, zhangchen.fnst@cn.fujitsu.com, ian.jackson@eu.citrix.com, yi.y.sun@linux.intel.com List-Id: xen-devel@lists.xenproject.org bGlieGwuYyBoYXMgZ3Jvd24gdG8gYW4gdW5jb21mb3J0YWJsZSBzaXplLiBDYXJ2ZSBvdXQgdGhl IHNjaGVkdWxlcgpyZWxhdGVkIGZ1bmN0aW9ucyB0byBsaWJ4bF9zY2hlZC5jLgoKU2lnbmVkLW9m Zi1ieTogSnVlcmdlbiBHcm9zcyA8amdyb3NzQHN1c2UuY29tPgotLS0KIHRvb2xzL2xpYnhsL01h a2VmaWxlICAgICAgfCAgIDIgKy0KIHRvb2xzL2xpYnhsL2xpYnhsLmMgICAgICAgfCA4OTEgLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHRvb2xzL2xpYnhsL2xp YnhsX3NjaGVkLmMgfCA5MTUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA5MTYgaW5zZXJ0aW9ucygrKSwgODkyIGRlbGV0aW9u cygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL2xpYnhsL2xpYnhsX3NjaGVkLmMKCmRpZmYg LS1naXQgYS90b29scy9saWJ4bC9NYWtlZmlsZSBiL3Rvb2xzL2xpYnhsL01ha2VmaWxlCmluZGV4 IDAxMjU4NzEuLjc1MTRjYzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYnhsL01ha2VmaWxlCisrKyBi L3Rvb2xzL2xpYnhsL01ha2VmaWxlCkBAIC0xMzcsNyArMTM3LDcgQEAgTElCWExfT0JKUyA9IGZs ZXhhcnJheS5vIGxpYnhsLm8gbGlieGxfY3JlYXRlLm8gbGlieGxfZG0ubyBsaWJ4bF9wY2kubyBc CiAJCQlsaWJ4bF9xbXAubyBsaWJ4bF9ldmVudC5vIGxpYnhsX2ZvcmsubyBcCiAJCQlsaWJ4bF9k b21fc3VzcGVuZC5vIGxpYnhsX2RvbV9zYXZlLm8gbGlieGxfdXNiLm8gXAogCQkJbGlieGxfdnRw bS5vIGxpYnhsX25pYy5vIFwKLQkJCWxpYnhsX2NwdXBvb2wubyBcCisJCQlsaWJ4bF9jcHVwb29s Lm8gbGlieGxfc2NoZWQubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAkKExJQlhMX09CSlMt eSkKIExJQlhMX09CSlMgKz0gbGlieGxfZ2VuaWQubwogTElCWExfT0JKUyArPSBfbGlieGxfdHlw ZXMubyBsaWJ4bF9mbGFzay5vIF9saWJ4bF90eXBlc19pbnRlcm5hbC5vCmRpZmYgLS1naXQgYS90 b29scy9saWJ4bC9saWJ4bC5jIGIvdG9vbHMvbGlieGwvbGlieGwuYwppbmRleCBkMDA4MGNhLi5h ZTZjN2Q0IDEwMDY0NAotLS0gYS90b29scy9saWJ4bC9saWJ4bC5jCisrKyBiL3Rvb2xzL2xpYnhs L2xpYnhsLmMKQEAgLTQ4MzAsMTQ2ICs0ODMwLDYgQEAgZXJyOgogICAgIHJldHVybiBOVUxMOwog fQogCi1zdGF0aWMgaW50IGxpYnhsX19zZXRfdmNwdWFmZmluaXR5KGxpYnhsX2N0eCAqY3R4LCB1 aW50MzJfdCBkb21pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMy X3QgdmNwdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4 bF9iaXRtYXAgKmNwdW1hcF9oYXJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBsaWJ4bF9iaXRtYXAgKmNwdW1hcF9zb2Z0LAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKLXsKLSAgICBHQ19JTklUKGN0eCk7Ci0gICAg bGlieGxfYml0bWFwIGhhcmQsIHNvZnQ7Ci0gICAgaW50IHJjOwotCi0gICAgbGlieGxfYml0bWFw X2luaXQoJmhhcmQpOwotICAgIGxpYnhsX2JpdG1hcF9pbml0KCZzb2Z0KTsKLQotICAgIGlmICgh Y3B1bWFwX2hhcmQgJiYgIWNwdW1hcF9zb2Z0ICYmICFmbGFncykgewotICAgICAgICByYyA9IEVS Uk9SX0lOVkFMOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFhl biB3YW50cyB3cml0YWJsZSBoYXJkIGFuZC9vciBzb2Z0IGNwdW1hcHMsIHRvIHB1dCBiYWNrIGlu IHRoZW0KLSAgICAgKiB0aGUgZWZmZWN0aXZlIGhhcmQgYW5kL29yIHNvZnQgYWZmaW5pdHkgdGhh dCB3aWxsIGJlIHVzZWQuCi0gICAgICovCi0gICAgaWYgKGNwdW1hcF9oYXJkKSB7Ci0gICAgICAg IHJjID0gbGlieGxfY3B1X2JpdG1hcF9hbGxvYyhjdHgsICZoYXJkLCAwKTsKLSAgICAgICAgaWYg KHJjKQotICAgICAgICAgICAgZ290byBvdXQ7Ci0KLSAgICAgICAgbGlieGxfX2JpdG1hcF9jb3B5 X2Jlc3RfZWZmb3J0KGdjLCAmaGFyZCwgY3B1bWFwX2hhcmQpOwotICAgICAgICBmbGFncyB8PSBY RU5fVkNQVUFGRklOSVRZX0hBUkQ7Ci0gICAgfQotICAgIGlmIChjcHVtYXBfc29mdCkgewotICAg ICAgICByYyA9IGxpYnhsX2NwdV9iaXRtYXBfYWxsb2MoY3R4LCAmc29mdCwgMCk7Ci0gICAgICAg IGlmIChyYykKLSAgICAgICAgICAgIGdvdG8gb3V0OwotCi0gICAgICAgIGxpYnhsX19iaXRtYXBf Y29weV9iZXN0X2VmZm9ydChnYywgJnNvZnQsIGNwdW1hcF9zb2Z0KTsKLSAgICAgICAgZmxhZ3Mg fD0gWEVOX1ZDUFVBRkZJTklUWV9TT0ZUOwotICAgIH0KLQotICAgIGlmICh4Y192Y3B1X3NldGFm ZmluaXR5KGN0eC0+eGNoLCBkb21pZCwgdmNwdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNwdW1hcF9oYXJkID8gaGFyZC5tYXAgOiBOVUxMLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNwdW1hcF9zb2Z0ID8gc29mdC5tYXAgOiBOVUxMLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGZsYWdzKSkgewotICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJTZXR0aW5n IHZjcHUgYWZmaW5pdHkiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAgICBnb3Rv IG91dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIExldCdzIGNoZWNrIHRoZSByZXN1bHRzLiBI YXJkIGFmZmluaXR5IHdpbGwgbmV2ZXIgYmUgZW1wdHksIGJ1dCBpdAotICAgICAqIGlzIHBvc3Np YmxlIHRoYXQgWGVuIHdpbGwgdXNlIHNvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSB3aGF0IHdlIGFz a2VkCi0gICAgICogZm9yIHZhcmlvdXMgcmVhc29ucy4gSWYgdGhhdCdzIHRoZSBjYXNlLCByZXBv cnQgaXQuCi0gICAgICovCi0gICAgaWYgKGNwdW1hcF9oYXJkICYmCi0gICAgICAgICFsaWJ4bF9i aXRtYXBfZXF1YWwoY3B1bWFwX2hhcmQsICZoYXJkLCAwKSkKLSAgICAgICAgTE9HRChERUJVRywg ZG9taWQsICJOZXcgaGFyZCBhZmZpbml0eSBmb3IgdmNwdSAlZCBoYXMgdW5yZWFjaGFibGUgY3B1 cyIsIHZjcHVpZCk7Ci0gICAgLyoKLSAgICAgKiBTb2Z0IGFmZmluaXR5IGNhbiBib3RoIGJlIGRp ZmZlcmVudCBmcm9tIHdoYXQgYXNrZWQgYW5kIGVtcHR5LiBDaGVjawotICAgICAqIGZvciAoYW5k IHJlcG9ydCkgYm90aC4KLSAgICAgKi8KLSAgICBpZiAoY3B1bWFwX3NvZnQpIHsKLSAgICAgICAg aWYgKCFsaWJ4bF9iaXRtYXBfZXF1YWwoY3B1bWFwX3NvZnQsICZzb2Z0LCAwKSkKLSAgICAgICAg ICAgIExPR0QoREVCVUcsIGRvbWlkLCAiTmV3IHNvZnQgYWZmaW5pdHkgZm9yIHZjcHUgJWQgaGFz IHVucmVhY2hhYmxlIGNwdXMiLAotICAgICAgICAgICAgICAgICB2Y3B1aWQpOwotICAgICAgICBp ZiAobGlieGxfYml0bWFwX2lzX2VtcHR5KCZzb2Z0KSkKLSAgICAgICAgICAgIExPR0QoV0FSTiwg ZG9taWQsICJBbGwgY3B1cyBpbiBzb2Z0IGFmZmluaXR5IG9mIHZjcHUgJWQgYXJlIHVucmVhY2hh YmxlLiIKLSAgICAgICAgICAgICAgICAgIiBPbmx5IGhhcmQgYWZmaW5pdHkgd2lsbCBiZSBjb25z aWRlcmVkIGZvciBzY2hlZHVsaW5nIiwKLSAgICAgICAgICAgICAgICAgdmNwdWlkKTsKLSAgICB9 Ci0KLSAgICByYyA9IDA7Ci0gb3V0OgotICAgIGxpYnhsX2JpdG1hcF9kaXNwb3NlKCZoYXJkKTsK LSAgICBsaWJ4bF9iaXRtYXBfZGlzcG9zZSgmc29mdCk7Ci0gICAgR0NfRlJFRTsKLSAgICByZXR1 cm4gcmM7Ci19Ci0KLWludCBsaWJ4bF9zZXRfdmNwdWFmZmluaXR5KGxpYnhsX2N0eCAqY3R4LCB1 aW50MzJfdCBkb21pZCwgdWludDMyX3QgdmNwdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgbGlieGxfYml0bWFwICpjcHVtYXBfaGFyZCwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IGxpYnhsX2JpdG1hcCAqY3B1bWFwX3NvZnQpCi17Ci0gICAgcmV0dXJuIGxp YnhsX19zZXRfdmNwdWFmZmluaXR5KGN0eCwgZG9taWQsIHZjcHVpZCwgY3B1bWFwX2hhcmQsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdW1hcF9zb2Z0LCAwKTsKLX0KLQot aW50IGxpYnhsX3NldF92Y3B1YWZmaW5pdHlfZm9yY2UobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90 IGRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmNwdWlk LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlieGxfYml0bWFwICpj cHVtYXBfaGFyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhs X2JpdG1hcCAqY3B1bWFwX3NvZnQpCi17Ci0gICAgcmV0dXJuIGxpYnhsX19zZXRfdmNwdWFmZmlu aXR5KGN0eCwgZG9taWQsIHZjcHVpZCwgY3B1bWFwX2hhcmQsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNwdW1hcF9zb2Z0LCBYRU5fVkNQVUFGRklOSVRZX0ZPUkNFKTsKLX0K LQotaW50IGxpYnhsX3NldF92Y3B1YWZmaW5pdHlfYWxsKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJf dCBkb21pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4 X3ZjcHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX2JpdG1h cCAqY3B1bWFwX2hhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGli eGxfYml0bWFwICpjcHVtYXBfc29mdCkKLXsKLSAgICBHQ19JTklUKGN0eCk7Ci0gICAgaW50IGks IHJjID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfdmNwdXM7IGkrKykgewotICAgICAg ICBpZiAobGlieGxfc2V0X3ZjcHVhZmZpbml0eShjdHgsIGRvbWlkLCBpLCBjcHVtYXBfaGFyZCwg Y3B1bWFwX3NvZnQpKSB7Ci0gICAgICAgICAgICBMT0dEKFdBUk4sIGRvbWlkLCAiRmFpbGVkIHRv IHNldCBhZmZpbml0eSBmb3IgJWQiLCBpKTsKLSAgICAgICAgICAgIHJjID0gRVJST1JfRkFJTDsK LSAgICAgICAgfQotICAgIH0KLQotICAgIEdDX0ZSRUU7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1p bnQgbGlieGxfZG9tYWluX3NldF9ub2RlYWZmaW5pdHkobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90 IGRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX2JpdG1hcCAq bm9kZW1hcCkKLXsKLSAgICBHQ19JTklUKGN0eCk7Ci0gICAgaWYgKHhjX2RvbWFpbl9ub2RlX3Nl dGFmZmluaXR5KGN0eC0+eGNoLCBkb21pZCwgbm9kZW1hcC0+bWFwKSkgewotICAgICAgICBMT0dF RChFUlJPUiwgZG9taWQsICJTZXR0aW5nIG5vZGUgYWZmaW5pdHkiKTsKLSAgICAgICAgR0NfRlJF RTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7Ci0gICAgfQotICAgIEdDX0ZSRUU7Ci0gICAg cmV0dXJuIDA7Ci19Ci0KLWludCBsaWJ4bF9kb21haW5fZ2V0X25vZGVhZmZpbml0eShsaWJ4bF9j dHggKmN0eCwgdWludDMyX3QgZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbGlieGxfYml0bWFwICpub2RlbWFwKQotewotICAgIEdDX0lOSVQoY3R4KTsKLSAgICBpZiAo eGNfZG9tYWluX25vZGVfZ2V0YWZmaW5pdHkoY3R4LT54Y2gsIGRvbWlkLCBub2RlbWFwLT5tYXAp KSB7Ci0gICAgICAgIExPR0VEKEVSUk9SLCBkb21pZCwgIkdldHRpbmcgbm9kZSBhZmZpbml0eSIp OwotICAgICAgICBHQ19GUkVFOwotICAgICAgICByZXR1cm4gRVJST1JfRkFJTDsKLSAgICB9Ci0g ICAgR0NfRlJFRTsKLSAgICByZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBsaWJ4bF9fc2V0X3Zj cHVvbmxpbmVfeGVuc3RvcmUobGlieGxfX2djICpnYywgdWludDMyX3QgZG9taWQsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX2JpdG1hcCAqY3B1bWFwLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4bF9kb21p bmZvICppbmZvKQpAQCAtNTA4NSw3NTcgKzQ5NDUsNiBAQCBvdXQ6CiAgICAgcmV0dXJuIHJjOwog fQogCi1pbnQgbGlieGxfZ2V0X3NjaGVkdWxlcihsaWJ4bF9jdHggKmN0eCkKLXsKLSAgICBpbnQg ciwgc2NoZWQ7Ci0KLSAgICBHQ19JTklUKGN0eCk7Ci0gICAgciA9IHhjX3NjaGVkX2lkKGN0eC0+ eGNoLCAmc2NoZWQpOwotICAgIGlmIChyICE9IDApIHsKLSAgICAgICAgTE9HRShFUlJPUiwgImdl dHRpbmcgY3VycmVudCBzY2hlZHVsZXIgaWQiKTsKLSAgICAgICAgc2NoZWQgPSBFUlJPUl9GQUlM OwotICAgIH0KLSAgICBHQ19GUkVFOwotICAgIHJldHVybiBzY2hlZDsKLX0KLQotc3RhdGljIGlu dCBzY2hlZF9hcmluYzY1M19kb21haW5fc2V0KGxpYnhsX19nYyAqZ2MsIHVpbnQzMl90IGRvbWlk LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX2RvbWFp bl9zY2hlZF9wYXJhbXMgKnNjaW5mbykKLXsKLSAgICAvKiBDdXJyZW50bHksIHRoZSBBUklOQyA2 NTMgc2NoZWR1bGVyIGRvZXMgbm90IHRha2UgYW55IGRvbWFpbi1zcGVjaWZpYwotICAgICAgICAg Y29uZmlndXJhdGlvbiwgc28gd2Ugc2ltcGx5IHJldHVybiBzdWNjZXNzLiAqLwotICAgIHJldHVy biAwOwotfQotCi1zdGF0aWMgaW50IHNjaGVkX2NyZWRpdF9kb21haW5fZ2V0KGxpYnhsX19nYyAq Z2MsIHVpbnQzMl90IGRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBs aWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgc3RydWN0IHhlbl9kb21j dGxfc2NoZWRfY3JlZGl0IHNkb207Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSB4Y19zY2hlZF9j cmVkaXRfZG9tYWluX2dldChDVFgtPnhjaCwgZG9taWQsICZzZG9tKTsKLSAgICBpZiAocmMgIT0g MCkgewotICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJHZXR0aW5nIGRvbWFpbiBzY2hlZCBj cmVkaXQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7Ci0gICAgfQotCi0gICAgbGlieGxf ZG9tYWluX3NjaGVkX3BhcmFtc19pbml0KHNjaW5mbyk7Ci0gICAgc2NpbmZvLT5zY2hlZCA9IExJ QlhMX1NDSEVEVUxFUl9DUkVESVQ7Ci0gICAgc2NpbmZvLT53ZWlnaHQgPSBzZG9tLndlaWdodDsK LSAgICBzY2luZm8tPmNhcCA9IHNkb20uY2FwOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgc2NoZWRfY3JlZGl0X2RvbWFpbl9zZXQobGlieGxfX2djICpnYywgdWludDMyX3QgZG9t aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX2RvbWFp bl9zY2hlZF9wYXJhbXMgKnNjaW5mbykKLXsKLSAgICBzdHJ1Y3QgeGVuX2RvbWN0bF9zY2hlZF9j cmVkaXQgc2RvbTsKLSAgICB4Y19kb21haW5pbmZvX3QgZG9tYWluaW5mbzsKLSAgICBpbnQgcmM7 Ci0KLSAgICByYyA9IHhjX2RvbWFpbl9nZXRpbmZvbGlzdChDVFgtPnhjaCwgZG9taWQsIDEsICZk b21haW5pbmZvKTsKLSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgIExPR0VEKEVSUk9SLCBkb21p ZCwgIkdldHRpbmcgZG9tYWluIGluZm8gbGlzdCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRkFJ TDsKLSAgICB9Ci0gICAgaWYgKHJjICE9IDEgfHwgZG9tYWluaW5mby5kb21haW4gIT0gZG9taWQp Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTlZBTDsKLQotICAgIHJjID0geGNfc2NoZWRfY3JlZGl0 X2RvbWFpbl9nZXQoQ1RYLT54Y2gsIGRvbWlkLCAmc2RvbSk7Ci0gICAgaWYgKHJjICE9IDApIHsK LSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiR2V0dGluZyBkb21haW4gc2NoZWQgY3JlZGl0 Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9GQUlMOwotICAgIH0KLQotICAgIGlmIChzY2luZm8t PndlaWdodCAhPSBMSUJYTF9ET01BSU5fU0NIRURfUEFSQU1fV0VJR0hUX0RFRkFVTFQpIHsKLSAg ICAgICAgaWYgKHNjaW5mby0+d2VpZ2h0IDwgMSB8fCBzY2luZm8tPndlaWdodCA+IDY1NTM1KSB7 Ci0gICAgICAgICAgICBMT0dEKEVSUk9SLCBkb21pZCwgIkNwdSB3ZWlnaHQgb3V0IG9mIHJhbmdl LCAiCi0gICAgICAgICAgICAgICAgICJ2YWxpZCB2YWx1ZXMgYXJlIHdpdGhpbiByYW5nZSBmcm9t IDEgdG8gNjU1MzUiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTDsKLSAgICAgICAg fQotICAgICAgICBzZG9tLndlaWdodCA9IHNjaW5mby0+d2VpZ2h0OwotICAgIH0KLQotICAgIGlm IChzY2luZm8tPmNhcCAhPSBMSUJYTF9ET01BSU5fU0NIRURfUEFSQU1fQ0FQX0RFRkFVTFQpIHsK LSAgICAgICAgaWYgKHNjaW5mby0+Y2FwIDwgMAotICAgICAgICAgICAgfHwgc2NpbmZvLT5jYXAg PiAoZG9tYWluaW5mby5tYXhfdmNwdV9pZCArIDEpICogMTAwKSB7Ci0gICAgICAgICAgICBMT0dE KEVSUk9SLCBkb21pZCwgIkNwdSBjYXAgb3V0IG9mIHJhbmdlLCAiCi0gICAgICAgICAgICAgICAg ICJ2YWxpZCByYW5nZSBpcyBmcm9tIDAgdG8gJWQgZm9yIHNwZWNpZmllZCBudW1iZXIgb2YgdmNw dXMiLAotICAgICAgICAgICAgICAgICAoKGRvbWFpbmluZm8ubWF4X3ZjcHVfaWQgKyAxKSAqIDEw MCkpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOwotICAgICAgICB9Ci0gICAgICAg IHNkb20uY2FwID0gc2NpbmZvLT5jYXA7Ci0gICAgfQotCi0gICAgcmMgPSB4Y19zY2hlZF9jcmVk aXRfZG9tYWluX3NldChDVFgtPnhjaCwgZG9taWQsICZzZG9tKTsKLSAgICBpZiAoIHJjIDwgMCAp IHsKLSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiU2V0dGluZyBkb21haW4gc2NoZWQgY3Jl ZGl0Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9GQUlMOwotICAgIH0KLQotICAgIHJldHVybiAw OwotfQotCi1zdGF0aWMgaW50IHNjaGVkX3JhdGVsaW1pdF9jaGVjayhsaWJ4bF9fZ2MgKmdjLCBp bnQgcmF0ZWxpbWl0KQotewotICAgIGlmIChyYXRlbGltaXQgIT0gMCAmJgotICAgICAgICAocmF0 ZWxpbWl0IDwgIFhFTl9TWVNDVExfU0NIRURfUkFURUxJTUlUX01JTiB8fAotICAgICAgICAgcmF0 ZWxpbWl0ID4gWEVOX1NZU0NUTF9TQ0hFRF9SQVRFTElNSVRfTUFYKSkgewotICAgICAgICBMT0co RVJST1IsICJSYXRlbGltaXQgb3V0IG9mIHJhbmdlLCB2YWxpZCByYW5nZSBpcyBmcm9tICVkIHRv ICVkIiwKLSAgICAgICAgICAgIFhFTl9TWVNDVExfU0NIRURfUkFURUxJTUlUX01JTiwgWEVOX1NZ U0NUTF9TQ0hFRF9SQVRFTElNSVRfTUFYKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOwot ICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgbGlieGxfc2NoZWRfY3JlZGl0X3BhcmFt c19nZXQobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZF9jcmVkaXRfcGFyYW1zICpzY2luZm8pCi17Ci0g ICAgc3RydWN0IHhlbl9zeXNjdGxfY3JlZGl0X3NjaGVkdWxlIHNwYXJhbTsKLSAgICBpbnQgciwg cmM7Ci0gICAgR0NfSU5JVChjdHgpOwotCi0gICAgciA9IHhjX3NjaGVkX2NyZWRpdF9wYXJhbXNf Z2V0KGN0eC0+eGNoLCBwb29saWQsICZzcGFyYW0pOwotICAgIGlmIChyIDwgMCkgewotICAgICAg ICBMT0dFKEVSUk9SLCAiZ2V0dGluZyBDcmVkaXQgc2NoZWR1bGVyIHBhcmFtZXRlcnMiKTsKLSAg ICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBz Y2luZm8tPnRzbGljZV9tcyA9IHNwYXJhbS50c2xpY2VfbXM7Ci0gICAgc2NpbmZvLT5yYXRlbGlt aXRfdXMgPSBzcGFyYW0ucmF0ZWxpbWl0X3VzOwotCi0gICAgcmMgPSAwOwotIG91dDoKLSAgICBH Q19GUkVFOwotICAgIHJldHVybiByYzsKLX0KLQotaW50IGxpYnhsX3NjaGVkX2NyZWRpdF9wYXJh bXNfc2V0KGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbGlieGxfc2NoZWRfY3JlZGl0X3BhcmFtcyAqc2NpbmZvKQotewot ICAgIHN0cnVjdCB4ZW5fc3lzY3RsX2NyZWRpdF9zY2hlZHVsZSBzcGFyYW07Ci0gICAgaW50IHIs IHJjOwotICAgIEdDX0lOSVQoY3R4KTsKLQotICAgIGlmIChzY2luZm8tPnRzbGljZV9tcyA8ICBY RU5fU1lTQ1RMX0NTQ0hFRF9UU0xJQ0VfTUlOCi0gICAgICAgIHx8IHNjaW5mby0+dHNsaWNlX21z ID4gWEVOX1NZU0NUTF9DU0NIRURfVFNMSUNFX01BWCkgewotICAgICAgICBMT0coRVJST1IsICJU aW1lIHNsaWNlIG91dCBvZiByYW5nZSwgdmFsaWQgcmFuZ2UgaXMgZnJvbSAlZCB0byAlZCIsCi0g ICAgICAgICAgICBYRU5fU1lTQ1RMX0NTQ0hFRF9UU0xJQ0VfTUlOLCBYRU5fU1lTQ1RMX0NTQ0hF RF9UU0xJQ0VfTUFYKTsKLSAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKLSAgICAgICAgZ290byBv dXQ7Ci0gICAgfQotICAgIHJjID0gc2NoZWRfcmF0ZWxpbWl0X2NoZWNrKGdjLCBzY2luZm8tPnJh dGVsaW1pdF91cyk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAg ICBpZiAoc2NpbmZvLT5yYXRlbGltaXRfdXMgPiBzY2luZm8tPnRzbGljZV9tcyoxMDAwKSB7Ci0g ICAgICAgIExPRyhFUlJPUiwgIlJhdGVsaW1pdCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHRpbWVz bGljZSIpOwotICAgICAgICByYyA9IEVSUk9SX0lOVkFMOwotICAgICAgICBnb3RvIG91dDsKLSAg ICB9Ci0KLSAgICBzcGFyYW0udHNsaWNlX21zID0gc2NpbmZvLT50c2xpY2VfbXM7Ci0gICAgc3Bh cmFtLnJhdGVsaW1pdF91cyA9IHNjaW5mby0+cmF0ZWxpbWl0X3VzOwotCi0gICAgciA9IHhjX3Nj aGVkX2NyZWRpdF9wYXJhbXNfc2V0KGN0eC0+eGNoLCBwb29saWQsICZzcGFyYW0pOwotICAgIGlm ICggciA8IDAgKSB7Ci0gICAgICAgIExPR0UoRVJST1IsICJTZXR0aW5nIENyZWRpdCBzY2hlZHVs ZXIgcGFyYW1ldGVycyIpOwotICAgICAgICByYyA9IEVSUk9SX0ZBSUw7Ci0gICAgICAgIGdvdG8g b3V0OwotICAgIH0KLQotICAgIHNjaW5mby0+dHNsaWNlX21zID0gc3BhcmFtLnRzbGljZV9tczsK LSAgICBzY2luZm8tPnJhdGVsaW1pdF91cyA9IHNwYXJhbS5yYXRlbGltaXRfdXM7Ci0KLSAgICBy YyA9IDA7Ci0gb3V0OgotICAgIEdDX0ZSRUU7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgbGli eGxfc2NoZWRfY3JlZGl0Ml9wYXJhbXNfZ2V0KGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29s aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX3NjaGVkX2NyZWRp dDJfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgc3RydWN0IHhlbl9zeXNjdGxfY3JlZGl0Ml9zY2hl ZHVsZSBzcGFyYW07Ci0gICAgaW50IHIsIHJjOwotICAgIEdDX0lOSVQoY3R4KTsKLQotICAgIHIg PSB4Y19zY2hlZF9jcmVkaXQyX3BhcmFtc19nZXQoY3R4LT54Y2gsIHBvb2xpZCwgJnNwYXJhbSk7 Ci0gICAgaWYgKHIgPCAwKSB7Ci0gICAgICAgIExPR0UoRVJST1IsICJnZXR0aW5nIENyZWRpdDIg c2NoZWR1bGVyIHBhcmFtZXRlcnMiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAg ICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBzY2luZm8tPnJhdGVsaW1pdF91cyA9IHNwYXJhbS5y YXRlbGltaXRfdXM7Ci0KLSAgICByYyA9IDA7Ci0gb3V0OgotICAgIEdDX0ZSRUU7Ci0gICAgcmV0 dXJuIHJjOwotfQotCi0KLWludCBsaWJ4bF9zY2hlZF9jcmVkaXQyX3BhcmFtc19zZXQobGlieGxf Y3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbGlieGxfc2NoZWRfY3JlZGl0Ml9wYXJhbXMgKnNjaW5mbykKLXsKLSAgICBzdHJ1Y3Qg eGVuX3N5c2N0bF9jcmVkaXQyX3NjaGVkdWxlIHNwYXJhbTsKLSAgICBpbnQgciwgcmM7Ci0gICAg R0NfSU5JVChjdHgpOwotCi0gICAgcmMgPSBzY2hlZF9yYXRlbGltaXRfY2hlY2soZ2MsIHNjaW5m by0+cmF0ZWxpbWl0X3VzKTsKLSAgICBpZiAocmMpIGdvdG8gb3V0OwotCi0gICAgc3BhcmFtLnJh dGVsaW1pdF91cyA9IHNjaW5mby0+cmF0ZWxpbWl0X3VzOwotCi0gICAgciA9IHhjX3NjaGVkX2Ny ZWRpdDJfcGFyYW1zX3NldChjdHgtPnhjaCwgcG9vbGlkLCAmc3BhcmFtKTsKLSAgICBpZiAociA8 IDApIHsKLSAgICAgICAgTE9HRShFUlJPUiwgIlNldHRpbmcgQ3JlZGl0MiBzY2hlZHVsZXIgcGFy YW1ldGVycyIpOwotICAgICAgICByYyA9IEVSUk9SX0ZBSUw7Ci0gICAgICAgIGdvdG8gb3V0Owot ICAgIH0KLQotICAgIHNjaW5mby0+cmF0ZWxpbWl0X3VzID0gc3BhcmFtLnJhdGVsaW1pdF91czsK LQotICAgIHJjID0gMDsKLSBvdXQ6Ci0gICAgR0NfRlJFRTsKLSAgICByZXR1cm4gcmM7Ci19Ci0K LXN0YXRpYyBpbnQgc2NoZWRfY3JlZGl0Ml9kb21haW5fZ2V0KGxpYnhsX19nYyAqZ2MsIHVpbnQz Ml90IGRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZG9t YWluX3NjaGVkX3BhcmFtcyAqc2NpbmZvKQotewotICAgIHN0cnVjdCB4ZW5fZG9tY3RsX3NjaGVk X2NyZWRpdDIgc2RvbTsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IHhjX3NjaGVkX2NyZWRpdDJf ZG9tYWluX2dldChDVFgtPnhjaCwgZG9taWQsICZzZG9tKTsKLSAgICBpZiAocmMgIT0gMCkgewot ICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJHZXR0aW5nIGRvbWFpbiBzY2hlZCBjcmVkaXQy Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9GQUlMOwotICAgIH0KLQotICAgIGxpYnhsX2RvbWFp bl9zY2hlZF9wYXJhbXNfaW5pdChzY2luZm8pOwotICAgIHNjaW5mby0+c2NoZWQgPSBMSUJYTF9T Q0hFRFVMRVJfQ1JFRElUMjsKLSAgICBzY2luZm8tPndlaWdodCA9IHNkb20ud2VpZ2h0OwotCi0g ICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoZWRfY3JlZGl0Ml9kb21haW5fc2V0KGxp YnhsX19nYyAqZ2MsIHVpbnQzMl90IGRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFtcyAqc2NpbmZvKQotewotICAg IHN0cnVjdCB4ZW5fZG9tY3RsX3NjaGVkX2NyZWRpdDIgc2RvbTsKLSAgICBpbnQgcmM7Ci0KLSAg ICByYyA9IHhjX3NjaGVkX2NyZWRpdDJfZG9tYWluX2dldChDVFgtPnhjaCwgZG9taWQsICZzZG9t KTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJHZXR0 aW5nIGRvbWFpbiBzY2hlZCBjcmVkaXQyIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9GQUlMOwot ICAgIH0KLQotICAgIGlmIChzY2luZm8tPndlaWdodCAhPSBMSUJYTF9ET01BSU5fU0NIRURfUEFS QU1fV0VJR0hUX0RFRkFVTFQpIHsKLSAgICAgICAgaWYgKHNjaW5mby0+d2VpZ2h0IDwgMSB8fCBz Y2luZm8tPndlaWdodCA+IDY1NTM1KSB7Ci0gICAgICAgICAgICBMT0dEKEVSUk9SLCBkb21pZCwg IkNwdSB3ZWlnaHQgb3V0IG9mIHJhbmdlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAidmFs aWQgdmFsdWVzIGFyZSB3aXRoaW4gcmFuZ2UgZnJvbSAxIHRvIDY1NTM1Iik7Ci0gICAgICAgICAg ICByZXR1cm4gRVJST1JfSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgc2RvbS53ZWlnaHQgPSBz Y2luZm8tPndlaWdodDsKLSAgICB9Ci0KLSAgICByYyA9IHhjX3NjaGVkX2NyZWRpdDJfZG9tYWlu X3NldChDVFgtPnhjaCwgZG9taWQsICZzZG9tKTsKLSAgICBpZiAoIHJjIDwgMCApIHsKLSAgICAg ICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiU2V0dGluZyBkb21haW4gc2NoZWQgY3JlZGl0MiIpOwot ICAgICAgICByZXR1cm4gRVJST1JfRkFJTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQot c3RhdGljIGludCBzY2hlZF9ydGRzX3ZhbGlkYXRlX3BhcmFtcyhsaWJ4bF9fZ2MgKmdjLCBpbnQg cGVyaW9kLCBpbnQgYnVkZ2V0KQotewotICAgIGludCByYzsKLQotICAgIGlmIChwZXJpb2QgPCAx KSB7Ci0gICAgICAgIExPRyhFUlJPUiwgIkludmFsaWQgVkNQVSBwZXJpb2Qgb2YgJWQgKGl0IHNo b3VsZCBiZSA+PSAxKSIsIHBlcmlvZCk7Ci0gICAgICAgIHJjID0gRVJST1JfSU5WQUw7Ci0gICAg ICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIGlmIChidWRnZXQgPCAxKSB7Ci0gICAgICAgIExP RyhFUlJPUiwgIkludmFsaWQgVkNQVSBidWRnZXQgb2YgJWQgKGl0IHNob3VsZCBiZSA+PSAxKSIs IGJ1ZGdldCk7Ci0gICAgICAgIHJjID0gRVJST1JfSU5WQUw7Ci0gICAgICAgIGdvdG8gb3V0Owot ICAgIH0KLQotICAgIGlmIChidWRnZXQgPiBwZXJpb2QpIHsKLSAgICAgICAgTE9HKEVSUk9SLCAi VkNQVSBidWRnZXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gcGVyaW9kLCAiCi0g ICAgICAgICAgICAgICAgICAgImJ1dCAlZCA+ICVkIiwgYnVkZ2V0LCBwZXJpb2QpOwotICAgICAg ICByYyA9IEVSUk9SX0lOVkFMOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSAw Owotb3V0OgotICAgIHJldHVybiByYzsKLX0KLQotLyogR2V0IHRoZSBSVERTIHNjaGVkdWxpbmcg cGFyYW1ldGVycyBvZiB2Y3B1KHMpICovCi1zdGF0aWMgaW50IHNjaGVkX3J0ZHNfdmNwdV9nZXQo bGlieGxfX2djICpnYywgdWludDMyX3QgZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5mbykKLXsKLSAgICB1aW50MzJfdCBu dW1fdmNwdXM7Ci0gICAgaW50IGksIHIsIHJjOwotICAgIHhjX2RvbWluZm9fdCBpbmZvOwotICAg IHN0cnVjdCB4ZW5fZG9tY3RsX3NjaGVkcGFyYW1fdmNwdSAqdmNwdXM7Ci0KLSAgICByID0geGNf ZG9tYWluX2dldGluZm8oQ1RYLT54Y2gsIGRvbWlkLCAxLCAmaW5mbyk7Ci0gICAgaWYgKHIgPCAw KSB7Ci0gICAgICAgIExPR0VEKEVSUk9SLCBkb21pZCwgIkdldHRpbmcgZG9tYWluIGluZm8iKTsK LSAgICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAg ICBpZiAoc2NpbmZvLT5udW1fdmNwdXMgPD0gMCkgewotICAgICAgICByYyA9IEVSUk9SX0lOVkFM OwotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgewotICAgICAgICBudW1fdmNwdXMgPSBz Y2luZm8tPm51bV92Y3B1czsKLSAgICAgICAgR0NORVdfQVJSQVkodmNwdXMsIG51bV92Y3B1cyk7 Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmNwdXM7IGkrKykgewotICAgICAgICAgICAg aWYgKHNjaW5mby0+dmNwdXNbaV0udmNwdWlkIDwgMCB8fAotICAgICAgICAgICAgICAgIHNjaW5m by0+dmNwdXNbaV0udmNwdWlkID4gaW5mby5tYXhfdmNwdV9pZCkgewotICAgICAgICAgICAgICAg IExPR0QoRVJST1IsIGRvbWlkLCAiVkNQVSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsICIKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAidmFsaWQgdmFsdWVzIGFyZSB3aXRoaW4gcmFuZ2UgZnJv bSAwIHRvICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1heF92Y3B1X2lk KTsKLSAgICAgICAgICAgICAgICByYyA9IEVSUk9SX0lOVkFMOwotICAgICAgICAgICAgICAgIGdv dG8gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmNwdXNbaV0udmNwdWlkID0gc2Np bmZvLT52Y3B1c1tpXS52Y3B1aWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByID0geGNfc2No ZWRfcnRkc192Y3B1X2dldChDVFgtPnhjaCwgZG9taWQsIHZjcHVzLCBudW1fdmNwdXMpOwotICAg IGlmIChyICE9IDApIHsKLSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiR2V0dGluZyB2Y3B1 IHNjaGVkIHJ0ZHMiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAgICBnb3RvIG91 dDsKLSAgICB9Ci0gICAgc2NpbmZvLT5zY2hlZCA9IExJQlhMX1NDSEVEVUxFUl9SVERTOwotICAg IGZvciAoaSA9IDA7IGkgPCBudW1fdmNwdXM7IGkrKykgewotICAgICAgICBzY2luZm8tPnZjcHVz W2ldLnBlcmlvZCA9IHZjcHVzW2ldLnUucnRkcy5wZXJpb2Q7Ci0gICAgICAgIHNjaW5mby0+dmNw dXNbaV0uYnVkZ2V0ID0gdmNwdXNbaV0udS5ydGRzLmJ1ZGdldDsKLSAgICAgICAgc2NpbmZvLT52 Y3B1c1tpXS52Y3B1aWQgPSB2Y3B1c1tpXS52Y3B1aWQ7Ci0gICAgfQotICAgIHJjID0gMDsKLW91 dDoKLSAgICByZXR1cm4gcmM7Ci19Ci0KLS8qIEdldCB0aGUgUlREUyBzY2hlZHVsaW5nIHBhcmFt ZXRlcnMgb2YgYWxsIHZjcHVzIG9mIGEgZG9tYWluICovCi1zdGF0aWMgaW50IHNjaGVkX3J0ZHNf dmNwdV9nZXRfYWxsKGxpYnhsX19nYyAqZ2MsIHVpbnQzMl90IGRvbWlkLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyAqc2NpbmZvKQot ewotICAgIHVpbnQzMl90IG51bV92Y3B1czsKLSAgICBpbnQgaSwgciwgcmM7Ci0gICAgeGNfZG9t aW5mb190IGluZm87Ci0gICAgc3RydWN0IHhlbl9kb21jdGxfc2NoZWRwYXJhbV92Y3B1ICp2Y3B1 czsKLQotICAgIHIgPSB4Y19kb21haW5fZ2V0aW5mbyhDVFgtPnhjaCwgZG9taWQsIDEsICZpbmZv KTsKLSAgICBpZiAociA8IDApIHsKLSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiR2V0dGlu ZyBkb21haW4gaW5mbyIpOwotICAgICAgICByYyA9IEVSUk9SX0ZBSUw7Ci0gICAgICAgIGdvdG8g b3V0OwotICAgIH0KLQotICAgIGlmIChzY2luZm8tPm51bV92Y3B1cyA+IDApIHsKLSAgICAgICAg cmMgPSBFUlJPUl9JTlZBTDsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAg ICAgbnVtX3ZjcHVzID0gaW5mby5tYXhfdmNwdV9pZCArIDE7Ci0gICAgICAgIEdDTkVXX0FSUkFZ KHZjcHVzLCBudW1fdmNwdXMpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZjcHVzOyBp KyspCi0gICAgICAgICAgICB2Y3B1c1tpXS52Y3B1aWQgPSBpOwotICAgIH0KLQotICAgIHIgPSB4 Y19zY2hlZF9ydGRzX3ZjcHVfZ2V0KENUWC0+eGNoLCBkb21pZCwgdmNwdXMsIG51bV92Y3B1cyk7 Ci0gICAgaWYgKHIgIT0gMCkgewotICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJHZXR0aW5n IHZjcHUgc2NoZWQgcnRkcyIpOwotICAgICAgICByYyA9IEVSUk9SX0ZBSUw7Ci0gICAgICAgIGdv dG8gb3V0OwotICAgIH0KLSAgICBzY2luZm8tPnNjaGVkID0gTElCWExfU0NIRURVTEVSX1JURFM7 Ci0gICAgc2NpbmZvLT5udW1fdmNwdXMgPSBudW1fdmNwdXM7Ci0gICAgc2NpbmZvLT52Y3B1cyA9 IGxpYnhsX19jYWxsb2MoTk9HQywgbnVtX3ZjcHVzLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHNpemVvZihsaWJ4bF9zY2hlZF9wYXJhbXMpKTsKLQotICAgIGZvciAoaSA9IDA7 IGkgPCBudW1fdmNwdXM7IGkrKykgewotICAgICAgICBzY2luZm8tPnZjcHVzW2ldLnBlcmlvZCA9 IHZjcHVzW2ldLnUucnRkcy5wZXJpb2Q7Ci0gICAgICAgIHNjaW5mby0+dmNwdXNbaV0uYnVkZ2V0 ID0gdmNwdXNbaV0udS5ydGRzLmJ1ZGdldDsKLSAgICAgICAgc2NpbmZvLT52Y3B1c1tpXS52Y3B1 aWQgPSB2Y3B1c1tpXS52Y3B1aWQ7Ci0gICAgfQotICAgIHJjID0gMDsKLW91dDoKLSAgICByZXR1 cm4gcmM7Ci19Ci0KLS8qIFNldCB0aGUgUlREUyBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgb2YgdmNw dShzKSAqLwotc3RhdGljIGludCBzY2hlZF9ydGRzX3ZjcHVfc2V0KGxpYnhsX19nYyAqZ2MsIHVp bnQzMl90IGRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhs X3ZjcHVfc2NoZWRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgaW50IHIsIHJjOwotICAgIGludCBp OwotICAgIHVpbnQxNl90IG1heF92Y3B1aWQ7Ci0gICAgeGNfZG9taW5mb190IGluZm87Ci0gICAg c3RydWN0IHhlbl9kb21jdGxfc2NoZWRwYXJhbV92Y3B1ICp2Y3B1czsKLQotICAgIHIgPSB4Y19k b21haW5fZ2V0aW5mbyhDVFgtPnhjaCwgZG9taWQsIDEsICZpbmZvKTsKLSAgICBpZiAociA8IDAp IHsKLSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiR2V0dGluZyBkb21haW4gaW5mbyIpOwot ICAgICAgICByYyA9IEVSUk9SX0ZBSUw7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBt YXhfdmNwdWlkID0gaW5mby5tYXhfdmNwdV9pZDsKLQotICAgIGlmIChzY2luZm8tPm51bV92Y3B1 cyA8PSAwKSB7Ci0gICAgICAgIHJjID0gRVJST1JfSU5WQUw7Ci0gICAgICAgIGdvdG8gb3V0Owot ICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2NpbmZvLT5udW1fdmNwdXM7IGkrKykgewotICAg ICAgICBpZiAoc2NpbmZvLT52Y3B1c1tpXS52Y3B1aWQgPCAwIHx8Ci0gICAgICAgICAgICBzY2lu Zm8tPnZjcHVzW2ldLnZjcHVpZCA+IG1heF92Y3B1aWQpIHsKLSAgICAgICAgICAgIExPR0QoRVJS T1IsIGRvbWlkLCAiSW52YWxpZCBWQ1BVICVkOiB2YWxpZCByYW5nZSBpcyBbMCwgJWRdIiwKLSAg ICAgICAgICAgICAgICAgICAgICAgIHNjaW5mby0+dmNwdXNbaV0udmNwdWlkLCBtYXhfdmNwdWlk KTsKLSAgICAgICAgICAgIHJjID0gRVJST1JfSU5WQUw7Ci0gICAgICAgICAgICBnb3RvIG91dDsK LSAgICAgICAgfQotICAgICAgICByYyA9IHNjaGVkX3J0ZHNfdmFsaWRhdGVfcGFyYW1zKGdjLCBz Y2luZm8tPnZjcHVzW2ldLnBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzY2luZm8tPnZjcHVzW2ldLmJ1ZGdldCk7Ci0gICAgICAgIGlmIChyYykgewotICAg ICAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKLSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAg ICB9Ci0gICAgfQotICAgIEdDTkVXX0FSUkFZKHZjcHVzLCBzY2luZm8tPm51bV92Y3B1cyk7Ci0g ICAgZm9yIChpID0gMDsgaSA8IHNjaW5mby0+bnVtX3ZjcHVzOyBpKyspIHsKLSAgICAgICAgdmNw dXNbaV0udmNwdWlkID0gc2NpbmZvLT52Y3B1c1tpXS52Y3B1aWQ7Ci0gICAgICAgIHZjcHVzW2ld LnUucnRkcy5wZXJpb2QgPSBzY2luZm8tPnZjcHVzW2ldLnBlcmlvZDsKLSAgICAgICAgdmNwdXNb aV0udS5ydGRzLmJ1ZGdldCA9IHNjaW5mby0+dmNwdXNbaV0uYnVkZ2V0OwotICAgIH0KLQotICAg IHIgPSB4Y19zY2hlZF9ydGRzX3ZjcHVfc2V0KENUWC0+eGNoLCBkb21pZCwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB2Y3B1cywgc2NpbmZvLT5udW1fdmNwdXMpOwotICAgIGlmIChy ICE9IDApIHsKLSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiU2V0dGluZyB2Y3B1IHNjaGVk IHJ0ZHMiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAgICBnb3RvIG91dDsKLSAg ICB9Ci0gICAgcmMgPSAwOwotb3V0OgotICAgIHJldHVybiByYzsKLX0KLQotLyogU2V0IHRoZSBS VERTIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBvZiBhbGwgdmNwdXMgb2YgYSBkb21haW4gKi8KLXN0 YXRpYyBpbnQgc2NoZWRfcnRkc192Y3B1X3NldF9hbGwobGlieGxfX2djICpnYywgdWludDMyX3Qg ZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX3Zj cHVfc2NoZWRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgaW50IHIsIHJjOwotICAgIGludCBpOwot ICAgIHVpbnQxNl90IG1heF92Y3B1aWQ7Ci0gICAgeGNfZG9taW5mb190IGluZm87Ci0gICAgc3Ry dWN0IHhlbl9kb21jdGxfc2NoZWRwYXJhbV92Y3B1ICp2Y3B1czsKLSAgICB1aW50MzJfdCBudW1f dmNwdXM7Ci0KLSAgICByID0geGNfZG9tYWluX2dldGluZm8oQ1RYLT54Y2gsIGRvbWlkLCAxLCAm aW5mbyk7Ci0gICAgaWYgKHIgPCAwKSB7Ci0gICAgICAgIExPR0VEKEVSUk9SLCBkb21pZCwgIkdl dHRpbmcgZG9tYWluIGluZm8iKTsKLSAgICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAgICBn b3RvIG91dDsKLSAgICB9Ci0gICAgbWF4X3ZjcHVpZCA9IGluZm8ubWF4X3ZjcHVfaWQ7Ci0KLSAg ICBpZiAoc2NpbmZvLT5udW1fdmNwdXMgIT0gMSkgewotICAgICAgICByYyA9IEVSUk9SX0lOVkFM OwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKHNjaGVkX3J0ZHNfdmFsaWRhdGVf cGFyYW1zKGdjLCBzY2luZm8tPnZjcHVzWzBdLnBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc2NpbmZvLT52Y3B1c1swXS5idWRnZXQpKSB7Ci0gICAgICAgIHJjID0g RVJST1JfSU5WQUw7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBudW1fdmNwdXMgPSBt YXhfdmNwdWlkICsgMTsKLSAgICBHQ05FV19BUlJBWSh2Y3B1cywgbnVtX3ZjcHVzKTsKLSAgICBm b3IgKGkgPSAwOyBpIDwgbnVtX3ZjcHVzOyBpKyspIHsKLSAgICAgICAgdmNwdXNbaV0udmNwdWlk ID0gaTsKLSAgICAgICAgdmNwdXNbaV0udS5ydGRzLnBlcmlvZCA9IHNjaW5mby0+dmNwdXNbMF0u cGVyaW9kOwotICAgICAgICB2Y3B1c1tpXS51LnJ0ZHMuYnVkZ2V0ID0gc2NpbmZvLT52Y3B1c1sw XS5idWRnZXQ7Ci0gICAgfQotCi0gICAgciA9IHhjX3NjaGVkX3J0ZHNfdmNwdV9zZXQoQ1RYLT54 Y2gsIGRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjcHVzLCBudW1fdmNw dXMpOwotICAgIGlmIChyICE9IDApIHsKLSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiU2V0 dGluZyB2Y3B1IHNjaGVkIHJ0ZHMiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9GQUlMOwotICAgICAg ICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSAwOwotb3V0OgotICAgIHJldHVybiByYzsKLX0K LQotc3RhdGljIGludCBzY2hlZF9ydGRzX2RvbWFpbl9nZXQobGlieGxfX2djICpnYywgdWludDMy X3QgZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZG9tYWluX3Nj aGVkX3BhcmFtcyAqc2NpbmZvKQotewotICAgIHN0cnVjdCB4ZW5fZG9tY3RsX3NjaGVkX3J0ZHMg c2RvbTsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IHhjX3NjaGVkX3J0ZHNfZG9tYWluX2dldChD VFgtPnhjaCwgZG9taWQsICZzZG9tKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBMT0dF RChFUlJPUiwgZG9taWQsICJHZXR0aW5nIGRvbWFpbiBzY2hlZCBydGRzIik7Ci0gICAgICAgIHJl dHVybiBFUlJPUl9GQUlMOwotICAgIH0KLQotICAgIGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNf aW5pdChzY2luZm8pOwotCi0gICAgc2NpbmZvLT5zY2hlZCA9IExJQlhMX1NDSEVEVUxFUl9SVERT OwotICAgIHNjaW5mby0+cGVyaW9kID0gc2RvbS5wZXJpb2Q7Ci0gICAgc2NpbmZvLT5idWRnZXQg PSBzZG9tLmJ1ZGdldDsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNjaGVkX3J0 ZHNfZG9tYWluX3NldChsaWJ4bF9fZ2MgKmdjLCB1aW50MzJfdCBkb21pZCwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2lu Zm8pCi17Ci0gICAgc3RydWN0IHhlbl9kb21jdGxfc2NoZWRfcnRkcyBzZG9tOwotICAgIGludCBy YzsKLQotICAgIHJjID0geGNfc2NoZWRfcnRkc19kb21haW5fZ2V0KENUWC0+eGNoLCBkb21pZCwg JnNkb20pOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIExPR0VEKEVSUk9SLCBkb21pZCwg IkdldHRpbmcgZG9tYWluIHNjaGVkIHJ0ZHMiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7 Ci0gICAgfQotICAgIGlmIChzY2luZm8tPnBlcmlvZCAhPSBMSUJYTF9ET01BSU5fU0NIRURfUEFS QU1fUEVSSU9EX0RFRkFVTFQpCi0gICAgICAgIHNkb20ucGVyaW9kID0gc2NpbmZvLT5wZXJpb2Q7 Ci0gICAgaWYgKHNjaW5mby0+YnVkZ2V0ICE9IExJQlhMX0RPTUFJTl9TQ0hFRF9QQVJBTV9CVURH RVRfREVGQVVMVCkKLSAgICAgICAgc2RvbS5idWRnZXQgPSBzY2luZm8tPmJ1ZGdldDsKLSAgICBp ZiAoc2NoZWRfcnRkc192YWxpZGF0ZV9wYXJhbXMoZ2MsIHNkb20ucGVyaW9kLCBzZG9tLmJ1ZGdl dCkpCi0gICAgICAgIHJldHVybiBFUlJPUl9JTlZBTDsKLQotICAgIHJjID0geGNfc2NoZWRfcnRk c19kb21haW5fc2V0KENUWC0+eGNoLCBkb21pZCwgJnNkb20pOwotICAgIGlmIChyYyA8IDApIHsK LSAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiU2V0dGluZyBkb21haW4gc2NoZWQgcnRkcyIp OwotICAgICAgICByZXR1cm4gRVJST1JfRkFJTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0K LQotaW50IGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfc2V0KGxpYnhsX2N0eCAqY3R4LCB1aW50 MzJfdCBkb21pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4 bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgR0NfSU5JVChjdHgpOwotICAg IGxpYnhsX3NjaGVkdWxlciBzY2hlZCA9IHNjaW5mby0+c2NoZWQ7Ci0gICAgaW50IHJldDsKLQot ICAgIGlmIChzY2hlZCA9PSBMSUJYTF9TQ0hFRFVMRVJfVU5LTk9XTikKLSAgICAgICAgc2NoZWQg PSBsaWJ4bF9fZG9tYWluX3NjaGVkdWxlcihnYywgZG9taWQpOwotCi0gICAgc3dpdGNoIChzY2hl ZCkgewotICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1NFREY6Ci0gICAgICAgIExPR0QoRVJST1Is IGRvbWlkLCAiU0VERiBzY2hlZHVsZXIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOwotICAgICAgICBy ZXQ9RVJST1JfRkVBVFVSRV9SRU1PVkVEOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhM X1NDSEVEVUxFUl9DUkVESVQ6Ci0gICAgICAgIHJldD1zY2hlZF9jcmVkaXRfZG9tYWluX3NldChn YywgZG9taWQsIHNjaW5mbyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTElCWExfU0NIRURV TEVSX0NSRURJVDI6Ci0gICAgICAgIHJldD1zY2hlZF9jcmVkaXQyX2RvbWFpbl9zZXQoZ2MsIGRv bWlkLCBzY2luZm8pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9B UklOQzY1MzoKLSAgICAgICAgcmV0PXNjaGVkX2FyaW5jNjUzX2RvbWFpbl9zZXQoZ2MsIGRvbWlk LCBzY2luZm8pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9SVERT OgotICAgICAgICByZXQ9c2NoZWRfcnRkc19kb21haW5fc2V0KGdjLCBkb21pZCwgc2NpbmZvKTsK LSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRChFUlJPUiwgZG9taWQs ICJVbmtub3duIHNjaGVkdWxlciIpOwotICAgICAgICByZXQ9RVJST1JfSU5WQUw7Ci0gICAgICAg IGJyZWFrOwotICAgIH0KLQotICAgIEdDX0ZSRUU7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50 IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX3NldChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgZG9t aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX3ZjcHVfc2No ZWRfcGFyYW1zICpzY2luZm8pCi17Ci0gICAgR0NfSU5JVChjdHgpOwotICAgIGxpYnhsX3NjaGVk dWxlciBzY2hlZCA9IHNjaW5mby0+c2NoZWQ7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKHNjaGVk ID09IExJQlhMX1NDSEVEVUxFUl9VTktOT1dOKQotICAgICAgICBzY2hlZCA9IGxpYnhsX19kb21h aW5fc2NoZWR1bGVyKGdjLCBkb21pZCk7Ci0KLSAgICBzd2l0Y2ggKHNjaGVkKSB7Ci0gICAgY2Fz ZSBMSUJYTF9TQ0hFRFVMRVJfU0VERjoKLSAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJTRURG IHNjaGVkdWxlciBubyBsb25nZXIgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJjID0gRVJST1JfRkVB VFVSRV9SRU1PVkVEOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9D UkVESVQ6Ci0gICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUMjoKLSAgICBjYXNlIExJQlhM X1NDSEVEVUxFUl9BUklOQzY1MzoKLSAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJwZXItVkNQ VSBwYXJhbWV0ZXIgc2V0dGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHNjaGVkdWxlciIpOwot ICAgICAgICByYyA9IEVSUk9SX0lOVkFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhM X1NDSEVEVUxFUl9SVERTOgotICAgICAgICByYyA9IHNjaGVkX3J0ZHNfdmNwdV9zZXQoZ2MsIGRv bWlkLCBzY2luZm8pOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dE KEVSUk9SLCBkb21pZCwgIlVua25vd24gc2NoZWR1bGVyIik7Ci0gICAgICAgIHJjID0gRVJST1Jf SU5WQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEdDX0ZSRUU7Ci0gICAgcmV0dXJu IHJjOwotfQotCi1pbnQgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXNfc2V0X2FsbChsaWJ4bF9jdHgg KmN0eCwgdWludDMyX3QgZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyAqc2NpbmZvKQotewotICAgIEdDX0lOSVQo Y3R4KTsKLSAgICBsaWJ4bF9zY2hlZHVsZXIgc2NoZWQgPSBzY2luZm8tPnNjaGVkOwotICAgIGlu dCByYzsKLQotICAgIGlmIChzY2hlZCA9PSBMSUJYTF9TQ0hFRFVMRVJfVU5LTk9XTikKLSAgICAg ICAgc2NoZWQgPSBsaWJ4bF9fZG9tYWluX3NjaGVkdWxlcihnYywgZG9taWQpOwotCi0gICAgc3dp dGNoIChzY2hlZCkgewotICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1NFREY6Ci0gICAgICAgIExP R0QoRVJST1IsIGRvbWlkLCAiU0VERiBzY2hlZHVsZXIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOwot ICAgICAgICByYyA9IEVSUk9SX0ZFQVRVUkVfUkVNT1ZFRDsKLSAgICAgICAgYnJlYWs7Ci0gICAg Y2FzZSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUOgotICAgIGNhc2UgTElCWExfU0NIRURVTEVSX0NS RURJVDI6Ci0gICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQVJJTkM2NTM6Ci0gICAgICAgIExPR0Qo RVJST1IsIGRvbWlkLCAicGVyLVZDUFUgcGFyYW1ldGVyIHNldHRpbmcgbm90IHN1cHBvcnRlZCBm b3IgdGhpcyBzY2hlZHVsZXIiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKLSAgICAgICAg YnJlYWs7Ci0gICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfUlREUzoKLSAgICAgICAgcmMgPSBzY2hl ZF9ydGRzX3ZjcHVfc2V0X2FsbChnYywgZG9taWQsIHNjaW5mbyk7Ci0gICAgICAgIGJyZWFrOwot ICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR0QoRVJST1IsIGRvbWlkLCAiVW5rbm93biBzY2hlZHVs ZXIiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQot Ci0gICAgR0NfRlJFRTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBsaWJ4bF9kb21haW5fc2No ZWRfcGFyYW1zX2dldChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgZG9taWQsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFtcyAqc2NpbmZv KQotewotICAgIEdDX0lOSVQoY3R4KTsKLSAgICBpbnQgcmV0OwotCi0gICAgbGlieGxfZG9tYWlu X3NjaGVkX3BhcmFtc19pbml0KHNjaW5mbyk7Ci0KLSAgICBzY2luZm8tPnNjaGVkID0gbGlieGxf X2RvbWFpbl9zY2hlZHVsZXIoZ2MsIGRvbWlkKTsKLQotICAgIHN3aXRjaCAoc2NpbmZvLT5zY2hl ZCkgewotICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1NFREY6Ci0gICAgICAgIExPR0QoRVJST1Is IGRvbWlkLCAiU0VERiBzY2hlZHVsZXIgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOwotICAgICAgICBy ZXQ9RVJST1JfRkVBVFVSRV9SRU1PVkVEOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhM X1NDSEVEVUxFUl9DUkVESVQ6Ci0gICAgICAgIHJldD1zY2hlZF9jcmVkaXRfZG9tYWluX2dldChn YywgZG9taWQsIHNjaW5mbyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTElCWExfU0NIRURV TEVSX0NSRURJVDI6Ci0gICAgICAgIHJldD1zY2hlZF9jcmVkaXQyX2RvbWFpbl9nZXQoZ2MsIGRv bWlkLCBzY2luZm8pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9S VERTOgotICAgICAgICByZXQ9c2NoZWRfcnRkc19kb21haW5fZ2V0KGdjLCBkb21pZCwgc2NpbmZv KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRChFUlJPUiwgZG9t aWQsICJVbmtub3duIHNjaGVkdWxlciIpOwotICAgICAgICByZXQ9RVJST1JfSU5WQUw7Ci0gICAg ICAgIGJyZWFrOwotICAgIH0KLQotICAgIEdDX0ZSRUU7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQot aW50IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2dldChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3Qg ZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX3ZjcHVfc2NoZWRf cGFyYW1zICpzY2luZm8pCi17Ci0gICAgR0NfSU5JVChjdHgpOwotICAgIGludCByYzsKLQotICAg IHNjaW5mby0+c2NoZWQgPSBsaWJ4bF9fZG9tYWluX3NjaGVkdWxlcihnYywgZG9taWQpOwotCi0g ICAgc3dpdGNoIChzY2luZm8tPnNjaGVkKSB7Ci0gICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfU0VE RjoKLSAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJTRURGIHNjaGVkdWxlciBpcyBubyBsb25n ZXIgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJjID0gRVJST1JfRkVBVFVSRV9SRU1PVkVEOwotICAg ICAgICBicmVhazsKLSAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9DUkVESVQ6Ci0gICAgY2FzZSBM SUJYTF9TQ0hFRFVMRVJfQ1JFRElUMjoKLSAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9BUklOQzY1 MzoKLSAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJwZXItVkNQVSBwYXJhbWV0ZXIgZ2V0dGlu ZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHNjaGVkdWxlciIpOwotICAgICAgICByYyA9IEVSUk9S X0lOVkFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9SVERTOgot ICAgICAgICByYyA9IHNjaGVkX3J0ZHNfdmNwdV9nZXQoZ2MsIGRvbWlkLCBzY2luZm8pOwotICAg ICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dEKEVSUk9SLCBkb21pZCwgIlVu a25vd24gc2NoZWR1bGVyIik7Ci0gICAgICAgIHJjID0gRVJST1JfSU5WQUw7Ci0gICAgICAgIGJy ZWFrOwotICAgIH0KLQotICAgIEdDX0ZSRUU7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgbGli eGxfdmNwdV9zY2hlZF9wYXJhbXNfZ2V0X2FsbChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgZG9t aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVk X3BhcmFtcyAqc2NpbmZvKQotewotICAgIEdDX0lOSVQoY3R4KTsKLSAgICBpbnQgcmM7Ci0KLSAg ICBzY2luZm8tPnNjaGVkID0gbGlieGxfX2RvbWFpbl9zY2hlZHVsZXIoZ2MsIGRvbWlkKTsKLQot ICAgIHN3aXRjaCAoc2NpbmZvLT5zY2hlZCkgewotICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1NF REY6Ci0gICAgICAgIExPR0QoRVJST1IsIGRvbWlkLCAiU0VERiBzY2hlZHVsZXIgaXMgbm8gbG9u Z2VyIGF2YWlsYWJsZSIpOwotICAgICAgICByYyA9IEVSUk9SX0ZFQVRVUkVfUkVNT1ZFRDsKLSAg ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUOgotICAgIGNhc2Ug TElCWExfU0NIRURVTEVSX0NSRURJVDI6Ci0gICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQVJJTkM2 NTM6Ci0gICAgICAgIExPR0QoRVJST1IsIGRvbWlkLCAicGVyLVZDUFUgcGFyYW1ldGVyIGdldHRp bmcgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBzY2hlZHVsZXIiKTsKLSAgICAgICAgcmMgPSBFUlJP Ul9JTlZBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfUlREUzoK LSAgICAgICAgcmMgPSBzY2hlZF9ydGRzX3ZjcHVfZ2V0X2FsbChnYywgZG9taWQsIHNjaW5mbyk7 Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR0QoRVJST1IsIGRvbWlk LCAiVW5rbm93biBzY2hlZHVsZXIiKTsKLSAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKLSAgICAg ICAgYnJlYWs7Ci0gICAgfQotCi0gICAgR0NfRlJFRTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KIHN0 YXRpYyBpbnQgbGlieGxfX2RvbWFpbl9zM19yZXN1bWUobGlieGxfX2djICpnYywgaW50IGRvbWlk KQogewogICAgIGludCByYyA9IDA7CmRpZmYgLS1naXQgYS90b29scy9saWJ4bC9saWJ4bF9zY2hl ZC5jIGIvdG9vbHMvbGlieGwvbGlieGxfc2NoZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi44NGQzODM3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGlieGwvbGlieGxf c2NoZWQuYwpAQCAtMCwwICsxLDkxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTcgQ2l0 cml4IEx0ZCBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lv biAyLjEgb25seS4gd2l0aCB0aGUgc3BlY2lhbAorICogZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVz Y3JpYmVkIGluIGZpbGUgTElDRU5TRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl CisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K KyAqLworCisjaW5jbHVkZSAibGlieGxfb3NkZXBzLmgiCisKKyNpbmNsdWRlICJsaWJ4bF9pbnRl cm5hbC5oIgorCitzdGF0aWMgaW50IGxpYnhsX19zZXRfdmNwdWFmZmluaXR5KGxpYnhsX2N0eCAq Y3R4LCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dWludDMyX3QgdmNwdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBsaWJ4bF9iaXRtYXAgKmNwdW1hcF9oYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBsaWJ4bF9iaXRtYXAgKmNwdW1hcF9zb2Z0LAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBHQ19JTklUKGN0eCk7 CisgICAgbGlieGxfYml0bWFwIGhhcmQsIHNvZnQ7CisgICAgaW50IHJjOworCisgICAgbGlieGxf Yml0bWFwX2luaXQoJmhhcmQpOworICAgIGxpYnhsX2JpdG1hcF9pbml0KCZzb2Z0KTsKKworICAg IGlmICghY3B1bWFwX2hhcmQgJiYgIWNwdW1hcF9zb2Z0ICYmICFmbGFncykgeworICAgICAgICBy YyA9IEVSUk9SX0lOVkFMOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKgorICAg ICAqIFhlbiB3YW50cyB3cml0YWJsZSBoYXJkIGFuZC9vciBzb2Z0IGNwdW1hcHMsIHRvIHB1dCBi YWNrIGluIHRoZW0KKyAgICAgKiB0aGUgZWZmZWN0aXZlIGhhcmQgYW5kL29yIHNvZnQgYWZmaW5p dHkgdGhhdCB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgaWYgKGNwdW1hcF9oYXJkKSB7Cisg ICAgICAgIHJjID0gbGlieGxfY3B1X2JpdG1hcF9hbGxvYyhjdHgsICZoYXJkLCAwKTsKKyAgICAg ICAgaWYgKHJjKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgbGlieGxfX2JpdG1h cF9jb3B5X2Jlc3RfZWZmb3J0KGdjLCAmaGFyZCwgY3B1bWFwX2hhcmQpOworICAgICAgICBmbGFn cyB8PSBYRU5fVkNQVUFGRklOSVRZX0hBUkQ7CisgICAgfQorICAgIGlmIChjcHVtYXBfc29mdCkg eworICAgICAgICByYyA9IGxpYnhsX2NwdV9iaXRtYXBfYWxsb2MoY3R4LCAmc29mdCwgMCk7Cisg ICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgIGxpYnhsX19i aXRtYXBfY29weV9iZXN0X2VmZm9ydChnYywgJnNvZnQsIGNwdW1hcF9zb2Z0KTsKKyAgICAgICAg ZmxhZ3MgfD0gWEVOX1ZDUFVBRkZJTklUWV9TT0ZUOworICAgIH0KKworICAgIGlmICh4Y192Y3B1 X3NldGFmZmluaXR5KGN0eC0+eGNoLCBkb21pZCwgdmNwdWlkLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNwdW1hcF9oYXJkID8gaGFyZC5tYXAgOiBOVUxMLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNwdW1hcF9zb2Z0ID8gc29mdC5tYXAgOiBOVUxMLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJT ZXR0aW5nIHZjcHUgYWZmaW5pdHkiKTsKKyAgICAgICAgcmMgPSBFUlJPUl9GQUlMOworICAgICAg ICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIExldCdzIGNoZWNrIHRoZSByZXN1 bHRzLiBIYXJkIGFmZmluaXR5IHdpbGwgbmV2ZXIgYmUgZW1wdHksIGJ1dCBpdAorICAgICAqIGlz IHBvc3NpYmxlIHRoYXQgWGVuIHdpbGwgdXNlIHNvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSB3aGF0 IHdlIGFza2VkCisgICAgICogZm9yIHZhcmlvdXMgcmVhc29ucy4gSWYgdGhhdCdzIHRoZSBjYXNl LCByZXBvcnQgaXQuCisgICAgICovCisgICAgaWYgKGNwdW1hcF9oYXJkICYmCisgICAgICAgICFs aWJ4bF9iaXRtYXBfZXF1YWwoY3B1bWFwX2hhcmQsICZoYXJkLCAwKSkKKyAgICAgICAgTE9HRChE RUJVRywgZG9taWQsICJOZXcgaGFyZCBhZmZpbml0eSBmb3IgdmNwdSAlZCBoYXMgdW5yZWFjaGFi bGUgY3B1cyIsIHZjcHVpZCk7CisgICAgLyoKKyAgICAgKiBTb2Z0IGFmZmluaXR5IGNhbiBib3Ro IGJlIGRpZmZlcmVudCBmcm9tIHdoYXQgYXNrZWQgYW5kIGVtcHR5LiBDaGVjaworICAgICAqIGZv ciAoYW5kIHJlcG9ydCkgYm90aC4KKyAgICAgKi8KKyAgICBpZiAoY3B1bWFwX3NvZnQpIHsKKyAg ICAgICAgaWYgKCFsaWJ4bF9iaXRtYXBfZXF1YWwoY3B1bWFwX3NvZnQsICZzb2Z0LCAwKSkKKyAg ICAgICAgICAgIExPR0QoREVCVUcsIGRvbWlkLCAiTmV3IHNvZnQgYWZmaW5pdHkgZm9yIHZjcHUg JWQgaGFzIHVucmVhY2hhYmxlIGNwdXMiLAorICAgICAgICAgICAgICAgICB2Y3B1aWQpOworICAg ICAgICBpZiAobGlieGxfYml0bWFwX2lzX2VtcHR5KCZzb2Z0KSkKKyAgICAgICAgICAgIExPR0Qo V0FSTiwgZG9taWQsICJBbGwgY3B1cyBpbiBzb2Z0IGFmZmluaXR5IG9mIHZjcHUgJWQgYXJlIHVu cmVhY2hhYmxlLiIKKyAgICAgICAgICAgICAgICAgIiBPbmx5IGhhcmQgYWZmaW5pdHkgd2lsbCBi ZSBjb25zaWRlcmVkIGZvciBzY2hlZHVsaW5nIiwKKyAgICAgICAgICAgICAgICAgdmNwdWlkKTsK KyAgICB9CisKKyAgICByYyA9IDA7Cisgb3V0OgorICAgIGxpYnhsX2JpdG1hcF9kaXNwb3NlKCZo YXJkKTsKKyAgICBsaWJ4bF9iaXRtYXBfZGlzcG9zZSgmc29mdCk7CisgICAgR0NfRlJFRTsKKyAg ICByZXR1cm4gcmM7Cit9CisKK2ludCBsaWJ4bF9zZXRfdmNwdWFmZmluaXR5KGxpYnhsX2N0eCAq Y3R4LCB1aW50MzJfdCBkb21pZCwgdWludDMyX3QgdmNwdWlkLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgbGlieGxfYml0bWFwICpjcHVtYXBfaGFyZCwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IGxpYnhsX2JpdG1hcCAqY3B1bWFwX3NvZnQpCit7CisgICAgcmV0 dXJuIGxpYnhsX19zZXRfdmNwdWFmZmluaXR5KGN0eCwgZG9taWQsIHZjcHVpZCwgY3B1bWFwX2hh cmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdW1hcF9zb2Z0LCAwKTsK K30KKworaW50IGxpYnhsX3NldF92Y3B1YWZmaW5pdHlfZm9yY2UobGlieGxfY3R4ICpjdHgsIHVp bnQzMl90IGRvbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qg dmNwdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlieGxfYml0 bWFwICpjcHVtYXBfaGFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IGxpYnhsX2JpdG1hcCAqY3B1bWFwX3NvZnQpCit7CisgICAgcmV0dXJuIGxpYnhsX19zZXRfdmNw dWFmZmluaXR5KGN0eCwgZG9taWQsIHZjcHVpZCwgY3B1bWFwX2hhcmQsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNwdW1hcF9zb2Z0LCBYRU5fVkNQVUFGRklOSVRZX0ZPUkNF KTsKK30KKworaW50IGxpYnhsX3NldF92Y3B1YWZmaW5pdHlfYWxsKGxpYnhsX2N0eCAqY3R4LCB1 aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBp bnQgbWF4X3ZjcHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhs X2JpdG1hcCAqY3B1bWFwX2hhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u c3QgbGlieGxfYml0bWFwICpjcHVtYXBfc29mdCkKK3sKKyAgICBHQ19JTklUKGN0eCk7CisgICAg aW50IGksIHJjID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfdmNwdXM7IGkrKykgewor ICAgICAgICBpZiAobGlieGxfc2V0X3ZjcHVhZmZpbml0eShjdHgsIGRvbWlkLCBpLCBjcHVtYXBf aGFyZCwgY3B1bWFwX3NvZnQpKSB7CisgICAgICAgICAgICBMT0dEKFdBUk4sIGRvbWlkLCAiRmFp bGVkIHRvIHNldCBhZmZpbml0eSBmb3IgJWQiLCBpKTsKKyAgICAgICAgICAgIHJjID0gRVJST1Jf RkFJTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEdDX0ZSRUU7CisgICAgcmV0dXJuIHJjOwor fQorCitpbnQgbGlieGxfZG9tYWluX3NldF9ub2RlYWZmaW5pdHkobGlieGxfY3R4ICpjdHgsIHVp bnQzMl90IGRvbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX2Jp dG1hcCAqbm9kZW1hcCkKK3sKKyAgICBHQ19JTklUKGN0eCk7CisgICAgaWYgKHhjX2RvbWFpbl9u b2RlX3NldGFmZmluaXR5KGN0eC0+eGNoLCBkb21pZCwgbm9kZW1hcC0+bWFwKSkgeworICAgICAg ICBMT0dFRChFUlJPUiwgZG9taWQsICJTZXR0aW5nIG5vZGUgYWZmaW5pdHkiKTsKKyAgICAgICAg R0NfRlJFRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7CisgICAgfQorICAgIEdDX0ZSRUU7 CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsaWJ4bF9kb21haW5fZ2V0X25vZGVhZmZpbml0eShs aWJ4bF9jdHggKmN0eCwgdWludDMyX3QgZG9taWQsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbGlieGxfYml0bWFwICpub2RlbWFwKQoreworICAgIEdDX0lOSVQoY3R4KTsKKyAg ICBpZiAoeGNfZG9tYWluX25vZGVfZ2V0YWZmaW5pdHkoY3R4LT54Y2gsIGRvbWlkLCBub2RlbWFw LT5tYXApKSB7CisgICAgICAgIExPR0VEKEVSUk9SLCBkb21pZCwgIkdldHRpbmcgbm9kZSBhZmZp bml0eSIpOworICAgICAgICBHQ19GUkVFOworICAgICAgICByZXR1cm4gRVJST1JfRkFJTDsKKyAg ICB9CisgICAgR0NfRlJFRTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxpYnhsX2dldF9zY2hl ZHVsZXIobGlieGxfY3R4ICpjdHgpCit7CisgICAgaW50IHIsIHNjaGVkOworCisgICAgR0NfSU5J VChjdHgpOworICAgIHIgPSB4Y19zY2hlZF9pZChjdHgtPnhjaCwgJnNjaGVkKTsKKyAgICBpZiAo ciAhPSAwKSB7CisgICAgICAgIExPR0UoRVJST1IsICJnZXR0aW5nIGN1cnJlbnQgc2NoZWR1bGVy IGlkIik7CisgICAgICAgIHNjaGVkID0gRVJST1JfRkFJTDsKKyAgICB9CisgICAgR0NfRlJFRTsK KyAgICByZXR1cm4gc2NoZWQ7Cit9CisKK3N0YXRpYyBpbnQgc2NoZWRfYXJpbmM2NTNfZG9tYWlu X3NldChsaWJ4bF9fZ2MgKmdjLCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2luZm8p Cit7CisgICAgLyogQ3VycmVudGx5LCB0aGUgQVJJTkMgNjUzIHNjaGVkdWxlciBkb2VzIG5vdCB0 YWtlIGFueSBkb21haW4tc3BlY2lmaWMKKyAgICAgICAgIGNvbmZpZ3VyYXRpb24sIHNvIHdlIHNp bXBseSByZXR1cm4gc3VjY2Vzcy4gKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBz Y2hlZF9jcmVkaXRfZG9tYWluX2dldChsaWJ4bF9fZ2MgKmdjLCB1aW50MzJfdCBkb21pZCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFt cyAqc2NpbmZvKQoreworICAgIHN0cnVjdCB4ZW5fZG9tY3RsX3NjaGVkX2NyZWRpdCBzZG9tOwor ICAgIGludCByYzsKKworICAgIHJjID0geGNfc2NoZWRfY3JlZGl0X2RvbWFpbl9nZXQoQ1RYLT54 Y2gsIGRvbWlkLCAmc2RvbSk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgTE9HRUQoRVJS T1IsIGRvbWlkLCAiR2V0dGluZyBkb21haW4gc2NoZWQgY3JlZGl0Iik7CisgICAgICAgIHJldHVy biBFUlJPUl9GQUlMOworICAgIH0KKworICAgIGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfaW5p dChzY2luZm8pOworICAgIHNjaW5mby0+c2NoZWQgPSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUOwor ICAgIHNjaW5mby0+d2VpZ2h0ID0gc2RvbS53ZWlnaHQ7CisgICAgc2NpbmZvLT5jYXAgPSBzZG9t LmNhcDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaGVkX2NyZWRpdF9kb21h aW5fc2V0KGxpYnhsX19nYyAqZ2MsIHVpbnQzMl90IGRvbWlkLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2luZm8p Cit7CisgICAgc3RydWN0IHhlbl9kb21jdGxfc2NoZWRfY3JlZGl0IHNkb207CisgICAgeGNfZG9t YWluaW5mb190IGRvbWFpbmluZm87CisgICAgaW50IHJjOworCisgICAgcmMgPSB4Y19kb21haW5f Z2V0aW5mb2xpc3QoQ1RYLT54Y2gsIGRvbWlkLCAxLCAmZG9tYWluaW5mbyk7CisgICAgaWYgKHJj IDwgMCkgeworICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJHZXR0aW5nIGRvbWFpbiBpbmZv IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7CisgICAgfQorICAgIGlmIChyYyAh PSAxIHx8IGRvbWFpbmluZm8uZG9tYWluICE9IGRvbWlkKQorICAgICAgICByZXR1cm4gRVJST1Jf SU5WQUw7CisKKyAgICByYyA9IHhjX3NjaGVkX2NyZWRpdF9kb21haW5fZ2V0KENUWC0+eGNoLCBk b21pZCwgJnNkb20pOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0VEKEVSUk9SLCBk b21pZCwgIkdldHRpbmcgZG9tYWluIHNjaGVkIGNyZWRpdCIpOworICAgICAgICByZXR1cm4gRVJS T1JfRkFJTDsKKyAgICB9CisKKyAgICBpZiAoc2NpbmZvLT53ZWlnaHQgIT0gTElCWExfRE9NQUlO X1NDSEVEX1BBUkFNX1dFSUdIVF9ERUZBVUxUKSB7CisgICAgICAgIGlmIChzY2luZm8tPndlaWdo dCA8IDEgfHwgc2NpbmZvLT53ZWlnaHQgPiA2NTUzNSkgeworICAgICAgICAgICAgTE9HRChFUlJP UiwgZG9taWQsICJDcHUgd2VpZ2h0IG91dCBvZiByYW5nZSwgIgorICAgICAgICAgICAgICAgICAi dmFsaWQgdmFsdWVzIGFyZSB3aXRoaW4gcmFuZ2UgZnJvbSAxIHRvIDY1NTM1Iik7CisgICAgICAg ICAgICByZXR1cm4gRVJST1JfSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgc2RvbS53ZWlnaHQg PSBzY2luZm8tPndlaWdodDsKKyAgICB9CisKKyAgICBpZiAoc2NpbmZvLT5jYXAgIT0gTElCWExf RE9NQUlOX1NDSEVEX1BBUkFNX0NBUF9ERUZBVUxUKSB7CisgICAgICAgIGlmIChzY2luZm8tPmNh cCA8IDAKKyAgICAgICAgICAgIHx8IHNjaW5mby0+Y2FwID4gKGRvbWFpbmluZm8ubWF4X3ZjcHVf aWQgKyAxKSAqIDEwMCkgeworICAgICAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJDcHUgY2Fw IG91dCBvZiByYW5nZSwgIgorICAgICAgICAgICAgICAgICAidmFsaWQgcmFuZ2UgaXMgZnJvbSAw IHRvICVkIGZvciBzcGVjaWZpZWQgbnVtYmVyIG9mIHZjcHVzIiwKKyAgICAgICAgICAgICAgICAg KChkb21haW5pbmZvLm1heF92Y3B1X2lkICsgMSkgKiAxMDApKTsKKyAgICAgICAgICAgIHJldHVy biBFUlJPUl9JTlZBTDsKKyAgICAgICAgfQorICAgICAgICBzZG9tLmNhcCA9IHNjaW5mby0+Y2Fw OworICAgIH0KKworICAgIHJjID0geGNfc2NoZWRfY3JlZGl0X2RvbWFpbl9zZXQoQ1RYLT54Y2gs IGRvbWlkLCAmc2RvbSk7CisgICAgaWYgKCByYyA8IDAgKSB7CisgICAgICAgIExPR0VEKEVSUk9S LCBkb21pZCwgIlNldHRpbmcgZG9tYWluIHNjaGVkIGNyZWRpdCIpOworICAgICAgICByZXR1cm4g RVJST1JfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2hl ZF9yYXRlbGltaXRfY2hlY2sobGlieGxfX2djICpnYywgaW50IHJhdGVsaW1pdCkKK3sKKyAgICBp ZiAocmF0ZWxpbWl0ICE9IDAgJiYKKyAgICAgICAgKHJhdGVsaW1pdCA8ICBYRU5fU1lTQ1RMX1ND SEVEX1JBVEVMSU1JVF9NSU4gfHwKKyAgICAgICAgIHJhdGVsaW1pdCA+IFhFTl9TWVNDVExfU0NI RURfUkFURUxJTUlUX01BWCkpIHsKKyAgICAgICAgTE9HKEVSUk9SLCAiUmF0ZWxpbWl0IG91dCBv ZiByYW5nZSwgdmFsaWQgcmFuZ2UgaXMgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICBYRU5f U1lTQ1RMX1NDSEVEX1JBVEVMSU1JVF9NSU4sIFhFTl9TWVNDVExfU0NIRURfUkFURUxJTUlUX01B WCk7CisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsK K30KKworaW50IGxpYnhsX3NjaGVkX2NyZWRpdF9wYXJhbXNfZ2V0KGxpYnhsX2N0eCAqY3R4LCB1 aW50MzJfdCBwb29saWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxf c2NoZWRfY3JlZGl0X3BhcmFtcyAqc2NpbmZvKQoreworICAgIHN0cnVjdCB4ZW5fc3lzY3RsX2Ny ZWRpdF9zY2hlZHVsZSBzcGFyYW07CisgICAgaW50IHIsIHJjOworICAgIEdDX0lOSVQoY3R4KTsK KworICAgIHIgPSB4Y19zY2hlZF9jcmVkaXRfcGFyYW1zX2dldChjdHgtPnhjaCwgcG9vbGlkLCAm c3BhcmFtKTsKKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgTE9HRShFUlJPUiwgImdldHRpbmcg Q3JlZGl0IHNjaGVkdWxlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJjID0gRVJST1JfRkFJTDsK KyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc2NpbmZvLT50c2xpY2VfbXMgPSBzcGFy YW0udHNsaWNlX21zOworICAgIHNjaW5mby0+cmF0ZWxpbWl0X3VzID0gc3BhcmFtLnJhdGVsaW1p dF91czsKKworICAgIHJjID0gMDsKKyBvdXQ6CisgICAgR0NfRlJFRTsKKyAgICByZXR1cm4gcmM7 Cit9CisKK2ludCBsaWJ4bF9zY2hlZF9jcmVkaXRfcGFyYW1zX3NldChsaWJ4bF9jdHggKmN0eCwg dWludDMyX3QgcG9vbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhs X3NjaGVkX2NyZWRpdF9wYXJhbXMgKnNjaW5mbykKK3sKKyAgICBzdHJ1Y3QgeGVuX3N5c2N0bF9j cmVkaXRfc2NoZWR1bGUgc3BhcmFtOworICAgIGludCByLCByYzsKKyAgICBHQ19JTklUKGN0eCk7 CisKKyAgICBpZiAoc2NpbmZvLT50c2xpY2VfbXMgPCAgWEVOX1NZU0NUTF9DU0NIRURfVFNMSUNF X01JTgorICAgICAgICB8fCBzY2luZm8tPnRzbGljZV9tcyA+IFhFTl9TWVNDVExfQ1NDSEVEX1RT TElDRV9NQVgpIHsKKyAgICAgICAgTE9HKEVSUk9SLCAiVGltZSBzbGljZSBvdXQgb2YgcmFuZ2Us IHZhbGlkIHJhbmdlIGlzIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgWEVOX1NZU0NUTF9D U0NIRURfVFNMSUNFX01JTiwgWEVOX1NZU0NUTF9DU0NIRURfVFNMSUNFX01BWCk7CisgICAgICAg IHJjID0gRVJST1JfSU5WQUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByYyA9IHNj aGVkX3JhdGVsaW1pdF9jaGVjayhnYywgc2NpbmZvLT5yYXRlbGltaXRfdXMpOworICAgIGlmIChy YykgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKHNjaW5mby0+cmF0ZWxpbWl0 X3VzID4gc2NpbmZvLT50c2xpY2VfbXMqMTAwMCkgeworICAgICAgICBMT0coRVJST1IsICJSYXRl bGltaXQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aW1lc2xpY2UiKTsKKyAgICAgICAgcmMgPSBF UlJPUl9JTlZBTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc3BhcmFtLnRzbGlj ZV9tcyA9IHNjaW5mby0+dHNsaWNlX21zOworICAgIHNwYXJhbS5yYXRlbGltaXRfdXMgPSBzY2lu Zm8tPnJhdGVsaW1pdF91czsKKworICAgIHIgPSB4Y19zY2hlZF9jcmVkaXRfcGFyYW1zX3NldChj dHgtPnhjaCwgcG9vbGlkLCAmc3BhcmFtKTsKKyAgICBpZiAoIHIgPCAwICkgeworICAgICAgICBM T0dFKEVSUk9SLCAiU2V0dGluZyBDcmVkaXQgc2NoZWR1bGVyIHBhcmFtZXRlcnMiKTsKKyAgICAg ICAgcmMgPSBFUlJPUl9GQUlMOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBzY2lu Zm8tPnRzbGljZV9tcyA9IHNwYXJhbS50c2xpY2VfbXM7CisgICAgc2NpbmZvLT5yYXRlbGltaXRf dXMgPSBzcGFyYW0ucmF0ZWxpbWl0X3VzOworCisgICAgcmMgPSAwOworIG91dDoKKyAgICBHQ19G UkVFOworICAgIHJldHVybiByYzsKK30KKworaW50IGxpYnhsX3NjaGVkX2NyZWRpdDJfcGFyYW1z X2dldChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZF9jcmVkaXQyX3BhcmFtcyAqc2NpbmZvKQorewor ICAgIHN0cnVjdCB4ZW5fc3lzY3RsX2NyZWRpdDJfc2NoZWR1bGUgc3BhcmFtOworICAgIGludCBy LCByYzsKKyAgICBHQ19JTklUKGN0eCk7CisKKyAgICByID0geGNfc2NoZWRfY3JlZGl0Ml9wYXJh bXNfZ2V0KGN0eC0+eGNoLCBwb29saWQsICZzcGFyYW0pOworICAgIGlmIChyIDwgMCkgeworICAg ICAgICBMT0dFKEVSUk9SLCAiZ2V0dGluZyBDcmVkaXQyIHNjaGVkdWxlciBwYXJhbWV0ZXJzIik7 CisgICAgICAgIHJjID0gRVJST1JfRkFJTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisg ICAgc2NpbmZvLT5yYXRlbGltaXRfdXMgPSBzcGFyYW0ucmF0ZWxpbWl0X3VzOworCisgICAgcmMg PSAwOworIG91dDoKKyAgICBHQ19GUkVFOworICAgIHJldHVybiByYzsKK30KKworaW50IGxpYnhs X3NjaGVkX2NyZWRpdDJfcGFyYW1zX3NldChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlk LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9zY2hlZF9jcmVkaXQy X3BhcmFtcyAqc2NpbmZvKQoreworICAgIHN0cnVjdCB4ZW5fc3lzY3RsX2NyZWRpdDJfc2NoZWR1 bGUgc3BhcmFtOworICAgIGludCByLCByYzsKKyAgICBHQ19JTklUKGN0eCk7CisKKyAgICByYyA9 IHNjaGVkX3JhdGVsaW1pdF9jaGVjayhnYywgc2NpbmZvLT5yYXRlbGltaXRfdXMpOworICAgIGlm IChyYykgZ290byBvdXQ7CisKKyAgICBzcGFyYW0ucmF0ZWxpbWl0X3VzID0gc2NpbmZvLT5yYXRl bGltaXRfdXM7CisKKyAgICByID0geGNfc2NoZWRfY3JlZGl0Ml9wYXJhbXNfc2V0KGN0eC0+eGNo LCBwb29saWQsICZzcGFyYW0pOworICAgIGlmIChyIDwgMCkgeworICAgICAgICBMT0dFKEVSUk9S LCAiU2V0dGluZyBDcmVkaXQyIHNjaGVkdWxlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJjID0g RVJST1JfRkFJTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc2NpbmZvLT5yYXRl bGltaXRfdXMgPSBzcGFyYW0ucmF0ZWxpbWl0X3VzOworCisgICAgcmMgPSAwOworIG91dDoKKyAg ICBHQ19GUkVFOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBzY2hlZF9jcmVkaXQy X2RvbWFpbl9nZXQobGlieGxfX2djICpnYywgdWludDMyX3QgZG9taWQsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2luZm8p Cit7CisgICAgc3RydWN0IHhlbl9kb21jdGxfc2NoZWRfY3JlZGl0MiBzZG9tOworICAgIGludCBy YzsKKworICAgIHJjID0geGNfc2NoZWRfY3JlZGl0Ml9kb21haW5fZ2V0KENUWC0+eGNoLCBkb21p ZCwgJnNkb20pOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0VEKEVSUk9SLCBkb21p ZCwgIkdldHRpbmcgZG9tYWluIHNjaGVkIGNyZWRpdDIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9S X0ZBSUw7CisgICAgfQorCisgICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFtc19pbml0KHNjaW5m byk7CisgICAgc2NpbmZvLT5zY2hlZCA9IExJQlhMX1NDSEVEVUxFUl9DUkVESVQyOworICAgIHNj aW5mby0+d2VpZ2h0ID0gc2RvbS53ZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBzY2hlZF9jcmVkaXQyX2RvbWFpbl9zZXQobGlieGxfX2djICpnYywgdWludDMyX3QgZG9t aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4bF9kb21h aW5fc2NoZWRfcGFyYW1zICpzY2luZm8pCit7CisgICAgc3RydWN0IHhlbl9kb21jdGxfc2NoZWRf Y3JlZGl0MiBzZG9tOworICAgIGludCByYzsKKworICAgIHJjID0geGNfc2NoZWRfY3JlZGl0Ml9k b21haW5fZ2V0KENUWC0+eGNoLCBkb21pZCwgJnNkb20pOworICAgIGlmIChyYyAhPSAwKSB7Cisg ICAgICAgIExPR0VEKEVSUk9SLCBkb21pZCwgIkdldHRpbmcgZG9tYWluIHNjaGVkIGNyZWRpdDIi KTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7CisgICAgfQorCisgICAgaWYgKHNjaW5mby0+ d2VpZ2h0ICE9IExJQlhMX0RPTUFJTl9TQ0hFRF9QQVJBTV9XRUlHSFRfREVGQVVMVCkgeworICAg ICAgICBpZiAoc2NpbmZvLT53ZWlnaHQgPCAxIHx8IHNjaW5mby0+d2VpZ2h0ID4gNjU1MzUpIHsK KyAgICAgICAgICAgIExPR0QoRVJST1IsIGRvbWlkLCAiQ3B1IHdlaWdodCBvdXQgb2YgcmFuZ2Us ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCB2YWx1ZXMgYXJlIHdpdGhpbiByYW5n ZSBmcm9tIDEgdG8gNjU1MzUiKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTDsKKyAg ICAgICAgfQorICAgICAgICBzZG9tLndlaWdodCA9IHNjaW5mby0+d2VpZ2h0OworICAgIH0KKwor ICAgIHJjID0geGNfc2NoZWRfY3JlZGl0Ml9kb21haW5fc2V0KENUWC0+eGNoLCBkb21pZCwgJnNk b20pOworICAgIGlmICggcmMgPCAwICkgeworICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJT ZXR0aW5nIGRvbWFpbiBzY2hlZCBjcmVkaXQyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9GQUlM OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaGVkX3J0ZHNfdmFs aWRhdGVfcGFyYW1zKGxpYnhsX19nYyAqZ2MsIGludCBwZXJpb2QsIGludCBidWRnZXQpCit7Cisg ICAgaW50IHJjOworCisgICAgaWYgKHBlcmlvZCA8IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SLCAi SW52YWxpZCBWQ1BVIHBlcmlvZCBvZiAlZCAoaXQgc2hvdWxkIGJlID49IDEpIiwgcGVyaW9kKTsK KyAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisg ICAgaWYgKGJ1ZGdldCA8IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SLCAiSW52YWxpZCBWQ1BVIGJ1 ZGdldCBvZiAlZCAoaXQgc2hvdWxkIGJlID49IDEpIiwgYnVkZ2V0KTsKKyAgICAgICAgcmMgPSBF UlJPUl9JTlZBTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKGJ1ZGdldCA+ IHBlcmlvZCkgeworICAgICAgICBMT0coRVJST1IsICJWQ1BVIGJ1ZGdldCBtdXN0IGJlIHNtYWxs ZXIgdGhhbiBvciBlcXVhbCB0byBwZXJpb2QsICIKKyAgICAgICAgICAgICAgICAgICAiYnV0ICVk ID4gJWQiLCBidWRnZXQsIHBlcmlvZCk7CisgICAgICAgIHJjID0gRVJST1JfSU5WQUw7CisgICAg ICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByYyA9IDA7CitvdXQ6CisgICAgcmV0dXJuIHJjOwor fQorCisvKiBHZXQgdGhlIFJURFMgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIG9mIHZjcHUocykgKi8K K3N0YXRpYyBpbnQgc2NoZWRfcnRkc192Y3B1X2dldChsaWJ4bF9fZ2MgKmdjLCB1aW50MzJfdCBk b21pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF92Y3B1X3NjaGVkX3Bh cmFtcyAqc2NpbmZvKQoreworICAgIHVpbnQzMl90IG51bV92Y3B1czsKKyAgICBpbnQgaSwgciwg cmM7CisgICAgeGNfZG9taW5mb190IGluZm87CisgICAgc3RydWN0IHhlbl9kb21jdGxfc2NoZWRw YXJhbV92Y3B1ICp2Y3B1czsKKworICAgIHIgPSB4Y19kb21haW5fZ2V0aW5mbyhDVFgtPnhjaCwg ZG9taWQsIDEsICZpbmZvKTsKKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgTE9HRUQoRVJST1Is IGRvbWlkLCAiR2V0dGluZyBkb21haW4gaW5mbyIpOworICAgICAgICByYyA9IEVSUk9SX0ZBSUw7 CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChzY2luZm8tPm51bV92Y3B1cyA8 PSAwKSB7CisgICAgICAgIHJjID0gRVJST1JfSU5WQUw7CisgICAgICAgIGdvdG8gb3V0OworICAg IH0gZWxzZSB7CisgICAgICAgIG51bV92Y3B1cyA9IHNjaW5mby0+bnVtX3ZjcHVzOworICAgICAg ICBHQ05FV19BUlJBWSh2Y3B1cywgbnVtX3ZjcHVzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8 IG51bV92Y3B1czsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2NpbmZvLT52Y3B1c1tpXS52Y3B1 aWQgPCAwIHx8CisgICAgICAgICAgICAgICAgc2NpbmZvLT52Y3B1c1tpXS52Y3B1aWQgPiBpbmZv Lm1heF92Y3B1X2lkKSB7CisgICAgICAgICAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJWQ1BV IGluZGV4IGlzIG91dCBvZiByYW5nZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2 YWxpZCB2YWx1ZXMgYXJlIHdpdGhpbiByYW5nZSBmcm9tIDAgdG8gJWQiLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGluZm8ubWF4X3ZjcHVfaWQpOworICAgICAgICAgICAgICAgIHJjID0g RVJST1JfSU5WQUw7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICB2Y3B1c1tpXS52Y3B1aWQgPSBzY2luZm8tPnZjcHVzW2ldLnZjcHVpZDsKKyAg ICAgICAgfQorICAgIH0KKworICAgIHIgPSB4Y19zY2hlZF9ydGRzX3ZjcHVfZ2V0KENUWC0+eGNo LCBkb21pZCwgdmNwdXMsIG51bV92Y3B1cyk7CisgICAgaWYgKHIgIT0gMCkgeworICAgICAgICBM T0dFRChFUlJPUiwgZG9taWQsICJHZXR0aW5nIHZjcHUgc2NoZWQgcnRkcyIpOworICAgICAgICBy YyA9IEVSUk9SX0ZBSUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBzY2luZm8tPnNj aGVkID0gTElCWExfU0NIRURVTEVSX1JURFM7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV92Y3B1 czsgaSsrKSB7CisgICAgICAgIHNjaW5mby0+dmNwdXNbaV0ucGVyaW9kID0gdmNwdXNbaV0udS5y dGRzLnBlcmlvZDsKKyAgICAgICAgc2NpbmZvLT52Y3B1c1tpXS5idWRnZXQgPSB2Y3B1c1tpXS51 LnJ0ZHMuYnVkZ2V0OworICAgICAgICBzY2luZm8tPnZjcHVzW2ldLnZjcHVpZCA9IHZjcHVzW2ld LnZjcHVpZDsKKyAgICB9CisgICAgcmMgPSAwOworb3V0OgorICAgIHJldHVybiByYzsKK30KKwor LyogR2V0IHRoZSBSVERTIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBvZiBhbGwgdmNwdXMgb2YgYSBk b21haW4gKi8KK3N0YXRpYyBpbnQgc2NoZWRfcnRkc192Y3B1X2dldF9hbGwobGlieGxfX2djICpn YywgdWludDMyX3QgZG9taWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxp YnhsX3ZjcHVfc2NoZWRfcGFyYW1zICpzY2luZm8pCit7CisgICAgdWludDMyX3QgbnVtX3ZjcHVz OworICAgIGludCBpLCByLCByYzsKKyAgICB4Y19kb21pbmZvX3QgaW5mbzsKKyAgICBzdHJ1Y3Qg eGVuX2RvbWN0bF9zY2hlZHBhcmFtX3ZjcHUgKnZjcHVzOworCisgICAgciA9IHhjX2RvbWFpbl9n ZXRpbmZvKENUWC0+eGNoLCBkb21pZCwgMSwgJmluZm8pOworICAgIGlmIChyIDwgMCkgeworICAg ICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJHZXR0aW5nIGRvbWFpbiBpbmZvIik7CisgICAgICAg IHJjID0gRVJST1JfRkFJTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKHNj aW5mby0+bnVtX3ZjcHVzID4gMCkgeworICAgICAgICByYyA9IEVSUk9SX0lOVkFMOworICAgICAg ICBnb3RvIG91dDsKKyAgICB9IGVsc2UgeworICAgICAgICBudW1fdmNwdXMgPSBpbmZvLm1heF92 Y3B1X2lkICsgMTsKKyAgICAgICAgR0NORVdfQVJSQVkodmNwdXMsIG51bV92Y3B1cyk7CisgICAg ICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmNwdXM7IGkrKykKKyAgICAgICAgICAgIHZjcHVzW2ld LnZjcHVpZCA9IGk7CisgICAgfQorCisgICAgciA9IHhjX3NjaGVkX3J0ZHNfdmNwdV9nZXQoQ1RY LT54Y2gsIGRvbWlkLCB2Y3B1cywgbnVtX3ZjcHVzKTsKKyAgICBpZiAociAhPSAwKSB7CisgICAg ICAgIExPR0VEKEVSUk9SLCBkb21pZCwgIkdldHRpbmcgdmNwdSBzY2hlZCBydGRzIik7CisgICAg ICAgIHJjID0gRVJST1JfRkFJTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHNjaW5m by0+c2NoZWQgPSBMSUJYTF9TQ0hFRFVMRVJfUlREUzsKKyAgICBzY2luZm8tPm51bV92Y3B1cyA9 IG51bV92Y3B1czsKKyAgICBzY2luZm8tPnZjcHVzID0gbGlieGxfX2NhbGxvYyhOT0dDLCBudW1f dmNwdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxpYnhsX3Nj aGVkX3BhcmFtcykpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV92Y3B1czsgaSsrKSB7Cisg ICAgICAgIHNjaW5mby0+dmNwdXNbaV0ucGVyaW9kID0gdmNwdXNbaV0udS5ydGRzLnBlcmlvZDsK KyAgICAgICAgc2NpbmZvLT52Y3B1c1tpXS5idWRnZXQgPSB2Y3B1c1tpXS51LnJ0ZHMuYnVkZ2V0 OworICAgICAgICBzY2luZm8tPnZjcHVzW2ldLnZjcHVpZCA9IHZjcHVzW2ldLnZjcHVpZDsKKyAg ICB9CisgICAgcmMgPSAwOworb3V0OgorICAgIHJldHVybiByYzsKK30KKworLyogU2V0IHRoZSBS VERTIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBvZiB2Y3B1KHMpICovCitzdGF0aWMgaW50IHNjaGVk X3J0ZHNfdmNwdV9zZXQobGlieGxfX2djICpnYywgdWludDMyX3QgZG9taWQsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5m bykKK3sKKyAgICBpbnQgciwgcmM7CisgICAgaW50IGk7CisgICAgdWludDE2X3QgbWF4X3ZjcHVp ZDsKKyAgICB4Y19kb21pbmZvX3QgaW5mbzsKKyAgICBzdHJ1Y3QgeGVuX2RvbWN0bF9zY2hlZHBh cmFtX3ZjcHUgKnZjcHVzOworCisgICAgciA9IHhjX2RvbWFpbl9nZXRpbmZvKENUWC0+eGNoLCBk b21pZCwgMSwgJmluZm8pOworICAgIGlmIChyIDwgMCkgeworICAgICAgICBMT0dFRChFUlJPUiwg ZG9taWQsICJHZXR0aW5nIGRvbWFpbiBpbmZvIik7CisgICAgICAgIHJjID0gRVJST1JfRkFJTDsK KyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIG1heF92Y3B1aWQgPSBpbmZvLm1heF92Y3B1 X2lkOworCisgICAgaWYgKHNjaW5mby0+bnVtX3ZjcHVzIDw9IDApIHsKKyAgICAgICAgcmMgPSBF UlJPUl9JTlZBTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkg PCBzY2luZm8tPm51bV92Y3B1czsgaSsrKSB7CisgICAgICAgIGlmIChzY2luZm8tPnZjcHVzW2ld LnZjcHVpZCA8IDAgfHwKKyAgICAgICAgICAgIHNjaW5mby0+dmNwdXNbaV0udmNwdWlkID4gbWF4 X3ZjcHVpZCkgeworICAgICAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJJbnZhbGlkIFZDUFUg JWQ6IHZhbGlkIHJhbmdlIGlzIFswLCAlZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Np bmZvLT52Y3B1c1tpXS52Y3B1aWQsIG1heF92Y3B1aWQpOworICAgICAgICAgICAgcmMgPSBFUlJP Ul9JTlZBTDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHJjID0g c2NoZWRfcnRkc192YWxpZGF0ZV9wYXJhbXMoZ2MsIHNjaW5mby0+dmNwdXNbaV0ucGVyaW9kLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaW5mby0+dmNwdXNbaV0u YnVkZ2V0KTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICByYyA9IEVSUk9SX0lOVkFM OworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgR0NORVdfQVJS QVkodmNwdXMsIHNjaW5mby0+bnVtX3ZjcHVzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2NpbmZv LT5udW1fdmNwdXM7IGkrKykgeworICAgICAgICB2Y3B1c1tpXS52Y3B1aWQgPSBzY2luZm8tPnZj cHVzW2ldLnZjcHVpZDsKKyAgICAgICAgdmNwdXNbaV0udS5ydGRzLnBlcmlvZCA9IHNjaW5mby0+ dmNwdXNbaV0ucGVyaW9kOworICAgICAgICB2Y3B1c1tpXS51LnJ0ZHMuYnVkZ2V0ID0gc2NpbmZv LT52Y3B1c1tpXS5idWRnZXQ7CisgICAgfQorCisgICAgciA9IHhjX3NjaGVkX3J0ZHNfdmNwdV9z ZXQoQ1RYLT54Y2gsIGRvbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjcHVz LCBzY2luZm8tPm51bV92Y3B1cyk7CisgICAgaWYgKHIgIT0gMCkgeworICAgICAgICBMT0dFRChF UlJPUiwgZG9taWQsICJTZXR0aW5nIHZjcHUgc2NoZWQgcnRkcyIpOworICAgICAgICByYyA9IEVS Uk9SX0ZBSUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByYyA9IDA7CitvdXQ6Cisg ICAgcmV0dXJuIHJjOworfQorCisvKiBTZXQgdGhlIFJURFMgc2NoZWR1bGluZyBwYXJhbWV0ZXJz IG9mIGFsbCB2Y3B1cyBvZiBhIGRvbWFpbiAqLworc3RhdGljIGludCBzY2hlZF9ydGRzX3ZjcHVf c2V0X2FsbChsaWJ4bF9fZ2MgKmdjLCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5mbykK K3sKKyAgICBpbnQgciwgcmM7CisgICAgaW50IGk7CisgICAgdWludDE2X3QgbWF4X3ZjcHVpZDsK KyAgICB4Y19kb21pbmZvX3QgaW5mbzsKKyAgICBzdHJ1Y3QgeGVuX2RvbWN0bF9zY2hlZHBhcmFt X3ZjcHUgKnZjcHVzOworICAgIHVpbnQzMl90IG51bV92Y3B1czsKKworICAgIHIgPSB4Y19kb21h aW5fZ2V0aW5mbyhDVFgtPnhjaCwgZG9taWQsIDEsICZpbmZvKTsKKyAgICBpZiAociA8IDApIHsK KyAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiR2V0dGluZyBkb21haW4gaW5mbyIpOworICAg ICAgICByYyA9IEVSUk9SX0ZBSUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBtYXhf dmNwdWlkID0gaW5mby5tYXhfdmNwdV9pZDsKKworICAgIGlmIChzY2luZm8tPm51bV92Y3B1cyAh PSAxKSB7CisgICAgICAgIHJjID0gRVJST1JfSU5WQUw7CisgICAgICAgIGdvdG8gb3V0OworICAg IH0KKyAgICBpZiAoc2NoZWRfcnRkc192YWxpZGF0ZV9wYXJhbXMoZ2MsIHNjaW5mby0+dmNwdXNb MF0ucGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2luZm8tPnZj cHVzWzBdLmJ1ZGdldCkpIHsKKyAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKKyAgICAgICAgZ290 byBvdXQ7CisgICAgfQorICAgIG51bV92Y3B1cyA9IG1heF92Y3B1aWQgKyAxOworICAgIEdDTkVX X0FSUkFZKHZjcHVzLCBudW1fdmNwdXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmNwdXM7 IGkrKykgeworICAgICAgICB2Y3B1c1tpXS52Y3B1aWQgPSBpOworICAgICAgICB2Y3B1c1tpXS51 LnJ0ZHMucGVyaW9kID0gc2NpbmZvLT52Y3B1c1swXS5wZXJpb2Q7CisgICAgICAgIHZjcHVzW2ld LnUucnRkcy5idWRnZXQgPSBzY2luZm8tPnZjcHVzWzBdLmJ1ZGdldDsKKyAgICB9CisKKyAgICBy ID0geGNfc2NoZWRfcnRkc192Y3B1X3NldChDVFgtPnhjaCwgZG9taWQsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdmNwdXMsIG51bV92Y3B1cyk7CisgICAgaWYgKHIgIT0gMCkgewor ICAgICAgICBMT0dFRChFUlJPUiwgZG9taWQsICJTZXR0aW5nIHZjcHUgc2NoZWQgcnRkcyIpOwor ICAgICAgICByYyA9IEVSUk9SX0ZBSUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBy YyA9IDA7CitvdXQ6CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHNjaGVkX3J0ZHNf ZG9tYWluX2dldChsaWJ4bF9fZ2MgKmdjLCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2luZm8pCit7Cisg ICAgc3RydWN0IHhlbl9kb21jdGxfc2NoZWRfcnRkcyBzZG9tOworICAgIGludCByYzsKKworICAg IHJjID0geGNfc2NoZWRfcnRkc19kb21haW5fZ2V0KENUWC0+eGNoLCBkb21pZCwgJnNkb20pOwor ICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0VEKEVSUk9SLCBkb21pZCwgIkdldHRpbmcg ZG9tYWluIHNjaGVkIHJ0ZHMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7CisgICAgfQor CisgICAgbGlieGxfZG9tYWluX3NjaGVkX3BhcmFtc19pbml0KHNjaW5mbyk7CisKKyAgICBzY2lu Zm8tPnNjaGVkID0gTElCWExfU0NIRURVTEVSX1JURFM7CisgICAgc2NpbmZvLT5wZXJpb2QgPSBz ZG9tLnBlcmlvZDsKKyAgICBzY2luZm8tPmJ1ZGdldCA9IHNkb20uYnVkZ2V0OworCisgICAgcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NoZWRfcnRkc19kb21haW5fc2V0KGxpYnhsX19nYyAq Z2MsIHVpbnQzMl90IGRvbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXMgKnNjaW5mbykKK3sKKyAgICBzdHJ1Y3QgeGVuX2Rv bWN0bF9zY2hlZF9ydGRzIHNkb207CisgICAgaW50IHJjOworCisgICAgcmMgPSB4Y19zY2hlZF9y dGRzX2RvbWFpbl9nZXQoQ1RYLT54Y2gsIGRvbWlkLCAmc2RvbSk7CisgICAgaWYgKHJjICE9IDAp IHsKKyAgICAgICAgTE9HRUQoRVJST1IsIGRvbWlkLCAiR2V0dGluZyBkb21haW4gc2NoZWQgcnRk cyIpOworICAgICAgICByZXR1cm4gRVJST1JfRkFJTDsKKyAgICB9CisgICAgaWYgKHNjaW5mby0+ cGVyaW9kICE9IExJQlhMX0RPTUFJTl9TQ0hFRF9QQVJBTV9QRVJJT0RfREVGQVVMVCkKKyAgICAg ICAgc2RvbS5wZXJpb2QgPSBzY2luZm8tPnBlcmlvZDsKKyAgICBpZiAoc2NpbmZvLT5idWRnZXQg IT0gTElCWExfRE9NQUlOX1NDSEVEX1BBUkFNX0JVREdFVF9ERUZBVUxUKQorICAgICAgICBzZG9t LmJ1ZGdldCA9IHNjaW5mby0+YnVkZ2V0OworICAgIGlmIChzY2hlZF9ydGRzX3ZhbGlkYXRlX3Bh cmFtcyhnYywgc2RvbS5wZXJpb2QsIHNkb20uYnVkZ2V0KSkKKyAgICAgICAgcmV0dXJuIEVSUk9S X0lOVkFMOworCisgICAgcmMgPSB4Y19zY2hlZF9ydGRzX2RvbWFpbl9zZXQoQ1RYLT54Y2gsIGRv bWlkLCAmc2RvbSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFRChFUlJPUiwgZG9t aWQsICJTZXR0aW5nIGRvbWFpbiBzY2hlZCBydGRzIik7CisgICAgICAgIHJldHVybiBFUlJPUl9G QUlMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgbGlieGxfZG9tYWluX3NjaGVk X3BhcmFtc19zZXQobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IGRvbWlkLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXMgKnNj aW5mbykKK3sKKyAgICBHQ19JTklUKGN0eCk7CisgICAgbGlieGxfc2NoZWR1bGVyIHNjaGVkID0g c2NpbmZvLT5zY2hlZDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNjaGVkID09IExJQlhMX1ND SEVEVUxFUl9VTktOT1dOKQorICAgICAgICBzY2hlZCA9IGxpYnhsX19kb21haW5fc2NoZWR1bGVy KGdjLCBkb21pZCk7CisKKyAgICBzd2l0Y2ggKHNjaGVkKSB7CisgICAgY2FzZSBMSUJYTF9TQ0hF RFVMRVJfU0VERjoKKyAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJTRURGIHNjaGVkdWxlciBu byBsb25nZXIgYXZhaWxhYmxlIik7CisgICAgICAgIHJldD1FUlJPUl9GRUFUVVJFX1JFTU9WRUQ7 CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTElCWExfU0NIRURVTEVSX0NSRURJVDoKKyAgICAg ICAgcmV0PXNjaGVkX2NyZWRpdF9kb21haW5fc2V0KGdjLCBkb21pZCwgc2NpbmZvKTsKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUMjoKKyAgICAgICAgcmV0 PXNjaGVkX2NyZWRpdDJfZG9tYWluX3NldChnYywgZG9taWQsIHNjaW5mbyk7CisgICAgICAgIGJy ZWFrOworICAgIGNhc2UgTElCWExfU0NIRURVTEVSX0FSSU5DNjUzOgorICAgICAgICByZXQ9c2No ZWRfYXJpbmM2NTNfZG9tYWluX3NldChnYywgZG9taWQsIHNjaW5mbyk7CisgICAgICAgIGJyZWFr OworICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1JURFM6CisgICAgICAgIHJldD1zY2hlZF9ydGRz X2RvbWFpbl9zZXQoZ2MsIGRvbWlkLCBzY2luZm8pOworICAgICAgICBicmVhazsKKyAgICBkZWZh dWx0OgorICAgICAgICBMT0dEKEVSUk9SLCBkb21pZCwgIlVua25vd24gc2NoZWR1bGVyIik7Cisg ICAgICAgIHJldD1FUlJPUl9JTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgR0Nf RlJFRTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXNf c2V0KGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5mbykKK3sKKyAg ICBHQ19JTklUKGN0eCk7CisgICAgbGlieGxfc2NoZWR1bGVyIHNjaGVkID0gc2NpbmZvLT5zY2hl ZDsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoc2NoZWQgPT0gTElCWExfU0NIRURVTEVSX1VOS05P V04pCisgICAgICAgIHNjaGVkID0gbGlieGxfX2RvbWFpbl9zY2hlZHVsZXIoZ2MsIGRvbWlkKTsK KworICAgIHN3aXRjaCAoc2NoZWQpIHsKKyAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9TRURGOgor ICAgICAgICBMT0dEKEVSUk9SLCBkb21pZCwgIlNFREYgc2NoZWR1bGVyIG5vIGxvbmdlciBhdmFp bGFibGUiKTsKKyAgICAgICAgcmMgPSBFUlJPUl9GRUFUVVJFX1JFTU9WRUQ7CisgICAgICAgIGJy ZWFrOworICAgIGNhc2UgTElCWExfU0NIRURVTEVSX0NSRURJVDoKKyAgICBjYXNlIExJQlhMX1ND SEVEVUxFUl9DUkVESVQyOgorICAgIGNhc2UgTElCWExfU0NIRURVTEVSX0FSSU5DNjUzOgorICAg ICAgICBMT0dEKEVSUk9SLCBkb21pZCwgInBlci1WQ1BVIHBhcmFtZXRlciBzZXR0aW5nIG5vdCBz dXBwb3J0ZWQgZm9yIHRoaXMgc2NoZWR1bGVyIik7CisgICAgICAgIHJjID0gRVJST1JfSU5WQUw7 CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1JURFM6CisgICAgICAg IHJjID0gc2NoZWRfcnRkc192Y3B1X3NldChnYywgZG9taWQsIHNjaW5mbyk7CisgICAgICAgIGJy ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0QoRVJST1IsIGRvbWlkLCAiVW5rbm93biBz Y2hlZHVsZXIiKTsKKyAgICAgICAgcmMgPSBFUlJPUl9JTlZBTDsKKyAgICAgICAgYnJlYWs7Cisg ICAgfQorCisgICAgR0NfRlJFRTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBsaWJ4bF92Y3B1 X3NjaGVkX3BhcmFtc19zZXRfYWxsKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBkb21pZCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhsX3ZjcHVfc2NoZWRf cGFyYW1zICpzY2luZm8pCit7CisgICAgR0NfSU5JVChjdHgpOworICAgIGxpYnhsX3NjaGVkdWxl ciBzY2hlZCA9IHNjaW5mby0+c2NoZWQ7CisgICAgaW50IHJjOworCisgICAgaWYgKHNjaGVkID09 IExJQlhMX1NDSEVEVUxFUl9VTktOT1dOKQorICAgICAgICBzY2hlZCA9IGxpYnhsX19kb21haW5f c2NoZWR1bGVyKGdjLCBkb21pZCk7CisKKyAgICBzd2l0Y2ggKHNjaGVkKSB7CisgICAgY2FzZSBM SUJYTF9TQ0hFRFVMRVJfU0VERjoKKyAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJTRURGIHNj aGVkdWxlciBubyBsb25nZXIgYXZhaWxhYmxlIik7CisgICAgICAgIHJjID0gRVJST1JfRkVBVFVS RV9SRU1PVkVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9DUkVE SVQ6CisgICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUMjoKKyAgICBjYXNlIExJQlhMX1ND SEVEVUxFUl9BUklOQzY1MzoKKyAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJwZXItVkNQVSBw YXJhbWV0ZXIgc2V0dGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHNjaGVkdWxlciIpOworICAg ICAgICByYyA9IEVSUk9SX0lOVkFMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExJQlhMX1ND SEVEVUxFUl9SVERTOgorICAgICAgICByYyA9IHNjaGVkX3J0ZHNfdmNwdV9zZXRfYWxsKGdjLCBk b21pZCwgc2NpbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9H RChFUlJPUiwgZG9taWQsICJVbmtub3duIHNjaGVkdWxlciIpOworICAgICAgICByYyA9IEVSUk9S X0lOVkFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBHQ19GUkVFOworICAgIHJldHVy biByYzsKK30KKworaW50IGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfZ2V0KGxpYnhsX2N0eCAq Y3R4LCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBs aWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zICpzY2luZm8pCit7CisgICAgR0NfSU5JVChjdHgpOwor ICAgIGludCByZXQ7CisKKyAgICBsaWJ4bF9kb21haW5fc2NoZWRfcGFyYW1zX2luaXQoc2NpbmZv KTsKKworICAgIHNjaW5mby0+c2NoZWQgPSBsaWJ4bF9fZG9tYWluX3NjaGVkdWxlcihnYywgZG9t aWQpOworCisgICAgc3dpdGNoIChzY2luZm8tPnNjaGVkKSB7CisgICAgY2FzZSBMSUJYTF9TQ0hF RFVMRVJfU0VERjoKKyAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJTRURGIHNjaGVkdWxlciBu byBsb25nZXIgYXZhaWxhYmxlIik7CisgICAgICAgIHJldD1FUlJPUl9GRUFUVVJFX1JFTU9WRUQ7 CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTElCWExfU0NIRURVTEVSX0NSRURJVDoKKyAgICAg ICAgcmV0PXNjaGVkX2NyZWRpdF9kb21haW5fZ2V0KGdjLCBkb21pZCwgc2NpbmZvKTsKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUMjoKKyAgICAgICAgcmV0 PXNjaGVkX2NyZWRpdDJfZG9tYWluX2dldChnYywgZG9taWQsIHNjaW5mbyk7CisgICAgICAgIGJy ZWFrOworICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1JURFM6CisgICAgICAgIHJldD1zY2hlZF9y dGRzX2RvbWFpbl9nZXQoZ2MsIGRvbWlkLCBzY2luZm8pOworICAgICAgICBicmVhazsKKyAgICBk ZWZhdWx0OgorICAgICAgICBMT0dEKEVSUk9SLCBkb21pZCwgIlVua25vd24gc2NoZWR1bGVyIik7 CisgICAgICAgIHJldD1FUlJPUl9JTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAg R0NfRlJFRTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgbGlieGxfdmNwdV9zY2hlZF9wYXJh bXNfZ2V0KGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5mbykKK3sKKyAgICBH Q19JTklUKGN0eCk7CisgICAgaW50IHJjOworCisgICAgc2NpbmZvLT5zY2hlZCA9IGxpYnhsX19k b21haW5fc2NoZWR1bGVyKGdjLCBkb21pZCk7CisKKyAgICBzd2l0Y2ggKHNjaW5mby0+c2NoZWQp IHsKKyAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9TRURGOgorICAgICAgICBMT0dEKEVSUk9SLCBk b21pZCwgIlNFREYgc2NoZWR1bGVyIGlzIG5vIGxvbmdlciBhdmFpbGFibGUiKTsKKyAgICAgICAg cmMgPSBFUlJPUl9GRUFUVVJFX1JFTU9WRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTElC WExfU0NIRURVTEVSX0NSRURJVDoKKyAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9DUkVESVQyOgor ICAgIGNhc2UgTElCWExfU0NIRURVTEVSX0FSSU5DNjUzOgorICAgICAgICBMT0dEKEVSUk9SLCBk b21pZCwgInBlci1WQ1BVIHBhcmFtZXRlciBnZXR0aW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMg c2NoZWR1bGVyIik7CisgICAgICAgIHJjID0gRVJST1JfSU5WQUw7CisgICAgICAgIGJyZWFrOwor ICAgIGNhc2UgTElCWExfU0NIRURVTEVSX1JURFM6CisgICAgICAgIHJjID0gc2NoZWRfcnRkc192 Y3B1X2dldChnYywgZG9taWQsIHNjaW5mbyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6 CisgICAgICAgIExPR0QoRVJST1IsIGRvbWlkLCAiVW5rbm93biBzY2hlZHVsZXIiKTsKKyAgICAg ICAgcmMgPSBFUlJPUl9JTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgR0NfRlJF RTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19nZXRf YWxsKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBkb21pZCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zICpzY2luZm8pCit7CisgICAg R0NfSU5JVChjdHgpOworICAgIGludCByYzsKKworICAgIHNjaW5mby0+c2NoZWQgPSBsaWJ4bF9f ZG9tYWluX3NjaGVkdWxlcihnYywgZG9taWQpOworCisgICAgc3dpdGNoIChzY2luZm8tPnNjaGVk KSB7CisgICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfU0VERjoKKyAgICAgICAgTE9HRChFUlJPUiwg ZG9taWQsICJTRURGIHNjaGVkdWxlciBpcyBubyBsb25nZXIgYXZhaWxhYmxlIik7CisgICAgICAg IHJjID0gRVJST1JfRkVBVFVSRV9SRU1PVkVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExJ QlhMX1NDSEVEVUxFUl9DUkVESVQ6CisgICAgY2FzZSBMSUJYTF9TQ0hFRFVMRVJfQ1JFRElUMjoK KyAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9BUklOQzY1MzoKKyAgICAgICAgTE9HRChFUlJPUiwg ZG9taWQsICJwZXItVkNQVSBwYXJhbWV0ZXIgZ2V0dGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlz IHNjaGVkdWxlciIpOworICAgICAgICByYyA9IEVSUk9SX0lOVkFMOworICAgICAgICBicmVhazsK KyAgICBjYXNlIExJQlhMX1NDSEVEVUxFUl9SVERTOgorICAgICAgICByYyA9IHNjaGVkX3J0ZHNf dmNwdV9nZXRfYWxsKGdjLCBkb21pZCwgc2NpbmZvKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVm YXVsdDoKKyAgICAgICAgTE9HRChFUlJPUiwgZG9taWQsICJVbmtub3duIHNjaGVkdWxlciIpOwor ICAgICAgICByYyA9IEVSUk9SX0lOVkFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBH Q19GUkVFOworICAgIHJldHVybiByYzsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAq IG1vZGU6IEMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwK KyAqIEVuZDoKKyAqLwotLSAKMi4xMC4yCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMu eGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==