From mboxrd@z Thu Jan 1 00:00:00 1970 From: oscar.mateo@intel.com Subject: =?utf-8?q?=5BPATCH_v2_04/11=5D_lib=3A_Move_kms_stuff_?= =?utf-8?q?from_drmtest=2Ec_over_to_igt=5Fkms=2Ec?= Date: Tue, 12 Nov 2013 11:50:38 +0000 Message-ID: <1384257045-15524-5-git-send-email-oscar.mateo@intel.com> References: <1384257045-15524-1-git-send-email-oscar.mateo@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id E2D73FA937 for ; Tue, 12 Nov 2013 02:54:12 -0800 (PST) In-Reply-To: <1384257045-15524-1-git-send-email-oscar.mateo@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogT3NjYXIgTWF0ZW8gPG9zY2FyLm1hdGVvQGludGVsLmNvbT4KClRoaXMgbWFrZXMgY2Fp cm8gZGVwZW5kZW5jaWVzIGVhc2llciB0byBoYW5kbGUuIE90aGVyd2lzZSwgd2UKd291bGQgaGF2 ZSB0byBsaXR0ZXIgZHJtdGVzdCBhbGwgb3ZlciB3aXRoICIjaWZuZGVmIEFORFJPSUQiCgpTaWdu ZWQtb2ZmLWJ5OiBPc2NhciBNYXRlbyA8b3NjYXIubWF0ZW9AaW50ZWwuY29tPgotLS0KIGxpYi9N YWtlZmlsZS5zb3VyY2VzICAgICAgIHwgICAgMiArCiBsaWIvZHJtdGVzdC5jICAgICAgICAgICAg ICB8ICA3MzIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBsaWIv ZHJtdGVzdC5oICAgICAgICAgICAgICB8ICAgNzIgLS0tLS0KIGxpYi9pZ3Rfa21zLmMgICAgICAg ICAgICAgIHwgIDc2NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogbGliL2lndF9rbXMuaCAgICAgICAgICAgICAgfCAgMTAyICsrKysrKwogdGVzdHMva21zX2N1 cnNvcl9jcmMuYyAgICAgfCAgICAxICsKIHRlc3RzL2ttc19mbGlwLmMgICAgICAgICAgIHwgICAg MSArCiB0ZXN0cy9rbXNfcGlwZV9jcmNfYmFzaWMuYyB8ICAgIDEgKwogdGVzdHMva21zX3JlbmRl ci5jICAgICAgICAgfCAgICAxICsKIHRlc3RzL2ttc19zZXRtb2RlLmMgICAgICAgIHwgICAgMSAr CiB0ZXN0cy9wbV9wYzguYyAgICAgICAgICAgICB8ICAgIDEgKwogdGVzdHMvdGVzdGRpc3BsYXku YyAgICAgICAgfCAgICAxICsKIDEyIGZpbGVzIGNoYW5nZWQsIDg3NSBpbnNlcnRpb25zKCspLCA4 MDQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL2lndF9rbXMuYwogY3JlYXRl IG1vZGUgMTAwNjQ0IGxpYi9pZ3Rfa21zLmgKCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuc291 cmNlcyBiL2xpYi9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IGQ3MWY4MzcuLjc4ZTIwMzQgMTAwNjQ0 Ci0tLSBhL2xpYi9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL2xpYi9NYWtlZmlsZS5zb3VyY2VzCkBA IC0zMiw1ICszMiw3IEBAIGxpYmludGVsX3Rvb2xzX2xhX1NPVVJDRVMgPSAJXAogCWludGVsX3Jl Z19tYXAuYwkJXAogCWludGVsX2RwaW8uYwkJXAogCWludGVsX2lvc2YuYwkJXAorCWlndF9rbXMu YyBcCisJaWd0X2ttcy5oIFwKIAkkKE5VTEwpCiAKZGlmZiAtLWdpdCBhL2xpYi9kcm10ZXN0LmMg Yi9saWIvZHJtdGVzdC5jCmluZGV4IGQ4ZmM2MGYuLjM4NDYzZjggMTAwNjQ0Ci0tLSBhL2xpYi9k cm10ZXN0LmMKKysrIGIvbGliL2RybXRlc3QuYwpAQCAtMzUsMTMgKzM1LDEwIEBACiAjaW5jbHVk ZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxwY2lhY2Nlc3Mu aD4KLSNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3Rk bGliLmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNs dWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgImRybV9mb3VyY2MuaCIKIAogI2luY2x1ZGUgImRy bXRlc3QuaCIKICNpbmNsdWRlICJpOTE1X2RybS5oIgpAQCAtMTM3NSw1NTMgKzEzNzIsNiBAQCB2 b2lkIGlndF9jbGVhbnVwX2FwZXJ0dXJlX3RyYXNoZXJzKHZvaWQpCiAJZnJlZSh0cmFzaF9ib3Mp OwogfQogCi0vKiBoZWxwZXJzIHRvIGNyZWF0ZSBuaWNlLWxvb2tpbmcgZnJhbWVidWZmZXJzICov Ci1zdGF0aWMgaW50IGNyZWF0ZV9ib19mb3JfZmIoaW50IGZkLCBpbnQgd2lkdGgsIGludCBoZWln aHQsIGludCBicHAsCi0JCQkgICAgYm9vbCB0aWxlZCwgdWludDMyX3QgKmdlbV9oYW5kbGVfcmV0 LAotCQkJICAgIHVuc2lnbmVkICpzaXplX3JldCwgdW5zaWduZWQgKnN0cmlkZV9yZXQpCi17Ci0J dWludDMyX3QgZ2VtX2hhbmRsZTsKLQlpbnQgc2l6ZTsKLQl1bnNpZ25lZCBzdHJpZGU7Ci0KLQlp ZiAodGlsZWQpIHsKLQkJaW50IHY7Ci0KLQkJLyogUm91bmQgdGhlIHRpbGluZyB1cCB0byB0aGUg bmV4dCBwb3dlci1vZi10d28gYW5kIHRoZQotCQkgKiByZWdpb24gdXAgdG8gdGhlIG5leHQgcG90 IGZlbmNlIHNpemUgc28gdGhhdCB0aGlzIHdvcmtzCi0JCSAqIG9uIGFsbCBnZW5lcmF0aW9ucy4K LQkJICoKLQkJICogVGhpcyBjYW4gc3RpbGwgZmFpbCBpZiB0aGUgZnJhbWVidWZmZXIgaXMgdG9v IGxhcmdlIHRvCi0JCSAqIGJlIHRpbGVkLiBCdXQgdGhlbiB0aGF0IGZhaWx1cmUgaXMgZXhwZWN0 ZWQuCi0JCSAqLwotCi0JCXYgPSB3aWR0aCAqIGJwcCAvIDg7Ci0JCWZvciAoc3RyaWRlID0gNTEy OyBzdHJpZGUgPCB2OyBzdHJpZGUgKj0gMikKLQkJCTsKLQotCQl2ID0gc3RyaWRlICogaGVpZ2h0 OwotCQlmb3IgKHNpemUgPSAxMDI0KjEwMjQ7IHNpemUgPCB2OyBzaXplICo9IDIpCi0JCQk7Ci0J fSBlbHNlIHsKLQkJLyogU2Nhbi1vdXQgaGFzIGEgNjQgYnl0ZSBhbGlnbm1lbnQgcmVzdHJpY3Rp b24gKi8KLQkJc3RyaWRlID0gKHdpZHRoICogKGJwcCAvIDgpICsgNjMpICYgfjYzOwotCQlzaXpl ID0gc3RyaWRlICogaGVpZ2h0OwotCX0KLQotCWdlbV9oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBz aXplKTsKLQotCWlmICh0aWxlZCkKLQkJZ2VtX3NldF90aWxpbmcoZmQsIGdlbV9oYW5kbGUsIEk5 MTVfVElMSU5HX1gsIHN0cmlkZSk7Ci0KLQkqc3RyaWRlX3JldCA9IHN0cmlkZTsKLQkqc2l6ZV9y ZXQgPSBzaXplOwotCSpnZW1faGFuZGxlX3JldCA9IGdlbV9oYW5kbGU7Ci0KLQlyZXR1cm4gMDsK LX0KLQotdm9pZCBrbXN0ZXN0X3BhaW50X2NvbG9yKGNhaXJvX3QgKmNyLCBpbnQgeCwgaW50IHks IGludCB3LCBpbnQgaCwKLQkJCSBkb3VibGUgciwgZG91YmxlIGcsIGRvdWJsZSBiKQotewotCWNh aXJvX3JlY3RhbmdsZShjciwgeCwgeSwgdywgaCk7Ci0JY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3Is IHIsIGcsIGIpOwotCWNhaXJvX2ZpbGwoY3IpOwotfQotCi12b2lkIGttc3Rlc3RfcGFpbnRfY29s b3JfYWxwaGEoY2Fpcm9fdCAqY3IsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAotCQkJICAg ICAgIGRvdWJsZSByLCBkb3VibGUgZywgZG91YmxlIGIsIGRvdWJsZSBhKQotewotCWNhaXJvX3Jl Y3RhbmdsZShjciwgeCwgeSwgdywgaCk7Ci0JY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByLCBn LCBiLCBhKTsKLQljYWlyb19maWxsKGNyKTsKLX0KLQotdm9pZAota21zdGVzdF9wYWludF9jb2xv cl9ncmFkaWVudChjYWlyb190ICpjciwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCi0JCSAg ICAgaW50IHIsIGludCBnLCBpbnQgYikKLXsKLQljYWlyb19wYXR0ZXJuX3QgKnBhdDsKLQotCXBh dCA9IGNhaXJvX3BhdHRlcm5fY3JlYXRlX2xpbmVhcih4LCB5LCB4ICsgdywgeSArIGgpOwotCWNh aXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYShwYXQsIDEsIDAsIDAsIDAsIDEpOwotCWNh aXJvX3BhdHRlcm5fYWRkX2NvbG9yX3N0b3BfcmdiYShwYXQsIDAsIHIsIGcsIGIsIDEpOwotCi0J Y2Fpcm9fcmVjdGFuZ2xlKGNyLCB4LCB5LCB3LCBoKTsKLQljYWlyb19zZXRfc291cmNlKGNyLCBw YXQpOwotCWNhaXJvX2ZpbGwoY3IpOwotCWNhaXJvX3BhdHRlcm5fZGVzdHJveShwYXQpOwotfQot Ci1zdGF0aWMgdm9pZAotcGFpbnRfdGVzdF9wYXR0ZXJucyhjYWlyb190ICpjciwgaW50IHdpZHRo LCBpbnQgaGVpZ2h0KQotewotCWRvdWJsZSBncl9oZWlnaHQsIGdyX3dpZHRoOwotCWludCB4LCB5 OwotCi0JeSA9IGhlaWdodCAqIDAuMTA7Ci0JZ3Jfd2lkdGggPSB3aWR0aCAqIDAuNzU7Ci0JZ3Jf aGVpZ2h0ID0gaGVpZ2h0ICogMC4wODsKLQl4ID0gKHdpZHRoIC8gMikgLSAoZ3Jfd2lkdGggLyAy KTsKLQotCWttc3Rlc3RfcGFpbnRfY29sb3JfZ3JhZGllbnQoY3IsIHgsIHksIGdyX3dpZHRoLCBn cl9oZWlnaHQsIDEsIDAsIDApOwotCi0JeSArPSBncl9oZWlnaHQ7Ci0Ja21zdGVzdF9wYWludF9j b2xvcl9ncmFkaWVudChjciwgeCwgeSwgZ3Jfd2lkdGgsIGdyX2hlaWdodCwgMCwgMSwgMCk7Ci0K LQl5ICs9IGdyX2hlaWdodDsKLQlrbXN0ZXN0X3BhaW50X2NvbG9yX2dyYWRpZW50KGNyLCB4LCB5 LCBncl93aWR0aCwgZ3JfaGVpZ2h0LCAwLCAwLCAxKTsKLQotCXkgKz0gZ3JfaGVpZ2h0OwotCWtt c3Rlc3RfcGFpbnRfY29sb3JfZ3JhZGllbnQoY3IsIHgsIHksIGdyX3dpZHRoLCBncl9oZWlnaHQs IDEsIDEsIDEpOwotfQotCi1pbnQga21zdGVzdF9jYWlyb19wcmludGZfbGluZShjYWlyb190ICpj ciwgZW51bSBrbXN0ZXN0X3RleHRfYWxpZ24gYWxpZ24sCi0JCQkJZG91YmxlIHlzcGFjaW5nLCBj b25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQlkb3VibGUgeCwgeSwgeG9mcywgeW9mczsKLQljYWly b190ZXh0X2V4dGVudHNfdCBleHRlbnRzOwotCWNoYXIgKnRleHQ7Ci0JdmFfbGlzdCBhcDsKLQlp bnQgcmV0OwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JcmV0ID0gdmFzcHJpbnRmKCZ0ZXh0LCBm bXQsIGFwKTsKLQlhc3NlcnQocmV0ID49IDApOwotCXZhX2VuZChhcCk7Ci0KLQljYWlyb190ZXh0 X2V4dGVudHMoY3IsIHRleHQsICZleHRlbnRzKTsKLQotCXhvZnMgPSB5b2ZzID0gMDsKLQlpZiAo YWxpZ24gJiBhbGlnbl9yaWdodCkKLQkJeG9mcyA9IC1leHRlbnRzLndpZHRoOwotCWVsc2UgaWYg KGFsaWduICYgYWxpZ25faGNlbnRlcikKLQkJeG9mcyA9IC1leHRlbnRzLndpZHRoIC8gMjsKLQot CWlmIChhbGlnbiAmIGFsaWduX3RvcCkKLQkJeW9mcyA9IGV4dGVudHMuaGVpZ2h0OwotCWVsc2Ug aWYgKGFsaWduICYgYWxpZ25fdmNlbnRlcikKLQkJeW9mcyA9IGV4dGVudHMuaGVpZ2h0IC8gMjsK LQotCWNhaXJvX2dldF9jdXJyZW50X3BvaW50KGNyLCAmeCwgJnkpOwotCWlmICh4b2ZzIHx8IHlv ZnMpCi0JCWNhaXJvX3JlbF9tb3ZlX3RvKGNyLCB4b2ZzLCB5b2ZzKTsKLQotCWNhaXJvX3RleHRf cGF0aChjciwgdGV4dCk7Ci0JY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDAsIDAsIDApOwotCWNh aXJvX3N0cm9rZV9wcmVzZXJ2ZShjcik7Ci0JY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDEsIDEs IDEpOwotCWNhaXJvX2ZpbGwoY3IpOwotCi0JY2Fpcm9fbW92ZV90byhjciwgeCwgeSArIGV4dGVu dHMuaGVpZ2h0ICsgeXNwYWNpbmcpOwotCi0JZnJlZSh0ZXh0KTsKLQotCXJldHVybiBleHRlbnRz LndpZHRoOwotfQotCi1zdGF0aWMgdm9pZAotcGFpbnRfbWFya2VyKGNhaXJvX3QgKmNyLCBpbnQg eCwgaW50IHkpCi17Ci0JZW51bSBrbXN0ZXN0X3RleHRfYWxpZ24gYWxpZ247Ci0JaW50IHhvZmYs IHlvZmY7Ci0KLQljYWlyb19tb3ZlX3RvKGNyLCB4LCB5IC0gMjApOwotCWNhaXJvX2xpbmVfdG8o Y3IsIHgsIHkgKyAyMCk7Ci0JY2Fpcm9fbW92ZV90byhjciwgeCAtIDIwLCB5KTsKLQljYWlyb19s aW5lX3RvKGNyLCB4ICsgMjAsIHkpOwotCWNhaXJvX25ld19zdWJfcGF0aChjcik7Ci0JY2Fpcm9f YXJjKGNyLCB4LCB5LCAxMCwgMCwgTV9QSSAqIDIpOwotCWNhaXJvX3NldF9saW5lX3dpZHRoKGNy LCA0KTsKLQljYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMCwgMCk7Ci0JY2Fpcm9fc3Ryb2tl X3ByZXNlcnZlKGNyKTsKLQljYWlyb19zZXRfc291cmNlX3JnYihjciwgMSwgMSwgMSk7Ci0JY2Fp cm9fc2V0X2xpbmVfd2lkdGgoY3IsIDIpOwotCWNhaXJvX3N0cm9rZShjcik7Ci0KLQl4b2ZmID0g eCA/IC0yMCA6IDIwOwotCWFsaWduID0geCA/IGFsaWduX3JpZ2h0IDogYWxpZ25fbGVmdDsKLQot CXlvZmYgPSB5ID8gLTIwIDogMjA7Ci0JYWxpZ24gfD0geSA/IGFsaWduX2JvdHRvbSA6IGFsaWdu X3RvcDsKLQotCWNhaXJvX21vdmVfdG8oY3IsIHggKyB4b2ZmLCB5ICsgeW9mZik7Ci0JY2Fpcm9f c2V0X2ZvbnRfc2l6ZShjciwgMTgpOwotCWttc3Rlc3RfY2Fpcm9fcHJpbnRmX2xpbmUoY3IsIGFs aWduLCAwLCAiKCVkLCAlZCkiLCB4LCB5KTsKLX0KLQotdm9pZCBrbXN0ZXN0X3BhaW50X3Rlc3Rf cGF0dGVybihjYWlyb190ICpjciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotCXBhaW50X3Rl c3RfcGF0dGVybnMoY3IsIHdpZHRoLCBoZWlnaHQpOwotCi0JY2Fpcm9fc2V0X2xpbmVfY2FwKGNy LCBDQUlST19MSU5FX0NBUF9TUVVBUkUpOwotCi0JLyogUGFpbnQgY29ybmVyIG1hcmtlcnMgKi8K LQlwYWludF9tYXJrZXIoY3IsIDAsIDApOwotCXBhaW50X21hcmtlcihjciwgd2lkdGgsIDApOwot CXBhaW50X21hcmtlcihjciwgMCwgaGVpZ2h0KTsKLQlwYWludF9tYXJrZXIoY3IsIHdpZHRoLCBo ZWlnaHQpOwotCi0JYXNzZXJ0KCFjYWlyb19zdGF0dXMoY3IpKTsKLX0KLQotdm9pZCBrbXN0ZXN0 X3BhaW50X2ltYWdlKGNhaXJvX3QgKmNyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCSBpbnQg ZHN0X3gsIGludCBkc3RfeSwgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQpCi17Ci0JY2Fp cm9fc3VyZmFjZV90ICppbWFnZTsKLQlpbnQgaW1nX3dpZHRoLCBpbWdfaGVpZ2h0OwotCWRvdWJs ZSBzY2FsZV94LCBzY2FsZV95OwotCi0JaW1hZ2UgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0 ZV9mcm9tX3BuZyhmaWxlbmFtZSk7Ci0JYXNzZXJ0KGNhaXJvX3N1cmZhY2Vfc3RhdHVzKGltYWdl KSA9PSBDQUlST19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlpbWdfd2lkdGggPSBjYWlyb19pbWFnZV9z dXJmYWNlX2dldF93aWR0aChpbWFnZSk7Ci0JaW1nX2hlaWdodCA9IGNhaXJvX2ltYWdlX3N1cmZh Y2VfZ2V0X2hlaWdodChpbWFnZSk7Ci0KLQlzY2FsZV94ID0gKGRvdWJsZSlkc3Rfd2lkdGggLyBp bWdfd2lkdGg7Ci0Jc2NhbGVfeSA9IChkb3VibGUpZHN0X2hlaWdodCAvIGltZ19oZWlnaHQ7Ci0K LQljYWlyb19zYXZlKGNyKTsKLQotCWNhaXJvX3RyYW5zbGF0ZShjciwgZHN0X3gsIGRzdF95KTsK LQljYWlyb19zY2FsZShjciwgc2NhbGVfeCwgc2NhbGVfeSk7Ci0JY2Fpcm9fc2V0X3NvdXJjZV9z dXJmYWNlKGNyLCBpbWFnZSwgMCwgMCk7Ci0JY2Fpcm9fcGFpbnQoY3IpOwotCi0JY2Fpcm9fc3Vy ZmFjZV9kZXN0cm95KGltYWdlKTsKLQotCWNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi0jZGVmaW5l IERGKGRpZCwgY2lkLCBfYnBwLCBfZGVwdGgpCVwKLQl7IERSTV9GT1JNQVRfIyNkaWQsIENBSVJP X0ZPUk1BVF8jI2NpZCwgIyBkaWQsIF9icHAsIF9kZXB0aCB9Ci1zdGF0aWMgc3RydWN0IGZvcm1h dF9kZXNjX3N0cnVjdCB7Ci0JdWludDMyX3QgZHJtX2lkOwotCWNhaXJvX2Zvcm1hdF90IGNhaXJv X2lkOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IGJwcDsKLQlpbnQgZGVwdGg7Ci19IGZvcm1h dF9kZXNjW10gPSB7Ci0JREYoUkdCNTY1LAlSR0IxNl81NjUsCTE2LCAxNiksCi0JREYoUkdCODg4 LAlJTlZBTElELAkyNCwgMjQpLAotCURGKFhSR0I4ODg4LAlSR0IyNCwJCTMyLCAyNCksCi0JREYo WFJHQjIxMDEwMTAsCVJHQjMwLAkJMzIsIDMwKSwKLQlERihBUkdCODg4OCwJQVJHQjMyLAkJMzIs IDMyKSwKLX07Ci0jdW5kZWYgREYKLQotI2RlZmluZSBmb3JfZWFjaF9mb3JtYXQoZikJXAotCWZv ciAoZiA9IGZvcm1hdF9kZXNjOyBmIC0gZm9ybWF0X2Rlc2MgPCBBUlJBWV9TSVpFKGZvcm1hdF9k ZXNjKTsgZisrKQotCi1zdGF0aWMgdWludDMyX3QgYnBwX2RlcHRoX3RvX2RybV9mb3JtYXQoaW50 IGJwcCwgaW50IGRlcHRoKQotewotCXN0cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3QgKmY7Ci0KLQlm b3JfZWFjaF9mb3JtYXQoZikKLQkJaWYgKGYtPmJwcCA9PSBicHAgJiYgZi0+ZGVwdGggPT0gZGVw dGgpCi0JCQlyZXR1cm4gZi0+ZHJtX2lkOwotCi0JYWJvcnQoKTsKLX0KLQotLyogUmV0dXJuIGZi X2lkIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IgKi8KLXVuc2lnbmVkIGludCBrbXN0ZXN0X2NyZWF0 ZV9mYihpbnQgZmQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwKLQkJCSAgICAgICBp bnQgZGVwdGgsIGJvb2wgdGlsZWQsIHN0cnVjdCBrbXN0ZXN0X2ZiICpmYikKLXsKLQltZW1zZXQo ZmIsIDAsIHNpemVvZigqZmIpKTsKLQotCWlmIChjcmVhdGVfYm9fZm9yX2ZiKGZkLCB3aWR0aCwg aGVpZ2h0LCBicHAsIHRpbGVkLCAmZmItPmdlbV9oYW5kbGUsCi0JCQkgICAgICAgJmZiLT5zaXpl LCAmZmItPnN0cmlkZSkgPCAwKQotCQlyZXR1cm4gMDsKLQotCWlmIChkcm1Nb2RlQWRkRkIoZmQs IHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBicHAsIGZiLT5zdHJpZGUsCi0JCQkgICAgICAgZmItPmdl bV9oYW5kbGUsICZmYi0+ZmJfaWQpIDwgMCkgewotCQlnZW1fY2xvc2UoZmQsIGZiLT5nZW1faGFu ZGxlKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmYi0+d2lkdGggPSB3aWR0aDsKLQlmYi0+aGVp Z2h0ID0gaGVpZ2h0OwotCWZiLT50aWxpbmcgPSB0aWxlZDsKLQlmYi0+ZHJtX2Zvcm1hdCA9IGJw cF9kZXB0aF90b19kcm1fZm9ybWF0KGJwcCwgZGVwdGgpOwotCi0JcmV0dXJuIGZiLT5mYl9pZDsK LX0KLQotdWludDMyX3QgZHJtX2Zvcm1hdF90b19icHAodWludDMyX3QgZHJtX2Zvcm1hdCkKLXsK LQlzdHJ1Y3QgZm9ybWF0X2Rlc2Nfc3RydWN0ICpmOwotCi0JZm9yX2VhY2hfZm9ybWF0KGYpCi0J CWlmIChmLT5kcm1faWQgPT0gZHJtX2Zvcm1hdCkKLQkJCXJldHVybiBmLT5icHA7Ci0KLQlhYm9y dCgpOwotfQotCi11bnNpZ25lZCBpbnQga21zdGVzdF9jcmVhdGVfZmIyKGludCBmZCwgaW50IHdp ZHRoLCBpbnQgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsCi0JCQkgICAgICAgIGJvb2wgdGlsZWQs IHN0cnVjdCBrbXN0ZXN0X2ZiICpmYikKLXsKLQl1aW50MzJfdCBoYW5kbGVzWzRdOwotCXVpbnQz Ml90IHBpdGNoZXNbNF07Ci0JdWludDMyX3Qgb2Zmc2V0c1s0XTsKLQl1aW50MzJfdCBmYl9pZDsK LQlpbnQgYnBwOwotCWludCByZXQ7Ci0KLQltZW1zZXQoZmIsIDAsIHNpemVvZigqZmIpKTsKLQot CWJwcCA9IGRybV9mb3JtYXRfdG9fYnBwKGZvcm1hdCk7Ci0JcmV0ID0gY3JlYXRlX2JvX2Zvcl9m YihmZCwgd2lkdGgsIGhlaWdodCwgYnBwLCB0aWxlZCwgJmZiLT5nZW1faGFuZGxlLAotCQkJICAg ICAgJmZiLT5zaXplLCAmZmItPnN0cmlkZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7 Ci0KLQltZW1zZXQoaGFuZGxlcywgMCwgc2l6ZW9mKGhhbmRsZXMpKTsKLQloYW5kbGVzWzBdID0g ZmItPmdlbV9oYW5kbGU7Ci0JbWVtc2V0KHBpdGNoZXMsIDAsIHNpemVvZihwaXRjaGVzKSk7Ci0J cGl0Y2hlc1swXSA9IGZiLT5zdHJpZGU7Ci0JbWVtc2V0KG9mZnNldHMsIDAsIHNpemVvZihvZmZz ZXRzKSk7Ci0JaWYgKGRybU1vZGVBZGRGQjIoZmQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgaGFu ZGxlcywgcGl0Y2hlcywKLQkJCSAgb2Zmc2V0cywgJmZiX2lkLCAwKSA8IDApIHsKLQkJZ2VtX2Ns b3NlKGZkLCBmYi0+Z2VtX2hhbmRsZSk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JZmItPndpZHRo ID0gd2lkdGg7Ci0JZmItPmhlaWdodCA9IGhlaWdodDsKLQlmYi0+dGlsaW5nID0gdGlsZWQ7Ci0J ZmItPmRybV9mb3JtYXQgPSBmb3JtYXQ7Ci0JZmItPmZiX2lkID0gZmJfaWQ7Ci0KLQlyZXR1cm4g ZmJfaWQ7Ci19Ci0KLXN0YXRpYyBjYWlyb19mb3JtYXRfdCBkcm1fZm9ybWF0X3RvX2NhaXJvKHVp bnQzMl90IGRybV9mb3JtYXQpCi17Ci0Jc3RydWN0IGZvcm1hdF9kZXNjX3N0cnVjdCAqZjsKLQot CWZvcl9lYWNoX2Zvcm1hdChmKQotCQlpZiAoZi0+ZHJtX2lkID09IGRybV9mb3JtYXQpCi0JCQly ZXR1cm4gZi0+Y2Fpcm9faWQ7Ci0KLQlhYm9ydCgpOwotfQotCi1zdGF0aWMgY2Fpcm9fc3VyZmFj ZV90ICpjcmVhdGVfaW1hZ2Vfc3VyZmFjZShpbnQgZmQsIHN0cnVjdCBrbXN0ZXN0X2ZiICpmYikK LXsKLQljYWlyb19zdXJmYWNlX3QgKnN1cmZhY2U7Ci0JY2Fpcm9fZm9ybWF0X3QgY2Zvcm1hdDsK LQl2b2lkICpmYl9wdHI7Ci0KLQljZm9ybWF0ID0gZHJtX2Zvcm1hdF90b19jYWlybyhmYi0+ZHJt X2Zvcm1hdCk7Ci0JZmJfcHRyID0gZ2VtX21tYXAoZmQsIGZiLT5nZW1faGFuZGxlLCBmYi0+c2l6 ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Ci0Jc3VyZmFjZSA9IGNhaXJvX2ltYWdlX3N1cmZh Y2VfY3JlYXRlX2Zvcl9kYXRhKCh1bnNpZ25lZCBjaGFyICopZmJfcHRyLAotCQkJCQkJICAgY2Zv cm1hdCwgZmItPndpZHRoLAotCQkJCQkJICAgZmItPmhlaWdodCwgZmItPnN0cmlkZSk7Ci0JYXNz ZXJ0KHN1cmZhY2UpOwotCi0JcmV0dXJuIHN1cmZhY2U7Ci19Ci0KLXN0YXRpYyBjYWlyb190ICpj cmVhdGVfY2Fpcm9fY3R4KGludCBmZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZiKQotewotCWNhaXJv X3QgKmNyOwotCWNhaXJvX3N1cmZhY2VfdCAqc3VyZmFjZTsKLQotCXN1cmZhY2UgPSBjcmVhdGVf aW1hZ2Vfc3VyZmFjZShmZCwgZmIpOwotCWNyID0gY2Fpcm9fY3JlYXRlKHN1cmZhY2UpOwotCWNh aXJvX3N1cmZhY2VfZGVzdHJveShzdXJmYWNlKTsKLQotCXJldHVybiBjcjsKLX0KLQotdm9pZCBr bXN0ZXN0X3dyaXRlX2ZiKGludCBmZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZiLCBjb25zdCBjaGFy ICpmaWxlbmFtZSkKLXsKLQljYWlyb19zdXJmYWNlX3QgKnN1cmZhY2U7Ci0JY2Fpcm9fc3RhdHVz X3Qgc3RhdHVzOwotCi0Jc3VyZmFjZSA9IGNyZWF0ZV9pbWFnZV9zdXJmYWNlKGZkLCBmYik7Ci0J c3RhdHVzID0gY2Fpcm9fc3VyZmFjZV93cml0ZV90b19wbmcoc3VyZmFjZSwgZmlsZW5hbWUpOwot CWFzc2VydChzdGF0dXMgPT0gQ0FJUk9fU1RBVFVTX1NVQ0NFU1MpOwotCWNhaXJvX3N1cmZhY2Vf ZGVzdHJveShzdXJmYWNlKTsKLX0KLQotY2Fpcm9fdCAqa21zdGVzdF9nZXRfY2Fpcm9fY3R4KGlu dCBmZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZiKQotewotCi0JaWYgKCFmYi0+Y2Fpcm9fY3R4KQot CQlmYi0+Y2Fpcm9fY3R4ID0gY3JlYXRlX2NhaXJvX2N0eChmZCwgZmIpOwotCi0JZ2VtX3NldF9k b21haW4oZmQsIGZiLT5nZW1faGFuZGxlLCBJOTE1X0dFTV9ET01BSU5fQ1BVLAotCQkgICAgICAg STkxNV9HRU1fRE9NQUlOX0NQVSk7Ci0KLQlyZXR1cm4gZmItPmNhaXJvX2N0eDsKLX0KLQotdm9p ZCBrbXN0ZXN0X3JlbW92ZV9mYihpbnQgZmQsIHN0cnVjdCBrbXN0ZXN0X2ZiICpmYikKLXsKLQlp ZiAoZmItPmNhaXJvX2N0eCkKLQkJY2Fpcm9fZGVzdHJveShmYi0+Y2Fpcm9fY3R4KTsKLQlkb19v cl9kaWUoZHJtTW9kZVJtRkIoZmQsIGZiLT5mYl9pZCkpOwotCWdlbV9jbG9zZShmZCwgZmItPmdl bV9oYW5kbGUpOwotfQotCi1jb25zdCBjaGFyICprbXN0ZXN0X2Zvcm1hdF9zdHIodWludDMyX3Qg ZHJtX2Zvcm1hdCkKLXsKLQlzdHJ1Y3QgZm9ybWF0X2Rlc2Nfc3RydWN0ICpmOwotCi0JZm9yX2Vh Y2hfZm9ybWF0KGYpCi0JCWlmIChmLT5kcm1faWQgPT0gZHJtX2Zvcm1hdCkKLQkJCXJldHVybiBm LT5uYW1lOwotCi0JcmV0dXJuICJpbnZhbGlkIjsKLX0KLQotY29uc3QgY2hhciAqa21zdGVzdF9w aXBlX3N0cihpbnQgcGlwZSkKLXsKLQljb25zdCBjaGFyICpzdHJbXSA9IHsgIkEiLCAiQiIsICJD IiB9OwotCi0JaWYgKHBpcGUgPiAyKQotCQlyZXR1cm4gImludmFsaWQiOwotCi0JcmV0dXJuIHN0 cltwaXBlXTsKLX0KLQotdm9pZCBrbXN0ZXN0X2dldF9hbGxfZm9ybWF0cyhjb25zdCB1aW50MzJf dCAqKmZvcm1hdHMsIGludCAqZm9ybWF0X2NvdW50KQotewotCXN0YXRpYyB1aW50MzJfdCAqZHJt X2Zvcm1hdHM7Ci0KLQlpZiAoIWRybV9mb3JtYXRzKSB7Ci0JCXN0cnVjdCBmb3JtYXRfZGVzY19z dHJ1Y3QgKmY7Ci0JCXVpbnQzMl90ICpmb3JtYXQ7Ci0KLQkJZHJtX2Zvcm1hdHMgPSBjYWxsb2Mo QVJSQVlfU0laRShmb3JtYXRfZGVzYyksCi0JCQkJICAgICBzaXplb2YoKmRybV9mb3JtYXRzKSk7 Ci0JCWZvcm1hdCA9ICZkcm1fZm9ybWF0c1swXTsKLQkJZm9yX2VhY2hfZm9ybWF0KGYpCi0JCQkq Zm9ybWF0KysgPSBmLT5kcm1faWQ7Ci0JfQotCi0JKmZvcm1hdHMgPSBkcm1fZm9ybWF0czsKLQkq Zm9ybWF0X2NvdW50ID0gQVJSQVlfU0laRShmb3JtYXRfZGVzYyk7Ci19Ci0KLXN0cnVjdCB0eXBl X25hbWUgewotCWludCB0eXBlOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi0jZGVmaW5lIHR5 cGVfbmFtZV9mbihyZXMpIFwKLWNvbnN0IGNoYXIgKiBrbXN0ZXN0XyMjcmVzIyNfc3RyKGludCB0 eXBlKSB7CQlcCi0JdW5zaWduZWQgaW50IGk7CQkJCQlcCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUocmVzIyNfbmFtZXMpOyBpKyspIHsgXAotCQlpZiAocmVzIyNfbmFtZXNbaV0udHlwZSA9 PSB0eXBlKQlcCi0JCQlyZXR1cm4gcmVzIyNfbmFtZXNbaV0ubmFtZTsJXAotCX0JCQkJCQlcCi0J cmV0dXJuICIoaW52YWxpZCkiOwkJCQlcCi19Ci0KLXN0cnVjdCB0eXBlX25hbWUgZW5jb2Rlcl90 eXBlX25hbWVzW10gPSB7Ci0JeyBEUk1fTU9ERV9FTkNPREVSX05PTkUsICJub25lIiB9LAotCXsg RFJNX01PREVfRU5DT0RFUl9EQUMsICJEQUMiIH0sCi0JeyBEUk1fTU9ERV9FTkNPREVSX1RNRFMs ICJUTURTIiB9LAotCXsgRFJNX01PREVfRU5DT0RFUl9MVkRTLCAiTFZEUyIgfSwKLQl7IERSTV9N T0RFX0VOQ09ERVJfVFZEQUMsICJUVkRBQyIgfSwKLX07Ci0KLXR5cGVfbmFtZV9mbihlbmNvZGVy X3R5cGUpCi0KLXN0cnVjdCB0eXBlX25hbWUgY29ubmVjdG9yX3N0YXR1c19uYW1lc1tdID0gewot CXsgRFJNX01PREVfQ09OTkVDVEVELCAiY29ubmVjdGVkIiB9LAotCXsgRFJNX01PREVfRElTQ09O TkVDVEVELCAiZGlzY29ubmVjdGVkIiB9LAotCXsgRFJNX01PREVfVU5LTk9XTkNPTk5FQ1RJT04s ICJ1bmtub3duIiB9LAotfTsKLQotdHlwZV9uYW1lX2ZuKGNvbm5lY3Rvcl9zdGF0dXMpCi0KLXN0 cnVjdCB0eXBlX25hbWUgY29ubmVjdG9yX3R5cGVfbmFtZXNbXSA9IHsKLQl7IERSTV9NT0RFX0NP Tk5FQ1RPUl9Vbmtub3duLCAidW5rbm93biIgfSwKLQl7IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0Es ICJWR0EiIH0sCi0JeyBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSwgIkRWSS1JIiB9LAotCXsgRFJN X01PREVfQ09OTkVDVE9SX0RWSUQsICJEVkktRCIgfSwKLQl7IERSTV9NT0RFX0NPTk5FQ1RPUl9E VklBLCAiRFZJLUEiIH0sCi0JeyBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlLCAiY29tcG9z aXRlIiB9LAotCXsgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTywgInMtdmlkZW8iIH0sCi0JeyBE Uk1fTU9ERV9DT05ORUNUT1JfTFZEUywgIkxWRFMiIH0sCi0JeyBEUk1fTU9ERV9DT05ORUNUT1Jf Q29tcG9uZW50LCAiY29tcG9uZW50IiB9LAotCXsgRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU4s ICI5LXBpbiBESU4iIH0sCi0JeyBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQsICJEUCIg fSwKLQl7IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQSwgIkhETUktQSIgfSwKLQl7IERSTV9NT0RF X0NPTk5FQ1RPUl9IRE1JQiwgIkhETUktQiIgfSwKLQl7IERSTV9NT0RFX0NPTk5FQ1RPUl9UViwg IlRWIiB9LAotCXsgRFJNX01PREVfQ09OTkVDVE9SX2VEUCwgImVEUCIgfSwKLX07Ci0KLXR5cGVf bmFtZV9mbihjb25uZWN0b3JfdHlwZSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVfc3RlcmVv X25hbWUoY29uc3QgZHJtTW9kZU1vZGVJbmZvICptb2RlKQotewotCXN3aXRjaCAobW9kZS0+Zmxh Z3MgJiBEUk1fTU9ERV9GTEFHXzNEX01BU0spIHsKLQljYXNlIERSTV9NT0RFX0ZMQUdfM0RfRlJB TUVfUEFDS0lORzoKLQkJcmV0dXJuICJGUCI7Ci0JY2FzZSBEUk1fTU9ERV9GTEFHXzNEX0ZJRUxE X0FMVEVSTkFUSVZFOgotCQlyZXR1cm4gIkZBIjsKLQljYXNlIERSTV9NT0RFX0ZMQUdfM0RfTElO RV9BTFRFUk5BVElWRToKLQkJcmV0dXJuICJMQSI7Ci0JY2FzZSBEUk1fTU9ERV9GTEFHXzNEX1NJ REVfQllfU0lERV9GVUxMOgotCQlyZXR1cm4gIlNCU0YiOwotCWNhc2UgRFJNX01PREVfRkxBR18z RF9MX0RFUFRIOgotCQlyZXR1cm4gIkxEIjsKLQljYXNlIERSTV9NT0RFX0ZMQUdfM0RfTF9ERVBU SF9HRlhfR0ZYX0RFUFRIOgotCQlyZXR1cm4gIkxER0ZYIjsKLQljYXNlIERSTV9NT0RFX0ZMQUdf M0RfVE9QX0FORF9CT1RUT006Ci0JCXJldHVybiAiVEIiOwotCWNhc2UgRFJNX01PREVfRkxBR18z RF9TSURFX0JZX1NJREVfSEFMRjoKLQkJcmV0dXJuICJTQlNIIjsKLQlkZWZhdWx0OgotCQlyZXR1 cm4gTlVMTDsKLQl9Ci19Ci0KLXZvaWQga21zdGVzdF9kdW1wX21vZGUoZHJtTW9kZU1vZGVJbmZv ICptb2RlKQotewotCWNvbnN0IGNoYXIgKnN0ZXJlbyA9IG1vZGVfc3RlcmVvX25hbWUobW9kZSk7 Ci0KLQlwcmludGYoIiAgJXMgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgMHgleCAweCV4ICVk JXMlcyVzXG4iLAotCSAgICAgICBtb2RlLT5uYW1lLAotCSAgICAgICBtb2RlLT52cmVmcmVzaCwK LQkgICAgICAgbW9kZS0+aGRpc3BsYXksCi0JICAgICAgIG1vZGUtPmhzeW5jX3N0YXJ0LAotCSAg ICAgICBtb2RlLT5oc3luY19lbmQsCi0JICAgICAgIG1vZGUtPmh0b3RhbCwKLQkgICAgICAgbW9k ZS0+dmRpc3BsYXksCi0JICAgICAgIG1vZGUtPnZzeW5jX3N0YXJ0LAotCSAgICAgICBtb2RlLT52 c3luY19lbmQsCi0JICAgICAgIG1vZGUtPnZ0b3RhbCwKLQkgICAgICAgbW9kZS0+ZmxhZ3MsCi0J ICAgICAgIG1vZGUtPnR5cGUsCi0JICAgICAgIG1vZGUtPmNsb2NrLAotCSAgICAgICBzdGVyZW8g PyAiICgzRDoiIDogIiIsCi0JICAgICAgIHN0ZXJlbyA/IHN0ZXJlbyA6ICIiLAotCSAgICAgICBz dGVyZW8gPyAiKSIgOiAiIik7Ci0JZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLWludCBrbXN0ZXN0X2dl dF9waXBlX2Zyb21fY3J0Y19pZChpbnQgZmQsIGludCBjcnRjX2lkKQotewotCXN0cnVjdCBkcm1f aTkxNV9nZXRfcGlwZV9mcm9tX2NydGNfaWQgcGZjaTsKLQlpbnQgcmV0OwotCi0JbWVtc2V0KCZw ZmNpLCAwLCBzaXplb2YocGZjaSkpOwotCXBmY2kuY3J0Y19pZCA9IGNydGNfaWQ7Ci0JcmV0ID0g ZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCwgJnBmY2kp OwotCWlndF9hc3NlcnQocmV0ID09IDApOwotCi0JcmV0dXJuIHBmY2kucGlwZTsKLX0KLQogI2Rl ZmluZSBNQVhfU0lHTkFMUwkJMzIKICNkZWZpbmUgTUFYX0VYSVRfSEFORExFUlMJNQogCkBAIC0y MDc1LDE4OCArMTUyNSw2IEBAIHZvaWQgaWd0X2VuYWJsZV9leGl0X2hhbmRsZXIodm9pZCkKIAll eGl0X2hhbmRsZXJfZGlzYWJsZWQgPSBmYWxzZTsKIH0KIAotc3RhdGljIHNpZ25lZCBsb25nIHNl dF92dF9tb2RlKHVuc2lnbmVkIGxvbmcgbW9kZSkKLXsKLQlpbnQgZmQ7Ci0JdW5zaWduZWQgbG9u ZyBwcmV2X21vZGU7Ci0KLQlmZCA9IG9wZW4oIi9kZXYvdHR5MCIsIE9fUkRPTkxZKTsKLQlpZiAo ZmQgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCi0JcHJldl9tb2RlID0gMDsKLQlpZiAoZHJtSW9j dGwoZmQsIEtER0VUTU9ERSwgJnByZXZfbW9kZSkpCi0JCWdvdG8gZXJyOwotCWlmIChkcm1Jb2N0 bChmZCwgS0RTRVRNT0RFLCAodm9pZCAqKW1vZGUpKQotCQlnb3RvIGVycjsKLQotCWNsb3NlKGZk KTsKLQotCXJldHVybiBwcmV2X21vZGU7Ci1lcnI6Ci0JY2xvc2UoZmQpOwotCi0JcmV0dXJuIC1l cnJubzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3JpZ192dF9tb2RlID0gLTFVTDsKLQot c3RhdGljIHZvaWQgcmVzdG9yZV92dF9tb2RlX2F0X2V4aXQoaW50IHNpZykKLXsKLQlpZiAob3Jp Z192dF9tb2RlICE9IC0xVUwpCi0JCXNldF92dF9tb2RlKG9yaWdfdnRfbW9kZSk7Ci19Ci0KLS8q Ci0gKiBTZXQgdGhlIFZUIHRvIGdyYXBoaWNzIG1vZGUgYW5kIGluc3RhbGwgYW4gZXhpdCBoYW5k bGVyIHRvIHJlc3RvcmUgdGhlCi0gKiBvcmlnaW5hbCBtb2RlLgotICovCi0KLXZvaWQgaWd0X3Nl dF92dF9ncmFwaGljc19tb2RlKHZvaWQpCi17Ci0JaWd0X2luc3RhbGxfZXhpdF9oYW5kbGVyKHJl c3RvcmVfdnRfbW9kZV9hdF9leGl0KTsKLQotCWlndF9kaXNhYmxlX2V4aXRfaGFuZGxlcigpOwot CW9yaWdfdnRfbW9kZSA9IHNldF92dF9tb2RlKEtEX0dSQVBISUNTKTsKLQlpZiAob3JpZ192dF9t b2RlIDwgMCkKLQkJb3JpZ192dF9tb2RlID0gLTFVTDsKLQlpZ3RfZW5hYmxlX2V4aXRfaGFuZGxl cigpOwotCi0JaWd0X2Fzc2VydChvcmlnX3Z0X21vZGUgPj0gMCk7Ci19Ci0KLWludCBrbXN0ZXN0 X2dldF9jb25uZWN0b3JfZGVmYXVsdF9tb2RlKGludCBkcm1fZmQsIGRybU1vZGVDb25uZWN0b3Ig KmNvbm5lY3RvciwKLQkJCQkgICAgICBkcm1Nb2RlTW9kZUluZm8gKm1vZGUpCi17Ci0JZHJtTW9k ZVJlcyAqcmVzb3VyY2VzOwotCWludCBpOwotCi0JcmVzb3VyY2VzID0gZHJtTW9kZUdldFJlc291 cmNlcyhkcm1fZmQpOwotCWlmICghcmVzb3VyY2VzKSB7Ci0JCXBlcnJvcigiZHJtTW9kZUdldFJl c291cmNlcyBmYWlsZWQiKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKCFjb25uZWN0b3It PmNvdW50X21vZGVzKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm8gbW9kZXMgZm9yIGNvbm5lY3Rv ciAlZFxuIiwKLQkJCWNvbm5lY3Rvci0+Y29ubmVjdG9yX2lkKTsKLQkJZHJtTW9kZUZyZWVSZXNv dXJjZXMocmVzb3VyY2VzKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8 IGNvbm5lY3Rvci0+Y291bnRfbW9kZXM7IGkrKykgewotCQlpZiAoaSA9PSAwIHx8Ci0JCSAgICBj b25uZWN0b3ItPm1vZGVzW2ldLnR5cGUgJiBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCkgewotCQkJ Km1vZGUgPSBjb25uZWN0b3ItPm1vZGVzW2ldOwotCQkJaWYgKG1vZGUtPnR5cGUgJiBEUk1fTU9E RV9UWVBFX1BSRUZFUlJFRCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCWRybU1vZGVGcmVlUmVz b3VyY2VzKHJlc291cmNlcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGttc3Rlc3RfZ2V0X2Nv bm5lY3Rvcl9jb25maWcoaW50IGRybV9mZCwgdWludDMyX3QgY29ubmVjdG9yX2lkLAotCQkJCSB1 bnNpZ25lZCBsb25nIGNydGNfaWR4X21hc2ssCi0JCQkJIHN0cnVjdCBrbXN0ZXN0X2Nvbm5lY3Rv cl9jb25maWcgKmNvbmZpZykKLXsKLQlkcm1Nb2RlUmVzICpyZXNvdXJjZXM7Ci0JZHJtTW9kZUNv bm5lY3RvciAqY29ubmVjdG9yOwotCWRybU1vZGVFbmNvZGVyICplbmNvZGVyOwotCWludCBpLCBq OwotCi0JcmVzb3VyY2VzID0gZHJtTW9kZUdldFJlc291cmNlcyhkcm1fZmQpOwotCWlmICghcmVz b3VyY2VzKSB7Ci0JCXBlcnJvcigiZHJtTW9kZUdldFJlc291cmNlcyBmYWlsZWQiKTsKLQkJZ290 byBlcnIxOwotCX0KLQotCS8qIEZpcnN0LCBmaW5kIHRoZSBjb25uZWN0b3IgJiBtb2RlICovCi0J Y29ubmVjdG9yID0gZHJtTW9kZUdldENvbm5lY3Rvcihkcm1fZmQsIGNvbm5lY3Rvcl9pZCk7Ci0J aWYgKCFjb25uZWN0b3IpCi0JCWdvdG8gZXJyMjsKLQotCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rp b24gIT0gRFJNX01PREVfQ09OTkVDVEVEKQotCQlnb3RvIGVycjM7Ci0KLQlpZiAoIWNvbm5lY3Rv ci0+Y291bnRfbW9kZXMpIHsKLQkJZnByaW50ZihzdGRlcnIsICJjb25uZWN0b3IgJWQgaGFzIG5v IG1vZGVzXG4iLCBjb25uZWN0b3JfaWQpOwotCQlnb3RvIGVycjM7Ci0JfQotCi0JaWYgKGNvbm5l Y3Rvci0+Y29ubmVjdG9yX2lkICE9IGNvbm5lY3Rvcl9pZCkgewotCQlmcHJpbnRmKHN0ZGVyciwg ImNvbm5lY3RvciBpZCBkb2Vzbid0IG1hdGNoICglZCAhPSAlZClcbiIsCi0JCQljb25uZWN0b3It PmNvbm5lY3Rvcl9pZCwgY29ubmVjdG9yX2lkKTsKLQkJZ290byBlcnIzOwotCX0KLQotCS8qCi0J ICogRmluZCBnaXZlbiBDUlRDIGlmIGNydGNfaWQgIT0gMCBvciBlbHNlIHRoZSBmaXJzdCBDUlRD IG5vdCBpbiB1c2UuCi0JICogSW4gYm90aCBjYXNlcyBmaW5kIHRoZSBmaXJzdCBjb21wYXRpYmxl IGVuY29kZXIgYW5kIHNraXAgdGhlIENSVEMKLQkgKiBpZiB0aGVyZSBpcyBub24gc3VjaC4KLQkg Ki8KLQllbmNvZGVyID0gTlVMTDsJCS8qIHN1cHByZXNzIEdDQyB3YXJuaW5nICovCi0JZm9yIChp ID0gMDsgaSA8IHJlc291cmNlcy0+Y291bnRfY3J0Y3M7IGkrKykgewotCQlpZiAoIXJlc291cmNl cy0+Y3J0Y3NbaV0gfHwgIShjcnRjX2lkeF9tYXNrICYgKDEgPDwgaSkpKQotCQkJY29udGludWU7 Ci0KLQkJLyogTm93IGdldCBhIGNvbXBhdGlibGUgZW5jb2RlciAqLwotCQlmb3IgKGogPSAwOyBq IDwgY29ubmVjdG9yLT5jb3VudF9lbmNvZGVyczsgaisrKSB7Ci0JCQllbmNvZGVyID0gZHJtTW9k ZUdldEVuY29kZXIoZHJtX2ZkLAotCQkJCQkJICAgIGNvbm5lY3Rvci0+ZW5jb2RlcnNbal0pOwot Ci0JCQlpZiAoIWVuY29kZXIpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBnZXQg ZW5jb2RlciAlZDogJXNcbiIsCi0JCQkJCXJlc291cmNlcy0+ZW5jb2RlcnNbal0sIHN0cmVycm9y KGVycm5vKSk7Ci0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGVuY29kZXItPnBvc3Np YmxlX2NydGNzICYgKDEgPDwgaSkpCi0JCQkJZ290byBmb3VuZDsKLQotCQkJZHJtTW9kZUZyZWVF bmNvZGVyKGVuY29kZXIpOwotCQl9Ci0JfQotCi0JZ290byBlcnIzOwotCi1mb3VuZDoKLQlpZiAo a21zdGVzdF9nZXRfY29ubmVjdG9yX2RlZmF1bHRfbW9kZShkcm1fZmQsIGNvbm5lY3RvciwKLQkJ CQkgICAgICAgJmNvbmZpZy0+ZGVmYXVsdF9tb2RlKSA8IDApCi0JCWdvdG8gZXJyNDsKLQotCWNv bmZpZy0+Y29ubmVjdG9yID0gY29ubmVjdG9yOwotCWNvbmZpZy0+ZW5jb2RlciA9IGVuY29kZXI7 Ci0JY29uZmlnLT5jcnRjID0gZHJtTW9kZUdldENydGMoZHJtX2ZkLCByZXNvdXJjZXMtPmNydGNz W2ldKTsKLQljb25maWctPmNydGNfaWR4ID0gaTsKLQljb25maWctPnBpcGUgPSBrbXN0ZXN0X2dl dF9waXBlX2Zyb21fY3J0Y19pZChkcm1fZmQsCi0JCQkJCQkgICAgIGNvbmZpZy0+Y3J0Yy0+Y3J0 Y19pZCk7Ci0KLQlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXNvdXJjZXMpOwotCi0JcmV0dXJuIDA7 Ci1lcnI0OgotCWRybU1vZGVGcmVlRW5jb2RlcihlbmNvZGVyKTsKLWVycjM6Ci0JZHJtTW9kZUZy ZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKLWVycjI6Ci0JZHJtTW9kZUZyZWVSZXNvdXJjZXMocmVz b3VyY2VzKTsKLWVycjE6Ci0JcmV0dXJuIC0xOwotfQotCi12b2lkIGttc3Rlc3RfZnJlZV9jb25u ZWN0b3JfY29uZmlnKHN0cnVjdCBrbXN0ZXN0X2Nvbm5lY3Rvcl9jb25maWcgKmNvbmZpZykKLXsK LQlkcm1Nb2RlRnJlZUNydGMoY29uZmlnLT5jcnRjKTsKLQlkcm1Nb2RlRnJlZUVuY29kZXIoY29u ZmlnLT5lbmNvZGVyKTsKLQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25maWctPmNvbm5lY3Rvcik7 Ci19Ci0KICNkZWZpbmUgUFJFRkFVTFRfREVCVUdGUyAiL3N5cy9tb2R1bGUvaTkxNS9wYXJhbWV0 ZXJzL3ByZWZhdWx0X2Rpc2FibGUiCiBzdGF0aWMgdm9pZCBpZ3RfcHJlZmF1bHRfY29udHJvbChi b29sIGVuYWJsZSkKIHsKZGlmZiAtLWdpdCBhL2xpYi9kcm10ZXN0LmggYi9saWIvZHJtdGVzdC5o CmluZGV4IGE5ZmQwYmMuLmNlOWQxOGQgMTAwNjQ0Ci0tLSBhL2xpYi9kcm10ZXN0LmgKKysrIGIv bGliL2RybXRlc3QuaApAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2lu Y2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPGNhaXJvLmg+ CiAjaW5jbHVkZSA8c2V0am1wLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KIApAQCAtMzIyLDc3 ICszMjEsNiBAQCB2b2lkIGlndF9pbml0X2FwZXJ0dXJlX3RyYXNoZXJzKGRybV9pbnRlbF9idWZt Z3IgKmJ1Zm1ncik7CiB2b2lkIGlndF90cmFzaF9hcGVydHVyZSh2b2lkKTsKIHZvaWQgaWd0X2Ns ZWFudXBfYXBlcnR1cmVfdHJhc2hlcnModm9pZCk7CiAKLXN0cnVjdCBrbXN0ZXN0X2Nvbm5lY3Rv cl9jb25maWcgewotCWRybU1vZGVDcnRjICpjcnRjOwotCWRybU1vZGVDb25uZWN0b3IgKmNvbm5l Y3RvcjsKLQlkcm1Nb2RlRW5jb2RlciAqZW5jb2RlcjsKLQlkcm1Nb2RlTW9kZUluZm8gZGVmYXVs dF9tb2RlOwotCWludCBjcnRjX2lkeDsKLQlpbnQgcGlwZTsKLX07Ci0KLWludCBrbXN0ZXN0X2dl dF9jb25uZWN0b3JfZGVmYXVsdF9tb2RlKGludCBkcm1fZmQsIGRybU1vZGVDb25uZWN0b3IgKmNv bm5lY3RvciwKLQkJCQkgICAgICBkcm1Nb2RlTW9kZUluZm8gKm1vZGUpOwotaW50IGttc3Rlc3Rf Z2V0X2Nvbm5lY3Rvcl9jb25maWcoaW50IGRybV9mZCwgdWludDMyX3QgY29ubmVjdG9yX2lkLAot CQkJCSB1bnNpZ25lZCBsb25nIGNydGNfaWR4X21hc2ssCi0JCQkJIHN0cnVjdCBrbXN0ZXN0X2Nv bm5lY3Rvcl9jb25maWcgKmNvbmZpZyk7Ci12b2lkIGttc3Rlc3RfZnJlZV9jb25uZWN0b3JfY29u ZmlnKHN0cnVjdCBrbXN0ZXN0X2Nvbm5lY3Rvcl9jb25maWcgKmNvbmZpZyk7Ci0KLS8qIGhlbHBl cnMgdG8gY3JlYXRlIG5pY2UtbG9va2luZyBmcmFtZWJ1ZmZlcnMgKi8KLXN0cnVjdCBrbXN0ZXN0 X2ZiIHsKLQl1aW50MzJfdCBmYl9pZDsKLQl1aW50MzJfdCBnZW1faGFuZGxlOwotCXVpbnQzMl90 IGRybV9mb3JtYXQ7Ci0JaW50IHdpZHRoOwotCWludCBoZWlnaHQ7Ci0JaW50IGRlcHRoOwotCXVu c2lnbmVkIHN0cmlkZTsKLQl1bnNpZ25lZCB0aWxpbmc7Ci0JdW5zaWduZWQgc2l6ZTsKLQljYWly b190ICpjYWlyb19jdHg7Ci19OwotCi1lbnVtIGttc3Rlc3RfdGV4dF9hbGlnbiB7Ci0JYWxpZ25f bGVmdCwKLQlhbGlnbl9ib3R0b20JPSBhbGlnbl9sZWZ0LAotCWFsaWduX3JpZ2h0CT0gMHgwMSwK LQlhbGlnbl90b3AJPSAweDAyLAotCWFsaWduX3ZjZW50ZXIJPSAweDA0LAotCWFsaWduX2hjZW50 ZXIJPSAweDA4LAotfTsKLQotaW50IGttc3Rlc3RfY2Fpcm9fcHJpbnRmX2xpbmUoY2Fpcm9fdCAq Y3IsIGVudW0ga21zdGVzdF90ZXh0X2FsaWduIGFsaWduLAotCQkJICAgICAgIGRvdWJsZSB5c3Bh Y2luZywgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCQkgICAgICAgX19hdHRyaWJ1dGVfXygoZm9y bWF0IChwcmludGYsIDQsIDUpKSk7Ci0KLXVuc2lnbmVkIGludCBrbXN0ZXN0X2NyZWF0ZV9mYihp bnQgZmQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwKLQkJCSAgICAgICBpbnQgZGVw dGgsIGJvb2wgdGlsZWQsCi0JCQkgICAgICAgc3RydWN0IGttc3Rlc3RfZmIgKmZiX2luZm8pOwot dW5zaWduZWQgaW50IGttc3Rlc3RfY3JlYXRlX2ZiMihpbnQgZmQsIGludCB3aWR0aCwgaW50IGhl aWdodCwgdWludDMyX3QgZm9ybWF0LAotCQkJICAgICAgICBib29sIHRpbGVkLCBzdHJ1Y3Qga21z dGVzdF9mYiAqZmIpOwotdm9pZCBrbXN0ZXN0X3JlbW92ZV9mYihpbnQgZmQsIHN0cnVjdCBrbXN0 ZXN0X2ZiICpmYl9pbmZvKTsKLWNhaXJvX3QgKmttc3Rlc3RfZ2V0X2NhaXJvX2N0eChpbnQgZmQs IHN0cnVjdCBrbXN0ZXN0X2ZiICpmYik7Ci12b2lkIGttc3Rlc3RfcGFpbnRfY29sb3IoY2Fpcm9f dCAqY3IsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAotCQkJIGRvdWJsZSByLCBkb3VibGUg ZywgZG91YmxlIGIpOwotdm9pZCBrbXN0ZXN0X3BhaW50X2NvbG9yX2FscGhhKGNhaXJvX3QgKmNy LCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKLQkJCSAgICAgICBkb3VibGUgciwgZG91Ymxl IGcsIGRvdWJsZSBiLCBkb3VibGUgYSk7Ci12b2lkIGttc3Rlc3RfcGFpbnRfY29sb3JfZ3JhZGll bnQoY2Fpcm9fdCAqY3IsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAotCQkJCSAgaW50IHIs IGludCBnLCBpbnQgYik7Ci12b2lkIGttc3Rlc3RfcGFpbnRfdGVzdF9wYXR0ZXJuKGNhaXJvX3Qg KmNyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotdm9pZCBrbXN0ZXN0X3BhaW50X2ltYWdlKGNh aXJvX3QgKmNyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCSBpbnQgZHN0X3gsIGludCBkc3Rf eSwgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQpOwotdm9pZCBrbXN0ZXN0X3dyaXRlX2Zi KGludCBmZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZiLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci12 b2lkIGttc3Rlc3RfZHVtcF9tb2RlKGRybU1vZGVNb2RlSW5mbyAqbW9kZSk7Ci1pbnQga21zdGVz dF9nZXRfcGlwZV9mcm9tX2NydGNfaWQoaW50IGZkLCBpbnQgY3J0Y19pZCk7Ci1jb25zdCBjaGFy ICprbXN0ZXN0X2Zvcm1hdF9zdHIodWludDMyX3QgZHJtX2Zvcm1hdCk7Ci1jb25zdCBjaGFyICpr bXN0ZXN0X3BpcGVfc3RyKGludCBwaXBlKTsKLXZvaWQga21zdGVzdF9nZXRfYWxsX2Zvcm1hdHMo Y29uc3QgdWludDMyX3QgKipmb3JtYXRzLCBpbnQgKmZvcm1hdF9jb3VudCk7Ci1jb25zdCBjaGFy ICprbXN0ZXN0X2VuY29kZXJfdHlwZV9zdHIoaW50IHR5cGUpOwotY29uc3QgY2hhciAqa21zdGVz dF9jb25uZWN0b3Jfc3RhdHVzX3N0cihpbnQgdHlwZSk7Ci1jb25zdCBjaGFyICprbXN0ZXN0X2Nv bm5lY3Rvcl90eXBlX3N0cihpbnQgdHlwZSk7Ci0KLXVpbnQzMl90IGRybV9mb3JtYXRfdG9fYnBw KHVpbnQzMl90IGRybV9mb3JtYXQpOwotCiAjZGVmaW5lIGRvX29yX2RpZSh4KSBpZ3RfYXNzZXJ0 KCh4KSA9PSAwKQogI2RlZmluZSBkb19pb2N0bChmZCwgcHRyLCBzeikgaWd0X2Fzc2VydChkcm1J b2N0bCgoZmQpLCAocHRyKSwgKHN6KSkgPT0gMCkKIApkaWZmIC0tZ2l0IGEvbGliL2lndF9rbXMu YyBiL2xpYi9pZ3Rfa21zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRl ZmVhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9pZ3Rfa21zLmMKQEAgLTAsMCArMSw3NjQgQEAK Ky8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1p c3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9i dGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1l bnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdh cmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICog dGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1 dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBh bmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hl ZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICog VGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGlu Y2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwg Y29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgor ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0Yg QU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlU RUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNI QUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFO WSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFD VElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9V VCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RI RVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0 ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1 ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxsaW51eC9rZC5oPgor I2luY2x1ZGUgImRybV9mb3VyY2MuaCIKKworI2luY2x1ZGUgImRybXRlc3QuaCIKKyNpbmNsdWRl ICJpZ3Rfa21zLmgiCisKKy8qIGhlbHBlcnMgdG8gY3JlYXRlIG5pY2UtbG9va2luZyBmcmFtZWJ1 ZmZlcnMgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX2JvX2Zvcl9mYihpbnQgZmQsIGludCB3aWR0aCwg aW50IGhlaWdodCwgaW50IGJwcCwKKwkJCSAgICBib29sIHRpbGVkLCB1aW50MzJfdCAqZ2VtX2hh bmRsZV9yZXQsCisJCQkgICAgdW5zaWduZWQgKnNpemVfcmV0LCB1bnNpZ25lZCAqc3RyaWRlX3Jl dCkKK3sKKwl1aW50MzJfdCBnZW1faGFuZGxlOworCWludCBzaXplOworCXVuc2lnbmVkIHN0cmlk ZTsKKworCWlmICh0aWxlZCkgeworCQlpbnQgdjsKKworCQkvKiBSb3VuZCB0aGUgdGlsaW5nIHVw IHRvIHRoZSBuZXh0IHBvd2VyLW9mLXR3byBhbmQgdGhlCisJCSAqIHJlZ2lvbiB1cCB0byB0aGUg bmV4dCBwb3QgZmVuY2Ugc2l6ZSBzbyB0aGF0IHRoaXMgd29ya3MKKwkJICogb24gYWxsIGdlbmVy YXRpb25zLgorCQkgKgorCQkgKiBUaGlzIGNhbiBzdGlsbCBmYWlsIGlmIHRoZSBmcmFtZWJ1ZmZl ciBpcyB0b28gbGFyZ2UgdG8KKwkJICogYmUgdGlsZWQuIEJ1dCB0aGVuIHRoYXQgZmFpbHVyZSBp cyBleHBlY3RlZC4KKwkJICovCisKKwkJdiA9IHdpZHRoICogYnBwIC8gODsKKwkJZm9yIChzdHJp ZGUgPSA1MTI7IHN0cmlkZSA8IHY7IHN0cmlkZSAqPSAyKQorCQkJOworCisJCXYgPSBzdHJpZGUg KiBoZWlnaHQ7CisJCWZvciAoc2l6ZSA9IDEwMjQqMTAyNDsgc2l6ZSA8IHY7IHNpemUgKj0gMikK KwkJCTsKKwl9IGVsc2UgeworCQkvKiBTY2FuLW91dCBoYXMgYSA2NCBieXRlIGFsaWdubWVudCBy ZXN0cmljdGlvbiAqLworCQlzdHJpZGUgPSAod2lkdGggKiAoYnBwIC8gOCkgKyA2MykgJiB+NjM7 CisJCXNpemUgPSBzdHJpZGUgKiBoZWlnaHQ7CisJfQorCisJZ2VtX2hhbmRsZSA9IGdlbV9jcmVh dGUoZmQsIHNpemUpOworCisJaWYgKHRpbGVkKQorCQlnZW1fc2V0X3RpbGluZyhmZCwgZ2VtX2hh bmRsZSwgSTkxNV9USUxJTkdfWCwgc3RyaWRlKTsKKworCSpzdHJpZGVfcmV0ID0gc3RyaWRlOwor CSpzaXplX3JldCA9IHNpemU7CisJKmdlbV9oYW5kbGVfcmV0ID0gZ2VtX2hhbmRsZTsKKworCXJl dHVybiAwOworfQorCit2b2lkIGttc3Rlc3RfcGFpbnRfY29sb3IoY2Fpcm9fdCAqY3IsIGludCB4 LCBpbnQgeSwgaW50IHcsIGludCBoLAorCQkJIGRvdWJsZSByLCBkb3VibGUgZywgZG91YmxlIGIp Cit7CisJY2Fpcm9fcmVjdGFuZ2xlKGNyLCB4LCB5LCB3LCBoKTsKKwljYWlyb19zZXRfc291cmNl X3JnYihjciwgciwgZywgYik7CisJY2Fpcm9fZmlsbChjcik7Cit9CisKK3ZvaWQga21zdGVzdF9w YWludF9jb2xvcl9hbHBoYShjYWlyb190ICpjciwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgs CisJCQkgICAgICAgZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwgZG91YmxlIGEpCit7CisJ Y2Fpcm9fcmVjdGFuZ2xlKGNyLCB4LCB5LCB3LCBoKTsKKwljYWlyb19zZXRfc291cmNlX3JnYmEo Y3IsIHIsIGcsIGIsIGEpOworCWNhaXJvX2ZpbGwoY3IpOworfQorCit2b2lkCitrbXN0ZXN0X3Bh aW50X2NvbG9yX2dyYWRpZW50KGNhaXJvX3QgKmNyLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQg aCwKKwkJICAgICBpbnQgciwgaW50IGcsIGludCBiKQoreworCWNhaXJvX3BhdHRlcm5fdCAqcGF0 OworCisJcGF0ID0gY2Fpcm9fcGF0dGVybl9jcmVhdGVfbGluZWFyKHgsIHksIHggKyB3LCB5ICsg aCk7CisJY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhKHBhdCwgMSwgMCwgMCwgMCwg MSk7CisJY2Fpcm9fcGF0dGVybl9hZGRfY29sb3Jfc3RvcF9yZ2JhKHBhdCwgMCwgciwgZywgYiwg MSk7CisKKwljYWlyb19yZWN0YW5nbGUoY3IsIHgsIHksIHcsIGgpOworCWNhaXJvX3NldF9zb3Vy Y2UoY3IsIHBhdCk7CisJY2Fpcm9fZmlsbChjcik7CisJY2Fpcm9fcGF0dGVybl9kZXN0cm95KHBh dCk7Cit9CisKK3N0YXRpYyB2b2lkCitwYWludF90ZXN0X3BhdHRlcm5zKGNhaXJvX3QgKmNyLCBp bnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJZG91YmxlIGdyX2hlaWdodCwgZ3Jfd2lkdGg7CisJ aW50IHgsIHk7CisKKwl5ID0gaGVpZ2h0ICogMC4xMDsKKwlncl93aWR0aCA9IHdpZHRoICogMC43 NTsKKwlncl9oZWlnaHQgPSBoZWlnaHQgKiAwLjA4OworCXggPSAod2lkdGggLyAyKSAtIChncl93 aWR0aCAvIDIpOworCisJa21zdGVzdF9wYWludF9jb2xvcl9ncmFkaWVudChjciwgeCwgeSwgZ3Jf d2lkdGgsIGdyX2hlaWdodCwgMSwgMCwgMCk7CisKKwl5ICs9IGdyX2hlaWdodDsKKwlrbXN0ZXN0 X3BhaW50X2NvbG9yX2dyYWRpZW50KGNyLCB4LCB5LCBncl93aWR0aCwgZ3JfaGVpZ2h0LCAwLCAx LCAwKTsKKworCXkgKz0gZ3JfaGVpZ2h0OworCWttc3Rlc3RfcGFpbnRfY29sb3JfZ3JhZGllbnQo Y3IsIHgsIHksIGdyX3dpZHRoLCBncl9oZWlnaHQsIDAsIDAsIDEpOworCisJeSArPSBncl9oZWln aHQ7CisJa21zdGVzdF9wYWludF9jb2xvcl9ncmFkaWVudChjciwgeCwgeSwgZ3Jfd2lkdGgsIGdy X2hlaWdodCwgMSwgMSwgMSk7Cit9CisKK2ludCBrbXN0ZXN0X2NhaXJvX3ByaW50Zl9saW5lKGNh aXJvX3QgKmNyLCBlbnVtIGttc3Rlc3RfdGV4dF9hbGlnbiBhbGlnbiwKKwkJCQlkb3VibGUgeXNw YWNpbmcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWRvdWJsZSB4LCB5LCB4b2ZzLCB5b2Zz OworCWNhaXJvX3RleHRfZXh0ZW50c190IGV4dGVudHM7CisJY2hhciAqdGV4dDsKKwl2YV9saXN0 IGFwOworCWludCByZXQ7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyZXQgPSB2YXNwcmludGYo JnRleHQsIGZtdCwgYXApOworCWFzc2VydChyZXQgPj0gMCk7CisJdmFfZW5kKGFwKTsKKworCWNh aXJvX3RleHRfZXh0ZW50cyhjciwgdGV4dCwgJmV4dGVudHMpOworCisJeG9mcyA9IHlvZnMgPSAw OworCWlmIChhbGlnbiAmIGFsaWduX3JpZ2h0KQorCQl4b2ZzID0gLWV4dGVudHMud2lkdGg7CisJ ZWxzZSBpZiAoYWxpZ24gJiBhbGlnbl9oY2VudGVyKQorCQl4b2ZzID0gLWV4dGVudHMud2lkdGgg LyAyOworCisJaWYgKGFsaWduICYgYWxpZ25fdG9wKQorCQl5b2ZzID0gZXh0ZW50cy5oZWlnaHQ7 CisJZWxzZSBpZiAoYWxpZ24gJiBhbGlnbl92Y2VudGVyKQorCQl5b2ZzID0gZXh0ZW50cy5oZWln aHQgLyAyOworCisJY2Fpcm9fZ2V0X2N1cnJlbnRfcG9pbnQoY3IsICZ4LCAmeSk7CisJaWYgKHhv ZnMgfHwgeW9mcykKKwkJY2Fpcm9fcmVsX21vdmVfdG8oY3IsIHhvZnMsIHlvZnMpOworCisJY2Fp cm9fdGV4dF9wYXRoKGNyLCB0ZXh0KTsKKwljYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMCwg MCk7CisJY2Fpcm9fc3Ryb2tlX3ByZXNlcnZlKGNyKTsKKwljYWlyb19zZXRfc291cmNlX3JnYihj ciwgMSwgMSwgMSk7CisJY2Fpcm9fZmlsbChjcik7CisKKwljYWlyb19tb3ZlX3RvKGNyLCB4LCB5 ICsgZXh0ZW50cy5oZWlnaHQgKyB5c3BhY2luZyk7CisKKwlmcmVlKHRleHQpOworCisJcmV0dXJu IGV4dGVudHMud2lkdGg7Cit9CisKK3N0YXRpYyB2b2lkCitwYWludF9tYXJrZXIoY2Fpcm9fdCAq Y3IsIGludCB4LCBpbnQgeSkKK3sKKwllbnVtIGttc3Rlc3RfdGV4dF9hbGlnbiBhbGlnbjsKKwlp bnQgeG9mZiwgeW9mZjsKKworCWNhaXJvX21vdmVfdG8oY3IsIHgsIHkgLSAyMCk7CisJY2Fpcm9f bGluZV90byhjciwgeCwgeSArIDIwKTsKKwljYWlyb19tb3ZlX3RvKGNyLCB4IC0gMjAsIHkpOwor CWNhaXJvX2xpbmVfdG8oY3IsIHggKyAyMCwgeSk7CisJY2Fpcm9fbmV3X3N1Yl9wYXRoKGNyKTsK KwljYWlyb19hcmMoY3IsIHgsIHksIDEwLCAwLCBNX1BJICogMik7CisJY2Fpcm9fc2V0X2xpbmVf d2lkdGgoY3IsIDQpOworCWNhaXJvX3NldF9zb3VyY2VfcmdiKGNyLCAwLCAwLCAwKTsKKwljYWly b19zdHJva2VfcHJlc2VydmUoY3IpOworCWNhaXJvX3NldF9zb3VyY2VfcmdiKGNyLCAxLCAxLCAx KTsKKwljYWlyb19zZXRfbGluZV93aWR0aChjciwgMik7CisJY2Fpcm9fc3Ryb2tlKGNyKTsKKwor CXhvZmYgPSB4ID8gLTIwIDogMjA7CisJYWxpZ24gPSB4ID8gYWxpZ25fcmlnaHQgOiBhbGlnbl9s ZWZ0OworCisJeW9mZiA9IHkgPyAtMjAgOiAyMDsKKwlhbGlnbiB8PSB5ID8gYWxpZ25fYm90dG9t IDogYWxpZ25fdG9wOworCisJY2Fpcm9fbW92ZV90byhjciwgeCArIHhvZmYsIHkgKyB5b2ZmKTsK KwljYWlyb19zZXRfZm9udF9zaXplKGNyLCAxOCk7CisJa21zdGVzdF9jYWlyb19wcmludGZfbGlu ZShjciwgYWxpZ24sIDAsICIoJWQsICVkKSIsIHgsIHkpOworfQorCit2b2lkIGttc3Rlc3RfcGFp bnRfdGVzdF9wYXR0ZXJuKGNhaXJvX3QgKmNyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJ cGFpbnRfdGVzdF9wYXR0ZXJucyhjciwgd2lkdGgsIGhlaWdodCk7CisKKwljYWlyb19zZXRfbGlu ZV9jYXAoY3IsIENBSVJPX0xJTkVfQ0FQX1NRVUFSRSk7CisKKwkvKiBQYWludCBjb3JuZXIgbWFy a2VycyAqLworCXBhaW50X21hcmtlcihjciwgMCwgMCk7CisJcGFpbnRfbWFya2VyKGNyLCB3aWR0 aCwgMCk7CisJcGFpbnRfbWFya2VyKGNyLCAwLCBoZWlnaHQpOworCXBhaW50X21hcmtlcihjciwg d2lkdGgsIGhlaWdodCk7CisKKwlhc3NlcnQoIWNhaXJvX3N0YXR1cyhjcikpOworfQorCit2b2lk IGttc3Rlc3RfcGFpbnRfaW1hZ2UoY2Fpcm9fdCAqY3IsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAor CQkJIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCkK K3sKKwljYWlyb19zdXJmYWNlX3QgKmltYWdlOworCWludCBpbWdfd2lkdGgsIGltZ19oZWlnaHQ7 CisJZG91YmxlIHNjYWxlX3gsIHNjYWxlX3k7CisKKwlpbWFnZSA9IGNhaXJvX2ltYWdlX3N1cmZh Y2VfY3JlYXRlX2Zyb21fcG5nKGZpbGVuYW1lKTsKKwlhc3NlcnQoY2Fpcm9fc3VyZmFjZV9zdGF0 dXMoaW1hZ2UpID09IENBSVJPX1NUQVRVU19TVUNDRVNTKTsKKworCWltZ193aWR0aCA9IGNhaXJv X2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRoKGltYWdlKTsKKwlpbWdfaGVpZ2h0ID0gY2Fpcm9faW1h Z2Vfc3VyZmFjZV9nZXRfaGVpZ2h0KGltYWdlKTsKKworCXNjYWxlX3ggPSAoZG91YmxlKWRzdF93 aWR0aCAvIGltZ193aWR0aDsKKwlzY2FsZV95ID0gKGRvdWJsZSlkc3RfaGVpZ2h0IC8gaW1nX2hl aWdodDsKKworCWNhaXJvX3NhdmUoY3IpOworCisJY2Fpcm9fdHJhbnNsYXRlKGNyLCBkc3RfeCwg ZHN0X3kpOworCWNhaXJvX3NjYWxlKGNyLCBzY2FsZV94LCBzY2FsZV95KTsKKwljYWlyb19zZXRf c291cmNlX3N1cmZhY2UoY3IsIGltYWdlLCAwLCAwKTsKKwljYWlyb19wYWludChjcik7CisKKwlj YWlyb19zdXJmYWNlX2Rlc3Ryb3koaW1hZ2UpOworCisJY2Fpcm9fcmVzdG9yZShjcik7Cit9CisK KyNkZWZpbmUgREYoZGlkLCBjaWQsIF9icHAsIF9kZXB0aCkJXAorCXsgRFJNX0ZPUk1BVF8jI2Rp ZCwgQ0FJUk9fRk9STUFUXyMjY2lkLCAjIGRpZCwgX2JwcCwgX2RlcHRoIH0KK3N0YXRpYyBzdHJ1 Y3QgZm9ybWF0X2Rlc2Nfc3RydWN0IHsKKwl1aW50MzJfdCBkcm1faWQ7CisJY2Fpcm9fZm9ybWF0 X3QgY2Fpcm9faWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgYnBwOworCWludCBkZXB0aDsK K30gZm9ybWF0X2Rlc2NbXSA9IHsKKwlERihSR0I1NjUsCVJHQjE2XzU2NSwJMTYsIDE2KSwKKwlE RihSR0I4ODgsCUlOVkFMSUQsCTI0LCAyNCksCisJREYoWFJHQjg4ODgsCVJHQjI0LAkJMzIsIDI0 KSwKKwlERihYUkdCMjEwMTAxMCwJUkdCMzAsCQkzMiwgMzApLAorCURGKEFSR0I4ODg4LAlBUkdC MzIsCQkzMiwgMzIpLAorfTsKKyN1bmRlZiBERgorCisjZGVmaW5lIGZvcl9lYWNoX2Zvcm1hdChm KQlcCisJZm9yIChmID0gZm9ybWF0X2Rlc2M7IGYgLSBmb3JtYXRfZGVzYyA8IEFSUkFZX1NJWkUo Zm9ybWF0X2Rlc2MpOyBmKyspCisKK3N0YXRpYyB1aW50MzJfdCBicHBfZGVwdGhfdG9fZHJtX2Zv cm1hdChpbnQgYnBwLCBpbnQgZGVwdGgpCit7CisJc3RydWN0IGZvcm1hdF9kZXNjX3N0cnVjdCAq ZjsKKworCWZvcl9lYWNoX2Zvcm1hdChmKQorCQlpZiAoZi0+YnBwID09IGJwcCAmJiBmLT5kZXB0 aCA9PSBkZXB0aCkKKwkJCXJldHVybiBmLT5kcm1faWQ7CisKKwlhYm9ydCgpOworfQorCisvKiBS ZXR1cm4gZmJfaWQgb24gc3VjY2VzcywgMCBvbiBlcnJvciAqLwordW5zaWduZWQgaW50IGttc3Rl c3RfY3JlYXRlX2ZiKGludCBmZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLAorCQkJ ICAgICAgIGludCBkZXB0aCwgYm9vbCB0aWxlZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZiKQorewor CW1lbXNldChmYiwgMCwgc2l6ZW9mKCpmYikpOworCisJaWYgKGNyZWF0ZV9ib19mb3JfZmIoZmQs IHdpZHRoLCBoZWlnaHQsIGJwcCwgdGlsZWQsICZmYi0+Z2VtX2hhbmRsZSwKKwkJCSAgICAgICAm ZmItPnNpemUsICZmYi0+c3RyaWRlKSA8IDApCisJCXJldHVybiAwOworCisJaWYgKGRybU1vZGVB ZGRGQihmZCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGJwcCwgZmItPnN0cmlkZSwKKwkJCSAgICAg ICBmYi0+Z2VtX2hhbmRsZSwgJmZiLT5mYl9pZCkgPCAwKSB7CisJCWdlbV9jbG9zZShmZCwgZmIt PmdlbV9oYW5kbGUpOworCisJCXJldHVybiAwOworCX0KKworCWZiLT53aWR0aCA9IHdpZHRoOwor CWZiLT5oZWlnaHQgPSBoZWlnaHQ7CisJZmItPnRpbGluZyA9IHRpbGVkOworCWZiLT5kcm1fZm9y bWF0ID0gYnBwX2RlcHRoX3RvX2RybV9mb3JtYXQoYnBwLCBkZXB0aCk7CisKKwlyZXR1cm4gZmIt PmZiX2lkOworfQorCit1aW50MzJfdCBkcm1fZm9ybWF0X3RvX2JwcCh1aW50MzJfdCBkcm1fZm9y bWF0KQoreworCXN0cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3QgKmY7CisKKwlmb3JfZWFjaF9mb3Jt YXQoZikKKwkJaWYgKGYtPmRybV9pZCA9PSBkcm1fZm9ybWF0KQorCQkJcmV0dXJuIGYtPmJwcDsK KworCWFib3J0KCk7Cit9CisKK3Vuc2lnbmVkIGludCBrbXN0ZXN0X2NyZWF0ZV9mYjIoaW50IGZk LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKwkJCSAgICAgICAgYm9v bCB0aWxlZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZiKQoreworCXVpbnQzMl90IGhhbmRsZXNbNF07 CisJdWludDMyX3QgcGl0Y2hlc1s0XTsKKwl1aW50MzJfdCBvZmZzZXRzWzRdOworCXVpbnQzMl90 IGZiX2lkOworCWludCBicHA7CisJaW50IHJldDsKKworCW1lbXNldChmYiwgMCwgc2l6ZW9mKCpm YikpOworCisJYnBwID0gZHJtX2Zvcm1hdF90b19icHAoZm9ybWF0KTsKKwlyZXQgPSBjcmVhdGVf Ym9fZm9yX2ZiKGZkLCB3aWR0aCwgaGVpZ2h0LCBicHAsIHRpbGVkLCAmZmItPmdlbV9oYW5kbGUs CisJCQkgICAgICAmZmItPnNpemUsICZmYi0+c3RyaWRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0 dXJuIHJldDsKKworCW1lbXNldChoYW5kbGVzLCAwLCBzaXplb2YoaGFuZGxlcykpOworCWhhbmRs ZXNbMF0gPSBmYi0+Z2VtX2hhbmRsZTsKKwltZW1zZXQocGl0Y2hlcywgMCwgc2l6ZW9mKHBpdGNo ZXMpKTsKKwlwaXRjaGVzWzBdID0gZmItPnN0cmlkZTsKKwltZW1zZXQob2Zmc2V0cywgMCwgc2l6 ZW9mKG9mZnNldHMpKTsKKwlpZiAoZHJtTW9kZUFkZEZCMihmZCwgd2lkdGgsIGhlaWdodCwgZm9y bWF0LCBoYW5kbGVzLCBwaXRjaGVzLAorCQkJICBvZmZzZXRzLCAmZmJfaWQsIDApIDwgMCkgewor CQlnZW1fY2xvc2UoZmQsIGZiLT5nZW1faGFuZGxlKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlm Yi0+d2lkdGggPSB3aWR0aDsKKwlmYi0+aGVpZ2h0ID0gaGVpZ2h0OworCWZiLT50aWxpbmcgPSB0 aWxlZDsKKwlmYi0+ZHJtX2Zvcm1hdCA9IGZvcm1hdDsKKwlmYi0+ZmJfaWQgPSBmYl9pZDsKKwor CXJldHVybiBmYl9pZDsKK30KKworc3RhdGljIGNhaXJvX2Zvcm1hdF90IGRybV9mb3JtYXRfdG9f Y2Fpcm8odWludDMyX3QgZHJtX2Zvcm1hdCkKK3sKKwlzdHJ1Y3QgZm9ybWF0X2Rlc2Nfc3RydWN0 ICpmOworCisJZm9yX2VhY2hfZm9ybWF0KGYpCisJCWlmIChmLT5kcm1faWQgPT0gZHJtX2Zvcm1h dCkKKwkJCXJldHVybiBmLT5jYWlyb19pZDsKKworCWFib3J0KCk7Cit9CisKK3N0YXRpYyBjYWly b19zdXJmYWNlX3QgKmNyZWF0ZV9pbWFnZV9zdXJmYWNlKGludCBmZCwgc3RydWN0IGttc3Rlc3Rf ZmIgKmZiKQoreworCWNhaXJvX3N1cmZhY2VfdCAqc3VyZmFjZTsKKwljYWlyb19mb3JtYXRfdCBj Zm9ybWF0OworCXZvaWQgKmZiX3B0cjsKKworCWNmb3JtYXQgPSBkcm1fZm9ybWF0X3RvX2NhaXJv KGZiLT5kcm1fZm9ybWF0KTsKKwlmYl9wdHIgPSBnZW1fbW1hcChmZCwgZmItPmdlbV9oYW5kbGUs IGZiLT5zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKKwlzdXJmYWNlID0gY2Fpcm9faW1h Z2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGEoKHVuc2lnbmVkIGNoYXIgKilmYl9wdHIsCisJCQkJ CQkgICBjZm9ybWF0LCBmYi0+d2lkdGgsCisJCQkJCQkgICBmYi0+aGVpZ2h0LCBmYi0+c3RyaWRl KTsKKwlhc3NlcnQoc3VyZmFjZSk7CisKKwlyZXR1cm4gc3VyZmFjZTsKK30KKworc3RhdGljIGNh aXJvX3QgKmNyZWF0ZV9jYWlyb19jdHgoaW50IGZkLCBzdHJ1Y3Qga21zdGVzdF9mYiAqZmIpCit7 CisJY2Fpcm9fdCAqY3I7CisJY2Fpcm9fc3VyZmFjZV90ICpzdXJmYWNlOworCisJc3VyZmFjZSA9 IGNyZWF0ZV9pbWFnZV9zdXJmYWNlKGZkLCBmYik7CisJY3IgPSBjYWlyb19jcmVhdGUoc3VyZmFj ZSk7CisJY2Fpcm9fc3VyZmFjZV9kZXN0cm95KHN1cmZhY2UpOworCisJcmV0dXJuIGNyOworfQor Cit2b2lkIGttc3Rlc3Rfd3JpdGVfZmIoaW50IGZkLCBzdHJ1Y3Qga21zdGVzdF9mYiAqZmIsIGNv bnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWNhaXJvX3N1cmZhY2VfdCAqc3VyZmFjZTsKKwljYWly b19zdGF0dXNfdCBzdGF0dXM7CisKKwlzdXJmYWNlID0gY3JlYXRlX2ltYWdlX3N1cmZhY2UoZmQs IGZiKTsKKwlzdGF0dXMgPSBjYWlyb19zdXJmYWNlX3dyaXRlX3RvX3BuZyhzdXJmYWNlLCBmaWxl bmFtZSk7CisJYXNzZXJ0KHN0YXR1cyA9PSBDQUlST19TVEFUVVNfU1VDQ0VTUyk7CisJY2Fpcm9f c3VyZmFjZV9kZXN0cm95KHN1cmZhY2UpOworfQorCitjYWlyb190ICprbXN0ZXN0X2dldF9jYWly b19jdHgoaW50IGZkLCBzdHJ1Y3Qga21zdGVzdF9mYiAqZmIpCit7CisKKwlpZiAoIWZiLT5jYWly b19jdHgpCisJCWZiLT5jYWlyb19jdHggPSBjcmVhdGVfY2Fpcm9fY3R4KGZkLCBmYik7CisKKwln ZW1fc2V0X2RvbWFpbihmZCwgZmItPmdlbV9oYW5kbGUsIEk5MTVfR0VNX0RPTUFJTl9DUFUsCisJ CSAgICAgICBJOTE1X0dFTV9ET01BSU5fQ1BVKTsKKworCXJldHVybiBmYi0+Y2Fpcm9fY3R4Owor fQorCit2b2lkIGttc3Rlc3RfcmVtb3ZlX2ZiKGludCBmZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZi KQoreworCWlmIChmYi0+Y2Fpcm9fY3R4KQorCQljYWlyb19kZXN0cm95KGZiLT5jYWlyb19jdHgp OworCWRvX29yX2RpZShkcm1Nb2RlUm1GQihmZCwgZmItPmZiX2lkKSk7CisJZ2VtX2Nsb3NlKGZk LCBmYi0+Z2VtX2hhbmRsZSk7Cit9CisKK2NvbnN0IGNoYXIgKmttc3Rlc3RfZm9ybWF0X3N0cih1 aW50MzJfdCBkcm1fZm9ybWF0KQoreworCXN0cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3QgKmY7CisK Kwlmb3JfZWFjaF9mb3JtYXQoZikKKwkJaWYgKGYtPmRybV9pZCA9PSBkcm1fZm9ybWF0KQorCQkJ cmV0dXJuIGYtPm5hbWU7CisKKwlyZXR1cm4gImludmFsaWQiOworfQorCitjb25zdCBjaGFyICpr bXN0ZXN0X3BpcGVfc3RyKGludCBwaXBlKQoreworCWNvbnN0IGNoYXIgKnN0cltdID0geyAiQSIs ICJCIiwgIkMiIH07CisKKwlpZiAocGlwZSA+IDIpCisJCXJldHVybiAiaW52YWxpZCI7CisKKwly ZXR1cm4gc3RyW3BpcGVdOworfQorCit2b2lkIGttc3Rlc3RfZ2V0X2FsbF9mb3JtYXRzKGNvbnN0 IHVpbnQzMl90ICoqZm9ybWF0cywgaW50ICpmb3JtYXRfY291bnQpCit7CisJc3RhdGljIHVpbnQz Ml90ICpkcm1fZm9ybWF0czsKKworCWlmICghZHJtX2Zvcm1hdHMpIHsKKwkJc3RydWN0IGZvcm1h dF9kZXNjX3N0cnVjdCAqZjsKKwkJdWludDMyX3QgKmZvcm1hdDsKKworCQlkcm1fZm9ybWF0cyA9 IGNhbGxvYyhBUlJBWV9TSVpFKGZvcm1hdF9kZXNjKSwKKwkJCQkgICAgIHNpemVvZigqZHJtX2Zv cm1hdHMpKTsKKwkJZm9ybWF0ID0gJmRybV9mb3JtYXRzWzBdOworCQlmb3JfZWFjaF9mb3JtYXQo ZikKKwkJCSpmb3JtYXQrKyA9IGYtPmRybV9pZDsKKwl9CisKKwkqZm9ybWF0cyA9IGRybV9mb3Jt YXRzOworCSpmb3JtYXRfY291bnQgPSBBUlJBWV9TSVpFKGZvcm1hdF9kZXNjKTsKK30KKworc3Ry dWN0IHR5cGVfbmFtZSB7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKKyNk ZWZpbmUgdHlwZV9uYW1lX2ZuKHJlcykgXAorY29uc3QgY2hhciAqIGttc3Rlc3RfIyNyZXMjI19z dHIoaW50IHR5cGUpIHsJCVwKKwl1bnNpZ25lZCBpbnQgaTsJCQkJCVwKKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShyZXMjI19uYW1lcyk7IGkrKykgeyBcCisJCWlmIChyZXMjI19uYW1lc1tp XS50eXBlID09IHR5cGUpCVwKKwkJCXJldHVybiByZXMjI19uYW1lc1tpXS5uYW1lOwlcCisJfQkJ CQkJCVwKKwlyZXR1cm4gIihpbnZhbGlkKSI7CQkJCVwKK30KKworc3RydWN0IHR5cGVfbmFtZSBl bmNvZGVyX3R5cGVfbmFtZXNbXSA9IHsKKwl7IERSTV9NT0RFX0VOQ09ERVJfTk9ORSwgIm5vbmUi IH0sCisJeyBEUk1fTU9ERV9FTkNPREVSX0RBQywgIkRBQyIgfSwKKwl7IERSTV9NT0RFX0VOQ09E RVJfVE1EUywgIlRNRFMiIH0sCisJeyBEUk1fTU9ERV9FTkNPREVSX0xWRFMsICJMVkRTIiB9LAor CXsgRFJNX01PREVfRU5DT0RFUl9UVkRBQywgIlRWREFDIiB9LAorfTsKKwordHlwZV9uYW1lX2Zu KGVuY29kZXJfdHlwZSkKKworc3RydWN0IHR5cGVfbmFtZSBjb25uZWN0b3Jfc3RhdHVzX25hbWVz W10gPSB7CisJeyBEUk1fTU9ERV9DT05ORUNURUQsICJjb25uZWN0ZWQiIH0sCisJeyBEUk1fTU9E RV9ESVNDT05ORUNURUQsICJkaXNjb25uZWN0ZWQiIH0sCisJeyBEUk1fTU9ERV9VTktOT1dOQ09O TkVDVElPTiwgInVua25vd24iIH0sCit9OworCit0eXBlX25hbWVfZm4oY29ubmVjdG9yX3N0YXR1 cykKKworc3RydWN0IHR5cGVfbmFtZSBjb25uZWN0b3JfdHlwZV9uYW1lc1tdID0geworCXsgRFJN X01PREVfQ09OTkVDVE9SX1Vua25vd24sICJ1bmtub3duIiB9LAorCXsgRFJNX01PREVfQ09OTkVD VE9SX1ZHQSwgIlZHQSIgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJLCAiRFZJLUkiIH0s CisJeyBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRCwgIkRWSS1EIiB9LAorCXsgRFJNX01PREVfQ09O TkVDVE9SX0RWSUEsICJEVkktQSIgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb3NpdGUs ICJjb21wb3NpdGUiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPLCAicy12aWRlbyIg fSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTLCAiTFZEUyIgfSwKKwl7IERSTV9NT0RFX0NP Tk5FQ1RPUl9Db21wb25lbnQsICJjb21wb25lbnQiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1Jf OVBpbkRJTiwgIjktcGluIERJTiIgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9y dCwgIkRQIiB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBLCAiSERNSS1BIiB9LAorCXsg RFJNX01PREVfQ09OTkVDVE9SX0hETUlCLCAiSERNSS1CIiB9LAorCXsgRFJNX01PREVfQ09OTkVD VE9SX1RWLCAiVFYiIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfZURQLCAiZURQIiB9LAorfTsK KwordHlwZV9uYW1lX2ZuKGNvbm5lY3Rvcl90eXBlKQorCitzdGF0aWMgY29uc3QgY2hhciAqbW9k ZV9zdGVyZW9fbmFtZShjb25zdCBkcm1Nb2RlTW9kZUluZm8gKm1vZGUpCit7CisJc3dpdGNoICht b2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfM0RfTUFTSykgeworCWNhc2UgRFJNX01PREVfRkxB R18zRF9GUkFNRV9QQUNLSU5HOgorCQlyZXR1cm4gIkZQIjsKKwljYXNlIERSTV9NT0RFX0ZMQUdf M0RfRklFTERfQUxURVJOQVRJVkU6CisJCXJldHVybiAiRkEiOworCWNhc2UgRFJNX01PREVfRkxB R18zRF9MSU5FX0FMVEVSTkFUSVZFOgorCQlyZXR1cm4gIkxBIjsKKwljYXNlIERSTV9NT0RFX0ZM QUdfM0RfU0lERV9CWV9TSURFX0ZVTEw6CisJCXJldHVybiAiU0JTRiI7CisJY2FzZSBEUk1fTU9E RV9GTEFHXzNEX0xfREVQVEg6CisJCXJldHVybiAiTEQiOworCWNhc2UgRFJNX01PREVfRkxBR18z RF9MX0RFUFRIX0dGWF9HRlhfREVQVEg6CisJCXJldHVybiAiTERHRlgiOworCWNhc2UgRFJNX01P REVfRkxBR18zRF9UT1BfQU5EX0JPVFRPTToKKwkJcmV0dXJuICJUQiI7CisJY2FzZSBEUk1fTU9E RV9GTEFHXzNEX1NJREVfQllfU0lERV9IQUxGOgorCQlyZXR1cm4gIlNCU0giOworCWRlZmF1bHQ6 CisJCXJldHVybiBOVUxMOworCX0KK30KKwordm9pZCBrbXN0ZXN0X2R1bXBfbW9kZShkcm1Nb2Rl TW9kZUluZm8gKm1vZGUpCit7CisJY29uc3QgY2hhciAqc3RlcmVvID0gbW9kZV9zdGVyZW9fbmFt ZShtb2RlKTsKKworCXByaW50ZigiICAlcyAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAweCV4 IDB4JXggJWQlcyVzJXNcbiIsCisJICAgICAgIG1vZGUtPm5hbWUsCisJICAgICAgIG1vZGUtPnZy ZWZyZXNoLAorCSAgICAgICBtb2RlLT5oZGlzcGxheSwKKwkgICAgICAgbW9kZS0+aHN5bmNfc3Rh cnQsCisJICAgICAgIG1vZGUtPmhzeW5jX2VuZCwKKwkgICAgICAgbW9kZS0+aHRvdGFsLAorCSAg ICAgICBtb2RlLT52ZGlzcGxheSwKKwkgICAgICAgbW9kZS0+dnN5bmNfc3RhcnQsCisJICAgICAg IG1vZGUtPnZzeW5jX2VuZCwKKwkgICAgICAgbW9kZS0+dnRvdGFsLAorCSAgICAgICBtb2RlLT5m bGFncywKKwkgICAgICAgbW9kZS0+dHlwZSwKKwkgICAgICAgbW9kZS0+Y2xvY2ssCisJICAgICAg IHN0ZXJlbyA/ICIgKDNEOiIgOiAiIiwKKwkgICAgICAgc3RlcmVvID8gc3RlcmVvIDogIiIsCisJ ICAgICAgIHN0ZXJlbyA/ICIpIiA6ICIiKTsKKwlmZmx1c2goc3Rkb3V0KTsKK30KKworaW50IGtt c3Rlc3RfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKGludCBmZCwgaW50IGNydGNfaWQpCit7CisJc3Ry dWN0IGRybV9pOTE1X2dldF9waXBlX2Zyb21fY3J0Y19pZCBwZmNpOworCWludCByZXQ7CisKKwlt ZW1zZXQoJnBmY2ksIDAsIHNpemVvZihwZmNpKSk7CisJcGZjaS5jcnRjX2lkID0gY3J0Y19pZDsK KwlyZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lE LCAmcGZjaSk7CisJaWd0X2Fzc2VydChyZXQgPT0gMCk7CisKKwlyZXR1cm4gcGZjaS5waXBlOwor fQorCitzdGF0aWMgc2lnbmVkIGxvbmcgc2V0X3Z0X21vZGUodW5zaWduZWQgbG9uZyBtb2RlKQor eworCWludCBmZDsKKwl1bnNpZ25lZCBsb25nIHByZXZfbW9kZTsKKworCWZkID0gb3BlbigiL2Rl di90dHkwIiwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtZXJybm87CisKKwlw cmV2X21vZGUgPSAwOworCWlmIChkcm1Jb2N0bChmZCwgS0RHRVRNT0RFLCAmcHJldl9tb2RlKSkK KwkJZ290byBlcnI7CisJaWYgKGRybUlvY3RsKGZkLCBLRFNFVE1PREUsICh2b2lkICopbW9kZSkp CisJCWdvdG8gZXJyOworCisJY2xvc2UoZmQpOworCisJcmV0dXJuIHByZXZfbW9kZTsKK2VycjoK KwljbG9zZShmZCk7CisKKwlyZXR1cm4gLWVycm5vOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9u ZyBvcmlnX3Z0X21vZGUgPSAtMVVMOworCitzdGF0aWMgdm9pZCByZXN0b3JlX3Z0X21vZGVfYXRf ZXhpdChpbnQgc2lnKQoreworCWlmIChvcmlnX3Z0X21vZGUgIT0gLTFVTCkKKwkJc2V0X3Z0X21v ZGUob3JpZ192dF9tb2RlKTsKK30KKworLyoKKyAqIFNldCB0aGUgVlQgdG8gZ3JhcGhpY3MgbW9k ZSBhbmQgaW5zdGFsbCBhbiBleGl0IGhhbmRsZXIgdG8gcmVzdG9yZSB0aGUKKyAqIG9yaWdpbmFs IG1vZGUuCisgKi8KKwordm9pZCBpZ3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUodm9pZCkKK3sKKwlp Z3RfaW5zdGFsbF9leGl0X2hhbmRsZXIocmVzdG9yZV92dF9tb2RlX2F0X2V4aXQpOworCisJaWd0 X2Rpc2FibGVfZXhpdF9oYW5kbGVyKCk7CisJb3JpZ192dF9tb2RlID0gc2V0X3Z0X21vZGUoS0Rf R1JBUEhJQ1MpOworCWlmIChvcmlnX3Z0X21vZGUgPCAwKQorCQlvcmlnX3Z0X21vZGUgPSAtMVVM OworCWlndF9lbmFibGVfZXhpdF9oYW5kbGVyKCk7CisKKwlpZ3RfYXNzZXJ0KG9yaWdfdnRfbW9k ZSA+PSAwKTsKK30KKworaW50IGttc3Rlc3RfZ2V0X2Nvbm5lY3Rvcl9kZWZhdWx0X21vZGUoaW50 IGRybV9mZCwgZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSAgICAgIGRybU1vZGVN b2RlSW5mbyAqbW9kZSkKK3sKKwlkcm1Nb2RlUmVzICpyZXNvdXJjZXM7CisJaW50IGk7CisKKwly ZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRybV9mZCk7CisJaWYgKCFyZXNvdXJjZXMp IHsKKwkJcGVycm9yKCJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZCIpOworCisJCXJldHVybiAt MTsKKwl9CisKKwlpZiAoIWNvbm5lY3Rvci0+Y291bnRfbW9kZXMpIHsKKwkJZnByaW50ZihzdGRl cnIsICJubyBtb2RlcyBmb3IgY29ubmVjdG9yICVkXG4iLAorCQkJY29ubmVjdG9yLT5jb25uZWN0 b3JfaWQpOworCQlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXNvdXJjZXMpOworCisJCXJldHVybiAt MTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdG9yLT5jb3VudF9tb2RlczsgaSsrKSB7 CisJCWlmIChpID09IDAgfHwKKwkJICAgIGNvbm5lY3Rvci0+bW9kZXNbaV0udHlwZSAmIERSTV9N T0RFX1RZUEVfUFJFRkVSUkVEKSB7CisJCQkqbW9kZSA9IGNvbm5lY3Rvci0+bW9kZXNbaV07CisJ CQlpZiAobW9kZS0+dHlwZSAmIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEKQorCQkJCWJyZWFrOwor CQl9CisJfQorCisJZHJtTW9kZUZyZWVSZXNvdXJjZXMocmVzb3VyY2VzKTsKKworCXJldHVybiAw OworfQorCitpbnQga21zdGVzdF9nZXRfY29ubmVjdG9yX2NvbmZpZyhpbnQgZHJtX2ZkLCB1aW50 MzJfdCBjb25uZWN0b3JfaWQsCisJCQkJIHVuc2lnbmVkIGxvbmcgY3J0Y19pZHhfbWFzaywKKwkJ CQkgc3RydWN0IGttc3Rlc3RfY29ubmVjdG9yX2NvbmZpZyAqY29uZmlnKQoreworCWRybU1vZGVS ZXMgKnJlc291cmNlczsKKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7CisJZHJtTW9kZUVu Y29kZXIgKmVuY29kZXI7CisJaW50IGksIGo7CisKKwlyZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVz b3VyY2VzKGRybV9mZCk7CisJaWYgKCFyZXNvdXJjZXMpIHsKKwkJcGVycm9yKCJkcm1Nb2RlR2V0 UmVzb3VyY2VzIGZhaWxlZCIpOworCQlnb3RvIGVycjE7CisJfQorCisJLyogRmlyc3QsIGZpbmQg dGhlIGNvbm5lY3RvciAmIG1vZGUgKi8KKwljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVjdG9y KGRybV9mZCwgY29ubmVjdG9yX2lkKTsKKwlpZiAoIWNvbm5lY3RvcikKKwkJZ290byBlcnIyOwor CisJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdGlvbiAhPSBEUk1fTU9ERV9DT05ORUNURUQpCisJCWdv dG8gZXJyMzsKKworCWlmICghY29ubmVjdG9yLT5jb3VudF9tb2RlcykgeworCQlmcHJpbnRmKHN0 ZGVyciwgImNvbm5lY3RvciAlZCBoYXMgbm8gbW9kZXNcbiIsIGNvbm5lY3Rvcl9pZCk7CisJCWdv dG8gZXJyMzsKKwl9CisKKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfaWQgIT0gY29ubmVjdG9y X2lkKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY29ubmVjdG9yIGlkIGRvZXNuJ3QgbWF0Y2ggKCVk ICE9ICVkKVxuIiwKKwkJCWNvbm5lY3Rvci0+Y29ubmVjdG9yX2lkLCBjb25uZWN0b3JfaWQpOwor CQlnb3RvIGVycjM7CisJfQorCisJLyoKKwkgKiBGaW5kIGdpdmVuIENSVEMgaWYgY3J0Y19pZCAh PSAwIG9yIGVsc2UgdGhlIGZpcnN0IENSVEMgbm90IGluIHVzZS4KKwkgKiBJbiBib3RoIGNhc2Vz IGZpbmQgdGhlIGZpcnN0IGNvbXBhdGlibGUgZW5jb2RlciBhbmQgc2tpcCB0aGUgQ1JUQworCSAq IGlmIHRoZXJlIGlzIG5vbiBzdWNoLgorCSAqLworCWVuY29kZXIgPSBOVUxMOwkJLyogc3VwcHJl c3MgR0NDIHdhcm5pbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5jb3VudF9jcnRj czsgaSsrKSB7CisJCWlmICghcmVzb3VyY2VzLT5jcnRjc1tpXSB8fCAhKGNydGNfaWR4X21hc2sg JiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKworCQkvKiBOb3cgZ2V0IGEgY29tcGF0aWJsZSBl bmNvZGVyICovCisJCWZvciAoaiA9IDA7IGogPCBjb25uZWN0b3ItPmNvdW50X2VuY29kZXJzOyBq KyspIHsKKwkJCWVuY29kZXIgPSBkcm1Nb2RlR2V0RW5jb2Rlcihkcm1fZmQsCisJCQkJCQkgICAg Y29ubmVjdG9yLT5lbmNvZGVyc1tqXSk7CisKKwkJCWlmICghZW5jb2RlcikgeworCQkJCWZwcmlu dGYoc3RkZXJyLCAiY291bGQgbm90IGdldCBlbmNvZGVyICVkOiAlc1xuIiwKKwkJCQkJcmVzb3Vy Y2VzLT5lbmNvZGVyc1tqXSwgc3RyZXJyb3IoZXJybm8pKTsKKworCQkJCWNvbnRpbnVlOworCQkJ fQorCisJCQlpZiAoZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgJiAoMSA8PCBpKSkKKwkJCQlnb3Rv IGZvdW5kOworCisJCQlkcm1Nb2RlRnJlZUVuY29kZXIoZW5jb2Rlcik7CisJCX0KKwl9CisKKwln b3RvIGVycjM7CisKK2ZvdW5kOgorCWlmIChrbXN0ZXN0X2dldF9jb25uZWN0b3JfZGVmYXVsdF9t b2RlKGRybV9mZCwgY29ubmVjdG9yLAorCQkJCSAgICAgICAmY29uZmlnLT5kZWZhdWx0X21vZGUp IDwgMCkKKwkJZ290byBlcnI0OworCisJY29uZmlnLT5jb25uZWN0b3IgPSBjb25uZWN0b3I7CisJ Y29uZmlnLT5lbmNvZGVyID0gZW5jb2RlcjsKKwljb25maWctPmNydGMgPSBkcm1Nb2RlR2V0Q3J0 Yyhkcm1fZmQsIHJlc291cmNlcy0+Y3J0Y3NbaV0pOworCWNvbmZpZy0+Y3J0Y19pZHggPSBpOwor CWNvbmZpZy0+cGlwZSA9IGttc3Rlc3RfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKGRybV9mZCwKKwkJ CQkJCSAgICAgY29uZmlnLT5jcnRjLT5jcnRjX2lkKTsKKworCWRybU1vZGVGcmVlUmVzb3VyY2Vz KHJlc291cmNlcyk7CisKKwlyZXR1cm4gMDsKK2VycjQ6CisJZHJtTW9kZUZyZWVFbmNvZGVyKGVu Y29kZXIpOworZXJyMzoKKwlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOworZXJyMjoK Kwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXNvdXJjZXMpOworZXJyMToKKwlyZXR1cm4gLTE7Cit9 CisKK3ZvaWQga21zdGVzdF9mcmVlX2Nvbm5lY3Rvcl9jb25maWcoc3RydWN0IGttc3Rlc3RfY29u bmVjdG9yX2NvbmZpZyAqY29uZmlnKQoreworCWRybU1vZGVGcmVlQ3J0Yyhjb25maWctPmNydGMp OworCWRybU1vZGVGcmVlRW5jb2Rlcihjb25maWctPmVuY29kZXIpOworCWRybU1vZGVGcmVlQ29u bmVjdG9yKGNvbmZpZy0+Y29ubmVjdG9yKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2lndF9rbXMu aCBiL2xpYi9pZ3Rfa21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYx ZjhlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9pZ3Rfa21zLmgKQEAgLTAsMCArMSwxMDIgQEAK Ky8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1p c3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9i dGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1l bnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdh cmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICog dGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1 dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBh bmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hl ZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICog VGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGlu Y2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwg Y29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgor ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0Yg QU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlU RUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNI QUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFO WSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFD VElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9V VCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RI RVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0lH VF9LTVNfSF9fCisjZGVmaW5lIF9fSUdUX0tNU19IX18KKworI2luY2x1ZGUgPGNhaXJvLmg+CisK K3N0cnVjdCBrbXN0ZXN0X2Nvbm5lY3Rvcl9jb25maWcgeworCWRybU1vZGVDcnRjICpjcnRjOwor CWRybU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlkcm1Nb2RlRW5jb2RlciAqZW5jb2RlcjsK Kwlkcm1Nb2RlTW9kZUluZm8gZGVmYXVsdF9tb2RlOworCWludCBjcnRjX2lkeDsKKwlpbnQgcGlw ZTsKK307CisKK2ludCBrbXN0ZXN0X2dldF9jb25uZWN0b3JfZGVmYXVsdF9tb2RlKGludCBkcm1f ZmQsIGRybU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgICAgICBkcm1Nb2RlTW9kZUlu Zm8gKm1vZGUpOworaW50IGttc3Rlc3RfZ2V0X2Nvbm5lY3Rvcl9jb25maWcoaW50IGRybV9mZCwg dWludDMyX3QgY29ubmVjdG9yX2lkLAorCQkJCSB1bnNpZ25lZCBsb25nIGNydGNfaWR4X21hc2ss CisJCQkJIHN0cnVjdCBrbXN0ZXN0X2Nvbm5lY3Rvcl9jb25maWcgKmNvbmZpZyk7Cit2b2lkIGtt c3Rlc3RfZnJlZV9jb25uZWN0b3JfY29uZmlnKHN0cnVjdCBrbXN0ZXN0X2Nvbm5lY3Rvcl9jb25m aWcgKmNvbmZpZyk7CisKKy8qIGhlbHBlcnMgdG8gY3JlYXRlIG5pY2UtbG9va2luZyBmcmFtZWJ1 ZmZlcnMgKi8KK3N0cnVjdCBrbXN0ZXN0X2ZiIHsKKwl1aW50MzJfdCBmYl9pZDsKKwl1aW50MzJf dCBnZW1faGFuZGxlOworCXVpbnQzMl90IGRybV9mb3JtYXQ7CisJaW50IHdpZHRoOworCWludCBo ZWlnaHQ7CisJaW50IGRlcHRoOworCXVuc2lnbmVkIHN0cmlkZTsKKwl1bnNpZ25lZCB0aWxpbmc7 CisJdW5zaWduZWQgc2l6ZTsKKwljYWlyb190ICpjYWlyb19jdHg7Cit9OworCitlbnVtIGttc3Rl c3RfdGV4dF9hbGlnbiB7CisJYWxpZ25fbGVmdCwKKwlhbGlnbl9ib3R0b20JPSBhbGlnbl9sZWZ0 LAorCWFsaWduX3JpZ2h0CT0gMHgwMSwKKwlhbGlnbl90b3AJPSAweDAyLAorCWFsaWduX3ZjZW50 ZXIJPSAweDA0LAorCWFsaWduX2hjZW50ZXIJPSAweDA4LAorfTsKKworaW50IGttc3Rlc3RfY2Fp cm9fcHJpbnRmX2xpbmUoY2Fpcm9fdCAqY3IsIGVudW0ga21zdGVzdF90ZXh0X2FsaWduIGFsaWdu LAorCQkJICAgICAgIGRvdWJsZSB5c3BhY2luZywgY29uc3QgY2hhciAqZm10LCAuLi4pCisJCQkg ICAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CisKK3Vuc2lnbmVk IGludCBrbXN0ZXN0X2NyZWF0ZV9mYihpbnQgZmQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50 IGJwcCwKKwkJCSAgICAgICBpbnQgZGVwdGgsIGJvb2wgdGlsZWQsCisJCQkgICAgICAgc3RydWN0 IGttc3Rlc3RfZmIgKmZiX2luZm8pOwordW5zaWduZWQgaW50IGttc3Rlc3RfY3JlYXRlX2ZiMihp bnQgZmQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LAorCQkJICAgICAg ICBib29sIHRpbGVkLCBzdHJ1Y3Qga21zdGVzdF9mYiAqZmIpOwordm9pZCBrbXN0ZXN0X3JlbW92 ZV9mYihpbnQgZmQsIHN0cnVjdCBrbXN0ZXN0X2ZiICpmYl9pbmZvKTsKK2NhaXJvX3QgKmttc3Rl c3RfZ2V0X2NhaXJvX2N0eChpbnQgZmQsIHN0cnVjdCBrbXN0ZXN0X2ZiICpmYik7Cit2b2lkIGtt c3Rlc3RfcGFpbnRfY29sb3IoY2Fpcm9fdCAqY3IsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBo LAorCQkJIGRvdWJsZSByLCBkb3VibGUgZywgZG91YmxlIGIpOwordm9pZCBrbXN0ZXN0X3BhaW50 X2NvbG9yX2FscGhhKGNhaXJvX3QgKmNyLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKwkJ CSAgICAgICBkb3VibGUgciwgZG91YmxlIGcsIGRvdWJsZSBiLCBkb3VibGUgYSk7Cit2b2lkIGtt c3Rlc3RfcGFpbnRfY29sb3JfZ3JhZGllbnQoY2Fpcm9fdCAqY3IsIGludCB4LCBpbnQgeSwgaW50 IHcsIGludCBoLAorCQkJCSAgaW50IHIsIGludCBnLCBpbnQgYik7Cit2b2lkIGttc3Rlc3RfcGFp bnRfdGVzdF9wYXR0ZXJuKGNhaXJvX3QgKmNyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordm9p ZCBrbXN0ZXN0X3BhaW50X2ltYWdlKGNhaXJvX3QgKmNyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwK KwkJCSBpbnQgZHN0X3gsIGludCBkc3RfeSwgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQp Owordm9pZCBrbXN0ZXN0X3dyaXRlX2ZiKGludCBmZCwgc3RydWN0IGttc3Rlc3RfZmIgKmZiLCBj b25zdCBjaGFyICpmaWxlbmFtZSk7Cit2b2lkIGttc3Rlc3RfZHVtcF9tb2RlKGRybU1vZGVNb2Rl SW5mbyAqbW9kZSk7CitpbnQga21zdGVzdF9nZXRfcGlwZV9mcm9tX2NydGNfaWQoaW50IGZkLCBp bnQgY3J0Y19pZCk7Citjb25zdCBjaGFyICprbXN0ZXN0X2Zvcm1hdF9zdHIodWludDMyX3QgZHJt X2Zvcm1hdCk7Citjb25zdCBjaGFyICprbXN0ZXN0X3BpcGVfc3RyKGludCBwaXBlKTsKK3ZvaWQg a21zdGVzdF9nZXRfYWxsX2Zvcm1hdHMoY29uc3QgdWludDMyX3QgKipmb3JtYXRzLCBpbnQgKmZv cm1hdF9jb3VudCk7Citjb25zdCBjaGFyICprbXN0ZXN0X2VuY29kZXJfdHlwZV9zdHIoaW50IHR5 cGUpOworY29uc3QgY2hhciAqa21zdGVzdF9jb25uZWN0b3Jfc3RhdHVzX3N0cihpbnQgdHlwZSk7 Citjb25zdCBjaGFyICprbXN0ZXN0X2Nvbm5lY3Rvcl90eXBlX3N0cihpbnQgdHlwZSk7CisKK3Vp bnQzMl90IGRybV9mb3JtYXRfdG9fYnBwKHVpbnQzMl90IGRybV9mb3JtYXQpOworCisjZW5kaWYg LyogX19JR1RfS01TX0hfXyAqLworCmRpZmYgLS1naXQgYS90ZXN0cy9rbXNfY3Vyc29yX2NyYy5j IGIvdGVzdHMva21zX2N1cnNvcl9jcmMuYwppbmRleCAyYzljYTM1Li40ZWNjOWM4IDEwMDY0NAot LS0gYS90ZXN0cy9rbXNfY3Vyc29yX2NyYy5jCisrKyBiL3Rlc3RzL2ttc19jdXJzb3JfY3JjLmMK QEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgImRybXRlc3QuaCIKICNpbmNsdWRlICJpZ3Rf ZGVidWdmcy5oIgorI2luY2x1ZGUgImlndF9rbXMuaCIKIAogZW51bSBjdXJzb3JfdHlwZSB7CiAJ V0hJVEVfVklTSUJMRSwKZGlmZiAtLWdpdCBhL3Rlc3RzL2ttc19mbGlwLmMgYi90ZXN0cy9rbXNf ZmxpcC5jCmluZGV4IDEwZDhhZTAuLmRhYWVkOGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ttc19mbGlw LmMKKysrIGIvdGVzdHMva21zX2ZsaXAuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgImRy bXRlc3QuaCIKICNpbmNsdWRlICJ0ZXN0ZGlzcGxheS5oIgogI2luY2x1ZGUgInJlbmRlcmNvcHku aCIKKyNpbmNsdWRlICJpZ3Rfa21zLmgiCiAKICNkZWZpbmUgVEVTVF9EUE1TCQkoMSA8PCAwKQog I2RlZmluZSBURVNUX1dJVEhfRFVNTVlfQkNTCSgxIDw8IDEpCmRpZmYgLS1naXQgYS90ZXN0cy9r bXNfcGlwZV9jcmNfYmFzaWMuYyBiL3Rlc3RzL2ttc19waXBlX2NyY19iYXNpYy5jCmluZGV4IDI1 NDUyMzMuLjNiYzllYjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ttc19waXBlX2NyY19iYXNpYy5jCisr KyBiL3Rlc3RzL2ttc19waXBlX2NyY19iYXNpYy5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNs dWRlICJkcm10ZXN0LmgiCiAjaW5jbHVkZSAiaWd0X2RlYnVnZnMuaCIKKyNpbmNsdWRlICJpZ3Rf a21zLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKIAlzdHJ1Y3Qga21zdGVzdF9jb25uZWN0b3JfY29u ZmlnIGNvbmZpZzsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ttc19yZW5kZXIuYyBiL3Rlc3RzL2ttc19y ZW5kZXIuYwppbmRleCBkYzAwOTMyLi4wNTVlYmJiIDEwMDY0NAotLS0gYS90ZXN0cy9rbXNfcmVu ZGVyLmMKKysrIGIvdGVzdHMva21zX3JlbmRlci5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVk ZSAiaW50ZWxfYnVmbWdyLmgiCiAjaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKICNpbmNs dWRlICJpbnRlbF9ncHVfdG9vbHMuaCIKKyNpbmNsdWRlICJpZ3Rfa21zLmgiCiAKIGRybU1vZGVS ZXMgKnJlc291cmNlczsKIGludCBkcm1fZmQ7CmRpZmYgLS1naXQgYS90ZXN0cy9rbXNfc2V0bW9k ZS5jIGIvdGVzdHMva21zX3NldG1vZGUuYwppbmRleCA2YmM3ZGIxLi4zZDE4ZmM3IDEwMDY0NAot LS0gYS90ZXN0cy9rbXNfc2V0bW9kZS5jCisrKyBiL3Rlc3RzL2ttc19zZXRtb2RlLmMKQEAgLTM4 LDYgKzM4LDcgQEAKICNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKICNpbmNsdWRlICJpbnRlbF9i YXRjaGJ1ZmZlci5oIgogI2luY2x1ZGUgImludGVsX2dwdV90b29scy5oIgorI2luY2x1ZGUgImln dF9rbXMuaCIKIAogI2RlZmluZSBNQVhfQ09OTkVDVE9SUyAgMTAKICNkZWZpbmUgTUFYX0NSVENT ICAgICAgIDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3BtX3BjOC5jIGIvdGVzdHMvcG1fcGM4LmMKaW5k ZXggY2RkYjExYi4uZTE3YmUxYiAxMDA2NDQKLS0tIGEvdGVzdHMvcG1fcGM4LmMKKysrIGIvdGVz dHMvcG1fcGM4LmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZl ci5oIgogI2luY2x1ZGUgImludGVsX2dwdV90b29scy5oIgogI2luY2x1ZGUgImk5MTVfZHJtLmgi CisjaW5jbHVkZSAiaWd0X2ttcy5oIgogCiAjZGVmaW5lIE1TUl9QQzhfUkVTCTB4NjMwCiAjZGVm aW5lIE1TUl9QQzlfUkVTCTB4NjMxCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0ZGlzcGxheS5jIGIv dGVzdHMvdGVzdGRpc3BsYXkuYwppbmRleCBmZDE3MmYzLi5kZDllNTZkIDEwMDY0NAotLS0gYS90 ZXN0cy90ZXN0ZGlzcGxheS5jCisrKyBiL3Rlc3RzL3Rlc3RkaXNwbGF5LmMKQEAgLTY1LDYgKzY1 LDcgQEAKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImRybXRlc3QuaCIKICNpbmNs dWRlICJ0ZXN0ZGlzcGxheS5oIgorI2luY2x1ZGUgImlndF9rbXMuaCIKIAogI2luY2x1ZGUgPHN0 ZGxpYi5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgotLSAKMS43LjkuNQoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJ bnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK