From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH 11/29] xl: split out cpupool related code Date: Fri, 24 Feb 2017 16:12:56 +0000 Message-ID: <20170224161314.22154-12-wei.liu2@citrix.com> References: <20170224161314.22154-1-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1chIXu-0006b1-In for xen-devel@lists.xenproject.org; Fri, 24 Feb 2017 16:16:38 +0000 In-Reply-To: <20170224161314.22154-1-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Xen-devel Cc: Wei Liu , Ian Jackson List-Id: xen-devel@lists.xenproject.org U2lnbmVkLW9mZi1ieTogV2VpIExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4KLS0tCiB0b29scy94 bC9NYWtlZmlsZSAgICAgfCAgIDIgKy0KIHRvb2xzL3hsL3hsX2NtZGltcGwuYyB8IDU5MiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdG9vbHMveGwveGxf Y3B1cG9vbC5jIHwgNjI0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDYyNSBpbnNlcnRpb25zKCspLCA1OTMgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMveGwveGxfY3B1cG9vbC5jCgpkaWZmIC0t Z2l0IGEvdG9vbHMveGwvTWFrZWZpbGUgYi90b29scy94bC9NYWtlZmlsZQppbmRleCBkN2Y3ZjAx NTQ5Li4wZmY3ZWY5YmZlIDEwMDY0NAotLS0gYS90b29scy94bC9NYWtlZmlsZQorKysgYi90b29s cy94bC9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNyBAQCBDRkxBR1NfWEwgKz0gJChDRkxBR1NfbGli eGVubGlnaHQpCiBDRkxBR1NfWEwgKz0gLVdzaGFkb3cKIAogWExfT0JKUyA9IHhsLm8geGxfY21k aW1wbC5vIHhsX2NtZHRhYmxlLm8geGxfc3hwLm8geGxfdXRpbHMubwotWExfT0JKUyArPSB4bF90 bWVtLm8geGxfcGFyc2UubworWExfT0JKUyArPSB4bF90bWVtLm8geGxfcGFyc2UubyB4bF9jcHVw b29sLm8KIAogJChYTF9PQkpTKTogQ0ZMQUdTICs9ICQoQ0ZMQUdTX2xpYnhlbnRvb2xsb2cpCiAk KFhMX09CSlMpOiBDRkxBR1MgKz0gJChDRkxBR1NfWEwpCmRpZmYgLS1naXQgYS90b29scy94bC94 bF9jbWRpbXBsLmMgYi90b29scy94bC94bF9jbWRpbXBsLmMKaW5kZXggODEyZjU3MGQwZC4uODJi MzBiYjA5NCAxMDA2NDQKLS0tIGEvdG9vbHMveGwveGxfY21kaW1wbC5jCisrKyBiL3Rvb2xzL3hs L3hsX2NtZGltcGwuYwpAQCAtNTYxMSw1OTggKzU2MTEsNiBAQCBpbnQgbWFpbl91cHRpbWUoaW50 IGFyZ2MsIGNoYXIgKiphcmd2KQogICAgIHJldHVybiAwOwogfQogCi0KLWludCBtYWluX2NwdXBv b2xjcmVhdGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGNvbnN0IGNoYXIgKmZpbGVu YW1lID0gTlVMTCwgKmNvbmZpZ19zcmM9TlVMTDsKLSAgICBjb25zdCBjaGFyICpwOwotICAgIGNo YXIgKmV4dHJhX2NvbmZpZyA9IE5VTEw7Ci0gICAgaW50IG9wdDsKLSAgICBzdGF0aWMgc3RydWN0 IG9wdGlvbiBvcHRzW10gPSB7Ci0gICAgICAgIHsiZGVmY29uZmlnIiwgMSwgMCwgJ2YnfSwKLSAg ICAgICAgeyJkcnlydW4iLCAwLCAwLCAnbid9LAotICAgICAgICBDT01NT05fTE9OR19PUFRTCi0g ICAgfTsKLSAgICBpbnQgcmV0OwotICAgIGNoYXIgKmNvbmZpZ19kYXRhID0gMDsKLSAgICBpbnQg Y29uZmlnX2xlbiA9IDA7Ci0gICAgWExVX0NvbmZpZyAqY29uZmlnOwotICAgIGNvbnN0IGNoYXIg KmJ1ZjsKLSAgICBjaGFyICpuYW1lID0gTlVMTDsKLSAgICB1aW50MzJfdCBwb29saWQ7Ci0gICAg bGlieGxfc2NoZWR1bGVyIHNjaGVkID0gMDsKLSAgICBYTFVfQ29uZmlnTGlzdCAqY3B1czsKLSAg ICBYTFVfQ29uZmlnTGlzdCAqbm9kZXM7Ci0gICAgaW50IG5fY3B1cywgbl9ub2RlcywgaSwgbjsK LSAgICBsaWJ4bF9iaXRtYXAgZnJlZW1hcDsKLSAgICBsaWJ4bF9iaXRtYXAgY3B1bWFwOwotICAg IGxpYnhsX3V1aWQgdXVpZDsKLSAgICBsaWJ4bF9jcHV0b3BvbG9neSAqdG9wb2xvZ3k7Ci0gICAg aW50IHJjID0gRVhJVF9GQUlMVVJFOwotCi0gICAgU1dJVENIX0ZPUkVBQ0hfT1BUKG9wdCwgIm5m OiIsIG9wdHMsICJjcHVwb29sLWNyZWF0ZSIsIDApIHsKLSAgICBjYXNlICdmJzoKLSAgICAgICAg ZmlsZW5hbWUgPSBvcHRhcmc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ24nOgotICAgICAg ICBkcnlydW5fb25seSA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGxpYnhsX2Jp dG1hcF9pbml0KCZmcmVlbWFwKTsKLSAgICBsaWJ4bF9iaXRtYXBfaW5pdCgmY3B1bWFwKTsKLQot ICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKSB7Ci0gICAgICAgIGlmICgocCA9IHN0cmNocihhcmd2 W29wdGluZF0sICc9JykpKSB7Ci0gICAgICAgICAgICB4c3RyaW5nX3JlYWxsb2NfYXBwZW5kKCZl eHRyYV9jb25maWcsICJcbiIpOwotICAgICAgICAgICAgeHN0cmluZ19yZWFsbG9jX2FwcGVuZCgm ZXh0cmFfY29uZmlnLCBhcmd2W29wdGluZF0pOwotICAgICAgICB9IGVsc2UgaWYgKCFmaWxlbmFt ZSkgewotICAgICAgICAgICAgZmlsZW5hbWUgPSBhcmd2W29wdGluZF07Ci0gICAgICAgIH0gZWxz ZSB7Ci0gICAgICAgICAgICBoZWxwKCJjcHVwb29sLWNyZWF0ZSIpOwotICAgICAgICAgICAgZ290 byBvdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgb3B0aW5kKys7Ci0gICAgfQotCi0gICAgaWYgKGZp bGVuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKGxpYnhsX3JlYWRfZmlsZV9jb250ZW50cyhjdHgs IGZpbGVuYW1lLCAodm9pZCAqKikmY29uZmlnX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJmNvbmZpZ19sZW4pKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVy ciwgIkZhaWxlZCB0byByZWFkIGNvbmZpZyBmaWxlOiAlczogJXNcbiIsCi0gICAgICAgICAgICAg ICAgICAgIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBvdXQ7 Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnX3NyYz1maWxlbmFtZTsKLSAgICB9Ci0gICAgZWxz ZQotICAgICAgICBjb25maWdfc3JjPSJjb21tYW5kIGxpbmUiOwotCi0gICAgaWYgKGV4dHJhX2Nv bmZpZyAmJiBzdHJsZW4oZXh0cmFfY29uZmlnKSkgewotICAgICAgICBpZiAoY29uZmlnX2xlbiA+ IElOVF9NQVggLSAoc3RybGVuKGV4dHJhX2NvbmZpZykgKyAyKSkgewotICAgICAgICAgICAgZnBy aW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYXR0YWNoIGV4dHJhIGNvbmZpZ3VyYXRpb25cbiIpOwot ICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnX2RhdGEgPSB4 cmVhbGxvYyhjb25maWdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25m aWdfbGVuICsgc3RybGVuKGV4dHJhX2NvbmZpZykgKyAyKTsKLSAgICAgICAgaWYgKCFjb25maWdf ZGF0YSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhbGxvYyBj b25maWdfZGF0YVxuIik7Ci0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgfQotICAgICAg ICBjb25maWdfZGF0YVtjb25maWdfbGVuXSA9IDA7Ci0gICAgICAgIHN0cmNhdChjb25maWdfZGF0 YSwgZXh0cmFfY29uZmlnKTsKLSAgICAgICAgc3RyY2F0KGNvbmZpZ19kYXRhLCAiXG4iKTsKLSAg ICAgICAgY29uZmlnX2xlbiArPSBzdHJsZW4oZXh0cmFfY29uZmlnKSArIDE7Ci0gICAgfQotCi0g ICAgY29uZmlnID0geGx1X2NmZ19pbml0KHN0ZGVyciwgY29uZmlnX3NyYyk7Ci0gICAgaWYgKCFj b25maWcpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgZm9y IGNvbmZpZ3VyYXRpb25cbiIpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICByZXQg PSB4bHVfY2ZnX3JlYWRkYXRhKGNvbmZpZywgY29uZmlnX2RhdGEsIGNvbmZpZ19sZW4pOwotICAg IGlmIChyZXQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgY29u ZmlnIGZpbGU6ICVzXG4iLCBzdHJlcnJvcihyZXQpKTsKLSAgICAgICAgZ290byBvdXRfY2ZnOwot ICAgIH0KLQotICAgIGlmICgheGx1X2NmZ19nZXRfc3RyaW5nIChjb25maWcsICJuYW1lIiwgJmJ1 ZiwgMCkpCi0gICAgICAgIG5hbWUgPSBzdHJkdXAoYnVmKTsKLSAgICBlbHNlIGlmIChmaWxlbmFt ZSkKLSAgICAgICAgbmFtZSA9IGxpYnhsX2Jhc2VuYW1lKGZpbGVuYW1lKTsKLSAgICBlbHNlIHsK LSAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGNwdXBvb2wgbmFtZSFcbiIpOwotICAg ICAgICBnb3RvIG91dF9jZmc7Ci0gICAgfQotICAgIGlmICghbGlieGxfbmFtZV90b19jcHVwb29s aWQoY3R4LCBuYW1lLCAmcG9vbGlkKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBvb2wg bmFtZSBcIiVzXCIgYWxyZWFkeSBleGlzdHNcbiIsIG5hbWUpOwotICAgICAgICBnb3RvIG91dF9j Zmc7Ci0gICAgfQotCi0gICAgaWYgKCF4bHVfY2ZnX2dldF9zdHJpbmcgKGNvbmZpZywgInNjaGVk IiwgJmJ1ZiwgMCkpIHsKLSAgICAgICAgaWYgKChsaWJ4bF9zY2hlZHVsZXJfZnJvbV9zdHJpbmco YnVmLCAmc2NoZWQpKSA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93 biBzY2hlZHVsZXJcbiIpOwotICAgICAgICAgICAgZ290byBvdXRfY2ZnOwotICAgICAgICB9Ci0g ICAgfSBlbHNlIHsKLSAgICAgICAgcmMgPSBsaWJ4bF9nZXRfc2NoZWR1bGVyKGN0eCk7Ci0gICAg ICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0X3NjaGVk dWxlciBzeXNjdGwgZmFpbGVkLlxuIik7Ci0gICAgICAgICAgICBnb3RvIG91dF9jZmc7Ci0gICAg ICAgIH0KLSAgICAgICAgc2NoZWQgPSByYzsKLSAgICB9Ci0KLSAgICBpZiAobGlieGxfZ2V0X2Zy ZWVjcHVzKGN0eCwgJmZyZWVtYXApKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlieGxf Z2V0X2ZyZWVjcHVzIGZhaWxlZFxuIik7Ci0gICAgICAgIGdvdG8gb3V0X2NmZzsKLSAgICB9Ci0g ICAgaWYgKGxpYnhsX2NwdV9iaXRtYXBfYWxsb2MoY3R4LCAmY3B1bWFwLCAwKSkgewotICAgICAg ICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjcHVtYXBcbiIpOwotICAgICAg ICBnb3RvIG91dF9jZmc7Ci0gICAgfQotICAgIGlmICgheGx1X2NmZ19nZXRfbGlzdChjb25maWcs ICJub2RlcyIsICZub2RlcywgMCwgMCkpIHsKLSAgICAgICAgaW50IG5yOwotICAgICAgICBuX2Nw dXMgPSAwOwotICAgICAgICBuX25vZGVzID0gMDsKLSAgICAgICAgdG9wb2xvZ3kgPSBsaWJ4bF9n ZXRfY3B1X3RvcG9sb2d5KGN0eCwgJm5yKTsKLSAgICAgICAgaWYgKHRvcG9sb2d5ID09IE5VTEwp IHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlieGxfZ2V0X3RvcG9sb2d5aW5mbyBm YWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBvdXRfY2ZnOwotICAgICAgICB9Ci0gICAgICAg IHdoaWxlICgoYnVmID0geGx1X2NmZ19nZXRfbGlzdGl0ZW0obm9kZXMsIG5fbm9kZXMpKSAhPSBO VUxMKSB7Ci0gICAgICAgICAgICBuID0gYXRvaShidWYpOwotICAgICAgICAgICAgZm9yIChpID0g MDsgaSA8IG5yOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKHRvcG9sb2d5W2ldLm5vZGUg PT0gbikgJiYKLSAgICAgICAgICAgICAgICAgICAgbGlieGxfYml0bWFwX3Rlc3QoJmZyZWVtYXAs IGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpYnhsX2JpdG1hcF9zZXQoJmNwdW1hcCwgaSk7 Ci0gICAgICAgICAgICAgICAgICAgIG5fY3B1cysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAg ICAgICAgIH0KLSAgICAgICAgICAgIG5fbm9kZXMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGxp YnhsX2NwdXRvcG9sb2d5X2xpc3RfZnJlZSh0b3BvbG9neSwgbnIpOwotCi0gICAgICAgIGlmIChu X2NwdXMgPT0gMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJubyBmcmVlIGNwdSBm b3VuZFxuIik7Ci0gICAgICAgICAgICBnb3RvIG91dF9jZmc7Ci0gICAgICAgIH0KLSAgICB9IGVs c2UgaWYgKCF4bHVfY2ZnX2dldF9saXN0KGNvbmZpZywgImNwdXMiLCAmY3B1cywgMCwgMSkpIHsK LSAgICAgICAgbl9jcHVzID0gMDsKLSAgICAgICAgd2hpbGUgKChidWYgPSB4bHVfY2ZnX2dldF9s aXN0aXRlbShjcHVzLCBuX2NwdXMpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpID0gYXRvaShi dWYpOwotICAgICAgICAgICAgaWYgKChpIDwgMCkgfHwgIWxpYnhsX2JpdG1hcF90ZXN0KCZmcmVl bWFwLCBpKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY3B1ICVkIGlsbGVn YWwgb3Igbm90IGZyZWVcbiIsIGkpOwotICAgICAgICAgICAgICAgIGdvdG8gb3V0X2NmZzsKLSAg ICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpYnhsX2JpdG1hcF9zZXQoJmNwdW1hcCwgaSk7Ci0g ICAgICAgICAgICBuX2NwdXMrKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXhsdV9jZmdf Z2V0X3N0cmluZyhjb25maWcsICJjcHVzIiwgJmJ1ZiwgMCkpIHsKLSAgICAgICAgaWYgKHBhcnNl X2NwdXJhbmdlKGJ1ZiwgJmNwdW1hcCkpCi0gICAgICAgICAgICBnb3RvIG91dF9jZmc7Ci0KLSAg ICAgICAgbl9jcHVzID0gMDsKLSAgICAgICAgbGlieGxfZm9yX2VhY2hfc2V0X2JpdChpLCBjcHVt YXApIHsKLSAgICAgICAgICAgIGlmICghbGlieGxfYml0bWFwX3Rlc3QoJmZyZWVtYXAsIGkpKSB7 Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjcHUgJWQgaWxsZWdhbCBvciBub3Qg ZnJlZVxuIiwgaSk7Ci0gICAgICAgICAgICAgICAgZ290byBvdXRfY2ZnOwotICAgICAgICAgICAg fQotICAgICAgICAgICAgbl9jcHVzKys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAg bl9jcHVzID0gMDsKLQotICAgIGxpYnhsX3V1aWRfZ2VuZXJhdGUoJnV1aWQpOwotCi0gICAgcHJp bnRmKCJVc2luZyBjb25maWcgZmlsZSBcIiVzXCJcbiIsIGNvbmZpZ19zcmMpOwotICAgIHByaW50 ZigiY3B1cG9vbCBuYW1lOiAgICVzXG4iLCBuYW1lKTsKLSAgICBwcmludGYoInNjaGVkdWxlcjog ICAgICAlc1xuIiwgbGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhzY2hlZCkpOwotICAgIHByaW50 ZigibnVtYmVyIG9mIGNwdXM6ICVkXG4iLCBuX2NwdXMpOwotCi0gICAgaWYgKCFkcnlydW5fb25s eSkgewotICAgICAgICBwb29saWQgPSBMSUJYTF9DUFVQT09MX1BPT0xJRF9BTlk7Ci0gICAgICAg IGlmIChsaWJ4bF9jcHVwb29sX2NyZWF0ZShjdHgsIG5hbWUsIHNjaGVkLCBjcHVtYXAsICZ1dWlk LCAmcG9vbGlkKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBvbiBjcmVh dGluZyBjcHVwb29sXG4iKTsKLSAgICAgICAgICAgIGdvdG8gb3V0X2NmZzsKLSAgICAgICAgfQot ICAgIH0KLSAgICAvKiBXZSBtYWRlIGl0ISAqLwotICAgIHJjID0gRVhJVF9TVUNDRVNTOwotCi1v dXRfY2ZnOgotICAgIHhsdV9jZmdfZGVzdHJveShjb25maWcpOwotb3V0OgotICAgIGxpYnhsX2Jp dG1hcF9kaXNwb3NlKCZmcmVlbWFwKTsKLSAgICBsaWJ4bF9iaXRtYXBfZGlzcG9zZSgmY3B1bWFw KTsKLSAgICBmcmVlKG5hbWUpOwotICAgIGZyZWUoY29uZmlnX2RhdGEpOwotICAgIGZyZWUoZXh0 cmFfY29uZmlnKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBtYWluX2NwdXBvb2xsaXN0KGlu dCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgb3B0OwotICAgIHN0YXRpYyBzdHJ1Y3Qg b3B0aW9uIG9wdHNbXSA9IHsKLSAgICAgICAgeyJjcHVzIiwgMCwgMCwgJ2MnfSwKLSAgICAgICAg Q09NTU9OX0xPTkdfT1BUUwotICAgIH07Ci0gICAgaW50IG9wdF9jcHVzID0gMDsKLSAgICBjb25z dCBjaGFyICpwb29sID0gTlVMTDsKLSAgICBsaWJ4bF9jcHVwb29saW5mbyAqcG9vbGluZm87Ci0g ICAgaW50IG5fcG9vbHMsIHAsIGMsIG47Ci0gICAgdWludDMyX3QgcG9vbGlkOwotICAgIGNoYXIg Km5hbWU7Ci0KLSAgICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiYyIsIG9wdHMsICJjcHVwb29s LWxpc3QiLCAwKSB7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICAgIG9wdF9jcHVzID0gMTsKLSAgICAg ICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKLSAgICAgICAgcG9v bCA9IGFyZ3Zbb3B0aW5kXTsKLSAgICAgICAgaWYgKGxpYnhsX25hbWVfdG9fY3B1cG9vbGlkKGN0 eCwgcG9vbCwgJnBvb2xpZCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUG9vbCBc JyVzXCcgZG9lcyBub3QgZXhpc3RcbiIsIHBvb2wpOwotICAgICAgICAgICAgcmV0dXJuIEVYSVRf RkFJTFVSRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBvb2xpbmZvID0gbGlieGxfbGlzdF9j cHVwb29sKGN0eCwgJm5fcG9vbHMpOwotICAgIGlmICghcG9vbGluZm8pIHsKLSAgICAgICAgZnBy aW50ZihzdGRlcnIsICJlcnJvciBnZXR0aW5nIGNwdXBvb2wgaW5mb1xuIik7Ci0gICAgICAgIHJl dHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgcHJpbnRmKCIlLTE5cyIsICJOYW1lIik7 Ci0gICAgaWYgKG9wdF9jcHVzKQotICAgICAgICBwcmludGYoIkNQVSBsaXN0XG4iKTsKLSAgICBl bHNlCi0gICAgICAgIHByaW50ZigiQ1BVcyAgIFNjaGVkICAgICBBY3RpdmUgICBEb21haW4gY291 bnRcbiIpOwotCi0gICAgZm9yIChwID0gMDsgcCA8IG5fcG9vbHM7IHArKykgewotICAgICAgICBp ZiAoIXBvb2wgfHwgKHBvb2xpbmZvW3BdLnBvb2xpZCA9PSBwb29saWQpKSB7Ci0gICAgICAgICAg ICBuYW1lID0gcG9vbGluZm9bcF0ucG9vbF9uYW1lOwotICAgICAgICAgICAgcHJpbnRmKCIlLTE5 cyIsIG5hbWUpOwotICAgICAgICAgICAgbiA9IDA7Ci0gICAgICAgICAgICBsaWJ4bF9mb3JfZWFj aF9iaXQoYywgcG9vbGluZm9bcF0uY3B1bWFwKQotICAgICAgICAgICAgICAgIGlmIChsaWJ4bF9i aXRtYXBfdGVzdCgmcG9vbGluZm9bcF0uY3B1bWFwLCBjKSkgewotICAgICAgICAgICAgICAgICAg ICBpZiAobiAmJiBvcHRfY3B1cykgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICAgICAgICAgIGlm IChvcHRfY3B1cykgcHJpbnRmKCIlZCIsIGMpOwotICAgICAgICAgICAgICAgICAgICBuKys7Ci0g ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFvcHRfY3B1cykgewotICAgICAgICAg ICAgICAgIHByaW50ZigiJTNkICU5cyAgICAgICB5ICAgICAgICU0ZCIsIG4sCi0gICAgICAgICAg ICAgICAgICAgICAgIGxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmcocG9vbGluZm9bcF0uc2NoZWQp LAotICAgICAgICAgICAgICAgICAgICAgICBwb29saW5mb1twXS5uX2RvbSk7Ci0gICAgICAgICAg ICB9Ci0gICAgICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBs aWJ4bF9jcHVwb29saW5mb19saXN0X2ZyZWUocG9vbGluZm8sIG5fcG9vbHMpOwotCi0gICAgcmV0 dXJuIEVYSVRfU1VDQ0VTUzsKLX0KLQotaW50IG1haW5fY3B1cG9vbGRlc3Ryb3koaW50IGFyZ2Ms IGNoYXIgKiphcmd2KQotewotICAgIGludCBvcHQ7Ci0gICAgY29uc3QgY2hhciAqcG9vbDsKLSAg ICB1aW50MzJfdCBwb29saWQ7Ci0KLSAgICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiIiwgTlVM TCwgImNwdXBvb2wtZGVzdHJveSIsIDEpIHsKLSAgICAgICAgLyogTm8gb3B0aW9ucyAqLwotICAg IH0KLQotICAgIHBvb2wgPSBhcmd2W29wdGluZF07Ci0KLSAgICBpZiAobGlieGxfY3B1cG9vbF9x dWFsaWZpZXJfdG9fY3B1cG9vbGlkKGN0eCwgcG9vbCwgJnBvb2xpZCwgTlVMTCkgfHwKLSAgICAg ICAgIWxpYnhsX2NwdXBvb2xpZF9pc192YWxpZChjdHgsIHBvb2xpZCkpIHsKLSAgICAgICAgZnBy aW50ZihzdGRlcnIsICJ1bmtub3duIGNwdXBvb2wgJyVzJ1xuIiwgcG9vbCk7Ci0gICAgICAgIHJl dHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgaWYgKGxpYnhsX2NwdXBvb2xfZGVzdHJv eShjdHgsIHBvb2xpZCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBkZXN0cm95 IGNwdXBvb2wgJyVzJ1xuIiwgcG9vbCk7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0g ICAgfQotCi0gICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KLQotaW50IG1haW5fY3B1cG9vbHJl bmFtZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IG9wdDsKLSAgICBjb25zdCBj aGFyICpwb29sOwotICAgIGNvbnN0IGNoYXIgKm5ld19uYW1lOwotICAgIHVpbnQzMl90IHBvb2xp ZDsKLQotICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICIiLCBOVUxMLCAiY3B1cG9vbC1yZW5h bWUiLCAyKSB7Ci0gICAgICAgIC8qIE5vIG9wdGlvbnMgKi8KLSAgICB9Ci0KLSAgICBwb29sID0g YXJndltvcHRpbmQrK107Ci0KLSAgICBpZiAobGlieGxfY3B1cG9vbF9xdWFsaWZpZXJfdG9fY3B1 cG9vbGlkKGN0eCwgcG9vbCwgJnBvb2xpZCwgTlVMTCkgfHwKLSAgICAgICAgIWxpYnhsX2NwdXBv b2xpZF9pc192YWxpZChjdHgsIHBvb2xpZCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1 bmtub3duIGNwdXBvb2wgJyVzJ1xuIiwgcG9vbCk7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxV UkU7Ci0gICAgfQotCi0gICAgbmV3X25hbWUgPSBhcmd2W29wdGluZF07Ci0KLSAgICBpZiAobGli eGxfY3B1cG9vbF9yZW5hbWUoY3R4LCBuZXdfbmFtZSwgcG9vbGlkKSkgewotICAgICAgICBmcHJp bnRmKHN0ZGVyciwgIkNhbid0IHJlbmFtZSBjcHVwb29sICclcydcbiIsIHBvb2wpOwotICAgICAg ICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIHJldHVybiBFWElUX1NVQ0NFU1M7 Ci19Ci0KLWludCBtYWluX2NwdXBvb2xjcHVhZGQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewot ICAgIGludCBvcHQ7Ci0gICAgY29uc3QgY2hhciAqcG9vbDsKLSAgICB1aW50MzJfdCBwb29saWQ7 Ci0gICAgbGlieGxfYml0bWFwIGNwdW1hcDsKLSAgICBpbnQgcmMgPSBFWElUX0ZBSUxVUkU7Ci0K LSAgICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiIiwgTlVMTCwgImNwdXBvb2wtY3B1LWFkZCIs IDIpIHsKLSAgICAgICAgLyogTm8gb3B0aW9ucyAqLwotICAgIH0KLQotICAgIGxpYnhsX2JpdG1h cF9pbml0KCZjcHVtYXApOwotICAgIGlmIChsaWJ4bF9jcHVfYml0bWFwX2FsbG9jKGN0eCwgJmNw dW1hcCwgMCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gYWxsb2NhdGUg Y3B1bWFwIik7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgcG9v bCA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIGlmIChwYXJzZV9jcHVyYW5nZShhcmd2W29wdGluZF0s ICZjcHVtYXApKQotICAgICAgICBnb3RvIG91dDsKLQotICAgIGlmIChsaWJ4bF9jcHVwb29sX3F1 YWxpZmllcl90b19jcHVwb29saWQoY3R4LCBwb29sLCAmcG9vbGlkLCBOVUxMKSB8fAotICAgICAg ICAhbGlieGxfY3B1cG9vbGlkX2lzX3ZhbGlkKGN0eCwgcG9vbGlkKSkgewotICAgICAgICBmcHJp bnRmKHN0ZGVyciwgInVua25vd24gY3B1cG9vbCBcJyVzXCdcbiIsIHBvb2wpOwotICAgICAgICBn b3RvIG91dDsKLSAgICB9Ci0KLSAgICBpZiAobGlieGxfY3B1cG9vbF9jcHVhZGRfY3B1bWFwKGN0 eCwgcG9vbGlkLCAmY3B1bWFwKSkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb21lIGNwdXMg bWF5IG5vdCBoYXZlIGJlZW4gYWRkZWQgdG8gJXNcbiIsIHBvb2wpOwotCi0gICAgcmMgPSBFWElU X1NVQ0NFU1M7Ci0KLW91dDoKLSAgICBsaWJ4bF9iaXRtYXBfZGlzcG9zZSgmY3B1bWFwKTsKLSAg ICByZXR1cm4gcmM7Ci19Ci0KLWludCBtYWluX2NwdXBvb2xjcHVyZW1vdmUoaW50IGFyZ2MsIGNo YXIgKiphcmd2KQotewotICAgIGludCBvcHQ7Ci0gICAgY29uc3QgY2hhciAqcG9vbDsKLSAgICB1 aW50MzJfdCBwb29saWQ7Ci0gICAgbGlieGxfYml0bWFwIGNwdW1hcDsKLSAgICBpbnQgcmMgPSBF WElUX0ZBSUxVUkU7Ci0KLSAgICBsaWJ4bF9iaXRtYXBfaW5pdCgmY3B1bWFwKTsKLSAgICBpZiAo bGlieGxfY3B1X2JpdG1hcF9hbGxvYyhjdHgsICZjcHVtYXAsIDApKSB7Ci0gICAgICAgIGZwcmlu dGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGNwdW1hcCIpOwotICAgICAgICByZXR1cm4g RVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICIiLCBO VUxMLCAiY3B1cG9vbC1jcHUtcmVtb3ZlIiwgMikgewotICAgICAgICAvKiBObyBvcHRpb25zICov Ci0gICAgfQotCi0gICAgcG9vbCA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIGlmIChwYXJzZV9jcHVy YW5nZShhcmd2W29wdGluZF0sICZjcHVtYXApKQotICAgICAgICBnb3RvIG91dDsKLQotICAgIGlm IChsaWJ4bF9jcHVwb29sX3F1YWxpZmllcl90b19jcHVwb29saWQoY3R4LCBwb29sLCAmcG9vbGlk LCBOVUxMKSB8fAotICAgICAgICAhbGlieGxfY3B1cG9vbGlkX2lzX3ZhbGlkKGN0eCwgcG9vbGlk KSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY3B1cG9vbCBcJyVzXCdcbiIs IHBvb2wpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBpZiAobGlieGxfY3B1cG9v bF9jcHVyZW1vdmVfY3B1bWFwKGN0eCwgcG9vbGlkLCAmY3B1bWFwKSkgewotICAgICAgICBmcHJp bnRmKHN0ZGVyciwgIlNvbWUgY3B1cyBtYXkgaGF2ZSBub3Qgb3Igb25seSBwYXJ0aWFsbHkgYmVl biByZW1vdmVkIGZyb20gJyVzJy5cbiIsIHBvb2wpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwg IklmIGEgY3B1IGNhbid0IGJlIGFkZGVkIHRvIGFub3RoZXIgY3B1cG9vbCwgYWRkIGl0IHRvICcl cycgYWdhaW4gYW5kIHJldHJ5LlxuIiwgcG9vbCk7Ci0gICAgfQotCi0gICAgcmMgPSBFWElUX1NV Q0NFU1M7Ci0KLW91dDoKLSAgICBsaWJ4bF9iaXRtYXBfZGlzcG9zZSgmY3B1bWFwKTsKLSAgICBy ZXR1cm4gcmM7Ci19Ci0KLWludCBtYWluX2NwdXBvb2xtaWdyYXRlKGludCBhcmdjLCBjaGFyICoq YXJndikKLXsKLSAgICBpbnQgb3B0OwotICAgIGNvbnN0IGNoYXIgKnBvb2w7Ci0gICAgdWludDMy X3QgcG9vbGlkOwotICAgIGNvbnN0IGNoYXIgKmRvbTsKLSAgICB1aW50MzJfdCBkb21pZDsKLQot ICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICIiLCBOVUxMLCAiY3B1cG9vbC1taWdyYXRlIiwg MikgewotICAgICAgICAvKiBObyBvcHRpb25zICovCi0gICAgfQotCi0gICAgZG9tID0gYXJndltv cHRpbmQrK107Ci0gICAgcG9vbCA9IGFyZ3Zbb3B0aW5kXTsKLQotICAgIGlmIChsaWJ4bF9kb21h aW5fcXVhbGlmaWVyX3RvX2RvbWlkKGN0eCwgZG9tLCAmZG9taWQpIHx8Ci0gICAgICAgICFsaWJ4 bF9kb21pZF90b19uYW1lKGN0eCwgZG9taWQpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAi dW5rbm93biBkb21haW4gJyVzJ1xuIiwgZG9tKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVS RTsKLSAgICB9Ci0KLSAgICBpZiAobGlieGxfY3B1cG9vbF9xdWFsaWZpZXJfdG9fY3B1cG9vbGlk KGN0eCwgcG9vbCwgJnBvb2xpZCwgTlVMTCkgfHwKLSAgICAgICAgIWxpYnhsX2NwdXBvb2xpZF9p c192YWxpZChjdHgsIHBvb2xpZCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3du IGNwdXBvb2wgJyVzJ1xuIiwgcG9vbCk7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0g ICAgfQotCi0gICAgaWYgKGxpYnhsX2NwdXBvb2xfbW92ZWRvbWFpbihjdHgsIHBvb2xpZCwgZG9t aWQpKQotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotCi0gICAgcmV0dXJuIEVYSVRfU1VD Q0VTUzsKLX0KLQotaW50IG1haW5fY3B1cG9vbG51bWFzcGxpdChpbnQgYXJnYywgY2hhciAqKmFy Z3YpCi17Ci0gICAgaW50IHJjOwotICAgIGludCBvcHQ7Ci0gICAgaW50IHA7Ci0gICAgaW50IGM7 Ci0gICAgaW50IG47Ci0gICAgdWludDMyX3QgcG9vbGlkOwotICAgIGxpYnhsX3NjaGVkdWxlciBz Y2hlZDsKLSAgICBpbnQgbl9wb29sczsKLSAgICBpbnQgbm9kZTsKLSAgICBpbnQgbl9jcHVzOwot ICAgIGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGxpYnhsX3V1aWQgdXVpZDsKLSAgICBsaWJ4bF9i aXRtYXAgY3B1bWFwOwotICAgIGxpYnhsX2NwdXBvb2xpbmZvICpwb29saW5mbzsKLSAgICBsaWJ4 bF9jcHV0b3BvbG9neSAqdG9wb2xvZ3k7Ci0gICAgbGlieGxfZG9taW5mbyBpbmZvOwotCi0gICAg U1dJVENIX0ZPUkVBQ0hfT1BUKG9wdCwgIiIsIE5VTEwsICJjcHVwb29sLW51bWEtc3BsaXQiLCAw KSB7Ci0gICAgICAgIC8qIE5vIG9wdGlvbnMgKi8KLSAgICB9Ci0KLSAgICBsaWJ4bF9kb21pbmZv X2luaXQoJmluZm8pOwotCi0gICAgcmMgPSBFWElUX0ZBSUxVUkU7Ci0KLSAgICBsaWJ4bF9iaXRt YXBfaW5pdCgmY3B1bWFwKTsKLSAgICBwb29saW5mbyA9IGxpYnhsX2xpc3RfY3B1cG9vbChjdHgs ICZuX3Bvb2xzKTsKLSAgICBpZiAoIXBvb2xpbmZvKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJy LCAiZXJyb3IgZ2V0dGluZyBjcHVwb29sIGluZm9cbiIpOwotICAgICAgICByZXR1cm4gRVhJVF9G QUlMVVJFOwotICAgIH0KLSAgICBwb29saWQgPSBwb29saW5mb1swXS5wb29saWQ7Ci0gICAgc2No ZWQgPSBwb29saW5mb1swXS5zY2hlZDsKLSAgICBsaWJ4bF9jcHVwb29saW5mb19saXN0X2ZyZWUo cG9vbGluZm8sIG5fcG9vbHMpOwotCi0gICAgaWYgKG5fcG9vbHMgPiAxKSB7Ci0gICAgICAgIGZw cmludGYoc3RkZXJyLCAic3BsaXR0aW5nIG5vdCBwb3NzaWJsZSwgYWxyZWFkeSBjcHVwb29scyBp biB1c2VcbiIpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIHRv cG9sb2d5ID0gbGlieGxfZ2V0X2NwdV90b3BvbG9neShjdHgsICZuX2NwdXMpOwotICAgIGlmICh0 b3BvbG9neSA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlieGxfZ2V0X3Rv cG9sb2d5aW5mbyBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAg IH0KLQotICAgIGlmIChsaWJ4bF9jcHVfYml0bWFwX2FsbG9jKGN0eCwgJmNwdW1hcCwgMCkpIHsK LSAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgY3B1bWFwXG4iKTsK LSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgLyogUmVzZXQgUG9vbC0wIHRvIDFzdCBu b2RlOiBmaXJzdCBhZGQgY3B1cywgdGhlbiByZW1vdmUgY3B1cyB0byBhdm9pZAotICAgICAgIGEg Y3B1cG9vbCB3aXRob3V0IGNwdXMgaW4gYmV0d2VlbiAqLwotCi0gICAgbm9kZSA9IHRvcG9sb2d5 WzBdLm5vZGU7Ci0gICAgaWYgKGxpYnhsX2NwdXBvb2xfY3B1YWRkX25vZGUoY3R4LCAwLCBub2Rl LCAmbikpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBvbiBhZGRpbmcgY3B1IHRv IFBvb2wgMFxuIik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIHhhc3ByaW50Zigm bmFtZSwgIlBvb2wtbm9kZSVkIiwgbm9kZSk7Ci0gICAgaWYgKGxpYnhsX2NwdXBvb2xfcmVuYW1l KGN0eCwgbmFtZSwgMCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBvbiByZW5h bWluZyBQb29sIDBcbiIpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBuID0gMDsK LSAgICBmb3IgKGMgPSAwOyBjIDwgbl9jcHVzOyBjKyspIHsKLSAgICAgICAgaWYgKHRvcG9sb2d5 W2NdLm5vZGUgPT0gbm9kZSkgewotICAgICAgICAgICAgdG9wb2xvZ3lbY10ubm9kZSA9IExJQlhM X0NQVVRPUE9MT0dZX0lOVkFMSURfRU5UUlk7Ci0gICAgICAgICAgICBsaWJ4bF9iaXRtYXBfc2V0 KCZjcHVtYXAsIG4pOwotICAgICAgICAgICAgbisrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlm IChsaWJ4bF9kb21haW5faW5mbyhjdHgsICZpbmZvLCAwKSkgewotICAgICAgICBmcHJpbnRmKHN0 ZGVyciwgImVycm9yIG9uIGdldHRpbmcgaW5mbyBmb3IgRG9tYWluLTBcbiIpOwotICAgICAgICBn b3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKGluZm8udmNwdV9vbmxpbmUgPiBuICYmIGxpYnhsX3Nl dF92Y3B1b25saW5lKGN0eCwgMCwgJmNwdW1hcCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIs ICJlcnJvciBvbiByZW1vdmluZyB2Y3B1cyBmb3IgRG9tYWluLTBcbiIpOwotICAgICAgICBnb3Rv IG91dDsKLSAgICB9Ci0gICAgZm9yIChjID0gMDsgYyA8IDEwOyBjKyspIHsKLSAgICAgICAgLyog V2UndmUgY2FsbGVkIGxpYnhsX2RvbWluZm9faW5pdCBiZWZvcmUgdGhlIGxvb3AgYW5kIHdpbGwK LSAgICAgICAgICogY2FsbCBsaWJ4bF9kb21pbmZvX2Rpc3Bvc2UgYWZ0ZXIgdGhlIGxvb3Agd2hl biB3ZSdyZSBkb25lCi0gICAgICAgICAqIHdpdGggaW5mby4KLSAgICAgICAgICovCi0gICAgICAg IGxpYnhsX2RvbWluZm9fZGlzcG9zZSgmaW5mbyk7Ci0gICAgICAgIGxpYnhsX2RvbWluZm9faW5p dCgmaW5mbyk7Ci0gICAgICAgIGlmIChsaWJ4bF9kb21haW5faW5mbyhjdHgsICZpbmZvLCAwKSkg ewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBvbiBnZXR0aW5nIGluZm8gZm9y IERvbWFpbi0wXG4iKTsKLSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0gICAgICAg IGlmIChpbmZvLnZjcHVfb25saW5lIDw9IG4pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICB9Ci0gICAgICAgIHNsZWVwKDEpOwotICAgIH0KLSAgICBpZiAoaW5mby52Y3B1X29ubGluZSA+ IG4pIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb2ZmbGluZSB2Y3B1c1xu Iik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBsaWJ4bF9iaXRtYXBfc2V0X25vbmUo JmNwdW1hcCk7Ci0KLSAgICBmb3IgKGMgPSAwOyBjIDwgbl9jcHVzOyBjKyspIHsKLSAgICAgICAg aWYgKHRvcG9sb2d5W2NdLm5vZGUgPT0gTElCWExfQ1BVVE9QT0xPR1lfSU5WQUxJRF9FTlRSWSkg ewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBub2RlID0gdG9w b2xvZ3lbY10ubm9kZTsKLSAgICAgICAgaWYgKGxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlX25vZGUo Y3R4LCAwLCBub2RlLCAmbikpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3Ig b24gcmVtb3ZpbmcgY3B1IGZyb20gUG9vbCAwXG4iKTsKLSAgICAgICAgICAgIGdvdG8gb3V0Owot ICAgICAgICB9Ci0KLSAgICAgICAgZnJlZShuYW1lKTsKLSAgICAgICAgeGFzcHJpbnRmKCZuYW1l LCAiUG9vbC1ub2RlJWQiLCBub2RlKTsKLSAgICAgICAgbGlieGxfdXVpZF9nZW5lcmF0ZSgmdXVp ZCk7Ci0gICAgICAgIHBvb2xpZCA9IDA7Ci0gICAgICAgIGlmIChsaWJ4bF9jcHVwb29sX2NyZWF0 ZShjdHgsIG5hbWUsIHNjaGVkLCBjcHVtYXAsICZ1dWlkLCAmcG9vbGlkKSkgewotICAgICAgICAg ICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBvbiBjcmVhdGluZyBjcHVwb29sXG4iKTsKLSAgICAg ICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpYnhsX2NwdXBvb2xf Y3B1YWRkX25vZGUoY3R4LCBwb29saWQsIG5vZGUsICZuKSkgewotICAgICAgICAgICAgZnByaW50 ZihzdGRlcnIsICJlcnJvciBvbiBhZGRpbmcgY3B1cyB0byBjcHVwb29sXG4iKTsKLSAgICAgICAg ICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChwID0gYzsgcCA8IG5fY3B1 czsgcCsrKSB7Ci0gICAgICAgICAgICBpZiAodG9wb2xvZ3lbcF0ubm9kZSA9PSBub2RlKSB7Ci0g ICAgICAgICAgICAgICAgdG9wb2xvZ3lbcF0ubm9kZSA9IExJQlhMX0NQVVRPUE9MT0dZX0lOVkFM SURfRU5UUlk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByYyA9IEVY SVRfU1VDQ0VTUzsKLQotb3V0OgotICAgIGxpYnhsX2NwdXRvcG9sb2d5X2xpc3RfZnJlZSh0b3Bv bG9neSwgbl9jcHVzKTsKLSAgICBsaWJ4bF9iaXRtYXBfZGlzcG9zZSgmY3B1bWFwKTsKLSAgICBs aWJ4bF9kb21pbmZvX2Rpc3Bvc2UoJmluZm8pOwotICAgIGZyZWUobmFtZSk7Ci0KLSAgICByZXR1 cm4gcmM7Ci19Ci0KIGludCBtYWluX2dldGVuZm9yY2UoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQog ewogICAgIGludCByZXQ7CmRpZmYgLS1naXQgYS90b29scy94bC94bF9jcHVwb29sLmMgYi90b29s cy94bC94bF9jcHVwb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4u YjAxOTQ2NDRlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3hsL3hsX2NwdXBvb2wuYwpAQCAt MCwwICsxLDYyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTcgQ2l0cml4IEx0ZCBhbmQg b3RoZXIgY29udHJpYnV0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLjEgb25seS4g d2l0aCB0aGUgc3BlY2lhbAorICogZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIGZp bGUgTElDRU5TRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVz c2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5j bHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+ CisKKyNpbmNsdWRlIDxsaWJ4bC5oPgorI2luY2x1ZGUgPGxpYnhsX3V0aWxzLmg+CisjaW5jbHVk ZSA8bGlieGx1dGlsLmg+CisKKyNpbmNsdWRlICJ4bC5oIgorI2luY2x1ZGUgInhsX3V0aWxzLmgi CisjaW5jbHVkZSAieGxfcGFyc2UuaCIKKworaW50IG1haW5fY3B1cG9vbGNyZWF0ZShpbnQgYXJn YywgY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBOVUxMLCAqY29u ZmlnX3NyYz1OVUxMOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgY2hhciAqZXh0cmFfY29uZmln ID0gTlVMTDsKKyAgICBpbnQgb3B0OworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9 IHsKKyAgICAgICAgeyJkZWZjb25maWciLCAxLCAwLCAnZid9LAorICAgICAgICB7ImRyeXJ1biIs IDAsIDAsICduJ30sCisgICAgICAgIENPTU1PTl9MT05HX09QVFMKKyAgICB9OworICAgIGludCBy ZXQ7CisgICAgY2hhciAqY29uZmlnX2RhdGEgPSAwOworICAgIGludCBjb25maWdfbGVuID0gMDsK KyAgICBYTFVfQ29uZmlnICpjb25maWc7CisgICAgY29uc3QgY2hhciAqYnVmOworICAgIGNoYXIg Km5hbWUgPSBOVUxMOworICAgIHVpbnQzMl90IHBvb2xpZDsKKyAgICBsaWJ4bF9zY2hlZHVsZXIg c2NoZWQgPSAwOworICAgIFhMVV9Db25maWdMaXN0ICpjcHVzOworICAgIFhMVV9Db25maWdMaXN0 ICpub2RlczsKKyAgICBpbnQgbl9jcHVzLCBuX25vZGVzLCBpLCBuOworICAgIGxpYnhsX2JpdG1h cCBmcmVlbWFwOworICAgIGxpYnhsX2JpdG1hcCBjcHVtYXA7CisgICAgbGlieGxfdXVpZCB1dWlk OworICAgIGxpYnhsX2NwdXRvcG9sb2d5ICp0b3BvbG9neTsKKyAgICBpbnQgcmMgPSBFWElUX0ZB SUxVUkU7CisKKyAgICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAibmY6Iiwgb3B0cywgImNwdXBv b2wtY3JlYXRlIiwgMCkgeworICAgIGNhc2UgJ2YnOgorICAgICAgICBmaWxlbmFtZSA9IG9wdGFy ZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICAgIGRyeXJ1bl9vbmx5ID0g MTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGlieGxfYml0bWFwX2luaXQoJmZyZWVt YXApOworICAgIGxpYnhsX2JpdG1hcF9pbml0KCZjcHVtYXApOworCisgICAgd2hpbGUgKG9wdGlu ZCA8IGFyZ2MpIHsKKyAgICAgICAgaWYgKChwID0gc3RyY2hyKGFyZ3Zbb3B0aW5kXSwgJz0nKSkp IHsKKyAgICAgICAgICAgIHhzdHJpbmdfcmVhbGxvY19hcHBlbmQoJmV4dHJhX2NvbmZpZywgIlxu Iik7CisgICAgICAgICAgICB4c3RyaW5nX3JlYWxsb2NfYXBwZW5kKCZleHRyYV9jb25maWcsIGFy Z3Zbb3B0aW5kXSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWZpbGVuYW1lKSB7CisgICAgICAgICAg ICBmaWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg IGhlbHAoImNwdXBvb2wtY3JlYXRlIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAg fQorICAgICAgICBvcHRpbmQrKzsKKyAgICB9CisKKyAgICBpZiAoZmlsZW5hbWUpCisgICAgewor ICAgICAgICBpZiAobGlieGxfcmVhZF9maWxlX2NvbnRlbnRzKGN0eCwgZmlsZW5hbWUsICh2b2lk ICoqKSZjb25maWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm Y29uZmlnX2xlbikpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJl YWQgY29uZmlnIGZpbGU6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUs IHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAg ICAgICBjb25maWdfc3JjPWZpbGVuYW1lOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGNvbmZp Z19zcmM9ImNvbW1hbmQgbGluZSI7CisKKyAgICBpZiAoZXh0cmFfY29uZmlnICYmIHN0cmxlbihl eHRyYV9jb25maWcpKSB7CisgICAgICAgIGlmIChjb25maWdfbGVuID4gSU5UX01BWCAtIChzdHJs ZW4oZXh0cmFfY29uZmlnKSArIDIpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZh aWxlZCB0byBhdHRhY2ggZXh0cmEgY29uZmlndXJhdGlvblxuIik7CisgICAgICAgICAgICBnb3Rv IG91dDsKKyAgICAgICAgfQorICAgICAgICBjb25maWdfZGF0YSA9IHhyZWFsbG9jKGNvbmZpZ19k YXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19sZW4gKyBzdHJsZW4o ZXh0cmFfY29uZmlnKSArIDIpOworICAgICAgICBpZiAoIWNvbmZpZ19kYXRhKSB7CisgICAgICAg ICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFsbG9jIGNvbmZpZ19kYXRhXG4iKTsK KyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIGNvbmZpZ19kYXRhW2Nv bmZpZ19sZW5dID0gMDsKKyAgICAgICAgc3RyY2F0KGNvbmZpZ19kYXRhLCBleHRyYV9jb25maWcp OworICAgICAgICBzdHJjYXQoY29uZmlnX2RhdGEsICJcbiIpOworICAgICAgICBjb25maWdfbGVu ICs9IHN0cmxlbihleHRyYV9jb25maWcpICsgMTsKKyAgICB9CisKKyAgICBjb25maWcgPSB4bHVf Y2ZnX2luaXQoc3RkZXJyLCBjb25maWdfc3JjKTsKKyAgICBpZiAoIWNvbmZpZykgeworICAgICAg ICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBmb3IgY29uZmlndXJhdGlvblxu Iik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJldCA9IHhsdV9jZmdfcmVhZGRh dGEoY29uZmlnLCBjb25maWdfZGF0YSwgY29uZmlnX2xlbik7CisgICAgaWYgKHJldCkgeworICAg ICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSBjb25maWcgZmlsZTogJXNcbiIs IHN0cmVycm9yKHJldCkpOworICAgICAgICBnb3RvIG91dF9jZmc7CisgICAgfQorCisgICAgaWYg KCF4bHVfY2ZnX2dldF9zdHJpbmcgKGNvbmZpZywgIm5hbWUiLCAmYnVmLCAwKSkKKyAgICAgICAg bmFtZSA9IHN0cmR1cChidWYpOworICAgIGVsc2UgaWYgKGZpbGVuYW1lKQorICAgICAgICBuYW1l ID0gbGlieGxfYmFzZW5hbWUoZmlsZW5hbWUpOworICAgIGVsc2UgeworICAgICAgICBmcHJpbnRm KHN0ZGVyciwgIk1pc3NpbmcgY3B1cG9vbCBuYW1lIVxuIik7CisgICAgICAgIGdvdG8gb3V0X2Nm ZzsKKyAgICB9CisgICAgaWYgKCFsaWJ4bF9uYW1lX3RvX2NwdXBvb2xpZChjdHgsIG5hbWUsICZw b29saWQpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUG9vbCBuYW1lIFwiJXNcIiBhbHJl YWR5IGV4aXN0c1xuIiwgbmFtZSk7CisgICAgICAgIGdvdG8gb3V0X2NmZzsKKyAgICB9CisKKyAg ICBpZiAoIXhsdV9jZmdfZ2V0X3N0cmluZyAoY29uZmlnLCAic2NoZWQiLCAmYnVmLCAwKSkgewor ICAgICAgICBpZiAoKGxpYnhsX3NjaGVkdWxlcl9mcm9tX3N0cmluZyhidWYsICZzY2hlZCkpIDwg MCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHNjaGVkdWxlclxuIik7 CisgICAgICAgICAgICBnb3RvIG91dF9jZmc7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAg ICAgICByYyA9IGxpYnhsX2dldF9zY2hlZHVsZXIoY3R4KTsKKyAgICAgICAgaWYgKHJjIDwgMCkg eworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRfc2NoZWR1bGVyIHN5c2N0bCBmYWls ZWQuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2NmZzsKKyAgICAgICAgfQorICAgICAgICBz Y2hlZCA9IHJjOworICAgIH0KKworICAgIGlmIChsaWJ4bF9nZXRfZnJlZWNwdXMoY3R4LCAmZnJl ZW1hcCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4bF9nZXRfZnJlZWNwdXMgZmFp bGVkXG4iKTsKKyAgICAgICAgZ290byBvdXRfY2ZnOworICAgIH0KKyAgICBpZiAobGlieGxfY3B1 X2JpdG1hcF9hbGxvYyhjdHgsICZjcHVtYXAsIDApKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJy LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNwdW1hcFxuIik7CisgICAgICAgIGdvdG8gb3V0X2NmZzsK KyAgICB9CisgICAgaWYgKCF4bHVfY2ZnX2dldF9saXN0KGNvbmZpZywgIm5vZGVzIiwgJm5vZGVz LCAwLCAwKSkgeworICAgICAgICBpbnQgbnI7CisgICAgICAgIG5fY3B1cyA9IDA7CisgICAgICAg IG5fbm9kZXMgPSAwOworICAgICAgICB0b3BvbG9neSA9IGxpYnhsX2dldF9jcHVfdG9wb2xvZ3ko Y3R4LCAmbnIpOworICAgICAgICBpZiAodG9wb2xvZ3kgPT0gTlVMTCkgeworICAgICAgICAgICAg ZnByaW50ZihzdGRlcnIsICJsaWJ4bF9nZXRfdG9wb2xvZ3lpbmZvIGZhaWxlZFxuIik7CisgICAg ICAgICAgICBnb3RvIG91dF9jZmc7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChidWYgPSB4 bHVfY2ZnX2dldF9saXN0aXRlbShub2Rlcywgbl9ub2RlcykpICE9IE5VTEwpIHsKKyAgICAgICAg ICAgIG4gPSBhdG9pKGJ1Zik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykg eworICAgICAgICAgICAgICAgIGlmICgodG9wb2xvZ3lbaV0ubm9kZSA9PSBuKSAmJgorICAgICAg ICAgICAgICAgICAgICBsaWJ4bF9iaXRtYXBfdGVzdCgmZnJlZW1hcCwgaSkpIHsKKyAgICAgICAg ICAgICAgICAgICAgbGlieGxfYml0bWFwX3NldCgmY3B1bWFwLCBpKTsKKyAgICAgICAgICAgICAg ICAgICAgbl9jcHVzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg ICAgICAgbl9ub2RlcysrOworICAgICAgICB9CisKKyAgICAgICAgbGlieGxfY3B1dG9wb2xvZ3lf bGlzdF9mcmVlKHRvcG9sb2d5LCBucik7CisKKyAgICAgICAgaWYgKG5fY3B1cyA9PSAwKSB7Cisg ICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIGZyZWUgY3B1IGZvdW5kXG4iKTsKKyAgICAg ICAgICAgIGdvdG8gb3V0X2NmZzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXhsdV9jZmdf Z2V0X2xpc3QoY29uZmlnLCAiY3B1cyIsICZjcHVzLCAwLCAxKSkgeworICAgICAgICBuX2NwdXMg PSAwOworICAgICAgICB3aGlsZSAoKGJ1ZiA9IHhsdV9jZmdfZ2V0X2xpc3RpdGVtKGNwdXMsIG5f Y3B1cykpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGkgPSBhdG9pKGJ1Zik7CisgICAgICAgICAg ICBpZiAoKGkgPCAwKSB8fCAhbGlieGxfYml0bWFwX3Rlc3QoJmZyZWVtYXAsIGkpKSB7CisgICAg ICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjcHUgJWQgaWxsZWdhbCBvciBub3QgZnJlZVxu IiwgaSk7CisgICAgICAgICAgICAgICAgZ290byBvdXRfY2ZnOworICAgICAgICAgICAgfQorICAg ICAgICAgICAgbGlieGxfYml0bWFwX3NldCgmY3B1bWFwLCBpKTsKKyAgICAgICAgICAgIG5fY3B1 cysrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgheGx1X2NmZ19nZXRfc3RyaW5nKGNvbmZp ZywgImNwdXMiLCAmYnVmLCAwKSkgeworICAgICAgICBpZiAocGFyc2VfY3B1cmFuZ2UoYnVmLCAm Y3B1bWFwKSkKKyAgICAgICAgICAgIGdvdG8gb3V0X2NmZzsKKworICAgICAgICBuX2NwdXMgPSAw OworICAgICAgICBsaWJ4bF9mb3JfZWFjaF9zZXRfYml0KGksIGNwdW1hcCkgeworICAgICAgICAg ICAgaWYgKCFsaWJ4bF9iaXRtYXBfdGVzdCgmZnJlZW1hcCwgaSkpIHsKKyAgICAgICAgICAgICAg ICBmcHJpbnRmKHN0ZGVyciwgImNwdSAlZCBpbGxlZ2FsIG9yIG5vdCBmcmVlXG4iLCBpKTsKKyAg ICAgICAgICAgICAgICBnb3RvIG91dF9jZmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBu X2NwdXMrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBuX2NwdXMgPSAwOworCisg ICAgbGlieGxfdXVpZF9nZW5lcmF0ZSgmdXVpZCk7CisKKyAgICBwcmludGYoIlVzaW5nIGNvbmZp ZyBmaWxlIFwiJXNcIlxuIiwgY29uZmlnX3NyYyk7CisgICAgcHJpbnRmKCJjcHVwb29sIG5hbWU6 ICAgJXNcbiIsIG5hbWUpOworICAgIHByaW50Zigic2NoZWR1bGVyOiAgICAgICVzXG4iLCBsaWJ4 bF9zY2hlZHVsZXJfdG9fc3RyaW5nKHNjaGVkKSk7CisgICAgcHJpbnRmKCJudW1iZXIgb2YgY3B1 czogJWRcbiIsIG5fY3B1cyk7CisKKyAgICBpZiAoIWRyeXJ1bl9vbmx5KSB7CisgICAgICAgIHBv b2xpZCA9IExJQlhMX0NQVVBPT0xfUE9PTElEX0FOWTsKKyAgICAgICAgaWYgKGxpYnhsX2NwdXBv b2xfY3JlYXRlKGN0eCwgbmFtZSwgc2NoZWQsIGNwdW1hcCwgJnV1aWQsICZwb29saWQpKSB7Cisg ICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIG9uIGNyZWF0aW5nIGNwdXBvb2xcbiIp OworICAgICAgICAgICAgZ290byBvdXRfY2ZnOworICAgICAgICB9CisgICAgfQorICAgIC8qIFdl IG1hZGUgaXQhICovCisgICAgcmMgPSBFWElUX1NVQ0NFU1M7CisKK291dF9jZmc6CisgICAgeGx1 X2NmZ19kZXN0cm95KGNvbmZpZyk7CitvdXQ6CisgICAgbGlieGxfYml0bWFwX2Rpc3Bvc2UoJmZy ZWVtYXApOworICAgIGxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjcHVtYXApOworICAgIGZyZWUobmFt ZSk7CisgICAgZnJlZShjb25maWdfZGF0YSk7CisgICAgZnJlZShleHRyYV9jb25maWcpOworICAg IHJldHVybiByYzsKK30KKworaW50IG1haW5fY3B1cG9vbGxpc3QoaW50IGFyZ2MsIGNoYXIgKiph cmd2KQoreworICAgIGludCBvcHQ7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0g eworICAgICAgICB7ImNwdXMiLCAwLCAwLCAnYyd9LAorICAgICAgICBDT01NT05fTE9OR19PUFRT CisgICAgfTsKKyAgICBpbnQgb3B0X2NwdXMgPSAwOworICAgIGNvbnN0IGNoYXIgKnBvb2wgPSBO VUxMOworICAgIGxpYnhsX2NwdXBvb2xpbmZvICpwb29saW5mbzsKKyAgICBpbnQgbl9wb29scywg cCwgYywgbjsKKyAgICB1aW50MzJfdCBwb29saWQ7CisgICAgY2hhciAqbmFtZTsKKworICAgIFNX SVRDSF9GT1JFQUNIX09QVChvcHQsICJjIiwgb3B0cywgImNwdXBvb2wtbGlzdCIsIDApIHsKKyAg ICBjYXNlICdjJzoKKyAgICAgICAgb3B0X2NwdXMgPSAxOworICAgICAgICBicmVhazsKKyAgICB9 CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBwb29sID0gYXJndltvcHRpbmRd OworICAgICAgICBpZiAobGlieGxfbmFtZV90b19jcHVwb29saWQoY3R4LCBwb29sLCAmcG9vbGlk KSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQb29sIFwnJXNcJyBkb2VzIG5vdCBl eGlzdFxuIiwgcG9vbCk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAg ICB9CisgICAgfQorCisgICAgcG9vbGluZm8gPSBsaWJ4bF9saXN0X2NwdXBvb2woY3R4LCAmbl9w b29scyk7CisgICAgaWYgKCFwb29saW5mbykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVy cm9yIGdldHRpbmcgY3B1cG9vbCBpbmZvXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVS RTsKKyAgICB9CisKKyAgICBwcmludGYoIiUtMTlzIiwgIk5hbWUiKTsKKyAgICBpZiAob3B0X2Nw dXMpCisgICAgICAgIHByaW50ZigiQ1BVIGxpc3RcbiIpOworICAgIGVsc2UKKyAgICAgICAgcHJp bnRmKCJDUFVzICAgU2NoZWQgICAgIEFjdGl2ZSAgIERvbWFpbiBjb3VudFxuIik7CisKKyAgICBm b3IgKHAgPSAwOyBwIDwgbl9wb29sczsgcCsrKSB7CisgICAgICAgIGlmICghcG9vbCB8fCAocG9v bGluZm9bcF0ucG9vbGlkID09IHBvb2xpZCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBwb29saW5m b1twXS5wb29sX25hbWU7CisgICAgICAgICAgICBwcmludGYoIiUtMTlzIiwgbmFtZSk7CisgICAg ICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIGxpYnhsX2Zvcl9lYWNoX2JpdChjLCBwb29saW5m b1twXS5jcHVtYXApCisgICAgICAgICAgICAgICAgaWYgKGxpYnhsX2JpdG1hcF90ZXN0KCZwb29s aW5mb1twXS5jcHVtYXAsIGMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuICYmIG9wdF9j cHVzKSBwcmludGYoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wdF9jcHVzKSBwcmlu dGYoIiVkIiwgYyk7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICBpZiAoIW9wdF9jcHVzKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIl M2QgJTlzICAgICAgIHkgICAgICAgJTRkIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGli eGxfc2NoZWR1bGVyX3RvX3N0cmluZyhwb29saW5mb1twXS5zY2hlZCksCisgICAgICAgICAgICAg ICAgICAgICAgIHBvb2xpbmZvW3BdLm5fZG9tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg IHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxpYnhsX2NwdXBvb2xpbmZv X2xpc3RfZnJlZShwb29saW5mbywgbl9wb29scyk7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNT OworfQorCitpbnQgbWFpbl9jcHVwb29sZGVzdHJveShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7 CisgICAgaW50IG9wdDsKKyAgICBjb25zdCBjaGFyICpwb29sOworICAgIHVpbnQzMl90IHBvb2xp ZDsKKworICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICIiLCBOVUxMLCAiY3B1cG9vbC1kZXN0 cm95IiwgMSkgeworICAgICAgICAvKiBObyBvcHRpb25zICovCisgICAgfQorCisgICAgcG9vbCA9 IGFyZ3Zbb3B0aW5kXTsKKworICAgIGlmIChsaWJ4bF9jcHVwb29sX3F1YWxpZmllcl90b19jcHVw b29saWQoY3R4LCBwb29sLCAmcG9vbGlkLCBOVUxMKSB8fAorICAgICAgICAhbGlieGxfY3B1cG9v bGlkX2lzX3ZhbGlkKGN0eCwgcG9vbGlkKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVu a25vd24gY3B1cG9vbCAnJXMnXG4iLCBwb29sKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVS RTsKKyAgICB9CisKKyAgICBpZiAobGlieGxfY3B1cG9vbF9kZXN0cm95KGN0eCwgcG9vbGlkKSkg eworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGRlc3Ryb3kgY3B1cG9vbCAnJXMnXG4i LCBwb29sKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1 cm4gRVhJVF9TVUNDRVNTOworfQorCitpbnQgbWFpbl9jcHVwb29scmVuYW1lKGludCBhcmdjLCBj aGFyICoqYXJndikKK3sKKyAgICBpbnQgb3B0OworICAgIGNvbnN0IGNoYXIgKnBvb2w7CisgICAg Y29uc3QgY2hhciAqbmV3X25hbWU7CisgICAgdWludDMyX3QgcG9vbGlkOworCisgICAgU1dJVENI X0ZPUkVBQ0hfT1BUKG9wdCwgIiIsIE5VTEwsICJjcHVwb29sLXJlbmFtZSIsIDIpIHsKKyAgICAg ICAgLyogTm8gb3B0aW9ucyAqLworICAgIH0KKworICAgIHBvb2wgPSBhcmd2W29wdGluZCsrXTsK KworICAgIGlmIChsaWJ4bF9jcHVwb29sX3F1YWxpZmllcl90b19jcHVwb29saWQoY3R4LCBwb29s LCAmcG9vbGlkLCBOVUxMKSB8fAorICAgICAgICAhbGlieGxfY3B1cG9vbGlkX2lzX3ZhbGlkKGN0 eCwgcG9vbGlkKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY3B1cG9vbCAn JXMnXG4iLCBwb29sKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAg ICBuZXdfbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKworICAgIGlmIChsaWJ4bF9jcHVwb29sX3JlbmFt ZShjdHgsIG5ld19uYW1lLCBwb29saWQpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fu J3QgcmVuYW1lIGNwdXBvb2wgJyVzJ1xuIiwgcG9vbCk7CisgICAgICAgIHJldHVybiBFWElUX0ZB SUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworaW50IG1haW5f Y3B1cG9vbGNwdWFkZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IG9wdDsKKyAg ICBjb25zdCBjaGFyICpwb29sOworICAgIHVpbnQzMl90IHBvb2xpZDsKKyAgICBsaWJ4bF9iaXRt YXAgY3B1bWFwOworICAgIGludCByYyA9IEVYSVRfRkFJTFVSRTsKKworICAgIFNXSVRDSF9GT1JF QUNIX09QVChvcHQsICIiLCBOVUxMLCAiY3B1cG9vbC1jcHUtYWRkIiwgMikgeworICAgICAgICAv KiBObyBvcHRpb25zICovCisgICAgfQorCisgICAgbGlieGxfYml0bWFwX2luaXQoJmNwdW1hcCk7 CisgICAgaWYgKGxpYnhsX2NwdV9iaXRtYXBfYWxsb2MoY3R4LCAmY3B1bWFwLCAwKSkgeworICAg ICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBjcHVtYXAiKTsKKyAgICAg ICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBwb29sID0gYXJndltvcHRpbmQr K107CisgICAgaWYgKHBhcnNlX2NwdXJhbmdlKGFyZ3Zbb3B0aW5kXSwgJmNwdW1hcCkpCisgICAg ICAgIGdvdG8gb3V0OworCisgICAgaWYgKGxpYnhsX2NwdXBvb2xfcXVhbGlmaWVyX3RvX2NwdXBv b2xpZChjdHgsIHBvb2wsICZwb29saWQsIE5VTEwpIHx8CisgICAgICAgICFsaWJ4bF9jcHVwb29s aWRfaXNfdmFsaWQoY3R4LCBwb29saWQpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5r bm93biBjcHVwb29sIFwnJXNcJ1xuIiwgcG9vbCk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0K KworICAgIGlmIChsaWJ4bF9jcHVwb29sX2NwdWFkZF9jcHVtYXAoY3R4LCBwb29saWQsICZjcHVt YXApKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvbWUgY3B1cyBtYXkgbm90IGhhdmUgYmVl biBhZGRlZCB0byAlc1xuIiwgcG9vbCk7CisKKyAgICByYyA9IEVYSVRfU1VDQ0VTUzsKKworb3V0 OgorICAgIGxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjcHVtYXApOworICAgIHJldHVybiByYzsKK30K KworaW50IG1haW5fY3B1cG9vbGNwdXJlbW92ZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7Cisg ICAgaW50IG9wdDsKKyAgICBjb25zdCBjaGFyICpwb29sOworICAgIHVpbnQzMl90IHBvb2xpZDsK KyAgICBsaWJ4bF9iaXRtYXAgY3B1bWFwOworICAgIGludCByYyA9IEVYSVRfRkFJTFVSRTsKKwor ICAgIGxpYnhsX2JpdG1hcF9pbml0KCZjcHVtYXApOworICAgIGlmIChsaWJ4bF9jcHVfYml0bWFw X2FsbG9jKGN0eCwgJmNwdW1hcCwgMCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFi bGUgdG8gYWxsb2NhdGUgY3B1bWFwIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Cisg ICAgfQorCisgICAgU1dJVENIX0ZPUkVBQ0hfT1BUKG9wdCwgIiIsIE5VTEwsICJjcHVwb29sLWNw dS1yZW1vdmUiLCAyKSB7CisgICAgICAgIC8qIE5vIG9wdGlvbnMgKi8KKyAgICB9CisKKyAgICBw b29sID0gYXJndltvcHRpbmQrK107CisgICAgaWYgKHBhcnNlX2NwdXJhbmdlKGFyZ3Zbb3B0aW5k XSwgJmNwdW1hcCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgaWYgKGxpYnhsX2NwdXBvb2xf cXVhbGlmaWVyX3RvX2NwdXBvb2xpZChjdHgsIHBvb2wsICZwb29saWQsIE5VTEwpIHx8CisgICAg ICAgICFsaWJ4bF9jcHVwb29saWRfaXNfdmFsaWQoY3R4LCBwb29saWQpKSB7CisgICAgICAgIGZw cmludGYoc3RkZXJyLCAidW5rbm93biBjcHVwb29sIFwnJXNcJ1xuIiwgcG9vbCk7CisgICAgICAg IGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChsaWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9jcHVt YXAoY3R4LCBwb29saWQsICZjcHVtYXApKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU29t ZSBjcHVzIG1heSBoYXZlIG5vdCBvciBvbmx5IHBhcnRpYWxseSBiZWVuIHJlbW92ZWQgZnJvbSAn JXMnLlxuIiwgcG9vbCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSWYgYSBjcHUgY2FuJ3Qg YmUgYWRkZWQgdG8gYW5vdGhlciBjcHVwb29sLCBhZGQgaXQgdG8gJyVzJyBhZ2FpbiBhbmQgcmV0 cnkuXG4iLCBwb29sKTsKKyAgICB9CisKKyAgICByYyA9IEVYSVRfU1VDQ0VTUzsKKworb3V0Ogor ICAgIGxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjcHVtYXApOworICAgIHJldHVybiByYzsKK30KKwor aW50IG1haW5fY3B1cG9vbG1pZ3JhdGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGlu dCBvcHQ7CisgICAgY29uc3QgY2hhciAqcG9vbDsKKyAgICB1aW50MzJfdCBwb29saWQ7CisgICAg Y29uc3QgY2hhciAqZG9tOworICAgIHVpbnQzMl90IGRvbWlkOworCisgICAgU1dJVENIX0ZPUkVB Q0hfT1BUKG9wdCwgIiIsIE5VTEwsICJjcHVwb29sLW1pZ3JhdGUiLCAyKSB7CisgICAgICAgIC8q IE5vIG9wdGlvbnMgKi8KKyAgICB9CisKKyAgICBkb20gPSBhcmd2W29wdGluZCsrXTsKKyAgICBw b29sID0gYXJndltvcHRpbmRdOworCisgICAgaWYgKGxpYnhsX2RvbWFpbl9xdWFsaWZpZXJfdG9f ZG9taWQoY3R4LCBkb20sICZkb21pZCkgfHwKKyAgICAgICAgIWxpYnhsX2RvbWlkX3RvX25hbWUo Y3R4LCBkb21pZCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGRvbWFpbiAn JXMnXG4iLCBkb20pOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAg IGlmIChsaWJ4bF9jcHVwb29sX3F1YWxpZmllcl90b19jcHVwb29saWQoY3R4LCBwb29sLCAmcG9v bGlkLCBOVUxMKSB8fAorICAgICAgICAhbGlieGxfY3B1cG9vbGlkX2lzX3ZhbGlkKGN0eCwgcG9v bGlkKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY3B1cG9vbCAnJXMnXG4i LCBwb29sKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAo bGlieGxfY3B1cG9vbF9tb3ZlZG9tYWluKGN0eCwgcG9vbGlkLCBkb21pZCkpCisgICAgICAgIHJl dHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitpbnQg bWFpbl9jcHVwb29sbnVtYXNwbGl0KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQg cmM7CisgICAgaW50IG9wdDsKKyAgICBpbnQgcDsKKyAgICBpbnQgYzsKKyAgICBpbnQgbjsKKyAg ICB1aW50MzJfdCBwb29saWQ7CisgICAgbGlieGxfc2NoZWR1bGVyIHNjaGVkOworICAgIGludCBu X3Bvb2xzOworICAgIGludCBub2RlOworICAgIGludCBuX2NwdXM7CisgICAgY2hhciAqbmFtZSA9 IE5VTEw7CisgICAgbGlieGxfdXVpZCB1dWlkOworICAgIGxpYnhsX2JpdG1hcCBjcHVtYXA7Cisg ICAgbGlieGxfY3B1cG9vbGluZm8gKnBvb2xpbmZvOworICAgIGxpYnhsX2NwdXRvcG9sb2d5ICp0 b3BvbG9neTsKKyAgICBsaWJ4bF9kb21pbmZvIGluZm87CisKKyAgICBTV0lUQ0hfRk9SRUFDSF9P UFQob3B0LCAiIiwgTlVMTCwgImNwdXBvb2wtbnVtYS1zcGxpdCIsIDApIHsKKyAgICAgICAgLyog Tm8gb3B0aW9ucyAqLworICAgIH0KKworICAgIGxpYnhsX2RvbWluZm9faW5pdCgmaW5mbyk7CisK KyAgICByYyA9IEVYSVRfRkFJTFVSRTsKKworICAgIGxpYnhsX2JpdG1hcF9pbml0KCZjcHVtYXAp OworICAgIHBvb2xpbmZvID0gbGlieGxfbGlzdF9jcHVwb29sKGN0eCwgJm5fcG9vbHMpOworICAg IGlmICghcG9vbGluZm8pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBnZXR0aW5n IGNwdXBvb2wgaW5mb1xuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQor ICAgIHBvb2xpZCA9IHBvb2xpbmZvWzBdLnBvb2xpZDsKKyAgICBzY2hlZCA9IHBvb2xpbmZvWzBd LnNjaGVkOworICAgIGxpYnhsX2NwdXBvb2xpbmZvX2xpc3RfZnJlZShwb29saW5mbywgbl9wb29s cyk7CisKKyAgICBpZiAobl9wb29scyA+IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJz cGxpdHRpbmcgbm90IHBvc3NpYmxlLCBhbHJlYWR5IGNwdXBvb2xzIGluIHVzZVxuIik7CisgICAg ICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgdG9wb2xvZ3kgPSBsaWJ4bF9n ZXRfY3B1X3RvcG9sb2d5KGN0eCwgJm5fY3B1cyk7CisgICAgaWYgKHRvcG9sb2d5ID09IE5VTEwp IHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4bF9nZXRfdG9wb2xvZ3lpbmZvIGZhaWxl ZFxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKGxp YnhsX2NwdV9iaXRtYXBfYWxsb2MoY3R4LCAmY3B1bWFwLCAwKSkgeworICAgICAgICBmcHJpbnRm KHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjcHVtYXBcbiIpOworICAgICAgICBnb3RvIG91 dDsKKyAgICB9CisKKyAgICAvKiBSZXNldCBQb29sLTAgdG8gMXN0IG5vZGU6IGZpcnN0IGFkZCBj cHVzLCB0aGVuIHJlbW92ZSBjcHVzIHRvIGF2b2lkCisgICAgICAgYSBjcHVwb29sIHdpdGhvdXQg Y3B1cyBpbiBiZXR3ZWVuICovCisKKyAgICBub2RlID0gdG9wb2xvZ3lbMF0ubm9kZTsKKyAgICBp ZiAobGlieGxfY3B1cG9vbF9jcHVhZGRfbm9kZShjdHgsIDAsIG5vZGUsICZuKSkgeworICAgICAg ICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIG9uIGFkZGluZyBjcHUgdG8gUG9vbCAwXG4iKTsKKyAg ICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgeGFzcHJpbnRmKCZuYW1lLCAiUG9vbC1ub2Rl JWQiLCBub2RlKTsKKyAgICBpZiAobGlieGxfY3B1cG9vbF9yZW5hbWUoY3R4LCBuYW1lLCAwKSkg eworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIG9uIHJlbmFtaW5nIFBvb2wgMFxuIik7 CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIG4gPSAwOworICAgIGZvciAoYyA9IDA7 IGMgPCBuX2NwdXM7IGMrKykgeworICAgICAgICBpZiAodG9wb2xvZ3lbY10ubm9kZSA9PSBub2Rl KSB7CisgICAgICAgICAgICB0b3BvbG9neVtjXS5ub2RlID0gTElCWExfQ1BVVE9QT0xPR1lfSU5W QUxJRF9FTlRSWTsKKyAgICAgICAgICAgIGxpYnhsX2JpdG1hcF9zZXQoJmNwdW1hcCwgbik7Cisg ICAgICAgICAgICBuKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGxpYnhsX2RvbWFpbl9p bmZvKGN0eCwgJmluZm8sIDApKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3Igb24g Z2V0dGluZyBpbmZvIGZvciBEb21haW4tMFxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0K KyAgICBpZiAoaW5mby52Y3B1X29ubGluZSA+IG4gJiYgbGlieGxfc2V0X3ZjcHVvbmxpbmUoY3R4 LCAwLCAmY3B1bWFwKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIG9uIHJlbW92 aW5nIHZjcHVzIGZvciBEb21haW4tMFxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAg ICBmb3IgKGMgPSAwOyBjIDwgMTA7IGMrKykgeworICAgICAgICAvKiBXZSd2ZSBjYWxsZWQgbGli eGxfZG9taW5mb19pbml0IGJlZm9yZSB0aGUgbG9vcCBhbmQgd2lsbAorICAgICAgICAgKiBjYWxs IGxpYnhsX2RvbWluZm9fZGlzcG9zZSBhZnRlciB0aGUgbG9vcCB3aGVuIHdlJ3JlIGRvbmUKKyAg ICAgICAgICogd2l0aCBpbmZvLgorICAgICAgICAgKi8KKyAgICAgICAgbGlieGxfZG9taW5mb19k aXNwb3NlKCZpbmZvKTsKKyAgICAgICAgbGlieGxfZG9taW5mb19pbml0KCZpbmZvKTsKKyAgICAg ICAgaWYgKGxpYnhsX2RvbWFpbl9pbmZvKGN0eCwgJmluZm8sIDApKSB7CisgICAgICAgICAgICBm cHJpbnRmKHN0ZGVyciwgImVycm9yIG9uIGdldHRpbmcgaW5mbyBmb3IgRG9tYWluLTBcbiIpOwor ICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZm8udmNwdV9v bmxpbmUgPD0gbikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2xl ZXAoMSk7CisgICAgfQorICAgIGlmIChpbmZvLnZjcHVfb25saW5lID4gbikgeworICAgICAgICBm cHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvZmZsaW5lIHZjcHVzXG4iKTsKKyAgICAgICAgZ290 byBvdXQ7CisgICAgfQorICAgIGxpYnhsX2JpdG1hcF9zZXRfbm9uZSgmY3B1bWFwKTsKKworICAg IGZvciAoYyA9IDA7IGMgPCBuX2NwdXM7IGMrKykgeworICAgICAgICBpZiAodG9wb2xvZ3lbY10u bm9kZSA9PSBMSUJYTF9DUFVUT1BPTE9HWV9JTlZBTElEX0VOVFJZKSB7CisgICAgICAgICAgICBj b250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUgPSB0b3BvbG9neVtjXS5ub2RlOwor ICAgICAgICBpZiAobGlieGxfY3B1cG9vbF9jcHVyZW1vdmVfbm9kZShjdHgsIDAsIG5vZGUsICZu KSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBvbiByZW1vdmluZyBjcHUg ZnJvbSBQb29sIDBcbiIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAg ICAgICBmcmVlKG5hbWUpOworICAgICAgICB4YXNwcmludGYoJm5hbWUsICJQb29sLW5vZGUlZCIs IG5vZGUpOworICAgICAgICBsaWJ4bF91dWlkX2dlbmVyYXRlKCZ1dWlkKTsKKyAgICAgICAgcG9v bGlkID0gMDsKKyAgICAgICAgaWYgKGxpYnhsX2NwdXBvb2xfY3JlYXRlKGN0eCwgbmFtZSwgc2No ZWQsIGNwdW1hcCwgJnV1aWQsICZwb29saWQpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVy ciwgImVycm9yIG9uIGNyZWF0aW5nIGNwdXBvb2xcbiIpOworICAgICAgICAgICAgZ290byBvdXQ7 CisgICAgICAgIH0KKworICAgICAgICBpZiAobGlieGxfY3B1cG9vbF9jcHVhZGRfbm9kZShjdHgs IHBvb2xpZCwgbm9kZSwgJm4pKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9y IG9uIGFkZGluZyBjcHVzIHRvIGNwdXBvb2xcbiIpOworICAgICAgICAgICAgZ290byBvdXQ7Cisg ICAgICAgIH0KKworICAgICAgICBmb3IgKHAgPSBjOyBwIDwgbl9jcHVzOyBwKyspIHsKKyAgICAg ICAgICAgIGlmICh0b3BvbG9neVtwXS5ub2RlID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB0 b3BvbG9neVtwXS5ub2RlID0gTElCWExfQ1BVVE9QT0xPR1lfSU5WQUxJRF9FTlRSWTsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gRVhJVF9TVUNDRVNTOworCitv dXQ6CisgICAgbGlieGxfY3B1dG9wb2xvZ3lfbGlzdF9mcmVlKHRvcG9sb2d5LCBuX2NwdXMpOwor ICAgIGxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjcHVtYXApOworICAgIGxpYnhsX2RvbWluZm9fZGlz cG9zZSgmaW5mbyk7CisgICAgZnJlZShuYW1lKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoK KyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIG1vZGU6IEMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA0Cisg KiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqLwotLSAKMi4xMS4wCgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxp bmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVu LWRldmVsCg==