From owner-freebsd-wireless@FreeBSD.ORG Thu Aug 15 12:03:32 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 643BF2A0; Thu, 15 Aug 2013 12:03:32 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vb0-x233.google.com (mail-vb0-x233.google.com [IPv6:2607:f8b0:400c:c02::233]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id D0B372AD7; Thu, 15 Aug 2013 12:03:31 +0000 (UTC) Received: by mail-vb0-f51.google.com with SMTP id x16so437856vbf.24 for ; Thu, 15 Aug 2013 05:03:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=lS1JznlvIcv/eRJULwv/O1uCEiI1Bxc9NEbAjozv2q0=; b=YngHIUUG/xkeYRhof0ESUwkJY+zPoZ9krh5Sd81VmGqgkby26YCtU6v8b+6n1n3DxM iADGzu1wo6diEJtHQgcL13gsTPnS6QXrvsXDvrIn6oWizYdpuprNQzKxxeM7r6cUg/5j gDkGesNoxvOH0XxIg+3iTXD9Ds/nToMjVYAfSwGAwlFpol0BwA9zU76+x0JAeEUATXU8 gudJeFiUTDNuPp1XLWisICRINH4hHWk+53YWv6xiFcBKCdeUgWCbMVGxKQ/JVPhKqQ2T 9R5g3HiOS1UCMlhcogGw3z1couga7pjR+KMbMId6m0+KDRtm15z/oFWBZv393nc+OFmi h7NQ== MIME-Version: 1.0 X-Received: by 10.221.6.195 with SMTP id ol3mr1267vcb.34.1376568210967; Thu, 15 Aug 2013 05:03:30 -0700 (PDT) Received: by 10.220.57.142 with HTTP; Thu, 15 Aug 2013 05:03:30 -0700 (PDT) In-Reply-To: References: Date: Thu, 15 Aug 2013 20:03:30 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: multipart/mixed; boundary=089e013cbc8c39586e04e3fb4374 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Aug 2013 12:03:32 -0000 --089e013cbc8c39586e04e3fb4374 Content-Type: text/plain; charset=ISO-8859-1 Hi! Here is my latest update. In this update: * add a new struct, ieee80211_ratectl_node. This is the common state that all per node rc state, i.e. ieee80211_[amrr|sample]_node, should contains it as the first field. It's now used to store the capabilities. see below. * rename ir_capabilities to irn_capabilities and move it to ieee80211_ratectl_node (it contained in ieee80211_[amrr|sample]_node). ieee80211_ratectl is readonly, so ir_capabilities can't be set. And, the capabilities is not a part of rc algo. It seems that it should be put in the per node rc state. Interface of ieee80211_ratectl_node_init() and its callers are updated. References to ir_capabilities are also adapted. * add ieee80211_ratectl_[node_is11n|get_rateset] to the ratectl api. rc algoes all need these functions. * change the naming conversion of IEEE80211_RATECTL_FLAG_*. * some errors fixed. On Thu, Aug 15, 2013 at 12:58 AM, Adrian Chadd wrote: > Hi! > > So yes, we do need to have a generic way of returning that completion > information to the rate control code. > > I'm all for you churning the rate control API to return a struct > ieee80211_rc_info in the complete function and totally just kill arg1/arg2. > That forces us to extend ieee80211_rc_info to be "right" for all the > drivers. > Do you mean drop arg1/arg2 and pass pointer of ieee80211_rc_info to the complete function directly? Or return it when complete function return? > What wifi devices do you have there? It looks like we're almost at the > point where we can start converting a few things to use the modified rate > control API and modules - notably iwn (which won't use the multi-rate retry > stuff to begin with - it works "differently"..) and ath (which will use the > multi-rate retry stuff and the sample rate control module.) > Yeah, I have an AR9227 device at hand. And, I also get a question here. The ieee80211_ratetable doesn't get a rateCode field. So, how we get the ratecode of the non_ht rate? Thanks! Chenchong --089e013cbc8c39586e04e3fb4374 Content-Type: application/octet-stream; name="20130815-net80211-ratectl.diff" Content-Disposition: attachment; filename="20130815-net80211-ratectl.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hkdwimbd0 SW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBu ZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9ub25lLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIG5l dDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwkod29ya2luZyBjb3B5KQpAQCAtNTcsNyAr NTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbm9uZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIx MV9ub2RlICpuaSkKK25vbmVfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHVp bnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAluaS0+bmlfdHhyYXRlID0gbmktPm5pX3JhdGVzLnJz X3JhdGVzWzBdICYgSUVFRTgwMjExX1JBVEVfVkFMOwogfQpJbmRleDogbmV0ODAyMTEvaWVlZTgw MjExX3JhdGVjdGwuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5j CShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCSh3b3Jr aW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVp IFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dApAQCAtNDksNiArNTAsMzMgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjEx X1JBVEVDVEwsICI4MDIxMXJhdGVjdGwiLCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitpbnQg bWF4XzRtc19mcmFtZWxlbls0XVszMl0gPSB7CisJW01DU19IVDIwXSA9IHsKKwkJMzIxMiwgIDY0 MzIsICA5NjQ4LCAgMTI4NjQsICAxOTMwMCwgIDI1NzM2LCAgMjg5NTIsICAzMjE3MiwKKwkJNjQy NCwgIDEyODUyLCAxOTI4MCwgMjU3MDgsICAzODU2OCwgIDUxNDI0LCAgNTc4NTIsICA2NDI4MCwK KwkJOTYyOCwgIDE5MjYwLCAyODg5NiwgMzg1MjgsICA1Nzc5MiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwkJMTI4MjgsIDI1NjU2LCAzODQ4OCwgNTEzMjAsICA2NTUzMiwgIDY1NTMyLCAgNjU1 MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQyMF9TR0ldID0geworCQkzNTcyLCAgNzE0NCwgIDEw NzIwLCAgMTQyOTYsICAyMTQ0NCwgIDI4NTk2LCAgMzIxNzIsICAzNTc0NCwKKwkJNzE0MCwgIDE0 Mjg0LCAyMTQyOCwgIDI4NTY4LCAgNDI4NTYsICA1NzE0NCwgIDY0Mjg4LCAgNjU1MzIsCisJCTEw NzAwLCAyMTQwOCwgMzIxMTIsICA0MjgxNiwgIDY0MjI4LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMy LAorCQkxNDI1NiwgMjg1MTYsIDQyNzgwLCAgNTcwNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs ICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF0gPSB7CisJCTY2ODAsICAxMzM2MCwgIDIwMDQ0LCAg MjY3MjQsICA0MDA5MiwgIDUzNDU2LCAgNjAxNDAsICA2NTUzMiwKKwkJMTMzNDgsIDI2NzAwLCAg NDAwNTIsICA1MzQwMCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyMDAwNCwg NDAwMDgsICA2MDAxNiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ CTI2NjQ0LCA1MzI5MiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF9TR0ldID0geworCQk3NDIwLCAgMTQ4NDQsICAyMjI3Miwg IDI5Njk2LCAgNDQ1NDQsICA1OTM5NiwgIDY1NTMyLCAgNjU1MzIsCisJCTE0ODMyLCAyOTY2OCwg IDQ0NTA0LCAgNTkzNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjIyMzIs IDQ0NDY0LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAor CQkyOTYxNiwgNTkyMzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAg NjU1MzIsCisJfQorfTsKKwogdm9pZAogaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50IHR5 cGUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqcmF0ZWN0bCkKIHsKQEAgLTkwLDMg KzExOCwxMDIgQEAKIAl9CiAJdmFwLT5pdl9yYXRlID0gcmF0ZWN0bHNbdHlwZV07CiB9CisKK3Zv aWQKK2llZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3Moc3RydWN0IGllZWU4MDIxMV9u b2RlICpuaSwKKwkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvKQoreworCWNvbnN0 IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgw MjExX3JjX3NlcmllcyAqcmMgPSByY19pbmZvLT5yaV9yYzsKKwkvKiBpbnQgc2hvcnRQcmVhbWJs ZSA9IHJjX2luZm8tPnJpX3Nob3J0UHJlYW1ibGU7ICovCisJdWludDhfdCByYXRlOworCWludCBp OworCisJcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZShuaS0+bmlfaWMtPmljX2N1cmNoYW4p OworCisJLyogTWFrZSBzdXJlIHRoYXQgcmF0ZSBjb250cm9sIGNvZGUgZG9lc24ndCBtZXNzIGl0 IHVwLgorCSAqIElmIGVuYWJsZSBydHMvY3RzIGFuZCBpcyBwcmUtODAyLjExbiwgYmxhbmsgdHJp ZXMgMSwgMiwgMyAKKwkgKi8KKworCWlmICghIElFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlJQ Uk9UKG5pKSkKKwl7CisJCWZvciAoaSA9IDE7IGkgPCBJRUVFODAyMTFfUkFURUNUTF9OVU07IGkr KykKKwkJeworCQkJaWYgKHJjWzBdLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19SVFND VFMpCisJCQkJcmNbaV0udHJpZXMgPSAwOworCQkJcmNbaV0uZmxhZ3MgJj0gfklFRUU4MDIxMV9S QVRFQ1RMX0ZMQUdfUlRTQ1RTOyAKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAy MTFfUkFURUNUTF9OVU07IGkrKykgeworCQkKKwkJaWYgKHJjW2ldLnRyaWVzID09IDApCisJCQlj b250aW51ZTsKKworCQlyYXRlID0gcnQtPmluZm9bcmNbaV0ucml4XS5kb3QxMVJhdGU7CisKKwkJ LyoKKwkJICogT25seSBlbmFibGUgc2hvcnQgcHJlYW1ibGUgZm9yIGxlZ2FjeSByYXRlcworCQkg Ki8KKworCQkvKiBYWFggaG93IHdlIGdldCB0aGUgbm9uX2h0IHJhdGVjb2RlIGhlcmU/ICovCisK KwkJI2lmIDAKKwkJaWYgKCghIElTX0hUX1JBVEUocmF0ZSkpICYmIHNob3J0UHJlYW1ibGUpCisJ CQlyYXRlIHw9IHJ0LT5pbmZvW3JjW2ldLnJpeF0uc2hvcnRQcmVhbWJsZTsKKwkJI2VuZGlmCisK KwkJLyoKKwkJICogU2F2ZSB0aGlzLCB1c2VkIGJ5IHRoZSBUWCBhbmQgY29tcGxldGlvbiBjb2Rl CisJCSAqLworCQlyY1tpXS5yYXRlY29kZSA9IHJhdGU7CisKKwkJLyogT25seSBlbmFibGUgc2hv cnRnaSwgMjA0MCwgZHVhbC1zdHJlYW0gaWYgSFQgaXMgc2V0ICovCisJCWlmIChJU19IVF9SQVRF KHJhdGUpKSB7CisJCQlyY1tpXS5mbGFncyB8PSBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0hUOwor CisJCQkvKgorCQkJICogWFhYIFRPRE86IExEUEMKKwkJCSAqLworCisJCQkvKgorCQkJICogRHVh bCAvIFRyaXBsZSBzdHJlYW0gcmF0ZT8KKwkJCSAqLworCQkJaWYgKEhUX1JDXzJfU1RSRUFNUyhy YXRlKSA9PSAyKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfRFM7 CisJCQllbHNlIGlmIChIVF9SQ18yX1NUUkVBTVMocmF0ZSkgPT0gMykKKwkJCQlyY1tpXS5mbGFn cyB8PSBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1RTOworCQl9CisKKwkJLyoKKwkJICogQ2FsY3Vs YXRlIHRoZSBtYXhpbXVtIFRYIHBvd2VyIGNhcCBmb3IgdGhlIGN1cnJlbnQKKwkJICogbm9kZS4g CisJCSAqIFJhdGUgY29udHJvbCBhbGdvIGNhbid0IGNvbnRyb2wgVFggcG93ZXIgYnkgbm93Lgor CQkgKi8KKwkJcmNbaV0udHhfcG93ZXJfY2FwID0gaWVlZTgwMjExX2dldF9ub2RlX3R4cG93ZXIo bmkpOworCQkKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIDRtcyBmcmFtZSBsZW5n dGggYmFzZWQKKwkJICogb24gdGhlIE1DUyByYXRlLCBTR0kgYW5kIGNoYW5uZWwgd2lkdGggZmxh Z3MuCisJCSAqLworCQlpZiAoKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19I VCkgJiYKKwkJICAgIChIVF9SQ18yX01DUyhyYXRlKSA8IDMyKSkgeworCQkJaW50IGo7CisJCQlp ZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0NXNDApIHsKKwkJCQlpZiAo cmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NHSSkKKwkJCQkJaiA9IE1DU19I VDQwX1NHSTsKKwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQ0MDsKKwkJCX0gZWxzZSB7CisJCQkJ aWYgKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19TR0kpCisJCQkJCWogPSBN Q1NfSFQyMF9TR0k7CisJCQkJZWxzZQorCQkJCQlqID0gTUNTX0hUMjA7CisJCQl9CisJCQlyY1tp XS5tYXg0bXNmcmFtZWxlbiA9CisJCQkgICAgbWF4XzRtc19mcmFtZWxlbltqXVtIVF9SQ18yX01D UyhyYXRlKV07CisJCX0gZWxzZQorCQkJcmNbaV0ubWF4NG1zZnJhbWVsZW4gPSAwOworCX0KK30K KwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaAo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZXQ4 MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9p ZWVlODAyMTFfcmF0ZWN0bC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAg KiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBD b3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBB bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291 cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjQsNiArMjUsOCBAQAog ICoKICAqICRGcmVlQlNEJAogICovCisjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNU TF9IXworI2RlZmluZSBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfSF8KIAogZW51bSBpZWVl ODAyMTFfcmF0ZWFsZ3MgewogCUlFRUU4MDIxMV9SQVRFQ1RMX0FNUlIJCT0gMCwKQEAgLTM3LDYg KzQwLDY1IEBACiAjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RYX1NVQ0NFU1MJMQogI2RlZmlu ZQlJRUVFODAyMTFfUkFURUNUTF9UWF9GQUlMVVJFCTAKIAorI2RlZmluZQlJRUVFODAyMTFfUkFU RUNUTF9UUlVFCQkxCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZBTFNFCQkwCisKKyNkZWZp bmUJSUVFRTgwMjExX1JBVEVDVExfTlVNCQk0CisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExf RkxBR19EUwkJMHgwMQkvKiBkdWFsLXN0cmVhbSByYXRlICovCisjZGVmaW5lCUlFRUU4MDIxMV9S QVRFQ1RMX0ZMQUdfQ1c0MAkJMHgwMgkvKiB1c2UgSFQ0MCAqLworI2RlZmluZQlJRUVFODAyMTFf UkFURUNUTF9GTEFHX1NHSQkJMHgwNAkvKiB1c2Ugc2hvcnQtR0kgKi8KKyNkZWZpbmUJSUVFRTgw MjExX1JBVEVDVExfRkxBR19IVAkJMHgwOAkvKiB1c2UgSFQgKi8KKyNkZWZpbmUJSUVFRTgwMjEx X1JBVEVDVExfRkxBR19SVFNDVFMJMHgxMAkvKiBlbmFibGUgUlRTL0NUUyBwcm90ZWN0aW9uICov CisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfU1RCQwkJMHgyMAkvKiBlbmFibGUgU1RC QyAqLworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9GTEFHX1RTCQkweDQwCS8qIHRyaXBsZS1z dHJlYW0gcmF0ZSAqLworCisvKiBIYXJkd2FyZSBDQVBzIG9mZmVyZWQgdG8gcmF0ZSBjb250cm9s IGFsZ28gKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUgkJCTB4MDEJLyogc3Vw cG9ydCBNUlIgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUlBST1QJCTB4MDIJ Lyogc3VwcG9ydCBNUlIgKyBwcm90ZWN0ICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NB UF9NVUxUWENIQUlOCTB4MDQJLyogaGFzIG1vcmUgdGhhbiAxIHR4Y2hhaW4gKi8KKworI2RlZmlu ZSBJU19WQVBfSFQodmFwKQkoKHZhcCktPml2X2h0Y2FwcyAmIElFRUU4MDIxMV9IVENfSFQpCisj ZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0ZSkgJiAweDgwKQorI2RlZmluZSBIVF9S Q18yX01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisjZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhf cmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorCitlbnVtIHsKKwlNQ1NfSFQyMCwK KwlNQ1NfSFQyMF9TR0ksCisJTUNTX0hUNDAsCisJTUNTX0hUNDBfU0dJLAorfTsKKworZXh0ZXJu IGludCBtYXhfNG1zX2ZyYW1lbGVuWzRdWzMyXTsKKworc3RydWN0IGllZWU4MDIxMV9yY19zZXJp ZXMgeworCXVpbnQ4X3Qgcml4OwkJLyogcmF0ZXRhYmxlIGluZGV4LCBub3QgcmF0ZSBjb2RlICov CisJdWludDhfdCByYXRlY29kZTsJLyogaGFyZHdhcmUgcmF0ZSBjb2RlICovCisJdWludDhfdCB0 cmllczsKKwl1aW50OF90IHR4X3Bvd2VyX2NhcDsKKwl1aW50MTZfdCBmbGFnczsKKwl1aW50MTZf dCBtYXg0bXNmcmFtZWxlbjsKK307CisKKy8qIG5ldDgwMjExIHJhdGUgY29udHJvbCBpbmZvbWF0 aW9uICovCitzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8geworCXN0cnVjdCBpZWVlODAyMTFfcmNf c2VyaWVzIHJpX3JjW0lFRUU4MDIxMV9SQVRFQ1RMX05VTV07CisJaW50IHJpX2ZyYW1lbGVuOwor CWludCByaV9zaG9ydFByZWFtYmxlOworCisJLyogVFggaW5mbyAqLworCWludCByaV9zdWNjZXNz OwkJLyogVFggc3VjY2VzcyBvciBub3QgKi8KKwlpbnQgcmlfb2tjbnQ7CQkvKiBUWCBvayB3aXRo IG9yIHdpdGhvdXQgcmV0cnkgKi8KKwlpbnQgcmlfZmFpbGNudDsJCS8qIFRYIHJldHJ5LWZhaWwg Y291bnQgKi8KKwlpbnQgcmlfdHhjbnQ7CQkvKiBUWCBjb3VudCAqLworCWludCByaV9yZXRyeWNu dDsJLyogVFggcmV0cnkgY291bnQgKi8KKwlpbnQgcmlfc2hvcnRyZXRyeTsKKwlpbnQgcmlfbG9u Z3JldHJ5OworCWludCByaV9maW5hbHRzaTsKKwlpbnQgcmlfdHhyYXRlOwkJLyogaHcgdHggcmF0 ZSAqLworfTsKKwogc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHsKIAljb25zdCBjaGFyICppcl9u YW1lOwogCWludAkoKmlyX2F0dGFjaCkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKQEAg LTQzLDkgKzEwNSwxMCBAQAogCXZvaWQJKCppcl9kZXRhY2gpKGNvbnN0IHN0cnVjdCBpZWVlODAy MTF2YXAgKik7CiAJdm9pZAkoKmlyX2luaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJdm9p ZAkoKmlyX2RlaW5pdCkoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKLQl2b2lkCSgqaXJfbm9kZV9p bml0KShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CisJdm9pZAkoKmlyX25vZGVfaW5pdCkoc3Ry dWN0IGllZWU4MDIxMV9ub2RlICosIHVpbnQzMl90KTsKIAl2b2lkCSgqaXJfbm9kZV9kZWluaXQp KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqKTsKIAlpbnQJKCppcl9yYXRlKShzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKiwgdm9pZCAqLCB1aW50MzJfdCk7CisJdm9pZAkoKmlyX3JhdGVzKShzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKiwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICopOwogCXZvaWQJKCpp cl90eF9jb21wbGV0ZSkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAogCSAgICAJCQkgIGNv bnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsCiAJICAgIAkJCSAgdm9pZCAqLCB2b2lk ICopOwpAQCAtNTUsMTAgKzExOCwyNyBAQAogCXZvaWQJKCppcl9zZXRpbnRlcnZhbCkoY29uc3Qg c3RydWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOwogfTsKIAorLyogcGVyIHJhdGVjdGwgbm9kZSBt dXN0IHN0YXJ0IHdpdGggdGhpcyBjb21tb24gc3RhdGUgKi8KK3N0cnVjdCBpZWVlODAyMTFfcmF0 ZWN0bF9ub2RlIHsKKwl1aW50MzJfdCBpcm5fY2FwYWJpbGl0aWVzOwkJLyogaGFyZHdhcmUgY2Fw YWJpbGl0aWVzIG9mZmVyZWQgdG8gcmMgKi8KK307CisKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVD VExfTk9ERShfbmkpIFwKKwkoKHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlICopKChfbmkp LT5uaV9yY3RscykpCisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUihfbmkp IFwKKwkoSUVFRTgwMjExX1JBVEVDVExfTk9ERShfbmkpLT5pcm5fY2FwYWJpbGl0aWVzICYgSUVF RTgwMjExX1JBVEVDVExfQ0FQX01SUikKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQ X01SUlBST1QoX25pKSBcCisJKElFRUU4MDIxMV9SQVRFQ1RMX05PREUoX25pKS0+aXJuX2NhcGFi aWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9UKQorI2RlZmluZQlJRUVFODAy MTFfUkFURUNUTF9IQVNDQVBfTVVMVFhDSEFJTihfbmkpIFwKKwkoSUVFRTgwMjExX1JBVEVDVExf Tk9ERShfbmkpLT5pcm5fY2FwYWJpbGl0aWVzICYgSUVFRTgwMjExX1JBVEVDVExfQ0FQX01VTFRY Q0hBSU4pCisKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50LCBjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX3JhdGVjdGwgKik7CiB2b2lkCWllZWU4MDIxMV9yYXRlY3RsX3VucmVnaXN0 ZXIoaW50KTsKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFw ICopOwogdm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9zZXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCBp bnQpOwordm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqLCAKKwkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvKik7CiAKIE1BTExPQ19E RUNMQVJFKE1fODAyMTFfUkFURUNUTCk7CiAKQEAgLTY5LDExICsxNDksMTEgQEAKIH0KIAogc3Rh dGljIHZvaWQgX19pbmxpbmUKLWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5pdChzdHJ1Y3QgaWVl ZTgwMjExX25vZGUgKm5pKQoraWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqbmksIHVpbnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAljb25zdCBzdHJ1Y3Qg aWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCi0JdmFwLT5pdl9yYXRlLT5pcl9ub2Rl X2luaXQobmkpOworCXZhcC0+aXZfcmF0ZS0+aXJfbm9kZV9pbml0KG5pLCBjYXBhYmlsaXRpZXMp OwogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQpAQCAtOTMsNiArMTczLDE1IEBACiB9CiAKIHN0 YXRpYyB2b2lkIF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9yYXRlcyhzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKm5pLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8pCit7CisJY29u c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKworCXZhcC0+aXZfcmF0 ZS0+aXJfcmF0ZXMobmksIHJjX2luZm8pOworCWllZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3Jj ZmxhZ3MobmksIHJjX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZQogaWVlZTgwMjEx X3JhdGVjdGxfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAogICAg IGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBzdGF0dXMsIHZvaWQgKmFyZzEs IHZvaWQgKmFyZzIpCiB7CkBAIC0xMTUsMyArMjA0LDU5IEBACiAJCXJldHVybjsKIAl2YXAtPml2 X3JhdGUtPmlyX3NldGludGVydmFsKHZhcCwgbXNlY3MpOwogfQorCitzdGF0aWMgaW50IF9faW5s aW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfY3c0MChjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx dmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJcmV0dXJu IElTX1ZBUF9IVCh2YXApICYmIChuaS0+bmlfY2h3ID09IDQwKTsKK30KKworc3RhdGljIGludCBf X2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX3Nob3J0Z2koY29uc3Qgc3RydWN0IGll ZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQorewor CWlmIChJU19WQVBfSFQodmFwKSkKKwl7CisJCWlmIChuaS0+bmlfY2h3ID09IDQwICYmCisJCQkJ dmFwLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfU0hPUlRHSTQwICYmCisJCQkJbmktPm5p X2h0Y2FwICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCkKKwkJCXJldHVybiBJRUVFODAyMTFf UkFURUNUTF9UUlVFOworCisJCWlmIChuaS0+bmlfY2h3ID09IDIwICYmCisJCQkJdmFwLT5pdl9o dGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfU0hPUlRHSTIwICYmCisJCQkJbmktPm5pX2h0Y2FwICYg SUVFRTgwMjExX0hUQ0FQX1NIT1JUR0kyMCkKKwkJCXJldHVybiBJRUVFODAyMTFfUkFURUNUTF9U UlVFOworCX0KKwlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfRkFMU0U7Cit9CisKKworc3RhdGlj IGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX3N0YmMoY29uc3Qgc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQor eworICAgcmV0dXJuIElTX1ZBUF9IVCh2YXApICYmICh2YXAtPml2X2h0Y2FwcyAmIElFRUU4MDIx MV9IVENBUF9UWFNUQkMpICYmCisJCQkgICAgKG5pLT5uaV9odGNhcCAmIElFRUU4MDIxMV9IVENB UF9SWFNUQkNfMVNUUkVBTSkgJiYKKwkJCSAgICBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVVM VFhDSEFJTihuaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3Rs X25vZGVfaXMxMW4oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAobmkt Pm5pX2NoYW4gPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwlpZiAobmktPm5pX2NoYW4gPT0gSUVF RTgwMjExX0NIQU5fQU5ZQykKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKElFRUU4MDIxMV9JU19D SEFOX0hUKG5pLT5uaV9jaGFuKSk7Cit9CisKK19faW5saW5lIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg aWVlZTgwMjExX3JhdGVzZXQgKgoraWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQoY29uc3Qg c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JhdGVjdGxf bm9kZV9pczExbihuaSkgPyAKKwkJCQkoc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+ bmlfaHRyYXRlcyA6CisJCQkJJm5pLT5uaV9yYXRlczsKK30KKworI2VuZGlmCkluZGV4OiBuZXQ4 MDIxMS9pZWVlODAyMTFfc3RhLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjExX3N0 YS5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMJKHdvcmtp bmcgY29weSkKQEAgLTE2MzYsNyArMTYzNiw4IEBACiAJCQkgICAgIElFRUU4MDIxMV9GX0pPSU4g fCBJRUVFODAyMTFfRl9ET0JSUyk7CiAJCQlpZWVlODAyMTFfc2V0dXBfYmFzaWNfaHRyYXRlcyhu aSwgaHRpbmZvKTsKIAkJCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7Ci0JCQlpZWVl ODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmkpOworCQkJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2Fw IGZpZWxkICovCisJCQlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCQl9IGVs c2UgewogI2lmZGVmIElFRUU4MDIxMV9TVVBQT1JUX1NVUEVSRwogCQkJaWYgKElFRUU4MDIxMV9B VEhfQ0FQKHZhcCwgbmksIElFRUU4MDIxMV9OT0RFX0FUSCkpCkluZGV4OiBuZXQ4MDIxMS9pZWVl ODAyMTFfYW1yci5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9hbXJyLmMJKHJl dmlzaW9uIDI1NDgyNikKKysrIG5ldDgwMjExL2llZWU4MDIxMV9hbXJyLmMJKHdvcmtpbmcgY29w eSkKQEAgLTQ3LDggKzQ3LDggQEAKIAogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV92YXIu aD4KICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfaHQuaD4KKyNpbmNsdWRlIDxuZXQ4MDIx MS9pZWVlODAyMTFfcmF0ZWN0bC5oPgogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9hbXJy Lmg+Ci0jaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KIAogI2RlZmluZSBp c19zdWNjZXNzKGFtbikJXAogCSgoYW1uKS0+YW1uX3JldHJ5Y250IDwgKGFtbiktPmFtbl90eGNu dCAvIDEwKQpAQCAtNjAsNyArNjAsNyBAQAogc3RhdGljIHZvaWQJYW1ycl9zZXRpbnRlcnZhbChj b25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CiBzdGF0aWMgdm9pZAlhbXJyX2luaXQo c3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIHN0YXRpYyB2b2lkCWFtcnJfZGVpbml0KHN0cnVjdCBp ZWVlODAyMTF2YXAgKik7Ci1zdGF0aWMgdm9pZAlhbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKik7CitzdGF0aWMgdm9pZAlhbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjEx X25vZGUgKiwgdWludDMyX3QpOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2RlaW5pdChzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKik7CiBzdGF0aWMgaW50CWFtcnJfdXBkYXRlKHN0cnVjdCBpZWVlODAy MTFfYW1yciAqLAogICAgIAkJCXN0cnVjdCBpZWVlODAyMTFfYW1ycl9ub2RlICosIHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqKTsKQEAgLTEyOSwxOSArMTI5LDggQEAKIAlmcmVlKHZhcC0+aXZfcnMs IE1fODAyMTFfUkFURUNUTCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFtcnJfbm9kZV9pc18xMW4oc3Ry dWN0IGllZWU4MDIxMV9ub2RlICpuaSkKLXsKLQotCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxMKQot CQlyZXR1cm4gKDApOwotCWlmIChuaS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllDKQot CQlyZXR1cm4gKDApOwotCXJldHVybiAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2NoYW4p KTsKLX0KLQogc3RhdGljIHZvaWQKLWFtcnJfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqbmkpCithbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCB1aW50MzJf dCBjYXBhYmlsaXRpZXMpCiB7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICpycyA9 IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKQEAgLTE1OSw2 ICsxNDgsMTAgQEAKIAkJfQogCX0gZWxzZQogCQlhbW4gPSBuaS0+bmlfcmN0bHM7CisKKwlzdHJ1 Y3QgaWVlZTgwMjExX3JhdGVjdGxfbm9kZSAqaXJuID0gSUVFRTgwMjExX1JBVEVDVExfTk9ERShu aSk7CisJaXJuLT5pcm5fY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCQogCWFtbi0+YW1u X2FtcnIgPSBhbXJyOwogCWFtbi0+YW1uX3N1Y2Nlc3MgPSAwOwogCWFtbi0+YW1uX3JlY292ZXJ5 ID0gMDsKQEAgLTE2NSwyMyArMTU4LDEzIEBACiAJYW1uLT5hbW5fdHhjbnQgPSBhbW4tPmFtbl9y ZXRyeWNudCA9IDA7CiAJYW1uLT5hbW5fc3VjY2Vzc190aHJlc2hvbGQgPSBhbXJyLT5hbXJyX21p bl9zdWNjZXNzX3RocmVzaG9sZDsKIAotCS8qIDExbiBvciBub3Q/IFBpY2sgdGhlIHJpZ2h0IHJh dGVzZXQgKi8KLQlpZiAoYW1ycl9ub2RlX2lzXzExbihuaSkpIHsKLQkJLyogWFhYIGV3ICovCi0J CUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCi0J CSAgICAiJXM6IDExbiBub2RlIiwgX19mdW5jX18pOwotCQlycyA9IChzdHJ1Y3QgaWVlZTgwMjEx X3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzOwotCX0gZWxzZSB7Ci0JCUlFRUU4MDIxMV9OT1RF KG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCi0JCSAgICAiJXM6IG5vbi0x MW4gbm9kZSIsIF9fZnVuY19fKTsKLQkJcnMgPSAmbmktPm5pX3JhdGVzOwotCX0KKwlycyA9IGll ZWU4MDIxMV9yYXRlY3RsX2dldF9yYXRlc2V0KG5pKTsKIAogCS8qIEluaXRpYWwgcmF0ZSAtIGxv d2VzdCAqLwogCXJhdGUgPSBycy0+cnNfcmF0ZXNbMF07CiAKIAkvKiBYWFggY2xlYXIgdGhlIGJh c2ljIHJhdGUgZmxhZyBpZiBpdCdzIG5vdCAxMW4gKi8KLQlpZiAoISBhbXJyX25vZGVfaXNfMTFu KG5pKSkKKwlpZiAoISBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKSkKIAkJcmF0ZSAm PSBJRUVFODAyMTFfUkFURV9WQUw7CiAKIAkvKiBwaWNrIGluaXRpYWwgcmF0ZSBmcm9tIHRoZSBy YXRlc2V0IC0gSFQgb3Igb3RoZXJ3aXNlICovCkBAIC0xODksNyArMTcyLDcgQEAKIAkgICAgYW1u LT5hbW5fcml4LS0pIHsKIAkJLyogbGVnYWN5IC0gYW55dGhpbmcgPCAzNm1iaXQsIHN0b3Agc2Vh cmNoaW5nICovCiAJCS8qIDExbiAtIHN0b3AgYXQgTUNTNCAvIE1DUzEyIC8gTUNTMjggKi8KLQkJ aWYgKGFtcnJfbm9kZV9pc18xMW4obmkpICYmCisJCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2Rl X2lzMTFuKG5pKSAmJgogCQkgICAgKHJzLT5yc19yYXRlc1thbW4tPmFtbl9yaXhdICYgMHg3KSA8 IDQpCiAJCQlicmVhazsKIAkJZWxzZSBpZiAoKHJzLT5yc19yYXRlc1thbW4tPmFtbl9yaXhdICYg SUVFRTgwMjExX1JBVEVfVkFMKSA8PSA3MikKQEAgLTE5OCw3ICsxODEsNyBAQAogCX0KIAogCS8q IGlmIHRoZSByYXRlIGlzIGFuIDExbiByYXRlLCBlbnN1cmUgdGhlIE1DUyBiaXQgaXMgc2V0ICov Ci0JaWYgKGFtcnJfbm9kZV9pc18xMW4obmkpKQorCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2Rl X2lzMTFuKG5pKSkKIAkJcmF0ZSB8PSBJRUVFODAyMTFfUkFURV9NQ1M7CiAKIAkvKiBBc3NpZ24g aW5pdGlhbCByYXRlIGZyb20gdGhlIHJhdGVzZXQgKi8KQEAgLTIyNiwxNCArMjA5LDkgQEAKIAog CUtBU1NFUlQoaXNfZW5vdWdoKGFtbiksICgidHhjbnQgJWQiLCBhbW4tPmFtbl90eGNudCkpOwog Ci0JLyogMTFuIG9yIG5vdD8gUGljayB0aGUgcmlnaHQgcmF0ZXNldCAqLwotCWlmIChhbXJyX25v ZGVfaXNfMTFuKG5pKSkgewotCQkvKiBYWFggZXcgKi8KLQkJcnMgPSAoc3RydWN0IGllZWU4MDIx MV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlycyA9ICZuaS0+bmlf cmF0ZXM7Ci0JfQorCXJzID0gaWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQobmkpOwogCisK IAlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAog CSAgICAiQU1SUjogY3VycmVudCByYXRlICVkLCB0eGNudD0lZCwgcmV0cnljbnQ9JWQiLAogCSAg ICBycy0+cnNfcmF0ZXNbcml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCwKQEAgLTMwNCwxMyArMjgy LDcgQEAKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKnJzID0gTlVMTDsKIAlpbnQg cml4OwogCi0JLyogMTFuIG9yIG5vdD8gUGljayB0aGUgcmlnaHQgcmF0ZXNldCAqLwotCWlmIChh bXJyX25vZGVfaXNfMTFuKG5pKSkgewotCQkvKiBYWFggZXcgKi8KLQkJcnMgPSAoc3RydWN0IGll ZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlycyA9ICZu aS0+bmlfcmF0ZXM7Ci0JfQorCXJzID0gaWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQobmkp OwogCiAJaWYgKGlzX2Vub3VnaChhbW4pICYmICh0aWNrcyAtIGFtbi0+YW1uX3RpY2tzKSA+IGFt cnItPmFtcnJfaW50ZXJ2YWwpIHsKIAkJcml4ID0gYW1ycl91cGRhdGUoYW1yciwgYW1uLCBuaSk7 CkBAIC0zMTgsNyArMjkwLDcgQEAKIAkJCS8qIHVwZGF0ZSBwdWJsaWMgcmF0ZSAqLwogCQkJbmkt Pm5pX3R4cmF0ZSA9IHJzLT5yc19yYXRlc1tyaXhdOwogCQkJLyogWFhYIHN0cmlwIGJhc2ljIHJh dGUgZmxhZyBmcm9tIHR4cmF0ZSwgaWYgbm9uLTExbiAqLwotCQkJaWYgKGFtcnJfbm9kZV9pc18x MW4obmkpKQorCQkJaWYgKGllZWU4MDIxMV9yYXRlY3RsX25vZGVfaXMxMW4obmkpKQogCQkJCW5p LT5uaV90eHJhdGUgfD0gSUVFRTgwMjExX1JBVEVfTUNTOwogCQkJZWxzZQogCQkJCW5pLT5uaV90 eHJhdGUgJj0gSUVFRTgwMjExX1JBVEVfVkFMOwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX2Ft cnIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCShyZXZpc2lvbiAy NTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCSh3b3JraW5nIGNvcHkpCkBAIC0y MCw2ICsyMCw3IEBACiAjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfQU1SUl9IXwogI2RlZmlu ZSBfTkVUODAyMTFfSUVFRTgwMjExX0FNUlJfSF8KIAorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4 MDIxMV9yYXRlY3RsLmg+CiAvKi0KICAqIE5haXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBZGFw dGl2ZSBNdWx0aSBSYXRlIFJldHJ5IGFsZ29yaXRobToKICAqCkBAIC00Nyw2ICs0OCw3IEBACiAg KiBSYXRlIGNvbnRyb2wgc3RhdGUgZm9yIGEgZ2l2ZW4gbm9kZS4KICAqLwogc3RydWN0IGllZWU4 MDIxMV9hbXJyX25vZGUgeworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlIGFtbl9ub2Rl OwogCXN0cnVjdCBpZWVlODAyMTFfYW1yciAqYW1uX2FtcnI7LyogYmFja3BvaW50ZXIgKi8KIAlp bnQJYW1uX3JpeDsJCS8qIGN1cnJlbnQgcmF0ZSBpbmRleCAqLwogCWludAlhbW5fdGlja3M7CQkv KiB0aW1lIG9mIGxhc3QgdXBkYXRlICovCkluZGV4OiBuZXQ4MDIxMS9pZWVlODAyMTFfbm9kZS5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9ub2RlLmMJKHJldmlzaW9uIDI1NDgy NikKKysrIG5ldDgwMjExL2llZWU4MDIxMV9ub2RlLmMJKHdvcmtpbmcgY29weSkKQEAgLTg0Niw3 ICs4NDYsOCBAQAogCS8qIFhYWCBRb1M/IERpZmZpY3VsdCBnaXZlbiB0aGF0IFdNRSBjb25maWcg aXMgc3BlY2lmaWMgdG8gYSBtYXN0ZXIgKi8KIAogCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJt cyhuaSk7Ci0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkvKiBYWFggVE9ETyBm aWxsIHRoZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDAp OwogCiAJcmV0dXJuIGllZWU4MDIxMV9zdGFfam9pbjEoaWVlZTgwMjExX3JlZl9ub2RlKG5pKSk7 CiB9CkBAIC0xMTg4LDcgKzExODksOCBAQAogCUlFRUU4MDIxMV9OT1RFKHZhcCwgSUVFRTgwMjEx X01TR19JTkFDVCwgbmksCiAJICAgICIlczogaW5hY3RfcmVsb2FkICV1IiwgX19mdW5jX18sIG5p LT5uaV9pbmFjdF9yZWxvYWQpOwogCi0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsK KwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9u b2RlX2luaXQobmksIDApOwogCiAJcmV0dXJuIG5pOwogfQpAQCAtMTIyOCw3ICsxMjMwLDggQEAK IAkJLyogWFhYIG9wdGltaXplIGF3YXkgKi8KIAkJaWVlZTgwMjExX3BzcV9pbml0KCZuaS0+bmlf cHNxLCAidW5rbm93biIpOwogCi0JCWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5pdChuaSk7CisJ CS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCBmaWVsZCAqLworCQlpZWVlODAyMTFfcmF0ZWN0bF9u b2RlX2luaXQobmksIDApOwogCX0gZWxzZSB7CiAJCS8qIFhYWCBtc2cgKi8KIAkJdmFwLT5pdl9z dGF0cy5pc19yeF9ub2RlYWxsb2MrKzsKQEAgLTE0NTcsNyArMTQ2MCw4IEBACiAjZW5kaWYKIAkJ fQogCQlpZWVlODAyMTFfbm9kZV9zZXR1cHR4cGFybXMobmkpOwotCQlpZWVlODAyMTFfcmF0ZWN0 bF9ub2RlX2luaXQobmkpOworCQkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgZmllbGQgKi8KKwkJ aWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pLCAwKTsKIAkJaWYgKGljLT5pY19uZXdhc3Nv YyAhPSBOVUxMKQogCQkJaWMtPmljX25ld2Fzc29jKG5pLCAxKTsKIAkJLyogWFhYIG5vdCByaWdo dCBmb3IgODAyLjF4L1dQQSAqLwpAQCAtMTUzMSw3ICsxNTM1LDggQEAKIAkJaWVlZTgwMjExX3Nl dHVwX2Jhc2ljX2h0cmF0ZXMobmksCiAJCSAgICBuaS0+bmlfaWVzLmh0aW5mb19pZSk7CiAJCWll ZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7Ci0JCWllZWU4MDIxMV9yYXRlY3RsX25vZGVf aW5pdChuaSk7CisJCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCBmaWVsZCAqLworCQlpZWVlODAy MTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCX0KIH0KIApAQCAtMTU1OCw3ICsxNTYzLDgg QEAKIAkJaWYgKGllZWU4MDIxMV9pc2VycF9yYXRlc2V0KCZuaS0+bmlfcmF0ZXMpKQogCQkJbmkt Pm5pX2ZsYWdzIHw9IElFRUU4MDIxMV9OT0RFX0VSUDsKIAkJaWVlZTgwMjExX25vZGVfc2V0dXB0 eHBhcm1zKG5pKTsKLQkJaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkJLyogWFhY IFRPRE8gZmlsbCB0aGUgY2FwIGZpZWxkICovCisJCWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5p dChuaSwgMCk7CiAJCWlmIChpYy0+aWNfbmV3YXNzb2MgIT0gTlVMTCkKIAkJCWljLT5pY19uZXdh c3NvYyhuaSwgMSk7CiAJCS8qIFhYWCBub3QgcmlnaHQgZm9yIDgwMi4xeC9XUEEgKi8KQEAgLTI1 MjgsNyArMjUzNCw4IEBACiAJKTsKIAogCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7 Ci0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRo ZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCS8q IGdpdmUgZHJpdmVyIGEgY2hhbmNlIHRvIHNldHVwIHN0YXRlIGxpa2UgbmlfdHhyYXRlICovCiAJ aWYgKGljLT5pY19uZXdhc3NvYyAhPSBOVUxMKQogCQlpYy0+aWNfbmV3YXNzb2MobmksIG5ld2Fz c29jKTsKSW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuYwo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSBuZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDApCisrKyBuZXQ4MDIx MS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDI1NTk3MCkKQEAgLTAsMCArMSwxMTM3 IEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxl LmMgMjQ4NTczIDIwMTMtMDItMjcgMDQ6MzM6MDZaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5 cmlnaHQgKGMpIDIwMDUgSm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hv bmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0 aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1 dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50 YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMg SVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNI QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM QUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5Z IERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRP LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgIm9w dF93bGFuLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMva2VybmVs Lmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNp bmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxu ZXQvaWZfbWVkaWEuaD4KKworI2lmZGVmIElORVQKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Cisj aW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQ4MDIx MS9pZWVlODAyMTFfdmFyLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX2h0Lmg+Cisj aW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKyNpbmNsdWRlIDxuZXQ4MDIx MS9pZWVlODAyMTFfcmNfc2FtcGxlLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Jj X3NhbXBsZV90eHNjaGVkLmg+CisKK3N0YXRpYyB2b2lkCXNhbXBsZV9pbml0KHN0cnVjdCBpZWVl ODAyMTF2YXAgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2 YXAgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqKTsKK3N0YXRpYyB2b2lkCXNhbXBsZV9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25v ZGUgKik7CitzdGF0aWMgaW50CXNhbXBsZV9yYXRlKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCB2 b2lkICosIHVpbnQzMl90KTsKK3N0YXRpYyB2b2lkCXNhbXBsZV90eF9jb21wbGV0ZShjb25zdCBz dHJ1Y3QgaWVlZTgwMjExdmFwICosCisgICAgCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl ICosIGludCwgCisJCQl2b2lkICosIHZvaWQgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfdHhfdXBk YXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJCWNvbnN0IHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqLCB2b2lkICosIHZvaWQgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCXNhbXBs ZV9zZXRpbnRlcnZhbChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CisKKy8qIG51 bWJlciBvZiByZWZlcmVuY2VzIGZyb20gbmV0ODAyMTEgbGF5ZXIgKi8KK3N0YXRpYwlpbnQgbnJl ZnMgPSAwOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHNhbXBsZSA9 IHsKKwkuaXJfbmFtZQk9ICJzYW1wbGUiLAorCS5pcl9hdHRhY2gJPSBOVUxMLAorCS5pcl9kZXRh Y2gJPSBOVUxMLAorCS5pcl9pbml0CT0gc2FtcGxlX2luaXQsCisJLmlyX2RlaW5pdAk9IHNhbXBs ZV9kZWluaXQsCisJLmlyX25vZGVfaW5pdAk9IHNhbXBsZV9ub2RlX2luaXQsCisJLmlyX25vZGVf ZGVpbml0CT0gc2FtcGxlX25vZGVfZGVpbml0LAorCS5pcl9yYXRlCT0gc2FtcGxlX3JhdGUsCisJ LmlyX3JhdGVzCT0gc2FtcGxlX3JhdGVzLAorCS5pcl90eF9jb21wbGV0ZQk9IHNhbXBsZV90eF9j b21wbGV0ZSwKKwkuaXJfdHhfdXBkYXRlCT0gc2FtcGxlX3R4X3VwZGF0ZSwKKwkuaXJfc2V0aW50 ZXJ2YWwJPSBzYW1wbGVfc2V0aW50ZXJ2YWwsCit9OworSUVFRTgwMjExX1JBVEVDVExfTU9EVUxF KHNhbXBsZSwgMSk7CitJRUVFODAyMTFfUkFURUNUTF9BTEcoc2FtcGxlLCBJRUVFODAyMTFfUkFU RUNUTF9TQU1QTEUsIHNhbXBsZSk7CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfaW5pdChzdHJ1Y3Qg aWVlZTgwMjExdmFwICp2YXApCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZTsK KworCUtBU1NFUlQodmFwLT5pdl9ycyA9PSBOVUxMLCAoIiVzIGNhbGxlZCBtdWx0aXBsZSB0aW1l cyIsIF9fZnVuY19fKSk7CisKKwlzYW1wbGUgPSB2YXAtPml2X3JzID0gbWFsbG9jKHNpemVvZihz dHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSksCisJICAgIE1fODAyMTFfUkFURUNUTCwgTV9OT1dBSVR8 TV9aRVJPKTsKKwlpZiAoc2FtcGxlID09IE5VTEwpIHsKKwkJaWZfcHJpbnRmKHZhcC0+aXZfaWZw LCAiY291bGRuJ3QgYWxsb2MgcmF0ZWN0bCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm47CisJfQor CXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlID0gNzU7CQkvKiBld21hIHBlcmNlbnRhZ2Ug KFswLi45OV0pICovCisJc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHMgPSAxMDAg LyAoMTAwIC0gc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3JhdGUpOworCXNhbXBsZS0+c2FtcGxl X3JhdGUgPSAxMDsJCQkvKiAldGltZSB0byB0cnkgZGlmZiB0eCByYXRlcyAqLworCXNhbXBsZS0+ c2FtcGxlX21heF9zdWNjZXNzaXZlX2ZhaWx1cmVzID0gMzsJLyogdGhyZXNob2xkIGZvciByYXRl IHNhbXBsaW5nKi8KKwlzYW1wbGUtPnNhbXBsZV9zdGFsZV9mYWlsdXJlX3RpbWVvdXQgPSAxMCAq IGh6OwkvKiAxMCBzZWNvbmRzICovCisJc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA9IGh6OwkJ CS8qIDEgc2Vjb25kICovCisJc2FtcGxlX3NldGludGVydmFsKHZhcCwgNTAwIC8qIG1zICovKTsg CS8qIGFjdHVhbGx5IGRvIG5vdGhpbmcgKi8KKwlzYW1wbGVfc3lzY3RsYXR0YWNoKHZhcCwgdmFw LT5pdl9zeXNjdGwsIHZhcC0+aXZfb2lkKTsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9kZWlu aXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoreworCWZyZWUodmFwLT5pdl9ycywgTV84MDIx MV9SQVRFQ1RMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICptcnJfc2No ZWR1bGVzW0lFRUU4MDIxMV9NT0RFX01BWCsyXSA9IHsKKwlOVUxMLAkJLyogSUVFRTgwMjExX01P REVfQVVUTyAqLworCXNlcmllc18xMWEsCS8qIElFRUU4MDIxMV9NT0RFXzExQSAqLworCXNlcmll c18xMWcsCS8qIElFRUU4MDIxMV9NT0RFXzExQiAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIx MV9NT0RFXzExRyAqLworCU5VTEwsCQkvKiBJRUVFODAyMTFfTU9ERV9GSCAqLworCXNlcmllc18x MWEsCS8qIElFRUU4MDIxMV9NT0RFX1RVUkJPX0EgKi8KKwlzZXJpZXNfMTFnLAkvKiBJRUVFODAy MTFfTU9ERV9UVVJCT19HICovCisJc2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfU1RVUkJP X0EgKi8KKwlzZXJpZXNfMTFuYSwJLyogSUVFRTgwMjExX01PREVfMTFOQSAqLworCXNlcmllc18x MW5nLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5HICovCisJc2VyaWVzX2hhbGYsCS8qIElFRUU4MDIx MV9NT0RFX0hBTEYgKi8KKwlzZXJpZXNfcXVhcnRlciwJLyogSUVFRTgwMjExX01PREVfUVVBUlRF UiAqLworfTsKKworc3RhdGljIHZvaWQKK3NhbXBsZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIx MV9ub2RlICpuaSwgdWludDMyX3QgY2FwYWJpbGl0aWVzKQoreworI2RlZmluZQlSQVRFKF9peCkJ KG5pLT5uaV9yYXRlcy5yc19yYXRlc1soX2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVm aW5lCURPVDExUkFURShfaXgpCShydC0+aW5mb1soX2l4KV0uZG90MTFSYXRlICYgSUVFRTgwMjEx X1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoX2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNbX2l4 XSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+ bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOwor CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IE5VTEw7CisJY29uc3Qgc3RydWN0 IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+ aXZfaWMtPmljX2N1cmNoYW4pOworCWVudW0gaWVlZTgwMjExX3BoeW1vZGUgY3VybW9kZSA9IGll ZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJaW50IHgsIHksIHJp eDsKKworCWlmIChuaS0+bmlfcmN0bHMgPT0gTlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBzYW4g PSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUpLAorCQkgICAgTV84 MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxNX1pFUk8pOworCQlpZiAoc2FuID09IE5VTEwpIHsKKwkJ CWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwg IgorCQkJICAgICJzdHJ1Y3R1cmVcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXNh biA9IG5pLT5uaV9yY3RsczsKKworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlICppcm4g PSBJRUVFODAyMTFfUkFURUNUTF9OT0RFKG5pKTsKKwlpcm4tPmlybl9jYXBhYmlsaXRpZXMgPSBj YXBhYmlsaXRpZXM7CisJCisJc2FuLT5zYW5fc2FtcGxlID0gc2FtcGxlOworCisJS0FTU0VSVChy dCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1vZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlzYW4t PnNjaGVkID0gbXJyX3NjaGVkdWxlc1tjdXJtb2RlXTsKKwlLQVNTRVJUKHNhbi0+c2NoZWQgIT0g TlVMTCwgKCJubyBtcnIgc2NoZWR1bGUgZm9yIG1vZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlzYW4t PnN0YXRpY19yaXggPSAtMTsKKwlzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgobmkpOworCisJLyoK KwkgKiBDb25zdHJ1Y3QgYSBiaXRtYXNrIG9mIHVzYWJsZSByYXRlcy4gIFRoaXMgaGFzIGFsbAor CSAqIG5lZ290aWF0ZWQgcmF0ZXMgbWludXMgdGhvc2UgbWFya2VkIGJ5IHRoZSBoYWwgYXMKKwkg KiB0byBiZSBpZ25vcmVkIGZvciBkb2luZyByYXRlIGNvbnRyb2wuCisJICovCisJc2FuLT5yYXRl bWFzayA9IDA7CisKKwkvKiBNQ1MgcmF0ZXMgKi8KKwlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgw MjExX05PREVfSFQpIHsKKwkJZm9yICh4ID0gMDsgeCA8IG5pLT5uaV9odHJhdGVzLnJzX25yYXRl czsgeCsrKSB7CisJCQlyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W01DUyh4KV07CisJCQlpZiAo cml4ID09IDB4ZmYpCisJCQkJY29udGludWU7CisJCQkvKiBza2lwIHJhdGVzIG1hcmtlZCBicm9r ZW4gYnkgaGFsICovCisJCQlpZiAoIXJ0LT5pbmZvW3JpeF0udmFsaWQpCisJCQkJY29udGludWU7 CisJCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhSQVRFUywKKwkJCSAgICAoIm1jcyAldSBoYXMg cml4ICVkIiwgTUNTKHgpLCByaXgpKTsKKwkJCXNhbi0+cmF0ZW1hc2sgfD0gKHVpbnQ2NF90KSAx PDxyaXg7CisJCX0KKwl9CisKKwkvKiBMZWdhY3kgcmF0ZXMgKi8KKwlmb3IgKHggPSAwOyB4IDwg bmktPm5pX3JhdGVzLnJzX25yYXRlczsgeCsrKSB7CisJCXJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5k ZXhbUkFURSh4KV07CisJCWlmIChyaXggPT0gMHhmZikKKwkJCWNvbnRpbnVlOworCQkvKiBza2lw IHJhdGVzIG1hcmtlZCBicm9rZW4gYnkgaGFsICovCisJCWlmICghcnQtPmluZm9bcml4XS52YWxp ZCkKKwkJCWNvbnRpbnVlOworCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhSQVRFUywKKwkJICAg ICgicmF0ZSAldSBoYXMgcml4ICVkIiwgUkFURSh4KSwgcml4KSk7CisJCXNhbi0+cmF0ZW1hc2sg fD0gKHVpbnQ2NF90KSAxPDxyaXg7CisJfQorCisJZm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRf U0laRV9CSU5TOyB5KyspIHsKKwkJaW50IHNpemUgPSBiaW5fdG9fc2l6ZSh5KTsKKwkJdWludDY0 X3QgbWFzazsKKworCQlzYW4tPnBhY2tldHNfc2VudFt5XSA9IDA7CisJCXNhbi0+Y3VycmVudF9z YW1wbGVfcml4W3ldID0gLTE7CisJCXNhbi0+bGFzdF9zYW1wbGVfcml4W3ldID0gMDsKKwkJLyog WFhYIHN0YXJ0IHdpdGggZmlyc3QgdmFsaWQgcmF0ZSAqLworCQlzYW4tPmN1cnJlbnRfcml4W3ld ID0gZmZzKHNhbi0+cmF0ZW1hc2spLTE7CisJCQorCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBz dGF0aXN0aWNzIGJ1Y2tldHM7IHRoZXNlIGFyZQorCQkgKiBpbmRleGVkIGJ5IHRoZSByYXRlIGNv ZGUgaW5kZXguCisJCSAqLworCQlmb3IgKHJpeCA9IDAsIG1hc2sgPSBzYW4tPnJhdGVtYXNrOyBt YXNrICE9IDA7IHJpeCsrLCBtYXNrID4+PSAxKSB7CisJCQlpZiAoKG1hc2sgJiAxKSA9PSAwKQkJ Lyogbm90IGEgdmFsaWQgcmF0ZSAqLworCQkJCWNvbnRpbnVlOworCQkJc2FuLT5zdGF0c1t5XVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnRyaWVz ID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzID0gMDsKKwkJCXNhbi0+ c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5s YXN0X3R4ID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5ld21hX3BjdCA9IDA7CisJCQkKKwkJ CXNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPQorCQkJICAgIGNhbGNfdXNlY3Nf dW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgsIDAsIDAsCisJCQkgICAgKG5pLT5uaV9jaHcg PT0gNDApKTsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3RpbWUgPQorCQkJICAg IHNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWU7CisJCX0KKwl9CisKKwkvKiBzZXQg dGhlIHZpc2libGUgYml0LXJhdGUgKi8KKwlpZiAoc2FuLT5zdGF0aWNfcml4ICE9IC0xKQorCQlu aS0+bmlfdHhyYXRlID0gRE9UMTFSQVRFKHNhbi0+c3RhdGljX3JpeCk7CisJZWxzZQorCQluaS0+ bmlfdHhyYXRlID0gUkFURSgwKTsKKyN1bmRlZiBSQVRFCisjdW5kZWYgRE9UMTFSQVRFCisjdW5k ZWYgTUNTCit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfbm9kZV9kZWluaXQoc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSkKK3sKKwlmcmVlKG5pLT5uaV9yY3RscywgTV84MDIxMV9SQVRFQ1RMKTsK K30KKworc3RhdGljIGludAorZG90MTFyYXRlKGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy dCwgaW50IHJpeCkKK3sKKwlpZiAocml4IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBydC0+ aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCA/CisJICAgIHJ0LT5pbmZvW3JpeF0uZG90 MTFSYXRlIDogKHJ0LT5pbmZvW3JpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKSAv IDI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RvdDExcmF0ZV9sYWJlbChjb25zdCBpZWVl ODAyMTFfcmF0ZV90YWJsZSAqcnQsIGludCByaXgpCit7CisJaWYgKHJpeCA8IDApCisJCXJldHVy biAiIjsKKwlyZXR1cm4gcnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQgPyAiTUNT IiA6ICJNYiAiOworfQorCisvKgorICogUmV0dXJuIHRoZSByaXggd2l0aCB0aGUgbG93ZXN0IGF2 ZXJhZ2VfdHhfdGltZSwKKyAqIG9yIC0xIGlmIGFsbCB0aGUgYXZlcmFnZV90eF90aW1lcyBhcmUg MC4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19iZXN0X3JhdGUoY29uc3Qgc3RydWN0 IGllZWU4MDIxMV9ub2RlICpuaSwgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy dCwKKyAgICBpbnQgc2l6ZV9iaW4sIGludCByZXF1aXJlX2Fja2VkX2JlZm9yZSkKK3sKKwlzdHJ1 Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisgICAgaW50IGJl c3RfcmF0ZV9yaXgsIGJlc3RfcmF0ZV90dCwgYmVzdF9yYXRlX3BjdDsKKwl1aW50NjRfdCBtYXNr OworCWludCByaXgsIHR0LCBwY3Q7CisKKyAgICBiZXN0X3JhdGVfcml4ID0gMDsKKyAgICBiZXN0 X3JhdGVfdHQgPSAwOworCWJlc3RfcmF0ZV9wY3QgPSAwOworCisJZm9yIChtYXNrID0gc2FuLT5y YXRlbWFzaywgcml4ID0gMDsgbWFzayAhPSAwOyBtYXNrID4+PSAxLCByaXgrKykgeworCQlpZiAo KG1hc2sgJiAxKSA9PSAwKQkJLyogbm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwkJCWNvbnRpbnVl OworCisJCS8qIERvbid0IHBpY2sgYSBub24tSFQgcmF0ZSBmb3IgYSBIVCBub2RlICovCisJCWlm ICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpICYmCisJCSAgICAocnQtPmluZm9b cml4XS5waHkgIT0gSUVFRTgwMjExX1RfSFQpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXR0 ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCWlmICh0dCA8 PSAwIHx8CisJCSAgICAocmVxdWlyZV9hY2tlZF9iZWZvcmUgJiYKKwkJICAgICAhc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4XS5wYWNrZXRzX2Fja2VkKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENh bGN1bGF0ZSBwZXJjZW50YWdlIGlmIHBvc3NpYmxlICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVf YmluXVtyaXhdLnRvdGFsX3BhY2tldHMgPiAwKSB7CisJCQlwY3QgPSBzYW4tPnN0YXRzW3NpemVf YmluXVtyaXhdLmV3bWFfcGN0OworCQl9IGVsc2UgeworCQkJLyogWFhYIGZvciBub3csIGFzc3Vt ZSA5NSUgb2sgKi8KKwkJCXBjdCA9IDk1OworCQl9CisKKwkJLyogZG9uJ3QgdXNlIGEgYml0LXJh dGUgdGhhdCBoYXMgYmVlbiBmYWlsaW5nICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPiAzKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICog Rm9yIEhULCBEb24ndCB1c2UgYSBiaXQgcmF0ZSB0aGF0IGlzIG11Y2ggbW9yZQorCQkgKiBsb3Nz eSB0aGFuIHRoZSBiZXN0LgorCQkgKgorCQkgKiBYWFggdGhpcyBpc24ndCBvcHRpbWFsOyBpdCdz IGp1c3QgZGVzaWduZWQgdG8KKwkJICogZWxpbWluYXRlIHJhdGVzIHRoYXQgYXJlIGdvaW5nIHRv IGJlIG9idmlvdXNseQorCQkgKiB3b3JzZS4KKwkJICovCisJCWlmIChuaS0+bmlfZmxhZ3MgJiBJ RUVFODAyMTFfTk9ERV9IVCkgeworCQkJaWYgKGJlc3RfcmF0ZV9wY3QgPiAocGN0ICsgNTApKQor CQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRm9yIG5vbi1NQ1MgcmF0ZXMsIHVzZSB0 aGUgY3VycmVudCBhdmVyYWdlIHR4dGltZSBmb3IKKwkJICogY29tcGFyaXNvbi4KKwkJICovCisJ CWlmICghIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkpIHsKKwkJCWlmIChiZXN0 X3JhdGVfdHQgPT0gMCB8fCB0dCA8PSBiZXN0X3JhdGVfdHQpIHsKKwkJCQliZXN0X3JhdGVfdHQg PSB0dDsKKwkJCQliZXN0X3JhdGVfcml4ID0gcml4OworCQkJCWJlc3RfcmF0ZV9wY3QgPSBwY3Q7 CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBTaW5jZSAyIHN0cmVhbSByYXRlcyBoYXZlIHNsaWdo dGx5IGhpZ2hlciBUWCB0aW1lcywKKwkJICogYWxsb3cgYSBsaXR0bGUgYml0IG9mIGxlZXdheS4g VGhpcyBzaG91bGQgbGF0ZXIKKwkJICogYmUgYWJzdHJhY3RlZCBvdXQgYW5kIHByb3Blcmx5IGhh bmRsZWQuCisJCSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsK KwkJCWlmIChiZXN0X3JhdGVfdHQgPT0gMCB8fCAodHQgKiA4IDw9IGJlc3RfcmF0ZV90dCAqIDEw KSkgeworCQkJCWJlc3RfcmF0ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9yaXggPSByaXg7CisJ CQkJYmVzdF9yYXRlX3BjdCA9IHBjdDsKKwkJCX0KKwkJfQorICAgICAgICB9CisgICAgICAgIHJl dHVybiAoYmVzdF9yYXRlX3R0ID8gYmVzdF9yYXRlX3JpeCA6IC0xKTsKK30KKworLyoKKyAqIFBp Y2sgYSBnb29kICJyYW5kb20iIGJpdC1yYXRlIHRvIHNhbXBsZSBvdGhlciB0aGFuIHRoZSBjdXJy ZW50IG9uZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19zYW1wbGVfcmF0ZShjb25z dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAq cnQsIAorCWludCBzaXplX2JpbikKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9b aXhdLmRvdDExUmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0 LT5pbmZvW2l4XS5kb3QxMVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4 MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFf c2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJaW50IGN1cnJlbnRfcml4LCByaXg7 CisJdW5zaWduZWQgY3VycmVudF90dDsKKwl1aW50NjRfdCBtYXNrOworCQorCWN1cnJlbnRfcml4 ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJaWYgKGN1cnJlbnRfcml4IDwgMCkgewor CQkvKiBubyBzdWNjZXNzZXMgeWV0LCBzZW5kIGF0IHRoZSBsb3dlc3QgYml0LXJhdGUgKi8KKwkJ LyogWFhYIHNob3VsZCByZXR1cm4gTUNTMCBpZiBIVCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlj dXJyZW50X3R0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bY3VycmVudF9yaXhdLmF2ZXJhZ2VfdHhf dGltZTsKKworCXJpeCA9IHNhbi0+bGFzdF9zYW1wbGVfcml4W3NpemVfYmluXSsxOwkvKiBuZXh0 IHNhbXBsZSByYXRlICovCisJbWFzayA9IHNhbi0+cmF0ZW1hc2sgJn4gKCh1aW50NjRfdCkgMTw8 Y3VycmVudF9yaXgpOy8qIGRvbid0IHNhbXBsZSBjdXJyZW50IHJhdGUgKi8KKwl3aGlsZSAobWFz ayAhPSAwKSB7CisJCWlmICgobWFzayAmICgodWludDY0X3QpIDE8PHJpeCkpID09IDApIHsJLyog bm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwluZXh0cmF0ZToKKwkJCWlmICgrK3JpeCA+PSBydC0+ cmF0ZUNvdW50KQorCQkJCXJpeCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAq IFRoZSBmb2xsb3dpbmcgY29kZSBzdG9wcyB0cnlpbmcgdG8gc2FtcGxlCisJCSAqIG5vbi1NQ1Mg cmF0ZXMgd2hlbiBzcGVha2luZyB0byBhbiBNQ1Mgbm9kZS4KKwkJICogSG93ZXZlciwgYXQgbGVh c3QgZm9yIENDSyByYXRlcyBpbiAyLjRHSHogbW9kZSwKKwkJICogdGhlIG5vbi1NQ1MgcmF0ZXMg TUFZIGFjdHVhbGx5IHByb3ZpZGUgYmV0dGVyCisJCSAqIFBFUiBhdCB0aGUgdmVyeSBmYXIgZWRn ZSBvZiByZWNlcHRpb24uCisJCSAqCisJCSAqIEhvd2V2ZXIhIFVudGlsIGF0aF9yYXRlX2Zvcm1f YWdncigpIGdyb3dzCisJCSAqIHNvbWUgbG9naWMgdG8gbm90IGZvcm0gYWdncmVnYXRlcyBpZiB0 aGUKKwkJICogc2VsZWN0ZWQgcmF0ZSBpcyBub24tTUNTLCB0aGlzIHdvbid0IHdvcmsuCisJCSAq CisJCSAqIFNvIGRvbid0IGRpc2FibGUgdGhpcyBjb2RlIHVudGlsIHlvdSd2ZSB0YXVnaHQKKwkJ ICogYXRoX3JhdGVfZm9ybV9hZ2dyKCkgdG8gZHJvcCBvdXQgaWYgYW55IG9mCisJCSAqIHRoZSBz ZWxlY3RlZCByYXRlcyBhcmUgbm9uLU1DUy4KKwkJICovCisjaWYgMQorCQkvKiBpZiB0aGUgbm9k ZSBpcyBIVCBhbmQgdGhlIHJhdGUgaXNuJ3QgSFQsIGRvbid0IGJvdGhlciBzYW1wbGUgKi8KKwkJ aWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChydC0+aW5m b1tyaXhdLnBoeSAhPSBJRUVFODAyMTFfVF9IVCkpIHsKKwkJCW1hc2sgJj0gfigodWludDY0X3Qp IDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisjZW5kaWYKKworCQkvKiB0aGlzIGJp dC1yYXRlIGlzIGFsd2F5cyB3b3JzZSB0aGFuIHRoZSBjdXJyZW50IG9uZSAqLworCQlpZiAoc2Fu LT5zdGF0c1tzaXplX2Jpbl1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPiBjdXJyZW50X3R0KSB7CisJ CQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0cmF0ZTsKKwkJfQor CisJCS8qIHJhcmVseSBzYW1wbGUgYml0LXJhdGVzIHRoYXQgZmFpbCBhIGxvdCAqLworCQlpZiAo c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID4gc2FtcGxlLT5z YW1wbGVfbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMgJiYKKwkJICAgIHRpY2tzIC0gc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4XS5sYXN0X3R4IDwgc2FtcGxlLT5zYW1wbGVfc3RhbGVfZmFpbHVyZV90 aW1lb3V0KSB7CisJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0 cmF0ZTsKKwkJfQorCisJCS8qCisJCSAqIEZvciBIVCwgb25seSBzYW1wbGUgYSBmZXcgcmF0ZXMg b24gZWl0aGVyIHNpZGUgb2YgdGhlCisJCSAqIGN1cnJlbnQgcml4OyB0aGVyZSdzIHF1aXRlIGxp a2VseSBhIGxvdCBvZiB0aGVtLgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIx MV9OT0RFX0hUKSB7CisJCQlpZiAocml4IDwgKGN1cnJlbnRfcml4IC0gMykgfHwKKwkJCSAgICBy aXggPiAoY3VycmVudF9yaXggKyAzKSkgeworCQkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8PHJp eCk7CisJCQkJZ290byBuZXh0cmF0ZTsKKwkJCX0KKwkJfQorCisJCS8qIERvbid0IHNhbXBsZSBt b3JlIHRoYW4gMiByYXRlcyBoaWdoZXIgZm9yIHJhdGVzID4gMTFNIGZvciBub24tSFQgcmF0ZXMg Ki8KKwkJaWYgKCEgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSkgeworCQkJaWYg KERPVDExUkFURShyaXgpID4gMioxMSAmJiByaXggPiBjdXJyZW50X3JpeCArIDIpIHsKKwkJCQlt YXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJCWdvdG8gbmV4dHJhdGU7CisJCQl9CisJ CX0KKworCQlzYW4tPmxhc3Rfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSByaXg7CisJCXJldHVybiBy aXg7CisJfQorCXJldHVybiBjdXJyZW50X3JpeDsKKyN1bmRlZiBET1QxMVJBVEUKKyN1bmRlZiBN Q1MKK30KKworc3RhdGljIGludAorc2FtcGxlX2dldF9zdGF0aWNfcml4KGNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqbmkpCit7CisjZGVmaW5lCVJBVEUoX2l4KQkobmktPm5pX3JhdGVzLnJz X3JhdGVzWyhfaXgpXSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKF9peCkJKG5p LT5uaV9odHJhdGVzLnJzX3JhdGVzW19peF0gfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjEx X3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNf Y3VyY2hhbik7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eHBhcmFtICp0cCA9IG5pLT5uaV90 eHBhcm1zOworCWludCBzcmF0ZTsKKworCS8qIENoZWNrIE1DUyByYXRlcyAqLworCWZvciAoc3Jh dGUgPSBuaS0+bmlfaHRyYXRlcy5yc19ucmF0ZXMgLSAxOyBzcmF0ZSA+PSAwOyBzcmF0ZS0tKSB7 CisJCWlmIChNQ1Moc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1cm4gcnQtPnJhdGVD b2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisKKwkvKiBDaGVjayBsZWdhY3kgcmF0ZXMg Ki8KKwlmb3IgKHNyYXRlID0gbmktPm5pX3JhdGVzLnJzX25yYXRlcyAtIDE7IHNyYXRlID49IDA7 IHNyYXRlLS0pIHsKKwkJaWYgKFJBVEUoc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1 cm4gcnQtPnJhdGVDb2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisJcmV0dXJuIC0xOwor I3VuZGVmCVJBVEUKKyN1bmRlZglNQ1MKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV91cGRhdGVf c3RhdGljX3JpeChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAy MTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgw MjExX3R4cGFyYW0gKnRwID0gbmktPm5pX3R4cGFybXM7CisKKwlpZiAodHAgIT0gTlVMTCAmJiB0 cC0+dWNhc3RyYXRlICE9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpIHsKKwkJLyoKKwkJICog QSBmaXhlZCByYXRlIGlzIHRvIGJlIHVzZWQ7IHVjYXN0cmF0ZSBpcyB0aGUgSUVFRSBjb2RlCisJ CSAqIGZvciB0aGlzIHJhdGUgKHNhbnMgYmFzaWMgYml0KS4gIENoZWNrIHRoaXMgYWdhaW5zdCB0 aGUKKwkJICogbmVnb3RpYXRlZCByYXRlIHNldCBmb3IgdGhlIG5vZGUuICBOb3RlIHRoZSBmaXhl ZCByYXRlCisJCSAqIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciB2YXJpb3VzIHJlYXNvbnMgc28g d2Ugb25seQorCQkgKiBzZXR1cCB0aGUgc3RhdGljIHJhdGUgaW5kZXggaWYgdGhlIGxvb2t1cCBp cyBzdWNjZXNzZnVsLgorCQkgKi8KKwkJc2FuLT5zdGF0aWNfcml4ID0gc2FtcGxlX2dldF9zdGF0 aWNfcml4KG5pKTsKKwl9IGVsc2UgeworCQlzYW4tPnN0YXRpY19yaXggPSAtMTsKKwl9Cit9CisK Ky8qCisgKiBQaWNrIGEgbm9uLUhUIHJhdGUgdG8gYmVnaW4gdXNpbmcuCisgKi8KK3N0YXRpYyBp bnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9sZWdhY3koY29uc3Qgc3RydWN0IGllZWU4MDIxMV9u b2RlICpuaSwgaW50IGZyYW1lTGVuKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5m b1tpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorCXN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2Fu ID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQg PSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwlj b25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJaW50IHJpeCA9IC0x OworCisJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAqLworCWZv ciAocml4ID0gcnQtPnJhdGVDb3VudC0xOyByaXggPiAwOyByaXgtLSkgeworCQlpZiAoKHNhbi0+ cmF0ZW1hc2sgJiAoKHVpbnQ2NF90KSAxPDxyaXgpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJ LyogU2tpcCBIVCByYXRlcyAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjEx X1RfSFQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBQaWNrIHRoZSBoaWdoZXN0IHJhdGUg PD0gMzYgTWJwcworCQkgKiB0aGF0IGhhc24ndCBmYWlsZWQuCisJCSAqLworCQlpZiAoRE9UMTFS QVRFKHJpeCkgPD0gNzIgJiYKKwkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vz c2l2ZV9mYWlsdXJlcyA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcml4Owor I3VuZGVmIERPVDExUkFURQorfQorCisvKgorICogUGljayBhIEhUIHJhdGUgdG8gYmVnaW4gdXNp bmcuCisgKgorICogRG9uJ3QgdXNlIGFueSBub24tSFQgcmF0ZXM7IG9ubHkgY29uc2lkZXIgSFQg cmF0ZXMuCisgKi8KK3N0YXRpYyBpbnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChjb25zdCBz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgZnJhbWVMZW4pCit7CisjZGVmaW5lCU1DUyhp eCkJCShydC0+aW5mb1tpeF0uZG90MTFSYXRlIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVj dCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1w bGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0 ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJj aGFuKTsKKwkKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJ aW50IHJpeCA9IC0xLCBodF9yaXggPSAtMTsKKworCS8qIG5vIHBhY2tldCBoYXMgYmVlbiBzZW50 IHN1Y2Nlc3NmdWxseSB5ZXQgKi8KKwlmb3IgKHJpeCA9IHJ0LT5yYXRlQ291bnQtMTsgcml4ID4g MDsgcml4LS0pIHsKKwkJLyogU2tpcCByYXRlcyB3ZSBjYW4ndCB1c2UgKi8KKwkJaWYgKChzYW4t PnJhdGVtYXNrICYgKCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJ CS8qIEtlZXAgYSBjb3B5IG9mIHRoZSBsYXN0IHNlZW4gSFQgcmF0ZSBpbmRleCAqLworCQlpZiAo cnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQpCisJCQlodF9yaXggPSByaXg7CisK KwkJLyogU2tpcCBub24tSFQgcmF0ZXMgKi8KKwkJaWYgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9IElF RUU4MDIxMV9UX0hUKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogUGljayBhIG1lZGl1bS1z cGVlZCByYXRlIHJlZ2FyZGxlc3Mgb2Ygc3RyZWFtIGNvdW50CisJCSAqIHdoaWNoIGhhcyBub3Qg c2VlbiBhbnkgZmFpbHVyZXMuIEhpZ2hlciByYXRlcyBtYXkgZmFpbDsKKwkJICogd2UnbGwgdHJ5 IHRoZW0gbGF0ZXIuCisJCSAqLworCQlpZiAoKChNQ1Mocml4KSAmIDB4NykgPD0gNCkgJiYKKwkJ ICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9PSAwKSB7 CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogSWYgYWxsIHRoZSBNQ1MgcmF0ZXMgaGF2 ZSBzdWNjZXNzaXZlIGZhaWx1cmVzLCByaXggc2hvdWxkIGJlCisJICogPiAwOyBvdGhlcndpc2Ug dXNlIHRoZSBsb3dlc3QgTUNTIHJpeCAoaG9wZWZ1bGx5IE1DUyAwLikKKwkgKi8KKwlyZXR1cm4g TUFYKHJpeCwgaHRfcml4KTsKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIGludAorc2FtcGxlX3Jh dGUoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdm9pZCAqYXJnIF9fdW51c2VkLCB1aW50MzJf dCBpYXJnIF9fdW51c2VkKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0u ZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmlu Zm9baXhdLmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKyNkZWZpbmUJUkFURShpeCkJ KERPVDExUkFURShpeCkgLyAyKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92 YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOwor CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJY29u c3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRh YmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWludCByaXgsIG1yciwgYmVzdF9yaXgs IGNoYW5nZV9yYXRlczsKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJCisJc2l6ZV90IGZy YW1lTGVuID0gKHNpemVfdClpYXJnOworCWNvbnN0IGludCBzaXplX2JpbiA9IHNpemVfdG9fYmlu KGZyYW1lTGVuKTsKKworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwlpZiAoc2Fu LT5zdGF0aWNfcml4ICE9IC0xKSB7CisJCXJpeCA9IHNhbi0+c3RhdGljX3JpeDsKKwkJZ290byBk b25lOworCX0KKworCWlmIChJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSKG5pKSkKKwkJbXJy ID0gMTsKKwlpZiAoISBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSUFJPVChuaSkpCisJCW1y ciA9IDA7CisKKwliZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFt cnIpOworCWlmIChiZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3Rh dHNbc2l6ZV9iaW5dW2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZl cmFnZV90eF90aW1lID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmlu ZyB0aGUgcGVyZm9ybWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUg b2YgdGhlIHRvdGFsIHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90 dFtzaXplX2Jpbl0gPCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBs ZVtzaXplX2Jpbl0gKgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlj a19zYW1wbGVfcmF0ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJ RUVFODAyMTFfTVNHX1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBz aXplICV1IHNhbXBsZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZl cmFnZV90eF90aW1lLAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBi aW5fdG9fc2l6ZShzaXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAg IGRvdDExcmF0ZV9sYWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXpl X2Jpbl0pIHsKKwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJ fSBlbHNlIHsKKwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9 CisJCXNhbi0+cGFja2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2Ugewor CQljaGFuZ2VfcmF0ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8 fCBiZXN0X3JpeCA9PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vz c2Z1bGx5IHlldCAqLworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3Mg JiBJRUVFODAyMTFfTk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0 ZV9odChuaSwgZnJhbWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tf c2VlZF9yYXRlX2xlZ2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0 c19zZW50W3NpemVfYmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBx dWlja2x5IGR1cmluZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RF KHZhcCwKKwkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3 aXRjaGluZyBxdWlja2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9 IGVsc2UgaWYgKHRpY2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nf c2luY2Vfc3dpdGNoW3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUg Z29uZSBieSAqLworCQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0df UkFURUNUTCwgJm5pLAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3 aXRjaCAlZC4uIiwKKwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5f c3dpdGNoLCBzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3Jh dGVzID0gMTsKKwkJfSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf SFQpKSAmJgorCQkgICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1b c2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRo ZSBjdXJyZW50IGJpdC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJ CQlJRUVFODAyMTFfTk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmks CisJCQkgICAgIiVzOiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9f ZnVuY19fLAorCQkJICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5d W3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdl X3JhdGVzID0gMTsKKwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf SFQpKSB7CisJCQlpbnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJ aW50IGN1cl9hdHQgPSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3Rp bWU7CisJCQkvKgorCQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1D UyByYXRlIGlzCisJCQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGlu IDIwJSBvZgorCQkJICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJ CQkgKgorCQkJICogVGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJ CQlwcmludGYoImN1ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkg ICAgTUNTKGN1cl9yaXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUp OworI2VuZGlmCisJCQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkg ICAgKGF2ZXJhZ2VfdHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgw MjExX05PVEUodmFwLAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkg ICAgIiVzOiBIVDogYmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1l ICVkLCBjdXJfYXR0ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3Jp eCksIE1DUyhjdXJfcml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2Vf cmF0ZXMgPSAxOworCQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXpl X2Jpbl0rKzsKKwkJCisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBz YW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJ CQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQg c3dpdGNoIHJhdGUgJWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJy ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwK KwkJCQkgICAgUkFURShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+ c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3Rp bWUsCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9i aW5dXS5wZXJmZWN0X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBz YW4tPnN0YXRzW3NpemVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBz YW4tPnN0YXRzW3NpemVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBz YW4tPnBhY2tldHNfc2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0K KwkJCXNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3Vy cmVudF9yaXhbc2l6ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRj aFtzaXplX2Jpbl0gPSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0 ZSBmb3IgdGhpcyBub2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0 LCBiZXN0X3JpeCk7CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJ CXNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0g bXJyID8gc2FuLT5zY2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJ ICogVGhpcyBidWcgdG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICog Rm9yIG5vdyB0aG91Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3Vy ZQorCSAqIG91dCBob3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwg MCB8fCByaXggPj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVk IG91dCBvZiBib3VuZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAg IHJpeCwKKwkJICAgIHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3Qg ZGVmYXVsdCBmb3Igbm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJh dGVDb3VudCwgKCJyaXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0 eHJhdGUgPSBydC0+aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBy dC0+aW5mb1tyaXhdLnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXpl X2Jpbl0rKzsKKworCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisj dW5kZWYgUkFURQorfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAy MTFfbm9kZSAqbmksIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1 Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCBy aXgwID0gc2FtcGxlX3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxl ICpzY2hlZCA9ICZzYW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVz ICpyYyA9IHJjX2luZm8tPnJpX3JjOworCisJS0FTU0VSVChyaXgwID09IHNjaGVkLT5yMCwgKCJy aXgwICgleCkgIT0gc2NoZWQtPnIwICgleCkhXG4iLAorCSAgICByaXgwLCBzY2hlZC0+cjApKTsK KwkvKiBYWFggKi8KKwlyY1swXS5mbGFncyA9IHJjWzFdLmZsYWdzID0gcmNbMl0uZmxhZ3MgPSBy Y1szXS5mbGFncyA9IDA7CisKKwlyY1swXS5yaXggPSBzY2hlZC0+cjA7CisJcmNbMV0ucml4ID0g c2NoZWQtPnIxOworCXJjWzJdLnJpeCA9IHNjaGVkLT5yMjsKKwlyY1szXS5yaXggPSBzY2hlZC0+ cjM7CisKKwlyY1swXS50cmllcyA9IHNjaGVkLT50MDsKKwlyY1sxXS50cmllcyA9IHNjaGVkLT50 MTsKKwlyY1syXS50cmllcyA9IHNjaGVkLT50MjsKKwlyY1szXS50cmllcyA9IHNjaGVkLT50MzsK K30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9zdGF0cyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAsCisgICAgCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJICBpbnQg ZnJhbWVfc2l6ZSwKKwkJICBpbnQgcml4MCwgaW50IHRyaWVzMCwKKwkJICBpbnQgcml4MSwgaW50 IHRyaWVzMSwKKwkJICBpbnQgcml4MiwgaW50IHRyaWVzMiwKKwkJICBpbnQgcml4MywgaW50IHRy aWVzMywKKwkJICBpbnQgc2hvcnRfdHJpZXMsIGludCB0cmllcywKKwkJICBpbnQgbmZyYW1lcywg aW50IG5iYWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5p X3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1w bGU7CisKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZV9zaXplKTsKKwlj b25zdCBpbnQgc2l6ZSA9IGJpbl90b19zaXplKHNpemVfYmluKTsKKworCWludCBpc19odDQwID0g aWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAodmFwLCBuaSk7CisJaW50IHR0LCB0cmllc19z b19mYXI7CisJaW50IHBjdDsKKworCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MCkpCisJ CXJldHVybjsKKwl0dCA9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgw LCBzaG9ydF90cmllcywKKwkJTUlOKHRyaWVzMCwgdHJpZXMpIC0gMSwgaXNfaHQ0MCk7CisJdHJp ZXNfc29fZmFyID0gdHJpZXMwOworCisJaWYgKHRyaWVzMSAmJiB0cmllc19zb19mYXIgPCB0cmll cykgeworCQlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDEpKQorCQkJcmV0dXJuOworCQl0 dCArPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MSwgc2hvcnRfdHJp ZXMsCisJCQlNSU4odHJpZXMxICsgdHJpZXNfc29fZmFyLCB0cmllcykgLSB0cmllc19zb19mYXIg LSAxLCBpc19odDQwKTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVzMTsKKwl9CisKKwlpZiAodHJp ZXMyICYmIHRyaWVzX3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICghSVNfUkFURV9ERUZJTkVEKHNh biwgcml4MikpCisJCQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQo dmFwLCBzaXplLCByaXgyLCBzaG9ydF90cmllcywKKwkJCU1JTih0cmllczIgKyB0cmllc19zb19m YXIsIHRyaWVzKSAtIHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDApOworCQl0cmllc19zb19mYXIg Kz0gdHJpZXMyOworCX0KKworCWlmICh0cmllczMgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsK KwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCByaXgzKSkKKwkJCXJldHVybjsKKwkJdHQgKz0g Y2FsY191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDMsIHNob3J0X3RyaWVzLAor CQkJTUlOKHRyaWVzMyArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwg aXNfaHQ0MCk7CisJfQorCisJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3Bh Y2tldHMgPCBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfbWlucGFja2V0cykgeworCQkvKiBqdXN0 IGF2ZXJhZ2UgdGhlIGZpcnN0IGZldyBwYWNrZXRzICovCisJCWludCBhdmdfdHggPSBzYW4tPnN0 YXRzW3NpemVfYmluXVtyaXgwXS5hdmVyYWdlX3R4X3RpbWU7CisJCWludCBwYWNrZXRzID0gc2Fu LT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0czsKKwkJc2FuLT5zdGF0c1tzaXpl X2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gKHR0KyhhdmdfdHgqcGFja2V0cykpLyhwYWNr ZXRzK25mcmFtZXMpOworCX0gZWxzZSB7CisJCS8qIHVzZSBhIGV3bWEgKi8KKwkJc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gCisJCQkoKHNhbi0+c3RhdHNbc2l6 ZV9iaW5dW3JpeDBdLmF2ZXJhZ2VfdHhfdGltZSAqIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19y YXRlKSArIAorCQkJICh0dCAqICgxMDAgLSBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkp KSAvIDEwMDsKKwl9CisJCisJLyoKKwkgKiBYWFggRG9uJ3QgbWFyayB0aGUgaGlnaGVyIGJpdCBy YXRlcyBhcyBhbHNvIGhhdmluZyBmYWlsZWQ7IGFzIHRoaXMKKwkgKiB1bmZvcnR1bmF0ZWx5IHN0 b3BzIHRob3NlIHJhdGVzIGZyb20gYmVpbmcgdGFzdGVkIHdoZW4gdHJ5aW5nIHRvCisJICogVFgu IFRoaXMgaGFwcGVucyB3aXRoIDExbiBhZ2dyZWdhdGlvbi4KKwkgKi8KKwlpZiAobmZyYW1lcyA9 PSBuYmFkKSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1Y2Nlc3NpdmVfZmFpbHVy ZXMgKz0gbmJhZDsKKworCX0gZWxzZSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnBh Y2tldHNfYWNrZWQgKz0gKG5mcmFtZXMgLSBuYmFkKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b cml4MF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9IDA7CisJfQorCXNhbi0+c3RhdHNbc2l6ZV9iaW5d W3JpeDBdLnRyaWVzICs9IHRyaWVzOworCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmxhc3Rf dHggPSB0aWNrczsKKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzICs9 IG5mcmFtZXM7CisKKwkvKiB1cGRhdGUgRVdNQSBmb3IgdGhpcyByaXggKi8KKworCS8qIENhbGN1 bGF0ZSBwZXJjZW50YWdlIGJhc2VkIG9uIGN1cnJlbnQgcmF0ZSAqLworCWlmIChuZnJhbWVzID09 IDApCisJCW5mcmFtZXMgPSBuYmFkID0gMTsKKwlwY3QgPSAoKG5mcmFtZXMgLSBuYmFkKSAqIDEw MDApIC8gbmZyYW1lczsKKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9w YWNrZXRzIDwKKwkgICAgc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJ LyoganVzdCBhdmVyYWdlIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYV9wY3QgPSAo c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0ucGFja2V0c19hY2tlZCAqIDEwMDApIC8KKwkJICAg IChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzKTsKKwkJc2FuLT5zdGF0 c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgPSBhX3BjdDsKKwl9IGVsc2UgeworCQkvKiB1c2Ug YSBld21hICovCisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ID0KKwkJCSgo c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgKiBzYW1wbGUtPnNhbnBsZV9zbW9v dGhpbmdfcmF0ZSkgKworCQkJIChwY3QgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5n X3JhdGUpKSkgLyAxMDA7CisJfQorCisJaWYgKHJpeDAgPT0gc2FuLT5jdXJyZW50X3NhbXBsZV9y aXhbc2l6ZV9iaW5dKSB7CisJCXNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSA9IHR0OworCQlzYW4t PmN1cnJlbnRfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lk CitzYW1wbGVfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorICAg IGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBvaywKKyAgICB2b2lkICphcmcx LCB2b2lkICphcmcyKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5p LT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVl ZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisKKwkvKiBYWFgg bmVlZCB0byBjaGFuZ2UgYXJnMiB0byBwb2ludGVyIG9mIGllZWU4MDIxMV9yY19pbmZvICovCisJ c3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNf aW5mbyopYXJnMjsKKworCWludCBmaW5hbF9yaXgsIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzOwor CWludCBuZnJhbWVzLCBuYmFkOworCWludCBmcmFtZV9zaXplLCBtcnI7CisKKwlmaW5hbF9yaXgg PSBydC0+cmF0ZUNvZGVUb0luZGV4W3JjX2luZm8tPnJpX3R4cmF0ZV07CisJc2hvcnRfdHJpZXMg PSByY19pbmZvLT5yaV9zaG9ydHJldHJ5OworCS8qIFhYWCB3aHkgcGx1cyAxIGhlcmU/ICovCisJ bG9uZ190cmllcyA9IHJjX2luZm8tPnJpX2xvbmdyZXRyeSArIDE7CisKKwluZnJhbWVzID0gcmNf aW5mby0+cmlfdHhjbnQ7CisJbmJhZCA9IHJjX2luZm8tPnJpX2ZhaWxjbnQ7CisKKwlmcmFtZV9z aXplID0gcmNfaW5mby0+cmlfZnJhbWVsZW47CisJbXJyID0gMDsKKworCWlmIChuZnJhbWVzID09 IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcmFtZV9zaXplID09IDApCQkgICAgLyogTkI6 IHNob3VsZCBub3QgaGFwcGVuICovCisJCWZyYW1lX3NpemUgPSAxNTAwOworCisJaWYgKHNhbi0+ cmF0ZW1hc2sgPT0gMCkgeworCQlyZXR1cm47CisJfQorCQorCWlmIChJRUVFODAyMTFfUkFURUNU TF9IQVNDQVBfTVJSKG5pKSkKKwkJbXJyID0gMTsKKwkvKiBYWFggY2hlY2sgSFQgcHJvdG1vZGUg dG9vICovCisJaWYgKG1yciAmJiAhSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBST1Qobmkp KQorCQltcnIgPSAwOworCQorCWlmICghbXJyIHx8IHJjX2luZm8tPnJpX2ZpbmFsdHNpID09IDAp IHsKKwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47 CisJCX0KKwkJLyoKKwkJICogT25seSBvbmUgcmF0ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4K KwkJICovCisJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmlu YWxfcml4LCBsb25nX3RyaWVzLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAg ICAwLCAwLAorCQkJICAgICBzaG9ydF90cmllcywgbG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1l cywgbmJhZCk7CisKKwl9IGVsc2UgeworCQlpbnQgZmluYWxUU0lkeCA9IHJjX2luZm8tPnJpX2Zp bmFsdHNpOworCQlpbnQgaTsKKworCQkvKgorCQkgKiBOQjogc2VyaWVzID4gMCBhcmUgbm90IHBl bmFsaXplZCBmb3IgZmFpbHVyZQorCQkgKiBiYXNlZCBvbiB0aGUgdHJ5IGNvdW50cyB1bmRlciB0 aGUgYXNzdW1wdGlvbgorCQkgKiB0aGF0IGxvc3NlcyBhcmUgb2Z0ZW4gYnVyc3R5IGFuZCBzaW5j ZSB3ZQorCQkgKiBzYW1wbGUgaGlnaGVyIHJhdGVzIDEgdHJ5IGF0IGEgdGltZSBkb2luZyBzbwor CQkgKiBtYXkgdW5mYWlybHkgcGVuYWxpemUgdGhlbS4KKwkJICovCisJCWlmIChyY1swXS50cmll cykgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1sw XS5yaXgsIHJjWzBdLnRyaWVzLAorCQkJCSAgICAgcmNbMV0ucml4LCByY1sxXS50cmllcywKKwkJ CQkgICAgIHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNd LnRyaWVzLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJh bWVzLCBuYmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMF0udHJpZXM7CisJCX0KKwkJCisJCWlm IChyY1sxXS50cmllcyAmJiBmaW5hbFRTSWR4ID4gMCkgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwg bmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1sxXS5yaXgsIHJjWzFdLnRyaWVzLAorCQkJCSAg ICAgcmNbMl0ucml4LCByY1syXS50cmllcywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJp ZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJ CQkJICAgICBuZnJhbWVzLCBuYmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMV0udHJpZXM7CisJ CX0KKworCQlpZiAocmNbMl0udHJpZXMgJiYgZmluYWxUU0lkeCA+IDEpIHsKKwkJCXVwZGF0ZV9z dGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1syXS50cmll cywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJ CSAgICAgMCwgMCwKKwkJCQkgICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAg bmZyYW1lcywgbmJhZCk7CisJCQlsb25nX3RyaWVzIC09IHJjWzJdLnRyaWVzOworCQl9CisKKwkJ aWYgKHJjWzNdLnRyaWVzICYmIGZpbmFsVFNJZHggPiAyKSB7CisJCQl1cGRhdGVfc3RhdHModmFw LCBuaSwgZnJhbWVfc2l6ZSwKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJ ICAgICAwLCAwLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9y dF90cmllcywgbG9uZ190cmllcywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQl9CisJfQor fQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx dmFwICp2YXAsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisgICAgdm9pZCAqYXJn MSwgdm9pZCAqYXJnMiwgdm9pZCAqYXJnMykKK3sKKwkvKiBub3RoaW5nIGhlcmUuICovCit9CisK K3N0YXRpYyB2b2lkCitzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZh cCAqdmFwLCBpbnQgbXNlY3MpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9 IHZhcC0+aXZfcnM7CisJaW50IHQ7CisKKwlpZiAobXNlY3MgPCAxMDApCisJCW1zZWNzID0gMTAw OworCXQgPSBtc2Vjc190b190aWNrcyhtc2Vjcyk7CisJLyogaWVlZTgwMjExX3NhbXBsZSBkb2Vz bid0IGhhdmUgdGhlIHNhbXBsZV9pbnRlcnZhbCBmaWVsZCBieSBub3cgKi8KKwkvLyBzYW1wbGUt PnNhbXBsZV9pbnRlcnZhbCA9ICh0IDwgMSkgPyAxIDogdDsKK30KKworc3RhdGljIHZvaWQKK3Nh bXBsZV9zdGF0cyh2b2lkICphcmcsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJc3Ry dWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Nh bXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9y YXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1 cmNoYW4pOworCXVpbnQ2NF90IG1hc2s7CisJaW50IHJpeCwgeTsKKworCXByaW50ZigiXG5bJXNd IHJlZmNudCAlZCBzdGF0aWNfcml4ICglZCAlcykgcmF0ZW1hc2sgMHglanhcbiIsCisJICAgIGV0 aGVyX3NwcmludGYobmktPm5pX21hY2FkZHIpLCBpZWVlODAyMTFfbm9kZV9yZWZjbnQobmkpLAor CSAgICBkb3QxMXJhdGUocnQsIHNhbi0+c3RhdGljX3JpeCksCisJICAgIGRvdDExcmF0ZV9sYWJl bChydCwgc2FuLT5zdGF0aWNfcml4KSwKKwkgICAgKHVpbnRtYXhfdClzYW4tPnJhdGVtYXNrKTsK Kwlmb3IgKHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlwcmludGYo IlslNHVdIGN1ciByaXggJWQgKCVkICVzKSBzaW5jZSBzd2l0Y2g6IHBhY2tldHMgJWQgdGlja3Mg JXVcbiIsCisJCSAgICBiaW5fdG9fc2l6ZSh5KSwgc2FuLT5jdXJyZW50X3JpeFt5XSwKKwkJICAg IGRvdDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFi ZWwocnQsIHNhbi0+Y3VycmVudF9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NpbmNlX3N3 aXRjaFt5XSwgc2FuLT50aWNrc19zaW5jZV9zd2l0Y2hbeV0pOworCQlwcmludGYoIlslNHVdIGxh c3Qgc2FtcGxlICglZCAlcykgY3VyIHNhbXBsZSAoJWQgJXMpIHBhY2tldHMgc2VudCAlZFxuIiwK KwkJICAgIGJpbl90b19zaXplKHkpLAorCQkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmxhc3Rfc2Ft cGxlX3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+bGFzdF9zYW1wbGVf cml4W3ldKSwKKwkJICAgIGRvdDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0p LAorCQkgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5XSks CisJCSAgICBzYW4tPnBhY2tldHNfc2VudFt5XSk7CisJCXByaW50ZigiWyU0dV0gcGFja2V0cyBz aW5jZSBzYW1wbGUgJWQgc2FtcGxlIHR0ICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNh bi0+cGFja2V0c19zaW5jZV9zYW1wbGVbeV0sCisJCSAgICBzYW4tPnNhbXBsZV90dFt5XSk7CisJ fQorCWZvciAobWFzayA9IHNhbi0+cmF0ZW1hc2ssIHJpeCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+ Pj0gMSwgcml4KyspIHsKKwkJaWYgKChtYXNrICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJ Zm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJCWlmIChzYW4t PnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJp bnRmKCJbJTJ1ICVzOiU0dV0gJThqdTolLThqdSAoJTNkJSUpIChFV01BICUzZC4lMWQlJSkgVCAl OGp1IEYgJTRkIGF2ZyAlNXUgbGFzdCAldVxuIiwKKwkJCSAgICBkb3QxMXJhdGUocnQsIHJpeCks IGRvdDExcmF0ZV9sYWJlbChydCwgcml4KSwKKwkJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJCSAg ICAodWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cywKKwkJCSAgICAo dWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0ucGFja2V0c19hY2tlZCwKKwkJCSAgICAoaW50 KSAoKHNhbi0+c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkICogMTAwVUxMKSAvCisJCQkgICAg IHNhbi0+c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzKSwKKwkJCSAgICBzYW4tPnN0YXRzW3ld W3JpeF0uZXdtYV9wY3QgLyAxMCwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3Qg JSAxMCwKKwkJCSAgICAodWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMsCisJCQkg ICAgc2FuLT5zdGF0c1t5XVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMsCisJCQkgICAgc2FuLT5z dGF0c1t5XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZSwKKwkJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNb eV1bcml4XS5sYXN0X3R4KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0 bF9zdGF0cyhTWVNDVExfSEFORExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZh cCA9IGFyZzE7CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2lmcC0+aWZfbDJj b207CisJaW50IGVycm9yLCB2OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2lu dChvaWRwLCAmdiwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1 cm4gZXJyb3I7CisJaWVlZTgwMjExX2l0ZXJhdGVfbm9kZXMoJmljLT5pY19zdGEsIHNhbXBsZV9z dGF0cywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxf c21vb3RoaW5nX3JhdGUoU1lTQ1RMX0hBTkRMRVJfQVJHUykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjEx dmFwICp2YXAgPSBhcmcxOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAt Pml2X3JzOworCWludCByYXRlLCBlcnJvcjsKKworCXJhdGUgPSBzYW1wbGUtPnNhbXBsZV9zbW9v dGhpbmdfcmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCBy ZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAo ISgwIDw9IHJhdGUgJiYgcmF0ZSA8IDEwMCkpCisJCXJldHVybiBFSU5WQUw7CisJc2FtcGxlLT5z YW1wbGVfc21vb3RoaW5nX3JhdGUgPSByYXRlOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19t aW5wYWNrZXRzID0gMTAwIC8gKDEwMCAtIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50CitzYW1wbGVfc3lzY3RsX3NhbXBsZV9yYXRlKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJ c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBs ZSAqc2FtcGxlID0gdmFwLT5pdl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwlyYXRlID0gc2Ft cGxlLT5zYW1wbGVfcmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRl LCAwLCByZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsK KwlpZiAoISgyIDw9IHJhdGUgJiYgcmF0ZSA8PSAxMDApKQorCQlyZXR1cm4gRUlOVkFMOworCXNh bXBsZS0+c2FtcGxlX3JhdGUgPSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAor c2FtcGxlX3N5c2N0bGF0dGFjaChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgc3RydWN0 IHN5c2N0bF9jdHhfbGlzdCAqY3R4LCBzdHJ1Y3Qgc3lzY3RsX29pZCAqdHJlZSkKK3sKKwlTWVND VExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAi c2FtcGxlX3Ntb290aGluZ19yYXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAsIDAs CisJICAgIHNhbXBsZV9zeXNjdGxfc21vb3RoaW5nX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTog c21vb3RoaW5nIHJhdGUgZm9yIGF2ZyB0eCB0aW1lICglJSkiKTsKKwlTWVNDVExfQUREX1BST0Mo Y3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3JhdGUi LCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9z YW1wbGVfcmF0ZSwgIkkiLAorCSAgICAic2FtcGxlOiBwZXJjZW50IGFpciB0aW1lIGRldm90ZWQg dG8gc2FtcGxpbmcgbmV3IHJhdGVzICglJSkiKTsKKwkvKiBYWFggbWF4X3N1Y2Nlc3NpdmVfZmFp bHVyZXMsIHN0YWxlX2ZhaWx1cmVfdGltZW91dCwgbWluX3N3aXRjaCAqLworCVNZU0NUTF9BRERf UFJPQyhjdHgsIFNZU0NUTF9DSElMRFJFTih0cmVlKSwgT0lEX0FVVE8sCisJICAgICJzYW1wbGVf c3RhdHMiLCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5 c2N0bF9zdGF0cywgIkkiLCAic2FtcGxlOiBwcmludCBzdGF0aXN0aWNzIik7Cit9CkluZGV4OiBu ZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVl ZTgwMjExX3JjX3NhbXBsZS5oCShyZXZpc2lvbiAwKQorKysgbmV0ODAyMTEvaWVlZTgwMjExX3Jj X3NhbXBsZS5oCShyZXZpc2lvbiAyNTU5NzApCkBAIC0wLDAgKzEsMjg3IEBACisvKiAkRnJlZUJT RDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxlLmggMjQwMzgyIDIwMTIt MDgtMTUgMDc6MTA6MTBaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUg Sm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBG cmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAg d2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv cm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHNpbWlsYXIg dG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQg YW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24gaW5jbHVk aW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50 IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5h bWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwor ICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRo aXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAq IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5U WQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg QU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ RUQgV0FSUkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQsIE1FUkNIQU5USUJJTElUWQorICogQU5E IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF VkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBM SUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAqIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisj aWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVfSF8KKyNkZWZpbmUgX05F VDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9IXworCisjaW5jbHVkZSA8bmV0ODAyMTEv aWVlZTgwMjExX3JhdGVjdGwuaD4KKworLyoKKyAqIGZvciBub3csIHdlIHRyYWNrIHBlcmZvcm1h bmNlIGZvciB0aHJlZSBkaWZmZXJlbnQgcGFja2V0CisgKiBzaXplIGJ1Y2tldHMKKyAqLworI2Rl ZmluZSBOVU1fUEFDS0VUX1NJWkVfQklOUyAyCisjZGVmaW5lCVNBTVBMRV9NQVhSQVRFUwk2NAkJ LyogTkI6IGNvcnJlc3BvbmRzIHRvIGhhbCBpbmZvWzMyXSAqLworCisvKgorICogUmF0ZSBjb250 cm9sIHNldHRpbmdzLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSB7CisJaW50CXNhbXBs ZV9zbW9vdGhpbmdfcmF0ZTsJCQkvKiBld21hIHBlcmNlbnRhZ2UgWzAuLjk5XSAqLworCWludAlz YW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHM7CisJaW50CXNhbXBsZV9yYXRlOwkJCS8qICV0aW1l IHRvIHRyeSBkaWZmZXJlbnQgdHggcmF0ZXMgKi8KKwlpbnQJc2FtcGxlX21heF9zdWNjZXNzaXZl X2ZhaWx1cmVzOworCWludAlzYW1wbGVfc3RhbGVfZmFpbHVyZV90aW1lb3V0OwkvKiBob3cgbG9u ZyB0byBob25vciBtYXhfc3VjY2Vzc2l2ZV9mYWlsdXJlcyAqLworCWludAlzYW1wbGVfbWluX3N3 aXRjaDsJCS8qIG1pbiB0aW1lIGJldHdlZW4gcmF0ZSBjaGFuZ2VzICovCisJaW50CXNhbXBsZV9t aW5fZ29vZF9wY3Q7CS8qIG1pbiBnb29kIHBlcmNlbnRhZ2UgZm9yIGEgcmF0ZSB0byBiZSBjb25z aWRlcmVkICovCit9OworCitzdHJ1Y3QgcmF0ZV9zdGF0cyB7CQorCXVuc2lnbmVkIGF2ZXJhZ2Vf dHhfdGltZTsKKwlpbnQgc3VjY2Vzc2l2ZV9mYWlsdXJlczsKKwl1aW50NjRfdCB0cmllczsKKwl1 aW50NjRfdCB0b3RhbF9wYWNrZXRzOwkvKiBwa3RzIHRvdGFsIHNpbmNlIGFzc29jICovCisJdWlu dDY0X3QgcGFja2V0c19hY2tlZDsJLyogcGt0cyBhY2tlZCBzaW5jZSBhc3NvYyAqLworCWludCBl d21hX3BjdDsJLyogRVdNQSBwZXJjZW50YWdlICovCisJdW5zaWduZWQgcGVyZmVjdF90eF90aW1l OyAvKiB0cmFuc21pdCB0aW1lIGZvciAwIHJldHJpZXMgKi8KKwlpbnQgbGFzdF90eDsKK307CisK K3N0cnVjdCB0eHNjaGVkdWxlIHsKKwl1aW50OF90CXQwLCByMDsJCS8qIHNlcmllcyAwOiB0cmll cywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0MSwgcjE7CQkvKiBzZXJpZXMgMTogdHJpZXMsIHJh dGUgY29kZSAqLworCXVpbnQ4X3QJdDIsIHIyOwkJLyogc2VyaWVzIDI6IHRyaWVzLCByYXRlIGNv ZGUgKi8KKwl1aW50OF90CXQzLCByMzsJCS8qIHNlcmllcyAzOiB0cmllcywgcmF0ZSBjb2RlICov Cit9OworCisvKgorICogUmF0ZSBjb250cm9sIHN0YXRlIGZvciBhIGdpdmVuIG5vZGUuCisgKi8K Ky8qIFhYWCBjaGFuZ2UgbmFtaW5nIGNvbnZlcnNpb24/ICovCitzdHJ1Y3QgaWVlZTgwMjExX3Nh bXBsZV9ub2RlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGxfbm9kZSBzYW5fbm9kZTsJLyog Y29tbW9uIHN0YXRlICovCisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbl9zYW1wbGU7Lyog YmFja3BvaW50ZXIgKi8KKwlpbnQgc3RhdGljX3JpeDsJCQkvKiByYXRlIGluZGV4IG9mIGZpeGVk IHR4IHJhdGUgKi8KKwl1aW50NjRfdCByYXRlbWFzazsJCS8qIGJpdCBtYXNrIG9mIHZhbGlkIHJh dGUgaW5kaWNlcyAqLworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZDsJLyogdHggc2No ZWR1bGUgdGFibGUgKi8KKworCXN0cnVjdCByYXRlX3N0YXRzIHN0YXRzW05VTV9QQUNLRVRfU0la RV9CSU5TXVtTQU1QTEVfTUFYUkFURVNdOworCWludCBsYXN0X3NhbXBsZV9yaXhbTlVNX1BBQ0tF VF9TSVpFX0JJTlNdOworCisJaW50IGN1cnJlbnRfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVf QklOU107ICAgICAgIAorCWludCBwYWNrZXRzX3NlbnRbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOwor CisJaW50IGN1cnJlbnRfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKwlpbnQgcGFja2V0c19z aW5jZV9zd2l0Y2hbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCXVuc2lnbmVkIHRpY2tzX3NpbmNl X3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgcGFja2V0c19zaW5jZV9zYW1w bGVbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCXVuc2lnbmVkIHNhbXBsZV90dFtOVU1fUEFDS0VU X1NJWkVfQklOU107Cit9OworCisjZGVmaW5lCUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeCkJKCgo c2FuKS0+cmF0ZW1hc2sgJiAoMTw8KHJpeCkpKSAhPSAwKQorCisjaWZuZGVmIE1JTgorI2RlZmlu ZQlNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1BWAor I2RlZmluZQlNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK3N0YXRp YyBjb25zdCBpbnQgcGFja2V0X3NpemVfYmluc1tOVU1fUEFDS0VUX1NJWkVfQklOU10gID0geyAy NTAsIDE2MDAgfTsKKworc3RhdGljIGlubGluZSBpbnQKK2Jpbl90b19zaXplKGludCBpbmRleCkK K3sKKwlyZXR1cm4gcGFja2V0X3NpemVfYmluc1tpbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUg aW50CitzaXplX3RvX2JpbihpbnQgc2l6ZSkgCit7CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMg PiAxCisJaWYgKHNpemUgPD0gcGFja2V0X3NpemVfYmluc1swXSkKKwkJcmV0dXJuIDA7CisjZW5k aWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+IDIKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6 ZV9iaW5zWzFdKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5T ID4gMworCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMl0pCisJCXJldHVybiAyOworI2Vu ZGlmCisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiA0CisjZXJyb3IgImFkZCBzdXBwb3J0IGZv ciBtb3JlIHBhY2tldCBzaXplcyIKKyNlbmRpZgorCXJldHVybiBOVU1fUEFDS0VUX1NJWkVfQklO Uy0xOworfQorCitzdGF0aWMgdWludDMyX3Qgc2FtcGxlX3BrdF90eHRpbWUoY29uc3Qgc3RydWN0 IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwKKwl1aW50MzJfdCBmcmFtZUxlbiwgdWludDE2X3Qg cmF0ZWl4LCBpbnQgaXNodDQwLCBpbnQgaXNTaG9ydFByZWFtYmxlKQoreworCXVpbnQ4X3QgcmM7 CisgICAgaW50IG51bVN0cmVhbXM7CisKKyAgICByYyA9IHJ0LT5pbmZvW3JhdGVpeF0ucmF0ZUNv ZGU7CisKKyAgICAvKiBMZWdhY3kgcmF0ZT8gUmV0dXJuIHRoZSBvbGQgd2F5ICovCisgICAgaWYg KCEgSVNfSFRfUkFURShyYykpCisgICAgCXJldHVybiBpZWVlODAyMTFfY29tcHV0ZV9kdXJhdGlv bihydCwgZnJhbWVMZW4sIHJhdGVpeCwgaXNTaG9ydFByZWFtYmxlKTsKKworICAgIC8qIDExbiBm cmFtZSAtIGV4dHJhY3Qgb3V0IHRoZSBudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zICovCisgICAg bnVtU3RyZWFtcyA9IEhUX1JDXzJfU1RSRUFNUyhyYyk7CisgICAgS0FTU0VSVChudW1TdHJlYW1z ID4gMCAmJiBudW1TdHJlYW1zIDw9IDQsCisgICAgICAgICgibnVtYmVyIG9mIHNwYXRpYWwgc3Ry ZWFtcyBuZWVkcyB0byBiZSAxLi4zOiBNQ1MgcmF0ZSAweCV4ISIsCisgICAgICAgIHJhdGVpeCkp OworCisgICAgcmV0dXJuIGllZWU4MDIxMV9jb21wdXRlX2R1cmF0aW9uX2h0KGZyYW1lTGVuLCBy YywgbnVtU3RyZWFtcywgaXNodDQwLCBpc1Nob3J0UHJlYW1ibGUpOworfQorCisjZGVmaW5lIFdJ RklfQ1dfTUlOIDMxCisjZGVmaW5lIFdJRklfQ1dfTUFYIDEwMjMKKworLyoKKyAqIENhbGN1bGF0 ZSB0aGUgdHJhbnNtaXQgZHVyYXRpb24gb2YgYSBmcmFtZS4KKyAqLworc3RhdGljIHVuc2lnbmVk IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw LAorCQkJCWludCBsZW5ndGgsCisJCQkJaW50IHJpeCwgaW50IHNob3J0X3JldHJpZXMsCisJCQkJ aW50IGxvbmdfcmV0cmllcywgaW50IGlzX2h0NDApCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIx MV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmlj X2N1cmNoYW4pOworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gdmFwLT5pdl9pYzsKKwlpbnQg Y3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJ CisJdW5zaWduZWQgdF9zbG90LCB0X2RpZnMsIHRfc2lmczsgCisJaW50IHJ0cywgY3RzOworCWlu dCB0dCwgeCwgY3csIGNpeDsKKworCWludCB0dCA9IDA7CisJaW50IHggPSAwOworCWludCBjdyA9 IFdJRklfQ1dfTUlOOworCisJS0FTU0VSVChydCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1v ZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlpZiAocml4ID49IHJ0LT5yYXRlQ291bnQpIHsKKwkJcHJp bnRmKCJib2d1cyByaXggJWQsIG1heCAldSwgbW9kZSAldVxuIiwKKwkJICAgICAgIHJpeCwgcnQt PnJhdGVDb3VudCwgY3VybW9kZSk7CisJCXJldHVybiAwOworCX0KKwljaXggPSBydC0+aW5mb1ty aXhdLmNvbnRyb2xSYXRlOworCS8qIAorCSAqIFhYWCBnZXR0aW5nIG1hYy9waHkgbGV2ZWwgdGlt aW5ncyBzaG91bGQgYmUgZml4ZWQgZm9yIHR1cmJvCisJICogcmF0ZXMsIGFuZCB0aGVyZSBpcyBw cm9iYWJseSBhIHdheSB0byBnZXQgdGhpcyBmcm9tIHRoZQorCSAqIGhhbC4uLgorCSAqLworCXN3 aXRjaCAocnQtPmluZm9bcml4XS5waHkpIHsKKwljYXNlIElFRUU4MDIxMV9UX09GRE06CisJCXRf c2xvdCA9IDk7CisJCXRfc2lmcyA9IDE2OworCQl0X2RpZnMgPSAyODsKKwkJLyogZmFsbCB0aHJv dWdoICovCisJY2FzZSBJRUVFODAyMTFfVF9UVVJCTzoKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZz ID0gODsKKwkJdF9kaWZzID0gMjg7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1RfSFQ6CisJ CXRfc2xvdCA9IDk7CisJCXRfc2lmcyA9IDg7CisJCXRfZGlmcyA9IDI4OworCQlicmVhazsKKwlj YXNlIElFRUU4MDIxMV9UX0RTOgorCQkvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCAqLworCWRl ZmF1bHQ6CisJCS8qIHBnIDIwNSBpZWVlLjgwMi4xMS5wZGYgKi8KKwkJdF9zbG90ID0gMjA7CisJ CXRfZGlmcyA9IDUwOworCQl0X3NpZnMgPSAxMDsKKwl9CisKKwlydHMgPSBjdHMgPSAwOworCisJ aWYgKChpYy0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfRl9VU0VQUk9UKSAmJgorCSAgICBydC0+aW5m b1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9PRkRNKSB7CisJCWlmIChpYy0+aWNfcHJvdG1vZGUg PT0gSUVFRTgwMjExX1BST1RfUlRTQ1RTKQorCQkJcnRzID0gMTsKKwkJZWxzZSBpZiAoaWMtPmlj X3Byb3Rtb2RlID09IElFRUU4MDIxMV9QUk9UX0NUU09OTFkpCisJCQljdHMgPSAxOworCisJCWlu dCBwcm90cml4OworICAgIAlpZiAoY3VybW9kZSA9PSBJRUVFODAyMTFfTU9ERV8xMUcpCisgICAg CSAgICBwcm90cml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFsyKjJdOworICAgIAllbHNlIAorICAg IAkgICAgcHJvdHJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbMioxXTsKKyAgICAJaWYgKDB4ZmYg PT0gcHJvdHJpeCkKKyAgICAJCXByb3RyaXggPSAwOworCisJCWNpeCA9IHJ0LT5pbmZvW3Byb3Ry aXhdLmNvbnRyb2xSYXRlOworCX0KKworCWlmICgwIC8qbGVuZ3RoID4gaWMtPmljX3J0c3RocmVz aG9sZCAqLykgeworCQlydHMgPSAxOworCX0KKworCWlmIChydHMgfHwgY3RzKSB7CisJCWludCBj dHNyYXRlOworCQlpbnQgY3RzZHVyYXRpb24gPSAwOworCisJCS8qIE5COiB0aGlzIGlzIGludGVu dGlvbmFsbHkgbm90IGEgcnVudGltZSBjaGVjayAqLworCQlLQVNTRVJUKGNpeCA8IHJ0LT5yYXRl Q291bnQsCisJCSAgICAoImJvZ3VzIGNpeCAlZCwgbWF4ICV1LCBtb2RlICV1XG4iLCBjaXgsIHJ0 LT5yYXRlQ291bnQsCisJCSAgICAgY3VybW9kZSkpOworCisJCWN0c3JhdGUgPSBydC0+aW5mb1tj aXhdLnJhdGVDb2RlIHwgcnQtPmluZm9bY2l4XS5zaG9ydFByZWFtYmxlOworCQlpZiAocnRzKQkJ LyogU0lGUyArIENUUyAqLworCQkJY3RzZHVyYXRpb24gKz0gcnQtPmluZm9bY2l4XS5zcEFja0R1 cmF0aW9uOworCisJCS8qIFhYWCBhc3N1bWVzIHNob3J0IHByZWFtYmxlICovCisJCWN0c2R1cmF0 aW9uICs9IHNhbXBsZV9wa3RfdHh0aW1lKHJ0LCBsZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisK KwkJaWYgKGN0cykJLyogU0lGUyArIEFDSyAqLworCQkJY3RzZHVyYXRpb24gKz0gcnQtPmluZm9b Y2l4XS5zcEFja0R1cmF0aW9uOworCisJCXR0ICs9IChzaG9ydF9yZXRyaWVzICsgMSkgKiBjdHNk dXJhdGlvbjsKKwl9CisJdHQgKz0gdF9kaWZzOworCisJLyogWFhYIGFzc3VtZXMgc2hvcnQgcHJl YW1ibGUgKi8KKwl0dCArPSAobG9uZ19yZXRyaWVzKzEpKnNhbXBsZV9wa3RfdHh0aW1lKHJ0LCBs ZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisKKwl0dCArPSAobG9uZ19yZXRyaWVzKzEpKih0X3Np ZnMgKyBydC0+aW5mb1tyaXhdLnNwQWNrRHVyYXRpb24pOworCisJZm9yICh4ID0gMDsgeCA8PSBz aG9ydF9yZXRyaWVzICsgbG9uZ19yZXRyaWVzOyB4KyspIHsKKwkJY3cgPSBNSU4oV0lGSV9DV19N QVgsIChjdyArIDEpICogMik7CisJCXR0ICs9ICh0X3Nsb3QgKiBjdy8yKTsKKwl9CisJcmV0dXJu IHR0OworfQorCisjZW5kaWYgLyogX05FVDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9I XyAqLwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZV90eHNjaGVkLmgKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9u IDApCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlX3R4c2NoZWQuaAkocmV2aXNpb24g MjU1OTcwKQpAQCAtMCwwICsxLDI0MSBAQAorLyogJEZyZWVCU0Q6IGhlYWQvc3lzL2Rldi9hdGgv YXRoX3JhdGUvc2FtcGxlL3R4X3NjaGVkdWxlcy5oIDI0MDM4NCAyMDEyLTA4LTE1IDA3OjUwOjQy WiBhZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4gQmlja2V0Cisg KiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+Cisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZp Y2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k dWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FS UkFOVFkiIGRpc2NsYWltZXIgYmVsb3cgKCJEaXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVk aXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50 aWFsbHkKKyAqICAgIHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBi aW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJv dmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBj b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl cml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1h eSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUK KyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09G VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP UlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg T0YgTk9OSU5GUklOR0VNRU5ULCBNRVJDSEFOVElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAq IFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVD SUFMLCBFWEVNUExBUlksCisgKiBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ TElUWSwgV0hFVEhFUgorICogSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICovCisjaWZuZGVmCV9fQVRI X1JBVEVfU0FNUExFX1RYU0NIRURVTEVTX0hfXworI2RlZmluZQlfX0FUSF9SQVRFX1NBTVBMRV9U WFNDSEVEVUxFU19IX18KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjZGVmaW5lIEEoX3Ip IFwKKyAgICAoKChfcikgPT0gNikgICA/IDAgOiAoKChfcikgPT0gOSkgICA/IDEgOiAoKChfcikg PT0gMTIpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDE4KSAgPyAzIDogKCgoX3IpID09IDI0KSAg PyA0IDogKCgoX3IpID09IDM2KSAgPyA1IDogXAorICAgICgoKF9yKSA9PSA0OCkgID8gNiA6ICgo KF9yKSA9PSA1NCkgID8gNyA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVk dWxlIHNlcmllc18xMWFbXSA9IHsKKwl7IDMsQSggNiksIDMsQSggIDYpLCAwLEEoICA2KSwgMCxB KCA2KSB9LAkvKiAgIDZNYi9zICovCisJeyA0LEEoIDkpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAs QSggNikgfSwJLyogICA5TWIvcyAqLworCXsgNCxBKDEyKSwgMyxBKCAgNiksIDQsQSggIDYpLCAw LEEoIDYpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQsQSgxOCksIDMsQSggMTIpLCA0LEEoICA2KSwg MixBKCA2KSB9LAkvKiAgMThNYi9zICovCisJeyA0LEEoMjQpLCAzLEEoIDE4KSwgNCxBKCAxMiks IDIsQSggNikgfSwJLyogIDI0TWIvcyAqLworCXsgNCxBKDM2KSwgMyxBKCAyNCksIDQsQSggMTgp LCAyLEEoIDYpIH0sCS8qICAzNk1iL3MgKi8KKwl7IDQsQSg0OCksIDMsQSggMzYpLCA0LEEoIDI0 KSwgMixBKDEyKSB9LAkvKiAgNDhNYi9zICovCisJeyA0LEEoNTQpLCAzLEEoIDQ4KSwgNCxBKCAz NiksIDIsQSgyNCkgfQkvKiAgNTRNYi9zICovCit9OworCisjZGVmaW5lIE5BMShfcikgXAorCSgo KF9yKSA9PSA2LjUpICA/IDggOiAoKChfcikgPT0gMTMpICA/ICA5IDogKCgoX3IpID09IDE5LjUp PyAxMCA6IFwKKwkoKChfcikgPT0gMjYpICA/IDExIDogKCgoX3IpID09IDM5KSAgPyAxMiA6ICgo KF9yKSA9PSA1MikgID8gMTMgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxNCA6ICgoKF9yKSA9PSA2 NSkgID8gMTUgOiAwKSkpKSkpKSkKKyNkZWZpbmUgTkEyKF9yKSBcCisJKCgoX3IpID09IDEzKSA/ IDE2IDogKCgoX3IpID09IDI2KSA/IDE3IDogKCgoX3IpID09IDM5KSA/IDE4IDogXAorCSgoKF9y KSA9PSA1MikgPyAxOSA6ICgoKF9yKSA9PSA3OCkgPyAyMCA6ICgoKF9yKSA9PSAxMDQpPyAyMSA6 IFwKKwkoKChfcikgPT0gMTE3KT8gMjIgOiAoKChfcikgPT0gMTMwKT8gMjMgOiAwKSkpKSkpKSkK KyNkZWZpbmUgTkEzKF9yKSBcCisJKCgoX3IpID09IDE5LjUpICA/IDI0IDogKCgoX3IpID09IDM5 KSA/IDI1IDogKCgoX3IpID09IDU4LjUpICA/IDI2IDogXAorCSgoKF9yKSA9PSA3OCkgID8gMjcg OiAoKChfcikgPT0gMTE3KSA/IDI4IDogKCgoX3IpID09IDE1NikgPyAyOSA6IFwKKwkoKChfcikg PT0gMTc1LjUpID8gMzAgOiAoKChfcikgPT0gMTk1KT8gMzEgOiAwKSkpKSkpKSkKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuYVtdID0geworCXsgMyxBKCA2KSwgMyxB KCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgNk1iL3MgKi8KKwl7IDQsQSgg OSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgIDlNYi9zICovCisJ eyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwgICAgICAgLyogIDEyTWIv cyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sICAgICAgIC8q ICAxOE1iL3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2KSB9LCAg ICAgICAvKiAgMjRNYi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCksIDIsQSgg NikgfSwgICAgICAgLyogIDM2TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQsQSggMjQp LCAyLEEoMTIpIH0sICAgICAgIC8qICA0OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSggNDgpLCA0 LEEoIDM2KSwgMixBKDI0KSB9LCAgICAgICAvKiAgNTRNYi9zICovCisKKwkvKiAxIHN0cmVhbSBy YXRlcyAqLworCisJeyAzLE5BMSggNi41KSwgMyxOQTEoIDYuNSksIDAsTkExKCA2LjUpLCAwLE5B MSg2LjUpIH0sICAvKiA2LjVNYi9zICovCisJeyA0LE5BMSggIDEzKSwgMyxOQTEoIDYuNSksIDQs TkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKiAgMTNNYi9zICovCisJeyA0LE5BMSgxOS41KSwg MyxOQTEoIDYuNSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKjE5LjVNYi9zICovCisJ eyA0LE5BMSggIDI2KSwgMyxOQTEoMTkuNSksIDQsTkExKCA2LjUpLCAyLE5BMSg2LjUpIH0sICAv KiAgMjZNYi9zICovCisJeyA0LE5BMSggIDM5KSwgMyxOQTEoICAyNiksIDQsTkExKDE5LjUpLCAy LE5BMSg2LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMSggIDUyKSwgMyxOQTEoICAzOSks IDQsTkExKCAgMjYpLCAyLE5BMSg2LjUpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMSg1OC41 KSwgMyxOQTEoICA1MiksIDQsTkExKCAgMzkpLCAyLE5BMSggMTMpIH0sICAvKjU4LjVNYi9zICov CisJeyA0LE5BMSggIDY1KSwgMyxOQTEoNTguNSksIDQsTkExKCAgNTIpLCAyLE5BMSggMTMpIH0s ICAvKiAgNjVNYi9zICovCisKKwkvKiAyIHN0cmVhbSByYXRlcyAqLworCisJeyAzLE5BMiggIDEz KSwgMyxOQTIoICAxMyksIDAsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0sICAvKiAgMTNNYi9zICov CisJeyA0LE5BMiggIDI2KSwgMyxOQTIoICAxMyksIDQsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0s ICAvKiAgMjZNYi9zICovCisJeyA0LE5BMiggIDM5KSwgMyxOQTIoICAyNiksIDQsTkEyKCAgMTMp LCAyLE5BMiggMTMpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMiggIDUyKSwgMyxOQTIoICAz OSksIDQsTkEyKCAgMjYpLCAyLE5BMiggMTMpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMigg IDc4KSwgMyxOQTIoICA1MiksIDQsTkEyKCAgMzkpLCAyLE5BMiggMTMpIH0sICAvKiAgNzhNYi9z ICovCisJeyA0LE5BMiggMTA0KSwgMyxOQTIoICA3OCksIDQsTkEyKCAgNTIpLCAyLE5BMiggMTMp IH0sICAvKiAxMDRNYi9zICovCisJeyA0LE5BMiggMTE3KSwgMyxOQTIoIDEwNCksIDQsTkEyKCAg NzgpLCAyLE5BMiggMjYpIH0sICAvKiAxMTdNYi9zICovCisJeyA0LE5BMiggMTMwKSwgMyxOQTIo IDExNyksIDQsTkEyKCAxMDQpLCAyLE5BMiggMjYpIH0sICAgLyogMTMwTWIvcyAqLworCisJLyog MyBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxOQTMoMTkuNSksIDMsTkEzKDE5LjUpLCAwLE5BMygx OS41KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkEzKCAgMzkpLCAzLE5B MygxOS41KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyAz LE5BMyg1OC41KSwgMyxOQTMoICAzOSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9LCAgLyog IDU4TWIvcyAqLworCXsgMyxOQTMoICA3OCksIDMsTkEzKDU4LjUpLCAwLE5BMyggIDM5KSwgMCxO QTMoMTkuNSkgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDMsTkEzKCAxMTcpLCAzLE5BMyggIDc4KSwg MCxOQTMoNTguNSksIDAsTkEzKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5BMyggMTU2 KSwgMyxOQTMoIDExNyksIDAsTkEzKCAgNzgpLCAwLE5BMygxOS41KSB9LCAgLyogIDE1Nk1iL3Mg Ki8KKwl7IDMsTkEzKDE3NS41KSwgMyxOQTMoIDE1NiksIDAsTkEzKCAxMTcpLCAwLE5BMyggIDM5 KSB9LCAgLyogIDE3NU1iL3MgKi8KKwl7IDMsTkEzKCAxOTUpLCAzLE5BMyggMTk1KSwgMCxOQTMo IDE1NiksIDAsTkEzKDU4LjUpIH0sICAvKiAxOTVNYi9zICovCit9OworI3VuZGVmIEEKKyN1bmRl ZiBOQTMKKyN1bmRlZiBOQTIKKyN1bmRlZiBOQTEKKworI2RlZmluZSBHKF9yKSBcCisgICAgKCgo X3IpID09IDEpICAgPyAwIDogKCgoX3IpID09IDIpICAgPyAxIDogKCgoX3IpID09IDUuNSkgPyAy IDogXAorICAgICgoKF9yKSA9PSAxMSkgID8gMyA6ICgoKF9yKSA9PSA2KSAgID8gNCA6ICgoKF9y KSA9PSA5KSAgID8gNSA6IFwKKyAgICAoKChfcikgPT0gMTIpICA/IDYgOiAoKChfcikgPT0gMTgp ICA/IDcgOiAoKChfcikgPT0gMjQpICA/IDggOiBcCisgICAgKCgoX3IpID09IDM2KSAgPyA5IDog KCgoX3IpID09IDQ4KSAgPyAxMCA6ICgoKF9yKSA9PSA1NCkgID8gMTEgOiAwKSkpKSkpKSkpKSkp CitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExZ1tdID0geworCXsgMyxH KCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMU1iL3MgKi8KKwl7IDQs RyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LAkvKiAgIDJNYi9zICovCisJeyA0 LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkgfSwJLyogNS41TWIvcyAqLworCXsg NCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAxMU1iL3MgKi8KKwl7 IDQsRyggNiksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LAkvKiAgIDZNYi9zICovCisJ eyA0LEcoIDkpLCAzLEcoICA2KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogICA5TWIvcyAqLwor CXsgNCxHKDEyKSwgMyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sCS8qICAxMk1iL3MgKi8K Kwl7IDQsRygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LAkvKiAgMThNYi9zICov CisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwJLyogIDI0TWIvcyAq LworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sCS8qICAzNk1iL3Mg Ki8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9LAkvKiAgNDhNYi9z ICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIsRyggMSkgfQkvKiAgNTRNYi9z ICovCit9OworCisjZGVmaW5lIE5HMShfcikgXAorCSgoKF9yKSA9PSA2LjUpID8gMTIgOiAoKChf cikgPT0gMTMpID8gMTMgOiAoKChfcikgPT0gMTkuNSk/IDE0IDogXAorCSgoKF9yKSA9PSAyNikg ID8gMTUgOiAoKChfcikgPT0gMzkpID8gMTYgOiAoKChfcikgPT0gNTIpICA/IDE3IDogXAorCSgo KF9yKSA9PSA1OC41KT8gMTggOiAoKChfcikgPT0gNjUpID8gMTkgOiAwKSkpKSkpKSkKKyNkZWZp bmUgTkcyKF9yKSBcCisJKCgoX3IpID09IDEzKSAgPyAyMCA6ICgoKF9yKSA9PSAyNikgPyAyMSA6 ICgoKF9yKSA9PSAzOSkgID8gMjIgOiBcCisJKCgoX3IpID09IDUyKSAgPyAyMyA6ICgoKF9yKSA9 PSA3OCkgPyAyNCA6ICgoKF9yKSA9PSAxMDQpID8gMjUgOiBcCisJKCgoX3IpID09IDExNykgPyAy NiA6ICgoKF9yKSA9PSAxMzApPyAyNyA6IDApKSkpKSkpKQorI2RlZmluZSBORzMoX3IpIFwKKwko KChfcikgPT0gMTkuNSkgID8gMjggOiAoKChfcikgPT0gMzkpID8gMjkgOiAoKChfcikgPT0gNTgu NSkgID8gMzAgOiBcCisJKCgoX3IpID09IDc4KSAgPyAzMSA6ICgoKF9yKSA9PSAxMTcpID8gMzIg OiAoKChfcikgPT0gMTU2KSA/IDMzIDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzNCA6ICgoKF9y KSA9PSAxOTUpPyAzNSA6IDApKSkpKSkpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1 bGUgc2VyaWVzXzExbmdbXSA9IHsKKwl7IDMsRyggMSksIDMsRyggIDEpLCAwLEcoICAxKSwgMCxH KCAxKSB9LCAgICAgICAvKiAgIDFNYi9zICovCisJeyA0LEcoIDIpLCAzLEcoICAxKSwgNCxHKCAg MSksIDAsRyggMSkgfSwgICAgICAgLyogICAyTWIvcyAqLworCXsgNCxHKDUuNSksMyxHKCAgMiks IDQsRyggIDEpLCAyLEcoIDEpIH0sICAgICAgIC8qIDUuNU1iL3MgKi8KKwl7IDQsRygxMSksIDMs Ryg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMTFNYi9zICovCisJeyA0LEco IDYpLCAzLEcoNS41KSwgNCxHKCAgMiksIDIsRyggMSkgfSwgICAgICAgLyogICA2TWIvcyAqLwor CXsgNCxHKCA5KSwgMyxHKCAgNiksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8qICAgOU1i L3MgKi8KKwl7IDQsRygxMiksIDMsRyggMTEpLCA0LEcoNS41KSwgMixHKCAxKSB9LCAgICAgICAv KiAgMTJNYi9zICovCisJeyA0LEcoMTgpLCAzLEcoIDEyKSwgNCxHKCAxMSksIDIsRyggMSkgfSwg ICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxHKDI0KSwgMyxHKCAxOCksIDQsRyggMTIpLCAyLEco IDEpIH0sICAgICAgIC8qICAyNE1iL3MgKi8KKwl7IDQsRygzNiksIDMsRyggMjQpLCA0LEcoIDE4 KSwgMixHKCAxKSB9LCAgICAgICAvKiAgMzZNYi9zICovCisJeyA0LEcoNDgpLCAzLEcoIDM2KSwg NCxHKCAyNCksIDIsRyggMSkgfSwgICAgICAgLyogIDQ4TWIvcyAqLworCXsgNCxHKDU0KSwgMyxH KCA0OCksIDQsRyggMzYpLCAyLEcoIDEpIH0sICAgICAgIC8qICA1NE1iL3MgKi8KKworCS8qIDEg c3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkcxKCA2LjUpLCAzLE5HMSggNi41KSwgMCxORzEoIDYu NSksIDAsTkcxKDYuNSkgfSwgIC8qIDYuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMTMpLCAzLE5HMSgg Ni41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkcx KDE5LjUpLCAzLE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qMTkuNU1i L3MgKi8KKwl7IDQsTkcxKCAgMjYpLCAzLE5HMSgxOS41KSwgNCxORzEoIDYuNSksIDIsTkcxKDYu NSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcxKCAgMzkpLCAzLE5HMSggIDI2KSwgNCxORzEo MTkuNSksIDIsTkcxKDYuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcxKCAgNTIpLCAzLE5H MSggIDM5KSwgNCxORzEoICAyNiksIDIsTkcxKDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQs TkcxKDU4LjUpLCAzLE5HMSggIDUyKSwgNCxORzEoICAzOSksIDIsTkcxKCAxMykgfSwgIC8qNTgu NU1iL3MgKi8KKwl7IDQsTkcxKCAgNjUpLCAzLE5HMSg1OC41KSwgNCxORzEoICA1MiksIDIsTkcx KCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKworCS8qIDIgc3RyZWFtIHJhdGVzICovCisKKwl7IDMs TkcyKCAgMTMpLCAzLE5HMiggIDEzKSwgMCxORzIoICAxMyksIDAsTkcyKCAxMykgfSwgIC8qICAx M01iL3MgKi8KKwl7IDQsTkcyKCAgMjYpLCAzLE5HMiggIDEzKSwgNCxORzIoICAxMyksIDAsTkcy KCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcyKCAgMzkpLCAzLE5HMiggIDI2KSwgNCxO RzIoICAxMyksIDIsTkcyKCAxMykgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcyKCAgNTIpLCAz LE5HMiggIDM5KSwgNCxORzIoICAyNiksIDIsTkcyKCAxMykgfSwgIC8qICA1Mk1iL3MgKi8KKwl7 IDQsTkcyKCAgNzgpLCAzLE5HMiggIDUyKSwgNCxORzIoICAzOSksIDIsTkcyKCAxMykgfSwgIC8q ICA3OE1iL3MgKi8KKwl7IDQsTkcyKCAxMDQpLCAzLE5HMiggIDc4KSwgNCxORzIoICA1MiksIDIs TkcyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8KKwl7IDQsTkcyKCAxMTcpLCAzLE5HMiggMTA0KSwg NCxORzIoICA3OCksIDIsTkcyKCAyNikgfSwgIC8qIDExN01iL3MgKi8KKwl7IDQsTkcyKCAxMzAp LCAzLE5HMiggMTE3KSwgNCxORzIoIDEwNCksIDIsTkcyKCAyNikgfSwgIC8qIDEzME1iL3MgKi8K KworCS8qIDMgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkczKDE5LjUpLCAzLE5HMygxOS41KSwg MCxORzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMTlNYi9zICovCisJeyAzLE5HMyggIDM5 KSwgMyxORzMoMTkuNSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDM5TWIvcyAq LworCXsgMyxORzMoNTguNSksIDMsTkczKCAgMzkpLCAwLE5HMygxOS41KSwgMCxORzMoMTkuNSkg fSwgIC8qICA1OE1iL3MgKi8KKwl7IDMsTkczKCAgNzgpLCAzLE5HMyg1OC41KSwgMCxORzMoICAz OSksIDAsTkczKDE5LjUpIH0sICAvKiAgNzhNYi9zICovCisJeyAzLE5HMyggMTE3KSwgMyxORzMo ICA3OCksIDAsTkczKDU4LjUpLCAwLE5HMygxOS41KSB9LCAgLyogMTE3TWIvcyAqLworCXsgMyxO RzMoIDE1NiksIDMsTkczKCAxMTcpLCAwLE5HMyggIDc4KSwgMCxORzMoMTkuNSkgfSwgIC8qICAx NTZNYi9zICovCisJeyAzLE5HMygxNzUuNSksIDMsTkczKCAxNTYpLCAwLE5HMyggMTE3KSwgMCxO RzMoICAzOSkgfSwgIC8qICAxNzVNYi9zICovCisJeyAzLE5HMyggMTk1KSwgMyxORzMoIDE5NSks IDAsTkczKCAxNTYpLCAwLE5HMyg1OC41KSB9LCAgLyogMTk1TWIvcyAqLworCit9OworI3VuZGVm IEcKKyN1bmRlZiBORzMKKyN1bmRlZiBORzIKKyN1bmRlZiBORzEKKworI2RlZmluZSBIKF9yKSBc CisgICAgKCgoX3IpID09IDMpICAgPyAwIDogKCgoX3IpID09IDQuNSkgPyAxIDogKCgoX3IpID09 IDYpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDkpICAgPyAzIDogKCgoX3IpID09IDEyKSAgPyA0 IDogKCgoX3IpID09IDE4KSA/IDUgOiBcCisgICAgKCgoX3IpID09IDI0KSAgPyA2IDogKCgoX3Ip ID09IDI3KSAgPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUg c2VyaWVzX2hhbGZbXSA9IHsKKwl7IDMsSCggMyksIDMsSCggIDMpLCAwLEgoICAzKSwgMCxIKCAz KSB9LAkvKiAgIDNNYi9zICovCisJeyA0LEgoNC41KSwzLEgoICAzKSwgNCxIKCAgMyksIDAsSCgg MykgfSwJLyogNC41TWIvcyAqLworCXsgNCxIKCA2KSwgMyxIKCAgMyksIDQsSCggIDMpLCAwLEgo IDMpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsSCggOSksIDMsSCggIDYpLCA0LEgoICAzKSwgMixI KCAzKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEgoMTIpLCAzLEgoICA5KSwgNCxIKCAgNiksIDIs SCggMykgfSwJLyogIDEyTWIvcyAqLworCXsgNCxIKDE4KSwgMyxIKCAxMiksIDQsSCggIDkpLCAy LEgoIDMpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsSCgyNCksIDMsSCggMTgpLCA0LEgoIDEyKSwg MixIKCA2KSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEgoMjcpLCAzLEgoIDI0KSwgNCxIKCAxOCks IDIsSCgxMikgfQkvKiAgMjdNYi9zICovCit9OworI3VuZGVmIEgKKworI2lmZGVmIFEKKyN1bmRl ZiBRCisjZW5kaWYKKyNkZWZpbmUgUShfcikgXAorICAgICgoKF9yKSA9PSAxLjUpID8gMCA6ICgo KF9yKSA9PTIuMjUpID8gMSA6ICgoKF9yKSA9PSAzKSAgPyAyIDogXAorICAgICgoKF9yKSA9PSA0 LjUpID8gMyA6ICgoKF9yKSA9PSAgNikgID8gNCA6ICgoKF9yKSA9PSA5KSAgPyA1IDogXAorICAg ICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxMy41KT8gNyA6IDApKSkpKSkpKQorc3Rh dGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc19xdWFydGVyW10gPSB7CisJeyAzLFEo IDEuNSksMyxRKDEuNSksIDAsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAxLjVNYi9zICovCisJeyA0 LFEoMi4yNSksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKjIuMjVNYi9zICovCisJ eyA0LFEoICAgMyksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAgIDNNYi9zICov CisJeyA0LFEoIDQuNSksMyxRKCAgMyksIDQsUSgxLjUpLCAyLFEoMS41KSB9LAkvKiA0LjVNYi9z ICovCisJeyA0LFEoICAgNiksMyxRKDQuNSksIDQsUSggIDMpLCAyLFEoMS41KSB9LAkvKiAgIDZN Yi9zICovCisJeyA0LFEoICAgOSksMyxRKCAgNiksIDQsUSg0LjUpLCAyLFEoMS41KSB9LAkvKiAg IDlNYi9zICovCisJeyA0LFEoICAxMiksMyxRKCAgOSksIDQsUSggIDYpLCAyLFEoICAzKSB9LAkv KiAgMTJNYi9zICovCisJeyA0LFEoMTMuNSksMyxRKCAxMiksIDQsUSggIDkpLCAyLFEoICA2KSB9 CS8qMTMuNU1iL3MgKi8KK307CisjdW5kZWYgUQorCisjZW5kaWYK --089e013cbc8c39586e04e3fb4374--