ZGlmZiAtLWdpdCBhL2FwL2FwcC9ob3N0YXBkLTIuMTAvaG9zdGFwZC9saWJ3cGFfY2xpZW50LmEgYi9hcC9hcHAvaG9zdGFwZC0yLjEwL2hvc3RhcGQvbGlid3BhX2NsaWVudC5hCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjEzZDYwNi4uMWIzNGU2NQotLS0gYS9hcC9hcHAvaG9zdGFwZC0yLjEwL2hvc3RhcGQvbGlid3BhX2NsaWVudC5hCisrKyBiL2FwL2FwcC9ob3N0YXBkLTIuMTAvaG9zdGFwZC9saWJ3cGFfY2xpZW50LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXAvYXBwL2luY2x1ZGUvd2lmaV9tc2cuaCBiL2FwL2FwcC9pbmNsdWRlL3dpZmlfbXNnLmgKaW5kZXggYWI2YWFjNi4uYTE0OGQ2NyAxMDA3NTUKLS0tIGEvYXAvYXBwL2luY2x1ZGUvd2lmaV9tc2cuaAorKysgYi9hcC9hcHAvaW5jbHVkZS93aWZpX21zZy5oCkBAIC0xMzMsNiArMTMzLDcgQEAKIAlNU0dfQ01EX1dJRklfQ0ZHX1BXRF9SRVEsCiAJTVNHX0NNRF9XSUZJX0NGR19QV0RfUlNQLAogCS8qKioqKioqKioqKioqKip3aWZpIE9QRU5DUFXP+8+iKioqKioqKioqKioqKioqKi8KKwkKIAlNU0dfQ01EX0FQX1NUQV9DT05ORUNURUQsCiAJTVNHX0NNRF9BUF9TVEFfRElTQ09OTkVDVEVELAogCkBAIC0xNTgsNiArMTU5LDExIEBACiAJTVNHX0NNRF9DQVBfV0lGSV9TRVRfQVVUSCwgLy93cGEKIAlNU0dfQ01EX0NBUF9XSUZJX0FQX0VOQUJMRSwgLy9hcCBvbiBvZmYKIAorCU1TR19DTURfQ0FQX1dJRklfVEVTVF9FTkFCTEUsIAkvL3dpZmmy4srUxKPKvcf9tq+z9cq8u68sIDEgaW5zbW9kLzAgcm1tb2QKKworCS8vZm9yIGNhcCBzeW5jIEFQSQorCU1TR19DTURfQ0FQX1dJRklfU1RBX1NUQVRfUkVRLAorCU1TR19DTURfQ0FQX1dJRklfU1RBX1NUQVRfUlNQLAogCiB9OwogCkBAIC01MTUsOCArNTIxLDExIEBACiAvL2NhcDphcGktPndsYW5fcHJveHktPmFwOndsYW5fc2VydmVyCiB0eXBlZGVmIGVudW0KIHsKLQlJTl9XSUZJX1NUQVRVU19ERVZfSU5JVF9GQUlMID0gMCwKLQlJTl9XSUZJX1NUQVRVU19JTlZBTElEX01BQworCUlOX1dJRklfU1RBVFVTX0RJU0FCTEVEID0gMCwKKwlJTl9XSUZJX1NUQVRVU19FTkFCTEVELAorCUlOX1dJRklfU1RBVFVTX0lOVkFMSURfTUFDLAorCUlOX1dJRklfU1RBVFVTX0RFVl9JTklUX0ZBSUwsCisJSU5fV0lGSV9TVEFUVVNfRklSTVdBUkVfQ1JBU0gsCiB9IGlubmVyX3dpZmlfc3RhdHVzX2U7CiAKIC8vbmVpIGJ1IHpodWFuIGh1YW4geW9uZwpAQCAtNTk3LDYgKzYwNiw3IEBACiAJSU5fV0lGSV9XT1JLX01PREVfTUlOID0gLTEsCiAJSU5fV0lGSV9XT1JLX01PREVfQVAwID0gMCwgCS8vMi40RyBzaW5nbGUgYXAgLyBhcCtzdGEKIAlJTl9XSUZJX1dPUktfTU9ERV9BUDEsIAkJLy81RyBzaW5nbGUgYXAgLyBhcCtzdGEKKwlJTl9XSUZJX1dPUktfTU9ERV9TVEEsCiAJSU5fV0lGSV9XT1JLX01PREVfTUFYCiB9IGlubmVyX3dpZmlfd29ya19tb2RlX2U7CiAKQEAgLTY5NCw2ICs3MDQsMTEgQEAKIH0gd2xhbl9zdGFfc3RhdHVzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKKwlpbnQgcnNzaTsKK30gd2xhbl9zdGFfc3RhdF9zeW5jX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgewogCWludCByZXN1bHQ7CiAJd2xhbl9zdGFfc3RhdHVzX3Qgc3RhdHVzOwogfSBzY3dpZmlfc3RhX3N0YXRfcmVzX3Q7CkBAIC03MzQsNyArNzQ5LDcgQEAKIH0gd2xhbl9zdGFfc2Nhbl9saXN0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlpbnQgd29ya19tb2RlOworCWludCB3b3JrX21vZGU7IC8vaW5uZXJfd2lmaV93b3JrX21vZGVfZQogfSB3bGFuX3dvcmtfbW9kZV90Oy8vc2N3aWZpX3dvcmttb2RlX3QKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcC9hcHAvenRlX2NvbW0vYXRfY3RsL3NyYy9hdGNvbmZpZy9leHRhdF9zb2Z0YXBfcmVnaXN0ZXIuYyBiL2FwL2FwcC96dGVfY29tbS9hdF9jdGwvc3JjL2F0Y29uZmlnL2V4dGF0X3NvZnRhcF9yZWdpc3Rlci5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMTI5OWM4Mi4uZWM1NmZmMgotLS0gYS9hcC9hcHAvenRlX2NvbW0vYXRfY3RsL3NyYy9hdGNvbmZpZy9leHRhdF9zb2Z0YXBfcmVnaXN0ZXIuYworKysgYi9hcC9hcHAvenRlX2NvbW0vYXRfY3RsL3NyYy9hdGNvbmZpZy9leHRhdF9zb2Z0YXBfcmVnaXN0ZXIuYwpAQCAtMTM5LDYgKzEzOSwyNyBAQAogCXJldHVybiBBVF9DT05USU5VRTsNCiB9DQogDQoraW50IGV4dF93aWZpX3N0YV9zdGF0X3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikNCit7DQorCWF0X3ByaW50KEFUX05PUk1BTCwgImV4dF93aWZpX3N0YV9zdGF0X3JlcVxuIik7DQorCXJldHVybiBBVF9DT05USU5VRTsNCit9DQorDQoraW50IGV4dF93aWZpX3N0YV9zdGF0X3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQ0KK3sNCisJd2xhbl9zdGFfc3RhdF9zeW5jX3QgKnJzcG1zZyA9ICh3bGFuX3N0YV9zdGF0X3N5bmNfdCAqKXJzcF9tc2c7DQorCWNoYXIgKmF0X3N0ciA9IE5VTEw7DQorCWNoYXIgcnNwX3N0clszMl0gPSB7MH07DQorDQorCXNucHJpbnRmKHJzcF9zdHIsIHNpemVvZihyc3Bfc3RyKSwgIiVkIiwgcnNwbXNnLT5yc3NpKTsNCisJYXRfc3RyID0gYXRfcXVlcnlfcmVzdWx0X2J1aWxkKCJXRlNUQUlORk8iLCByc3Bfc3RyKTsNCisNCisJKnJldCA9IGF0X3N0cjsNCisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOw0KKw0KKwkgcmV0dXJuIEFUX0VORDsNCit9DQorDQogDQogaW50IGV4dF9yZXNldF9yZXEoaW50IGF0X2ZkLGNoYXIgKiBhdF9wYXJhcyx2b2lkICoqcmVzX21zZyxpbnQgKiByZXNfbXNnbGVuKQ0KIHsNCkBAIC0zNjMsOCArMzg0LDEyIEBACiAJCQkJCQkJTVNHX0NNRF9XSUZJX0NGR19QV0RfUkVRLCANCiAJCQkJCQkJTVNHX0NNRF9XSUZJX0NGR19QV0RfUlNQLCANCiAJCQkJCQkJZXh0X3dpZmlfY2ZnX2F1dGhfcmVxLCBleHRfd2lmaV9vcGVyYXRlX3JzcCk7DQotDQotCQ0KKyNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCisJcmVnaXN0ZXJfc2Vydl9mdW5jMigiV0ZTVEFJTkZPPyIsIE1PRFVMRV9JRF9XSUZJLCANCisJCQkJCQkJTVNHX0NNRF9DQVBfV0lGSV9TVEFfU1RBVF9SRVEsIA0KKwkJCQkJCQlNU0dfQ01EX0NBUF9XSUZJX1NUQV9TVEFUX1JTUCwgDQorCQkJCQkJCWV4dF93aWZpX3N0YV9zdGF0X3JlcSwgZXh0X3dpZmlfc3RhX3N0YXRfcnNwKTsNCisjZW5kaWYJDQogCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIlpSRVNFVCIsTU9EVUxFX0lEX01BSU5fQ1RSTCxNU0dfQ01EX1JFU0VUX1JFUVVFU1QsTVNHX0NNRF9SRVNUQVJUX1JTUCxleHRfcmVzZXRfcmVxLGV4dF9yZXN0YXJ0X3JzcCk7Ly+99rmpyfqy+rLiytTTww0KIAlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJaUkVTVEFSVD0iLE1PRFVMRV9JRF9NQUlOX0NUUkwsTVNHX0NNRF9SRVNUQVJUX1JFUVVFU1QsTVNHX0NNRF9SRVNUQVJUX1JTUCxleHRfcmVzdGFydF9yZXEsZXh0X3Jlc3RhcnRfcnNwKTsvL1pSRVNUQVJUPTAsMCyyzsr9MbHtyr5SRVNFVCAvUkVTVEFSVKOsss7K/TKx7cq+yrW8ytbYxvSy2df3yse38dPJsb66y9fUvLrKtc/WDQogCXJlZ2lzdGVyX3NlcnZfZnVuYygiVENfQ09OVFJPTD0iLE1PRFVMRV9JRF9NQUlOX0NUUkwsZXh0X3RjX2NvbnRyb2xfZnVuYyk7DQpkaWZmIC0tZ2l0IGEvYXAvYXBwL3p0ZV9jb21tL3dsYW4vYWljX3Rvb2xzL2FpY3JmX3Rlc3RfZDgwL0FuZHJvaWQubWsgYi9hcC9hcHAvenRlX2NvbW0vd2xhbi9haWNfdG9vbHMvYWljcmZfdGVzdF9kODAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZmY4NjRlCi0tLSAvZGV2L251bGwKKysrIGIvYXAvYXBwL3p0ZV9jb21tL3dsYW4vYWljX3Rvb2xzL2FpY3JmX3Rlc3RfZDgwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGJ0X3Rlc3QKK0xPQ0FMX1NSQ19GSUxFUyA6PSBidF90ZXN0LmMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSB3aWZpX3Rlc3QKK0xPQ0FMX1NSQ19GSUxFUyA6PSB3aWZpX3Rlc3QuYworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKZGlmZiAtLWdpdCBhL2FwL2FwcC96dGVfY29tbS93bGFuL2FpY190b29scy9haWNyZl90ZXN0X2Q4MC9NYWtlZmlsZSBiL2FwL2FwcC96dGVfY29tbS93bGFuL2FpY190b29scy9haWNyZl90ZXN0X2Q4MC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOTcxMTJmCi0tLSAvZGV2L251bGwKKysrIGIvYXAvYXBwL3p0ZV9jb21tL3dsYW4vYWljX3Rvb2xzL2FpY3JmX3Rlc3RfZDgwL01ha2VmaWxlCkBAIC0wLDAgKzEsMzYgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIGluY2x1ZGUgYnVpbGQvY29tbW9uIG1ha2VmaWxlCitpbmNsdWRlICQoQ09NTU9OX01LKQorCitFWEVDID0gd2lmaV90ZXN0CitPQkpTID0gd2lmaV90ZXN0Lm8KKworRVhFQzEgPSBidF90ZXN0CitPQkpTMSA9IGJ0X3Rlc3QubworCisjQ0ZMQUdTICs9IC1JJCh6dGVfYXBwX3BhdGgpL2luY2x1ZGUKKworTERMSUJTICs9IC1scHRocmVhZAorCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyB0YXJnZXRzCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorYWxsOiAkKEVYRUMpICQoRVhFQzEpCisKKyQoRVhFQyk6ICQoT0JKUykKKwkkKENDKSAkKExERkxBR1MpIC1vICRAICReIC1XbCwtLXN0YXJ0LWdyb3VwICQoTERMSUJTKSAtV2wsLS1lbmQtZ3JvdXAKKwlAY3AgJEAgJEAuZWxmCisJCiskKEVYRUMxKTogJChPQkpTMSkKKwkkKENDKSAkKExERkxBR1MpIC1vICRAICReIC1XbCwtLXN0YXJ0LWdyb3VwICQoTERMSUJTKSAtV2wsLS1lbmQtZ3JvdXAKKwlAY3AgJEAgJEAuZWxmCisKK3JvbWZzOgorCSQoUk9NRlNJTlNUKSAkKEVYRUMpIC9iaW4vJChFWEVDKQorCSQoUk9NRlNJTlNUKSAkKEVYRUMxKSAvYmluLyQoRVhFQzEpCisKK2NsZWFuOgorCS1ybSAtZiAkKEVYRUMpICQoRVhFQzEpICouZWxmICouZ2RiICoubworCisKKwpkaWZmIC0tZ2l0IGEvYXAvYXBwL3p0ZV9jb21tL3dsYW4vYWljX3Rvb2xzL2FpY3JmX3Rlc3RfZDgwL2J0X3Rlc3QuYyBiL2FwL2FwcC96dGVfY29tbS93bGFuL2FpY190b29scy9haWNyZl90ZXN0X2Q4MC9idF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2JhMzFjYQotLS0gL2Rldi9udWxsCisrKyBiL2FwL2FwcC96dGVfY29tbS93bGFuL2FpY190b29scy9haWNyZl90ZXN0X2Q4MC9idF90ZXN0LmMKQEAgLTAsMCArMSwxMjM3IEBACisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDxzaWduYWwuaD4NCisjaW5jbHVkZSA8dW5pc3RkLmg+DQorI2luY2x1ZGUgPGVycm5vLmg+DQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KKyNpbmNsdWRlIDxwdGhyZWFkLmg+DQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2luY2x1ZGUgPHRlcm1pb3MuaD4NCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4NCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPg0KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4NCisjaW5jbHVkZSA8bmV0L2lmLmg+DQorDQorLy90b29sIHJvbGUNCisjZGVmaW5lIFNFUlZFUiAwDQorI2RlZmluZSBDTElFTlQgMQ0KKyNkZWZpbmUgQ0xJRU5UX0RJUkVDVCAyDQorI2RlZmluZSBXTEFOX0NMSUVOVCAzDQorDQorLy9pbnRlcmZhY2UNCisjZGVmaW5lIFVBUlQgICAgMA0KKyNkZWZpbmUgVVNCICAgICAxDQorI2RlZmluZSBXTEFOICAgIDINCisNCisvL3VhcnQgcGFyYW0NCisjZGVmaW5lIEJBVURSQVRFIDE1MDAwMDANCisjZGVmaW5lIERBVEFCSVRTIDgNCisjZGVmaW5lIFBBUlRZICdOJw0KKyNkZWZpbmUgU1RPUCAnMScNCisjZGVmaW5lIFNPRlRXQVJFX0hBTkRTSEFLRSAwDQorI2RlZmluZSBIQVJEV0FSRV9IQU5EU0hBS0UgMQ0KKw0KKy8vc29ja2V0IHBhcmFtDQorI2RlZmluZSBCVF9IQ0lfVE9PTF9QT1JUIDUwMDENCisjZGVmaW5lIFNPQ0tFUl9CVUZGRVJfU0laRSAxMDI0DQorDQorI2RlZmluZSBPSyAwDQorI2RlZmluZSBFUlIgLTENCisjZGVmaW5lIEZBTFNFIDANCisjZGVmaW5lIFRSVUUgMQ0KKw0KKyNkZWZpbmUgRE9XTl9GV19DRkcgICAgICAgICAgICAgX0lPVygnRScsIDE3NiwgaW50KQ0KKyNkZWZpbmUgR0VUX1VTQl9JTkZPICAgICAgICAgICAgX0lPUignRScsIDE4MCwgaW50KQ0KKw0KKyNkZWZpbmUgV0xBTl9DTURfTUFYX0NOVCAgICAgICAgMjU2DQorI2RlZmluZSBUWFJYX1BBUkEJCQkJCQkJCVNJT0NERVZQUklWQVRFKzENCisNCisjZGVmaW5lIEFSR19JUyhfc3RyKSAoIXN0cmNtcChhcmd2W2NvbW1hbmRfY291bnRlcl0sIF9zdHIpKQ0KKw0KK2ludCBzZXJ2ZXJfb3JfY2xpZW50ID0gU0VSVkVSOw0KK2ludCBpbnRlcmZhY2UgPSBVU0I7DQoraW50IGJ0X2Rldl9mZCA9IDA7DQorDQorY2hhciBzX2JhdWRyYXRlWzhdOw0KKw0KK2NoYXIqIHNfaGNpX2NvbW1hbmRbMjU2XTsNCit1aW50OF90IHJfaGNpX2NvbW1hbmRbMjU2XTsNCitpbnQgcl9oY2lfY29tbWFuZF9sZW47DQorY2hhciB3X2lmbmFtZVs2NF07DQorY2hhciAqd19jb21tYW5kW1dMQU5fQ01EX01BWF9DTlRdOw0KK2NoYXIgaGNpX2V2ZW50WzI1Nl07DQorDQorY2hhciBkZXZfcGF0aFtdID0gIi9kZXYvYWljYnRfZGV2IjsNCisNCitjaGFyIGhjaV9yZXNldFtdID0geyAweDAxLCAweDAzLCAweDBjLCAweDAwIH07DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgYW5kcm9pZF93aWZpX3ByaXZfY21kIHsNCisgICAgY2hhciAqYnVmOw0KKyAgICBpbnQgdXNlZF9sZW47DQorICAgIGludCB0b3RhbF9sZW47DQorfSBhbmRyb2lkX3dpZmlfcHJpdl9jbWQ7DQorDQorZW51bXsNCisgICAgbWF4THRoX0RIMT0yNywNCisgICAgbWF4THRoX0RIMz0xMzgsDQorICAgIG1heEx0aF9ESDU9MzM5LA0KKyAgICBtYXhMdGhfMkRIMT01NCwNCisgICAgbWF4THRoXzJESDM9MzY3LA0KKyAgICBtYXhMdGhfMkRINT02NzksDQorICAgIG1heEx0aF8zREgxPTgzLA0KKyAgICBtYXhMdGhfM0RIMz01NTIsDQorICAgIG1heEx0aF8zREg1PTEwMjEsDQorfTsNCisNCitlbnVtew0KKyAgICB0eHN0b3AsDQorICAgIHJ4c3RvcCwNCisgICAgDQorICAgIHR4REgxLA0KKyAgICB0eERIMywNCisgICAgdHhESDUsDQorICAgIHR4MkRIMSwNCisgICAgdHgyREgzLA0KKyAgICB0eDJESDUsDQorICAgIHR4M0RIMSwNCisgICAgdHgzREgzLA0KKyAgICB0eDNESDUsDQorICAgIHJ4REgxLA0KKyAgICByeERIMywNCisgICAgcnhESDUsDQorICAgIHJ4MkRIMSwNCisgICAgcngyREgzLA0KKyAgICByeDJESDUsDQorICAgIHJ4M0RIMSwNCisgICAgcngzREgzLA0KKyAgICByeDNESDUsDQorDQorICAgIHNjcGNfc3RhcnQsDQorICAgIHNjcGNfc3RvcCwNCisNCisgICAgbGVfdHgsDQorICAgIGxlX3J4LA0KK307DQorDQorc3RydWN0IGJ0X3Rlc3RfYXJnc190ew0KKyAgICBpbnQgdHlwZTsNCisgICAgaW50IHBhdHRlcm47DQorICAgIGludCBob3BwaW5nOw0KKyAgICBpbnQgY2hhbm5lbDsNCisgICAgaW50IGlzX2VkcjsNCisgICAgaW50IHdoaXRlbmluZzsNCisgICAgaW50IHR4X3B3cjsNCisgICAgaW50IGxlbjsNCisgICAgdWludDhfdCBhZGRyWzZdOw0KKyAgICBpbnQgbGVfcGh5Ow0KKyAgICBpbnQgbW9kX2lkeDsNCit9YnRfdGVzdF9hcmdzPXsNCisgICAgLndoaXRlbmluZyA9IDB4MDEsDQorICAgIC5hZGRyID0geyAweDBBLCAweDFDLCAweDZCLCAweEM2LCAweDk2LCAweDdFIH0sDQorICAgIC5sZV9waHkgPSAweDAxLA0KK307DQorDQordm9pZCBoZWxwZXIoKXsNCisgICAgcHJpbnRmKCJcdDwtcz4gdG8gYmUgdG9vbCBzZXJ2aWNlLiBleC4gXCJidF90ZXN0IC1zIHVhcnQgMTE1MjAwIC9kZXYvdHR5UzBcIiBvciBcImJ0X3Rlc3QgLXMgdXNiXCIgb3IgXCJidF90ZXN0IC1zIHdsYW4gd2xhbjBcIlxuIik7DQorICAgIC8vcHJpbnRmKCJcdDwtcz4gdG8gYmUgdG9vbCBzZXJ2aWNlLiBleC4gLXMgdWFydCAxMTUyMDAgbm9mbG93IGFuZCAtcyB1c2JcbiIpOw0KKyAgICBwcmludGYoIlx0PC1jPiB0byBzZW5kIGhjaSBjbWQgdG8gaW50ZXJmYWNlLlxuIik7DQorICAgIHByaW50ZigiXHQ8LXc+IHRvIHNlbmQgd2xhbiBjbWQgdG8gaW50ZXJmYWNlLlxuIik7DQorICAgIHByaW50ZigiXHQ8LUg+IHRvIHNlbmQgaGNpIGNtZCB0byBpbnRlcmZhY2Ugd2l0aCBodW1hbiByZWFkYWJsZSBvcHRpb25zLlxuIik7DQorICAgIHByaW50ZigiXHQgICAgIDxjb21tYW5kPiBbPGFyZ3M+IC4uLl1cbiIpOw0KKyAgICBwcmludGYoIlx0ICAgICBUeCB0ZXN0IGNvbW1hbmRzOlxuIik7DQorICAgIHByaW50ZigiXHQgICAgICAgdHhESDEgfCB0eERIMyB8IHR4REg1IHwgdHgyREgxIHwgdHgyREgzIHwgdHgyREg1IHwgdHgzREgxIHwgdHgzREgzIHwgdHgzREg1IHwgdHhzdG9wIHwgbGVfdHhcbiIpOw0KKyAgICBwcmludGYoIlx0ICAgICBSeCB0ZXN0IGNvbW1hbmRzOlxuIik7DQorICAgIHByaW50ZigiXHQgICAgICAgcnhESDEgfCByeERIMyB8IHJ4REg1IHwgcngyREgxIHwgcngyREgzIHwgcngyREg1IHwgcngzREgxIHwgcngzREgzIHwgcngzREg1IHwgcnhzdG9wIHwgbGVfcnhcbiIpOw0KKyAgICBwcmludGYoIlx0ICAgICBBcmdzOlxuIik7DQorICAgIHByaW50ZigiXHQgICAgICAgW3BhdHQgfCBwa3RfcGxkIDxwYXR0ZXJuPl1cbiIpOw0KKyAgICBwcmludGYoIlx0ICAgICAgIFtlbl9ob3AgfCBkaXNfaG9wXVxuIik7DQorICAgIHByaW50ZigiXHQgICAgICAgW2NobmwgPGRlY2ltYWwgY2hhbm5lbD5dXG4iKTsNCisgICAgcHJpbnRmKCJcdCAgICAgICBbZW5fd2h0IHwgZGlzX3dodF1cbiIpOw0KKyAgICBwcmludGYoIlx0ICAgICAgIFtsZW4gPGRlY2ltYWwgcGFja2V0IGxlbmd0aD5dXG4iKTsNCisgICAgcHJpbnRmKCJcdCAgICAgICBbYWRkciA8aGV4IE1BQyBhZGRyZXNzPl1cbiIpOw0KKyAgICBwcmludGYoIlx0ICAgICAgIFtsZV9waHkgPHBoeT5dXG4iKTsNCisgICAgcHJpbnRmKCJcdCAgICAgICBbbW9kX2lkeCA8bW9kdWxhdGlvbiBpbmRleD5dXG4iKTsNCisgICAgcHJpbnRmKCJcdCAgICAgU2luZ2xlIGNhcnJpZXIgdGVzdCBjb21tYW5kOlxuIik7DQorICAgIHByaW50ZigiXHQgICAgICAgc2NwYyAoc3RhcnQgfCBzdG9wKVxuIik7DQorICAgIHByaW50ZigiXHQgICAgIEFyZ3M6XG4iKTsNCisgICAgcHJpbnRmKCJcdCAgICAgICBbY2hubCA8ZGVjaW1hbCBjaGFubmVsPl1cbiIpOw0KKyAgICBwcmludGYoIlx0ICAgICAgIFt0eF9wd3IgPGRlY2ltYWwgdHggcG93ZXIgbGV2ZWw+XVxuIik7DQorfQ0KKw0KK2ludCBwYXJzZV9jbWRfbGluZShpbnQgYXJnYywgY2hhciAqKmFyZ3Ypew0KKyAgICBpbnQgY29tbWFuZF9udW1iZXIgPSBhcmdjOw0KKyAgICBpbnQgY29tbWFuZF9jb3VudGVyID0gMTsNCisgICAgaW50IGhjaV9jb21tYW5kX2NvdW50ZXIgPSAwOw0KKyAgICAvL2ludCBlcnJvcl9jb21tYW5kID0gMDsNCisNCisgICAgd2hpbGUoY29tbWFuZF9jb3VudGVyIDwgY29tbWFuZF9udW1iZXIpew0KKyAgICAgICAgaWYoIXN0cmNtcChhcmd2W2NvbW1hbmRfY291bnRlcl0sICItcyIpKXsNCisgICAgICAgICAgICBpZighKGNvbW1hbmRfbnVtYmVyID49IDMpKXsNCisgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBjb21tYW5kIFxyXG4iKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcHJpbnRmKCJidF9oY2lfdG9vbCBzZXJ2ZXIgc2V0dGluZ1xyXG4iKTsNCisgICAgICAgICAgICBzZXJ2ZXJfb3JfY2xpZW50ID0gU0VSVkVSOw0KKyAgICAgICAgICAgIGNvbW1hbmRfY291bnRlcisrOw0KKyAgICAgICAgICAgIGlmKCFzdHJjbXAoYXJndltjb21tYW5kX2NvdW50ZXJdLCAidXNiIikpew0KKyAgICAgICAgICAgICAgICBwcmludGYoInVzZSBVU0JcclxuIik7DQorICAgICAgICAgICAgICAgIGludGVyZmFjZSA9IFVTQjsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOw0KKyAgICAgICAgICAgIH1lbHNlIGlmKCFzdHJjbXAoYXJndltjb21tYW5kX2NvdW50ZXJdLCAidWFydCIpKXsNCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlID0gVUFSVDsNCisgICAgICAgICAgICAgICAgaWYoY29tbWFuZF9udW1iZXIgIT0gNSl7DQorICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGNvbW1hbmQgXHJcbiIpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXIrKzsNCisgICAgICAgICAgICAgICAgbWVtY3B5KHNfYmF1ZHJhdGUsIGFyZ3ZbY29tbWFuZF9jb3VudGVyXSwgc3RybGVuKGFyZ3ZbY29tbWFuZF9jb3VudGVyXSkpOw0KKyAgICAgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXIrKzsNCisgICAgICAgICAgICAgICAgbWVtc2V0KGRldl9wYXRoLCAwLCBzdHJsZW4oZGV2X3BhdGgpKTsNCisgICAgICAgICAgICAgICAgbWVtY3B5KGRldl9wYXRoLCBhcmd2W2NvbW1hbmRfY291bnRlcl0sIHN0cmxlbihhcmd2W2NvbW1hbmRfY291bnRlcl0pKTsNCisgICAgICAgICAgICAgICAgcHJpbnRmKCJ1c2UgVUFSVCAlZCAlc1xyXG4iLCBhdG9pKHNfYmF1ZHJhdGUpLCBkZXZfcGF0aCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsNCisgICAgICAgICAgICB9ZWxzZSBpZighc3RyY21wKGFyZ3ZbY29tbWFuZF9jb3VudGVyXSwgIndsYW4iKSl7DQorICAgICAgICAgICAgICAgIGludGVyZmFjZSA9IFdMQU47DQorICAgICAgICAgICAgICAgIGlmKGNvbW1hbmRfbnVtYmVyICE9IDQpew0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBjb21tYW5kIFxyXG4iKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgICAgICAgICAgICAgIG1lbWNweSh3X2lmbmFtZSwgYXJndltjb21tYW5kX2NvdW50ZXJdLCBzdHJsZW4oYXJndltjb21tYW5kX2NvdW50ZXJdKSk7DQorICAgICAgICAgICAgICAgIHByaW50ZigidXNlIFdMQU4gJXNcclxuIiwgd19pZm5hbWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7DQorICAgICAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgICAgIHByaW50ZigiaW50ZXJmYWNlIHNldCBlcnJvclxyXG4iKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9ZWxzZSBpZighc3RyY21wKGFyZ3ZbY29tbWFuZF9jb3VudGVyXSwgIi1jIikpew0KKyAgICAgICAgICAgIHNlcnZlcl9vcl9jbGllbnQgPSBDTElFTlQ7DQorICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgICAgICAgICAgaGNpX2NvbW1hbmRfY291bnRlciA9IDA7DQorICAgICAgICAgICAgd2hpbGUoY29tbWFuZF9jb3VudGVyIDwgY29tbWFuZF9udW1iZXIpew0KKyAgICAgICAgICAgICAgICBzX2hjaV9jb21tYW5kW2hjaV9jb21tYW5kX2NvdW50ZXIrK10gPSBhcmd2W2NvbW1hbmRfY291bnRlcl07DQorICAgICAgICAgICAgICAgIGNvbW1hbmRfY291bnRlcisrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gT0s7DQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjb21tYW5kX2NvdW50ZXJdLCAiLXciKSkgew0KKyAgICAgICAgICAgIGludCB3X2NvbW1hbmRfY291bnRlciA9IDA7DQorICAgICAgICAgICAgc2VydmVyX29yX2NsaWVudCA9IFdMQU5fQ0xJRU5UOw0KKyAgICAgICAgICAgIGlmIChjb21tYW5kX251bWJlciA+PSBXTEFOX0NNRF9NQVhfQ05UKSB7DQorICAgICAgICAgICAgICAgIHByaW50ZigidG9vIG11Y2ggYXJnc1xyXG4iKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgICAgICAgICAgd2hpbGUgKGNvbW1hbmRfY291bnRlciA8IGNvbW1hbmRfbnVtYmVyKSB7DQorICAgICAgICAgICAgICAgIHdfY29tbWFuZFt3X2NvbW1hbmRfY291bnRlcisrXSA9IGFyZ3ZbY29tbWFuZF9jb3VudGVyXTsNCisgICAgICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBPSzsNCisgICAgICAgIH1lbHNlIGlmIChBUkdfSVMoIi1tIikpew0KKyAgICAgICAgICAgIC8vIHJlc2VydmVkIGZvciBhIHZhcmlldHkgb2YgY2hpcCBtb2RlbHMNCisgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCItSCIpKXsNCisgICAgICAgICAgICBzZXJ2ZXJfb3JfY2xpZW50ID0gQ0xJRU5UX0RJUkVDVDsNCisgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXIrKzsNCisgICAgICAgICAgICBoY2lfY29tbWFuZF9jb3VudGVyID0gMDsNCisgICAgICAgICAgICB3aGlsZShjb21tYW5kX2NvdW50ZXIgPCBjb21tYW5kX251bWJlcil7DQorICAgICAgICAgICAgICAgIGlmIChBUkdfSVMoInR4c3RvcCIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy50eXBlID0gdHhzdG9wOw0KKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoInR4REgxIikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSB0eERIMTsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZW4gPSBtYXhMdGhfREgxOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygidHhESDMiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSA9IHR4REgzOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IG1heEx0aF9ESDM7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJ0eERINSIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy50eXBlID0gdHhESDU7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MubGVuID0gbWF4THRoX0RINTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoInR4MkRIMSIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy50eXBlID0gdHgyREgxOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IG1heEx0aF8yREgxOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmlzX2VkciA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJ0eDJESDMiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSA9IHR4MkRIMzsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZW4gPSBtYXhMdGhfMkRIMzsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5pc19lZHIgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygidHgyREg1Iikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSB0eDJESDU7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MubGVuID0gbWF4THRoXzJESDU7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MuaXNfZWRyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoInR4M0RIMSIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy50eXBlID0gdHgzREgxOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IG1heEx0aF8zREgxOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmlzX2VkciA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJ0eDNESDMiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSA9IHR4M0RIMzsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZW4gPSBtYXhMdGhfM0RIMzsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5pc19lZHIgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygidHgzREg1Iikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSB0eDNESDU7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MubGVuID0gbWF4THRoXzNESDU7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MuaXNfZWRyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoImxlX3R4Iikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSBsZV90eDsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZW4gPSAweEZGOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgaWYgKEFSR19JUygicnhzdG9wIikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSByeHN0b3A7DQorICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXIrKzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygicnhESDEiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSA9IHJ4REgxOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IG1heEx0aF9ESDE7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJyeERIMyIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy50eXBlID0gcnhESDM7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MubGVuID0gbWF4THRoX0RIMzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoInJ4REg1Iikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSByeERINTsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZW4gPSBtYXhMdGhfREg1Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygicngyREgxIikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSByeDJESDE7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MubGVuID0gbWF4THRoXzJESDE7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MuaXNfZWRyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoInJ4MkRIMyIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy50eXBlID0gcngyREgzOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IG1heEx0aF8yREgzOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmlzX2VkciA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJyeDJESDUiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSA9IHJ4MkRINTsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZW4gPSBtYXhMdGhfMkRINTsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5pc19lZHIgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygicngzREgxIikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSByeDNESDE7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MubGVuID0gbWF4THRoXzNESDE7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MuaXNfZWRyID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoInJ4M0RIMyIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy50eXBlID0gcngzREgzOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IG1heEx0aF8zREgzOw0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmlzX2VkciA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJyeDNESDUiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSA9IHJ4M0RINTsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZW4gPSBtYXhMdGhfM0RINTsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5pc19lZHIgPSBUUlVFOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygibGVfcngiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSA9IGxlX3J4Ow0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IDB4RkY7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBpZiAoQVJHX0lTKCJzY3BjIikpew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfY291bnRlcisxPj1jb21tYW5kX251bWJlcikNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJSOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorDQorICAgICAgICAgICAgICAgICAgICBpZiAoQVJHX0lTKCJzdGFydCIpKXsNCisgICAgICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHlwZSAgPSBzY3BjX3N0YXJ0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoInN0b3AiKSl7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnR5cGUgPSBzY3BjX3N0b3A7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBpZiAoQVJHX0lTKCJwYXR0IikgfHwgQVJHX0lTKCJwa3RfcGxkIikpew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfY291bnRlcisxPj1jb21tYW5kX251bWJlcikNCisgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJSOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgICAgICAgICAgICAgICAgICBpZiAoQVJHX0lTKCJQUkJTOSIpIHx8IEFSR19JUygiMDAiKSl7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnBhdHRlcm4gPSAweDAwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoIjExMTEwMDAwIikgfHwgQVJHX0lTKCIwMSIpKXsNCisgICAgICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MucGF0dGVybiA9IDB4MDE7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygiMTAxMDEwMTAiKSB8fCBBUkdfSVMoIjAyIikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5wYXR0ZXJuID0gMHgwMjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJQUkJTMTUiKSB8fCBBUkdfSVMoIjAzIikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5wYXR0ZXJuID0gMHgwMzsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCIxMTExMTExMSIpIHx8IEFSR19JUygiMDQiKSl7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnBhdHRlcm4gPSAweDA0Ow0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoIjAwMDAwMDAwIikgfHwgQVJHX0lTKCIwNSIpKXsNCisgICAgICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MucGF0dGVybiA9IDB4MDU7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFSR19JUygiMDAwMDExMTEiKSB8fCBBUkdfSVMoIjA2Iikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5wYXR0ZXJuID0gMHgwNjsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCIwMTAxMDEwMSIpIHx8IEFSR19JUygiMDciKSl7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLnBhdHRlcm4gPSAweDA3Ow0KKyAgICAgICAgICAgICAgICAgICAgfSANCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGlmIChBUkdfSVMoImVuX2hvcCIpKXsNCisgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5ob3BwaW5nID0gVFJVRTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoImRpc19ob3AiKSl7DQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MuaG9wcGluZyA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgaWYgKEFSR19JUygiY2hubCIpKXsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kX2NvdW50ZXIrMT49Y29tbWFuZF9udW1iZXIpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfY291bnRlcisrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgY2hhcioqIGRpc2NhcmQgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MuY2hhbm5lbCA9IHN0cnRvbChhcmd2W2NvbW1hbmRfY291bnRlcl0sIGRpc2NhcmQsMTApOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgaWYgKEFSR19JUygiZW5fZWRyIikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmlzX2VkciA9IFRSVUU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJkaXNfZWRyIikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmlzX2VkciA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgaWYgKEFSR19JUygiZW5fd2h0Iikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLndoaXRlbmluZyA9IDB4MDA7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVJHX0lTKCJkaXNfd2h0Iikpew0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLndoaXRlbmluZyA9IDB4MDE7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBpZiAoQVJHX0lTKCJsZW4iKSl7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZF9jb3VudGVyKzE+PWNvbW1hbmRfbnVtYmVyKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXIrKzsNCisNCisgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBkaXNjYXJkID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBzdHJ0b2woYXJndltjb21tYW5kX2NvdW50ZXJdLCBkaXNjYXJkLCAxMCk7DQorDQorICAgICAgICAgICAgICAgICAgICBpZiAoIWxlbiB8fCBsZW4gPiBidF90ZXN0X2FyZ3MubGVuKXsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJSOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmxlbiA9IGxlbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGlmIChBUkdfSVMoImFkZHIiKSl7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZF9jb3VudGVyKzE+PWNvbW1hbmRfbnVtYmVyKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXIrKzsNCisNCisgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBkaXNjYXJkID0gTlVMTDsNCisgICAgICAgICAgICAgICAgICAgIGludCBoZWFkID0gMDsNCisNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChoZWFkPHN0cmxlbihhcmd2W2NvbW1hbmRfY291bnRlcl0pKXsNCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRlbXBbMl07DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweSh0ZW1wLCBhcmd2W2NvbW1hbmRfY291bnRlcl0raGVhZCwgMik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLmFkZHJbaGVhZC8yXSA9IHN0cnRvbCh0ZW1wLCBkaXNjYXJkLCAxNik7DQorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCs9MjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGlmIChBUkdfSVMoInR4X3B3ciIpKXsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kX2NvdW50ZXIrMT49Y29tbWFuZF9udW1iZXIpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfY291bnRlcisrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgY2hhcioqIGRpc2NhcmQgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBidF90ZXN0X2FyZ3MudHhfcHdyID0gc3RydG9sKGFyZ3ZbY29tbWFuZF9jb3VudGVyXSwgZGlzY2FyZCwxMCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBpZiAoQVJHX0lTKCJsZV9waHkiKSl7DQorICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZF9jb3VudGVyKzE+PWNvbW1hbmRfbnVtYmVyKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlI7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2NvdW50ZXIrKzsNCisgICAgICAgICAgICAgICAgICAgIGlmIChBUkdfSVMoIjAxIikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZV9waHkgPSAweDAxOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoIjAyIikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZV9waHkgPSAweDAyOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoIjAzIikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZV9waHkgPSAweDAzOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoIjA0Iikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5sZV9waHkgPSAweDA0Ow0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgaWYgKEFSR19JUygibW9kX2lkeCIpKXsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kX2NvdW50ZXIrMT49Y29tbWFuZF9udW1iZXIpDQorICAgICAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfY291bnRlcisrOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEFSR19JUygiMDAiKSl7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnRfdGVzdF9hcmdzLm1vZF9pZHggPSAweDAwOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBUkdfSVMoIjAxIikpew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0X3Rlc3RfYXJncy5tb2RfaWR4ID0gMHgwMTsNCisgICAgICAgICAgICAgICAgICAgIH0gDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChjb21tYW5kX2NvdW50ZXI9PWNvbW1hbmRfbnVtYmVyKXsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOw0KKyAgICAgICAgICAgIH0gZWxzZXsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlew0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIi1oIikgIT0gMCkgew0KKyAgICAgICAgICAgICAgICBwcmludGYoInVua25vdyBjb21tYW5kICVzIFxyXG4iLCBhcmd2W2NvbW1hbmRfY291bnRlcl0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBoZWxwZXIoKTsNCisgICAgICAgICAgICByZXR1cm4gRVJSOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgY29tbWFuZF9jb3VudGVyKys7DQorICAgIH0NCisNCisgICAgaGVscGVyKCk7DQorICAgIHJldHVybiBFUlI7DQorDQorfQ0KKw0KK3ZvaWQgdWFydF9zZXRfb3B0aW9ucyhpbnQgYmF1ZHJhdGUsIGludCBkYXRhYml0cywNCisgICAgY2hhciBwYXJpdHksIGNoYXIgc3RvcCwgaW50IHNvZnR3YXJlSGFuZHNoYWtlLCBpbnQgaGFyZHdhcmVIYW5kc2hha2UpDQorew0KKyAgICBzdHJ1Y3QgdGVybWlvcyBuZXd0aW87DQorICAgIGlmICh0Y2dldGF0dHIoYnRfZGV2X2ZkLCAmbmV3dGlvKSE9MCkNCisgICAgew0KKyAgICBwcmludGYoInRjZ2V0YXR0cigpIDMgZmFpbGVkIFxuIik7DQorICAgIH0NCisNCisgICAgc3BlZWRfdCBfYmF1ZD0wOw0KKyAgICBwcmludGYoInNldCBiYXVkcmF0ZTolZFxuIiwgYmF1ZHJhdGUpOw0KKw0KKyAgICBzd2l0Y2ggKGJhdWRyYXRlKQ0KKyAgICB7DQorICAgICNpZmRlZiBCMA0KKyAgICBjYXNlICAgICAgMDogX2JhdWQ9QjA7ICAgICBicmVhazsNCisgICAgI2VuZGlmDQorICAgICNpZmRlZiBCNTANCisgICAgY2FzZSAgICAgNTA6IF9iYXVkPUI1MDsgICAgYnJlYWs7DQorICAgICNlbmRpZg0KKyAgICAjaWZkZWYgQjc1DQorICAgIGNhc2UgICAgIDc1OiBfYmF1ZD1CNzU7ICAgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIxMTANCisgICAgY2FzZSAgICAxMTA6IF9iYXVkPUIxMTA7ICAgYnJlYWs7DQorICAgICNlbmRpZg0KKyAgICAjaWZkZWYgQjEzNA0KKyAgICBjYXNlICAgIDEzNDogX2JhdWQ9QjEzNDsgICBicmVhazsNCisgICAgI2VuZGlmDQorICAgICNpZmRlZiBCMTUwDQorICAgIGNhc2UgICAgMTUwOiBfYmF1ZD1CMTUwOyAgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIyMDANCisgICAgY2FzZSAgICAyMDA6IF9iYXVkPUIyMDA7ICAgYnJlYWs7DQorICAgICNlbmRpZg0KKyAgICAjaWZkZWYgQjMwMA0KKyAgICBjYXNlICAgIDMwMDogX2JhdWQ9QjMwMDsgICBicmVhazsNCisgICAgI2VuZGlmDQorICAgICNpZmRlZiBCNjAwDQorICAgIGNhc2UgICAgNjAwOiBfYmF1ZD1CNjAwOyAgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIxMjAwDQorICAgIGNhc2UgICAxMjAwOiBfYmF1ZD1CMTIwMDsgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIxODAwDQorICAgIGNhc2UgICAxODAwOiBfYmF1ZD1CMTgwMDsgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIyNDAwDQorICAgIGNhc2UgICAyNDAwOiBfYmF1ZD1CMjQwMDsgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEI0ODAwDQorICAgIGNhc2UgICA0ODAwOiBfYmF1ZD1CNDgwMDsgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEI3MjAwDQorICAgIGNhc2UgICA3MjAwOiBfYmF1ZD1CNzIwMDsgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEI5NjAwDQorICAgIGNhc2UgICA5NjAwOiBfYmF1ZD1COTYwMDsgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIxNDQwMA0KKyAgICBjYXNlICAxNDQwMDogX2JhdWQ9QjE0NDAwOyBicmVhazsNCisgICAgI2VuZGlmDQorICAgICNpZmRlZiBCMTkyMDANCisgICAgY2FzZSAgMTkyMDA6IF9iYXVkPUIxOTIwMDsgYnJlYWs7DQorICAgICNlbmRpZg0KKyAgICAjaWZkZWYgQjI4ODAwDQorICAgIGNhc2UgIDI4ODAwOiBfYmF1ZD1CMjg4MDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIzODQwMA0KKyAgICBjYXNlICAzODQwMDogX2JhdWQ9QjM4NDAwOyBicmVhazsNCisgICAgI2VuZGlmDQorICAgICNpZmRlZiBCNTc2MDANCisgICAgY2FzZSAgNTc2MDA6IF9iYXVkPUI1NzYwMDsgYnJlYWs7DQorICAgICNlbmRpZg0KKyAgICAjaWZkZWYgQjc2ODAwDQorICAgIGNhc2UgIDc2ODAwOiBfYmF1ZD1CNzY4MDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIxMTUyMDANCisgICAgY2FzZSAxMTUyMDA6IF9iYXVkPUIxMTUyMDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIxMjgwMDANCisgICAgY2FzZSAxMjgwMDA6IF9iYXVkPUIxMjgwMDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIyMzA0MDANCisgICAgY2FzZSAyMzA0MDA6IF9iYXVkPUIyMzA0MDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEI0NjA4MDANCisgICAgY2FzZSA0NjA4MDA6IF9iYXVkPUI0NjA4MDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEI1NzYwMDANCisgICAgY2FzZSA1NzYwMDA6IF9iYXVkPUI1NzYwMDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEI5MjE2MDANCisgICAgY2FzZSA5MjE2MDA6IF9iYXVkPUI5MjE2MDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIxNTAwMDAwDQorICAgIGNhc2UgMTUwMDAwMDogX2JhdWQ9QjE1MDAwMDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIEIyMDAwMDAwDQorICAgIGNhc2UgMjAwMDAwMDogX2JhdWQ9QjIwMDAwMDA7IGJyZWFrOw0KKyAgICAjZW5kaWYNCisNCisgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNmc2V0b3NwZWVkKCZuZXd0aW8sIChzcGVlZF90KV9iYXVkKTsNCisgICAgY2ZzZXRpc3BlZWQoJm5ld3RpbywgKHNwZWVkX3QpX2JhdWQpOw0KKw0KKyAgICAvKiBXZSBnZW5lcmF0ZSBtYXJrIGFuZCBzcGFjZSBwYXJpdHkgb3Vyc2VsZi4gKi8NCisgICAgaWYgKGRhdGFiaXRzID09IDcgJiYgKHBhcml0eT09J00nIHx8IHBhcml0eSA9PSAnUycpKQ0KKyAgICB7DQorICAgICAgICBkYXRhYml0cyA9IDg7DQorICAgIH0NCisgICAgc3dpdGNoIChkYXRhYml0cykNCisgICAgew0KKyAgICBjYXNlIDU6DQorICAgICAgICBuZXd0aW8uY19jZmxhZyA9IChuZXd0aW8uY19jZmxhZyAmIH5DU0laRSkgfCBDUzU7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSA2Og0KKyAgICAgICAgbmV3dGlvLmNfY2ZsYWcgPSAobmV3dGlvLmNfY2ZsYWcgJiB+Q1NJWkUpIHwgQ1M2Ow0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgNzoNCisgICAgICAgIG5ld3Rpby5jX2NmbGFnID0gKG5ld3Rpby5jX2NmbGFnICYgfkNTSVpFKSB8IENTNzsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDg6DQorICAgIGRlZmF1bHQ6DQorICAgICAgICBuZXd0aW8uY19jZmxhZyA9IChuZXd0aW8uY19jZmxhZyAmIH5DU0laRSkgfCBDUzg7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBuZXd0aW8uY19jZmxhZyB8PSBDTE9DQUwgfCBDUkVBRDsNCisNCisgICAgLy9wYXJpdHkNCisgICAgbmV3dGlvLmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOw0KKyAgICBpZiAocGFyaXR5ID09ICdFJykNCisgICAgew0KKyAgICAgICAgbmV3dGlvLmNfY2ZsYWcgfD0gUEFSRU5COw0KKyAgICB9DQorICAgIGVsc2UgaWYgKHBhcml0eT09ICdPJykNCisgICAgew0KKyAgICAgICAgbmV3dGlvLmNfY2ZsYWcgfD0gKFBBUkVOQiB8IFBBUk9ERCk7DQorICAgIH0NCisNCisgICAgLy9oYXJkd2FyZSBoYW5kc2hha2UNCisgICAgbmV3dGlvLmNfY2ZsYWcgJj0gfkNSVFNDVFM7DQorDQorICAgIC8vc3RvcGJpdHMNCisgICAgaWYgKHN0b3A9PScyJykNCisgICAgew0KKyAgICAgICAgbmV3dGlvLmNfY2ZsYWcgfD0gQ1NUT1BCOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgbmV3dGlvLmNfY2ZsYWcgJj0gfkNTVE9QQjsNCisgICAgfQ0KKw0KKyAgICBuZXd0aW8uY19pZmxhZz1JR05CUks7DQorDQorICAgIC8vc29mdHdhcmUgaGFuZHNoYWtlDQorICAgIGlmIChzb2Z0d2FyZUhhbmRzaGFrZSkNCisgICAgew0KKyAgICAgICAgbmV3dGlvLmNfaWZsYWcgfD0gSVhPTiB8IElYT0ZGOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgbmV3dGlvLmNfaWZsYWcgJj0gfihJWE9OfElYT0ZGfElYQU5ZKTsNCisgICAgfQ0KKw0KKyAgICBuZXd0aW8uY19sZmxhZz0wOw0KKyAgICBuZXd0aW8uY19vZmxhZz0wOw0KKw0KKyAgICAvLyAgIG5ld3Rpby5jX2NjW1ZUSU1FXT0xOw0KKyAgICAvLyAgIG5ld3Rpby5jX2NjW1ZNSU5dPTYwOw0KKw0KKyAgICBpZiAodGNzZXRhdHRyKGJ0X2Rldl9mZCwgVENTQU5PVywgJm5ld3RpbykhPTApDQorICAgIHsNCisgICAgICAgIHByaW50ZigidGNzZXRhdHRyKCkgMSBmYWlsZWQgXG4iKTsNCisgICAgfQ0KKw0KKyAgICBpZiAodGNnZXRhdHRyKGJ0X2Rldl9mZCwgJm5ld3RpbykhPTApDQorICAgIHsNCisgICAgICAgIHByaW50ZigidGNzZXRhdHRyKCkgNCBmYWlsZWQgXG4iKTsNCisgICAgfQ0KKw0KKyAgICAvL2hhcmR3YXJlIGhhbmRzaGFrZQ0KKyAgICBpZiAoaGFyZHdhcmVIYW5kc2hha2UpDQorICAgIHsNCisgICAgICAgIG5ld3Rpby5jX2NmbGFnIHw9IENSVFNDVFM7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBuZXd0aW8uY19jZmxhZyAmPSB+Q1JUU0NUUzsNCisgICAgfQ0KKw0KKyAgICBpZiAodGNzZXRhdHRyKGJ0X2Rldl9mZCwgVENTQU5PVywgJm5ld3RpbykhPTApDQorICAgIHsNCisgICAgICAgIHByaW50ZigidGNzZXRhdHRyKCkgMiBmYWlsZWQgXG4iKTsNCisgICAgfQ0KK30NCisNCisNCit1bnNpZ25lZCBjaGFyIGF0b2goY2hhciogc19kYXRhKXsNCisgICAgdW5zaWduZWQgY2hhciByZXRfdmFsdWU7DQorICAgIGNoYXIgdGVtcF92YWx1ZSA9IDA7DQorDQorICAgIC8vaA0KKyAgICBpZihzX2RhdGFbMF0gPj0gNDggJiYgc19kYXRhWzBdIDw9IDU3KXsNCisgICAgICAgIHRlbXBfdmFsdWUgPSBzX2RhdGFbMF0gLSA0ODsNCisgICAgfWVsc2UgaWYoc19kYXRhWzBdID49IDY1ICYmIHNfZGF0YVswXSA8PSA3MCl7DQorICAgICAgICB0ZW1wX3ZhbHVlID0gKHNfZGF0YVswXSAtIDY1KSArIDEwOw0KKyAgICB9ZWxzZSBpZihzX2RhdGFbMF0gPj0gOTcgJiYgc19kYXRhWzBdIDw9IDEwMil7DQorICAgICAgICB0ZW1wX3ZhbHVlID0gKHNfZGF0YVswXSAtIDk3KSArIDEwOw0KKyAgICB9DQorDQorICAgIHJldF92YWx1ZSA9IHRlbXBfdmFsdWU7DQorICAgIHJldF92YWx1ZSA9IHJldF92YWx1ZSA8PCA0Ow0KKyAgICAvL3ByaW50ZigiYXRvaDE6IHJldF92YWx1ZToleFxyXG4iLCByZXRfdmFsdWUpOw0KKyAgICAvL2wNCisgICAgaWYoc19kYXRhWzFdID49IDQ4ICYmIHNfZGF0YVsxXSA8PSA1Nyl7DQorICAgICAgICB0ZW1wX3ZhbHVlID0gc19kYXRhWzFdIC0gNDg7DQorICAgIH1lbHNlIGlmKHNfZGF0YVsxXSA+PSA2NSAmJiBzX2RhdGFbMV0gPD0gNzApew0KKyAgICAgICAgdGVtcF92YWx1ZSA9IChzX2RhdGFbMV0gLSA2NSkgKyAxMDsNCisgICAgfWVsc2UgaWYoc19kYXRhWzFdID49IDk3ICYmIHNfZGF0YVsxXSA8PSAxMDIpew0KKyAgICAgICAgdGVtcF92YWx1ZSA9IChzX2RhdGFbMV0gLSA5NykgKyAxMDsNCisgICAgfQ0KKw0KKyAgICByZXRfdmFsdWUgfD0gdGVtcF92YWx1ZTsNCisgICAgLy9wcmludGYoImF0b2gyOiByZXRfdmFsdWU6JXhcclxuIiwgcmV0X3ZhbHVlKTsNCisNCisgICAgcmV0dXJuIHJldF92YWx1ZTsNCisNCit9DQorDQoraW50IHNlbmRfdG9fc2VydmVyKHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgaW50IGxlbil7DQorICAgIGludCBjbGllbnRfc29ja2V0Ow0KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyQWRkcjsNCisgICAgLy91bnNpZ25lZCBsb25nIGxvbmcgcGFja2FnZV90b3RlbF9jb3VudGVyID0gMDsNCisNCisgICAgaWYoKGNsaWVudF9zb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA8IDApew0KKyAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgfQ0KKw0KKyAgICBzZXJ2ZXJBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOw0KKyAgICBzZXJ2ZXJBZGRyLnNpbl9wb3J0ID0gaHRvbnMoQlRfSENJX1RPT0xfUE9SVCk7DQorICAgIHNlcnZlckFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIxMjcuMC4wLjEiKTsNCisNCisgICAgaWYoY29ubmVjdChjbGllbnRfc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJnNlcnZlckFkZHIsIHNpemVvZihzZXJ2ZXJBZGRyKSkgPCAwKXsNCisgICAgICAgIHJldHVybiBFUlI7DQorICAgIH0NCisNCisgICAgc2VuZChjbGllbnRfc29ja2V0LCBidWZmZXIsIGxlbiwgMCk7DQorICAgIHJldHVybiBPSzsNCit9DQorDQordm9pZCBzZW5kX2hjaV9jb21tYW5kKCl7DQorICAgIGludCBpID0gMDsNCisgICAgaW50IGNvbW1hbmRfbGVuID0gMDsNCisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbU09DS0VSX0JVRkZFUl9TSVpFXTsNCisNCisvLyAgICBwcmludGYoInNlbmQgaGNpIGNvbW1hbmQ6IFxyXG4iKTsNCisNCisgICAgZm9yKGkgPSAwO2kgPCAyNTY7IGkrKyl7DQorICAgICAgICBpZihzX2hjaV9jb21tYW5kW2ldID09IE5VTEwpew0KKyAgICAgICAgICAgIGNvbW1hbmRfbGVuID0gaTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisNCisgICAgICAgIGJ1ZmZlcltpXSA9IGF0b2goc19oY2lfY29tbWFuZFtpXSk7DQorLy8gICAgICAgIHByaW50ZigiJTAyWCAiLCBidWZmZXJbaV0pOw0KKyAgICB9DQorDQorICAgIHNlbmRfdG9fc2VydmVyKGJ1ZmZlciwgaSk7DQorDQorLy8gICAgcHJpbnRmKCJcclxuIik7DQorfQ0KKw0KK3ZvaWQgc2VuZF9yYXdfaGNpX2NvbW1hbmQoKXsNCisgICAgaWYgKGJ0X3Rlc3RfYXJncy50eXBlPT10eHN0b3Apew0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDE7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwQzsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDE4Ow0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDE7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwMDsNCisgICAgfSBlbHNlIGlmIChidF90ZXN0X2FyZ3MudHlwZSA9PSByeHN0b3Apew0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDE7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwQzsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDE4Ow0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDE7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwMTsNCisgICAgfSBlbHNlIGlmIChidF90ZXN0X2FyZ3MudHlwZT49dHhESDEgJiYgYnRfdGVzdF9hcmdzLnR5cGU8PXJ4M0RINSl7DQorICAgICAgICBpZiAoYnRfdGVzdF9hcmdzLnR5cGU+PXR4REgxICYmIGJ0X3Rlc3RfYXJncy50eXBlPD10eDNESDUpew0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDAxOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDA2Ow0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDE4Ow0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDBFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwMTsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwQjsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgxODsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwRDsNCisgICAgICAgIH0gDQorICAgICAgICBzd2l0Y2ggKGJ0X3Rlc3RfYXJncy50eXBlKXsNCisgICAgICAgICAgICBjYXNlIHR4REgxOg0KKyAgICAgICAgICAgIGNhc2UgcnhESDE6DQorICAgICAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDA0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIHR4REgzOg0KKyAgICAgICAgICAgIGNhc2UgcnhESDM6DQorICAgICAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDBCOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIHR4REg1Og0KKyAgICAgICAgICAgIGNhc2UgcnhESDU6DQorICAgICAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDBGOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIHR4MkRIMToNCisgICAgICAgICAgICBjYXNlIHJ4MkRIMToNCisgICAgICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgdHgyREgzOg0KKyAgICAgICAgICAgIGNhc2UgcngyREgzOg0KKyAgICAgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwQTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSB0eDJESDU6DQorICAgICAgICAgICAgY2FzZSByeDJESDU6DQorICAgICAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDBFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIHR4M0RIMToNCisgICAgICAgICAgICBjYXNlIHJ4M0RIMToNCisgICAgICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgdHgzREgzOg0KKyAgICAgICAgICAgIGNhc2UgcngzREgzOg0KKyAgICAgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwQjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSB0eDNESDU6DQorICAgICAgICAgICAgY2FzZSByeDNESDU6DQorICAgICAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDBGOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3MucGF0dGVybjsNCisgICAgICAgIGlmIChidF90ZXN0X2FyZ3MudHlwZT49dHhESDEgJiYgYnRfdGVzdF9hcmdzLnR5cGU8PXR4M0RINSl7DQorICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5ob3BwaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5jaGFubmVsOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5pc19lZHI7DQorICAgICAgICBpZiAoYnRfdGVzdF9hcmdzLnR5cGU+PXR4REgxICYmIGJ0X3Rlc3RfYXJncy50eXBlPD10eDNESDUpew0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3Mud2hpdGVuaW5nOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAoYnRfdGVzdF9hcmdzLmxlbiAmIDB4RkYpOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAoKGJ0X3Rlc3RfYXJncy5sZW4gPj4gOCkgJiAweEZGKTsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmFkZHJbNV07DQorICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5hZGRyWzRdOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3MuYWRkclszXTsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmFkZHJbMl07DQorICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5hZGRyWzFdOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3MuYWRkclswXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IChidF90ZXN0X2FyZ3MubGVuICYgMHhGRik7DQorICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9ICgoYnRfdGVzdF9hcmdzLmxlbiA+PiA4KSAmIDB4RkYpOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3Mud2hpdGVuaW5nOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3MuYWRkcls1XTsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmFkZHJbNF07DQorICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5hZGRyWzNdOw0KKyAgICAgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3MuYWRkclsyXTsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmFkZHJbMV07DQorICAgICAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5hZGRyWzBdOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGJ0X3Rlc3RfYXJncy50eXBlID09IHNjcGNfc3RhcnQpew0KKwkgICAgdWludDhfdCBpID0gMDsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDAxOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4QzY7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHhGQzsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDBFOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDE7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmNoYW5uZWw7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLnR4X3B3cjsNCisgICAgICAgIGZvciAoaT0wO2k8MTE7aSsrKXsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwMDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChidF90ZXN0X2FyZ3MudHlwZSA9PSBzY3BjX3N0b3Apew0KKwkgICAgdWludDhfdCBpID0gMDsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDAxOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4QzY7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHhGQzsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDBFOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDA7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmNoYW5uZWw7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLnR4X3B3cjsNCisgICAgICAgIGZvciAoaT0wO2k8MTE7aSsrKXsNCisgICAgICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwMDsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIGlmIChidF90ZXN0X2FyZ3MudHlwZSA9PSBsZV90eCl7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwMTsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDM0Ow0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MjA7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgwNDsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3MuY2hhbm5lbDsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAoYnRfdGVzdF9hcmdzLmxlbiAmIDB4RkYpOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5wYXR0ZXJuOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IGJ0X3Rlc3RfYXJncy5sZV9waHk7DQorICAgIH0gZWxzZSBpZiAoYnRfdGVzdF9hcmdzLnR5cGUgPT0gbGVfcngpew0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDE7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gMHgzMzsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSAweDIwOw0KKyAgICAgICAgcl9oY2lfY29tbWFuZFtyX2hjaV9jb21tYW5kX2xlbisrXSA9IDB4MDM7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmNoYW5uZWw7DQorICAgICAgICByX2hjaV9jb21tYW5kW3JfaGNpX2NvbW1hbmRfbGVuKytdID0gYnRfdGVzdF9hcmdzLmxlX3BoeTsNCisgICAgICAgIHJfaGNpX2NvbW1hbmRbcl9oY2lfY29tbWFuZF9sZW4rK10gPSBidF90ZXN0X2FyZ3MubW9kX2lkeDsNCisgICAgfQ0KKyAgICBzZW5kX3RvX3NlcnZlcihyX2hjaV9jb21tYW5kLCByX2hjaV9jb21tYW5kX2xlbik7DQorfQ0KKw0KK3ZvaWQgc2VuZF93bGFuX2NvbW1hbmQodm9pZCkNCit7DQorICAgIGludCBpID0gMDsNCisgICAgaW50IGNvbW1hbmRfbGVuID0gMDsNCisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbU09DS0VSX0JVRkZFUl9TSVpFXSA9IHswLH07DQorICAgIHdoaWxlICgod19jb21tYW5kW2ldICE9IE5VTEwpICYmIChpIDwgV0xBTl9DTURfTUFYX0NOVCkpIHsNCisgICAgICAgIHN0cmNhdCgoY2hhciopJmJ1ZmZlclswXSwgd19jb21tYW5kW2ldKTsNCisgICAgICAgIHN0cmNhdCgoY2hhciopJmJ1ZmZlclswXSwgIiAiKTsNCisgICAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBjb21tYW5kX2xlbiA9IHN0cmxlbigoY2hhciopJmJ1ZmZlclswXSk7DQorICAgIHByaW50ZigiY29tbWFuZF9sZW46JWQgXHJcbiIsIGNvbW1hbmRfbGVuKTsNCisgICAgaWYgKGNvbW1hbmRfbGVuID4gMSkgew0KKyAgICAgICAgLy9jb21tYW5kX2xlbi0tOyAvLyBybSBsYXN0IHNwYWNlDQorICAgICAgICAvL2J1ZmZlcltjb21tYW5kX2xlbl0gPSAnXDAnOw0KKyAgICAgICAgc2VuZF90b19zZXJ2ZXIoYnVmZmVyLCBjb21tYW5kX2xlbik7DQorICAgIH0NCit9DQorDQoraW50IGhjaV9zZW5kKGNoYXIqIGRhdGEsIGludCBsZW4pew0KKyAgICBpbnQgaSA9IDA7DQorICAgIHVuc2lnbmVkIGNoYXIgdG1wX2RhdGFbbGVuXTsNCisNCisgICAgcHJpbnRmKCJDT01NQU5EKCVkKTogXHJcbiIsIGxlbik7DQorICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKXsNCisgICAgICAgIHRtcF9kYXRhW2ldID0gKHVuc2lnbmVkIGNoYXIpZGF0YVtpXTsNCisgICAgICAgIHByaW50ZigiJTAyWCAiLCB0bXBfZGF0YVtpXSk7DQorICAgIH0NCisgICAgcHJpbnRmKCJcclxuIik7DQorDQorICAgIGxlbiA9IHdyaXRlKGJ0X2Rldl9mZCwgdG1wX2RhdGEsIGxlbik7DQorICAgIGlmIChsZW4gPCAwKSB7DQorICAgICAgICBwcmludGYoIndyaXRlIGRhdGEgZXJyb3IgXG4iKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCit9DQorDQorDQoraW50IGhjaV9yZWN2KGNoYXIqIGRhdGEsIGludCBsZW4pew0KKyAgICBpbnQgaSA9IDA7DQorICAgIHVuc2lnbmVkIGNoYXIgdG1wX2J5dGVbNjRdOy8vID0gMHgwMDsNCisNCisgICAgbWVtc2V0KGRhdGEsIDAsIGxlbik7DQorDQorICAgIGxlbiA9IHJlYWQoYnRfZGV2X2ZkLCBkYXRhLCBsZW4pOw0KKyAgICBpZiAobGVuIDwgMCkgew0KKyAgICAgICAgcHJpbnRmKCJyZWFkIGVycm9yIFxuIik7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcHJpbnRmKCJFVkVOVCglZCk6IFxyXG4iLCBsZW4pOw0KKyAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKyl7DQorICAgICAgICB0bXBfYnl0ZVtpXSA9ICh1bnNpZ25lZCBjaGFyKWRhdGFbaV07DQorICAgICAgICBwcmludGYoIiUwMlggIiwgdG1wX2J5dGVbaV0pOw0KKyAgICB9DQorICAgIHByaW50ZigiXHJcbiIpOw0KKw0KKyAgICBpZih0bXBfYnl0ZVsxXSA9PSAweDBEKSB7DQorICAgICAgICB1aW50MzJfdCByeF9wa3RfbGVuID0gdG1wX2J5dGVbNF0gfCAodG1wX2J5dGVbNV0gPDwgOCkgfCAodG1wX2J5dGVbNl0gPDwgMTYpIHwgKHRtcF9ieXRlWzddIDw8IDI0KTsNCisgICAgICAgIHVpbnQzMl90IHRvdGFsX3J4X3BrdHMgPSB0bXBfYnl0ZVs4XSB8ICh0bXBfYnl0ZVs5XSA8PCA4KSB8ICh0bXBfYnl0ZVsxMF0gPDwgMTYpIHwgKHRtcF9ieXRlWzExXSA8PCAyNCk7DQorICAgICAgICB1aW50MzJfdCByeF9va19wa3RzID0gdG1wX2J5dGVbMTJdIHwgKHRtcF9ieXRlWzEzXSA8PCA4KSB8ICh0bXBfYnl0ZVsxNF0gPDwgMTYpIHwgKHRtcF9ieXRlWzE1XSA8PCAyNCk7DQorICAgICAgICB1aW50MzJfdCByeF9lcnJfcGt0cyA9IHRtcF9ieXRlWzE2XSB8ICh0bXBfYnl0ZVsxN10gPDwgOCkgfCAodG1wX2J5dGVbMThdIDw8IDE2KSB8ICh0bXBfYnl0ZVsxOV0gPDwgMjQpOw0KKyAgICAgICAgdWludDMyX3QgcnhfZXJyX2JpdHMgPSB0bXBfYnl0ZVsyMF0gfCAodG1wX2J5dGVbMjFdIDw8IDgpIHwgKHRtcF9ieXRlWzIyXSA8PCAxNikgfCAodG1wX2J5dGVbMjNdIDw8IDI0KTsNCisgICAgICAgIGZsb2F0IHBlciA9IChmbG9hdCkgIDEwMCAqIHJ4X2Vycl9wa3RzIC8gdG90YWxfcnhfcGt0czsNCisgICAgICAgIGZsb2F0IGJlciA9IChmbG9hdCkgIDEwMDAwICogcnhfZXJyX2JpdHMgLyAodG90YWxfcnhfcGt0cyAqIHJ4X3BrdF9sZW4gKiA4KSA7DQorICAgICAgICBwcmludGYoInJ4IHJlc3VsdDogcGt0X2xlbj0lZCwgdG90YWw9JWQsIG9rPSVkLCBlcnI9JWQsIGVycl9iaXRzPSVkLCBwZXI9JS4yZiUlLCBiZXI9JS40ZiUlJSUlJVxuIiwNCisgICAgICAgICAgICByeF9wa3RfbGVuLCB0b3RhbF9yeF9wa3RzLCByeF9va19wa3RzLCByeF9lcnJfcGt0cywgcnhfZXJyX2JpdHMsIHBlciwgYmVyKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbGVuOw0KK30NCisNCitpbnQgd2xhbl9zZW5kKGNoYXIgKmRhdGEsIGludCBsZW4pDQorew0KKyAgICBpbnQgc29jazsNCisgICAgc3RydWN0IGlmcmVxIGlmcjsNCisgICAgaW50IHJldCA9IDA7DQorICAgIGludCBpID0gMDsNCisgICAgY2hhciB3bF9jbWRbNjRdOw0KKyAgICBzdHJ1Y3QgYW5kcm9pZF93aWZpX3ByaXZfY21kIHByaXZfY21kOw0KKyAgICBjaGFyIGlzX3BhcmFtX2VyciA9IDA7DQorICAgIGludCBidWZfbGVuID0gMDsNCisgICAgaW50IGFyZ0MgPSAwOw0KKw0KKyAgICBzb2NrID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOw0KKyAgICBpZiAoc29jayA8IDApIHsNCisgICAgICAgIHByaW50ZigiYmFkIHNvY2shXG4iKTsNCisgICAgICAgIHJldHVybiBFUlI7DQorICAgIH0NCisNCisgICAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsNCisgICAgc3RyY3B5KGlmci5pZnJfbmFtZSwgd19pZm5hbWUpOw0KKw0KKyAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkZMQUdTLCAmaWZyKSAhPSAwKSB7DQorICAgICAgICBwcmludGYoIiVzIENvdWxkIG5vdCByZWFkIGludGVyZmFjZSAlcyBmbGFnczogJXMiLF9fZnVuY19fLCB3X2lmbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgIHJldHVybiBFUlI7DQorICAgIH0NCisNCisgICAgaWYgKCEoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkpIHsNCisgICAgICAgIHByaW50ZigiJXMgaXMgbm90IHVwIVxuIix3X2lmbmFtZSk7DQorICAgICAgICByZXR1cm4gRVJSOw0KKyAgICB9DQorDQorICAgIHByaW50ZigiaWZyLmlmcl9uYW1lID0gJXNcbiIsIGlmci5pZnJfbmFtZSk7DQorICAgIG1lbXNldCgmcHJpdl9jbWQsIDAsIHNpemVvZihwcml2X2NtZCkpOw0KKyAgICBtZW1zZXQod2xfY21kLCAwLCBzaXplb2Yod2xfY21kKSk7DQorICAgIC8vIGV4dHJhY3Qgd2xhbiBjb21tYW5kICYgYXJnQw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgIGlmIChkYXRhW2ldICE9ICcgJykgew0KKyAgICAgICAgICAgIGlmIChhcmdDID09IDApIHsNCisgICAgICAgICAgICAgICAgd2xfY21kW2ldID0gZGF0YVtpXTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGFyZ0MrKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBwcmludGYoIndsX2NtZD0lcywgYXJnQz0lZFxyXG4iLCB3bF9jbWQsIGFyZ0MpOw0KKw0KKyAgICBwcml2X2NtZC5idWYgPSBkYXRhOw0KKyAgICBwcml2X2NtZC51c2VkX2xlbiA9IGxlbjsNCisgICAgcHJpdl9jbWQudG90YWxfbGVuID0gU09DS0VSX0JVRkZFUl9TSVpFOw0KKyAgICBpZnIuaWZyX2RhdGEgPSAodm9pZCopJnByaXZfY21kOw0KKw0KKyAgICBpZiAoKHN0cmNhc2VjbXAod2xfY21kLCAiQlRfUkVTRVQiKSA9PSAwKSkgew0KKyAgICAgICAgY2hhciBidF9yZXNldF9oY2lfY21kWzMyXSA9ICIwMSAwMyAwYyAwMCI7DQorICAgICAgICBpZiAoYXJnQyA9PSAxKSB7DQorICAgICAgICAgICAgYnVmX2xlbiA9IHByaXZfY21kLnVzZWRfbGVuOw0KKyAgICAgICAgICAgIG1lbWNweSgmcHJpdl9jbWQuYnVmW2J1Zl9sZW5dLCAmYnRfcmVzZXRfaGNpX2NtZFswXSwgc3RybGVuKGJ0X3Jlc2V0X2hjaV9jbWQpKTsNCisgICAgICAgICAgICBidWZfbGVuICs9IHN0cmxlbihidF9yZXNldF9oY2lfY21kKTsNCisgICAgICAgICAgICBwcml2X2NtZC51c2VkX2xlbiA9IGJ1Zl9sZW47DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlzX3BhcmFtX2VyciA9IDE7DQorICAgICAgICB9DQorICAgIH0gZWxzZSBpZiAoKHN0cmNhc2VjbXAod2xfY21kLCAiQlRfVFhESCIpID09IDApKSB7DQorICAgICAgICBjaGFyIGJ0X3R4ZGhfaGNpX2NtZFsyNTVdID0gIjAxIDA2IDE4IDBlICI7DQorICAgICAgICBpZiAoYXJnQyA9PSAxNSkgew0KKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBwcml2X2NtZC51c2VkX2xlbjsNCisgICAgICAgICAgICBpbnQgYXJnX2xlbiA9IHN0cmxlbigiQlRfVFhESCIpOw0KKyAgICAgICAgICAgIGludCB0eGRoX2NtZF9sZW4gPSBzdHJsZW4oYnRfdHhkaF9oY2lfY21kKTsNCisgICAgICAgICAgICBtZW1jcHkoJmJ0X3R4ZGhfaGNpX2NtZFt0eGRoX2NtZF9sZW5dLCAmcHJpdl9jbWQuYnVmW2FyZ19sZW4rMV0sIGJ1Zl9sZW4gLSBhcmdfbGVuIC0gMSk7DQorICAgICAgICAgICAgbWVtY3B5KCZwcml2X2NtZC5idWZbYXJnX2xlbisxXSwgJmJ0X3R4ZGhfaGNpX2NtZFswXSwgc3RybGVuKGJ0X3R4ZGhfaGNpX2NtZCkpOw0KKyAgICAgICAgICAgIGJ1Zl9sZW4gKz0gc3RybGVuKGJ0X3R4ZGhfaGNpX2NtZCk7DQorICAgICAgICAgICAgcHJpdl9jbWQudXNlZF9sZW4gPSBidWZfbGVuOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpc19wYXJhbV9lcnIgPSAxOw0KKyAgICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKChzdHJjYXNlY21wKHdsX2NtZCwgIkJUX1JYREgiKSA9PSAwKSkgew0KKyAgICAgICAgaWYgKGFyZ0MgPT0gMTQpIHsNCisgICAgICAgICAgICBjaGFyIGJ0X3J4ZGhfaGNpX2NtZFsyNTVdID0gIjAxIDBiIDE4IDBkICI7DQorICAgICAgICAgICAgYnVmX2xlbiA9IHByaXZfY21kLnVzZWRfbGVuOw0KKyAgICAgICAgICAgIGludCBhcmdfbGVuID0gc3RybGVuKCJCVF9SWERIIik7DQorICAgICAgICAgICAgaW50IHJ4ZGhfY21kX2xlbiA9IHN0cmxlbihidF9yeGRoX2hjaV9jbWQpOw0KKyAgICAgICAgICAgIG1lbWNweSgmYnRfcnhkaF9oY2lfY21kW3J4ZGhfY21kX2xlbl0sICZwcml2X2NtZC5idWZbYXJnX2xlbisxXSwgYnVmX2xlbiAtIGFyZ19sZW4gLSAxKTsNCisgICAgICAgICAgICBtZW1jcHkoJnByaXZfY21kLmJ1ZlthcmdfbGVuKzFdLCAmYnRfcnhkaF9oY2lfY21kWzBdLCBzdHJsZW4oYnRfcnhkaF9oY2lfY21kKSk7DQorICAgICAgICAgICAgYnVmX2xlbiArPSBzdHJsZW4oYnRfcnhkaF9oY2lfY21kKTsNCisgICAgICAgICAgICBwcml2X2NtZC51c2VkX2xlbiA9IGJ1Zl9sZW47DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlzX3BhcmFtX2VyciA9IDE7DQorICAgICAgICB9DQorICAgIH0gIGVsc2UgaWYgKChzdHJjYXNlY21wKHdsX2NtZCwgIkJUX1NUT1AiKSA9PSAwKSkgew0KKyAgICAgICAgY2hhciBidF9zdG9wX2hjaV9jbWRbMjU1XSA9ICIwMSAwQyAxOCAwMSAiOw0KKyAgICAgICAgaWYgKGFyZ0MgPT0gMikgew0KKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBwcml2X2NtZC51c2VkX2xlbjsNCisgICAgICAgICAgICBpbnQgYXJnX2xlbiA9IHN0cmxlbigiQlRfU1RPUCIpOw0KKyAgICAgICAgICAgIGludCBzdG9wX2NtZF9sZW4gPSBzdHJsZW4oYnRfc3RvcF9oY2lfY21kKTsNCisgICAgICAgICAgICBtZW1jcHkoJmJ0X3N0b3BfaGNpX2NtZFtzdG9wX2NtZF9sZW5dLCAmcHJpdl9jbWQuYnVmW2FyZ19sZW4rMV0sIGJ1Zl9sZW4gLSBhcmdfbGVuIC0gMSk7DQorICAgICAgICAgICAgbWVtY3B5KCZwcml2X2NtZC5idWZbYXJnX2xlbisxXSwgJmJ0X3N0b3BfaGNpX2NtZFswXSwgc3RybGVuKGJ0X3N0b3BfaGNpX2NtZCkpOw0KKyAgICAgICAgICAgIGJ1Zl9sZW4gKz0gc3RybGVuKGJ0X3N0b3BfaGNpX2NtZCk7DQorICAgICAgICAgICAgcHJpdl9jbWQudXNlZF9sZW4gPSBidWZfbGVuOw0KKyAgICB9IGVsc2UgaWYgKChzdHJjYXNlY21wKHdsX2NtZCwgIkJUX0RBVEEiKSA9PSAwKSkgew0KKyAgICAgICAgICAgIC8vY2hhciBidF9yYXdfZGF0YV9jbWRbMjU1XTsNCisgICAgICAgICAgICBpbnQgYXJnX2xlbiA9IHN0cmxlbih3bF9jbWQpOw0KKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBwcml2X2NtZC51c2VkX2xlbjsNCisgICAgICAgICAgICBtZW1jcHkoJnByaXZfY21kLmJ1ZlthcmdfbGVuKzFdLCAmcHJpdl9jbWQuYnVmW2FyZ19sZW4rMV0sIGJ1Zl9sZW4gLSBhcmdfbGVuIC0gMSk7DQorICAgICAgICAgICAgcHJpdl9jbWQudXNlZF9sZW4gPSBidWZfbGVuIC0gYXJnX2xlbiAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaXNfcGFyYW1fZXJyID0gMTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIGlzX3BhcmFtX2VyciA9IDA7DQorICAgIH0NCisgICAgaWYgKGlzX3BhcmFtX2Vycikgew0KKyAgICAgICAgcHJpbnRmKCJwYXJhbSBlcnJvciEhIVxuIik7DQorICAgICAgICByZXR1cm4gRVJSOw0KKyAgICB9DQorICAgIGlmICgocmV0ID0gaW9jdGwoc29jaywgVFhSWF9QQVJBLCAmaWZyKSkgPCAwKSB7DQorICAgICAgICBwcmludGYoIiVzOiBlcnJvciBpb2N0bFtUWF9QQVJBXSByZXQ9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsNCisgICAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisgICAgbWVtY3B5KCZwcml2X2NtZCwgaWZyLmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IGFuZHJvaWRfd2lmaV9wcml2X2NtZCkpOw0KKyAgICBpZiAoc3RyY2FzZWNtcCh3bF9jbWQsICJHRVRfQlRfUlhfUkVTVUxUIikgPT0gMCkgew0KKyAgICAgICAgcHJpbnRmKCJkb25lOiBnZXQgYnQgcnggdG90YWw9JWQsIG9rPSVkLCBlcnI9JWRcbiIsICoodW5zaWduZWQgaW50ICopcHJpdl9jbWQuYnVmLA0KKyAgICAgICAgICAgICoodW5zaWduZWQgaW50ICopJnByaXZfY21kLmJ1Zls0XSwNCisgICAgICAgICAgICAqKHVuc2lnbmVkIGludCAqKSZwcml2X2NtZC5idWZbOF0pOw0KKyAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAod2xfY21kLCAiQlRfREFUQSIpID09IDApIHsNCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSZwcml2X2NtZC5idWZbMV07DQorICAgICAgICBpbnQgIGxlbiA9IHByaXZfY21kLmJ1ZlswXTsNCisJaW50IGlkeCA9IDA7DQorICAgICAgICBwcmludGYoImRvbmU6ICVkXG4iLCBsZW4pOw0KKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7DQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGJ1ZmZbaWR4XSk7DQorICAgICAgICB9DQorICAgICAgICBwcmludGYoIlxuIik7DQorICAgICB9IGVsc2Ugew0KKyAgICAgICAgcHJpbnRmKCJkb25lXG4iKTsNCisgICAgfQ0KKyAgICByZXR1cm4gT0s7DQorfQ0KKw0KK2ludCBkZXZfb3Blbigpew0KKyAgICBpbnQgbiA9IDA7DQorDQorICAgIGJ0X2Rldl9mZCA9IG9wZW4oZGV2X3BhdGgsIE9fUkRXUiB8IE9fTkRFTEFZKTsNCisgICAgaWYoYnRfZGV2X2ZkIDwgMCkgew0KKyAgICAgICAgcHJpbnRmKCJkZXZfcGF0aCAlcyBmYWlsIHRvIG9wZW4gXHJcbiIsIGRldl9wYXRoKTsNCisgICAgICAgIHJldHVybiBFUlI7DQorICAgIH0NCisgICAgaWYoaW50ZXJmYWNlID09IFVBUlQpew0KKyAgICAgICAgdGNmbHVzaChidF9kZXZfZmQsIFRDSU9GTFVTSCk7DQorICAgICAgICBuID0gZmNudGwoYnRfZGV2X2ZkLCBGX0dFVEZMLCAwKTsNCisgICAgICAgIGZjbnRsKGJ0X2Rldl9mZCwgRl9TRVRGTCwgbiAmIH5PX05ERUxBWSk7DQorICAgICAgICB1YXJ0X3NldF9vcHRpb25zKC8qQkFVRFJBVEUqL2F0b2koc19iYXVkcmF0ZSksIERBVEFCSVRTLCBQQVJUWSwgU1RPUCwgU09GVFdBUkVfSEFORFNIQUtFLCBIQVJEV0FSRV9IQU5EU0hBS0UpOw0KKyAgICB9ZWxzZXsNCisgICAgICAgIGlvY3RsKGJ0X2Rldl9mZCwgRE9XTl9GV19DRkcpOw0KKyAgICAgICAgaW9jdGwoYnRfZGV2X2ZkLCBHRVRfVVNCX0lORk8pOw0KKyAgICB9DQorICAgIHByaW50ZigiYnQgZGV2IG9wZW4gc3VjY2Vzc2Z1bFxyXG4iKTsNCisgICAgcmV0dXJuIE9LOw0KK30NCisNCit2b2lkIGRldl9jbG9zZSgpew0KKyAgICBjbG9zZShidF9kZXZfZmQpOw0KK30NCisNCisNCitpbnQgc29ja2V0X2luaXQoKXsNCisgICAgaW50IGNsaWVudDsNCisgICAgaW50IHNlcnZlcl9zb2NrZXQ7DQorICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXJfYWRkcjsNCisgICAgc3RydWN0IHNvY2thZGRyX2luIGNsaWVudEFkZHI7DQorICAgIGludCBhZGRyX2xlbiA9IHNpemVvZihjbGllbnRBZGRyKTsNCisgICAgY2hhciBidWZmZXJbU09DS0VSX0JVRkZFUl9TSVpFXTsNCisgICAgaW50IHJlY3ZfbGVuID0gMDsNCisNCisgICAgaWYoKHNlcnZlcl9zb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA8IDApew0KKyAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgfQ0KKw0KKyAgICAvL2J6ZXJvKCZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHNlcnZlcl9hZGRyKSk7DQorICAgIG1lbXNldCgmc2VydmVyX2FkZHIsIDAsIHNpemVvZihzZXJ2ZXJfYWRkcikpOw0KKyAgICBzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCisgICAgc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhCVF9IQ0lfVE9PTF9QT1JUKTsNCisgICAgc2VydmVyX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7DQorICAgIC8vc2V0c29ja29wdChzZXJ2ZXJfc29ja2V0ICxTT0xfU09DS0VUICxTT19SRVVTRUFERFIsKGNvbnN0IGNoYXIqKSZiUmV1c2VhZGRyLHNpemVvZihCT09MKSk7DQorDQorICAgIGlmKGJpbmQoc2VydmVyX3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHNlcnZlcl9hZGRyKSkgPCAwKXsNCisgICAgICAgIHByaW50ZigiYmluZGluZyBlcnJvclxyXG4iKTsNCisgICAgICAgIHJldHVybiBFUlI7DQorICAgIH0NCisNCisgICAgaWYobGlzdGVuKHNlcnZlcl9zb2NrZXQsIDUpIDwgMCl7DQorICAgICAgICBwcmludGYoImxpc3RlbiBlcnJvciIpOw0KKyAgICAgICAgcmV0dXJuIEVSUjsNCisgICAgfQ0KKw0KKyAgICB3aGlsZSgxKXsNCisgICAgICAgIGNsaWVudCA9IGFjY2VwdChzZXJ2ZXJfc29ja2V0LCAoc3RydWN0IHNvY2thZGRyKikmY2xpZW50QWRkciwgKHNvY2tsZW5fdCopJmFkZHJfbGVuKTsNCisgICAgICAgIGlmKGNsaWVudCA9PSBFUlIpew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVjdl9sZW4gPSByZWN2KGNsaWVudCwgYnVmZmVyLCBTT0NLRVJfQlVGRkVSX1NJWkUsIDApOw0KKyAgICAgICAgaWYgKChpbnRlcmZhY2UgPT0gVVNCKSB8fCAoaW50ZXJmYWNlID09IFVBUlQpKSB7DQorICAgICAgICAgICAgaGNpX3NlbmQoYnVmZmVyLCByZWN2X2xlbik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdsYW5fc2VuZChidWZmZXIsIHJlY3ZfbGVuKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCisNCisNCit2b2lkKiBoY2lfcmVjdl90aHJlYWQoIHZvaWQgKmFyZyApew0KKyAgICBwcmludGYoImhjaSByZWN2IHRocmVhZCByZWFkeSAlcFxyXG4iLCBhcmcpOw0KKyAgICB3aGlsZSgxKXsNCisgICAgICAgIGhjaV9yZWN2KGhjaV9ldmVudCwgc2l6ZW9mKGhjaV9ldmVudCkpOw0KKy8vICAgICAgICBleGl0KDApOw0KKyAgICB9DQorfQ0KKw0KK3ZvaWQgc3RhcnRfc2VydmVyKCl7DQorICAgIGludCByZXQgPSBFUlI7DQorICAgIGlmICgoaW50ZXJmYWNlID09IFVTQikgfHwgKGludGVyZmFjZSA9PSBVQVJUKSkgew0KKyAgICAgICAgcHRocmVhZF90IGhjaV9yZWN2X3RoOw0KKyAgICAgICAgLy9pbml0IGJ0IGNvbW11bmljYXRpb24NCisgICAgICAgIHJldCA9IGRldl9vcGVuKCk7DQorICAgICAgICBpZihyZXQgPT0gRVJSKXsNCisgICAgICAgICAgICBwcmludGYoImRldl9vcGVuIGZhaWwgXHJcbiIpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIC8vdGVzdCB0byBzZW5kIHJlc2V0DQorICAgICAgICBwcmludGYoInRvIHRlc3QgaGNpIHJlc2V0IGZvciBidCBkZXZpY2VcclxuIik7DQorICAgICAgICBoY2lfc2VuZChoY2lfcmVzZXQsIHNpemVvZihoY2lfcmVzZXQpKTsNCisgICAgICAgIGhjaV9yZWN2KGhjaV9ldmVudCwgc2l6ZW9mKGhjaV9ldmVudCkpOw0KKyAgICAgICAgcmV0ID0gcHRocmVhZF9jcmVhdGUoICZoY2lfcmVjdl90aCwgTlVMTCwgaGNpX3JlY3ZfdGhyZWFkLCBOVUxMKTsNCisgICAgICAgIHByaW50ZigiYnQgZGV2aWNlIHRlc3Qgb2sgXHJcbiIpOw0KKyAgICB9IGVsc2UgaWYgKGludGVyZmFjZSA9PSBXTEFOKSB7DQorICAgICAgICBjaGFyIGJ1ZltTT0NLRVJfQlVGRkVSX1NJWkVdID0geyJCVF9SRVNFVCAifTsNCisgICAgICAgIHdsYW5fc2VuZChidWYsIHN0cmxlbihidWYpKTsNCisgICAgfQ0KKw0KKyAgICAgICAgLy9pbml0IGxvY2FsaG9zdCBzb2NrZXQNCisgICAgICAgIHJldCA9IHNvY2tldF9pbml0KCk7DQorICAgICAgICBpZiAoIXJldCkgew0KKyAgICAgICAgICAgIHByaW50Zigic29ja2V0IGluaXQgZG9uZVxyXG4iKTsNCisgICAgICAgIH0NCit9DQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSl7DQorICAgIGludCByZXQgPSBwYXJzZV9jbWRfbGluZShhcmdjLCBhcmd2KTsNCisgICAgaWYgKHJldCkgew0KKyAgICAgICAgcmV0dXJuIHJldDsNCisgICAgfQ0KKyAgICBpZihzZXJ2ZXJfb3JfY2xpZW50ID09IFNFUlZFUil7DQorICAgICAgICBzdGFydF9zZXJ2ZXIoKTsNCisgICAgfSBlbHNlIGlmIChzZXJ2ZXJfb3JfY2xpZW50ID09IENMSUVOVCkgew0KKyAgICAgICAgc2VuZF9oY2lfY29tbWFuZCgpOw0KKyAgICB9IGVsc2UgaWYgKHNlcnZlcl9vcl9jbGllbnQgPT0gQ0xJRU5UX0RJUkVDVCkgew0KKyAgICAgICAgc2VuZF9yYXdfaGNpX2NvbW1hbmQoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICAgIHNlbmRfd2xhbl9jb21tYW5kKCk7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KZGlmZiAtLWdpdCBhL2FwL2FwcC96dGVfY29tbS93bGFuL2FpY190b29scy9haWNyZl90ZXN0X2Q4MC93aWZpX3Rlc3QuYyBiL2FwL2FwcC96dGVfY29tbS93bGFuL2FpY190b29scy9haWNyZl90ZXN0X2Q4MC93aWZpX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMmFhZTFhCi0tLSAvZGV2L251bGwKKysrIGIvYXAvYXBwL3p0ZV9jb21tL3dsYW4vYWljX3Rvb2xzL2FpY3JmX3Rlc3RfZDgwL3dpZmlfdGVzdC5jCkBAIC0wLDAgKzEsNTc5IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIFdJRklfRFJJVkVSX0ZXX1BBVEggInN0YSIKKyNkZWZpbmUgV0lGSV9EUklWRVJfTU9EVUxFX05BTUUgInJ3bnhfZmRydiIKKyNkZWZpbmUgV0lGSV9EUklWRVJfTU9EVUxFX1BBVEggIi92ZW5kb3IvbW9kdWxlcy9yd254X2ZkcnYua28iCisjZGVmaW5lIE1BWF9EUlZfQ01EX1NJWkUgMTUzNgorI2RlZmluZSBUWFJYX1BBUkEJCQkJCQkJCVNJT0NERVZQUklWQVRFKzEKKworI2RlZmluZSBDSElQX0FJQzg4MDBEICAgICAgIDAKKyNkZWZpbmUgQ0hJUF9BSUM4ODAwRENEVyAgICAxCisjZGVmaW5lIENISVBfQUlDODgwMEQ4MCAgICAgMgorCisjZGVmaW5lIENISVBfU0VMRUNUICAgICAgICAgQ0hJUF9BSUM4ODAwRDgwCisKKyNpZiAoQ0hJUF9TRUxFQ1QgIT0gQ0hJUF9BSUM4ODAwRENEVykKKyNkZWZpbmUgRUZVU0VfQ01EX09MRF9GT1JNQVRfRU4gMQorI2Vsc2UKKyNkZWZpbmUgRUZVU0VfQ01EX09MRF9GT1JNQVRfRU4gMAorI2VuZGlmCisKKy8vc3RhdGljIGNvbnN0IGNoYXIgSUZBQ0VfRElSW10gICAgICAgICAgID0gIiI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERSSVZFUl9NT0RVTEVfTkFNRVtdICA9ICJyd254X2ZkcnYiOworLy9zdGF0aWMgY29uc3QgY2hhciBEUklWRVJfTU9EVUxFX1RBR1tdICAgPSBXSUZJX0RSSVZFUl9NT0RVTEVfTkFNRSAiICI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERSSVZFUl9NT0RVTEVfUEFUSFtdICA9IFdJRklfRFJJVkVSX01PRFVMRV9QQVRIOworLy9zdGF0aWMgY29uc3QgY2hhciBEUklWRVJfTU9EVUxFX0FSR1tdICAgPSAiIjsKKy8vc3RhdGljIGNvbnN0IGNoYXIgRklSTVdBUkVfTE9BREVSW10gICAgID0gIiI7CisvL3N0YXRpYyBjb25zdCBjaGFyIERSSVZFUl9QUk9QX05BTUVbXSAgICA9ICJ3bGFuLmRyaXZlci5zdGF0dXMiOworCisjaWZuZGVmIFRFTVBfRkFJTFVSRV9SRVRSWQorI2RlZmluZSBURU1QX0ZBSUxVUkVfUkVUUlkoZXhwcmVzc2lvbikgXAorICAoX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh7IGxvbmcgaW50IF9fcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGRvIF9fcmVzdWx0ID0gKGxvbmcgaW50KSAoZXhwcmVzc2lvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHdoaWxlIChfX3Jlc3VsdCA9PSAtMUwgJiYgZXJybm8gPT0gRUlOVFIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9fcmVzdWx0OyB9KSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBhbmRyb2lkX3dpZmlfcHJpdl9jbWQgeworCWNoYXIgKmJ1ZjsKKwlpbnQgdXNlZF9sZW47CisJaW50IHRvdGFsX2xlbjsKK30gYW5kcm9pZF93aWZpX3ByaXZfY21kOwordHlwZWRlZiBzdHJ1Y3QgY29iX3Jlc3VsdF9wdHJfdCB7CisgICAgdV9pbnQxNl90IGR1dF9yY3ZfZ29sZGVuX251bTsKKyAgICB1X2ludDhfdCBnb2xkZW5fcmN2X2R1dF9udW07CisgICAgaW50OF90IHJzc2lfc3RhdGljOworICAgIGludDhfdCBzbnJfc3RhdGljOworICAgIGludDhfdCBkdXRfcnNzaV9zdGF0aWM7CisgICAgdV9pbnQxNl90IHJlc2VydmVkOworfWNvYl9yZXN1bHRfcHRyX3Q7CitpbnQgd2lmaV9zZW5kX2NtZF90b19uZXRfaW50ZXJmYWNlKGNvbnN0IGNoYXIqIGlmX25hbWUsIGludCBhcmdDLCBjaGFyICphcmdWW10pCit7CisJaW50IHNvY2s7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSA9IDA7CisJY2hhciBidWZbTUFYX0RSVl9DTURfU0laRV07CisJc3RydWN0IGFuZHJvaWRfd2lmaV9wcml2X2NtZCBwcml2X2NtZDsKKyAgICBzdHJ1Y3QgY29iX3Jlc3VsdF9wdHJfdCAqY29iX3Jlc3VsdF9wdHI7CisJY2hhciBpc19wYXJhbV9lcnIgPSAwOworCWludCBidWZfbGVuID0gMDsKKworCXNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHNvY2sgPCAwKSB7CisJCXByaW50ZigiYmFkIHNvY2shXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RyY3B5KGlmci5pZnJfbmFtZSwgaWZfbmFtZSk7CisKKwlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkZMQUdTLCAmaWZyKSAhPSAwKSB7CisJCXByaW50ZigiJXMgQ291bGQgbm90IHJlYWQgaW50ZXJmYWNlICVzIGZsYWdzOiAlcyIsX19mdW5jX18sIGlmX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIShpZnIuaWZyX2ZsYWdzICYgSUZGX1VQKSkgeworCQlwcmludGYoIiVzIGlzIG5vdCB1cCFcbiIsaWZfbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKy8vCXByaW50ZigiaWZyLmlmcl9uYW1lID0gJXNcbiIsIGlmci5pZnJfbmFtZSk7CisJbWVtc2V0KCZwcml2X2NtZCwgMCwgc2l6ZW9mKHByaXZfY21kKSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJZm9yKGk9MjsgaTxhcmdDOyBpKyspeworCQlzdHJjYXQoYnVmLCBhcmdWW2ldKTsKKwkJc3RyY2F0KGJ1ZiwgIiAiKTsKKwl9CisKKwlwcml2X2NtZC5idWYgPSBidWY7CisJcHJpdl9jbWQudXNlZF9sZW4gPSBzdHJsZW4oYnVmKTsKKwlwcml2X2NtZC50b3RhbF9sZW4gPSBzaXplb2YoYnVmKTsKKwlpZnIuaWZyX2RhdGEgPSAodm9pZCopJnByaXZfY21kOworCisgICAgcHJpbnRmKCIlczpcbiIsIGFyZ1ZbMl0pOworICAgIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJTRVRfVFgiKSA9PSAwKSB7CisgICAgICAgIGlmIChhcmdDIDwgOCkgeworICAgICAgICAgICAgaXNfcGFyYW1fZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiU0VUX1RYVE9ORSIpID09IDApIHsKKyAgICAgICAgaWYgKCgoYXJnQyA9PSA0KSAmJiAoYXJnVlszXVswXSAhPSAnMCcpKQorICAgICAgICAgICAgfHwgKChhcmdDID09IDUpICYmIChhcmdWWzNdWzBdID09ICcwJykpKSB7CisgICAgICAgICAgICBpc19wYXJhbV9lcnIgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoc3RyY2FzZWNtcChhcmdWWzJdLCAiU0VUX1JYIikgPT0gMCkKKyAgICAgICAgICAgIHx8IChzdHJjYXNlY21wKGFyZ1ZbMl0sICJTRVRfQ09CX0NBTCIpID09IDApKSB7CisgICAgICAgIGlmIChhcmdDIDwgNSkgeworICAgICAgICAgICAgaXNfcGFyYW1fZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9YVEFMX0NBUCIpID09IDApCisgICAgICAgICAgICB8fCAoc3RyY2FzZWNtcChhcmdWWzJdLCAiU0VUX1hUQUxfQ0FQX0ZJTkUiKSA9PSAwKSkgeworICAgICAgICBpZiAoYXJnQyA8IDQpIHsKKyAgICAgICAgICAgIGlzX3BhcmFtX2VyciA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChzdHJjYXNlY21wKGFyZ1ZbMl0sICJHRVRfRUZVU0VfQkxPQ0siKSA9PSAwKQorICAgICAgICAgICAgfHwgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9GUkVRX0NBTCIpID09IDApCisgICAgICAgICAgICB8fCAoc3RyY2FzZWNtcChhcmdWWzJdLCAiU0VUX0ZSRVFfQ0FMX0ZJTkUiKSA9PSAwKSkgeworICAgICAgICBpZiAoYXJnQyA8IDQpIHsKKyAgICAgICAgICAgIGlzX3BhcmFtX2VyciA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChzdHJjYXNlY21wKGFyZ1ZbMl0sICJTRVRfTUFDX0FERFIiKSA9PSAwKQorICAgICAgICAgICAgfHwgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9CVF9NQUNfQUREUiIpID09IDApKSB7CisgICAgICAgIGlmIChhcmdDIDwgOCkgeworICAgICAgICAgICAgaXNfcGFyYW1fZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiU0VUX1ZFTkRPUl9JTkZPIikgPT0gMCkgeworICAgICAgICBpZiAoYXJnQyA8IDQpIHsKKyAgICAgICAgICAgIGlzX3BhcmFtX2VyciA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIkdFVF9WRU5ET1JfSU5GTyIpID09IDApIHsKKyAgICAgICAgaWYgKGFyZ0MgPCAzKSB7CisgICAgICAgICAgICBpc19wYXJhbV9lcnIgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9QV1JJRFgiKSA9PSAwKQorICAgICAgICAgICAgfHwgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlJEV1JfUFdSTFZMIikgPT0gMCkKKyAgICAgICAgICAgIHx8IChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX1BXUk9GU1QiKSA9PSAwKQorICAgICAgICAgICAgfHwgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlJEV1JfUFdST0ZTVEZJTkUiKSA9PSAwKQorICAgICAgICAgICAgfHwgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlJEV1JfRUZVU0VfUFdST0ZTVCIpID09IDApCisgICAgICAgICAgICB8fCAoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9FRlVTRV9QV1JPRlNURklORSIpID09IDApKSB7CisgICAgICAgIGlmICgoKGFyZ0MgPT0gNCkgJiYgKGFyZ1ZbM11bMF0gIT0gJzAnKSkKKyAgICAgICAgICAgIHx8IChhcmdDID09IDUpCisgICAgICAgICAgICB8fCAoKGFyZ0MgPT0gNikgJiYgKGFyZ1ZbM11bMF0gPT0gJzAnKSkpIHsKKyAgICAgICAgICAgIGlzX3BhcmFtX2VyciA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX0RSVklCSVQiKSA9PSAwKQorICAgICAgICAgICAgfHwgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlJEV1JfRUZVU0VfRFJWSUJJVCIpID09IDApCisgICAgICAgICAgICB8fCAoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9FRlVTRV9TRElPQ0ZHIikgPT0gMCkKKyAgICAgICAgICAgIHx8IChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX0VGVVNFX1VTQlZJRFBJRCIpID09IDApKSB7CisgICAgICAgIGlmICgoKGFyZ0MgPT0gNCkgJiYgKGFyZ1ZbM11bMF0gIT0gJzAnKSkKKyAgICAgICAgICAgIHx8ICgoYXJnQyA9PSA1KSAmJiAoYXJnVlszXVswXSA9PSAnMCcpKSkgeworICAgICAgICAgICAgaXNfcGFyYW1fZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9QQVBSIikgPT0gMCkpIHsKKyAgICAgICAgaWYgKGFyZ0MgPCA0KSB7CisgICAgICAgICAgICBpc19wYXJhbV9lcnIgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoc3RyY2FzZWNtcChhcmdWWzJdLCAiU0VUX05PVENIIikgPT0gMCkKKyAgICAgICAgICAgIHx8IChzdHJjYXNlY21wKGFyZ1ZbMl0sICJTRVRfU1JSQyIpID09IDApCisgICAgICAgICAgICB8fCAoc3RyY2FzZWNtcChhcmdWWzJdLCAiU0VUX0ZTUyIpID09IDApKSB7CisgICAgICAgIGlmIChhcmdDIDwgNCkgeworICAgICAgICAgICAgaXNfcGFyYW1fZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHN0cmNhc2VjbXAoYXJnVlsyXSwgIkJUX1JFU0VUIikgPT0gMCkpIHsKKyAgICAgICAgY2hhciBidF9yZXNldF9oY2lfY21kWzMyXSA9ICIwMSAwMyAwYyAwMCI7CisgICAgICAgIGlmIChhcmdDID09IDMpIHsKKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBwcml2X2NtZC51c2VkX2xlbjsKKyAgICAgICAgICAgIG1lbWNweSgmcHJpdl9jbWQuYnVmW2J1Zl9sZW5dLCAmYnRfcmVzZXRfaGNpX2NtZFswXSwgc3RybGVuKGJ0X3Jlc2V0X2hjaV9jbWQpKTsKKyAgICAgICAgICAgIGJ1Zl9sZW4gKz0gc3RybGVuKGJ0X3Jlc2V0X2hjaV9jbWQpOworICAgICAgICAgICAgcHJpdl9jbWQudXNlZF9sZW4gPSBidWZfbGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXNfcGFyYW1fZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHN0cmNhc2VjbXAoYXJnVlsyXSwgIkJUX1RYREgiKSA9PSAwKSkgeworICAgICAgICBjaGFyIGJ0X3R4ZGhfaGNpX2NtZFsyNTVdID0gIjAxIDA2IDE4IDBlICI7CisgICAgICAgIGlmIChhcmdDID09IDE3KSB7CisgICAgICAgICAgICBidWZfbGVuID0gcHJpdl9jbWQudXNlZF9sZW47CisgICAgICAgICAgICBpbnQgYXJnX2xlbiA9IHN0cmxlbihhcmdWWzJdKTsKKyAgICAgICAgICAgIGludCB0eGRoX2NtZF9sZW4gPSBzdHJsZW4oYnRfdHhkaF9oY2lfY21kKTsKKyAgICAgICAgICAgIG1lbWNweSgmYnRfdHhkaF9oY2lfY21kW3R4ZGhfY21kX2xlbl0sICZwcml2X2NtZC5idWZbYXJnX2xlbisxXSwgYnVmX2xlbiAtIGFyZ19sZW4gLSAxKTsKKyAgICAgICAgICAgIG1lbWNweSgmcHJpdl9jbWQuYnVmW2FyZ19sZW4rMV0sICZidF90eGRoX2hjaV9jbWRbMF0sIHN0cmxlbihidF90eGRoX2hjaV9jbWQpKTsKKyAgICAgICAgICAgIGJ1Zl9sZW4gKz0gc3RybGVuKGJ0X3R4ZGhfaGNpX2NtZCk7CisgICAgICAgICAgICBwcml2X2NtZC51c2VkX2xlbiA9IGJ1Zl9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc19wYXJhbV9lcnIgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgoc3RyY2FzZWNtcChhcmdWWzJdLCAiQlRfUlhESCIpID09IDApKSB7CisgICAgICAgIGlmIChhcmdDID09IDE2KSB7CisgICAgICAgICAgICBjaGFyIGJ0X3J4ZGhfaGNpX2NtZFsyNTVdID0gIjAxIDBiIDE4IDBkICI7CisgICAgICAgICAgICBidWZfbGVuID0gcHJpdl9jbWQudXNlZF9sZW47CisgICAgICAgICAgICBpbnQgYXJnX2xlbiA9IHN0cmxlbihhcmdWWzJdKTsKKyAgICAgICAgICAgIGludCByeGRoX2NtZF9sZW4gPSBzdHJsZW4oYnRfcnhkaF9oY2lfY21kKTsKKyAgICAgICAgICAgIG1lbWNweSgmYnRfcnhkaF9oY2lfY21kW3J4ZGhfY21kX2xlbl0sICZwcml2X2NtZC5idWZbYXJnX2xlbisxXSwgYnVmX2xlbiAtIGFyZ19sZW4gLSAxKTsKKyAgICAgICAgICAgIG1lbWNweSgmcHJpdl9jbWQuYnVmW2FyZ19sZW4rMV0sICZidF9yeGRoX2hjaV9jbWRbMF0sIHN0cmxlbihidF9yeGRoX2hjaV9jbWQpKTsKKyAgICAgICAgICAgIGJ1Zl9sZW4gKz0gc3RybGVuKGJ0X3J4ZGhfaGNpX2NtZCk7CisgICAgICAgICAgICBwcml2X2NtZC51c2VkX2xlbiA9IGJ1Zl9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc19wYXJhbV9lcnIgPSAxOworICAgICAgICB9CisgICAgfSAgZWxzZSBpZiAoKHN0cmNhc2VjbXAoYXJnVlsyXSwgIkJUX1NUT1AiKSA9PSAwKSkgeworICAgICAgICBjaGFyIGJ0X3N0b3BfaGNpX2NtZFsyNTVdID0gIjAxIDBDIDE4IDAxICI7CisgICAgICAgIGlmIChhcmdDID09IDQpIHsKKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBwcml2X2NtZC51c2VkX2xlbjsKKyAgICAgICAgICAgIGludCBhcmdfbGVuID0gc3RybGVuKGFyZ1ZbMl0pOworICAgICAgICAgICAgaW50IHN0b3BfY21kX2xlbiA9IHN0cmxlbihidF9zdG9wX2hjaV9jbWQpOworICAgICAgICAgICAgbWVtY3B5KCZidF9zdG9wX2hjaV9jbWRbc3RvcF9jbWRfbGVuXSwgJnByaXZfY21kLmJ1ZlthcmdfbGVuKzFdLCBidWZfbGVuIC0gYXJnX2xlbiAtIDEpOworICAgICAgICAgICAgbWVtY3B5KCZwcml2X2NtZC5idWZbYXJnX2xlbisxXSwgJmJ0X3N0b3BfaGNpX2NtZFswXSwgc3RybGVuKGJ0X3N0b3BfaGNpX2NtZCkpOworICAgICAgICAgICAgYnVmX2xlbiArPSBzdHJsZW4oYnRfc3RvcF9oY2lfY21kKTsKKyAgICAgICAgICAgIHByaXZfY21kLnVzZWRfbGVuID0gYnVmX2xlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlzX3BhcmFtX2VyciA9IDE7CisgICAgICAgIH0KKyAgICB9ICBlbHNlIGlmICgoc3RyY2FzZWNtcChhcmdWWzJdLCAiQlRfREFUQSIpID09IDApKSB7CisgICAgICAgICAgICAvL2NoYXIgYnRfcmF3X2RhdGFfY21kWzI1NV07CisgICAgICAgICAgICBpbnQgYXJnX2xlbiA9IHN0cmxlbihhcmdWWzJdKTsKKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBwcml2X2NtZC51c2VkX2xlbjsKKyAgICAgICAgICAgIG1lbWNweSgmcHJpdl9jbWQuYnVmW2FyZ19sZW4rMV0sICZwcml2X2NtZC5idWZbYXJnX2xlbisxXSwgYnVmX2xlbiAtIGFyZ19sZW4gLSAxKTsKKyAgICAgICAgICAgIHByaXZfY21kLnVzZWRfbGVuID0gYnVmX2xlbiAtIGFyZ19sZW4gLSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlzX3BhcmFtX2VyciA9IDA7CisgICAgfQorCisgICAgaWYgKGlzX3BhcmFtX2VycikgeworICAgICAgICBwcmludGYoInBhcmFtIGVycm9yISEhXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBpb2N0bChzb2NrLCBUWFJYX1BBUkEsICZpZnIpKSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJjbWQgb3IgcGFyYW0gZXJyb3JcbiIpOworICAgICAgICBwcmludGYoIiVzOiBlcnJvciBpb2N0bFtUWF9QQVJBXSByZXQ9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtZW1jcHkoJnByaXZfY21kLCBpZnIuaWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgYW5kcm9pZF93aWZpX3ByaXZfY21kKSk7CisgICAgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9GUkVRX0NBTCIpID09IDApIHsKKyAgICAgICAgI2lmIChFRlVTRV9DTURfT0xEX0ZPUk1BVF9FTikKKyAgICAgICAgcHJpbnRmKCJkb25lOiBmcmVxX2NhbDogMHglOHhcbiIsICoodW5zaWduZWQgaW50ICopcHJpdl9jbWQuYnVmKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgc2lnbmVkIGNoYXIgcmVtX2NudCA9IChzaWduZWQgY2hhcilwcml2X2NtZC5idWZbMV07CisgICAgICAgIGlmIChyZW1fY250IDwgMCkgeworICAgICAgICAgICAgcHJpbnRmKCJmYWlsZWQgdG8gc2V0IGZyZXFfY2FsLCBubyByb29tIVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoImRvbmU6IGZyZXFfY2FsOiAweCUyeCAocmVtYWluOiV4KVxuIiwgKHVuc2lnbmVkIGNoYXIpcHJpdl9jbWQuYnVmWzBdLCByZW1fY250KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9GUkVRX0NBTF9GSU5FIikgPT0gMCkgeworICAgICAgICAjaWYgKEVGVVNFX0NNRF9PTERfRk9STUFUX0VOKQorICAgICAgICBwcmludGYoImRvbmU6IGZyZXFfY2FsX2ZpbmU6IDB4JTh4XG4iLCAqKHVuc2lnbmVkIGludCAqKXByaXZfY21kLmJ1Zik7CisgICAgICAgICNlbHNlCisgICAgICAgIHNpZ25lZCBjaGFyIHJlbV9jbnQgPSAoc2lnbmVkIGNoYXIpcHJpdl9jbWQuYnVmWzFdOworICAgICAgICBpZiAocmVtX2NudCA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiZmFpbGVkIHRvIHNldCBmcmVxX2NhbF9maW5lLCBubyByb29tIVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoImRvbmU6IGZyZXFfY2FsX2ZpbmU6IDB4JTJ4IChyZW1haW46JXgpXG4iLCAodW5zaWduZWQgY2hhcilwcml2X2NtZC5idWZbMF0sIHJlbV9jbnQpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiR0VUX0VGVVNFX0JMT0NLIikgPT0gMCkKKyAgICAgICAgcHJpbnRmKCJkb25lOmVmdXNlOiAweCU4eFxuIiwgKih1bnNpZ25lZCBpbnQgKilwcml2X2NtZC5idWYpOworICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9YVEFMX0NBUCIpID09IDApCisgICAgICAgIHByaW50ZigiZG9uZTp4dGFsIGNhcDogMHgleFxuIiwgKih1bnNpZ25lZCBpbnQgKilwcml2X2NtZC5idWYpOworICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlNFVF9YVEFMX0NBUF9GSU5FIikgPT0gMCkKKyAgICAgICAgcHJpbnRmKCJkb25lOnh0YWwgY2FwIGZpbmU6IDB4JXhcbiIsICoodW5zaWduZWQgaW50ICopcHJpdl9jbWQuYnVmKTsKKyAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJHRVRfUlhfUkVTVUxUIikgPT0gMCkKKyAgICAgICAgcHJpbnRmKCJkb25lOiBnZXRyeCBmY3Nvaz0lZCwgdG90YWw9JWRcbiIsICoodW5zaWduZWQgaW50ICopcHJpdl9jbWQuYnVmLCAqKHVuc2lnbmVkIGludCAqKSZwcml2X2NtZC5idWZbNF0pOworICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIkdFVF9NQUNfQUREUiIpID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJkb25lOiBnZXQgbWFjYWRkciA9ICUwMnggOiAlMDJ4IDogJTAyeCA6ICUwMnggOiAlMDJ4IDogJTAyeFxuIiwKKyAgICAgICAgICAgICoodW5zaWduZWQgY2hhciAqKSZwcml2X2NtZC5idWZbNV0sICoodW5zaWduZWQgY2hhciAqKSZwcml2X2NtZC5idWZbNF0sICoodW5zaWduZWQgY2hhciAqKSZwcml2X2NtZC5idWZbM10sCisgICAgICAgICAgICAqKHVuc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzJdLCAqKHVuc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzFdLCAqKHVuc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzBdKTsKKyAgICAgICAgI2lmICghRUZVU0VfQ01EX09MRF9GT1JNQVRfRU4pCisgICAgICAgIHByaW50ZigiICAocmVtYWluOiV4KVxuIiwgcHJpdl9jbWQuYnVmWzZdKTsKKyAgICAgICAgI2VuZGlmCisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJHRVRfQlRfTUFDX0FERFIiKSA9PSAwKSB7CisgICAgICAgIHByaW50ZigiZG9uZTogZ2V0IGJ0IG1hY2FkZHIgPSAlMDJ4IDogJTAyeCA6ICUwMnggOiAlMDJ4IDogJTAyeCA6ICUwMnhcbiIsCisgICAgICAgICAgICAqKHVuc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzVdLCAqKHVuc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzRdLCAqKHVuc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzNdLAorICAgICAgICAgICAgKih1bnNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlsyXSwgKih1bnNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlsxXSwgKih1bnNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlswXSk7CisgICAgICAgICNpZiAoIUVGVVNFX0NNRF9PTERfRk9STUFUX0VOKQorICAgICAgICBwcmludGYoIiAgKHJlbWFpbjoleClcbiIsIHByaXZfY21kLmJ1Zls2XSk7CisgICAgICAgICNlbmRpZgorICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiR0VUX0ZSRVFfQ0FMIikgPT0gMCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikmcHJpdl9jbWQuYnVmWzBdOworICAgICAgICAjaWYgKEVGVVNFX0NNRF9PTERfRk9STUFUX0VOKQorICAgICAgICBwcmludGYoImRvbmU6IGdldF9mcmVxX2NhbDogeHRhbF9jYXA9MHgleCwgeHRhbF9jYXBfZmluZT0weCV4XG4iLCB2YWwgJiAweDAwMDAwMGZmLCAodmFsID4+IDgpICYgMHgwMDAwMDBmZik7CisgICAgICAgICNlbHNlCisgICAgICAgIHByaW50ZigiZG9uZTogZ2V0X2ZyZXFfY2FsOiB4dGFsX2NhcD0weCV4IChyZW1haW46JXgpLCB4dGFsX2NhcF9maW5lPTB4JXggKHJlbWFpbjoleClcbiIsCisgICAgICAgICAgICAgICAgdmFsICYgMHhmZiwgKHZhbCA+PiA4KSAmIDB4ZmYsICh2YWwgPj4gMTYpICYgMHhmZiwgKHZhbCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgI2VuZGlmCisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJHRVRfVkVORE9SX0lORk8iKSA9PSAwKSB7CisgICAgICAgICNpZiAoRUZVU0VfQ01EX09MRF9GT1JNQVRfRU4pCisgICAgICAgIHByaW50ZigiZG9uZTogZ2V0X3ZlbmRvcl9pbmZvID0gMHgleFxuIiwgKih1bnNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlswXSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHByaW50ZigiZG9uZTogZ2V0X3ZlbmRvcl9pbmZvID0gMHgleCAocmVtYWluOiV4KVxuIiwgKih1bnNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlswXSwgcHJpdl9jbWQuYnVmWzFdKTsKKyAgICAgICAgI2VuZGlmCisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX1BXUk1NIikgPT0gMCkgeworICAgICAgICBwcmludGYoImRvbmU6IHR4cHdyIG1hbnVhbCBtb2RlID0gJXhcbiIsICoodW5zaWduZWQgaW50ICopJnByaXZfY21kLmJ1ZlswXSk7CisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX1BXUklEWCIpID09IDApIHsKKyAgICAgICAgY2hhciAqYnVmZiA9ICZwcml2X2NtZC5idWZbMF07CisgICAgICAgIHByaW50ZigiZG9uZTpcbiIKKyAgICAgICAgICAgICAgICJ0eHB3ciBpbmRleCAyLjRnOlxuIgorICAgICAgICAgICAgICAgIiAgWzBdPSVkKG9mZG1sb3dyYXRlKVxuIgorICAgICAgICAgICAgICAgIiAgWzFdPSVkKG9mZG02NHFhbSlcbiIKKyAgICAgICAgICAgICAgICIgIFsyXT0lZChvZmRtMjU2cWFtKVxuIgorICAgICAgICAgICAgICAgIiAgWzNdPSVkKG9mZG0xMDI0cWFtKVxuIgorICAgICAgICAgICAgICAgIiAgWzRdPSVkKGRzc3MpXG4iLCBidWZmWzBdLCBidWZmWzFdLCBidWZmWzJdLCBidWZmWzNdLCBidWZmWzRdKTsKKyAgICAgICAgcHJpbnRmKCJ0eHB3ciBpbmRleCA1ZzpcbiIKKyAgICAgICAgICAgICAgICIgIFswXT0lZChvZmRtbG93cmF0ZSlcbiIKKyAgICAgICAgICAgICAgICIgIFsxXT0lZChvZmRtNjRxYW0pXG4iCisgICAgICAgICAgICAgICAiICBbMl09JWQob2ZkbTI1NnFhbSlcbiIKKyAgICAgICAgICAgICAgICIgIFszXT0lZChvZmRtMTAyNHFhbSlcbiIsIGJ1ZmZbNV0sIGJ1ZmZbNl0sIGJ1ZmZbN10sIGJ1ZmZbOF0pOworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9QV1JMVkwiKSA9PSAwKSB7CisgICAgICAgIGNoYXIgKmJ1ZmYgPSAmcHJpdl9jbWQuYnVmWzBdOworICAgICAgICBpbnQgZ3JwID0gMDsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgY250ID0gMDsKKwlpbnQgdG1wX2lkeCA9IDA7CisKKyAgICAgICAgcHJpbnRmKCJkb25lOlxuIgorICAgICAgICAgICAgICAgInR4cHdyIGluZGV4IDIuNGc6IFswXToxMWIrMTFhL2csIFsxXToxMW4vMTFhYywgWzJdOjExYXhcbiIpOworICAgICAgICBmb3IgKGdycCA9IDA7IGdycCA8IDM7IGdycCsrKSB7CisgICAgICAgICAgICBpbnQgY250ID0gMTI7CisgICAgICAgICAgICBpZiAoZ3JwID09IDEpIHsKKyAgICAgICAgICAgICAgICBjbnQgPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiICBbJXhdID0iLCBncnApOworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBjbnQ7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkeCAmJiAhKGlkeCAmIDB4MykpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiICUyZCIsIGJ1ZmZbMTIgKiBncnAgKyBpZHhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiXHJcbiIpOworICAgICAgICB9CisJcHJpbnRmKCJ0eHB3ciBpbmRleCA1ZzogWzBdOjExYSwgWzFdOjExbi8xMWFjLCBbMl06MTFheFxuIik7CisJZm9yIChncnAgPSAwOyBncnAgPCAzOyBncnArKykgeworCQljbnQgPSAxMjsKKwkJaWR4ID0gMDsKKwkJaWYgKGdycCA9PSAwKSB7CisJCSAgICB0bXBfaWR4ID0gNDsKKwkJfQorCQlpZiAoZ3JwID09IDEpIHsKKwkJICAgIGNudCA9IDEwOworICAgICAgICAgICAgICAgICAgICB0bXBfaWR4ID0gMDsKKwkJfQorCQlwcmludGYoIiAgWyV4XSA9IiwgZ3JwKTsKKwkJZm9yIChpZHggPSB0bXBfaWR4IDsgaWR4IDwgY250OyBpZHgrKykgeworCQkgICAgaWYgKGlkeCAmICEoaWR4ICYgMHgzKSkgeworCQkJcHJpbnRmKCIgIik7CisJCSAgICB9CisJCSAgICBwcmludGYoIiAlMmQiLCBidWZmWzEyICogKGdycCArIDMpICsgaWR4XSk7CisJCX0KKwkJcHJpbnRmKCJcclxuIik7CisJfQorCisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX1BXUk9GU1QiKSA9PSAwKSB7CisgICAgICAgIHNpZ25lZCBjaGFyICpidWZmID0gKHNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlswXTsKKyAgICAgICAgI2lmIChDSElQX1NFTEVDVCAhPSBDSElQX0FJQzg4MDBEODApCisgICAgICAgIHByaW50ZigiZG9uZTpcbiIKKyAgICAgICAgICAgICAgICJ0eHB3ciBvZmZzZXQgMi40ZzogXG4iCisgICAgICAgICAgICAgICAiICBbMF09JWQoY2gxfjQpXG4iCisgICAgICAgICAgICAgICAiICBbMV09JWQoY2g1fjkpXG4iCisgICAgICAgICAgICAgICAiICBbMl09JWQoY2gxMH4xMylcbiIsIChpbnQ4X3QpYnVmZlswXSwgKGludDhfdClidWZmWzFdLCAoaW50OF90KWJ1ZmZbMl0pOworICAgICAgICBwcmludGYoInR4cHdyIG9mZnNldCA1ZzpcbiIKKyAgICAgICAgICAgICAgICIgIFswXT0lZChjaDM2fjY0KVxuIgorICAgICAgICAgICAgICAgIiAgWzFdPSVkKGNoMTAwfjEyMClcbiIKKyAgICAgICAgICAgICAgICIgIFsyXT0lZChjaDEyMn4xNDApXG4iCisgICAgICAgICAgICAgICAiICBbM109JWQoY2gxNDJ+MTY1KVxuIiwgKGludDhfdClidWZmWzNdLCAoaW50OF90KWJ1ZmZbNF0sIChpbnQ4X3QpYnVmZls1XSwgKGludDhfdClidWZmWzZdKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaW50IHR5cGUsIGNoX2dycDsKKyAgICAgICAgcHJpbnRmKCJkb25lOlxuIgorICAgICAgICAgICAgInB3cm9mc3QyeCAyLjRnOiBbMF06MTFiLCBbMV06b2ZkbV9oaWdocmF0ZSwgWzJdOm9mZG1fbG93cmF0ZVxuIgorICAgICAgICAgICAgIiAgY2hhbj0iICJcdDEtNCIgIlx0NS05IiAiXHQxMC0xMyIpOworICAgICAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgMzsgdHlwZSsrKSB7CisgICAgICAgICAgICBwcmludGYoIlxuICBbJWRdID0iLCB0eXBlKTsKKyAgICAgICAgICAgIGZvciAoY2hfZ3JwID0gMDsgY2hfZ3JwIDwgMzsgY2hfZ3JwKyspIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlx0JWQiLCBidWZmWzMgKiB0eXBlICsgY2hfZ3JwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbnB3cm9mc3QyeCA1ZzogWzBdOm9mZG1fbG93cmF0ZSwgWzFdOm9mZG1faGlnaHJhdGUsIFsyXTpvZmRtX21pZHJhdGVcbiIKKyAgICAgICAgICAgICIgIGNoYW49IiAiXHQzNi01MCIgIlx0NTEtNjQiICJcdDk4LTExNCIgIlx0MTE1LTEzMCIgIlx0MTMxLTE0NiIgIlx0MTQ3LTE2NiIpOworICAgICAgICBidWZmID0gKHNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlszICogM107CisgICAgICAgIGZvciAodHlwZSA9IDA7IHR5cGUgPCAzOyB0eXBlKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4gIFslZF0gPSIsIHR5cGUpOworICAgICAgICAgICAgZm9yIChjaF9ncnAgPSAwOyBjaF9ncnAgPCA2OyBjaF9ncnArKykgeworICAgICAgICAgICAgICAgIHByaW50ZigiXHQlZCIsIGJ1ZmZbNiAqIHR5cGUgKyBjaF9ncnBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICNlbmRpZgorICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9QV1JPRlNURklORSIpID09IDApIHsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmJ1ZmYgPSAoc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzBdOworICAgICAgICBwcmludGYoImRvbmU6XG4iCisgICAgICAgICAgICAgICAidHhwd3Igb2Zmc2V0IGZpbmUgMi40ZzogXG4iCisgICAgICAgICAgICAgICAiICBbMF09JWQoY2gxfjQpXG4iCisgICAgICAgICAgICAgICAiICBbMV09JWQoY2g1fjkpXG4iCisgICAgICAgICAgICAgICAiICBbMl09JWQoY2gxMH4xMylcbiIsIChpbnQ4X3QpYnVmZlswXSwgKGludDhfdClidWZmWzFdLCAoaW50OF90KWJ1ZmZbMl0pOworICAgICAgICBwcmludGYoInR4cHdyIG9mZnNldCBmaW5lIDVnOlxuIgorICAgICAgICAgICAgICAgIiAgWzBdPSVkKGNoMzZ+NjQpXG4iCisgICAgICAgICAgICAgICAiICBbMV09JWQoY2gxMDB+MTIwKVxuIgorICAgICAgICAgICAgICAgIiAgWzJdPSVkKGNoMTIyfjE0MClcbiIKKyAgICAgICAgICAgICAgICIgIFszXT0lZChjaDE0Mn4xNjUpXG4iLCAoaW50OF90KWJ1ZmZbM10sIChpbnQ4X3QpYnVmZls0XSwgKGludDhfdClidWZmWzVdLCAoaW50OF90KWJ1ZmZbNl0pOworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9EUlZJQklUIikgPT0gMCkgeworICAgICAgICBjaGFyICpidWZmID0gJnByaXZfY21kLmJ1ZlswXTsKKwlpbnQgaWR4ID0gMDsKKyAgICAgICAgcHJpbnRmKCJkb25lOiAyLjRnIHR4Z2FpbiB0YmwgcGEgZHJ2X2liaXQ6XG4iKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCAxNjsgaWR4KyspIHsKKyAgICAgICAgICAgIHByaW50ZigiICV4IiwgYnVmZltpZHhdKTsKKyAgICAgICAgICAgIGlmICghKChpZHggKyAxKSAmIDB4MDMpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgWyV4fiV4XVxuIiwgaWR4IC0gMywgaWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9FRlVTRV9QV1JPRlNUIikgPT0gMCkgeworICAgICAgICBzaWduZWQgY2hhciAqYnVmZiA9IChzaWduZWQgY2hhciAqKSZwcml2X2NtZC5idWZbMF07CisgICAgICAgICNpZiAoRUZVU0VfQ01EX09MRF9GT1JNQVRfRU4pCisgICAgICAgICNpZiAoQ0hJUF9TRUxFQ1QgIT0gQ0hJUF9BSUM4ODAwRDgwKQorICAgICAgICBwcmludGYoImRvbmU6XG4iCisgICAgICAgICAgICAgICAiZWZ1c2UgdHhwd3Igb2Zmc2V0IDIuNGc6XG4iCisgICAgICAgICAgICAgICAiICBbMF09JWQoY2gxfjQpXG4iCisgICAgICAgICAgICAgICAiICBbMV09JWQoY2g1fjkpXG4iCisgICAgICAgICAgICAgICAiICBbMl09JWQoY2gxMH4xMylcbiIsIChpbnQ4X3QpYnVmZlswXSwgKGludDhfdClidWZmWzFdLCAoaW50OF90KWJ1ZmZbMl0pOworICAgICAgICBwcmludGYoImVmdXNlIHR4cHdyIG9mZnNldCA1ZzpcbiIKKyAgICAgICAgICAgICAgICIgIFswXT0lZChjaDM2fjY0KVxuIgorICAgICAgICAgICAgICAgIiAgWzFdPSVkKGNoMTAwfjEyMClcbiIKKyAgICAgICAgICAgICAgICIgIFsyXT0lZChjaDEyMn4xNDApXG4iCisgICAgICAgICAgICAgICAiICBbM109JWQoY2gxNDJ+MTY1KVxuIiwgKGludDhfdClidWZmWzNdLCAoaW50OF90KWJ1ZmZbNF0sIChpbnQ4X3QpYnVmZls1XSwgKGludDhfdClidWZmWzZdKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaW50IHR5cGUsIGNoX2dycDsKKyAgICAgICAgcHJpbnRmKCJkb25lOlxuIgorICAgICAgICAgICAgInB3cm9mc3QyeCAyLjRnOiBbMF06MTFiLCBbMV06b2ZkbV9oaWdocmF0ZSwgWzJdOm9mZG1fbG93cmF0ZVxuIgorICAgICAgICAgICAgIiAgY2hhbj0iICJcdDEtNCIgIlx0NS05IiAiXHQxMC0xMyIpOworICAgICAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgMzsgdHlwZSsrKSB7CisgICAgICAgICAgICBwcmludGYoIlxuICBbJWRdID0iLCB0eXBlKTsKKyAgICAgICAgICAgIGZvciAoY2hfZ3JwID0gMDsgY2hfZ3JwIDwgMzsgY2hfZ3JwKyspIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlx0JWQiLCBidWZmWzMgKiB0eXBlICsgY2hfZ3JwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbnB3cm9mc3QyeCA1ZzogWzBdOm9mZG1fbG93cmF0ZSwgWzFdOm9mZG1faGlnaHJhdGUsIFsyXTpvZmRtX21pZHJhdGVcbiIKKyAgICAgICAgICAgICIgIGNoYW49IiAiXHQzNi01MCIgIlx0NTEtNjQiICJcdDk4LTExNCIgIlx0MTE1LTEzMCIgIlx0MTMxLTE0NiIgIlx0MTQ3LTE2NiIpOworICAgICAgICBidWZmID0gKHNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlszICogM107CisgICAgICAgIGZvciAodHlwZSA9IDA7IHR5cGUgPCAzOyB0eXBlKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4gIFslZF0gPSIsIHR5cGUpOworICAgICAgICAgICAgZm9yIChjaF9ncnAgPSAwOyBjaF9ncnAgPCA2OyBjaF9ncnArKykgeworICAgICAgICAgICAgICAgIHByaW50ZigiXHQlZCIsIGJ1ZmZbNiAqIHR5cGUgKyBjaF9ncnBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICNlbmRpZgorICAgICAgICAjZWxzZQorICAgICAgICBwcmludGYoImRvbmU6XG4iCisgICAgICAgICAgICAgICAiZWZ1c2UgdHhwd3Igb2Zmc2V0IDIuNGc6XG4iCisgICAgICAgICAgICAgICAiICBbMF09JWQocmVtYWluOiV4LCBjaDF+NClcbiIKKyAgICAgICAgICAgICAgICIgIFsxXT0lZChyZW1haW46JXgsIGNoNX45KVxuIgorICAgICAgICAgICAgICAgIiAgWzJdPSVkKHJlbWFpbjoleCwgY2gxMH4xMylcbiIsCisgICAgICAgICAgICAgICAoaW50OF90KWJ1ZmZbMF0sIChpbnQ4X3QpYnVmZlszXSwKKyAgICAgICAgICAgICAgIChpbnQ4X3QpYnVmZlsxXSwgKGludDhfdClidWZmWzRdLAorICAgICAgICAgICAgICAgKGludDhfdClidWZmWzJdLCAoaW50OF90KWJ1ZmZbNV0pOworICAgICAgICBpZiAocmV0ID4gNikgeyAvLyA1Z19lbgorICAgICAgICAgICAgcHJpbnRmKCJlZnVzZSB0eHB3ciBvZmZzZXQgNWc6XG4iCisgICAgICAgICAgICAgICAgICAgIiAgWzBdPSVkKHJlbWFpbjoleCwgY2gzNn42NClcbiIKKyAgICAgICAgICAgICAgICAgICAiICBbMV09JWQocmVtYWluOiV4LCBjaDEwMH4xMjApXG4iCisgICAgICAgICAgICAgICAgICAgIiAgWzJdPSVkKHJlbWFpbjoleCwgY2gxMjJ+MTQwKVxuIgorICAgICAgICAgICAgICAgICAgICIgIFszXT0lZChyZW1haW46JXgsIGNoMTQyfjE2NSlcbiIsCisgICAgICAgICAgICAgICAgICAgKGludDhfdClidWZmWzZdLCAoaW50OF90KWJ1ZmZbMTBdLAorICAgICAgICAgICAgICAgICAgIChpbnQ4X3QpYnVmZls3XSwgKGludDhfdClidWZmWzExXSwKKyAgICAgICAgICAgICAgICAgICAoaW50OF90KWJ1ZmZbOF0sIChpbnQ4X3QpYnVmZlsxMl0sCisgICAgICAgICAgICAgICAgICAgKGludDhfdClidWZmWzldLCAoaW50OF90KWJ1ZmZbMTNdKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlJEV1JfRUZVU0VfUFdST0ZTVEZJTkUiKSA9PSAwKSB7CisgICAgICAgIHNpZ25lZCBjaGFyICpidWZmID0gKHNpZ25lZCBjaGFyICopJnByaXZfY21kLmJ1ZlswXTsKKyAgICAgICAgI2lmIChFRlVTRV9DTURfT0xEX0ZPUk1BVF9FTikKKyAgICAgICAgcHJpbnRmKCJkb25lOlxuIgorICAgICAgICAgICAgICAgImVmdXNlIHR4cHdyIG9mZnNldCBmaW5lIDIuNGc6XG4iCisgICAgICAgICAgICAgICAiICBbMF09JWQoY2gxfjQpXG4iCisgICAgICAgICAgICAgICAiICBbMV09JWQoY2g1fjkpXG4iCisgICAgICAgICAgICAgICAiICBbMl09JWQoY2gxMH4xMylcbiIsIChpbnQ4X3QpYnVmZlswXSwgKGludDhfdClidWZmWzFdLCAoaW50OF90KWJ1ZmZbMl0pOworICAgICAgICBwcmludGYoImVmdXNlIHR4cHdyIG9mZnNldCBmaW5lIDVnOlxuIgorICAgICAgICAgICAgICAgIiAgWzBdPSVkKGNoMzZ+NjQpXG4iCisgICAgICAgICAgICAgICAiICBbMV09JWQoY2gxMDB+MTIwKVxuIgorICAgICAgICAgICAgICAgIiAgWzJdPSVkKGNoMTIyfjE0MClcbiIKKyAgICAgICAgICAgICAgICIgIFszXT0lZChjaDE0Mn4xNjUpXG4iLCAoaW50OF90KWJ1ZmZbM10sIChpbnQ4X3QpYnVmZls0XSwgKGludDhfdClidWZmWzVdLCAoaW50OF90KWJ1ZmZbNl0pOworICAgICAgICAjZWxzZQorICAgICAgICBwcmludGYoImRvbmU6XG4iCisgICAgICAgICAgICAgICAiZWZ1c2UgdHhwd3Igb2Zmc2V0IGZpbmUgMi40ZzpcbiIKKyAgICAgICAgICAgICAgICIgIFswXT0lZChyZW1haW46JXgsIGNoMX40KVxuIgorICAgICAgICAgICAgICAgIiAgWzFdPSVkKHJlbWFpbjoleCwgY2g1fjkpXG4iCisgICAgICAgICAgICAgICAiICBbMl09JWQocmVtYWluOiV4LCBjaDEwfjEzKVxuIiwKKyAgICAgICAgICAgICAgIChpbnQ4X3QpYnVmZlswXSwgKGludDhfdClidWZmWzNdLAorICAgICAgICAgICAgICAgKGludDhfdClidWZmWzFdLCAoaW50OF90KWJ1ZmZbNF0sCisgICAgICAgICAgICAgICAoaW50OF90KWJ1ZmZbMl0sIChpbnQ4X3QpYnVmZls1XSk7CisgICAgICAgIGlmIChyZXQgPiA2KSB7IC8vIDVnX2VuCisgICAgICAgICAgICBwcmludGYoImVmdXNlIHR4cHdyIG9mZnNldCBmaW5lIDVnOlxuIgorICAgICAgICAgICAgICAgICAgICIgIFswXT0lZChyZW1haW46JXgsIGNoMzZ+NjQpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgWzFdPSVkKHJlbWFpbjoleCwgY2gxMDB+MTIwKVxuIgorICAgICAgICAgICAgICAgICAgICIgIFsyXT0lZChyZW1haW46JXgsIGNoMTIyfjE0MClcbiIKKyAgICAgICAgICAgICAgICAgICAiICBbM109JWQocmVtYWluOiV4LCBjaDE0Mn4xNjUpXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQ4X3QpYnVmZls2XSwgKGludDhfdClidWZmWzEwXSwKKyAgICAgICAgICAgICAgICAgICAoaW50OF90KWJ1ZmZbN10sIChpbnQ4X3QpYnVmZlsxMV0sCisgICAgICAgICAgICAgICAgICAgKGludDhfdClidWZmWzhdLCAoaW50OF90KWJ1ZmZbMTJdLAorICAgICAgICAgICAgICAgICAgIChpbnQ4X3QpYnVmZls5XSwgKGludDhfdClidWZmWzEzXSk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX0VGVVNFX0RSVklCSVQiKSA9PSAwKSB7CisgICAgICAgICNpZiAoRUZVU0VfQ01EX09MRF9GT1JNQVRfRU4pCisgICAgICAgIHByaW50ZigiZG9uZTogZWZzdWUgMi40ZyB0eGdhaW4gdGJsIHBhIGRydl9pYml0OiAleFxuIiwgcHJpdl9jbWQuYnVmWzBdKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaW50IHZhbCA9ICooaW50ICopJnByaXZfY21kLmJ1ZlswXTsKKyAgICAgICAgaWYgKHZhbCA8IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiZmFpbGVkIHRvIHJkL3dyIGVmdXNlIGRydl9pYml0LCByZXQ9JWRcbiIsIHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoImRvbmU6IGVmc3VlIDIuNGcgdHhnYWluIHRibCBwYSBkcnZfaWJpdDogJXggKHJlbWFpbjogJXgpXG4iLCBwcml2X2NtZC5idWZbMF0sIHByaXZfY21kLmJ1ZlsxXSk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX0VGVVNFX1NESU9DRkciKSA9PSAwKSB7CisgICAgICAgIHByaW50ZigiZG9uZTogZWZzdWUgc2RpbyBjZmc6ICV4XG4iLCBwcml2X2NtZC5idWZbMF0pOworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiUkRXUl9FRlVTRV9VU0JWSURQSUQiKSA9PSAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXByaXZfY21kLmJ1ZlswXSB8CisgICAgICAgICAgICAodW5zaWduZWQgaW50KShwcml2X2NtZC5idWZbMV0gPDwgIDgpIHwKKyAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKHByaXZfY21kLmJ1ZlsyXSA8PCAxNikgfAorICAgICAgICAgICAgKHVuc2lnbmVkIGludCkocHJpdl9jbWQuYnVmWzNdIDw8IDI0KTsKKyAgICAgICAgcHJpbnRmKCJkb25lOiBlZnN1ZSB1c2IgdmlkL3BpZDogJXhcbiIsIHZhbCk7CisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJHRVRfQ0FMX1hUQUxfUkVTIikgPT0gMCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikmcHJpdl9jbWQuYnVmWzBdOworICAgICAgICBwcmludGYoImRvbmU6IGdldF9jYWxfeHRhbF9yZXM6IGNhcD0weCV4LCBjYXBfZmluZT0weCV4XG4iLCB2YWwgJiAweDAwMDAwMGZmLCAodmFsID4+IDgpICYgMHgwMDAwMDBmZik7CisgICAgfSBlbHNlIGlmICgoc3RyY2FzZWNtcChhcmdWWzJdLCAiR0VUX0NPQl9DQUxfUkVTIikgPT0gMCkgfHwgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIkRPX0NPQl9URVNUIikgPT0gMCkpeworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikmcHJpdl9jbWQuYnVmWzBdOworICAgICAgICB1bnNpZ25lZCBpbnQgdmFsMCA9ICoodW5zaWduZWQgaW50ICopJnByaXZfY21kLmJ1Zls0XTsKKyAgICAgICAgY29iX3Jlc3VsdF9wdHIgPSAoY29iX3Jlc3VsdF9wdHJfdCAqKSAodW5zaWduZWQgaW50ICopJnByaXZfY21kLmJ1Zls4XTsKKyAgICAgICAgcHJpbnRmKCJkb25lOlxuY2FwPSAweCV4IGNhcF9maW5lPSAweCV4IGZyZXFfb2ZzdD0gJWQgSHogZ29sZGVuX3Jjdl9kdXQ9ICVkIHR4X3Jzc2k9ICVkIGRCbSBzbnI9ICVkIGRCIGR1dF9yY3ZfZ29kbGRlbj0gJWQgcnhfcnNzaT0gJWQgZEJtXG4iLAorCQkJCXZhbCAmIDB4MDAwMDAwZmYsICh2YWwgPj4gOCkgJiAweDAwMDAwMGZmLCB2YWwwLCBjb2JfcmVzdWx0X3B0ci0+Z29sZGVuX3Jjdl9kdXRfbnVtLCBjb2JfcmVzdWx0X3B0ci0+cnNzaV9zdGF0aWMsIGNvYl9yZXN1bHRfcHRyLT5zbnJfc3RhdGljLCBjb2JfcmVzdWx0X3B0ci0+ZHV0X3Jjdl9nb2xkZW5fbnVtLCBjb2JfcmVzdWx0X3B0ci0+ZHV0X3Jzc2lfc3RhdGljKTsKKyAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnVlsyXSwgIlJEV1JfRUZVU0VfVVNSREFUQSIpID09IDApIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHVzcl9kYXRhWzNdOworICAgICAgICB1c3JfZGF0YVswXSA9ICoodW5zaWduZWQgaW50ICopJnByaXZfY21kLmJ1ZlswXTsKKyAgICAgICAgdXNyX2RhdGFbMV0gPSAqKHVuc2lnbmVkIGludCAqKSZwcml2X2NtZC5idWZbNF07CisgICAgICAgIHVzcl9kYXRhWzJdID0gKih1bnNpZ25lZCBpbnQgKikmcHJpdl9jbWQuYnVmWzhdOworICAgICAgICBwcmludGYoImRvbmU6IGVmdXNlIHVzcmRhdGE6XG4gWzBdPTB4JTA4eFxuIFsxXT0weCUwOHhcbiBbMl09MHglMDh4XG4iLAorICAgICAgICAgICAgdXNyX2RhdGFbMF0sIHVzcl9kYXRhWzFdLCB1c3JfZGF0YVsyXSk7CisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJSRFdSX0VGVVNFX0hFX09GRiIpID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJFRlVTRV9IRV9PRkY6ICVkXG4iLCBwcml2X2NtZC5idWZbMF0pOworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmdWWzJdLCAiR0VUX0JUX1JYX1JFU1VMVCIpID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJkb25lOiBnZXQgYnQgcnggdG90YWw9JWQsIG9rPSVkLCBlcnI9JWRcbiIsICoodW5zaWduZWQgaW50ICopcHJpdl9jbWQuYnVmLAorICAgICAgICAgICAgKih1bnNpZ25lZCBpbnQgKikmcHJpdl9jbWQuYnVmWzRdLAorICAgICAgICAgICAgKih1bnNpZ25lZCBpbnQgKikmcHJpdl9jbWQuYnVmWzhdKTsKKyAgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ1ZbMl0sICJCVF9EQVRBIikgPT0gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmID0gKHVuc2lnbmVkIGNoYXIgKikmcHJpdl9jbWQuYnVmWzFdOworICAgICAgICBpbnQgIGxlbiA9IHByaXZfY21kLmJ1ZlswXTsKKwlpbnQgaWR4ID0gMDsKKyAgICAgICAgcHJpbnRmKCJkb25lOiAlZFxuIiwgbGVuKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgYnVmZltpZHhdKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZigiZG9uZVxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IG1haW4oaW50IGFyZ0MsIGNoYXIgKmFyZ1ZbXSkKK3sKKworCS8vY2hhciogaW5zID0gImluc21vZCI7CisJLy9jaGFyKiBybSA9ICJybW1vZCI7CisJLy9jaGFyKiBrbyA9ICJyd254X2ZkcnYua28iOworCisvLwlwcmludGYoImVudGVyISEhQUlDICAgIGFyZ0M9JWQgICAgYXJnVlswXT0lcyAgICBhcmdWWzFdPSVzICAgIGFyZ1ZbMl09JXNcbiIsIGFyZ0MsIGFyZ1ZbMF0sIGFyZ1ZbMV0sYXJnVlsyXSk7CisJaWYoYXJnQyA+PSAzKQorCQl3aWZpX3NlbmRfY21kX3RvX25ldF9pbnRlcmZhY2UoYXJnVlsxXSwgYXJnQywgYXJnVik7CisJZWxzZQorCQlwcmludGYoIkJhZCBwYXJhbWV0ZXIhICVkXG4iLGFyZ0MpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcC9hcHAvenRlX2NvbW0vd2xhbi9zcmMvd2lmaV9hcF9jdHJsLmMgYi9hcC9hcHAvenRlX2NvbW0vd2xhbi9zcmMvd2lmaV9hcF9jdHJsLmMKaW5kZXggZTNlNGFhZC4uN2NkNWMxZCAxMDA3NTUKLS0tIGEvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dpZmlfYXBfY3RybC5jCisrKyBiL2FwL2FwcC96dGVfY29tbS93bGFuL3NyYy93aWZpX2FwX2N0cmwuYwpAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBBUF9TVEFfQ09OTkVDVEVEICJBUC1TVEEtQ09OTkVDVEVEICIKICNkZWZpbmUgQVBfU1RBX0RJU0NPTk5FQ1RFRCAiQVAtU1RBLURJU0NPTk5FQ1RFRCAiCiAjZGVmaW5lIEFQX0VWRU5UX0VOQUJMRUQgIkFQLUVOQUJMRUQgIgorI2RlZmluZSBBUF9FVkVOVF9ESVNBQkxFRCAiQVAtRElTQUJMRUQgIgogCiAjZGVmaW5lIE1VTFRJX0FQX1NUQV9DT05ORUNURUQgIk1VTFRJLUFQLVNUQS1DT05ORUNURUQgIgogI2RlZmluZSBNVUxUSV9BUF9TVEFfRElTQ09OTkVDVEVEICJNVUxUSS1BUC1TVEEtRElTQ09OTkVDVEVEICIKQEAgLTU5LDExICs2MCwxNSBAQAogI2RlZmluZSBIVF9DQVBBQl8yMCAiW0hUMjBdW1NIT1JULUdJLTIwXSIKICNlbGlmIGRlZmluZWQoX19BSUNfODgwMERXX0NISVBfXykKICNkZWZpbmUgSFRfQ0FQQUJfNDAgIltMRFBDXVtIVDQwK11bSFQ0MC1dW1NIT1JULUdJLTIwXVtTSE9SVC1HSS00MF0iCisjZGVmaW5lIEhUX0NBUEFCXzQwUExVUyAiW0xEUENdW0hUNDArXVtTSE9SVC1HSS0yMF1bU0hPUlQtR0ktNDBdIgorI2RlZmluZSBIVF9DQVBBQl80ME1JTlVTICJbTERQQ11bSFQ0MC1dW1NIT1JULUdJLTIwXVtTSE9SVC1HSS00MF0iCiAjZGVmaW5lIEhUX0NBUEFCXzIwICJbSFQyMF1bTERQQ11bU0hPUlQtR0ktMjBdIgogCiAjZGVmaW5lIFZIVF9DQVBBQl8xNjAgIltTSE9SVC1HSS04MF1bU0hPUlQtR0ktMTYwXVtWSFQxNjBdIi8vdW5zdXBwb3J0Ci0jZGVmaW5lIFZIVF9DQVBBQl84MCAiW1ZIVDQwK10iIC8vaW52YWxpZCBwYXJhbWV0ZXIgW1NIT1JULUdJLTgwXVtNQVgtQS1NUERVLUxFTi1FWFA3XQorI2RlZmluZSBWSFRfQ0FQQUJfODAgIltTSE9SVC1HSS04MF1bTUFYLUEtTVBEVS1MRU4tRVhQN10iCiAjZGVmaW5lIFZIVF9DQVBBQl80MCAiW0hUNDArXVtIVDQwLV1bU0hPUlQtR0ktMjBdW1NIT1JULUdJLTQwXSIgLy81RyBodAorI2RlZmluZSBWSFRfQ0FQQUJfNDBQTFVTICJbSFQ0MCtdW1NIT1JULUdJLTIwXVtTSE9SVC1HSS00MF0iIC8vNUcgaHQ0MCsKKyNkZWZpbmUgVkhUX0NBUEFCXzQwTUlOVVMgIltIVDQwLV1bU0hPUlQtR0ktMjBdW1NIT1JULUdJLTQwXSIgLy81RyBodDQwLQogI2VuZGlmCiAKIC8qKioqKioqKioqbW1pIHdsYW4gd3BzIHN0YXR1cyoqKioqKioqKioqKioqKi8KQEAgLTExMCwxMSArMTE1LDIzIEBACiAjZGVmaW5lIElOVF9NQVggMjE0NzQ4MzY0NwogCiBleHRlcm4gaW50IGdfd29ya19tb2RlOworZXh0ZXJuIGludCBnX2NhcF93aWZpX2VuYWJsZTsKK2V4dGVybiBpbnQgZ19jYXBfYXBfZW5hYmxlOworZXh0ZXJuIGludCBnX2NhcF9zdGFfZW5hYmxlOwogCiBleHRlcm4gdm9pZCBhY2xfbW9kZV9zZXQoKTsKIGV4dGVybiB2b2lkIGFjbF9tb2RlX3NldF81ZygpOworZXh0ZXJuIGludCBzZW5kX3dsYW5fc3RhdHVzX3RvX2NhcChpbnQgc3RhdHVzKTsKICNlbmRpZgogCisjZGVmaW5lIERFVl9IVF80MCAJCTIgICAvL2h0NDArICYgaHQ0MC0KKyNkZWZpbmUgREVWX0hUXzQwUExVUyAJMQorI2RlZmluZSBERVZfSFRfNDBNSU5VUyAJMAorI2RlZmluZSBERVZfSFRfUEFUSCAiL3N5cy9tb2R1bGUvYWljODgxOF9mZHJ2L3BhcmFtZXRlcnMvc2VjX2NoYW5faGlnaCIKK3N0YXRpYyBpbnQgZ19odF8yZyA9IERFVl9IVF80MDsgCitzdGF0aWMgaW50IHNldF9odF8yZyhpbnQgaHQpOworCisKIGV4dGVybiBzdHJ1Y3QgICB3bGFuX2FwX3NlcnZlciAgKiBhcF9zZXJ2ZXI7CiBpbnQgd2lmaV9zdGFydF9ob3N0YXBkIChzdHJ1Y3QgIHdsYW5fYXBfc2VydmVyICAqYXBfc3ZyKTsKIHN0YXRpYyB2b2lkIHdsYW5fYXBfaW5pdChzdHJ1Y3Qgd2xhbl9hcF9zZXJ2ZXIgICphcF9zdnIpOwpAQCAtMTI0LDcgKzE0MSw4IEBACiBzdGF0aWMgaW50IHdpZmlfYXBfZW5hYmxlKHN0cnVjdCAgd2xhbl9hcF9zZXJ2ZXIgICphcF9zdnIpOwogCiBzdGF0aWMgdm9pZCB3bGFuX3NldF90eHB3cih2b2lkKTsKLQorc3RhdGljIHZvaWQgd2FpdF9hcF9lbmFibGVkKHZvaWQpOworc3RhdGljIHZvaWQgc3RhX251bV9hcHN0YV9vcGVuKHZvaWQpOwogCiBib29sIGlzU29mdGFwU3RhcnRlZChzdHJ1Y3Qgd2xhbl9hcF9zZXJ2ZXIgICphcF9zdnIpOwogdm9pZCBnZW5lcmF0ZV9hY2xfbGlzdF9maWxlKGNoYXIqIGFjY2Vzc3BvbGljeSk7CkBAIC0zNDIsOCArMzYwLDE0IEBACiAKICAgICBpZiAoIXBpZCkgewogCQkvL2t3IDMKKyNpZiBkZWZpbmVkKF9fQUlDXzg4MDBfRDgwTF9fKQogICAgICAgICBleGVjbChIT1NUQVBEX0JJTl9GSUxFLCBIT1NUQVBEX0JJTl9GSUxFLAorICAgICAgICAgICAgICAgICAgIi1kIiwgSE9TVEFQRF9DT05GX0ZJTEUsICItYyIsICIxIiwgKGNoYXIgKikgTlVMTCk7CisjZWxzZQorCQlleGVjbChIT1NUQVBEX0JJTl9GSUxFLCBIT1NUQVBEX0JJTl9GSUxFLAogICAgICAgICAgICAgICAgICAgIi1kIiwgSE9TVEFQRF9DT05GX0ZJTEUsIChjaGFyICopIE5VTEwpOworI2VuZGlmCisKICAgICAgICAgd2ZfbG9nKCJTb2Z0QVAgZmFpbGVkIHRvIHN0YXJ0ICglcykiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKQEAgLTM1Miw3ICszNzYsNyBAQAogCQlhcF9zdnItPnNvY2tfbS5waWQgPSBwaWQ7CiAjZW5kaWYJCQogICAgICAgICB3Zl9sb2coIlNvZnRBUCBzdGFydGVkIHN1Y2Nlc3NmdWxseSBwaWQ9JWQgcGlkPSVkIiwgYXBfc3ZyLT5zb2NrLnBpZCxhcF9zdnItPnNvY2tfbS5waWQpOwotICAgICAgICB1c2xlZXAoQVBfQlNTX1NUQVJUX0RFTEFZKTsKKyAgICAgICAgLy91c2xlZXAoQVBfQlNTX1NUQVJUX0RFTEFZKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC00NTIsMjIgKzQ3NiwzMiBAQAogCWlmICggIXN0cmNtcCAod2lyZWxlc3NNb2RlLCAiNCIpKSB7Ly8xMWIvZy9uIG1peGVkIG1vZGUKIAkJYXBfZG9jbWQgKCJTRVQgaHdfbW9kZSBnIiwgTlVMTCk7CiAJCWFwX2RvY21kICgiU0VUIGllZWU4MDIxMW4gMSIsIE5VTEwpOworCQlhcF9kb2NtZCAoIlNFVCBpZWVlODAyMTFhYyAwIiwgTlVMTCk7CisJCWFwX2RvY21kICgiU0VUIGllZWU4MDIxMWF4IDAiLCBOVUxMKTsKIAl9CisJLyoKIAllbHNlIGlmICghc3RyY21wICh3aXJlbGVzc01vZGUsICIyIikpIHsvLzExbgogCQlhcF9kb2NtZCAoIlNFVCBod19tb2RlIGciLCBOVUxMKTsKIAkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExbiAxIiwgTlVMTCk7CiAJfQkKLQllbHNlIGlmICAoIXN0cmNtcCAod2lyZWxlc3NNb2RlLCAiMCIpKSB7Ly8xMWIgb25seQorCSovCisJZWxzZSBpZiAoIXN0cmNtcCAod2lyZWxlc3NNb2RlLCAiMCIpKSB7Ly8xMWIgb25seQogCQlhcF9kb2NtZCAoIlNFVCBod19tb2RlIGIiLCBOVUxMKTsKIAkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExbiAwIiwgTlVMTCk7CisJCWFwX2RvY21kICgiU0VUIGllZWU4MDIxMWFjIDAiLCBOVUxMKTsKKwkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExYXggMCIsIE5VTEwpOwogCX0JCisJLyoKIAllbHNlIGlmICAoIXN0cmNtcCAod2lyZWxlc3NNb2RlLCAiMSIpKSB7Ly8xMWcgb25seQogCQlhcF9kb2NtZCAoIlNFVCBod19tb2RlIGciLCBOVUxMKTsKIAkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExbiAwIiwgTlVMTCk7Ci0JfQkKKwl9CisJKi8KIAllbHNlIGlmICghc3RyY21wICh3aXJlbGVzc01vZGUsICIzIikpIHsvLzExYi9nCiAJCWFwX2RvY21kICgiU0VUIGh3X21vZGUgZyIsIE5VTEwpOwotCQlhcF9kb2NtZCAoIlNFVCBpZWVlODAyMTFuIDEiLCBOVUxMKTsKKwkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExbiAwIiwgTlVMTCk7CisJCWFwX2RvY21kICgiU0VUIGllZWU4MDIxMWFjIDAiLCBOVUxMKTsKKwkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExYXggMCIsIE5VTEwpOwogCX0KIAllbHNlIGlmICghc3RyY21wICh3aXJlbGVzc01vZGUsICI2IikpIHsvLzExYi9nL24vYXggbWl4ZWQgbW9kZQogCQlhcF9kb2NtZCAoIlNFVCBod19tb2RlIGciLCBOVUxMKTsKQEAgLTQ3OCw2ICs1MTIsOCBAQAogCWVsc2UgewogCQlhcF9kb2NtZCAoIlNFVCBod19tb2RlIGciLCBOVUxMKTsKIAkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExbiAxIiwgTlVMTCk7CisJCWFwX2RvY21kICgiU0VUIGllZWU4MDIxMWFjIDAiLCBOVUxMKTsKKwkJYXBfZG9jbWQgKCJTRVQgaWVlZTgwMjExYXggMCIsIE5VTEwpOwogCX0KIAogfQpAQCAtNTY2LDE1ICs2MDIsMTYgQEAKIAkJYXBfZG9jbWQoIlNFVCBsb2NhbF9wd3JfY29uc3RyYWludCAyMDAiLCBOVUxMKTsKIAl9CiB9Ci1zdGF0aWMgdm9pZCB3bGFuX3NldF9odChjaGFyICpodE1vZGUpCitzdGF0aWMgdm9pZCB3bGFuX3NldF9odChjaGFyICpodE1vZGUsIGNoYXIgKndpcmVsZXNzTW9kZSkKIHsKICNpZiAoZGVmaW5lZChfX1NTVl82WDVYX0NISVBfXykgfHwgZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKSkKLQlpZiAoIXN0cmNtcCAoaHRNb2RlLCAiMSIpKSB7CisJaWYgKCFzdHJjbXAgKGh0TW9kZSwgIjEiKSkgey8vd2hlbiBiL2csIHVuc3VwcG9ydCBodCwgc28gc2V0IGh0X2NhcGFiIGhhcyBubyBlZmZlY3QKIAkJY2hhciBmXzQwTVs4XSA9IHswfTsKIAkJc2NfY2ZnX2dldCAoIndpZmlfZm9yY2VfNDBtIiwgZl80ME0sIHNpemVvZihmXzQwTSkpOwogCQlhcF9kb2NtZCgiU0VUIGZvcmNlXzQwbWh6IiwgZl80ME0pOwogCQkKIAkJYXBfZG9jbWQoIlNFVCBodF9jYXBhYiAiSFRfQ0FQQUJfNDAsIE5VTEwpOworCQlzZXRfaHRfMmcoREVWX0hUXzQwKTsKIAl9IGVsc2UgewogCQkvL2FwX2RvY21kKCJTRVQgZm9yY2VfNDBtaHoiLCAiMCIpOwogCQlhcF9kb2NtZCgiU0VUIGh0X2NhcGFiICJIVF9DQVBBQl8yMCwgTlVMTCk7CkBAIC01ODIsNiArNjE5LDQwIEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgd2xhbl9nZXRfaHQoc3RydWN0IHdsYW5fYXBfcGFyYSAqcGFyYSwgY2hhciAqaHRfY29uZiwgaW50IGh0X2xlbikKK3sKKyNpZiAoZGVmaW5lZChfX1NTVl82WDVYX0NISVBfXykgfHwgZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKSkKKwljaGFyIGh0X2NhcFs2NF0gPSB7MH07CisKKwkvL3doZW4gYi9nLCB1bnN1cHBvcnQgaHQsIHNvIHNldCBodF9jYXBhYiBoYXMgbm8gZWZmZWN0CisJLy9pZiAoc3RyY21wKHBhcmEtPldpcmVsZXNzTW9kZSwgIjAiKSAmJiBzdHJjbXAocGFyYS0+V2lyZWxlc3NNb2RlLCAiMSIpICYmIHN0cmNtcChwYXJhLT5XaXJlbGVzc01vZGUsICIzIikpKSB7CisJaWYgKCFzdHJjbXAocGFyYS0+d2lmaV8xMW5fY2FwLCAiMSIpKSB7CisJCXN0cm5jcHkoaHRfY2FwLCBIVF9DQVBBQl80MCwgc2l6ZW9mKGh0X2NhcCktMSk7CisJCXNldF9odF8yZyhERVZfSFRfNDApOworCX0gZWxzZSB7CisJCXN0cm5jcHkoaHRfY2FwLCBIVF9DQVBBQl8yMCwgc2l6ZW9mKGh0X2NhcCktMSk7CisJfQorCisJaWYgKCFzdHJjbXAocGFyYS0+V2lyZWxlc3NNb2RlLCAiNCIpKSB7Ly8xMWIvZy9uIG1peGVkIG1vZGUKKwkJc25wcmludGYoaHRfY29uZiwgaHRfbGVuLCAicmVxdWlyZV9odD0wXG5od19tb2RlPWdcbmllZWU4MDIxMW49MVxuaWVlZTgwMjExYWM9MFxuaWVlZTgwMjExYXg9MFxuaHRfY2FwYWI9JXNcbiIsIGh0X2NhcCk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAocGFyYS0+V2lyZWxlc3NNb2RlLCAiMCIpKSB7Ly8xMWIgb25seQorCQlzbnByaW50ZihodF9jb25mLCBodF9sZW4sICJyZXF1aXJlX2h0PTBcbmh3X21vZGU9YlxuaWVlZTgwMjExbj0wXG5pZWVlODAyMTFhYz0wXG5pZWVlODAyMTFheD0wXG5odF9jYXBhYj0lc1xuIiwgaHRfY2FwKTsKKwl9CQorCWVsc2UgaWYgKCFzdHJjbXAocGFyYS0+V2lyZWxlc3NNb2RlLCAiMyIpKSB7Ly8xMWIvZworCQlzbnByaW50ZihodF9jb25mLCBodF9sZW4sICJyZXF1aXJlX2h0PTBcbmh3X21vZGU9Z1xuaWVlZTgwMjExbj0wXG5pZWVlODAyMTFhYz0wXG5pZWVlODAyMTFheD0wXG5odF9jYXBhYj0lc1xuIiwgaHRfY2FwKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChwYXJhLT5XaXJlbGVzc01vZGUsICI2IikpIHsvLzExYi9nL24vYXggbWl4ZWQgbW9kZQorCQlzbnByaW50ZihodF9jb25mLCBodF9sZW4sICJyZXF1aXJlX2h0PTBcbmh3X21vZGU9Z1xuaWVlZTgwMjExbj0xXG5pZWVlODAyMTFhYz0xXG5pZWVlODAyMTFheD0xXG5odF9jYXBhYj0lc1xuIiwgaHRfY2FwKTsKKwl9CisJZWxzZSB7CisJCXNucHJpbnRmKGh0X2NvbmYsIGh0X2xlbiwgInJlcXVpcmVfaHQ9MFxuaHdfbW9kZT1nXG5pZWVlODAyMTFuPTFcbmllZWU4MDIxMWFjPTBcbmllZWU4MDIxMWF4PTBcbmh0X2NhcGFiPSVzXG4iLCBodF9jYXApOworCX0KKwkKKyNlbmRpZgorfQorCisKIHZvaWQgIHdpZmlfY29uZmlnX2FwKHN0cnVjdCB3bGFuX2FwX3NlcnZlciAgKmFwX3N2cikKIHsKIAlzdHJ1Y3QgIHdsYW5fYXBfcGFyYSogIHBhcmEgPSAmYXBfc3ZyLT5hcF9wYXJhOwpAQCAtNjUxLDE0ICs3MjIsMTYgQEAKIAogCWlmKCBmbGFncyAmIFpURV9XTEFOX0NIQU5ORUxfU0VUKSB7CiAJCWFwX2RvY21kKCJTRVQgY2hhbm5lbCIsIHBhcmEtPkNoYW5uZWwpOworCQlzY19jZmdfc2V0KCJ0bXBfY2hhbm5lbCIsIHBhcmEtPkNoYW5uZWwpOwogCX0KIAogCWlmKCBmbGFncyAmIFpURV9XTEFOX0NPVU5UUllfU0VUKQogCQlhcF9kb2NtZCgiU0VUIGNvdW50cnlfY29kZSIsIHBhcmEtPkNvdW50cnlDb2RlKTsKIAotCi0JaWYoIGZsYWdzICYgWlRFX1dMQU5fV0lSRUxFU1NfTU9ERV9TRVQpCisJaWYoIGZsYWdzICYgWlRFX1dMQU5fV0lSRUxFU1NfTU9ERV9TRVQpIHsKIAkJd2xhbl84MDIxMU1vZGVfY29uZmlnKHBhcmEtPldpcmVsZXNzTW9kZSk7CisJCXdsYW5fc2V0X2h0KHBhcmEtPndpZmlfMTFuX2NhcCwgcGFyYS0+V2lyZWxlc3NNb2RlKTsKKwl9CiAJCiAJaWYoIGZsYWdzICYgWlRFX1dMQU5fUE9XRVJfU0VUKSB7CiAjaWYgZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKQpAQCAtNjcwLDEwICs3NDMsNiBAQAogI2VuZGlmCiAJfQogCi0JaWYoIGZsYWdzICYgWlRFX1dMQU5fV0lSRUxFU1NfTU9ERV9TRVQpCi0JCXdsYW5fc2V0X2h0KHBhcmEtPndpZmlfMTFuX2NhcCk7Ci0KLQogCS8vYXBfZG9jbWQoIlJFTE9BRCIsIE5VTEwpOwogCWFwX2RvY21kKCJESVNBQkxFIiwgTlVMTCk7CiAJYXBfZG9jbWQoIkVOQUJMRSIsIE5VTEwpOwpAQCAtNzA4LDEzICs3NzcsOCBAQAogCXNjX2NmZ19nZXQgKCJ3aWZpX2ZvcmNlXzQwbSIsIGZfNDBNLCBzaXplb2YoZl80ME0pKTsKIAogCS8vV2lyZWxlc3NNb2RlIDgwMjExbiBzdXBwb3J0IDQwTQotCWNoYXIgdzExbl9odF9jYXBbNjRdID0gezB9OwotCWlmICgwID09IHN0cmNtcChwYXJhLT53aWZpXzExbl9jYXAsICIxIikpIHsKLQkJc3RybmNweSh3MTFuX2h0X2NhcCwgSFRfQ0FQQUJfNDAsIHNpemVvZih3MTFuX2h0X2NhcCktMSk7Ci0JfSBlbHNlIHsKLQkJc3RybmNweSh3MTFuX2h0X2NhcCwgSFRfQ0FQQUJfMjAsIHNpemVvZih3MTFuX2h0X2NhcCktMSk7Ci0JCS8vc3RybmNweShmXzQwTSwgIjAiLCBzaXplb2YoZl80ME0pIC0gMSk7Ci0JfQorCWNoYXIgdzExbl9odF9jYXBbMTI4XSA9IHswfTsKKwl3bGFuX2dldF9odChwYXJhLCB3MTFuX2h0X2NhcCwgc2l6ZW9mKHcxMW5faHRfY2FwKSk7CiAjZW5kaWYKIAlzY19jZmdfZ2V0ICgibV9zc2lkX2VuYWJsZSIsIG1fc3NpZF9lbmFibGUsIHNpemVvZiAobV9zc2lkX2VuYWJsZSkpOwkKIApAQCAtNzMzLDggKzc5Nyw4IEBACiAgICAgCQkiYWNzX251bV9zY2Fucz0lc1xuIgogCiAjaWYgZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKQotCQkJImllZWU4MDIxMWFjPTFcbiIKLQkJCSJpZWVlODAyMTFheD0xXG4iCisJCQkvLyJpZWVlODAyMTFhYz0xXG4iCisJCQkvLyJpZWVlODAyMTFheD0xXG4iCiAJCQkiZHRpbV9wZXJpb2Q9MVxuIgogCQkJLy8iaHRfY2FwYWI9W0xEUENdW1NIT1JULUdJLTIwXVxuIgogCQkJLy8iaHRfY2FwYWI9W0xEUENdW0hUNDArXVtIVDQwLV1bU0hPUlQtR0ktMjBdW1NIT1JULUdJLTQwXVxuIgpAQCAtNzQ2LDEzICs4MTAsMTYgQEAKICNlbmRpZgogCiAjaWYgKGRlZmluZWQoX19TU1ZfNlg1WF9DSElQX18pIHx8IGRlZmluZWQoX19BSUNfODgwMERXX0NISVBfXykpCi0gICAgCQkiaHRfY2FwYWI9JXNcbiIKKwkJCSIlcyIKKyAgICAJCS8vImh0X2NhcGFiPSVzXG4iCiAJCQkiZm9yY2VfNDBtaHo9JXNcbiIKICNlbmRpZgogICAgIAkJImNoYW5saXN0PTYtMTNcbiIKICAgICAJCQorI2lmICEoZGVmaW5lZChfX1NTVl82WDVYX0NISVBfXykgfHwgZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKSkgICAgCQkKICAgICAJCSJpZWVlODAyMTFuPTFcbiIKICAgICAJCSJod19tb2RlPWdcbiIKKyNlbmRpZgogICAgIAkJImllZWU4MDIxMWQ9MVxuIgogICAgIAkJImxvY2FsX3B3cl9jb25zdHJhaW50PTIwMFxuIgogICAgIAkJIndvd2xhbl90cmlnZ2Vycz1hbnlcbiIKQEAgLTkxMiw3ICs5NzksNyBAQAogCXNjX2NmZ19nZXQgKCJXaXJlbGVzc01vZGVfNWciLCBwYXJhLT5XaXJlbGVzc01vZGUsIE5WSU9fV0lGSV9MRU5fOC0xKTsKIAlzY19jZmdfZ2V0ICgiQ2hhbm5lbF81ZyIsIHBhcmEtPkNoYW5uZWwsIE5WSU9fV0lGSV9MRU5fOC0xKTsKIAkKLQlzY19jZmdfZ2V0ICgiQ291bnRyeUNvZGVfNWciLCBwYXJhLT5Db3VudHJ5Q29kZSwgTlZJT19XSUZJX0xFTl84LTEpOworCXNjX2NmZ19nZXQgKCJDb3VudHJ5Q29kZSIsIHBhcmEtPkNvdW50cnlDb2RlLCBOVklPX1dJRklfTEVOXzgtMSk7CiAJaWYgKDAgPT0gc3RyY21wKHBhcmEtPkNvdW50cnlDb2RlLCAiTk9ORSIpKSB7CiAJCXN0cmNweShwYXJhLT5Db3VudHJ5Q29kZSwgIjAwIik7CiAJfQpAQCAtOTk0LDcgKzEwNjEsMTMgQEAKIAogc3RhdGljIHZvaWQgd2xhbl84MDIxMU1vZGVfY29uZmlnXzVnKGNoYXIgKndpcmVsZXNzTW9kZSkKIHsKLQlpZiAoIXN0cmNtcCh3aXJlbGVzc01vZGUsICI0IikpIHsvLzExYS9uIG1peGVkIG1vZGUKKwlpZiAoIXN0cmNtcCh3aXJlbGVzc01vZGUsICIzIikpIHsvLzExYSBvbmx5IG1vZGUKKwkJYXBfZG9jbWQoIlNFVCBod19tb2RlIGEiLCBOVUxMKTsKKwkJYXBfZG9jbWQoIlNFVCBpZWVlODAyMTFuIDAiLCBOVUxMKTsKKwkJYXBfZG9jbWQoIlNFVCBpZWVlODAyMTFhYyAwIiwgTlVMTCk7CisJCWFwX2RvY21kKCJTRVQgaWVlZTgwMjExYXggMCIsIE5VTEwpOworCX0KKwllbHNlIGlmICghc3RyY21wKHdpcmVsZXNzTW9kZSwgIjQiKSkgey8vMTFhL24gbWl4ZWQgbW9kZQogCQlhcF9kb2NtZCgiU0VUIGh3X21vZGUgYSIsIE5VTEwpOwogCQlhcF9kb2NtZCgiU0VUIGllZWU4MDIxMW4gMSIsIE5VTEwpOwogCQlhcF9kb2NtZCgiU0VUIGllZWU4MDIxMWFjIDAiLCBOVUxMKTsKQEAgLTEwMTYsMjggKzEwODksNTEgQEAKIAllbHNlIHsKIAkJYXBfZG9jbWQoIlNFVCBod19tb2RlIGEiLCBOVUxMKTsKIAkJYXBfZG9jbWQoIlNFVCBpZWVlODAyMTFuIDEiLCBOVUxMKTsKKwkJYXBfZG9jbWQoIlNFVCBpZWVlODAyMTFhYyAwIiwgTlVMTCk7CisJCWFwX2RvY21kKCJTRVQgaWVlZTgwMjExYXggMCIsIE5VTEwpOwogCQl3Zl9sb2coIndpcmVsZXNzTW9kZT0lcyBub3Qgc3VwcG9ydCIsIHdpcmVsZXNzTW9kZSk7CiAJfQogCiB9Ci1zdGF0aWMgdm9pZCB3bGFuX3NldF9odF81ZyhjaGFyICpodE1vZGUpCisKK3N0YXRpYyBjaGFyICpnZXRfaHRfY2FwYWJfNWcoY2hhciAqY2hhbm5lbCkKK3sKKwlpbnQgY2ggPSBhdG9pKGNoYW5uZWwpOworCWludCBhbGxvd2VkW10gPSB7IDM2LCA0NCwgNTIsIDYwLCAxMDAsIDEwOCwgMTE2LCAxMjQsIDEzMiwgMTQwLAorCQkJICAxNDksIDE1NywgMTY1LCAxNzMsIDE4NCwgMTkyIH07CisJaW50IGsgPSAwOworCisJaWYgKGNoID09IDApIHsKKwkJcmV0dXJuIFZIVF9DQVBBQl80MDsKKwl9CisKKwlmb3IgKGsgPSAwOyBrIDwgKHNpemVvZihhbGxvd2VkKSAvIHNpemVvZihhbGxvd2VkWzBdKSk7IGsrKykgeworCQlpZiAoY2ggPT0gYWxsb3dlZFtrXSkgeworCQkJcmV0dXJuIFZIVF9DQVBBQl80MFBMVVM7CisJCX0KKwl9CisKKwlyZXR1cm4gVkhUX0NBUEFCXzQwTUlOVVM7Cit9CisKK3N0YXRpYyB2b2lkIHdsYW5fc2V0X2h0XzVnKGNoYXIgKmh0TW9kZSwgY2hhciAqY2hhbm5lbCkKIHsKIAlpZiAoIXN0cmNtcChodE1vZGUsICI2IikpIHsvLzIwLzQwLzgwLzE2MAogCQlhcF9kb2NtZCgiU0VUIGhlX29wZXJfY2h3aWR0aCIsICIyIik7CiAJCWFwX2RvY21kKCJTRVQgdmh0X29wZXJfY2h3aWR0aCIsICIyIik7Ci0JCWFwX2RvY21kKCJTRVQgaHRfY2FwYWIiLCBWSFRfQ0FQQUJfNDApOworCQlhcF9kb2NtZCgiU0VUIGh0X2NhcGFiIiwgZ2V0X2h0X2NhcGFiXzVnKGNoYW5uZWwpKTsKIAkJYXBfZG9jbWQoIlNFVCB2aHRfY2FwYWIiLCBWSFRfQ0FQQUJfMTYwKTsKIAl9CiAJZWxzZSBpZiAoIXN0cmNtcChodE1vZGUsICI0IikpIHsvLzIwLzQwLzgwCiAJCWFwX2RvY21kKCJTRVQgaGVfb3Blcl9jaHdpZHRoIiwgIjEiKTsKIAkJYXBfZG9jbWQoIlNFVCB2aHRfb3Blcl9jaHdpZHRoIiwgIjEiKTsKLQkJYXBfZG9jbWQoIlNFVCBodF9jYXBhYiIsIFZIVF9DQVBBQl80MCk7CisJCWFwX2RvY21kKCJTRVQgaHRfY2FwYWIiLCBnZXRfaHRfY2FwYWJfNWcoY2hhbm5lbCkpOwogCQlhcF9kb2NtZCgiU0VUIHZodF9jYXBhYiIsIFZIVF9DQVBBQl84MCk7CiAJfQogCWVsc2UgaWYgKCFzdHJjbXAoaHRNb2RlLCAiMSIpKSB7Ly8yMC80MAogCQlhcF9kb2NtZCgiU0VUIGhlX29wZXJfY2h3aWR0aCIsICIwIik7CiAJCWFwX2RvY21kKCJTRVQgdmh0X29wZXJfY2h3aWR0aCIsICIwIik7Ci0JCWFwX2RvY21kKCJTRVQgaHRfY2FwYWIiLCBWSFRfQ0FQQUJfNDApOworCQlhcF9kb2NtZCgiU0VUIGh0X2NhcGFiIiwgZ2V0X2h0X2NhcGFiXzVnKGNoYW5uZWwpKTsKIAl9CiAJZWxzZSB7IC8vMAogCQkvL2RlZnVhbHQgdXNlIDIwTQpAQCAtMTA3OCwxMiArMTE3NCwxMyBAQAogCQlhcF9kb2NtZCgiU0VUIHZodF9vcGVyX2Nod2lkdGgiLCAiMCIpOwogCX0KIAlhcF9kb2NtZCgiU0VUIGNoYW5uZWwiLCBjaGFubmVsKTsKKwlzY19jZmdfc2V0KCJ0bXBfY2hhbm5lbCIsIGNoYW5uZWwpOwogfQogc3RhdGljIHZvaWQgd2xhbl9hZHZhbmNlX3NldF81ZyhzdHJ1Y3Qgd2xhbl9hcF9wYXJhICpwYXJhKQogewogCiAJd2xhbl84MDIxMU1vZGVfY29uZmlnXzVnKHBhcmEtPldpcmVsZXNzTW9kZSk7IC8vIGFuIHdhbmcga291IGdlIGxpCi0Jd2xhbl9zZXRfaHRfNWcocGFyYS0+d2lmaV8xMW5fY2FwKTsKKwl3bGFuX3NldF9odF81ZyhwYXJhLT53aWZpXzExbl9jYXAsIHBhcmEtPkNoYW5uZWwpOwogCXdsYW5fc2V0X2NoYW5uZWxfNWcocGFyYS0+Q2hhbm5lbCwgcGFyYS0+d2lmaV8xMW5fY2FwKTsKIAogfQpAQCAtMTE5NywxNyArMTI5NCwxNyBAQAogCiAJaWYgKDAgPT0gc3RyY21wKHBhcmEtPndpZmlfMTFuX2NhcCwgIjYiKSkgewogCQlzbnByaW50ZihodF9jYXAsIHNpemVvZihodF9jYXApLCAiaHRfY2FwYWI9JXNcbnZodF9jYXBhYj0lc1xuaGVfb3Blcl9jaHdpZHRoPTJcbnZodF9vcGVyX2Nod2lkdGg9MlxuIiwKLQkJCVZIVF9DQVBBQl80MCwgVkhUX0NBUEFCXzE2MCk7CisJCQlnZXRfaHRfY2FwYWJfNWcocGFyYS0+Q2hhbm5lbCksIFZIVF9DQVBBQl8xNjApOwogCQlpZHgwID0gZ2V0X2NlbnRyX2ZyZXFfc2VnMF9pZHgoMTYwLCBhdG9pKHBhcmEtPkNoYW5uZWwpKTsKIAl9CiAJZWxzZSBpZiAoMCA9PSBzdHJjbXAocGFyYS0+d2lmaV8xMW5fY2FwLCAiNCIpKSB7CiAJCXNucHJpbnRmKGh0X2NhcCwgc2l6ZW9mKGh0X2NhcCksICJodF9jYXBhYj0lc1xudmh0X2NhcGFiPSVzXG5oZV9vcGVyX2Nod2lkdGg9MVxudmh0X29wZXJfY2h3aWR0aD0xXG4iLAotCQkJVkhUX0NBUEFCXzQwLCBWSFRfQ0FQQUJfODApOworCQkJZ2V0X2h0X2NhcGFiXzVnKHBhcmEtPkNoYW5uZWwpLCBWSFRfQ0FQQUJfODApOwogCQlpZHgwID0gZ2V0X2NlbnRyX2ZyZXFfc2VnMF9pZHgoODAsIGF0b2kocGFyYS0+Q2hhbm5lbCkpOwogCX0KIAllbHNlIGlmICgwID09IHN0cmNtcChwYXJhLT53aWZpXzExbl9jYXAsICIxIikpIHsKIAkJc25wcmludGYoaHRfY2FwLCBzaXplb2YoaHRfY2FwKSwgImh0X2NhcGFiPSVzXG5oZV9vcGVyX2Nod2lkdGg9MFxudmh0X29wZXJfY2h3aWR0aD0wXG4iLAotCQkJVkhUX0NBUEFCXzQwKTsKKwkJCWdldF9odF9jYXBhYl81ZyhwYXJhLT5DaGFubmVsKSk7CiAJCWlkeDAgPSBnZXRfY2VudHJfZnJlcV9zZWcwX2lkeCg0MCwgYXRvaShwYXJhLT5DaGFubmVsKSk7CiAJfQogCWVsc2UgewpAQCAtMTIyOSw3ICsxMzI2LDcgQEAKIAkJKDAgPT0gc3RyY21wKHBhcmEtPkNoYW5uZWwsICIxNDkiKSB8fCAwID09IHN0cmNtcChwYXJhLT5DaGFubmVsLCAiMTUzIikgfHwKIAkJMCA9PSBzdHJjbXAocGFyYS0+Q2hhbm5lbCwgIjE1NyIpIHx8IDAgPT0gc3RyY21wKHBhcmEtPkNoYW5uZWwsICIxNjEiKSkpIHsKIAkJc25wcmludGYoaHRfY2FwLCBzaXplb2YoaHRfY2FwKSwgImh0X2NhcGFiPSVzXG52aHRfY2FwYWI9JXNcbmhlX29wZXJfY2h3aWR0aD0xXG52aHRfb3Blcl9jaHdpZHRoPTFcbiIsCi0JCQlWSFRfQ0FQQUJfNDAsIFZIVF9DQVBBQl84MCk7CisJCQlnZXRfaHRfY2FwYWJfNWcocGFyYS0+Q2hhbm5lbCksIFZIVF9DQVBBQl84MCk7CiAJCWlkeDAgPSBnZXRfY2VudHJfZnJlcV9zZWcwX2lkeCg4MCwgYXRvaShwYXJhLT5DaGFubmVsKSk7CiAJCXdmX2xvZygiZXJyb3I6IHBsZWFzZSBzZXQgY29ycmVjdCBjaGFubmVsKCVzKS1iYW5kd2l0aCglcykgbnYhISIsIHBhcmEtPkNoYW5uZWwsIHBhcmEtPndpZmlfMTFuX2NhcCk7CiAJfQpAQCAtMTIzOSw3ICsxMzM2LDcgQEAKIAkJMCA9PSBzdHJjbXAocGFyYS0+Q291bnRyeUNvZGUsICJCTyIpIHx8IDAgPT0gc3RyY21wKHBhcmEtPkNvdW50cnlDb2RlLCAiSk8iKSB8fAogCQkwID09IHN0cmNtcChwYXJhLT5Db3VudHJ5Q29kZSwgIktFIikpKSB7CiAJCXNucHJpbnRmKGh0X2NhcCwgc2l6ZW9mKGh0X2NhcCksICJodF9jYXBhYj0lc1xudmh0X2NhcGFiPSVzXG5oZV9vcGVyX2Nod2lkdGg9MVxudmh0X29wZXJfY2h3aWR0aD0xXG4iLAotCQkJVkhUX0NBUEFCXzQwLCBWSFRfQ0FQQUJfODApOworCQkJZ2V0X2h0X2NhcGFiXzVnKHBhcmEtPkNoYW5uZWwpLCBWSFRfQ0FQQUJfODApOwogCQlpZHgwID0gZ2V0X2NlbnRyX2ZyZXFfc2VnMF9pZHgoODAsIGF0b2kocGFyYS0+Q2hhbm5lbCkpOwogCQl3Zl9sb2coImVycm9yOiBwbGVhc2Ugc2V0IGNvcnJlY3QgY291bnRyeWNvZGUoJXMpLWJhbmR3aXRoKCVzKSBudiEhIiwgcGFyYS0+Q291bnRyeUNvZGUsIHBhcmEtPndpZmlfMTFuX2NhcCk7CiAJfQpAQCAtMTI3Myw2ICsxMzcwLDkgQEAKIAkvL2Fjc19udW1fc2NhbnMKIAljaGFyIGFjc19udW1bOF0gPSB7MH07CiAJc2NfY2ZnX2dldCAoIndpZmlfYWNzX251bSIsIGFjc19udW0sIHNpemVvZihhY3NfbnVtKSk7CisKKwljaGFyIGZfNDBNWzhdID0gezB9OworCXNjX2NmZ19nZXQgKCJ3aWZpX2ZvcmNlXzQwbSIsIGZfNDBNLCBzaXplb2YoZl80ME0pKTsKIAkKIAljaGFyIHcxMW5faHRfY2FwWzI1Nl0gPSB7MH07CiAJd2xhbl9nZXRfaHRfNWcocGFyYSwgdzExbl9odF9jYXAsIHNpemVvZih3MTFuX2h0X2NhcCkpOwpAQCAtMTMwNSw2ICsxNDA1LDcgQEAKIAkJCSJyZXF1aXJlX2h0PTBcbiIKIAkJCSJyZXF1aXJlX3ZodD0wXG4iCiAJCQkiJXMiCisJCQkiZm9yY2VfNDBtaHo9JXNcbiIKIAkJCQogCQkJLy8iaWVlZTgwMjExbj0xXG4iCiAJCQkiaHdfbW9kZT1hXG4iCkBAIC0xMzMzLDcgKzE0MzQsNyBAQAogCQkJcGFyYS0+c3NpZCwgcGFyYS0+aWdub3JlX2Jyb2FkY2FzdF9zc2lkLAogCQkJcGFyYS0+Q2hhbm5lbCwgYWNzX251bSwgCiAKLQkJCXcxMW5faHRfY2FwLAorCQkJdzExbl9odF9jYXAsIGZfNDBNLAogCiAJCQlwYXJhLT5Db3VudHJ5Q29kZSwJIHBhcmEtPm1heF9udW1fc3RhLCAKIAkJCWFjbF9tb2RlX3ZhbHVlX3RyYW5zaXN0KHBhcmEtPmFjY2Vzc3BvbGljeTApLCB3aWZpX21hYys2KTsKQEAgLTE0NDMsNiArMTU0NCw0MCBAQAogCWNsb3NlKGZkKTsKIAlyZXR1cm4gcmV0OwogfQorCitzdGF0aWMgdm9pZCByZXN0YXJ0X2R1ZV9jYXAoc3RydWN0IHdsYW5fYXBfc2VydmVyICphcF9zdnIpCit7CisJLy9zdG9wCisJaWYgKGdfY2FwX3N0YV9lbmFibGUgPT0gMSkgeworCQl3aWZpX3N0YXRpb25fY2xvc2UoKTsKKwl9CisKKwlpZiAoZ19jYXBfYXBfZW5hYmxlID09IDEpIHsKKwkJYXBfc3ZyLT5zdG9wYXAoYXBfc3ZyKTsgLy9ub3QgbmVlZCB3aWZpX2FwX3Jlc2V0X3BhcmEsIGRpc2FibGUgd2lsbCB1c2Ugb2xkIGh0X2NhcGFiCisJCWdfYXBfZW5hYmxlZCA9IDA7CisJfQorCisJaWYgKGdfY2FwX3dpZmlfZW5hYmxlID09IDEpIHsKKwkJYXBfc3ZyLT5kcnZfcHJveHkuZHJ2X2RlaW5pdCgmYXBfc3ZyLT5kcnZfcHJveHkpOworCX0KKwkKKwkvL3N0YXJ0CisJaWYgKGdfY2FwX3dpZmlfZW5hYmxlID09IDEpIHsKKwkJYXBfc3ZyLT5kcnZfcHJveHkuZHJ2X2luaXQoJmFwX3N2ci0+ZHJ2X3Byb3h5KTsKKwkJc2VuZF93bGFuX3N0YXR1c190b19jYXAoSU5fV0lGSV9TVEFUVVNfRU5BQkxFRCk7CisJfQorCisJaWYgKGdfY2FwX2FwX2VuYWJsZSA9PSAxKSB7CisJCWFwX3N2ci0+c3RhcnRhcChhcF9zdnIpOworCX0KKworCWlmIChnX2NhcF9zdGFfZW5hYmxlID09IDEpIHsKKwkJd2FpdF9hcF9lbmFibGVkKCk7CisJCXdsYW5fc3RhdGlvbl9pbml0KCk7CisJCXN0YV9udW1fYXBzdGFfb3BlbigpOworCX0KKworfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIG9wZW5fd2lmaV9udl9zZXQoKQpAQCAtMTUyMiw2ICsxNjU3LDU3IEBACiAJfQogCXJldHVybiAwOwogfQorCisvKiBTdGFydGVkIGJ5IEFJQ29kZXIsIHBpZDphNGUxYTE2YmY3MDM2YzExNGZhZTA5NmI1MDZmZWMyNGIzMTI1ZDk2ICovCitzdGF0aWMgaW50IGdldF93bGFuX21hY19hZGRyZXNzKGNvbnN0IGNoYXIgKmludGVyZmFjZSwgY2hhciAqbWFjX2FkZHIpIHsKKyAgICAvLyDCucK5wr3CqMKww7zCusKswr3Dk8K/w5rDkMOFw4/CosK1w4TDjsOEwrzDvsOCwrfCvsK2CisgICAgY2hhciBmaWxlX3BhdGhbMTAwXTsKKyAgICBzbnByaW50ZihmaWxlX3BhdGgsIHNpemVvZihmaWxlX3BhdGgpLCAiL3N5cy9jbGFzcy9uZXQvJXMvYWRkcmVzcyIsIGludGVyZmFjZSk7CisgICAgCisgICAgLy8gwrTDssK/wqrCsMO8wrrCrMK9w5PCv8Oaw5DDhcOPwqLCtcOEw47DhMK8w74KKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfcGF0aCwgInIiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoImNhdCBub3Qgb3BlbiB3bGFuIGFkZHJlc3MgZmlsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gwrTDk8OOw4TCvMO+w5bDkMK2w4HDiMKhTUFDwrXDmMOWwrcKKyAgICBpZiAoZmdldHMobWFjX2FkZHIsIDE4LCBmcCkgPT0gTlVMTCkgeyAvLyBNQUPCtcOYw5bCt8ONwqjCs8Kjw4rDhzE3wrjDtsOXw5bCt8O7wrzDk8OJw4/DlsOVw5bCucK3w7sKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIMK5w5jCscOVw47DhMK8w77CssKiwrfCtcK7w5jCs8OJwrnCpgorICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB3aWZpX2dldF9hcF9tYWModm9pZCkKK3sKKwljaGFyIHNzaWRfd3JpdGVfZmxhZ1s4XSA9IHswfTsKKworCXNjX2NmZ19nZXQgKCJzc2lkX3dyaXRlX2ZsYWciLCBzc2lkX3dyaXRlX2ZsYWcsIHNpemVvZiAoc3NpZF93cml0ZV9mbGFnKSk7CisJd2ZfbG9nICgic3NpZF93cml0ZV9mbGFnID0gJXMiLCBzc2lkX3dyaXRlX2ZsYWcpOworCisJLyrDk8OrTlbDlsOQw4rDh8K3w7HDksORw5DCtMOIw6tTU0lEIMK1w4TCscOqw5bCvsOOwrvCscOIwr3Dj8KjwqzDiMOnwrnDu8OOwqoxwrHDrcOKwr7DksORw5DCtMOIw6vCo8KswrLCu8OTw4PDlMOZw5DCtMKjwrswwrHDrcOKwr7Cu8K5w47CtMOQwrTDiMOrKi8KKwlpZiAoIXN0cmNtcCAoc3NpZF93cml0ZV9mbGFnLCAiMCIpKSB7CisJCWNoYXIgIHdpZmlfbWFjWzIwXT17MH07CisJCWdldF93bGFuX21hY19hZGRyZXNzKGFwX3NlcnZlci0+ZHJ2X3Byb3h5LmlmYWNlX25hbWUsIHdpZmlfbWFjKTsKKwkJd2lmaV9tYWNbc2l6ZW9mKHdpZmlfbWFjKS0xXSA9ICdcMCc7Ly9jb3YKKwkJc3RyX3JlbW92ZV9jaHIod2lmaV9tYWMsICc6Jyk7CisJCWlmIChzdHJsZW4od2lmaV9tYWMpICE9IDEyKSB7CisJCQl3Zl9sb2cgKCJ3aWZpX21hYyA9ICVzIGludmFsaWQiLCBzc2lkX3dyaXRlX2ZsYWcpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNjX2NmZ19zZXQoIndpZmlfbWFjIiwgd2lmaV9tYWMpOworCisJCXNjX2NmZ19zZXQgKCJzc2lkX3dyaXRlX2ZsYWciLCAiMSIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogRW5kZWQgYnkgQUlDb2RlciwgcGlkOmE0ZTFhMTZiZjcwMzZjMTE0ZmFlMDk2YjUwNmZlYzI0YjMxMjVkOTYgKi8KKwogI2VuZGlmCiAKICNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQKQEAgLTE1MzQsNiArMTcyMCw0MSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgY2tlY2tfaG9zdGFwZF9zdGF0dXModm9pZCkKK3sKKyAgICBjaGFyICpyZXBseSA9IE5VTEw7CisJCisJcmVwbHkgPSBhcF9kb2NtZCgiU1RBVFVTIiwgTlVMTCk7CisJaWYgKHJlcGx5ID09IE5VTEwpIHsKKyAgICAgICAgd2ZfbG9nKCJTVEFUVVMgbm90IGZpbmRcbiIpOworCQkjaWZkZWYgVVNFX0NBUF9TVVBQT1JUCisJCXNjX3RpbWVyX2RlbGV0ZShXSUZJX0FQX0VOQUJMRURfVElNRVJfSUQpOworCQlzY190aW1lcl9jcmVhdGUoV0lGSV9BUF9FTkFCTEVEX1RJTUVSX0lELCBUSU1FUl9GTEFHX09OQ0UsIDYwKjEwMDAsIGFwX2VuYWJsZWRfY2IsIE5VTEwpOworCQkjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisJaWYgKE5VTEwgIT0gc3Ryc3RyKHJlcGx5LCAic3RhdGU9RU5BQkxFRCIpKSB7CisJCWdfYXBfZW5hYmxlZCA9IDE7CisJCSNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQKKwkJc2VuZF9hcF9zdGF0dXNfdG9fY2FwKElOX1dJRklfQVBfSU5ERVhfTUFYLCBJTl9XSUZJX0FQX1NUQVRVU19FTkFCTEVEKTsKKwkJI2VuZGlmCisJfQorCWVsc2UgaWYgKE5VTEwgIT0gc3Ryc3RyKHJlcGx5LCAic3RhdGU9RElTQUJMRUQiKSkgeworCQkjaWZkZWYgVVNFX0NBUF9TVVBQT1JUCisJCXNlbmRfYXBfc3RhdHVzX3RvX2NhcChJTl9XSUZJX0FQX0lOREVYX01BWCwgSU5fV0lGSV9BUF9TVEFUVVNfSURMRSk7CisJCSNlbmRpZgorCX0KKwllbHNlIHsKKwkJI2lmZGVmIFVTRV9DQVBfU1VQUE9SVAorCQlzY190aW1lcl9kZWxldGUoV0lGSV9BUF9FTkFCTEVEX1RJTUVSX0lEKTsKKwkJc2NfdGltZXJfY3JlYXRlKFdJRklfQVBfRU5BQkxFRF9USU1FUl9JRCwgVElNRVJfRkxBR19PTkNFLCA2MCoxMDAwLCBhcF9lbmFibGVkX2NiLCBOVUxMKTsKKwkJI2VuZGlmCisJfQorCQorCXJldHVybiAwOworfQorCiAvL21heWJlIGJyaWRnZSBub3QgcmVhZHksIG1heCAzMHMKIHN0YXRpYyB2b2lkIHdhaXRfYnJpZGdlKHZvaWQpCiB7CkBAIC0xNjAwLDEwICsxODIxLDYgQEAKIAl3YWl0X2JyaWRnZSgpOwogCXVzbGVlcCAoMjAwMDAwKTsKIAlpZigwID09IHN0YXJ0U29mdGFwIChhcF9zdnIpKXsKLQkjaWZkZWYgVVNFX0NBUF9TVVBQT1JUCi0JCXNjX3RpbWVyX2RlbGV0ZShXSUZJX0FQX0VOQUJMRURfVElNRVJfSUQpOwotCQlzY190aW1lcl9jcmVhdGUoV0lGSV9BUF9FTkFCTEVEX1RJTUVSX0lELCBUSU1FUl9GTEFHX09OQ0UsIDYwKjEwMDAsIGFwX2VuYWJsZWRfY2IsIE5VTEwpOwotCSNlbmRpZgogCQkvL3VzbGVlcCAoMjAwMDAwKTsKIAkJaWYoMCA9PSB3aWZpX2Nvbm5lY3RfdG9faG9zdGFwZCgmYXBfc3ZyLT5zb2NrKSl7CiAJCQlnX2hvc3RhcCA9IDE7CkBAIC0xNjExLDYgKzE4MjgsOCBAQAogCQkJcmV0ID0wOwogCQkJd2xhbl9zZXRfc3RhdGUoV0xBTl9PTixXTEFOX09GRik7CiAJCQl3bGFuX3NldF90eHB3cigpOworCQkKKwkJCWNrZWNrX2hvc3RhcGRfc3RhdHVzKCk7CiAKIAkJCWNoYXIgbV9zc2lkX2VuYWJsZVs4XSA9IHswfTsKIAkJCXNjX2NmZ19nZXQgKCJtX3NzaWRfZW5hYmxlIiwgbV9zc2lkX2VuYWJsZSwgc2l6ZW9mIChtX3NzaWRfZW5hYmxlKSk7CkBAIC0xNjYzLDggKzE4ODIsMTEgQEAKICNlbmRpZgkKIAkKIAl3bGFuX3NldF9zdGF0ZShXTEFOX09GRixXTEFOX09GRik7CisKKyNpZiAhKGRlZmluZWQoVVNFX0NBUF9TVVBQT1JUKSkJCiAJYXBfc3ZyLT5kcnZfcHJveHkuZHJ2X2RlaW5pdCgmYXBfc3ZyLT5kcnZfcHJveHkpOwotCQorI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KICNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQKQEAgLTE3MjAsNiArMTk0Miw1NSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IHNldF9odF8yZyhpbnQgaHQpCit7CisjaWYgZGVmaW5lZChfX0FJQ184ODAwX0Q4MExfXykKKwlnX2h0XzJnID0gaHQ7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5lZWRfcmVzZXRfaHQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKF9fQUlDXzg4MDBfRDgwTF9fKQorCWNoYXIgd18xMW5faHRbTlZJT19XSUZJX0xFTl84XSA9IHswfTsKKwlpZiAoZ193b3JrX21vZGUgPT0gSU5fV0lGSV9XT1JLX01PREVfQVAwKSB7CisJCXNjX2NmZ19nZXQgKCJ3aWZpXzExbl9jYXAiLCB3XzExbl9odCwgTlZJT19XSUZJX0xFTl84LTEpOworCQlpZiAoMCA9PSBzdHJjbXAod18xMW5faHQsICIxIikpIHsKKwkJCWNoYXIgaHRbMTBdID0gezB9OworCQkJaW50IGh0X3ZhbHVlID0gREVWX0hUXzQwOworCQkJd2xhbl9yZWFkZmlsZShERVZfSFRfUEFUSCwgaHQsIHNpemVvZihodCkgLSAxKTsKKwkJCWh0X3ZhbHVlID0gYXRvaShodCk7CisJCQl3Zl9sb2coInNlY19jaGFuX2hpZ2ggWyVzLCVkLCVkXSEhIiwgaHQsIGh0X3ZhbHVlLCBnX2h0XzJnKTsJCQorCQkJaWYgKGh0X3ZhbHVlICE9IGdfaHRfMmcpIHsKKwkJCQlnX2h0XzJnID0gaHRfdmFsdWU7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlc2V0X2h0XzJnKHZvaWQpCit7CisjaWYgZGVmaW5lZChfX0FJQ184ODAwX0Q4MExfXykKKwlpZiAoZ19odF8yZyA9PSBERVZfSFRfNDBQTFVTKSB7CisJCWFwX2RvY21kKCJTRVQgaHRfY2FwYWIgIkhUX0NBUEFCXzQwUExVUywgTlVMTCk7CisJfQorCWVsc2UgaWYgKGdfaHRfMmcgPT0gREVWX0hUXzQwTUlOVVMpIHsKKwkJYXBfZG9jbWQoIlNFVCBodF9jYXBhYiAiSFRfQ0FQQUJfNDBNSU5VUywgTlVMTCk7CisJfQorCWVsc2UgeworCQlhcF9kb2NtZCgiU0VUIGh0X2NhcGFiICJIVF9DQVBBQl80MCwgTlVMTCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB3aWZpX2NoYW5uZWxfZm9sbG93KHN0cnVjdCAgd2xhbl9hcF9zZXJ2ZXIgICphcF9zdnIpCiB7CiAJY2hhciB0X2NoYW5uZWxbTlZJT19XSUZJX0xFTl84XSA9IHswfTsKQEAgLTE3MzcsMTYgKzIwMDgsMTIgQEAKICNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQJCQogCQlpZiAoZ193b3JrX21vZGUgPT0gSU5fV0lGSV9XT1JLX01PREVfQVAxKSB7CiAJCQlzY19jZmdfZ2V0ICgid2lmaV8xMW5fY2FwXzVnIiwgd18xMW5faHQsIE5WSU9fV0lGSV9MRU5fOC0xKTsKKwkJCXdsYW5fc2V0X2h0XzVnKHdfMTFuX2h0LCBmX2NoYW5uZWwpOwogCQkJd2xhbl9zZXRfY2hhbm5lbF81ZyhmX2NoYW5uZWwsIHdfMTFuX2h0KTsKIAkJfQogCQllbHNlIHsKIAkJCWludCBmY2hhbiA9IGF0b2koZl9jaGFubmVsKTsKLQkJCi0JCQlzY19jZmdfZ2V0ICgid2lmaV8xMW5fY2FwIiwgd18xMW5faHQsIE5WSU9fV0lGSV9MRU5fOC0xKTsKLQkJCWlmICgwID09IHN0cmNtcCh3XzExbl9odCwgIjEiKSkgewotCQkJCWFwX2RvY21kKCJTRVQgZm9yY2VfNDBtaHoiLCAiMCIpOy8vc2V0IGNoYW5uZWwgZmFpbAotCQkJCS8vYXBfZG9jbWQoIlNFVCBodF9jYXBhYiBbSFQ0MCtdW0hUNDAtXVtTSE9SVC1HSS0yMF1bU0hPUlQtR0ktNDBdIiwgTlVMTCk7Ci0JCQl9CisJCQkKIAkJCWlmIChmY2hhbiA+IDExKSB7CiAJCQkJLy9hcF9kb2NtZCgiU0VUIGNvdW50cnlfY29kZSIsICJDTiIpOwogCQkJCWNoYXIgY291bnRyeV9jb2RlW05WSU9fV0lGSV9MRU5fOF0gPSB7MH07CkBAIC0xNzU3LDcgKzIwMjQsNyBAQAogCQl9CiAjZWxzZQogCQlpbnQgZmNoYW4gPSBhdG9pKGZfY2hhbm5lbCk7Ci0JCQkJCisKIAkJc2NfY2ZnX2dldCAoIndpZmlfMTFuX2NhcCIsIHdfMTFuX2h0LCBOVklPX1dJRklfTEVOXzgtMSk7CiAJCWlmICgwID09IHN0cmNtcCh3XzExbl9odCwgIjEiKSkgewogCQkJYXBfZG9jbWQoIlNFVCBmb3JjZV80MG1oeiIsICIwIik7Ly9zZXQgY2hhbm5lbCBmYWlsCkBAIC0xODA3LDcgKzIwNzQsNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLQorLy9zdG9wLT5zdGFydCwgbm90IG5lZWQgcmVzZXQKIHN0YXRpYyB2b2lkICB3aWZpX2FwX3Jlc2V0X3BhcmEoc3RydWN0ICB3bGFuX2FwX3NlcnZlciAgKmFwX3N2cikKIHsKIAljaGFyIGZfNDBNW05WSU9fV0lGSV9MRU5fOF0gPSB7MH07CkBAIC0xODIxLDYgKzIwODgsNyBAQAogCWlmICgwID09IHN0cmNtcCh3XzExbl9odCwgIjEiKSkgewogCQlhcF9kb2NtZCgiU0VUIGZvcmNlXzQwbWh6IiwgZl80ME0pOwogCQlhcF9kb2NtZCgiU0VUIGh0X2NhcGFiICJIVF9DQVBBQl80MCwgTlVMTCk7CisJCXNldF9odF8yZyhERVZfSFRfNDApOwogCX0KICNlbmRpZgogCXNjX2NmZ19nZXQgKCJ0bXBfY2hhbm5lbCIsIHRfY2hhbm5lbCwgTlZJT19XSUZJX0xFTl84LTEpOwpAQCAtMTg0Myw2ICsyMTExLDcgQEAKIAlzY19jZmdfZ2V0ICgid2lmaV8xMW5fY2FwIiwgd18xMW5faHQsIE5WSU9fV0lGSV9MRU5fOC0xKTsKIAlpZiAoMCA9PSBzdHJjbXAod18xMW5faHQsICIxIikpIHsKIAkJYXBfZG9jbWQoIlNFVCBodF9jYXBhYiAiSFRfQ0FQQUJfNDAsIE5VTEwpOworCQlzZXRfaHRfMmcoREVWX0hUXzQwKTsKIAl9CiAjZW5kaWYKIH0KQEAgLTE4NzYsNyArMjE0NSw3IEBACiAJCWlmICgtMSA9PSBmaW5kX3dsYW4pIHsKIAkJCWlmIChpID09IDEwKSB7CiAJCQkJd2ZfbG9nICgiZHJ2X2luaXQgZmFpbGVkISEiKTsKLQkJCQlyZXR1cm47CisJCQkJcmV0dXJuIC0xOwogCQkJfSBlbHNlIHsKIAkJCQl1c2xlZXAgKDIwMDAwMCAqIGkpOwogCQkJCWNvbnRpbnVlOwpAQCAtMTk3Myw2ICsyMjQyLDEyIEBACiAJCQkJc2VuZF9hcF9zdGF0dXNfdG9fY2FwKElOX1dJRklfQVBfSU5ERVhfTUFYLCBJTl9XSUZJX0FQX1NUQVRVU19FTkFCTEVEKTsKIAkJCSNlbmRpZgogCQkJfQorCQkJZWxzZSBpZiAoKHA9c3Ryc3RyIChidWYsIEFQX0VWRU5UX0RJU0FCTEVEKSkgIT0gTlVMTCkgeworCQkJCS8vZ19hcF9lbmFibGVkID0gMDsgLy90b2RvOiBhcCBzY2FuIGRlbGV0ZQorCQkJI2lmZGVmIFVTRV9DQVBfU1VQUE9SVAorCQkJCXNlbmRfYXBfc3RhdHVzX3RvX2NhcChJTl9XSUZJX0FQX0lOREVYX01BWCwgSU5fV0lGSV9BUF9TVEFUVVNfSURMRSk7CisJCQkjZW5kaWYKKwkJCX0KIAkJfQogCQllbHNlIHsKIAkJCXdmX2xvZyAoIkNvdWxkIG5vdCByZWFkIHBlbmRpbmcgbWVzc2FnZS4iKTsKQEAgLTIwNTQsOSArMjMyOSwxMCBAQAogCWNoYXIgcGF0aFtQQVRIX01BWF09ezB9OwogCQogCXdmX2xvZyAoIiBlbnRlciIpOworI2lmICEoZGVmaW5lZChVU0VfQ0FQX1NVUFBPUlQpKQkKIAl3bGFuX2Rydl9wcmVfaW5pdCgmYXBfc3ZyLT5kcnZfcHJveHkpOwogCWFwX3N2ci0+ZHJ2X3Byb3h5LmRydl9pbml0KCZhcF9zdnItPmRydl9wcm94eSk7Ly8gaWYgaW5pdCBmYWlsZWQgLCAgY2hlY2sgd2xhbiBhc3N1cmUgdGhlIHByb2Nlc3MKLQkJCisjZW5kaWYJCQogCWVuc3VyZV9jb25maWdfZGlyX2V4aXN0KENPTlRST0xfSUZBQ0VfUEFUSCk7CiAJZW5zdXJlX2ZpbGVfZXhpc3QoREVOWV9NQUNfRklMRSk7CiAJZW5zdXJlX2ZpbGVfZXhpc3QoQUNDRVBUX01BQ19GSUxFKTsKQEAgLTI0MzAsNyArMjcwNiw3IEBACiAvKgogIL3TyOvK/bfWxeSjurCuv8bOorXE0L7GrNTaYXBzdGG/qsb0yrFhcL3TyOvK/dfutPPWu9PQMzGjrNDo0qq89dK7CiAqLwotdm9pZCBzdGFfbnVtX2Fwc3RhX29wZW4oKQorc3RhdGljIHZvaWQgc3RhX251bV9hcHN0YV9vcGVuKHZvaWQpCiB7CiAjaWYgZGVmaW5lZCAoX19BSUNfODgwMERXX0NISVBfXykKIAljaGFyIG1heF9hY2Nlc3NfbnVtWzE2XSA9IHswfTsKQEAgLTI2NjYsNiArMjk0MiwxMSBAQAogI2lmZGVmIF9fU1RBX0ZVTkNfXwogCXdpZmlfc3RhdGlvbl9jYW5jZWxfc2NhbigpOwogI2VuZGlmCisKKwlpZiAobmVlZF9yZXNldF9odCgpKSB7CisJCXJlc2V0X2h0XzJnKCk7CisJfQorCiAJYXBfZG9jbWQoIkVOQUJMRSIsIE5VTEwpOwogCXdsYW5fc2V0X3R4cHdyKCk7CiAKQEAgLTI3MTYsNiArMjk5Nyw5IEBACiAJCWJyZWFrOwogCQogCWNhc2UgV0lGSV9DRkdfRk9SQ0VfUkVTVEFSVDoKKyNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQKKwkJcmVzdGFydF9kdWVfY2FwKGFwX3N2cik7CisjZWxzZQogI2lmZGVmICBfX1NUQV9GVU5DX18KIAkJaWYgKHN0cmNtcCAod2lmaV9zdGFfY29ubmVjdGlvbiwgIjEiKSA9PSAwKSB7CiAJCQl3aWZpX3N0YXRpb25fY2xvc2UoKTsKQEAgLTI3MzQsNiArMzAxOCw3IEBACiAJCQlzdGFfbnVtX2Fwc3RhX29wZW4oKTsKIAkJfQogI2VuZGlmCisjZW5kaWYKIAkJYnJlYWs7CiAJCiAJY2FzZSBXSUZJX0NGR19DSEFOTkVMX0ZPTExPVzoKZGlmZiAtLWdpdCBhL2FwL2FwcC96dGVfY29tbS93bGFuL3NyYy93aWZpX2Rydl9rby5jIGIvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dpZmlfZHJ2X2tvLmMKaW5kZXggMzkwZTNmMy4uYjNjYWUxMiAxMDA3NTUKLS0tIGEvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dpZmlfZHJ2X2tvLmMKKysrIGIvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dpZmlfZHJ2X2tvLmMKQEAgLTMsOCArMywxMiBAQAogI2luY2x1ZGUgIndpZmlfdXRpbC5oIg0KICNpbmNsdWRlICJ3aWZpX2Rydl9rby5oIg0KIA0KLSNkZWZpbmUgV0lGSV9JT0NUTF9TVE9QIDANCi0jZGVmaW5lIFdJRklfSU9DVExfU1RBUlQgMQ0KKyNkZWZpbmUgV0lGSV9JT0NUTF9TVE9QIDB4MA0KKyNkZWZpbmUgV0lGSV9JT0NUTF9TVEFSVCAweDENCisNCisjaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQorI2RlZmluZSBXSUZJX0lPQ1RMX1NUQVJUX1RFU1RNT0RFIDB4Mw0KKyNlbmRpZg0KIA0KIGludCBjb25maWdfd2xhbl9tYWMoc3RydWN0IHdsYW5fZHJ2X3Byb3h5ICpwcm94eSkNCiB7DQpAQCAtMTc1LDMgKzE3OSwyMyBAQAogCXJldHVybiAwOw0KIH0NCiANCisjaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQoraW50IHdsYW5fZHJ2X3Rlc3RfaW5pdCh2b2lkKQ0KK3sNCisjaWYgZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKQ0KKwlyZXR1cm4gd2lmaV9pb2N0bF9oYW5kbGUoV0lGSV9JT0NUTF9TVEFSVF9URVNUTU9ERSk7DQorI2Vsc2UNCisJcmV0dXJuIDA7DQorI2VuZGlmDQorfQ0KKw0KK2ludCB3bGFuX2Rydl90ZXN0X2RlaW5pdCh2b2lkKQ0KK3sNCisjaWYgZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKQ0KKwlyZXR1cm4gd2lmaV9pb2N0bF9oYW5kbGUoV0lGSV9JT0NUTF9TVE9QKTsNCisjZWxzZQ0KKwlyZXR1cm4gMDsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQpkaWZmIC0tZ2l0IGEvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dpZmlfc3RhX2N0cmwuYyBiL2FwL2FwcC96dGVfY29tbS93bGFuL3NyYy93aWZpX3N0YV9jdHJsLmMKaW5kZXggYzE1NzBiZC4uODYwM2NiMCAxMDA3NTUKLS0tIGEvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dpZmlfc3RhX2N0cmwuYworKysgYi9hcC9hcHAvenRlX2NvbW0vd2xhbi9zcmMvd2lmaV9zdGFfY3RybC5jCkBAIC0xNSwyNiArMTUsNDggQEAKIGV4dGVybiBpbnQgZ193b3JrX21vZGU7DQogdm9pZCByZXNldF93cGFfc3VwcGxpY2FudF9jb25mICh2b2lkKQ0KIHsNCisJY2hhciBjb25mX3NydFszNjBdID0gezB9Ow0KKwljaGFyIGNvdW50cnlfY29kZVs2XSA9IHswfTsNCisJc2NfY2ZnX2dldCAoIkNvdW50cnlDb2RlIiwgY291bnRyeV9jb2RlLCBzaXplb2YoY291bnRyeV9jb2RlKSAtIDEpOw0KKwlpZiAoMCA9PSBzdHJjbXAoY291bnRyeV9jb2RlLCAiTk9ORSIpKSB7DQorCQlzdHJjcHkoY291bnRyeV9jb2RlLCAiMDAiKTsNCisJfQ0KIAlpZiAoZ193b3JrX21vZGUgPT0gSU5fV0lGSV9XT1JLX01PREVfQVAxKSB7DQotCQl3bGFuX3dyaXRlX2ZpbGUgKFNVUFBMSUNBTlRfQ09ORiwgIiMjIyMjIHdwYV9zdXBwbGljYW50IGNvbmZpZ3VyYXRpb24gZmlsZSB0ZW1wbGF0ZSAjIyMjI1xuXA0KKwkJc25wcmludGYoY29uZl9zcnQsIHNpemVvZihjb25mX3NydCksICIjIyMjIyB3cGFfc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGZpbGUgdGVtcGxhdGUgIyMjIyNcblwNCiAJCQljdHJsX2ludGVyZmFjZT0vZXRjX3J3L3dpZmkvc29ja2V0c1xuXA0KIAkJCXVwZGF0ZV9jb25maWc9MVxuXA0KIAkJCXBtZj0xXG5cDQogCQkJc2FlX3B3ZT0yXG5cDQogCQkJZWFwb2xfdmVyc2lvbj0xXG5cDQogCQkJYXBfc2Nhbj0xXG5cDQotCQkJZnJlcV9saXN0PTUxODAgNTIwMCA1MjIwIDUyNDAgNTI2MCA1MjgwIDUzMDAgNTMyMCA1NTAwIDU1MjAgNTU0MCA1NTYwIDU1ODAgNTYwMCA1NjIwIDU2NDAgNTY2MCA1NjgwIDU3MDAgNTcyMCA1NzQ1IDU3NjUgNTc4NSA1ODA1IDU4MjVcbiIpOw0KKwkJCWNvdW50cnk9JXNcblwNCisJCQlmcmVxX2xpc3Q9NTE4MCA1MjAwIDUyMjAgNTI0MCA1MjYwIDUyODAgNTMwMCA1MzIwIDU1MDAgNTUyMCA1NTQwIDU1NjAgNTU4MCA1NjAwIDU2MjAgNTY0MCA1NjYwIDU2ODAgNTcwMCA1NzIwIDU3NDUgNTc2NSA1Nzg1IDU4MDUgNTgyNVxuIiwNCisJCQljb3VudHJ5X2NvZGUpOw0KKwl9DQorCWVsc2UgaWYgKGdfd29ya19tb2RlID09IElOX1dJRklfV09SS19NT0RFX1NUQSkgew0KKwkJc25wcmludGYoY29uZl9zcnQsIHNpemVvZihjb25mX3NydCksICIjIyMjIyB3cGFfc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGZpbGUgdGVtcGxhdGUgIyMjIyNcblwNCisJCQljdHJsX2ludGVyZmFjZT0vZXRjX3J3L3dpZmkvc29ja2V0c1xuXA0KKwkJCXVwZGF0ZV9jb25maWc9MVxuXA0KKwkJCXBtZj0xXG5cDQorCQkJc2FlX3B3ZT0yXG5cDQorCQkJZWFwb2xfdmVyc2lvbj0xXG5cDQorCQkJYXBfc2Nhbj0xXG5cDQorCQkJY291bnRyeT0lc1xuIiwNCisJCQljb3VudHJ5X2NvZGUpOw0KIAl9DQogCWVsc2Ugew0KLQkJd2xhbl93cml0ZV9maWxlIChTVVBQTElDQU5UX0NPTkYsICIjIyMjIyB3cGFfc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGZpbGUgdGVtcGxhdGUgIyMjIyNcblwNCisJCXNucHJpbnRmKGNvbmZfc3J0LCBzaXplb2YoY29uZl9zcnQpLCAiIyMjIyMgd3BhX3N1cHBsaWNhbnQgY29uZmlndXJhdGlvbiBmaWxlIHRlbXBsYXRlICMjIyMjXG5cDQogCQkJY3RybF9pbnRlcmZhY2U9L2V0Y19ydy93aWZpL3NvY2tldHNcblwNCiAJCQl1cGRhdGVfY29uZmlnPTFcblwNCiAJCQlwbWY9MVxuXA0KIAkJCXNhZV9wd2U9MlxuXA0KIAkJCWVhcG9sX3ZlcnNpb249MVxuXA0KIAkJCWFwX3NjYW49MVxuXA0KLQkJCWZyZXFfbGlzdD0yNDEyIDI0MTcgMjQyMiAyNDI3IDI0MzIgMjQzNyAyNDQyIDI0NDcgMjQ1MiAyNDU3IDI0NjIgMjQ2NyAyNDcyIDI0ODRcbiIpOw0KKwkJCWNvdW50cnk9JXNcblwNCisJCQlmcmVxX2xpc3Q9MjQxMiAyNDE3IDI0MjIgMjQyNyAyNDMyIDI0MzcgMjQ0MiAyNDQ3IDI0NTIgMjQ1NyAyNDYyIDI0NjcgMjQ3MiAyNDg0XG4iLA0KKwkJCWNvdW50cnlfY29kZSk7DQogCX0NCisJd2xhbl93cml0ZV9maWxlKFNVUFBMSUNBTlRfQ09ORiwgY29uZl9zcnQpOw0KIH0NCiAjZW5kaWYNCiB2b2lkIGNoZWNrX3dwYV9zdXBwbGljYW50X2NvbmYgKHZvaWQpDQpAQCAtMjA3LDggKzIyOSw5IEBACiANCiB2b2lkICB3bGFuX3N0YXRpb25fZHJ2X2luaXQoc3RydWN0ICB3bGFuX3N0YV9tYW5hZ2VyICogc3RhX2N0cmwpDQogew0KKyNpZiAhKGRlZmluZWQoVVNFX0NBUF9TVVBQT1JUKSkJDQogCXN0YV9jdHJsLT5kcnZfcHJveHkuZHJ2X2luaXQoJnN0YV9jdHJsLT5kcnZfcHJveHkpOyAvLyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlLCBpZiBpbml0IGZhaWxlZCwgY2hlY2sgd2xhbiBmdW5jdGlvbiB3aWxsIGFzc3VyZSB0aGUgcHJvY2Vzcw0KLQ0KKyNlbmRpZg0KIAljaGVja193cGFfc3VwcGxpY2FudF9jb25mKCk7DQogDQogCXVubGluayhXUEFfUElEX0ZJTEUpOw0KZGlmZiAtLWdpdCBhL2FwL2FwcC96dGVfY29tbS93bGFuL3NyYy93bGFuLXN0YXRpb24uYyBiL2FwL2FwcC96dGVfY29tbS93bGFuL3NyYy93bGFuLXN0YXRpb24uYwppbmRleCAzNzE2MzViLi41NDA3MGUzIDEwMDc1NQotLS0gYS9hcC9hcHAvenRlX2NvbW0vd2xhbi9zcmMvd2xhbi1zdGF0aW9uLmMKKysrIGIvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dsYW4tc3RhdGlvbi5jCkBAIC0yNDEsNiArMjQxLDcgQEAKIGV4dGVybiBzdHJ1Y3QgIHdsYW5fc3RhX21hbmFnZXIgICpzdGFfbWFuYWdlcjsNCiBleHRlcm4gaW50IG5lZWRfY2hhbm5lbF9mb2xsb3c7DQogDQorDQogLy9zdGF0aWMgaW50IGdfdGltZXJfc2ltX2luaXRfdW5kZWZpbmVkX3N0YXR1c19jb3VudCA9IDA7DQogLy9hZGQgYnkgemhvdXRpINTaZWFwIMjP1qS5/bPMx7C3osvNtcTS7LK9z/vPotTatci0/cqxuvKjrMjnufvTw7unZGlzY29ubmVjdKOsxMfDtNDo0qrF0LbPu9jAtLXEcmVzcM/7z6LKx7fxzqrV4rTOtcS72NOmo6zI57n7yse+zdDo0qq2qsb6sru0psDtDQogc3RhdGljIGludCBnX3NlbmRfY291bnQgPSAwOw0KQEAgLTI2OCw2ICsyNjksOSBAQAogaW50IGdfY29ubmVjdGluZ190aW1lX291dF90aW1lciA9IDA7Ly/Iq77WvMfCvMrHt/HS0bS0vajBrL3Ts6zKsbaoyrHG9w0KIA0KICNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCitleHRlcm4gaW50IGdfd29ya19tb2RlOw0KK2V4dGVybiBpbnQgZ19jYXBfc3RhX2VuYWJsZTsNCisNCiBpbnQgZ19jYXBfc2NhbiA9IDA7IC8vvfZjYXC3osbwc2NhbsqxLLLFyc+xqL3hufssuvPMqNa00NC94bn7sruxqA0KIGludCBzZW5kX3N0YV9zdGF0dXNfdG9fY2FwKGludCBzdGF0dXMsIGludCByZWFzb24pOw0KICNlbmRpZg0KQEAgLTI3MTksMjQgKzI3MjMsMjYgQEAKIHN0YXRpYyB2b2lkIGNhcF9zdGF0aW9uX2VuYWJsZSh3bGFuX3N0YV9lbmFibGVfdCAqc3RhX2VuYSkNCiB7DQogCWlmIChzdGFfZW5hLT5lbmFibGUgPT0gMSkgew0KKwkJZ19jYXBfc3RhX2VuYWJsZSA9IDE7DQogCQlpZiAoMSA9PSBnX3dwYV9zdXBwbGljYW50KSB7DQogCQkJd2ZfbG9nKCJzdGF0aW9uIGhhcyBvcGVuZWQiKTsNCiAJCQlyZXR1cm47DQogCQl9DQogCQkvL01TR19DTURfV0lGSV9TVEFUSU9OX09QRU47DQotI2lmIGRlZmluZWQoX19SRUFMVEVLXzgxOTJfQ0hJUF9fKSB8fCBkZWZpbmVkKF9fQUlDXzg4MDBEV19DSElQX18pDQotCQl3aWZpX3N0YXRpb25fb3Blbl9hcHN0YSgpOw0KLQkJLy93aWZpX3N0YXRpb25fY29ubmVjdChNT0RVTEVfSURfV0VCX0NHSSk7Ly+08r+qtcTKsbry0tG+rcGswcvSu7TOo6zDu9PQsdjSqtTZtM7BrL3TDQotI2Vsc2UNCi0JCXdmX2xvZygiLU1TR19DTURfV0lGSV9TVEFUSU9OX09QRU4tIik7DQotCQl3bGFuX3N0YXRpb25faW5pdCgpOw0KLSNlbmRpZg0KKwkJaWYgKGdfd29ya19tb2RlID09IElOX1dJRklfV09SS19NT0RFX0FQMCB8fCBnX3dvcmtfbW9kZSA9PSBJTl9XSUZJX1dPUktfTU9ERV9BUDEpIHsNCisJCQl3aWZpX3N0YXRpb25fb3Blbl9hcHN0YSgpOw0KKwkJCS8vd2lmaV9zdGF0aW9uX2Nvbm5lY3QoTU9EVUxFX0lEX1dFQl9DR0kpOy8vtPK/qrXEyrG68tLRvq3BrMHL0ru0zqOsw7vT0LHY0qrU2bTOway90w0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJd2ZfbG9nKCItTVNHX0NNRF9XSUZJX1NUQVRJT05fT1BFTi0iKTsNCisJCQl3bGFuX3N0YXRpb25faW5pdCgpOw0KKwkJfQ0KIAl9DQogCWVsc2Ugew0KLSNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCisJCWdfY2FwX3N0YV9lbmFibGUgPSAwOw0KIAkJc2VuZF9zdGFfc3RhdHVzX3RvX2NhcChJTl9XSUZJX1NUQV9TVEFUVVNfTk9ORSwgSU5fV0lGSV9SRUFTT05fQ09ERV9OT05FKTsNCiAJCS8vc2NfY2ZnX3NldCgid2lmaV9zdGFfY29ubmVjdGlvbiIsICIwIik7DQotI2VuZGlmDQorDQogCQlpZiAoMCA9PSBnX3dwYV9zdXBwbGljYW50KSB7DQogCQkJd2ZfbG9nKCJzdGF0aW9uIGhhcyBjbG9zZWQiKTsNCiAJCQlyZXR1cm47DQpAQCAtMjc0NCw5ICsyNzUwLDEwIEBACiAJCS8vTVNHX0NNRF9XSUZJX1NUQVRJT05fQ0xPU0U7DQogCQlzdGFfZGlzY29ubmVjdGVkKCk7DQogCQl3bGFuX3N0YXRpb25fZGVpbml0KCk7DQotI2lmIGRlZmluZWQoX19SRUFMVEVLXzgxOTJfQ0hJUF9fKXx8IGRlZmluZWQoX19BSUNfODgwMERXX0NISVBfXykNCi0JCWJhc2ljX2RlYWxfYWxsIChXSUZJX0NGR19SRVNUQVJUX0FQKTsNCi0jZW5kaWYNCisJCWlmIChnX3dvcmtfbW9kZSA9PSBJTl9XSUZJX1dPUktfTU9ERV9BUDAgfHwgZ193b3JrX21vZGUgPT0gSU5fV0lGSV9XT1JLX01PREVfQVAxKSB7DQorCQkJLy9ubyBtc3NpZCwgbm90IG5lZWQNCisJCQkvL2Jhc2ljX2RlYWxfYWxsIChXSUZJX0NGR19SRVNUQVJUX0FQKTsNCisJCX0NCiAJfQ0KIA0KIH0NCkBAIC0yOTUyLDIwICsyOTU5LDE5IEBACiAJcmV0dXJuIHJldDsNCiB9DQogDQorc3RhdGljIHZvaWQgY2FwX3N0YXRpb25faW5mbyhNU0dfQlVGICpwTXNnKQ0KK3sNCisJd2xhbl9zdGFfc3RhdF9zeW5jX3Qgc3RhX3N0YXQgPSB7MH07DQorCXN0YV9zdGF0LnJzc2kgPSBnZXRfY3VyX2FwX3Jzc2koKTsNCisJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSwgcE1zZy0+c3JjX2lkLCBNU0dfQ01EX0NBUF9XSUZJX1NUQV9TVEFUX1JTUCwgc2l6ZW9mKHN0YV9zdGF0KSwgJnN0YV9zdGF0LCAwKTsNCit9DQorDQogc3RhdGljIHZvaWQgY2FwX3N0YXRpb25fc2Nhbih2b2lkKQ0KIHsNCi0JY2hhciB3aWZpX3N0YV9jb25uZWN0aW9uW1dJRklfQ09OTkVDVElPTl9MRU5dID0gezB9Ow0KIAljaGFyIHN0YV9pcF9zdGF0dXNbV0lGSV9TVEFUSU9OX0lQX1NUQVRVU19MRU5dID0gezB9Ow0KLQ0KLQlzY19jZmdfZ2V0KCJ3aWZpX3N0YV9jb25uZWN0aW9uIiwgd2lmaV9zdGFfY29ubmVjdGlvbiwgc2l6ZW9mICh3aWZpX3N0YV9jb25uZWN0aW9uKSk7DQotDQorCQ0KIAl3Zl9sb2coImNhcF9zdGF0aW9uX3NjYW4iKTsNCiAJLy+5psTcudix1dTy1rG9083Ls/YNCi0JaWYgKHN0cmNtcCh3aWZpX3N0YV9jb25uZWN0aW9uLCAiMSIpICE9IDApIHsNCi0JCXdmX2xvZygic3RhdGlvbiBjbG9zZTogJXMiLCB3aWZpX3N0YV9jb25uZWN0aW9uKTsNCi0JCXJldHVybjsNCi0JfQ0KLQkNCiAJLy93cGFfc3VwcGxpY2FudL34s8zDu8b0tq/U8sb0tq+jrMr009rS7LOjsaO7pA0KIAlpZiAoY2hlY2tfc3VwcGxpY2FudF9hbGl2ZSgpID09IDApIHsNCiAJCXdmX2xvZygid3BhIHN1cHBsaWNhbnQgaXMgbm90IHJ1bm5pbmcheHgiKTsNCkBAIC0zMzA0LDcgKzMzMTAsMTAgQEAKIAkJY2FwX3N0YXRpb25fc2NhbigpOw0KIAkJYnJlYWs7DQogCX0NCi0NCisJY2FzZSBNU0dfQ01EX0NBUF9XSUZJX1NUQV9TVEFUX1JFUTogew0KKwkJY2FwX3N0YXRpb25faW5mbyhwTXNnKTsNCisJCWJyZWFrOw0KKwl9DQogI2VuZGlmDQogCWRlZmF1bHQ6IHsNCiAJCXJldCA9IC0xOw0KQEAgLTMzNzUsNiArMzM4NCwxMiBAQAogCXVuc2lnbmVkIGludCBsZW4gPSAwOy8va2xvY3dvcmsNCiAJaW50IGZyZXF1ZW5jeSA9IDA7DQogDQorI2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0KKwlpZiAoZ193b3JrX21vZGUgPT0gSU5fV0lGSV9XT1JLX01PREVfU1RBKSB7DQorCQl3Zl9sb2coIm5vIGFwIGNoYW5uZWxfZm9sbG93IG5vdCBuZWVkIik7DQorCQlyZXR1cm47DQorCX0NCisjZW5kaWYNCiAJc3RhcnQgPSBzdHJzdHIoYnVmLCAiZnJlcT0iKSArIHN0cmxlbigiZnJlcT0iKTsNCiAJaWYgKHN0YXJ0ICE9IE5VTEwpIHsNCiAJCWVuZCA9IHN0cnN0ciAoc3RhcnQsICIgTUh6Iik7Ly9rbG9jd29yaw0KZGlmZiAtLWdpdCBhL2FwL2FwcC96dGVfY29tbS93bGFuL3NyYy93bGFuX21haW4uYyBiL2FwL2FwcC96dGVfY29tbS93bGFuL3NyYy93bGFuX21haW4uYwppbmRleCBkNjU1NjQxLi40MjQ0NTFjIDEwMDc1NQotLS0gYS9hcC9hcHAvenRlX2NvbW0vd2xhbi9zcmMvd2xhbl9tYWluLmMKKysrIGIvYXAvYXBwL3p0ZV9jb21tL3dsYW4vc3JjL3dsYW5fbWFpbi5jCkBAIC0zNiw5ICszNiwyMCBAQAogI2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0KICNkZWZpbmUgRlJPTV9DQVAgMA0KIA0KK2ludCBnX3dpZmlfaW5pdCA9IDA7IA0KKw0KIGludCBnX3dvcmtfbW9kZSA9IElOX1dJRklfV09SS19NT0RFX0FQMDsgLy9kZWZhdWx0DQogDQorLy9yZWNvcmQgY2FwIG9wdA0KK2ludCBnX2NhcF93aWZpX2VuYWJsZSA9IDA7DQoraW50IGdfY2FwX2FwX2VuYWJsZSA9IDA7DQoraW50IGdfY2FwX3N0YV9lbmFibGUgPSAwOw0KKw0KKw0KIGV4dGVybiBpbnQgc2VuZF9zdGFfc3RhdHVzX3RvX2NhcChpbnQgc3RhdHVzLCBpbnQgcmVhc29uKTsNCitleHRlcm4gaW50IHdsYW5fZHJ2X3Rlc3RfaW5pdCh2b2lkKTsNCitleHRlcm4gaW50IHdsYW5fZHJ2X3Rlc3RfZGVpbml0KHZvaWQpOw0KK2V4dGVybiBpbnQgd2lmaV9nZXRfYXBfbWFjKHZvaWQpOw0KIA0KIGludCBzZW5kX2FwX3N0YXR1c190b19jYXAoaW50IGlkeCwgaW50IHN0YXR1cyk7DQogaW50IHNlbmRfc3RhX2NoYW5nZV90b19jYXAoaW50IGlkeCwgaW50IHN0YXR1cywgY2hhciAqbWFjKTsNCkBAIC0xMDIsNyArMTEzLDcgQEAKIA0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqvrLMrLqvyv3J+cP3KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogc3RhdGljIGludCBjaGFyZ2luZ2NoZWNrc3RhdGVzKCk7DQotc3RhdGljIGludCBjYXBfY2hlY2tfd2lmaSh2b2lkKTsNCitzdGF0aWMgaW50IGNhcF9jaGVja193aWZpKE1TR19CVUYgKnBNc2cpOw0KIHN0YXRpYyB2b2lkIHNsZWVwX3dpZmkoKTsNCiB2b2lkIGJhc2ljX2RlYWxfYWxsIChpbnQgY21kKTsNCiBleHRlcm4gIHZvaWQgenRlX2dldF93aWZpX3N0YV9saXN0KFJUXzgwMl8xMV9NQUNfVEFCTEUgKnN0YUxpc3QpOw0KQEAgLTg5MCw2ICs5MDEsMTkgQEAKIH0NCiANCiAjaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQoraW50IHNlbmRfd2xhbl9zdGF0dXNfdG9fY2FwKGludCBzdGF0dXMpDQorewkJDQorCXdsYW5fc3RhdHVzX3Qgd19zdGF0ID0gezB9Ow0KKwlpbnQgcmV0ID0gMDsNCisNCisJd19zdGF0LndpZmlfc3RhdHVzID0gc3RhdHVzOw0KKwlyZXQgPSBzZW5kX3NvY19tc2coRkFSX1BTLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9DQVBfV0lGSV9TVEFUVVMsIHNpemVvZih3X3N0YXQpLCAmd19zdGF0KTsNCisJaWYgKHJldCAhPSAwKSB7DQorCQl3Zl9sb2coInNlbmRfd2xhbl9zdGF0dXNfdG9fY2FwIGlwY19zZW5kX21lc3NhZ2UgZmFpbCwgcmV0OiVkLCVkXG4iLCByZXQsIHN0YXR1cyk7DQorCX0NCisJcmV0dXJuIHJldDsNCit9DQorDQogLy93aWZpIGFwIHN0YXR1cw0KIGludCBzZW5kX2FwX3N0YXR1c190b19jYXAoaW50IGlkeCwgaW50IHN0YXR1cykNCiB7CQkNCkBAIC05NTUsMTMgKzk3OSwxNiBAQAogCXJldHVybiByZXQ7DQogfQ0KIA0KLXN0YXRpYyBpbnQgY2FwX2NoZWNrX3dpZmkodm9pZCkNCitzdGF0aWMgaW50IGNhcF9jaGVja193aWZpKE1TR19CVUYgKnBNc2cpDQogew0KIAljaGFyICB3aWZpX21hY1syMF0gPSB7MH07DQotCWNoYXIgIHdpZmlfY2hpcFsyMF0gPSB7MH07DQorCQ0KIAlpbnQgICByZXQgPSAwOw0KIAl3bGFuX3N0YXR1c190IHdfc3RhdCA9IHswfTsNCiAjaWYgMAkvL3dpZmlfY2hpcD09MCwgcmV0dXJuDQorCWNoYXIgIHdpZmlfY2hpcFsyMF0gPSB7MH07DQorCXdsYW5fc3RhdHVzX3Qgd19zdGF0ID0gezB9Ow0KKw0KIAlzY19jZmdfZ2V0KCJ3aWZpX2NoaXAiLCB3aWZpX2NoaXAsIHNpemVvZih3aWZpX2NoaXApKTsNCiAJaWYgKHN0cmNtcCh3aWZpX2NoaXAsICIwIikgPT0gMCl7DQogCQl3Zl9sb2cgKCJ3aWZpIGRldiBpbml0IGZhaWwhIik7DQpAQCAtOTczLDI1ICsxMDAwLDc0IEBACiAJCXJldHVybiAtMTsNCiAJfQ0KICNlbmRpZg0KKwlpZiAocE1zZy0+dXNNc2dDbWQgPT0gTVNHX0NNRF9DQVBfV0lGSV9URVNUX0VOQUJMRSkgew0KKwkJd2ZfbG9nICgid2lmaSB0ZXN0IG1vZGUgbm90IGNhcmUgbWFjISIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCiANCisvKiBTdGFydGVkIGJ5IEFJQ29kZXIsIHBpZDpnMGZiMHJiOTMyejM1NzExNDY5YTBiNjMyMGY1MTEwNDkwZTY4OGE2ICovDQorCWlmIChwTXNnLT51c01zZ0NtZCA9PSBNU0dfQ01EX0NBUF9XSUZJX1NUQV9TVEFUX1JFUSkgew0KKwkJd2ZfbG9nICgiYXQgY21kIG5lZWQgcnNwISIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisvKiBFbmRlZCBieSBBSUNvZGVyLCBwaWQ6ZzBmYjByYjkzMnozNTcxMTQ2OWEwYjYzMjBmNTExMDQ5MGU2ODhhNiAqLw0KKyNpZiAhKGRlZmluZWQoQ09ORklHX1dJRklfRUZVU0VfTUFDKSkNCiAJc2NfY2ZnX2dldCgid2lmaV9tYWMiLCB3aWZpX21hYywgc2l6ZW9mKHdpZmlfbWFjKSk7DQogCWlmKHN0cmxlbih3aWZpX21hYykgPT0gMCl7DQogCQl3Zl9sb2cgKCJ3aWZpIG1hYyBpbnZhbGlkISIpOw0KLQkJd19zdGF0LndpZmlfc3RhdHVzID0gSU5fV0lGSV9TVEFUVVNfSU5WQUxJRF9NQUM7DQotCQlyZXQgPSBzZW5kX3NvY19tc2coRkFSX1BTLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9DQVBfV0lGSV9TVEFUVVMsIHNpemVvZih3X3N0YXQpLCAmd19zdGF0KTsNCi0JCWlmIChyZXQgIT0gMCkgew0KLQkJCXdmX2xvZygiY2FwX2NoZWNrX3dpZmkgbWFjIGlwY19zZW5kX21lc3NhZ2UgZmFpbCwgcmV0OiVkXG4iLCByZXQpOw0KLQkJfQ0KKwkJc2VuZF93bGFuX3N0YXR1c190b19jYXAoSU5fV0lGSV9TVEFUVVNfSU5WQUxJRF9NQUMpOw0KIAkJcmV0dXJuIC0xOw0KIAl9DQotCQ0KKyNlbmRpZg0KIAlyZXR1cm4gMDsNCiB9DQogDQogLy/E2rK/09DW2MjrsaO7pA0KIHN0YXRpYyB2b2lkIGNhcF93aWZpX2VuYWJsZShNU0dfQlVGICpwc3RNc2cpDQotew0KLQlhcF9zZXJ2ZXItPmRydl9wcm94eS5kcnZfaW5pdCgmYXBfc2VydmVyLT5kcnZfcHJveHkpOw0KK3sJDQorCWludCByZXQgPSAwOw0KKwlpbnQgaSA9IDA7DQorCWludCByZXRyeSA9IDI7DQorCWludCBpZmluZGV4ID0gMDsNCisJDQorCWlmIChnX3dpZmlfaW5pdCA9PSAwKSB7DQorCQl3bGFuX2Rydl9wcmVfaW5pdCgmYXBfc2VydmVyLT5kcnZfcHJveHkpOw0KKwkJZ193aWZpX2luaXQgPSAxOw0KKwl9DQorCQ0KKwlyZXQgPSBhcF9zZXJ2ZXItPmRydl9wcm94eS5kcnZfaW5pdCgmYXBfc2VydmVyLT5kcnZfcHJveHkpOw0KKwlpZiAocmV0ICE9IDApIHsJDQorCQkvL3NjX2NmZ19zZXQoIndsYW5fZHJ2X3N0YXQiLCAiMCIpOw0KKwkJc2VuZF93bGFuX3N0YXR1c190b19jYXAoSU5fV0lGSV9TVEFUVVNfREVWX0lOSVRfRkFJTCk7DQorCQl3Zl9sb2coImRydl9pbml0IGZhaWw6ICVkXG4iLCByZXQpOw0KKwkJcmV0dXJuOw0KKwl9DQorCS8vd2hlbiBhcCBzdGFydCwgc3RhIHdsYW4gaWZhY2UgaGFzIGJlZW4gc2V0dXBlZA0KKwkvL3N0YV9tYW5hZ2VyLT5kcnZfcHJveHkuZHJ2X2luaXQoJnN0YV9tYW5hZ2VyLT5kcnZfcHJveHkpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgcmV0cnk7IGkrKykgewkNCisJCWlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChhcF9zZXJ2ZXItPmRydl9wcm94eS5pZmFjZV9uYW1lKTsNCisJCWlmIChpZmluZGV4ID09IDApIHsNCisJCQlpZiAoaSA8IChyZXRyeSAtIDEpKSB7DQorCQkJCXVzbGVlcCgyMDAwMDApOw0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJLy9zY19jZmdfc2V0KCJ3bGFuX2Rydl9zdGF0IiwgIjEiKTsNCisJCSNpZiBkZWZpbmVkKENPTkZJR19XSUZJX0VGVVNFX01BQykNCisJCQl3aWZpX2dldF9hcF9tYWMoKTsNCisJCQkvL3dpZmlfZndfbWFjX2NvbmZpZ19zc2lkKGFwX3NlcnZlcik7DQorCQkjZW5kaWYNCisJCQlnX2NhcF93aWZpX2VuYWJsZSA9IDE7DQorCQkJc2VuZF93bGFuX3N0YXR1c190b19jYXAoSU5fV0lGSV9TVEFUVVNfRU5BQkxFRCk7DQorCQkJd2ZfbG9nKCJkcnZfaW5pdCBva1slZF1cbiIsIGkpOw0KKwkJCXJldHVybjsNCisJCX0NCisJfQ0KKwkNCisJLy9zY19jZmdfc2V0KCJ3bGFuX2Rydl9zdGF0IiwgIjAiKTsNCisJc2VuZF93bGFuX3N0YXR1c190b19jYXAoSU5fV0lGSV9TVEFUVVNfREVWX0lOSVRfRkFJTCk7DQorCXdmX2xvZygiZHJ2X2luaXQgbm90IGV4aXN0XG4iKTsNCisJcmV0dXJuOw0KIH0NCiANCiBzdGF0aWMgdm9pZCBjYXBfd2lmaV9kaXNhYmxlKE1TR19CVUYgKnBzdE1zZykNCkBAIC0xMDAxLDcgKzEwNzcsNyBAQAogDQogCWlmIChhcF9zZXJ2ZXItPmFwMF9zdGF0ZSkgew0KIAkJd2ZfbG9nKCJjYXAgZGlzYWJsZSB3aGVuIGFwIG5vdCBjbG9zZWQiKTsNCi0JCXNlbmRfYXBfc3RhdHVzX3RvX2NhcChJTl9XSUZJX0FQX0lOREVYX01BWCwgSU5fV0lGSV9BUF9TVEFUVVNfRElTQUJMSU5HKTsNCisJCS8vc2VuZF9hcF9zdGF0dXNfdG9fY2FwKElOX1dJRklfQVBfSU5ERVhfTUFYLCBJTl9XSUZJX0FQX1NUQVRVU19ESVNBQkxJTkcpOw0KIAkJYmFzaWNfZGVhbF9hbGwoV0lGSV9DRkdfQ0xPU0UpOw0KIAkJc2VuZF9hcF9zdGF0dXNfdG9fY2FwKElOX1dJRklfQVBfSU5ERVhfTUFYLCBJTl9XSUZJX0FQX1NUQVRVU19JRExFKTsNCiAJfQ0KQEAgLTEwMTIsNiArMTA4OCwxMiBAQAogCX0NCiANCiAJYXBfc2VydmVyLT5kcnZfcHJveHkuZHJ2X2RlaW5pdCgmYXBfc2VydmVyLT5kcnZfcHJveHkpOw0KKw0KKwlnX2NhcF9zdGFfZW5hYmxlID0gMDsNCisJZ19jYXBfYXBfZW5hYmxlID0gMDsNCisJZ19jYXBfd2lmaV9lbmFibGUgPSAwOw0KKw0KKwlzZW5kX3dsYW5fc3RhdHVzX3RvX2NhcChJTl9XSUZJX1NUQVRVU19ESVNBQkxFRCk7DQogfQ0KIA0KIHN0YXRpYyB2b2lkIGNhcF93aWZpX21vZGVfc2V0KE1TR19CVUYgKnBzdE1zZykNCkBAIC0xMDE5LDcgKzExMDEsMTAgQEAKIAl3bGFuX3dvcmtfbW9kZV90ICpkYXRhX2J1ZiA9ICh3bGFuX3dvcmtfbW9kZV90ICopcHN0TXNnLT5hdWNEYXRhQnVmOw0KIA0KIAlnX3dvcmtfbW9kZSA9IGRhdGFfYnVmLT53b3JrX21vZGU7DQotCS8vYml0bWFwDQorCS8vY29leGlzdCBiaXRtYXANCisNCisJLy9jdXJyZW50IGNoaXAgbm90IGNvZXhpc3QNCisJLy9zY19jZmdfc2V0KCJ3aWZpX2JhbmQiLCAiYiIvImEiKTsNCiB9DQogDQogc3RhdGljIHZvaWQgY2FwX3NzaWRfc2V0KE1TR19CVUYgKnBzdE1zZykNCkBAIC0xMjE5LDcgKzEzMDQsNyBAQAogCWNhc2UgSU5fV0lGSV9BUF9JTkRFWF9BUDE6DQogCXsNCiAJCWNoYXIgaGlkZV9zdHJbTlZJT19XSUZJX0xFTl8zMl0gPSB7MH07DQotCQlzY19jZmdfc2V0KCJDb3VudHJ5Q29kZV81ZyIsIGRhdGFfYnVmLT5jb3VudHJ5Y29kZSk7DQorCQlzY19jZmdfc2V0KCJDb3VudHJ5Q29kZSIsIGRhdGFfYnVmLT5jb3VudHJ5Y29kZSk7DQogCQ0KIAkJc25wcmludGYoaGlkZV9zdHIsIHNpemVvZihoaWRlX3N0ciksICIlZCIsIGRhdGFfYnVmLT5jaGFubmVsKTsJDQogCQlzY19jZmdfc2V0KCJDaGFubmVsXzVnIiwgaGlkZV9zdHIpOw0KQEAgLTE0MTIsNiArMTQ5Nyw3IEBACiAJY2FzZSBJTl9XSUZJX0FQX0lOREVYX0FQMDoNCiAJCWlmIChkYXRhX2J1Zi0+ZW5hYmxlKSB7Ly9qaWEgeWkgZ2UgbnYgLHphaSBjYXAgc2Nfd2lmaV9hcF9zdGFydCBob3UsemhpIHhpbmcgemhlIHhpZQ0KIAkJCXdmX2xvZygiY2FwIG9wZW4gd2lmaSIpOw0KKwkJCWdfY2FwX2FwX2VuYWJsZSA9IDE7DQogCQkJaWYgKCFhcF9zZXJ2ZXItPmFwMF9zdGF0ZSAmJiBnX3dvcmtfbW9kZSA9PSBJTl9XSUZJX1dPUktfTU9ERV9BUDApIHsNCiAJCQkJY2hhciBtX3NzaWRfZW5hYmxlWzhdID0gezB9Ow0KIAkJCQkNCkBAIC0xNDI4LDE2ICsxNTE0LDE4IEBACiAJCX0NCiAJCWVsc2Ugew0KIAkJCXdmX2xvZygiY2FwIGNsb3NlIHdpZmkiKTsNCisJCQlnX2NhcF9hcF9lbmFibGUgPSAwOw0KIAkJCWlmIChhcF9zZXJ2ZXItPmFwMF9zdGF0ZSAmJiBnX3dvcmtfbW9kZSA9PSBJTl9XSUZJX1dPUktfTU9ERV9BUDApIHsNCi0JCQkJc2VuZF9hcF9zdGF0dXNfdG9fY2FwKGlkeCwgSU5fV0lGSV9BUF9TVEFUVVNfRElTQUJMSU5HKTsNCi0JCQkJYmFzaWNfZGVhbF9hbGwoV0lGSV9DRkdfQ0xPU0UpOw0KLQkJCQlzZW5kX2FwX3N0YXR1c190b19jYXAoaWR4LCBJTl9XSUZJX0FQX1NUQVRVU19JRExFKTsNCisJCQkJLy9zZW5kX2FwX3N0YXR1c190b19jYXAoaWR4LCBJTl9XSUZJX0FQX1NUQVRVU19ESVNBQkxJTkcpOw0KKwkJCQliYXNpY19kZWFsX2FsbChXSUZJX0NGR19DTE9TRSk7CQ0KIAkJCX0NCisJCQlzZW5kX2FwX3N0YXR1c190b19jYXAoaWR4LCBJTl9XSUZJX0FQX1NUQVRVU19JRExFKTsNCiAJCX0NCiAJCWJyZWFrOw0KIAljYXNlIElOX1dJRklfQVBfSU5ERVhfQVAxOg0KIAkJaWYgKGRhdGFfYnVmLT5lbmFibGUpIHsvL2ppYSB5aSBnZSBudiAsemFpIGNhcCBzY193aWZpX2FwX3N0YXJ0IGhvdSx6aGkgeGluZyB6aGUgeGllDQogCQkJd2ZfbG9nKCJjYXAgb3BlbiB3aWZpIDVHIik7DQorCQkJZ19jYXBfYXBfZW5hYmxlID0gMTsNCiAJCQlpZiAoIWFwX3NlcnZlci0+YXAwX3N0YXRlICYmIGdfd29ya19tb2RlID09IElOX1dJRklfV09SS19NT0RFX0FQMSkgew0KIAkJCQljaGFyIG1fc3NpZF9lbmFibGVbOF0gPSB7MH07DQogCQkJCQ0KQEAgLTE0NTQsMTEgKzE1NDIsMTIgQEAKIAkJfQ0KIAkJZWxzZSB7DQogCQkJd2ZfbG9nKCJjYXAgY2xvc2Ugd2lmaSA1RyIpOw0KKwkJCWdfY2FwX2FwX2VuYWJsZSA9IDA7DQogCQkJaWYgKGFwX3NlcnZlci0+YXAwX3N0YXRlICYmIGdfd29ya19tb2RlID09IElOX1dJRklfV09SS19NT0RFX0FQMSkgew0KLQkJCQlzZW5kX2FwX3N0YXR1c190b19jYXAoaWR4LCBJTl9XSUZJX0FQX1NUQVRVU19ESVNBQkxJTkcpOw0KKwkJCQkvL3NlbmRfYXBfc3RhdHVzX3RvX2NhcChpZHgsIElOX1dJRklfQVBfU1RBVFVTX0RJU0FCTElORyk7DQogCQkJCWJhc2ljX2RlYWxfYWxsKFdJRklfQ0ZHX0NMT1NFKTsNCi0JCQkJc2VuZF9hcF9zdGF0dXNfdG9fY2FwKGlkeCwgSU5fV0lGSV9BUF9TVEFUVVNfSURMRSk7DQogCQkJfQ0KKwkJCXNlbmRfYXBfc3RhdHVzX3RvX2NhcChpZHgsIElOX1dJRklfQVBfU1RBVFVTX0lETEUpOw0KIAkJfQ0KIAkJYnJlYWs7DQogCWRlZmF1bHQ6DQpAQCAtMTQ2Nyw2ICsxNTU2LDI4IEBACiANCiB9DQogDQorc3RhdGljIHZvaWQgY2FwX3dpZmlfdGVzdF9tb2RlX2VuYWJsZShNU0dfQlVGICpwc3RNc2cpDQorewkNCisJaW50IHJldCA9IDA7DQorCWludCBpc19lbmFibGUgPSAqKChpbnQgKilwc3RNc2ctPmF1Y0RhdGFCdWYpOw0KKw0KKwlpZiAoaXNfZW5hYmxlKSB7DQorCQlyZXQgPSB3bGFuX2Rydl90ZXN0X2luaXQoKTsNCisJCWlmIChyZXQgIT0gMCkgewkNCisJCQl3Zl9sb2coInRlc3RfbW9kZSBkcnZfaW5pdCBmYWlsOiAlZFxuIiwgcmV0KTsNCisJCQlyZXR1cm47DQorCQl9DQorCX0NCisJZWxzZSB7DQorCQlyZXQgPSB3bGFuX2Rydl90ZXN0X2RlaW5pdCgpOw0KKwkJaWYgKHJldCAhPSAwKSB7CQ0KKwkJCXdmX2xvZygidGVzdF9tb2RlIGRydl9kZWluaXQgZmFpbDogJWRcbiIsIHJldCk7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwl9DQorDQorfQ0KKw0KICNlbmRpZg0KIA0KIHZvaWQgd2xhbl9hcF9tc2dfaGFuZGxlIChNU0dfQlVGICpwTXNnKQ0KQEAgLTE1MzIsNiArMTY0Myw5IEBACiAJCXdpZmlfYWR2YW5jZWRfc2V0IChwTXNnKTsNCiAJCWJyZWFrOw0KIAljYXNlIE1TR19DTURfV0lGSV9GT1JDRV9SRVNUQVJUOi8vIGJyb2FkY29tICxyZWFsdGVrIG5lZWQsIGZvcm0gbmV0bGluayBtc2cNCisjaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQorCQlzZW5kX3dsYW5fc3RhdHVzX3RvX2NhcChJTl9XSUZJX1NUQVRVU19GSVJNV0FSRV9DUkFTSCk7DQorI2VuZGlmDQogCQkvL9TaIHdpZmkgZmlybXdhcmUgY3Jhc2i687XE1tjG9MH3s8yjrLK71MrQ7XdlYnVpt6LLzc/7z6LPwsC0o6zL+dLUvatSYWRpb09mZtbDMA0KIAkJLy9zY19jZmdfc2V0KCJ3aWZpX2N1cl9zdGF0ZSIsIFdJRklfQ0xPU0VEKTsNCiAJCS8vc2NfY2ZnX3NldCgiUmFkaW9PZmZFeGNlcHRpb24iLCAiMCIpOy8vILeiz/vPorXE1LTNt7eiyfrByyDS7LOjudix1XdpZmnH6b/2DQpAQCAtMTY3MSw2ICsxNzg1LDkgQEAKIAljYXNlIE1TR19DTURfQ0FQX1dJRklfQVBfRU5BQkxFOg0KIAkJY2FwX2VuYWJsZV9zZXQocE1zZyk7DQogCQlicmVhazsNCisJY2FzZSBNU0dfQ01EX0NBUF9XSUZJX1RFU1RfRU5BQkxFOg0KKwkJY2FwX3dpZmlfdGVzdF9tb2RlX2VuYWJsZShwTXNnKTsNCisJCWJyZWFrOw0KICNlbmRpZg0KIAlkZWZhdWx0Og0KIAkJYnJlYWs7DQpAQCAtMTgwNCw2ICsxOTIxLDEyIEBACiAJCUNBU0VfUkVUVVJOX1NUUiAoTVNHX0NNRF9DQVBfV0lGSV9TRVRfQUNMKTsNCiAJCUNBU0VfUkVUVVJOX1NUUiAoTVNHX0NNRF9DQVBfV0lGSV9TRVRfQVVUSCk7DQogCQlDQVNFX1JFVFVSTl9TVFIgKE1TR19DTURfQ0FQX1dJRklfQVBfRU5BQkxFKTsNCisJCS8vc3luYw0KKwkJQ0FTRV9SRVRVUk5fU1RSIChNU0dfQ01EX0NBUF9XSUZJX1NUQV9TVEFUX1JFUSk7DQorCQlDQVNFX1JFVFVSTl9TVFIgKE1TR19DTURfQ0FQX1dJRklfU1RBX1NUQVRfUlNQKTsNCisNCisJCS8vd2lmaSB0ZXN0DQorCQlDQVNFX1JFVFVSTl9TVFIgKE1TR19DTURfQ0FQX1dJRklfVEVTVF9FTkFCTEUpOw0KIA0KIAl9Ow0KIAlyZXR1cm4gIlVOS05PV04gIENNRCBJRCI7DQpAQCAtMTg1MSw3ICsxOTc0LDcgQEAKIAl9DQogDQogI2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0KLQlpZiAoY2FwX2NoZWNrX3dpZmkoKSAhPSAwKSB7DQorCWlmIChjYXBfY2hlY2tfd2lmaShwTXNnKSAhPSAwKSB7DQogCQl3Zl9sb2cgKCJ3aWZpIGRldiBpbml0IGZhaWwgb3IgbWFjIGludmFsaWQhIik7DQogCQlyZXR1cm4gLTE7DQogCX0NCkBAIC0yMTA0LDIzICsyMjI3LDI0IEBACiAJc3RhX21hbmFnZXItPmluaXQoc3RhX21hbmFnZXIpOw0KICNlbmRpZg0KIA0KKw0KKyNpZiAhKGRlZmluZWQoVVNFX0NBUF9TVVBQT1JUKSkJDQogCWlmIChjaGVja193bGFuKCkgPT0gLTEpIHsNCiAJCXdmX2xvZyAoIiB3bGFuMCBpbnRlcmZhY2UgaXMgbm90IGV4aXN0ICxwbGVhc2UgY29udGFjdCB3bGFuIGRyaXZlciBlbmdpbmVlciIpOw0KIAkJc2NfY2ZnX3NldCgid2lmaV9jaGlwIiwgIjAiKTsNCi0JI2lmICEoZGVmaW5lZChVU0VfQ0FQX1NVUFBPUlQpKQkNCiAJCXNjX2NmZ19zYXZlKCk7DQotCSNlbmRpZg0KLQkNCiAJCXJldHVybiAtMTsNCiAJfQ0KIA0KICNpZiBkZWZpbmVkKENPTkZJR19XSUZJX0VGVVNFX01BQykKIAl3aWZpX2Z3X21hY19jb25maWdfc3NpZChhcF9zZXJ2ZXIpOw0KICNlbmRpZg0KKyNlbmRpZgogDQorI2lmICEoZGVmaW5lZChVU0VfQ0FQX1NVUFBPUlQpKQkNCiAJd2ZfbG9nICgid2lmaWNoaXAgZXhpc3QsIHNldCAgbnYgdG8gdGVsbCBtbWkiKTsNCiAJc2NfY2ZnX3NldCgid2lmaV9jaGlwIiwgIjEiKTsNCi0JDQorI2VuZGlmCQ0KIA0KIA0KIAkjaWZkZWYgIF9fU1RBX0ZVTkNfXw0KQEAgLTIxNDcsOSArMjI3MSw5IEBACiAJCXN0YV9tYW5hZ2VyLT5kcnZfcHJveHkuZHJ2X2RlaW5pdCgmc3RhX21hbmFnZXItPmRydl9wcm94eSk7DQogI2VuZGlmDQogI2lmIGRlZmluZWQoVVNFX0NBUF9TVVBQT1JUKQ0KLQkJd2ZfbG9nICgiaGFzIGNhcCB0byBybW1vZCIpOw0KLQkJc3RhX21hbmFnZXItPmRydl9wcm94eS5kcnZfZGVpbml0KCZzdGFfbWFuYWdlci0+ZHJ2X3Byb3h5KTsNCi0JCWFwX3NlcnZlci0+ZHJ2X3Byb3h5LmRydl9kZWluaXQoJmFwX3NlcnZlci0+ZHJ2X3Byb3h5KTsNCisJCS8vd2ZfbG9nICgiaGFzIGNhcCB0byBybW1vZCIpOw0KKwkJLy9zdGFfbWFuYWdlci0+ZHJ2X3Byb3h5LmRydl9kZWluaXQoJnN0YV9tYW5hZ2VyLT5kcnZfcHJveHkpOw0KKwkJLy9hcF9zZXJ2ZXItPmRydl9wcm94eS5kcnZfZGVpbml0KCZhcF9zZXJ2ZXItPmRydl9wcm94eSk7DQogI2VuZGlmCQkNCiAJfQ0KIA0KZGlmZiAtLWdpdCBhL2FwL2FwcC96dGVfbWRsL01ha2VmaWxlIGIvYXAvYXBwL3p0ZV9tZGwvTWFrZWZpbGUKaW5kZXggYzdhMWVhYy4uOGNmZDljYSAxMDA3NTUKLS0tIGEvYXAvYXBwL3p0ZV9tZGwvTWFrZWZpbGUKKysrIGIvYXAvYXBwL3p0ZV9tZGwvTWFrZWZpbGUKQEAgLTU0LDcgKzU0LDEyIEBACiAjdG9vbHNfZGlyICs9DQogZWxzZSBpZmVxICgkKENPTkZJR19XSUZJX01PRFVMRSksYWljODgwMCkNCiBDRkxBR1MJICs9IC1EX19BSUNfODgwMERXX0NISVBfXw0KK2lmZXEgKCQoQ09ORklHX1dJRklfU1VCX01PRFVMRSksIGQ4MCkNCit0b29sc19kaXIgKz0gLi4venRlX2NvbW0vd2xhbi9haWNfdG9vbHMvYWljcmZfdGVzdF9kODANCitDRkxBR1MJICs9IC1EX19BSUNfODgwMF9EODBMX18NCitlbHNlDQogdG9vbHNfZGlyICs9IC4uL3p0ZV9jb21tL3dsYW4vYWljX3Rvb2xzL3JmdGVzdA0KK2VuZGlmDQogaWZlcSAoJChDT05GSUdfV0lGSV9TSU5HTEVBUCksIG5vKQ0KIENGTEFHUyAgKz0gIC1EX19NVUxUSV9BUF9fDQogZW5kaWYNCkBAIC0yNDYsNiArMjUxLDEwIEBACiBMRExJQlMgKz0gLWxmbGFncyAgLUwkKHp0ZV9saWJfcGF0aCkvbGliZmxhZ3MNCiBlbmRpZg0KIA0KK2lmZXEgKCQoVVNFX1pYSUNfREVCVUdfSU5GTykseWVzKQ0KK0xETElCUyArPSAtbGRlYnVnX2luZm8gLUwkKHp0ZV9saWJfcGF0aCkvbGliZGVidWdfaW5mbw0KK2VuZGlmDQorDQogIyMjIyMjIyMjIyMjIyNVU0VSIENPTUlaRSBFTkQjIyMjIyMjIyMjIyMjIyMjIyMNCiANCiBhbGw6ICQoRVhFQykgJChFWEVDMSkgJChFWEVDMikNCmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9hcmNoL2FybS9tYWNoLXp4Mjk3NTIwdjMvcHdyX2N0cmwuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2FyY2gvYXJtL21hY2gtengyOTc1MjB2My9wd3JfY3RybC5jCmluZGV4IGE1ZDI3ZjQuLmE1NzAwMmEgMTAwNzU1Ci0tLSBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2FyY2gvYXJtL21hY2gtengyOTc1MjB2My9wd3JfY3RybC5jCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2FyY2gvYXJtL21hY2gtengyOTc1MjB2My9wd3JfY3RybC5jCkBAIC0zNiw2ICszNiw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHdyX2J1Y2szdjNfaW5pdF9mbGFnCT0gMDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHdyX2J1Y2szdjNfc3RhdHVzICAJCT0gMDsKK2V4dGVybiB2b2lkIHNkX2lvX2NvbmZpZyh1MzIgc2RfaW5kZXgsYm9vbCBhY3RpdmVfZmxhZyk7CiAKIHZvaWQgcHdyX2J1Y2szdjNfaW5pdCh2b2lkKQogewpAQCAtMjY0LDYgKzI2NSw4IEBACiAJaW50IHJldCA9IDA7CiAJaWYoYnZhbCkJCiAJewkKKwkJaWYgKGdldF93aWZpX2VuYWJsZSgpID09IDEpCisJCQlzZF9pb19jb25maWcoMCwgMSk7CiAjaWZkZWYgQ09ORklHX0FJQzg4MDBfTUlGSV9FTgogCSAgIHJldD1ncGlvX3JlcXVlc3QoWlgyOV9HUElPXzg1LCJhaWNfbWlmaV9lbiIpOwogCSAgIGlmKHJldCl7CkBAIC0zMTcsNiArMzIwLDggQEAKIAl9CQogCWVsc2UJCiAJewkKKwkJaWYgKGdldF93aWZpX2VuYWJsZSgpID09IDEpCisJCQlzZF9pb19jb25maWcoMCwgMCk7CiAjaWZkZWYgQ09ORklHX0FJQzg4MDBfTUlGSV9FTgogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoWlgyOV9HUElPXzg1LCAwKTsJCiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChaWDI5X0dQSU9fMTMwLCAwKTsKQEAgLTM0MSw2ICszNDYsOCBAQAogCWludCByZXQgPSAwOwogCWlmKGJ2YWwpCQogCXsJCisJCWlmIChnZXRfd2lmaV9lbmFibGUoKSA9PSAxKQorCQkJc2RfaW9fY29uZmlnKDAsIDApOwogI2lmZGVmIENPTkZJR19BSUM4ODAwX01JRklfRU4KIAkgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoWlgyOV9HUElPXzg1LCAwKTsKIAkgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoWlgyOV9HUElPXzEzMCwgMCk7CkBAIC0zNTcsNyArMzY0LDkgQEAKIAkgICBwcmludGsoInFxcSBhaWMgZGlzIHN1Y2MuXG4iKTsKIAl9CQogCWVsc2UJCi0JewkKKwl7CQkKKwkJaWYgKGdldF93aWZpX2VuYWJsZSgpID09IDEpCisJCQlzZF9pb19jb25maWcoMCwgMSk7CiAjaWZkZWYgQ09ORklHX0FJQzg4MDBfTUlGSV9FTgogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoWlgyOV9HUElPXzg1LCAxKTsKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFpYMjlfR1BJT18xMzAsIDEpOwpAQCAtMzgxLDYgKzM5MCw4IEBACiAJaW50IHJldCA9IDA7CiAJaWYoYnZhbCkJCiAJewkKKwkJaWYgKGdldF93aWZpX2VuYWJsZSgpID09IDEpCisJCQlzZF9pb19jb25maWcoMCwgMSk7CiAjaWZkZWYgQ09ORklHX0FJQzg4MDBfTUlGSV9FTgogCSAgIGdwaW9fZGlyZWN0aW9uX291dHB1dChaWDI5X0dQSU9fODUsIDEpOwogCSAgIGdwaW9fZGlyZWN0aW9uX291dHB1dChaWDI5X0dQSU9fMTMwLCAxKTsKQEAgLTM5OCw2ICs0MDksOCBAQAogCX0JCiAJZWxzZQkKIAl7CQorCQlpZiAoZ2V0X3dpZmlfZW5hYmxlKCkgPT0gMSkKKwkJCXNkX2lvX2NvbmZpZygwLCAwKTsKICNpZmRlZiBDT05GSUdfQUlDODgwMF9NSUZJX0VOCiAJICAgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFpYMjlfR1BJT184NSwgMCk7CiAJICAgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFpYMjlfR1BJT18xMzAsIDApOwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9tbWMvaG9zdC96eDI5X21tYy1wbHRmbS5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9tbWMvaG9zdC96eDI5X21tYy1wbHRmbS5jCmluZGV4IDExMDBkODguLjc2YjliZmIgMTAwNzU1Ci0tLSBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbW1jL2hvc3QvengyOV9tbWMtcGx0Zm0uYworKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL21tYy9ob3N0L3p4MjlfbW1jLXBsdGZtLmMKQEAgLTQwLDE1ICs0MCwzNiBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotLy96dy53YW5nIFRoZSBzZGlvMCBwaW4gaXMgY29uZmlndXJlZCBpbiBncGlvIG1vZGUgYmVmb3JlIGFuZCBhZnRlciB3aWZpIHVuaW5zdGFsbGF0aW9uIG9uIDIwMjQwNTIxIG9uIHN0YXJ0Ci1zdGF0aWMgc3RydWN0IGR3X21jaSAqZHdfbWNpX2hvc3RfcHRyWzJdOwotdm9sYXRpbGUgdTggbW1jMF9kYXRhMV9mbGFnID0gMHhmZjsKLS8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBlbmQKLQogLy95b3VjaGVuQDIwMjQtMDYtMjAgYWRkIGZvciBseW5xIG52IGNvbmZpZyBiZWdpbgogI2luY2x1ZGUgPGx5bnEvbHlucV9hcF9udl9jZmcuaD4KIC8veW91Y2hlbkAyMDI0LTA2LTIwIGFkZCBmb3IgbHlucSBudiBjb25maWcgZW5kCiAKKy8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBzdGFydAorc3RydWN0IGR3X21jaSAqZHdfbWNpX2hvc3RfcHRyWzJdOwordm9sYXRpbGUgdTggbW1jMF9kYXRhMV9mbGFnID0gMHhmZjsKKy8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBlbmQKKyNkZWZpbmUgQ09ORklHX0dQSU9fRlVOQyhwaW4sIGNvbmZpZywgcGRfcHUpIFwKK2RvIHsgXAorICAgIHJjID0gengyOV9ncGlvX2NvbmZpZyhwaW4sIGNvbmZpZyk7IFwKKyAgICBpZiAocmMpIHsgXAorICAgICAgICBwcmludGsoIm1tYyBncGlvIiAjcGluICIgY29uZmlnIGVyciAhcmMgPSAlZFxuIiwgIHJjKTsgXAorICAgIH0gXCAgICAKKyAgICB6eDI5X2dwaW9fcGRfcHVfc2V0KHBpbiwgcGRfcHUpOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQ09ORklHX0dQSU9fR1BJTyhwaW4sIGNvbmZpZywgcGRfcHUpIFwKKwlkbyB7IFwKKwkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKHBpbiwgY29uZmlnKTsgXAorCQlpZiAocmMpIHsgXAorCQkJcHJpbnRrKCJtbWMgZ3BpbyIgI3BpbiAiIGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsICByYyk7IFwKKwkJfSBcCisJCXp4MjlfZ3Bpb19zZXRfZGlyZWN0aW9uKHBpbiwgR1BJT19JTik7XAorCQl6eDI5X2dwaW9fcGRfcHVfc2V0KHBpbiwgcGRfcHUpOyBcCisJfSB3aGlsZSAoMCkKKworLyogRW5kZWQgYnkgQUlDb2RlciwgcGlkOnU2Yzk1ZmUxMmFkNTY0MzE0ZTFhMDgxY2IwMjg2MzE2Y2FhNzczMzAgKi8KKwogc3RhdGljIHZvaWQgZHdfbWNpX3JvY2tjaGlwX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgZHdfbWNpICpob3N0LCB1MzIgKmNtZHIpCiB7CiAJKmNtZHIgfD0gU0RNTUNfQ01EX1VTRV9IT0xEX1JFRzsKQEAgLTEzNywxNjIgKzE1OCw3MSBAQAogREVWSUNFX0FUVFIoZHdfcmVndmFsdWUsIFNfSVJVR08gfCBTX0lXVVNSLCBkd19yZWd2YWx1ZV9zaG93LCBkd19yZWd2YWx1ZV9zdG9yZSk7CiAKIC8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBzdGFydAotaW50IHNkX2lvX2NvbmZpZyh1MzIgc2RfaW5kZXgsIGJvb2wgYWN0aXZlX2ZsYWcpCit2b2lkIHNkX2lvX2NvbmZpZyh1MzIgc2RfaW5kZXgsYm9vbCBhY3RpdmVfZmxhZykKIHsKIAlpbnQgcmMgPSAwOworCiAJc3RydWN0IGR3X21jaV9ib2FyZCAqYnJkOwotCWlmKGR3X21jaV9ob3N0X3B0cltzZF9pbmRleF0gPT0gTlVMTCl7Ci0JCXByaW50aygiJXMgbW1jJWQgbm90IHVzZWQgb3IgZmFpbGVkXG4iLF9fZnVuY19fLHNkX2luZGV4KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWJyZCA9IGR3X21jaV9ob3N0X3B0cltzZF9pbmRleF0tPnBkYXRhOwotCWlmIChhY3RpdmVfZmxhZykKLQl7Ci0JCWlmIChzZF9pbmRleCA9PSAwKQotCQl7Ci0JCQlpZiAoZHdfbWNpX2hvc3RfcHRyW3NkX2luZGV4XS0+cXVpcmtzICYgRFdfTUNJX1FVSVJLX1NESU8pCi0JCQl7Ci0JCQkJaWYgKG1tYzBfZGF0YTFfZmxhZyAhPSAweDEpCi0JCQkJewotCQkJCQlpcnFfc2V0X2lycV93YWtlKGJyZC0+ZGF0YTFfaXJxLCAxKTsKLQkJCQkJbW1jMF9kYXRhMV9mbGFnID0gMHgxOwotCQkJCX0KKworCisJaWYoKGR3X21jaV9ob3N0X3B0cltzZF9pbmRleF0gIT0gTlVMTCkmJihzZF9pbmRleCA9PSAwKSl7CisJCWJyZD0gZHdfbWNpX2hvc3RfcHRyW3NkX2luZGV4XS0+cGRhdGE7CisKKwkJaWYgKGR3X21jaV9ob3N0X3B0cltzZF9pbmRleF0tPnF1aXJrcyAmIERXX01DSV9RVUlSS19TRElPKSB7CisJCQkKKwkJCWlmKG1tYzBfZGF0YTFfZmxhZyAhPSBhY3RpdmVfZmxhZyl7CisJCQkJCisJCQkJaXJxX3NldF9pcnFfd2FrZShicmQtPmRhdGExX2lycSxhY3RpdmVfZmxhZyk7CisJCQkJbW1jMF9kYXRhMV9mbGFnID0gYWN0aXZlX2ZsYWc7CiAJCQl9Ci0JCQlyYyA9IHp4MjlfZ3Bpb19jb25maWcoWlgyOV9HUElPXzY2LCBHUElPNjZfRU1NQ19DTEspOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzY2IGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT182NiwgSU9fQ0ZHX1BVTExfRE9XTik7Ci0JCQlyYyA9IHp4MjlfZ3Bpb19jb25maWcoWlgyOV9HUElPXzY3LCBHUElPNjdfRU1NQ19DTUQpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzY3IGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT182NywgSU9fQ0ZHX1BVTExfVVApOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT182OCwgR1BJTzY4X0VNTUNfREFUQTApOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzY4IGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT182OCwgSU9fQ0ZHX1BVTExfVVApOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT182OSwgR1BJTzY5X0VNTUNfREFUQTEpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzY5IGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT182OSwgSU9fQ0ZHX1BVTExfVVApOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT183MCwgR1BJTzcwX0VNTUNfREFUQTIpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzcwIGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT183MCwgSU9fQ0ZHX1BVTExfVVApOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT183MSwgR1BJTzcxX0VNTUNfREFUQTMpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzcxIGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT183MSwgSU9fQ0ZHX1BVTExfVVApOwogCQl9Ci0JCWVsc2UgaWYgKHNkX2luZGV4ID09IDEpCi0JCXsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNzIsIEdQSU83Ml9TRDFfSE9TVF9TRENMSyk7Ci0JCQlpZiAocmMpCi0JCQkJcHJpbnRrKCIlcyBncGlvNzIgY29uZmlnIGVyciAhcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXp4MjlfZ3Bpb19wZF9wdV9zZXQoWlgyOV9HUElPXzcyLCBJT19DRkdfUFVMTF9ESVNBQkxFKTsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNzMsIEdQSU83M19TRDFfQ01EKTsKLQkJCWlmIChyYykKLQkJCQlwcmludGsoIiVzIGdwaW83MyBjb25maWcgZXJyICFyYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJengyOV9ncGlvX3BkX3B1X3NldChaWDI5X0dQSU9fNzMsIElPX0NGR19QVUxMX1VQKTsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNzQsIEdQSU83NF9TRDFfREFUQTApOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3Bpbzc0IGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT183NCwgSU9fQ0ZHX1BVTExfVVApOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT183NSwgR1BJTzc1X1NEMV9EQVRBMSk7Ci0JCQlpZiAocmMpCi0JCQkJcHJpbnRrKCIlcyBncGlvNzUgY29uZmlnIGVyciAhcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXp4MjlfZ3Bpb19wZF9wdV9zZXQoWlgyOV9HUElPXzc1LCBJT19DRkdfUFVMTF9VUCk7Ci0JCQlyYyA9IHp4MjlfZ3Bpb19jb25maWcoWlgyOV9HUElPXzc2LCBHUElPNzZfU0QxX0RBVEEyKTsKLQkJCWlmIChyYykKLQkJCQlwcmludGsoIiVzIGdwaW83NiBjb25maWcgZXJyICFyYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJengyOV9ncGlvX3BkX3B1X3NldChaWDI5X0dQSU9fNzYsIElPX0NGR19QVUxMX1VQKTsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNzcsIEdQSU83N19TRDFfREFUQTMpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3Bpbzc3IGNvbmZpZyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT183NywgSU9fQ0ZHX1BVTExfVVApOworCX0KKwlwcmludGsoIiVzLCBzZXQgYWN0aXZlX2ZsYWc9JWRcbiIsIF9fZnVuY19fLGFjdGl2ZV9mbGFnKTsKKwkKKwlpZihhY3RpdmVfZmxhZyl7CisJCWlmKHNkX2luZGV4ID09IDApIHsKKworCQkJQ09ORklHX0dQSU9fRlVOQyhaWDI5X0dQSU9fNjYsIEdQSU82Nl9FTU1DX0NMSywgSU9fQ0ZHX1BVTExfRE9XTik7CQkJCisJCQlDT05GSUdfR1BJT19GVU5DKFpYMjlfR1BJT182NywgR1BJTzY3X0VNTUNfQ01ELCBJT19DRkdfUFVMTF9VUCk7CQkKKwkJCUNPTkZJR19HUElPX0ZVTkMoWlgyOV9HUElPXzY4LCBHUElPNjhfRU1NQ19EQVRBMCwgSU9fQ0ZHX1BVTExfVVApOwkJCQorCQkJQ09ORklHX0dQSU9fRlVOQyhaWDI5X0dQSU9fNjksIEdQSU82OV9FTU1DX0RBVEExLCBJT19DRkdfUFVMTF9VUCk7CQkJCisJCQlDT05GSUdfR1BJT19GVU5DKFpYMjlfR1BJT183MCwgR1BJTzcwX0VNTUNfREFUQTIsIElPX0NGR19QVUxMX1VQKTsgCQkJCQkKKwkJCUNPTkZJR19HUElPX0ZVTkMoWlgyOV9HUElPXzcxLCBHUElPNzFfRU1NQ19EQVRBMywgSU9fQ0ZHX1BVTExfVVApOyAKKwkJfQorCQllbHNlIGlmKHNkX2luZGV4ID09IDEpIHsKKwkJCUNPTkZJR19HUElPX0ZVTkMoWlgyOV9HUElPXzcyLCBHUElPNzJfU0QxX0hPU1RfU0RDTEssIElPX0NGR19QVUxMX0RPV04pOwkJCQorCQkJQ09ORklHX0dQSU9fRlVOQyhaWDI5X0dQSU9fNzMsIEdQSU83M19TRDFfQ01ELCBJT19DRkdfUFVMTF9VUCk7CQkJCisJCQlDT05GSUdfR1BJT19GVU5DKFpYMjlfR1BJT183NCwgR1BJTzc0X1NEMV9EQVRBMCwgSU9fQ0ZHX1BVTExfVVApOwkJCQorCQkJQ09ORklHX0dQSU9fRlVOQyhaWDI5X0dQSU9fNzUsIEdQSU83NV9TRDFfREFUQTEsIElPX0NGR19QVUxMX1VQKTsKKwkJCUNPTkZJR19HUElPX0ZVTkMoWlgyOV9HUElPXzc2LCBHUElPNzZfU0QxX0RBVEEyLCBJT19DRkdfUFVMTF9VUCk7CQkKKwkJCUNPTkZJR19HUElPX0ZVTkMoWlgyOV9HUElPXzc3LCBHUElPNzdfU0QxX0RBVEEzLCBJT19DRkdfUFVMTF9VUCk7CQkJCiAJCX0KIAkJZWxzZQotCQkJcHJpbnRrKCIlcyBpbmRleCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHNkX2luZGV4KTsKKwkJCXByaW50aygiJXMgaW5kZXggZXJyb3IgJWRcbiIsX19mdW5jX18sc2RfaW5kZXgpOwogCX0KLQllbHNlCi0JewotCQlpZiAoc2RfaW5kZXggPT0gMCkKLQkJewotCQkJaWYgKGR3X21jaV9ob3N0X3B0cltzZF9pbmRleF0tPnF1aXJrcyAmIERXX01DSV9RVUlSS19TRElPKQotCQkJewotCQkJCWlmIChtbWMwX2RhdGExX2ZsYWcgIT0gMHgwKQotCQkJCXsKLQkJCQkJaXJxX3NldF9pcnFfd2FrZShicmQtPmRhdGExX2lycSwgMCk7Ci0JCQkJCW1tYzBfZGF0YTFfZmxhZyA9IDB4MDsKLQkJCQl9Ci0JCQl9Ci0JCQlyYyA9IHp4MjlfZ3Bpb19jb25maWcoWlgyOV9HUElPXzY2LCBHUElPNjZfR1BJTzY2KTsKLQkJCWlmIChyYykKLQkJCQlwcmludGsoIiVzIGdwaW82NiBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fc2V0X2RpcmVjdGlvbihaWDI5X0dQSU9fNjYsIEdQSU9fSU4pOwotCQkJengyOV9ncGlvX3BkX3B1X3NldChaWDI5X0dQSU9fNjYsIElPX0NGR19QVUxMX0RPV04pOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT182NywgR1BJTzY3X0dQSU82Nyk7Ci0JCQlpZiAocmMpCi0JCQkJcHJpbnRrKCIlcyBncGlvNjcgZXJyICFyYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJengyOV9ncGlvX3NldF9kaXJlY3Rpb24oWlgyOV9HUElPXzY3LCBHUElPX0lOKTsKLQkJCXp4MjlfZ3Bpb19wZF9wdV9zZXQoWlgyOV9HUElPXzY3LCBJT19DRkdfUFVMTF9ET1dOKTsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNjgsIEdQSU82OF9HUElPNjgpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzY4IGVyciAhcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXp4MjlfZ3Bpb19zZXRfZGlyZWN0aW9uKFpYMjlfR1BJT182OCwgR1BJT19JTik7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT182OCwgSU9fQ0ZHX1BVTExfRE9XTik7Ci0JCQlyYyA9IHp4MjlfZ3Bpb19jb25maWcoWlgyOV9HUElPXzY5LCBHUElPNjlfR1BJTzY5KTsKLQkJCWlmIChyYykKLQkJCQlwcmludGsoIiVzIGdwaW82OSBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fc2V0X2RpcmVjdGlvbihaWDI5X0dQSU9fNjksIEdQSU9fSU4pOwotCQkJengyOV9ncGlvX3BkX3B1X3NldChaWDI5X0dQSU9fNjksIElPX0NGR19QVUxMX0RPV04pOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT183MCwgR1BJTzcwX0dQSU83MCk7Ci0JCQlpZiAocmMpCi0JCQkJcHJpbnRrKCIlcyBncGlvNzAgZXJyICFyYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJengyOV9ncGlvX3NldF9kaXJlY3Rpb24oWlgyOV9HUElPXzcwLCBHUElPX0lOKTsKLQkJCXp4MjlfZ3Bpb19wZF9wdV9zZXQoWlgyOV9HUElPXzcwLCBJT19DRkdfUFVMTF9ET1dOKTsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNzEsIEdQSU83MV9HUElPNzEpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzcxIGVyciAhcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXp4MjlfZ3Bpb19zZXRfZGlyZWN0aW9uKFpYMjlfR1BJT183MSwgR1BJT19JTik7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT183MSwgSU9fQ0ZHX1BVTExfRE9XTik7CisJZWxzZXsKKwkJaWYoc2RfaW5kZXggPT0gMCkgeworCisJCQlDT05GSUdfR1BJT19HUElPKFpYMjlfR1BJT182NiwgR1BJTzY2X0dQSU82NiwgSU9fQ0ZHX1BVTExfRE9XTik7CQkKKwkJCUNPTkZJR19HUElPX0dQSU8oWlgyOV9HUElPXzY3LCBHUElPNjdfR1BJTzY3LCBJT19DRkdfUFVMTF9ET1dOKTsgCQkJCisJCQlDT05GSUdfR1BJT19HUElPKFpYMjlfR1BJT182OCwgR1BJTzY4X0dQSU82OCwgSU9fQ0ZHX1BVTExfRE9XTik7IAkJCQorCQkJQ09ORklHX0dQSU9fR1BJTyhaWDI5X0dQSU9fNjksIEdQSU82OV9HUElPNjksIElPX0NGR19QVUxMX0RPV04pOyAJCQorCQkJQ09ORklHX0dQSU9fR1BJTyhaWDI5X0dQSU9fNzAsIEdQSU83MF9HUElPNzAsIElPX0NGR19QVUxMX0RPV04pOyAJCQkKKwkJCUNPTkZJR19HUElPX0dQSU8oWlgyOV9HUElPXzcxLCBHUElPNzFfR1BJTzcxLCBJT19DRkdfUFVMTF9ET1dOKTsgCiAJCX0KLQkJZWxzZSBpZiAoc2RfaW5kZXggPT0gMSkKLQkJewotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT183MiwgR1BJTzcyX0dQSU83Mik7Ci0JCQlpZiAocmMpCi0JCQkJcHJpbnRrKCIlcyBncGlvNzIgZXJyICFyYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJengyOV9ncGlvX3NldF9kaXJlY3Rpb24oWlgyOV9HUElPXzcyLCBHUElPX0lOKTsKLQkJCXp4MjlfZ3Bpb19wZF9wdV9zZXQoWlgyOV9HUElPXzcyLCBJT19DRkdfUFVMTF9ET1dOKTsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNzMsIEdQSU83M19HUElPNzMpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3BpbzczIGVyciAhcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXp4MjlfZ3Bpb19zZXRfZGlyZWN0aW9uKFpYMjlfR1BJT183MywgR1BJT19JTik7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT183MywgSU9fQ0ZHX1BVTExfRE9XTik7Ci0JCQlyYyA9IHp4MjlfZ3Bpb19jb25maWcoWlgyOV9HUElPXzc0LCBHUElPNzRfR1BJTzc0KTsKLQkJCWlmIChyYykKLQkJCQlwcmludGsoIiVzIGdwaW83NCBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fc2V0X2RpcmVjdGlvbihaWDI5X0dQSU9fNzQsIEdQSU9fSU4pOwotCQkJengyOV9ncGlvX3BkX3B1X3NldChaWDI5X0dQSU9fNzQsIElPX0NGR19QVUxMX0RPV04pOwotCQkJcmMgPSB6eDI5X2dwaW9fY29uZmlnKFpYMjlfR1BJT183NSwgR1BJTzc1X0dQSU83NSk7Ci0JCQlpZiAocmMpCi0JCQkJcHJpbnRrKCIlcyBncGlvNzUgZXJyICFyYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJengyOV9ncGlvX3NldF9kaXJlY3Rpb24oWlgyOV9HUElPXzc1LCBHUElPX0lOKTsKLQkJCXp4MjlfZ3Bpb19wZF9wdV9zZXQoWlgyOV9HUElPXzc1LCBJT19DRkdfUFVMTF9ET1dOKTsKLQkJCXJjID0gengyOV9ncGlvX2NvbmZpZyhaWDI5X0dQSU9fNzYsIEdQSU83Nl9HUElPNzYpOwotCQkJaWYgKHJjKQotCQkJCXByaW50aygiJXMgZ3Bpbzc2IGVyciAhcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXp4MjlfZ3Bpb19zZXRfZGlyZWN0aW9uKFpYMjlfR1BJT183NiwgR1BJT19JTik7Ci0JCQl6eDI5X2dwaW9fcGRfcHVfc2V0KFpYMjlfR1BJT183NiwgSU9fQ0ZHX1BVTExfRE9XTik7Ci0JCQlyYyA9IHp4MjlfZ3Bpb19jb25maWcoWlgyOV9HUElPXzc3LCBHUElPNzdfR1BJTzc3KTsKLQkJCWlmIChyYykKLQkJCQlwcmludGsoIiVzIGdwaW83NyBlcnIgIXJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQl6eDI5X2dwaW9fc2V0X2RpcmVjdGlvbihaWDI5X0dQSU9fNzcsIEdQSU9fSU4pOwotCQkJengyOV9ncGlvX3BkX3B1X3NldChaWDI5X0dQSU9fNzcsIElPX0NGR19QVUxMX0RPV04pOworCQllbHNlIGlmKHNkX2luZGV4ID09IDEpIHsKKwkJCUNPTkZJR19HUElPX0dQSU8oWlgyOV9HUElPXzcyLCBHUElPNzJfR1BJTzcyLCBJT19DRkdfUFVMTF9ET1dOKTsJCQorCQkJQ09ORklHX0dQSU9fR1BJTyhaWDI5X0dQSU9fNzMsIEdQSU83M19HUElPNzMsIElPX0NGR19QVUxMX0RPV04pOworCQkJQ09ORklHX0dQSU9fR1BJTyhaWDI5X0dQSU9fNzQsIEdQSU83NF9HUElPNzQsIElPX0NGR19QVUxMX0RPV04pOworCQkJQ09ORklHX0dQSU9fR1BJTyhaWDI5X0dQSU9fNzUsIEdQSU83NV9HUElPNzUsIElPX0NGR19QVUxMX0RPV04pOyAJCQorCQkJQ09ORklHX0dQSU9fR1BJTyhaWDI5X0dQSU9fNzYsIEdQSU83Nl9HUElPNzYsIElPX0NGR19QVUxMX0RPV04pOwkJCisJCQlDT05GSUdfR1BJT19HUElPKFpYMjlfR1BJT183NywgR1BJTzc3X0dQSU83NywgSU9fQ0ZHX1BVTExfRE9XTik7CQkJCQkKIAkJfQogCQllbHNlCi0JCQlwcmludGsoIiVzIGluZGV4IGVycm9yICVkXG4iLCBfX2Z1bmNfXywgc2RfaW5kZXgpOworCQkJcHJpbnRrKCIlcyBpbmRleCBlcnJvciAlZFxuIixfX2Z1bmNfXyxzZF9pbmRleCk7CisKIAl9Ci0JcmV0dXJuIHJjOworCiB9CiAvL3p3LndhbmcgVGhlIHNkaW8wIHBpbiBpcyBjb25maWd1cmVkIGluIGdwaW8gbW9kZSBiZWZvcmUgYW5kIGFmdGVyIHdpZmkgdW5pbnN0YWxsYXRpb24gb24gMjAyNDA1MjEgb24gZW5kCiAKQEAgLTQwMSwxNyArMzMxLDE0IEBACiAJfQogI2VuZGlmCiAvL3p3LndhbmcgVGhlIHNkaW8wIHBpbiBpcyBjb25maWd1cmVkIGluIGdwaW8gbW9kZSBiZWZvcmUgYW5kIGFmdGVyIHdpZmkgdW5pbnN0YWxsYXRpb24gb24gMjAyNDA1MjEgb24gc3RhcnQKLQlpZiAoaG9zdC0+cGRhdGEtPnF1aXJrcyAmIERXX01DSV9RVUlSS19BVVRPX0dBVEUpCi0JeworCWlmKGhvc3QtPnBkYXRhLT5xdWlya3MgJiBEV19NQ0lfUVVJUktfQVVUT19HQVRFKSB7CiAJCWludCBydiA9IGNsa19zZXRfYXV0b19nYXRlKHNkbW1jX3djbGssIHRydWUpOwogCQlpZiAocnYpCiAJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGF1dG8gZ2F0ZSBvZiBzZG1tY193Y2xrXG4iLCBfX2Z1bmNfXyk7CiAJCXJ2ID0gY2xrX3NldF9hdXRvX2dhdGUoc2RtbWNfYWNsaywgdHJ1ZSk7CiAJCWlmIChydikKIAkJCXByX2VycigiJXM6IEZhaWxlZCB0byBlbmFibGUgYXV0byBnYXRlIG9mIHNkbW1jX2FjbGtcbiIsIF9fZnVuY19fKTsKLQl9Ci0JZWxzZQotCXsKKwl9ZWxzZXsKIAkJaW50IHJ2ID0gY2xrX3NldF9hdXRvX2dhdGUoc2RtbWNfd2NsaywgZmFsc2UpOwogCQlpZiAocnYpCiAJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBhdXRvIGdhdGUgb2Ygc2RtbWNfd2Nsa1xuIiwgX19mdW5jX18pOwpAQCAtNDI0LDkgKzM1MSw5IEBACiAvL3p3LndhbmcgVGhlIHNkaW8wIHBpbiBpcyBjb25maWd1cmVkIGluIGdwaW8gbW9kZSBiZWZvcmUgYW5kIGFmdGVyIHdpZmkgdW5pbnN0YWxsYXRpb24gb24gMjAyNDA1MjEgb24gZW5kCiAjaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9aWDI5NzUyMFYzCiAJaWYoaG9zdC0+aG9zdF9pZCA9PSAwKSB7Ci0vL3p3LndhbmcgVGhlIHNkaW8wIHBpbiBpcyBjb25maWd1cmVkIGluIGdwaW8gbW9kZSBiZWZvcmUgYW5kIGFmdGVyIHdpZmkgdW5pbnN0YWxsYXRpb24gb24gMjAyNDA1MjEgb24gc3RhcnQKLSNpZiBDT05GSUdfQUlDODgwMEQ4MEwKLQkJc2RfaW9fY29uZmlnKGhvc3QtPmhvc3RfaWQsMCk7CisJCQkKKyNpZiAoKGRlZmluZWQgQ09ORklHX0FJQzg4MDApfHwoZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpKQorCQkgc2RfaW9fY29uZmlnKGhvc3QtPmhvc3RfaWQsMCk7CiAjZWxzZQogLy96dy53YW5nIFRoZSBzZGlvMCBwaW4gaXMgY29uZmlndXJlZCBpbiBncGlvIG1vZGUgYmVmb3JlIGFuZCBhZnRlciB3aWZpIHVuaW5zdGFsbGF0aW9uIG9uIDIwMjQwNTIxIG9uIGVuZAogCQlyYz1ncGlvX3JlcXVlc3QoWlgyOV9HUElPXzY2LCJzZDBfY2xrIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL21tYy9ob3N0L3p4MjlfbW1jLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL21tYy9ob3N0L3p4MjlfbW1jLmMKaW5kZXggMGFlZDM1Yi4uYmQ5ZTllNyAxMDA3NTUKLS0tIGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9tbWMvaG9zdC96eDI5X21tYy5jCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbW1jL2hvc3QvengyOV9tbWMuYwpAQCAtMTAyLDkgKzEwMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHdfbWNpKiBkd19tbWNfaG9zdFtdID0ge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9Owogc3RhdGljIHVuc2lnbmVkIGludCBlbmFibGVfd2lmaV9pcnEgPSAwOwotLy96dy53YW5nIFRoZSBzZGlvMCBwaW4gaXMgY29uZmlndXJlZCBpbiBncGlvIG1vZGUgYmVmb3JlIGFuZCBhZnRlciB3aWZpIHVuaW5zdGFsbGF0aW9uIG9uIDIwMjQwNTIxIG9uIHN0YXJ0Ci1leHRlcm4gdm9sYXRpbGUgdTggbW1jMF9kYXRhMV9mbGFnOwotLy96dy53YW5nIFRoZSBzZGlvMCBwaW4gaXMgY29uZmlndXJlZCBpbiBncGlvIG1vZGUgYmVmb3JlIGFuZCBhZnRlciB3aWZpIHVuaW5zdGFsbGF0aW9uIG9uIDIwMjQwNTIxIG9uIGVuZAorCiAvLyNwcmFnbWEgR0NDIG9wdGltaXplKCJPMCIpCiAKIC8qIENvbW1vbiBmbGFnIGNvbWJpbmF0aW9ucyAqLwpAQCAtNDE2MiwxNiArNDE2MCw5IEBACiAKIAkvL3JldCA9IGlycV9zZXRfaXJxX3dha2UoaG9zdC0+aXJxLCAxKTsKIC8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBzdGFydAotI2lmbmRlZiBDT05GSUdfQUlDODgwMEQ4MEwKKyNpZiAhKChkZWZpbmVkIENPTkZJR19BSUM4ODAwKXx8KGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKSkKIAlpZiAoaG9zdC0+cXVpcmtzICYgRFdfTUNJX1FVSVJLX1NESU8pIHsKLQkJaXJxX3NldF9pcnFfd2FrZShicmQtPmRhdGExX2lycSwgMSk7Ci0JfQotI2Vsc2UKLQlpZiAoKGhvc3QtPnF1aXJrcyAmIERXX01DSV9RVUlSS19TRElPKSYmKG1tYzBfZGF0YTFfZmxhZyAhPTB4MCkpIHsKLQkJaWYobW1jMF9kYXRhMV9mbGFnICE9IDB4MSl7CiAJCQlpcnFfc2V0X2lycV93YWtlKGJyZC0+ZGF0YTFfaXJxLCAxKTsKLQkJCW1tYzBfZGF0YTFfZmxhZyA9IDB4MTsKLQkJfQogCX0KICNlbmRpZgogLy96dy53YW5nIFRoZSBzZGlvMCBwaW4gaXMgY29uZmlndXJlZCBpbiBncGlvIG1vZGUgYmVmb3JlIGFuZCBhZnRlciB3aWZpIHVuaW5zdGFsbGF0aW9uIG9uIDIwMjQwNTIxIG9uIGVuZApkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMC9haWM4OC1nZW5lcmljLXdsYW4uYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDAvYWljODgtZ2VuZXJpYy13bGFuLmMKaW5kZXggYTNjZDk1Yi4uMmEwZGJlZiAxMDA2NDQKLS0tIGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMC9haWM4OC1nZW5lcmljLXdsYW4uYworKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL2FpYzg4LWdlbmVyaWMtd2xhbi5jCkBAIC0yNiw2ICsyNiw3IEBACiAKIC8vZXh0ZXJuIHZvaWQgc3N2Nng1eF93aWZpX2VuYWJsZShpbnQgYnZhbCk7CiBleHRlcm4gdm9pZCBhaWM4ODAwX3dpZmlfZW5hYmxlKGludCBidmFsKTsKK2V4dGVybiB2b2lkIGFpYzg4MDBfd2lmaV9kaXNhYmxlKGludCBidmFsKTsKIGV4dGVybiBpbnQgYWljd2ZfcHJlYWxsb2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGFpY3dmX3ByZWFsbG9jX2V4aXQodm9pZCk7CiBpbnQgaW5pdFdsYW4odm9pZCkKQEAgLTMzLDYgKzM0LDcgQEAKICAgICBpbnQgcmV0PTA7CiAgICAgcHJpbnRrKEtFUk5fRVJSICJxcXEgd2xhbi5jIGluaXRXbGFuQEBAXG4iKTsKIAlhaWM4ODAwX3dpZmlfZW5hYmxlKDEpOworCWFpYzg4MDBfd2lmaV9kaXNhYmxlKDEpOwogICAgIHJldCA9IGFpY3dmX3ByZWFsbG9jX2luaXQoKTsKICAgICBpZiAocmV0KQogICAgICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMC9haWN3Zl9zZGlvLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL2FpY3dmX3NkaW8uYwppbmRleCA1ZmM2M2JkLi4xNDRhNmViIDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL2FpY3dmX3NkaW8uYworKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL2FpY3dmX3NkaW8uYwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAgICAgICAgICAgICAgICAgdXAoJnNkaW9kZXYtPnB3cmN0bF93YWtldXBfc2VtYSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZGlvX2RiZygid1xuIik7CisgICAgICAgICAgICAvL3NkaW9fZGJnKCJ3XG4iKTsKICAgICAgICAgICAgIHdoaWxlKHdyaXRlX3JldHJ5KSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gYWljd2Zfc2Rpb193cml0ZWIoc2Rpb2RldiwgU0RJT1dJRklfV0FLRVVQX1JFRywgMSk7CiAgICAgICAgICAgICAgICAgaWYgKHJldCkgewpAQCAtNjUxLDcgKzY1MSw3IEBACiAgICAgICAgICAgICAgICAgJiYgIXJ3bnhfaHctPmlzX3AycF9jb25uZWN0ZWQpIHsKICAgICAgICAgZG93bigmc2Rpb2Rldi0+cHdyY3RsX3dha2V1cF9zZW1hKTsKICAgICAgICAgaWYgKHJ3bnhfaHctPnZpZl9zdGFydGVkKSB7Ci0gICAgICAgICAgICBzZGlvX2RiZygic1xuIik7CisgICAgICAgICAgICAvL3NkaW9fZGJnKCJzXG4iKTsKICAgICAgICAgICAgIHJldCA9IGFpY3dmX3NkaW9fd3JpdGViKHNkaW9kZXYsIFNESU9XSUZJX1NMRUVQX1JFRywgMHgxMCk7CiAgICAgICAgICAgICBpZiAocmV0KQogICAgICAgICAgICAgICAgCXNkaW9fZXJyKCJXcml0ZSBzbGVlcCBmYWlsIVxuIik7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL3J3bnhfbWFpbi5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMC9yd254X21haW4uYwppbmRleCBiMGExMDE1Li44ZjQwMmRlIDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL3J3bnhfbWFpbi5jCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDAvcndueF9tYWluLmMKQEAgLTExNTksNiArMTE1OSw4IEBACiAgICAgUkRXUl9FRlVTRV9QV1JPRlNURklORSwKICAgICBSRFdSX0VGVVNFX1NESU9DRkcsCiAgICAgUkRXUl9FRlVTRV9VU0JWSURQSUQsCisgICAgU0VUX1NSUkMsCisgICAgU0VUX0ZTUywKIAogICAgICNpZmRlZiBDT05GSUdfUkZURVNUX1VTQl9CVAogICAgIEJUX0NNRF9CQVNFID0gMHgxMDAsCkBAIC0xNzEzLDYgKzE3MTUsMjYgQEAKICAgICAgICAgICAgICAgICBieXRlc193cml0dGVuID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKGFyZ3ZbMF0sICJTRVRfU1JSQyIpID09IDApIHsKKyAgICAgICAgICAgaWYgKGFyZ2MgPiAxKSB7CisgICAgICAgICAgICAgICB1OF9sIGZ1bmMgPSAodThfbCkgY29tbWFuZF9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDEwKTsKKyAgICAgICAgICAgICAgIHByaW50aygic2V0IHNycmMgJWRcclxuIiwgZnVuYyk7CisgICAgICAgICAgICAgICByd254X3NlbmRfcmZ0ZXN0X3JlcShwX3J3bnhfaHcsIFNFVF9TUlJDLCBzaXplb2YoZnVuYyksICZmdW5jLCBOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBwcmludGsoIndyb25nIGFyZ3NcbiIpOworICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChhcmd2WzBdLCAiU0VUX0ZTUyIpID09IDApIHsKKyAgICAgICAgICAgIGlmIChhcmdjID4gMSkgeworICAgICAgICAgICAgICAgIHU4X2wgZnVuYyA9ICh1OF9sKSBjb21tYW5kX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTApOworICAgICAgICAgICAgICAgIHByaW50aygic2V0IGZzczogJWRcclxuIiwgZnVuYyk7CisgICAgICAgICAgICAgICAgcndueF9zZW5kX3JmdGVzdF9yZXEocF9yd254X2h3LCBTRVRfRlNTLCBzaXplb2YoZnVuYyksICZmdW5jLCBOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJ3cm9uZyBhcmdzXG4iKTsKKyAgICAgICAgICAgICAgICBieXRlc193cml0dGVuID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSAgZWxzZSBpZiAoc3RyY2FzZWNtcChhcmd2WzBdLCAiU0VUX1RYUFdSX0xPU1MiKSA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoYXJnYyA+IDEpIHsKICAgICAgICAgICAgICAgICBzOF9sIGZ1bmMgPSAoczhfbCljb21tYW5kX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTApOwpAQCAtMzQ5NSw2ICszNTE3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKwkJCWlmIChyd254X3ZpZi0+d2Rldi5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwgcndueF92aWYtPndkZXYuaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTykgeworCQkJCWNmZzgwMjExX2RlbF9zdGEocndueF92aWYtPm5kZXYsIGN1ci0+bWFjX2FkZHIsIEdGUF9LRVJORUwpOworICAgICAgICAgICAgfQogCiAjaWZkZWYgQUlDV0ZfUlhfUkVPUkRFUgogI2lmZGVmIEFJQ1dGX1NESU9fU1VQUE9SVApkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMC9yd254X3BsYXRmb3JtLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL3J3bnhfcGxhdGZvcm0uYwppbmRleCAwNmI4NmMzLi5mNTQ0OWUyIDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL3J3bnhfcGxhdGZvcm0uYworKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL3J3bnhfcGxhdGZvcm0uYwpAQCAtMzMsNiArMzMsNyBAQAogc3RydWN0IHJ3bnhfcGxhdCAqZ19yd254X3BsYXQgPSBOVUxMOwogZXh0ZXJuIGludCB0ZXN0bW9kZTsKIAorczhfbCBsb3NzX3ZhbHVlX2dsb2JhbCA9IDA7CiBleHRlcm4gdTggY2hpcF9zdWJfaWQ7CiBleHRlcm4gdTggY2hpcF9tY3VfaWQ7CiBleHRlcm4gdTggYnRlbmFibGU7CkBAIC04OTgsOCArODk5LDEwIEBACiB2b2lkIHNldF90eHB3cl9sb3NzX29mc3QoczhfbCB2YWx1ZSkKIHsKICAgICBudnJhbV9pbmZvLnR4cHdyX2xvc3MubG9zc19lbmFibGUgPSAxOwotICAgIG52cmFtX2luZm8udHhwd3JfbG9zcy5sb3NzX3ZhbHVlID0gdmFsdWU7Ci0gICAgcHJpbnRrKCIlczp2YWx1ZTolZFxyXG4iLCAgICAgIF9fZnVuY19fLCB2YWx1ZSk7CisgICAgbnZyYW1faW5mby50eHB3cl9sb3NzLmxvc3NfdmFsdWUgPSBsb3NzX3ZhbHVlX2dsb2JhbDsKKyAgICBudnJhbV9pbmZvLnR4cHdyX2xvc3MubG9zc192YWx1ZSArPSB2YWx1ZTsKKworICAgIHByaW50aygiJXM6dmFsdWU6JWQsIGxvc3NfdmFsdWU9JWRcclxuIiwgICAgICBfX2Z1bmNfXywgdmFsdWUsIG52cmFtX2luZm8udHhwd3JfbG9zcy5sb3NzX3ZhbHVlKTsKIH0KICNpZmRlZiBDT05GSUdfU0VUX0FQX1BTCiBpbnQgZ2V0X3VzZXJjb25maWdfc2V0X2FwX3BzX2x2bChhcF9wc19jb25mX3QgKmFwX3BzX2x2bCkKQEAgLTEwNDEsNiArMTA0NCw3IEBACiAgICAgICAgIG52cmFtX2luZm8udHhwd3JfbG9zcy5sb3NzX2VuYWJsZSA9IHJ3bnhfYXRvaSh2YWx1ZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJsb3NzX3ZhbHVlIikpIHsKICAgICAgICAgbnZyYW1faW5mby50eHB3cl9sb3NzLmxvc3NfdmFsdWUgPSByd254X2F0b2kodmFsdWUpOworCWxvc3NfdmFsdWVfZ2xvYmFsID0gbnZyYW1faW5mby50eHB3cl9sb3NzLmxvc3NfdmFsdWU7CiAgICAgfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJvZnN0X2VuYWJsZSIpKSB7CiAgICAgICAgIG52cmFtX2luZm8udHhwd3Jfb2ZzdC5lbmFibGUgPSByd254X2F0b2kodmFsdWUpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAib2ZzdF9jaGFuXzFfNCIpKSB7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL3dpZmlfZGV2X2FpYzg4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwL3dpZmlfZGV2X2FpYzg4LmMKaW5kZXggZDQwZDA0YS4uOWNkYmY3YSAxMDA2NDQKLS0tIGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMC93aWZpX2Rldl9haWM4OC5jCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDAvd2lmaV9kZXZfYWljODguYwpAQCAtMTIsNiArMTIsNyBAQAogZXh0ZXJuIGludCByd254X21vZF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgcndueF9tb2RfZXhpdCh2b2lkKTsKIGV4dGVybiBpbnQgdGVzdG1vZGU7CitpbnQgYWljX3J1bm1vZGUgPSAwOwogZXh0ZXJuIHZvaWQgYWljODgwMF93aWZpX2Rpc2FibGUoaW50IGJ2YWwpOwogZXh0ZXJuIHZvaWQgYWljODgwMF93aWZpX3JlX2VuYWJsZShpbnQgYnZhbCk7CiB2b2lkIGR3X21jaV9yZXNjYW5fY2FyZCh1bnNpZ25lZCBpZCwgdW5zaWduZWQgaW5zZXJ0KTsKQEAgLTQ3LDI0ICs0OCw0MSBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFdJRklfSU9DVExfU1RPUDogeworCQlpZigoYWljX3J1bm1vZGUgPT0gV0lGSV9JT0NUTF9TVEFSVCkgfHwgKGFpY19ydW5tb2RlID09IFdJRklfSU9DVExfU1RBUlRfVEVTVE1PREUpKXsKIAkgICAgICBwcmludGsoS0VSTl9JTkZPICJAQEBleGl0IFdsYW5AQEBcbiIpOwogCQlyd254X21vZF9leGl0KCk7CiAJCWFpYzg4MDBfd2lmaV9kaXNhYmxlKDEpOwogCQl0ZXN0bW9kZSA9IDA7CisJCQlpZighcmV0KQorCQkJYWljX3J1bm1vZGUgPSBXSUZJX0lPQ1RMX1NUT1A7CisJCX1lbHNlCisJCQlwcmludGsoImFpYyB3aWZpIG5vdCBsb2FkICVkLGNhbnQgc3RvcCFcbiIsIGFpY19ydW5tb2RlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgV0lGSV9JT0NUTF9TVEFSVDogeworCQlpZighYWljX3J1bm1vZGUpewogCSAgICAgIHByaW50ayhLRVJOX0lORk8gIkBAQGluaXRXbGFuQEBAXG4iKTsKIAkJICBhaWM4ODAwX3dpZmlfcmVfZW5hYmxlKDEpOwogCQkgIGR3X21jaV9yZXNjYW5fY2FyZCgwLDEpOwogICAgICAgICAgICAgIHJldCA9IHJ3bnhfbW9kX2luaXQoKTsKKwkJCWlmKCFyZXQpCisJCQlhaWNfcnVubW9kZSA9IFdJRklfSU9DVExfU1RBUlQ7CisJCX1lbHNlCisJCQlwcmludGsoImFpYyB3aWZpIGhhcyBsb2FkZWQgJWQsY2FudCBzdGFydCBpbiBub3JtYWwhXG4iLCBhaWNfcnVubW9kZSk7CiAJCWJyZWFrOwkKIAl9CiAJCiAJY2FzZSBXSUZJX0lPQ1RMX1NUQVJUX1RFU1RNT0RFOiB7CisJCWlmKCFhaWNfcnVubW9kZSl7CiAJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQEBAaW5pdFdsYW4gVGVzdG1vZGVAQEBcbiIpOwogCQkgIAkgdGVzdG1vZGUgPSAxOworCQkJICBhaWM4ODAwX3dpZmlfcmVfZW5hYmxlKDEpOworCQkJICBkd19tY2lfcmVzY2FuX2NhcmQoMCwgMSk7CiAgICAgICAgICAgICAgcmV0ID0gcndueF9tb2RfaW5pdCgpOworCQkJICBpZighcmV0KQorCQkJICBhaWNfcnVubW9kZSA9IFdJRklfSU9DVExfU1RBUlRfVEVTVE1PREU7CisJCX1lbHNlCisJCQlwcmludGsoImFpYyB3aWZpIGhhcyBsb2FkZWQgJWQsY2FudCBzdGFydCBpbiB0ZXN0bW9kZSFcbiIsIGFpY19ydW5tb2RlKTsKIAkJYnJlYWs7CQogCX0KIApkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvTWFrZWZpbGUgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9NYWtlZmlsZQppbmRleCA0MGMxZTQzLi4xNzc1MzE0IDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9NYWtlZmlsZQorKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9NYWtlZmlsZQpAQCAtMTMwLDcgKzEzMCw3IEBACiBDT05GSUdfVVNCX0JUID15CiBDT05GSUdfTUFDX1JBTkRPTV9JRl9OT19NQUNfSU5fRUZVU0UgPz0geQogQ09ORklHX1NESU9fUFdSQ1RSTCA/PSBuCi1DT05GSUdfV1BBM19GT1JfT0xEX0tFUk5FTCA/PSBuCitDT05GSUdfV1BBM19GT1JfT0xEX0tFUk5FTCA/PSB5CiBDT05GSUdfVVNCX01TR19PVVRfRVAgPXkKIENPTkZJR19VU0JfTVNHX0lOX0VQID15CiBDT05GSUdfVVNCX1RYX0FHR1I9bgpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvYWljODgtZ2VuZXJpYy13bGFuLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9haWM4OC1nZW5lcmljLXdsYW4uYwppbmRleCA3ZjU5MmIyLi42NTdhYWZhIDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9haWM4OC1nZW5lcmljLXdsYW4uYworKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9haWM4OC1nZW5lcmljLXdsYW4uYwpAQCAtMjYsNiArMjYsNyBAQAogCiAvL2V4dGVybiB2b2lkIHNzdjZ4NXhfd2lmaV9lbmFibGUoaW50IGJ2YWwpOwogZXh0ZXJuIHZvaWQgYWljODgwMF93aWZpX2VuYWJsZShpbnQgYnZhbCk7CitleHRlcm4gdm9pZCBhaWM4ODAwX3dpZmlfZGlzYWJsZShpbnQgYnZhbCk7CiBleHRlcm4gaW50IGFpY3dmX3ByZWFsbG9jX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBhaWN3Zl9wcmVhbGxvY19leGl0KHZvaWQpOwogaW50IGluaXRXbGFuKHZvaWQpCkBAIC0zMyw2ICszNCw3IEBACiAgICAgaW50IHJldD0wOwogICAgIHByaW50ayhLRVJOX0VSUiAicXFxIHdsYW4uYyBpbml0V2xhbkBAQFxuIik7CiAJYWljODgwMF93aWZpX2VuYWJsZSgxKTsKKwlhaWM4ODAwX3dpZmlfZGlzYWJsZSgxKTsKICAgICByZXQgPSBhaWN3Zl9wcmVhbGxvY19pbml0KCk7CiAgICAgaWYgKHJldCkKICAgICAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfY21kcy5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvcndueF9jbWRzLmMKaW5kZXggZTFmYjk3Ny4uOGVkNjFjOCAxMDA3NTUKLS0tIGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvcndueF9jbWRzLmMKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvcndueF9jbWRzLmMKQEAgLTU2NCw3ICs1NjQsOCBAQAogICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKIAogICAgLy8gUldOWF9EQkcoUldOWF9GTl9FTlRSWV9TVFIpOwotICAgcHJpbnRrKCJtc2dpbmQ6ICVkLCBzej0lZFxuIiwgbXNnLT5pZCwgY21kX21nci0+cXVldWVfc3opOworICAgIGlmKCEobXNnLT5pZCA9PSA3MykgJiYgIShtc2ctPmlkID09IDc0KSkKKyAgIAkJcHJpbnRrKCJtc2dpbmQ6ICVkLCBzej0lZFxuIiwgbXNnLT5pZCwgY21kX21nci0+cXVldWVfc3opOwogI2lmZGVmIENSRUFURV9UUkFDRV9QT0lOVFMKICAgICB0cmFjZV9tc2dfcmVjdihtc2ctPmlkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvcndueF9tYWluLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9yd254X21haW4uYwppbmRleCA2YTI3MWE0Li42OTkxZGI4IDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9yd254X21haW4uYworKysgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9yd254X21haW4uYwpAQCAtNTIwLDYgKzUyMCw3IEBACiBib29sX2wgZnVuY19mbGFnID0gdHJ1ZTsKIGludCB0ZXN0bW9kZSA9IDA7CiBpbnQgYWRhcF90ZXN0ID0gMDsKK2ludCBzZWNfY2hhbl9oaWdoID0gMDsKIAogdTggY2hpcF9pZCA9IDA7CiB1OCBjaGlwX3JvbV9pZCA9IDA7CkBAIC05ODcsNiArOTg4LDcgQEAKIHsKICAgICBzdHJ1Y3QgcndueF92aWYgKnJ3bnhfdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBzdHJ1Y3QgcndueF9odyAqcndueF9odyA9IHJ3bnhfdmlmLT5yd254X2h3OworCWludCByZXQgPSAwOwogI2lmIGRlZmluZWQoQUlDV0ZfVVNCX1NVUFBPUlQpCiAgICAgc3RydWN0IGFpY3dmX2J1cyAqYnVzX2lmID0gTlVMTDsKICAgICBzdHJ1Y3QgYWljX3VzYl9kZXYgKnVzYmRldiA9IE5VTEw7CkBAIC0xMDI1LDcgKzEwMjcsMTQgQEAKICNlbHNlCiAgICAgICAgIGNmZzgwMjExX3NjYW5fZG9uZShyd254X2h3LT5zY2FuX3JlcXVlc3QsIHRydWUpOwogI2VuZGlmCisJCS8vbWFrZSBzdXJlIGNsb3NlIG9rIGluIHNjYW4gcmVxdWVzdAogICAgICAgICByd254X2h3LT5zY2FuX3JlcXVlc3QgPSBOVUxMOworCQlyZXQgPSByd254X3NlbmRfc2NhbnVfY2FuY2VsX3JlcShyd254X2h3LCBOVUxMKTsKKwkJbWRlbGF5KDM1KTsvL21ha2Ugc3VyZSBGVyB0YWtlIGVmZmVjdAorCQlpZihyZXQpeworCQkJcHJpbnRrKCJyd254X3NjYW51X2NhbmNlbCBmYWlsLlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAgICAgfQogCiAjaWYgZGVmaW5lZChBSUNXRl9VU0JfU1VQUE9SVCkKQEAgLTE3NTIsNyArMTc2MSw3IEBACiAgICAgICAgICAgICAgICAgczhfbCBmdW5jID0gKHM4X2wpY29tbWFuZF9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDEwKTsKICAgICAgICAgICAgICAgICBwcmludGsoInNldCB0eHB3ciBsb3NzOiAlZFxuIiwgZnVuYyk7CiAgICAgICAgICAgICAgICAgc2V0X3R4cHdyX2xvc3Nfb2ZzdChmdW5jKTsKLSAgICAgICAgICAgICAgICByd254X3NlbmRfdHhwd3JfbHZsX3JlcShwX3J3bnhfaHcpOworICAgICAgICAgICAgICAgIHJ3bnhfc2VuZF90eHB3cl9sdmxfdjNfcmVxKHBfcndueF9odyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHByaW50aygid3JvbmcgYXJnc1xuIik7CiAgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9IC1FSU5WQUw7CkBAIC04ODY2LDYgKzg4NzUsNyBAQAogLy9tb2R1bGVfaW5pdChyd254X21vZF9pbml0KTsKIC8vbW9kdWxlX2V4aXQocndueF9tb2RfZXhpdCk7CiAKK21vZHVsZV9wYXJhbShzZWNfY2hhbl9oaWdoLCBpbnQsIDA2NjApOwogbW9kdWxlX3BhcmFtKHRlc3Rtb2RlLCBpbnQsIDA2NjApOwogCiBNT0RVTEVfRklSTVdBUkUoUldOWF9DT05GSUdfRldfTkFNRSk7CmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9yd254X21vZF9wYXJhbXMuYyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfbW9kX3BhcmFtcy5jCmluZGV4IDdkNjY0NGYuLjhhODdhMzEgMTAwNzU1Ci0tLSBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfbW9kX3BhcmFtcy5jCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfbW9kX3BhcmFtcy5jCkBAIC04OTQsNyArODk0LDcgQEAKICNlbmRpZgogCSAgICAgICAgcndueF9ody0+dmh0X2NhcF81Ry5jYXAgJj0gfklFRUU4MDIxMV9WSFRfQ0FQX1NIT1JUX0dJXzgwOwogCSAgICB9Ci0KKwkJcndueF9ody0+dmh0X2NhcF81Ry5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfTUFYX0FfTVBEVV9MRU5HVEhfRVhQT05FTlRfTUFTSzsKIAl9IAogCXByaW50aygiJXMsIDV2aHRfY2FwYV9pbmZvPTB4JXhcbiIsIF9fZnVuY19fLCByd254X2h3LT52aHRfY2FwXzVHLmNhcCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfbXNnX3J4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9yd254X21zZ19yeC5jCmluZGV4IGVlN2IxZWUuLjhmYjQ3NWIgMTAwNzU1Ci0tLSBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfbXNnX3J4LmMKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvcndueF9tc2dfcnguYwpAQCAtNTQxLDcgKzU0MSw3IEBACiAgICAgc3RydWN0IG1tX3RyYWZmaWNfcmVxX2luZCAqaW5kID0gKHN0cnVjdCBtbV90cmFmZmljX3JlcV9pbmQgKiltc2ctPnBhcmFtOwogICAgIHN0cnVjdCByd254X3N0YSAqc3RhID0gJnJ3bnhfaHctPnN0YV90YWJsZVtpbmQtPnN0YV9pZHhdOwogCi0gICAgUldOWF9EQkcoUldOWF9GTl9FTlRSWV9TVFIpOworICAgIC8vUldOWF9EQkcoUldOWF9GTl9FTlRSWV9TVFIpOwogCiAgICAgbmV0ZGV2X2RiZyhyd254X2h3LT52aWZfdGFibGVbc3RhLT52aWZfaWR4XS0+bmRldiwKICAgICAgICAgICAgICAgICJTdGEgJWQsIGFza2VkIGZvciAlZCBwa3QiLCBzdGEtPnN0YV9pZHgsIGluZC0+cGt0X2NudCk7CkBAIC03MjAsNiArNzIwLDcgQEAKICAgICAgICAgfQogfQogI2VuZGlmCitleHRlcm4gaW50IHNlY19jaGFuX2hpZ2g7CiBzdGF0aWMgaW5saW5lIGludCByd254X3J4X3NtX2Nvbm5lY3RfaW5kKHN0cnVjdCByd254X2h3ICpyd254X2h3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcndueF9jbWQgKmNtZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlwY19lMmFfbXNnICptc2cpCkBAIC03NjMsNyArNzY0LDE3IEBACiAgICAgICAgIHN0YS0+Y2VudGVyX2ZyZXEgPSBpbmQtPmNlbnRlcl9mcmVxOwogICAgICAgICBzdGEtPmNlbnRlcl9mcmVxMSA9IGluZC0+Y2VudGVyX2ZyZXExOwogICAgICAgICBzdGEtPmNlbnRlcl9mcmVxMiA9IGluZC0+Y2VudGVyX2ZyZXEyOworCQlwcmludGsoIndpZHRoICVkIGNlbnRlcl9mcmVxICVkIGZyZXExICVkIFxuIixpbmQtPndpZHRoLGluZC0+Y2VudGVyX2ZyZXEsaW5kLT5jZW50ZXJfZnJlcTEpOworCQlpZihpbmQtPndpZHRoID4gMCl7CisJCQlpZihpbmQtPmNlbnRlcl9mcmVxIDwgaW5kLT5jZW50ZXJfZnJlcTEpCisJCQkJc2VjX2NoYW5faGlnaCA9IDE7CisJCQllbHNlCisJCQkJc2VjX2NoYW5faGlnaCA9IDA7CQkJCisJCX1lbHNlCisJCQlzZWNfY2hhbl9oaWdoID0gMjsKKwogICAgICAgICByd254X3ZpZi0+c3RhLmFwID0gc3RhOworCQlwcmludGsoImJhbmQgJWQgd2lkdGggJWQgc3RhX2lkeCVkXG4iLGluZC0+YmFuZCxpbmQtPndpZHRoLHN0YS0+c3RhX2lkeCk7CiAgICAgICAgIGNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwocndueF9ody0+d2lwaHksIGluZC0+Y2VudGVyX2ZyZXEpOwogICAgICAgICBjZmc4MDIxMV9jaGFuZGVmX2NyZWF0ZSgmY2hhbmRlZiwgY2hhbiwgTkw4MDIxMV9DSEFOX05PX0hUKTsKICAgICAgICAgaWYgKCFyd254X2h3LT5tb2RfcGFyYW1zLT5odF9vbikKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfbXNnX3R4LmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC9yd254X21zZ190eC5jCmluZGV4IGMxNzk2ZjkuLmE0Zjg3NWIgMTAwNzU1Ci0tLSBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3J3bnhfbXNnX3R4LmMKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvcndueF9tc2dfdHguYwpAQCAtMTc5MSwxNCArMTc5MSwxNSBAQAogICAgIH0KICNlbGlmIGRlZmluZWQoQ09ORklHX1ZIVF9GT1JfT0xEX0tFUk5FTCkKICAgICBpZiAoc3RhLT52aHQpIHsKLSAgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwICp2aHRfY2FwYSA9IHJ3bnhfdmh0X2NhcGE7CisgICAgICAgIC8vY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwICp2aHRfY2FwYSA9ICZyd254X2h3LT52aHRfY2FwXzJHOy8vcndueF92aHRfY2FwYTsKIAogICAgICAgICByZXEtPmZsYWdzIHw9IFNUQV9WSFRfQ0FQQTsKLSAgICAgICAgcmVxLT52aHRfY2FwLnZodF9jYXBhX2luZm8gPSBjcHVfdG9fbGUzMih2aHRfY2FwYS0+dmh0X2NhcF9pbmZvKTsKLSAgICAgICAgcmVxLT52aHRfY2FwLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNih2aHRfY2FwYS0+c3VwcF9tY3MucnhfaGlnaGVzdCk7Ci0gICAgICAgIHJlcS0+dmh0X2NhcC5yeF9tY3NfbWFwID0gY3B1X3RvX2xlMTYodmh0X2NhcGEtPnN1cHBfbWNzLnJ4X21jc19tYXApOwotICAgICAgICByZXEtPnZodF9jYXAudHhfaGlnaGVzdCA9IGNwdV90b19sZTE2KHZodF9jYXBhLT5zdXBwX21jcy50eF9oaWdoZXN0KTsKLSAgICAgICAgcmVxLT52aHRfY2FwLnR4X21jc19tYXAgPSBjcHVfdG9fbGUxNih2aHRfY2FwYS0+c3VwcF9tY3MudHhfbWNzX21hcCk7CisgICAgICAgIHJlcS0+dmh0X2NhcC52aHRfY2FwYV9pbmZvID0gcndueF92aHRfY2FwYS0+Y2FwOworCQlwcmludGsoInZodF9jYXAudmh0X2NhcGFfaW5mbyAleCByd254X3ZodF9jYXBhIGNhcCAleCBcbiIscmVxLT52aHRfY2FwLnZodF9jYXBhX2luZm8scndueF92aHRfY2FwYS0+Y2FwKTsKKyAgICAgICAgcmVxLT52aHRfY2FwLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNihyd254X3ZodF9jYXBhLT52aHRfbWNzLnJ4X2hpZ2hlc3QpOworICAgICAgICByZXEtPnZodF9jYXAucnhfbWNzX21hcCA9IGNwdV90b19sZTE2KHJ3bnhfdmh0X2NhcGEtPnZodF9tY3MucnhfbWNzX21hcCk7CisgICAgICAgIHJlcS0+dmh0X2NhcC50eF9oaWdoZXN0ID0gY3B1X3RvX2xlMTYocndueF92aHRfY2FwYS0+dmh0X21jcy50eF9oaWdoZXN0KTsKKyAgICAgICAgcmVxLT52aHRfY2FwLnR4X21jc19tYXAgPSBjcHVfdG9fbGUxNihyd254X3ZodF9jYXBhLT52aHRfbWNzLnR4X21jc19tYXApOwogICAgIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC93aWZpX2Rldl9haWM4OC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWljODgwMGQ4MGwvd2lmaV9kZXZfYWljODguYwppbmRleCAxOGIzYTljLi4yY2Y0MDY1IDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9kcml2ZXJzL25ldC93aXJlbGVzcy9haWM4ODAwZDgwbC93aWZpX2Rldl9haWM4OC5jCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpYzg4MDBkODBsL3dpZmlfZGV2X2FpYzg4LmMKQEAgLTE1LDExICsxNSw5IEBACiBleHRlcm4gaW50IHJ3bnhfbW9kX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCByd254X21vZF9leGl0KHZvaWQpOwogZXh0ZXJuIGludCB0ZXN0bW9kZTsKK2ludCBhaWNfcnVubW9kZSA9IDA7CiBleHRlcm4gdm9pZCBhaWM4ODAwX3dpZmlfZGlzYWJsZShpbnQgYnZhbCk7CiBleHRlcm4gdm9pZCBhaWM4ODAwX3dpZmlfcmVfZW5hYmxlKGludCBidmFsKTsKLS8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBzdGFydAotZXh0ZXJuIGludCBzZF9pb19jb25maWcodTMyIHNkX2luZGV4LCBib29sIGFjdGl2ZV9mbGFnKTsKLS8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBlbmQKIHZvaWQgZHdfbWNpX3Jlc2Nhbl9jYXJkKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBpbnNlcnQpOwogc3RydWN0IHdpZmlfZGV2IHsKIAl1aW50MzJfdCBkZXZfc3RhdGU7CkBAIC01Niw0NCArNTQsNTAgQEAKIAkvL3p3LndhbmcgVGhlIFdpRmktcmVsYXRlZCBjb250cm9sIHBpbnMgZ3BpbzEzMiBhbmQgZ3BpbzkxIGFyZSBzdGlsbCBhZmZlY3RlZCBhZnRlciB0aGUgdWJvb3QgcmVtb3ZlcyBtbWMwIG9uIDIwMjQwNTMxIG9uIGVuZAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBXSUZJX0lPQ1RMX1NUT1A6IHsKKwkJaWYoKGFpY19ydW5tb2RlID09IFdJRklfSU9DVExfU1RBUlQpIHx8IChhaWNfcnVubW9kZSA9PSBXSUZJX0lPQ1RMX1NUQVJUX1RFU1RNT0RFKSl7CiAJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQEBAZXhpdCBXbGFuQEBAXG4iKTsKIAkJcndueF9tb2RfZXhpdCgpOwogCQlhaWM4ODAwX3dpZmlfZGlzYWJsZSgxKTsKLQkJLy96dy53YW5nIFRoZSBzZGlvMCBwaW4gaXMgY29uZmlndXJlZCBpbiBncGlvIG1vZGUgYmVmb3JlIGFuZCBhZnRlciB3aWZpIHVuaW5zdGFsbGF0aW9uIG9uIDIwMjQwNTIxIG9uIHN0YXJ0Ci0JCXJldCA9IHNkX2lvX2NvbmZpZygwLCAwKTsKLQkJaWYocmV0KQotCQkJcHJpbnRrKEtFUk5fRVJSICJzZF9pb19jb25maWcgZnVuYyBmYWlsLCBmbGFnID0gJWQgcmV0ID0gJWRcbiIsMCxyZXQpOwotCQkvL3p3LndhbmcgVGhlIHNkaW8wIHBpbiBpcyBjb25maWd1cmVkIGluIGdwaW8gbW9kZSBiZWZvcmUgYW5kIGFmdGVyIHdpZmkgdW5pbnN0YWxsYXRpb24gb24gMjAyNDA1MjEgb24gZW5kCiAJCXRlc3Rtb2RlID0gMDsKKwkJCWlmKCFyZXQpCisJCQlhaWNfcnVubW9kZSA9IFdJRklfSU9DVExfU1RPUDsKKwkJfWVsc2UKKwkJCXByaW50aygiYWljIHdpZmkgbm90IGxvYWQgJWQsY2FudCBzdG9wIVxuIiwgYWljX3J1bm1vZGUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBXSUZJX0lPQ1RMX1NUQVJUOiB7CisJCWlmKCFhaWNfcnVubW9kZSl7CiAJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQEBAaW5pdFdsYW5AQEBcbiIpOwotCQkvL3p3LndhbmcgVGhlIHNkaW8wIHBpbiBpcyBjb25maWd1cmVkIGluIGdwaW8gbW9kZSBiZWZvcmUgYW5kIGFmdGVyIHdpZmkgdW5pbnN0YWxsYXRpb24gb24gMjAyNDA1MjEgb24gc3RhcnQKLQkJcmV0ID0gc2RfaW9fY29uZmlnKDAsIDEpOwotCQlpZihyZXQpCi0JCQlwcmludGsoS0VSTl9FUlIgInNkX2lvX2NvbmZpZyBmdW5jIGZhaWwsIGZsYWcgPSAlZCByZXQgPSAlZFxuIiwxLHJldCk7Ci0JCS8vencud2FuZyBUaGUgc2RpbzAgcGluIGlzIGNvbmZpZ3VyZWQgaW4gZ3BpbyBtb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgd2lmaSB1bmluc3RhbGxhdGlvbiBvbiAyMDI0MDUyMSBvbiBlbmQKIAkJYWljODgwMF93aWZpX3JlX2VuYWJsZSgxKTsKICAgICAgICAgICAgICAgICBkd19tY2lfcmVzY2FuX2NhcmQoMCwgMSk7CiAgICAgICAgICAgICAgCXJldCA9IHJ3bnhfbW9kX2luaXQoKTsKKwkJaWYoIXJldCkKKwkJCWFpY19ydW5tb2RlID0gV0lGSV9JT0NUTF9TVEFSVDsKIAkJLy96dy53YW5nIFRoZSBzZGlvMCBwaW4gaXMgY29uZmlndXJlZCBpbiBncGlvIG1vZGUgYmVmb3JlIGFuZCBhZnRlciB3aWZpIHVuaW5zdGFsbGF0aW9uIG9uIDIwMjQwNTIxIG9uIHN0YXJ0CiAJCWlmKHJldCkKIAkJewogCQkJcHJpbnRrKEtFUk5fRVJSICJxcXEgIHJ3bnhfbW9kX2luaXQgZmFpbCwgcmV0ID0gJWRcbiIscmV0KTsKIAkJCWFpYzg4MDBfd2lmaV9kaXNhYmxlKDEpOwotCQkJcmV0ID0gc2RfaW9fY29uZmlnKDAsIDApOwogCQkJaWYocmV0KQogCQkJCXByaW50ayhLRVJOX0VSUiAic2RfaW9fY29uZmlnIGZ1bmMgZmFpbCwgZmxhZyA9ICVkIHJldCA9ICVkXG4iLDAscmV0KTsKIAkJfQorCQl9ZWxzZQorCQkJcHJpbnRrKCJhaWMgd2lmaSBoYXMgbG9hZGVkICVkLGNhbnQgc3RhcnQgaW4gbm9ybWFsIVxuIiwgYWljX3J1bm1vZGUpOwogCQkvL3p3LndhbmcgVGhlIHNkaW8wIHBpbiBpcyBjb25maWd1cmVkIGluIGdwaW8gbW9kZSBiZWZvcmUgYW5kIGFmdGVyIHdpZmkgdW5pbnN0YWxsYXRpb24gb24gMjAyNDA1MjEgb24gZW5kCiAJCWJyZWFrOwkKIAl9CiAKIAljYXNlIFdJRklfSU9DVExfU1RBUlRfVEVTVE1PREU6IHsKKwkJaWYoIWFpY19ydW5tb2RlKXsKIAkgICAgICBwcmludGsoS0VSTl9JTkZPICJAQEBpbml0V2xhbiBUZXN0bW9kZUBAQFxuIik7CiAJCSAgCSB0ZXN0bW9kZSA9IDE7CisJCQkgIGFpYzg4MDBfd2lmaV9yZV9lbmFibGUoMSk7CisJCQkgIGR3X21jaV9yZXNjYW5fY2FyZCgwLCAxKTsKICAgICAgICAgICAgICByZXQgPSByd254X21vZF9pbml0KCk7CisJCQkgIGlmKCFyZXQpCisJCQkgIGFpY19ydW5tb2RlID0gV0lGSV9JT0NUTF9TVEFSVF9URVNUTU9ERTsKKwkJfWVsc2UKKwkJCXByaW50aygiYWljIHdpZmkgaGFzIGxvYWRlZCAlZCxjYW50IHN0YXJ0IGluIHRlc3Rtb2RlIVxuIiwgYWljX3J1bm1vZGUpOwogCQlicmVhazsJCiAJfQogCmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9pbmNsdWRlL2xpbnV4L25sODAyMTEuaCBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luY2x1ZGUvbGludXgvbmw4MDIxMS5oCmluZGV4IGMwMTQ2ODAuLmIwZDQ3ZmIgMTAwNzU1Ci0tLSBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luY2x1ZGUvbGludXgvbmw4MDIxMS5oCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luY2x1ZGUvbGludXgvbmw4MDIxMS5oCkBAIC02ODgsNyArNjg4LDcgQEAKIAlOTDgwMjExX0NNRF9VTkVYUEVDVEVEXzRBRERSX0ZSQU1FLAogCiAJTkw4MDIxMV9DTURfU0VUX05PQUNLX01BUCwKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogCU5MODAyMTFfQ01EX0NIX1NXSVRDSF9OT1RJRlksCiAKIAlOTDgwMjExX0NNRF9TVEFSVF9QMlBfREVWSUNFLApAQCAtMTU0OCw3ICsxNTQ4LDcgQEAKIAlOTDgwMjExX0FUVFJfUlhfU0lHTkFMX0RCTSwKIAogCU5MODAyMTFfQVRUUl9CR19TQ0FOX1BFUklPRCwKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogCU5MODAyMTFfQVRUUl9XREVWLAogCiAJTkw4MDIxMV9BVFRSX1VTRVJfUkVHX0hJTlRfVFlQRSwKQEAgLTE3NTMsNyArMTc1Myw3IEBACiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULAotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJTlVNX05MODAyMTFfQVRUUiA9IF9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCiAjZW5kaWYKIAlOTDgwMjExX0FUVFJfTUFYID0gX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVCAtIDEKQEAgLTI2MzEsNyArMjYzMSw3IEBACiAJTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZLAogCU5MODAyMTFfQVVUSFRZUEVfRlQsCiAJTkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUCwKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogCU5MODAyMTFfQVVUSFRZUEVfU0FFLAogCU5MODAyMTFfQVVUSFRZUEVfRklMU19TSywKIAlOTDgwMjExX0FVVEhUWVBFX0ZJTFNfU0tfUEZTLApAQCAtMjY2Niw3ICsyNjY2LDcgQEAKIGVudW0gbmw4MDIxMV9tZnAgewogCU5MODAyMTFfTUZQX05PLAogCU5MODAyMTFfTUZQX1JFUVVJUkVELAotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJTkw4MDIxMV9NRlBfT1BUSU9OQUwsCiAjZW5kaWYKIH07CkBAIC0zMTYxLDcgKzMxNjEsNyBAQAogCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfUDJQID0JMTw8MiwKIAlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUXzgwMjExVSA9CTE8PDMsCiB9OwotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAvKioKICAqIG5sODAyMTFfZXh0ZXJuYWxfYXV0aF9hY3Rpb24gLSBBY3Rpb24gdG8gcGVyZm9ybSB3aXRoIGV4dGVybmFsCiAgKiAgICAgYXV0aGVudGljYXRpb24gcmVxdWVzdC4gVXNlZCBieSBOTDgwMjExX0FUVFJfRVhURVJOQUxfQVVUSF9BQ1RJT04uCmRpZmYgLS1naXQgYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9pbmNsdWRlL25ldC9jZmc4MDIxMS5oIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAppbmRleCA0NTgwZjBlLi5hMDkwOTg5IDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTEwNzgsNyArMTA3OCw3IEBACiAgKi8KIGVudW0gY2ZnODAyMTFfYXNzb2NfcmVxX2ZsYWdzIHsKIAlBU1NPQ19SRVFfRElTQUJMRV9IVAkJCT0gQklUKDApLAotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJQVNTT0NfUkVRX0RJU0FCTEVfVkhUCQkJPSBCSVQoMSksCiAJQVNTT0NfUkVRX1VTRV9SUk0JCQk9IEJJVCgyKSwKIAlDT05ORUNUX1JFUV9FWFRFUk5BTF9BVVRIX1NVUFBPUlQJPSBCSVQoMyksCkBAIC0xMjMyLDcgKzEyMzIsNyBAQAogCXU4ICppZTsKIAlzaXplX3QgaWVfbGVuOwogCWJvb2wgcHJpdmFjeTsKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogCWVudW0gbmw4MDIxMV9tZnAgbWZwOwogI2VuZGlmCiAJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyBjcnlwdG87CkBAIC0xMzMzLDcgKzEzMzMsNyBAQAogCXU4IHJlcGxheV9jdHJbTkw4MDIxMV9SRVBMQVlfQ1RSX0xFTl07CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfQUlDODgwMCkKKyNpZiAoZGVmaW5lZCBDT05GSUdfQUlDODgwMCB8fCBkZWZpbmVkIENPTkZJR19BSUM4ODAwRDgwTCkKIC8qKgogICogc3RydWN0IGNmZzgwMjExX2V4dGVybmFsX2F1dGhfcGFyYW1zIC0gVHJpZ2dlciBFeHRlcm5hbCBhdXRoZW50aWNhdGlvbi4KICAqCkBAIC0xNzQ0LDcgKzE3NDQsNyBAQAogCQkJCSAgdTE2IG5vYWNrX21hcCk7CiAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKigqZ2V0X2NoYW5uZWwpKHN0cnVjdCB3aXBoeSAqd2lwaHkpOwotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJaW50ICAgICAoKmV4dGVybmFsX2F1dGgpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBjZmc4MDIxMV9leHRlcm5hbF9hdXRoX3BhcmFtcyAqcGFyYW1zKTsKICNlbmRpZgpAQCAtMjMzMCw3ICsyMzMwLDcgQEAKIAl9IHNtZV9zdGF0ZTsKIAlzdHJ1Y3QgY2ZnODAyMTFfY29ubiAqY29ubjsKIAlzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKmNvbm5lY3Rfa2V5czsKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogCXUzMiBjb25uX293bmVyX25scG9ydGlkOwogCXU4IGRpc2Nvbm5lY3RfYnNzaWRbRVRIX0FMRU5dOwogI2VuZGlmCkBAIC0zMzkzLDcgKzMzOTMsNyBAQAogCQkJCSBjb25zdCB1OCAqZnJhbWUsIHNpemVfdCBsZW4sCiAJCQkJIGludCBmcmVxLCBpbnQgc2lnX2RibSwgZ2ZwX3QgZ2ZwKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAvKioKICAqIGNmZzgwMjExX2V4dGVybmFsX2F1dGhfcmVxdWVzdCAtIHVzZXJzcGFjZSByZXF1ZXN0IGZvciBhdXRoZW50aWNhdGlvbgogICogQG5ldGRldjogbmV0d29yayBkZXZpY2UKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luY2x1ZGUvbmV0L25ldGxpbmsuaCBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L2luY2x1ZGUvbmV0L25ldGxpbmsuaAppbmRleCAzOTk2YWFmLi5jYmE4MTFmIDEwMDc1NQotLS0gYS9hcC9vcy9saW51eC9saW51eC0zLjQueC9pbmNsdWRlL25ldC9uZXRsaW5rLmgKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvaW5jbHVkZS9uZXQvbmV0bGluay5oCkBAIC0xNzQsNyArMTc0LDcgQEAKIAlOTEFfTkVTVEVEX0NPTVBBVCwKIAlOTEFfTlVMX1NUUklORywKIAlOTEFfQklOQVJZLAotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJTkxBX1M4LAogCU5MQV9TMTYsCiAJTkxBX1MzMiwKQEAgLTc5MCw3ICs3OTAsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBubGFfcHV0X3UzMihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cnR5cGUsIHUzMiB2YWx1ZSkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogCXUzMiB0bXAgPSB2YWx1ZTsKIAogCXJldHVybiBubGFfcHV0KHNrYiwgYXR0cnR5cGUsIHNpemVvZih1MzIpLCAmdG1wKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L25ldC9jb3JlL25ldC1zeXNmcy5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggZWI2ZThlYi4uNjY5M2U4ZCAxMDA2NDQKLS0tIGEvYXAvb3MvbGludXgvbGludXgtMy40LngvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTEyNTgsNyArMTI1OCw3IEBACiAJCWdvdG8gZXhpdDsKICNlbmRpZgogCQotI2lmZGVmIENPTkZJR19BSUM4ODAwICAgCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJaWYoKHN0cmNtcChuZXQtPm5hbWUsIndsYW4wIikgPT0gMCkgfHwgKHN0cmNtcChuZXQtPm5hbWUsIndsYW4wLXZ4ZCIpID09IDApIHx8IChzdHJjbXAobmV0LT5uYW1lLCJ3bGFuMC12YTEiKSA9PSAwKSl7CQkKIAkJaWYoc3RybmNtcChrb2JqLT5uYW1lLCAidHgtIiwgMykgIT0gMCkKIAkJCWtvYmplY3RfdWV2ZW50KGtvYmosIEtPQkpfQUREKTsKZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9hcC9vcy9saW51eC9saW51eC0zLjQueC9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IDcyZDc2NWUuLjM5NzFmZDAgMTAwNzU1Ci0tLSBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L25ldC93aXJlbGVzcy9ubDgwMjExLmMKKysrIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJW05MODAyMTFfQVRUUl9OT0FDS19NQVBdID0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbTkw4MDIxMV9BVFRSX0lOQUNUSVZJVFlfVElNRU9VVF0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtOTDgwMjExX0FUVFJfQkdfU0NBTl9QRVJJT0RdID0geyAudHlwZSA9IE5MQV9VMTYgfSwKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogCSNpZiAwCiAJW05MODAyMTFfQVRUUl9XREVWXSA9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCiAJW05MODAyMTFfQVRUUl9VU0VSX1JFR19ISU5UX1RZUEVdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKQEAgLTQ5ODEsNyArNDk4MSw3IEBACiAJZXJyID0gY2ZnODAyMTFfam9pbl9pYnNzKHJkZXYsIGRldiwgJmlic3MsIGNvbm5rZXlzKTsKIAlpZiAoZXJyKQogCQlrZnJlZShjb25ua2V5cyk7Ci0jaWYgZGVmaW5lZChDT05GSUdfQUlDODgwMCkKKyNpZiAoZGVmaW5lZCBDT05GSUdfQUlDODgwMCB8fCBkZWZpbmVkIENPTkZJR19BSUM4ODAwRDgwTCkKIAllbHNlIGlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU09DS0VUX09XTkVSXSkgewogCQlwcmludGsoImxlbW9uICVzIHNvY2tfb3dcbiIsIF9fZnVuY19fKTsKIAkJLy9kZXYtPmllZWU4MDIxMV9wdHItPmNvbm5fb3duZXJfbmxwb3J0aWQgPSBpbmZvLT5zbmRfcG9ydGlkOwpAQCAtNTI3Nyw3ICs1Mjc3LDcgQEAKIAkJY29ubmVjdC5pZSA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRV0pOwogCQljb25uZWN0LmllX2xlbiA9IG5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0lFXSk7CiAJfQotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9VU0VfTUZQXSkgewogCQljb25uZWN0Lm1mcCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9VU0VfTUZQXSk7CiAJCWlmIChjb25uZWN0Lm1mcCAhPSBOTDgwMjExX01GUF9SRVFVSVJFRCAmJgpAQCAtNTMxOSw3ICs1MzE5LDcgQEAKIAkJICAgICAgIG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSksCiAJCSAgICAgICBzaXplb2YoY29ubmVjdC5odF9jYXBhKSk7CiAJfQotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJaWYgKG5sYV9nZXRfZmxhZyhpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfRVhURVJOQUxfQVVUSF9TVVBQT1JUXSkpIHsKIAkJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU09DS0VUX09XTkVSXSkgewogCQkJa3pmcmVlKGNvbm5rZXlzKTsKQEAgLTUzMzUsNyArNTMzNSw3IEBACiAJZXJyID0gY2ZnODAyMTFfY29ubmVjdChyZGV2LCBkZXYsICZjb25uZWN0LCBjb25ua2V5cyk7CiAJaWYgKGVycikKIAkJa2ZyZWUoY29ubmtleXMpOwotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiAJaWYgKCFlcnIgJiYgaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NPQ0tFVF9PV05FUl0pIHsKIAkJLy9kZXYtPmllZWU4MDIxMV9wdHItPmNvbm5fb3duZXJfbmxwb3J0aWQgPSBpbmZvLT5zbmRfcG9ydGlkOwogCQlkZXYtPmllZWU4MDIxMV9wdHItPmNvbm5fb3duZXJfbmxwb3J0aWQgPSBpbmZvLT5zbmRfcGlkOwpAQCAtNjQ0Nyw3ICs2NDQ3LDcgQEAKIAogCXJldHVybiAwOwogfQotI2lmIGRlZmluZWQoQ09ORklHX0FJQzg4MDApCisjaWYgKGRlZmluZWQgQ09ORklHX0FJQzg4MDAgfHwgZGVmaW5lZCBDT05GSUdfQUlDODgwMEQ4MEwpCiBzdGF0aWMgaW5saW5lIGludAogcmRldl9leHRlcm5hbF9hdXRoKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTY5MDksNyArNjkwOSw3IEBACiAJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX05FVERFVl9VUCB8CiAJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAogCX0sCi0jaWYgZGVmaW5lZChDT05GSUdfQUlDODgwMCkKKyNpZiAoZGVmaW5lZCBDT05GSUdfQUlDODgwMCB8fCBkZWZpbmVkIENPTkZJR19BSUM4ODAwRDgwTCkKIAl7CiAJCS5jbWQgPSBOTDgwMjExX0NNRF9FWFRFUk5BTF9BVVRILAogCQkvLy52YWxpZGF0ZSA9IEdFTkxfRE9OVF9WQUxJREFURV9TVFJJQ1QgfCBHRU5MX0RPTlRfVkFMSURBVEVfRFVNUCwKQEAgLTgyNjcsNyArODI2Nyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3JlcG9ydF9vYnNzX2JlYWNvbik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BSUM4ODAwKQorI2lmIChkZWZpbmVkIENPTkZJR19BSUM4ODAwIHx8IGRlZmluZWQgQ09ORklHX0FJQzg4MDBEODBMKQogaW50IGNmZzgwMjExX2V4dGVybmFsX2F1dGhfcmVxdWVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9leHRlcm5hbF9hdXRoX3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgIGdmcF90IGdmcCkKZGlmZiAtLWdpdCBhL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvYnVpbGQvY29uZmlnLm1rIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9idWlsZC9jb25maWcubWsKaW5kZXggNGYzODY5NC4uYTc4N2JiZSAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9idWlsZC9jb25maWcubWsKKysrIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9idWlsZC9jb25maWcubWsKQEAgLTUsNiArNSw3IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogDQogZXhwb3J0IENPTkZJR19XSUZJX01PRFVMRT1haWM4ODAwDQorZXhwb3J0IENPTkZJR19XSUZJX1NVQl9NT0RVTEU9ZDgwDQogZXhwb3J0IENPTkZJR19XSUZJX0ZVTkNUSU9OPWFwc3RhDQogI2V4cG9ydCBDT05GSUdfV0lGSV9TSU5HTEVBUD15ZXMgI2p1c3QgZm9yIHJlYWx0ZWsNCiBleHBvcnQgQ09ORklHX1NJR05fSU1BR0U9eWVzDQpkaWZmIC0tZ2l0IGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2Jpbi9ob3N0YXBkIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2Jpbi9ob3N0YXBkCmluZGV4IGIxMGQ3YTkuLmM3OTk2N2EgMTAwNzU1Ci0tLSBhL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9iaW4vaG9zdGFwZAorKysgYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvYmluL2hvc3RhcGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfODgwMGQ4MF91MDIuYmluIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfODgwMGQ4MF91MDIuYmluCmluZGV4IGIxNjVmZmEuLjNlYTExNTMgMTAwNzU1Ci0tLSBhL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvZm1hY2Z3Xzg4MDBkODBfdTAyLmJpbgorKysgYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd184ODAwZDgwX3UwMi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfY2FsaWJfODgwMGRjX2hfdTAyLmJpbiBiL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvZm1hY2Z3X2NhbGliXzg4MDBkY19oX3UwMi5iaW4KaW5kZXggYzZiMzNjNS4uN2EwYjgwMyAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfY2FsaWJfODgwMGRjX2hfdTAyLmJpbgorKysgYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd19jYWxpYl84ODAwZGNfaF91MDIuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvZm1hY2Z3X2NhbGliXzg4MDBkY191MDIuYmluIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfY2FsaWJfODgwMGRjX3UwMi5iaW4KaW5kZXggZmJiNDA5Yy4uM2EyYzY5NiAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfY2FsaWJfODgwMGRjX3UwMi5iaW4KKysrIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfY2FsaWJfODgwMGRjX3UwMi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfcGF0Y2hfODgwMGRjX2hfdTAyLmJpbiBiL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvZm1hY2Z3X3BhdGNoXzg4MDBkY19oX3UwMi5iaW4KaW5kZXggZmIxNWI0NS4uYmNlNDA0NiAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfcGF0Y2hfODgwMGRjX2hfdTAyLmJpbgorKysgYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd19wYXRjaF84ODAwZGNfaF91MDIuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvZm1hY2Z3X3BhdGNoXzg4MDBkY191MDIuYmluIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfcGF0Y2hfODgwMGRjX3UwMi5iaW4KaW5kZXggMTJkYzdjMS4uNDFiZThjNSAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfcGF0Y2hfODgwMGRjX3UwMi5iaW4KKysrIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfcGF0Y2hfODgwMGRjX3UwMi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfcGF0Y2hfdGJsXzg4MDBkY19oX3UwMi5iaW4gYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd19wYXRjaF90YmxfODgwMGRjX2hfdTAyLmJpbgppbmRleCBhYzRiNDIxLi40ODUxZDk3IDEwMDc1NQotLS0gYS9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd19wYXRjaF90YmxfODgwMGRjX2hfdTAyLmJpbgorKysgYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd19wYXRjaF90YmxfODgwMGRjX2hfdTAyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd19wYXRjaF90YmxfODgwMGRjX3UwMi5iaW4gYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2ZtYWNmd19wYXRjaF90YmxfODgwMGRjX3UwMi5iaW4KaW5kZXggNjYyYWI1OC4uZTA4MDUwZiAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9mbWFjZndfcGF0Y2hfdGJsXzg4MDBkY191MDIuYmluCisrKyBiL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvZm1hY2Z3X3BhdGNoX3RibF84ODAwZGNfdTAyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2xtYWNmd19yZi5iaW4gYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2xtYWNmd19yZi5iaW4KaW5kZXggYzYxODlmOS4uOWY3YmE1NCAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9sbWFjZndfcmYuYmluCisrKyBiL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvbG1hY2Z3X3JmLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2xtYWNmd19yZl84ODAwZDgwX3UwMi5iaW4gYi9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2Zpcm13YXJlL2xtYWNmd19yZl84ODAwZDgwX3UwMi5iaW4KaW5kZXggOTYwZDM1Mi4uNWZlN2E4ZSAxMDA3NTUKLS0tIGEvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9maXJtd2FyZS9sbWFjZndfcmZfODgwMGQ4MF91MDIuYmluCisrKyBiL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvZmlybXdhcmUvbG1hY2Z3X3JmXzg4MDBkODBfdTAyLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL3JjIGIvYXAvcHJvamVjdC96eDI5NzUyMHYzL3Byal92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9yYwppbmRleCBlNjBhYjVkLi5kZjMyZTQzIDEwMDc1NQotLS0gYS9hcC9wcm9qZWN0L3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL3JjCisrKyBiL2FwL3Byb2plY3QvengyOTc1MjB2My9wcmpfdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvcmMKQEAgLTE0Nyw2ICsxNDcsMTEgQEAKIGJvb3RyZWFzb249JHtib290cmVhc29uJSUgKn0KIAogI252c2VydmVyICYKK2VjaG8gMCA+IC9ldGNfcncvd2lmaVN0YXR1cworZWNobyAwID4gL2V0Y19ydy93cHNTdGF0dXMKK2VjaG8gRiA+IC9ldGNfcncvc3RhU3RhdHVzCitlY2hvIDAgPiAvZXRjX3J3L3FyU3RhdHVzCitlY2hvIDAgPiAvZXRjX3J3L3dwc2Rpc3BsYXlTdGF0dXMKIHp0ZV9tZGwgJGJvb3RyZWFzb24gJGJvb3Rtb2RlICYKIAogI2VjaG8gMSA+L3N5cy9kd2NfdXNiL3VzYmNvbmZpZy91c2JQbHVnCmRpZmYgLS1naXQgYS9jYXAvengyOTc1MjB2My9zb3VyY2VzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfdXNlciBiL2NhcC96eDI5NzUyMHYzL3NvdXJjZXMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl91c2VyCmluZGV4IGQ0M2EzMDguLjk0MzlhZjEgMTAwNzU1Ci0tLSBhL2NhcC96eDI5NzUyMHYzL3NvdXJjZXMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl91c2VyCisrKyBiL2NhcC96eDI5NzUyMHYzL3NvdXJjZXMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl91c2VyCkBAIC00NjUsNyArNDY1LDYgQEAKIHdpZmlfMTFuX2NhcF81Zz0xCiBXaXJlbGVzc01vZGVfNWc9NgogQ2hhbm5lbF81Zz0wCi1Db3VudHJ5Q29kZV81Zz1DTgogTUFYX0FjY2Vzc19udW1fNWc9MzIKIG1fTUFYX0FjY2Vzc19udW1fNWc9MAogQUNMX21vZGVfNWc9MApkaWZmIC0tZ2l0IGEvY2FwL3p4Mjk3NTIwdjMvc291cmNlcy9tZXRhLXp4aWMvcmVjaXBlcy1hcHAvd2lmaS1kZW1vL3dpZmktZGVtby5iYiBiL2NhcC96eDI5NzUyMHYzL3NvdXJjZXMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3dpZmktZGVtby93aWZpLWRlbW8uYmIKaW5kZXggNTU2NTIxOC4uNTc0YmFmZiAxMDA3NTUKLS0tIGEvY2FwL3p4Mjk3NTIwdjMvc291cmNlcy9tZXRhLXp4aWMvcmVjaXBlcy1hcHAvd2lmaS1kZW1vL3dpZmktZGVtby5iYgorKysgYi9jYXAvengyOTc1MjB2My9zb3VyY2VzL21ldGEtenhpYy9yZWNpcGVzLWFwcC93aWZpLWRlbW8vd2lmaS1kZW1vLmJiCkBAIC0zMiwxNiArMzIsMTkgQEAKIAlpbnN0YWxsIC1kICR7RH0ke2JpbmRpcn0vCiAJaW5zdGFsbCAtbSAwNzU1ICR7U30vd2lmaV9kZW1vL3dpZmlfZGVtbyAke0R9JHtiaW5kaXJ9LwogCWluc3RhbGwgLW0gMDc1NSAke1N9L3dpZmlfZGVtby9hcHN0YV9kZW1vICR7RH0ke2JpbmRpcn0vCisJaW5zdGFsbCAtbSAwNzU1ICR7U30vd2lmaV9kZW1vL3dpZmlfdGVzdG1vZGVfZGVtbyAke0R9JHtiaW5kaXJ9LwogCQogCSNpbnN0YWxsIGVsZnMKIAlpbnN0YWxsIC1kICR7RUxGUy1QQVRIfS8KIAlpbnN0YWxsIC1tIDA3NTUgJHtTfS93aWZpX2RlbW8vd2lmaV9kZW1vICR7RUxGUy1QQVRIfS8KIAlpbnN0YWxsIC1tIDA3NTUgJHtTfS93aWZpX2RlbW8vYXBzdGFfZGVtbyAke0VMRlMtUEFUSH0vCisJaW5zdGFsbCAtbSAwNzU1ICR7U30vd2lmaV9kZW1vL3dpZmlfdGVzdG1vZGVfZGVtbyAke0VMRlMtUEFUSH0vCiB9CiAKIGRvX2NsZWFubGlicyAoKSB7CiAJcm0gLWZyICR7RUxGUy1QQVRIfS93aWZpX2RlbW8KIAlybSAtZnIgJHtFTEZTLVBBVEh9L2Fwc3RhX2RlbW8KKwlybSAtZnIgJHtFTEZTLVBBVEh9L3dpZmlfdGVzdG1vZGVfZGVtbwogfQogCiBhZGR0YXNrICBjbGVhbmxpYnMgYWZ0ZXIgZG9fY2xlYW4gIGJlZm9yZSBkb19jbGVhbnNzdGF0ZQpkaWZmIC0tZ2l0IGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vaW5jbHVkZS93aWZpX2ludGVyX21zZy5oIGIvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vaW5jbHVkZS93aWZpX2ludGVyX21zZy5oCmluZGV4IDRiMzdiYTIuLmU4ZDExMzIgMTAwNzU1Ci0tLSBhL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3BsYXRmb3JtL2luY2x1ZGUvd2lmaV9pbnRlcl9tc2cuaAorKysgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9wbGF0Zm9ybS9pbmNsdWRlL3dpZmlfaW50ZXJfbXNnLmgKQEAgLTExMyw2ICsxMTMsMTAgQEAKIA0KIAlTQ1dJRklfU1RBX1NDQU5fUkVRLCAvL2FwIG9uL29mZg0KIAlTQ1dJRklfU1RBX1NDQU5fUlNQLA0KKw0KKwkvL3dpZmkgdGVzdA0KKwlTQ1dJRklfQ01EX1RFU1RfTU9ERV9SRVEsIC8vZGV2IG9uL29mZg0KKwlTQ1dJRklfQ01EX1RFU1RfTU9ERV9SU1AsDQogCQ0KIAkvL2Zyb20gd2xhbiBwcm94eQ0KIAlTQ1dJRklfQ01EX0VOQUJMRV9TVEFUVVNfSU5ELA0KQEAgLTIxOCw3ICsyMjIsNyBAQAogdHlwZWRlZiBzdHJ1Y3Qgew0KIAkvKjAtZGlzYWJsZSwgMS1lbmFibGUqLw0KIAlpbnQgZW5hYmxlOw0KLX0gc2N3aWZpX2Nvbm5lY3RfdCwgc2N3aWZpX2VuYWJsZV90LCBzY3dpZmlfd2FrZV90Ow0KK30gc2N3aWZpX2Nvbm5lY3RfdCwgc2N3aWZpX2VuYWJsZV90LCBzY3dpZmlfd2FrZV90LCBzY3dpZmlfdGVzdF90Ow0KIA0KIHR5cGVkZWYgc3RydWN0IHsNCiAJaW50IGlkeDsNCmRpZmYgLS1naXQgYS9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9wbGF0Zm9ybS9pbmNsdWRlL3dpZmlfbXNnLmggYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9wbGF0Zm9ybS9pbmNsdWRlL3dpZmlfbXNnLmgKaW5kZXggMGEzZWQzMi4uMDA5ZTRkNSAxMDA3NTUKLS0tIGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vaW5jbHVkZS93aWZpX21zZy5oCisrKyBiL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3BsYXRmb3JtL2luY2x1ZGUvd2lmaV9tc2cuaApAQCAtMTMzLDYgKzEzMyw3IEBACiAJTVNHX0NNRF9XSUZJX0NGR19QV0RfUkVRLAogCU1TR19DTURfV0lGSV9DRkdfUFdEX1JTUCwKIAkvKioqKioqKioqKioqKioqd2lmaSBPUEVOQ1BVz/vPoioqKioqKioqKioqKioqKiovCisJCiAJTVNHX0NNRF9BUF9TVEFfQ09OTkVDVEVELAogCU1TR19DTURfQVBfU1RBX0RJU0NPTk5FQ1RFRCwKIApAQCAtMTU4LDYgKzE1OSwxMSBAQAogCU1TR19DTURfQ0FQX1dJRklfU0VUX0FVVEgsIC8vd3BhCiAJTVNHX0NNRF9DQVBfV0lGSV9BUF9FTkFCTEUsIC8vYXAgb24gb2ZmCiAKKwlNU0dfQ01EX0NBUF9XSUZJX1RFU1RfRU5BQkxFLCAJLy93aWZpsuLK1MSjyr3H/bavs/XKvLuvLCAxIGluc21vZC8wIHJtbW9kCisKKwkvL2ZvciBjYXAgc3luYyBBUEkKKwlNU0dfQ01EX0NBUF9XSUZJX1NUQV9TVEFUX1JFUSwKKwlNU0dfQ01EX0NBUF9XSUZJX1NUQV9TVEFUX1JTUCwKIAogfTsKIApAQCAtNTE1LDggKzUyMSwxMSBAQAogLy9jYXA6YXBpLT53bGFuX3Byb3h5LT5hcDp3bGFuX3NlcnZlcgogdHlwZWRlZiBlbnVtCiB7Ci0JSU5fV0lGSV9TVEFUVVNfREVWX0lOSVRfRkFJTCA9IDAsCi0JSU5fV0lGSV9TVEFUVVNfSU5WQUxJRF9NQUMKKwlJTl9XSUZJX1NUQVRVU19ESVNBQkxFRCA9IDAsCisJSU5fV0lGSV9TVEFUVVNfRU5BQkxFRCwKKwlJTl9XSUZJX1NUQVRVU19JTlZBTElEX01BQywKKwlJTl9XSUZJX1NUQVRVU19ERVZfSU5JVF9GQUlMLAorCUlOX1dJRklfU1RBVFVTX0ZJUk1XQVJFX0NSQVNILAogfSBpbm5lcl93aWZpX3N0YXR1c19lOwogCiAvL25laSBidSB6aHVhbiBodWFuIHlvbmcKQEAgLTU5Nyw2ICs2MDYsNyBAQAogCUlOX1dJRklfV09SS19NT0RFX01JTiA9IC0xLAogCUlOX1dJRklfV09SS19NT0RFX0FQMCA9IDAsIAkvLzIuNEcgc2luZ2xlIGFwIC8gYXArc3RhCiAJSU5fV0lGSV9XT1JLX01PREVfQVAxLCAJCS8vNUcgc2luZ2xlIGFwIC8gYXArc3RhCisJSU5fV0lGSV9XT1JLX01PREVfU1RBLAogCUlOX1dJRklfV09SS19NT0RFX01BWAogfSBpbm5lcl93aWZpX3dvcmtfbW9kZV9lOwogCkBAIC02OTQsNiArNzA0LDExIEBACiB9IHdsYW5fc3RhX3N0YXR1c190OwogCiB0eXBlZGVmIHN0cnVjdCB7CisJaW50IHJzc2k7Cit9IHdsYW5fc3RhX3N0YXRfc3luY190OworCisKK3R5cGVkZWYgc3RydWN0IHsKIAlpbnQgcmVzdWx0OwogCXdsYW5fc3RhX3N0YXR1c190IHN0YXR1czsKIH0gc2N3aWZpX3N0YV9zdGF0X3Jlc190OwpAQCAtNzM0LDcgKzc0OSw3IEBACiB9IHdsYW5fc3RhX3NjYW5fbGlzdF90OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHdvcmtfbW9kZTsKKwlpbnQgd29ya19tb2RlOyAvL2lubmVyX3dpZmlfd29ya19tb2RlX2UKIH0gd2xhbl93b3JrX21vZGVfdDsvL3Njd2lmaV93b3JrbW9kZV90CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vd2xhbl9wcm94eS9NYWtlZmlsZSBiL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3BsYXRmb3JtL3dsYW5fcHJveHkvTWFrZWZpbGUKaW5kZXggOTRjY2YxMy4uMThlM2Y4MSAxMDA3NTUKLS0tIGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vd2xhbl9wcm94eS9NYWtlZmlsZQorKysgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9wbGF0Zm9ybS93bGFuX3Byb3h5L01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiAKIENGTEFHUyArPSAtZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIENGTEFHUyArPSAtZyAtV2Vycm9yPWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uCitDRkxBR1MgKz0gLURDT05GSUdfV0lGSV9FRlVTRV9NQUMKIA0KIExETElCUyArPSAtbHB0aHJlYWQgLWxtIC1scnQKIExETElCUyArPSAtbHNvZnRhcCAtTCQoenRlX2xpYl9wYXRoKS9saWJzb2Z0YXAKZGlmZiAtLWdpdCBhL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3BsYXRmb3JtL3dsYW5fcHJveHkvd2xhbl9wcm94eS5jIGIvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vd2xhbl9wcm94eS93bGFuX3Byb3h5LmMKaW5kZXggNjRkZmZmMC4uN2QxNmZkZSAxMDA3NTUKLS0tIGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vd2xhbl9wcm94eS93bGFuX3Byb3h5LmMKKysrIGIvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vcGxhdGZvcm0vd2xhbl9wcm94eS93bGFuX3Byb3h5LmMKQEAgLTU4LDYgKzU4LDEwIEBACiBzdGF0aWMgaW50IGdfc3RhX3NjYW5pbmcgPSAwOwogCiBzdGF0aWMgc2N3aWZpX3NsZWVwX3N0YXRfdCBnX3NsZWVwX3N0YXQgPSB7MH07CisKKy8vd2lmaSB0ZXN0CitzdGF0aWMgaW50IGdfd2lmaV90ZXN0bW9kZV9lbmFibGUgPSBTQ19XSUZJX0RJU0FCTEU7CisKIC8vZnJvbSBjYXAgYXBpCiBzdGF0aWMgc2NfaXBjX2V2ZW50IHNfd2lmaV9ldnRzW10gPQogewpAQCAtODUsNiArODksOSBAQAogCXswLCAxLCAwLCBTQ1dJRklfU1RBX0VOQUJMRV9SRVEsIHdpZmlfZXZ0c19wcm9jLCBOVUxMLCBOVUxMfSwgCiAJezAsIDEsIDAsIFNDV0lGSV9HRVRfU1RBX1NUQVRVU19SRVEsIHdpZmlfZXZ0c19wcm9jLCBOVUxMLCBOVUxMfSwgCiAJezAsIDEsIDAsIFNDV0lGSV9TVEFfU0NBTl9SRVEsIHdpZmlfZXZ0c19wcm9jLCBOVUxMLCBOVUxMfSwgCisKKwkvL3dpZmkgdGVzdAorCXswLCAxLCAwLCBTQ1dJRklfQ01EX1RFU1RfTU9ERV9SRVEsIHdpZmlfZXZ0c19wcm9jLCBOVUxMLCBOVUxMfSwKIAkKIH07CiAKQEAgLTEyNSw2ICsxMzIsOSBAQAogCQlDQVNFX1JFVFVSTl9TVFIoU0NXSUZJX0dFVF9TVEFfU1RBVFVTX1JFUSk7CiAJCUNBU0VfUkVUVVJOX1NUUihTQ1dJRklfU1RBX1NDQU5fUkVRKTsKIAorCQkvL3Rlc3QgbW9kZQorCQlDQVNFX1JFVFVSTl9TVFIoU0NXSUZJX0NNRF9URVNUX01PREVfUkVRKTsKKwogCX07CiAJcmV0dXJuICJVTktOT1dOICBDTUQgSUQiOwogfQpAQCAtMjI1LDkgKzIzNSwxMSBAQAogCXJldHVybiBwbXNnX3JzcDsKIH0KIAorLyogU3RhcnRlZCBieSBBSUNvZGVyLCBwaWQ6OTRkZjM0OTZmMW03MmJlMTQ2Y2IwYThjMzBhZTg1MTg4ODU5YmZmMiAqLwogc3RhdGljIGludCBjYXBfY2hlY2tfd2lmaSh2b2lkKQogewogCWNoYXIgIHdpZmlfbWFjWzIwXSA9IHswfTsKKyNpZiAwCiAJY2hhciAgd2lmaV9jaGlwWzIwXSA9IHswfTsKIAogCXNjX2NmZ19nZXQoIndpZmlfY2hpcCIsIHdpZmlfY2hpcCwgc2l6ZW9mKHdpZmlfY2hpcCkpOwpAQCAtMjM5LDE1ICsyNTEsMjQgQEAKIAkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwgIndpZmkgZGV2aWNlIGRyaXZlIGZhaWwhIik7CiAJCXJldHVybiBTQ19FUlJfTk9fREVWSUNFOwogCX0KKyNlbmRpZgogCisjaWYgIShkZWZpbmVkKENPTkZJR19XSUZJX0VGVVNFX01BQykpCiAJc2NfY2ZnX2dldCgid2lmaV9tYWMiLCB3aWZpX21hYywgc2l6ZW9mKHdpZmlfbWFjKSk7CiAJaWYoc3RybGVuKHdpZmlfbWFjKSA9PSAwKXsKIAkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwgInBsZWFzZSBjb25maWcgdmFsaWQgd2lmaSBtYWMhIik7CiAJCXJldHVybiBTQ19FUlJfTk9fTUFDOwogCX0KKyNlbmRpZgorCisJaWYgKGdfd2lmaV90ZXN0bW9kZV9lbmFibGUgPT0gU0NfV0lGSV9FTkFCTEUpeworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCAiaW4gd2lmaSB0ZXN0IG1vZGUhIik7CisJCXJldHVybiBTQ19FUlJfQlVTWTsKKwl9CiAKIAlyZXR1cm4gU0NfRVJSX1NVQ0NFU1M7CiB9CisvKiBFbmRlZCBieSBBSUNvZGVyLCBwaWQ6OTRkZjM0OTZmMW03MmJlMTQ2Y2IwYThjMzBhZTg1MTg4ODU5YmZmMiAqLwogCiBzdGF0aWMgc2NfaXBjX21zZyAqd2lmaV9lbmFibGVfcmVxdWVzdChjb25zdCBzY19pcGNfbXNnKiBjb25zdCBwbXNnKQogewpAQCAtMzU5LDggKzM4MCw4IEBACiAJCQkJd2lmaV9pcGNtc2dfc2V0KHBtc2ctPmZkX2NsaSwgcG1zZy0+bXNnX3JzcCwgKHZvaWQgKikmY29tbV9yZXMsIHNpemVvZihjb21tX3JlcyksIHBtc2dfcnNwKTsKIAkJCQlyZXR1cm4gcG1zZ19yc3A7CiAJCQl9Ci0JCX0KLQkJZ193aWZpX2VuYWJsZSA9IFNDX1dJRklfRU5BQkxFOworCQkJZ193aWZpX2VuYWJsZSA9IFNDX1dJRklfRU5BQkxFOworCQl9CQogCQkKIAkJaWYgKGdfc2xlZXBfc3RhdC5hcF9lbmFibGUgPT0gU0NfV0lGSV9FTkFCTEUpIHsKIAkJCXdsYW5fYXBfZW5hYmxlX3QgYXBfaW5mbyA9IHswfTsKQEAgLTM3Myw4ICszOTQsOCBAQAogCQkJCXdpZmlfaXBjbXNnX3NldChwbXNnLT5mZF9jbGksIHBtc2ctPm1zZ19yc3AsICh2b2lkICopJmNvbW1fcmVzLCBzaXplb2YoY29tbV9yZXMpLCBwbXNnX3JzcCk7CiAJCQkJcmV0dXJuIHBtc2dfcnNwOwogCQkJfQorCQkJZ19hcF9lbmFibGUgPSBTQ19XSUZJX0VOQUJMRTsKIAkJfQotCQlnX2FwX2VuYWJsZSA9IFNDX1dJRklfRU5BQkxFOwogCQkKIAkJaWYgKGdfc2xlZXBfc3RhdC5zdGFfZW5hYmxlID09IFNDX1dJRklfRU5BQkxFKSB7CiAJCQl3bGFuX3N0YV9lbmFibGVfdCBzdGFfaW5mbyA9IHswfTsKQEAgLTM4Niw4ICs0MDcsOSBAQAogCQkJCXdpZmlfaXBjbXNnX3NldChwbXNnLT5mZF9jbGksIHBtc2ctPm1zZ19yc3AsICh2b2lkICopJmNvbW1fcmVzLCBzaXplb2YoY29tbV9yZXMpLCBwbXNnX3JzcCk7CiAJCQkJcmV0dXJuIHBtc2dfcnNwOwogCQkJfQorCQkJc2NfY2ZnX3NldCgid2lmaV9zdGFfY29ubmVjdGlvbiIsICIxIik7CisJCQlnX3N0YV9lbmFibGUgPSBTQ19XSUZJX0VOQUJMRTsKIAkJfQotCQlnX3N0YV9lbmFibGUgPSBTQ19XSUZJX0VOQUJMRTsKIAogCQlnX3NsZWVwX3N0YXQuc2xlZXBfc3RhdCA9IFNDX1dJRklfV0FLRVVQOwogCQljb21tX3Jlcy5yZXN1bHQgPSBTQ19FUlJfU1VDQ0VTUzsKQEAgLTU3OCw2ICs2MDAsMTUgQEAKIAkJd2lmaV9pcGNtc2dfc2V0KHBtc2ctPmZkX2NsaSwgcG1zZy0+bXNnX3JzcCwgKHZvaWQgKikmY29tbV9yZXMsIHNpemVvZihjb21tX3JlcyksIHBtc2dfcnNwKTsKIAkJcmV0dXJuIHBtc2dfcnNwOwogCX0KKworLyogU3RhcnRlZCBieSBBSUNvZGVyLCBwaWQ6eWMwZmVyOTFmMWlkMmM0MTQ3OTYwYmU2MjBjMjFjMGE5ZDA5Y2M2YiAqLworCWlmIChnX3N0YV9lbmFibGUgPT0gU0NfV0lGSV9FTkFCTEUpIHsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwgImNhbnQgc2V0IHdoZW4gc3RhIG9wZW4hXG4iKTsKKwkJY29tbV9yZXMucmVzdWx0ID0gU0NfRVJSX0NPTkRJVElPTjsKKwkJd2lmaV9pcGNtc2dfc2V0KHBtc2ctPmZkX2NsaSwgcG1zZy0+bXNnX3JzcCwgKHZvaWQgKikmY29tbV9yZXMsIHNpemVvZihjb21tX3JlcyksIHBtc2dfcnNwKTsKKwkJcmV0dXJuIHBtc2dfcnNwOworCX0KKy8qIEVuZGVkIGJ5IEFJQ29kZXIsIHBpZDp5YzBmZXI5MWYxaWQyYzQxNDc5NjBiZTYyMGMyMWMwYTlkMDljYzZiICovCiAJCiAJY29tbV9yZXMucmVzdWx0ID0gY2FwX2NoZWNrX3dpZmkoKTsKIAlpZiAoY29tbV9yZXMucmVzdWx0ID09IFNDX0VSUl9TVUNDRVNTKSB7CkBAIC02MTEsNiArNjQyLDEzIEBACiAJCXdpZmlfaXBjbXNnX3NldChwbXNnLT5mZF9jbGksIHBtc2ctPm1zZ19yc3AsICh2b2lkICopJmNvbW1fcmVzLCBzaXplb2YoY29tbV9yZXMpLCBwbXNnX3JzcCk7CiAJCXJldHVybiBwbXNnX3JzcDsKIAl9CisKKwlpZiAoZ19zdGFfZW5hYmxlID09IFNDX1dJRklfRU5BQkxFKSB7CisJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsICJjYW50IHNldCB3aGVuIHN0YSBvcGVuIVxuIik7CisJCWNvbW1fcmVzLnJlc3VsdCA9IFNDX0VSUl9DT05ESVRJT047CisJCXdpZmlfaXBjbXNnX3NldChwbXNnLT5mZF9jbGksIHBtc2ctPm1zZ19yc3AsICh2b2lkICopJmNvbW1fcmVzLCBzaXplb2YoY29tbV9yZXMpLCBwbXNnX3JzcCk7CisJCXJldHVybiBwbXNnX3JzcDsKKwl9CiAJCiAJY29tbV9yZXMucmVzdWx0ID0gY2FwX2NoZWNrX3dpZmkoKTsKIAlpZiAoY29tbV9yZXMucmVzdWx0ID09IFNDX0VSUl9TVUNDRVNTKSB7CkBAIC02ODUsNiArNzIzLDEzIEBACiAJCXdpZmlfaXBjbXNnX3NldChwbXNnLT5mZF9jbGksIHBtc2ctPm1zZ19yc3AsICh2b2lkICopJmNvbW1fcmVzLCBzaXplb2YoY29tbV9yZXMpLCBwbXNnX3JzcCk7CiAJCXJldHVybiBwbXNnX3JzcDsKIAl9CisKKwlpZiAoZ19zdGFfZW5hYmxlID09IFNDX1dJRklfRU5BQkxFKSB7CisJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsICJjYW50IHNldCB3aGVuIHN0YSBvcGVuIVxuIik7CisJCWNvbW1fcmVzLnJlc3VsdCA9IFNDX0VSUl9DT05ESVRJT047CisJCXdpZmlfaXBjbXNnX3NldChwbXNnLT5mZF9jbGksIHBtc2ctPm1zZ19yc3AsICh2b2lkICopJmNvbW1fcmVzLCBzaXplb2YoY29tbV9yZXMpLCBwbXNnX3JzcCk7CisJCXJldHVybiBwbXNnX3JzcDsKKwl9CiAJCiAJY29tbV9yZXMucmVzdWx0ID0gY2FwX2NoZWNrX3dpZmkoKTsKIAlpZiAoY29tbV9yZXMucmVzdWx0ID09IFNDX0VSUl9TVUNDRVNTKSB7CkBAIC03ODYsNyArODMxLDggQEAKIAl9CiAKIAlpZiAoKGdfd29ya19tb2RlID09IElOX1dJRklfV09SS19NT0RFX0FQMCAmJiBwZGF0YV9pbmZvLT5pZHggIT0gSU5fV0lGSV9BUF9JTkRFWF9BUDApIHx8Ci0JCShnX3dvcmtfbW9kZSA9PSBJTl9XSUZJX1dPUktfTU9ERV9BUDEgJiYgcGRhdGFfaW5mby0+aWR4ICE9IElOX1dJRklfV09SS19NT0RFX0FQMSkpIHsKKwkJKGdfd29ya19tb2RlID09IElOX1dJRklfV09SS19NT0RFX0FQMSAmJiBwZGF0YV9pbmZvLT5pZHggIT0gSU5fV0lGSV9XT1JLX01PREVfQVAxKSB8fAorCQkoZ193b3JrX21vZGUgPT0gSU5fV0lGSV9XT1JLX01PREVfU1RBKSkgewogCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCAibW9kZSBub3QgbWF0Y2ghXG4iKTsKIAkJY29tbV9yZXMucmVzdWx0ID0gU0NfRVJSX05PVF9TVVBQT1JUOwogCQl3aWZpX2lwY21zZ19zZXQocG1zZy0+ZmRfY2xpLCBwbXNnLT5tc2dfcnNwLCAodm9pZCAqKSZjb21tX3Jlcywgc2l6ZW9mKGNvbW1fcmVzKSwgcG1zZ19yc3ApOwpAQCAtOTgyLDEzICsxMDI4LDE1IEBACiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwVG1wLCAmc3RhX3VwdGltZV9saXN0LCBsaXN0KSB7Ci0JCS8vdG9kbzogZ2V0IGlmYWNlIGJ5IHBUbXAtPmlkeAotCQlzdHJuY3B5KGRhdGFfcmVzLnN0YV9zdGF0dXNbaV0uaWZuYW1lLCAid2xhbjAiLCBzaXplb2YoZGF0YV9yZXMuc3RhX3N0YXR1c1tpXS5pZm5hbWUpIC0gMSk7Ci0JCXN0cm5jcHkoZGF0YV9yZXMuc3RhX3N0YXR1c1tpXS5tYWMsIHBUbXAtPm1hY2FkZHIsIHNpemVvZihkYXRhX3Jlcy5zdGFfc3RhdHVzW2ldLm1hYykgLSAxKTsKLQkJZGF0YV9yZXMuc3RhX3N0YXR1c1tpXS51cHRpbWUgPSAoaW50KSh0aW1lX3NlYygpIC0gcFRtcC0+YWNjZXNzX3RpbWUpOwotCQlpKys7Ci0JCWlmIChpID49IDMyKSB7Ci0JCQlicmVhazsKKwkJaWYgKGlkeCA9PSBwVG1wLT5pZHggfHwgaWR4ID09IElOX1dJRklfQVBfSU5ERVhfTUFYKSB7IC8vbWF4ID0gdG90YWwgc3RhCisJCQkvL3RvZG86IGdldCBpZmFjZSBieSBwVG1wLT5pZHgKKwkJCXN0cm5jcHkoZGF0YV9yZXMuc3RhX3N0YXR1c1tpXS5pZm5hbWUsICJ3bGFuMCIsIHNpemVvZihkYXRhX3Jlcy5zdGFfc3RhdHVzW2ldLmlmbmFtZSkgLSAxKTsKKwkJCXN0cm5jcHkoZGF0YV9yZXMuc3RhX3N0YXR1c1tpXS5tYWMsIHBUbXAtPm1hY2FkZHIsIHNpemVvZihkYXRhX3Jlcy5zdGFfc3RhdHVzW2ldLm1hYykgLSAxKTsKKwkJCWRhdGFfcmVzLnN0YV9zdGF0dXNbaV0udXB0aW1lID0gKGludCkodGltZV9zZWMoKSAtIHBUbXAtPmFjY2Vzc190aW1lKTsKKwkJCWkrKzsKKwkJCWlmIChpID49IDMyKSB7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAJZGF0YV9yZXMubnVtID0gaTsKQEAgLTExNDUsNiArMTE5MywyNSBAQAogCXJldHVybiBwbXNnX3JzcDsKIH0KIAorc3RhdGljIGludCBjaGVja19zdGFfcHJlX2NvbmRpdGlvbihpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUgPT0gU0NfV0lGSV9FTkFCTEUpIHsKKwkJaWYgKGdfd29ya19tb2RlID09IElOX1dJRklfV09SS19NT0RFX0FQMCB8fCBnX3dvcmtfbW9kZSA9PSBJTl9XSUZJX1dPUktfTU9ERV9BUDEpIHsKKwkJCWlmIChnX3dpZmlfZW5hYmxlID09IFNDX1dJRklfRElTQUJMRSB8fCBnX2FwX2VuYWJsZSA9PSBTQ19XSUZJX0RJU0FCTEUpIHsKKwkJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCAiY2hlY2tfc3RhX3ByZV9jb25kaXRpb24gd2lmaVslZF0vYXBbJWRdIGNsb3NlIVxuIiwgZ193aWZpX2VuYWJsZSwgZ19hcF9lbmFibGUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChnX3dvcmtfbW9kZSA9PSBJTl9XSUZJX1dPUktfTU9ERV9TVEEpIHsKKwkJCWlmIChnX3dpZmlfZW5hYmxlID09IFNDX1dJRklfRElTQUJMRSkgeworCQkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsICJjaGVja19zdGFfcHJlX2NvbmRpdGlvbiB3aWZpWyVkXSBjbG9zZSFcbiIsIGdfd2lmaV9lbmFibGUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQogCiBzdGF0aWMgc2NfaXBjX21zZyAqd2lmaV9zdGFfZW5hYmxlX3JlcXVlc3QoY29uc3Qgc2NfaXBjX21zZyogY29uc3QgcG1zZykKIHsKQEAgLTExNjAsOCArMTIyNyw3IEBACiAJCiAJY29tbV9yZXMucmVzdWx0ID0gY2FwX2NoZWNrX3dpZmkoKTsKIAlpZiAoY29tbV9yZXMucmVzdWx0ID09IFNDX0VSUl9TVUNDRVNTKSB7Ci0JCWlmICgocGRhdGFfaW5mby0+ZW5hYmxlID09IFNDX1dJRklfRU5BQkxFKSAmJiAKLQkJCShnX3dpZmlfZW5hYmxlID09IFNDX1dJRklfRElTQUJMRSB8fCBnX2FwX2VuYWJsZSA9PSBTQ19XSUZJX0RJU0FCTEUpKSB7CisJCWlmIChjaGVja19zdGFfcHJlX2NvbmRpdGlvbihwZGF0YV9pbmZvLT5lbmFibGUpICE9IDApIHsKIAkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsICJ3aWZpX3N0YV9lbmFibGVfcmVxdWVzdCB3aWZpWyVkXS9hcFslZF0gY2xvc2UhXG4iLCBnX3dpZmlfZW5hYmxlLCBnX2FwX2VuYWJsZSk7CiAJCQljb21tX3Jlcy5yZXN1bHQgPSBTQ19FUlJfQ09ORElUSU9OOwogCQl9CkBAIC0xMTgyLDYgKzEyNDgsOCBAQAogCQl9IAogCQllbHNlIHsKIAkJCXNjX2NmZ19zZXQoIndpZmlfc3RhX2Nvbm5lY3Rpb24iLCAiMCIpOworCQkJc2NfdGltZXJfZGVsZXRlKFNUQV9TQ0FOX1NPRlRUSU1FUl9JRCk7CisJCQlnX3N0YV9zY2FuaW5nID0gMDsKIAkJfQogCX0KIAkKQEAgLTExOTAsNiArMTI1OCwyMyBAQAogCXJldHVybiBwbXNnX3JzcDsKIH0KIAorc3RhdGljIGludCBnZXRfcnNzaV9zdGF0cyh2b2lkKQoreworCWNoYXIgc3RhX2F0WzY0XSA9IHswfTsKKwlpbnQgcnNzaSA9IDA7CisJdm9pZCAqcFtdID0geyZyc3NpfTsKKworCWlmIChnX3N0YV9lbmFibGUgPT0gU0NfV0lGSV9ESVNBQkxFKSB7CisJCXJldHVybiAwOworCX0KKwkKKwlzbnByaW50ZihzdGFfYXQsIHNpemVvZihzdGFfYXQpLCAiQVQrV0ZTVEFJTkZPP1xyXG4iKTsKKwlnZXRfbW9kZW1faW5mbyhzdGFfYXQsICIlZCIsICh2b2lkICoqKXApOworCisJcmV0dXJuIHJzc2k7Cit9CisKKwogc3RhdGljIHNjX2lwY19tc2cgKndpZmlfZ2V0X3N0YV9zdGF0dXNfcmVxdWVzdChjb25zdCBzY19pcGNfbXNnKiBjb25zdCBwbXNnKQogewogCXNjd2lmaV9zdGFfc3RhdF9yZXNfdCBkYXRhX3JlcyA9IHswfTsKQEAgLTEyMDAsNiArMTI4NSw3IEBACiAJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsICJ3aWZpIGlwY21zZyBubyBtZW1vcnkhXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCiAJLy/I57n7w7uz9cq8u68gsai07S0txKzIz9a1Tk9ORSDI57n7bW9kZcnowcu+zc6qSURMRaOsudix1XN0Ycqx0rK4xLPJSURMRQogCS8vsaO05sew1sPXtMysCiAJLy9pZiAoKQpAQCAtMTIwNyw3ICsxMjkzLDcgQEAKIAlkYXRhX3Jlcy5zdGF0dXMuc3RhdHVzID0gZ193aWZpX3N0YV9zdGF0dXMuc3RhdHVzOwogCXN0cm5jcHkoZGF0YV9yZXMuc3RhdHVzLmlmbmFtZSwgZ193aWZpX3N0YV9zdGF0dXMuaWZuYW1lLCBzaXplb2YoZGF0YV9yZXMuc3RhdHVzLmlmbmFtZSkgLSAxKTsKIAlzdHJuY3B5KGRhdGFfcmVzLnN0YXR1cy5hcF9ic3NpZCwgZ193aWZpX3N0YV9zdGF0dXMuYXBfYnNzaWQsIHNpemVvZihkYXRhX3Jlcy5zdGF0dXMuYXBfYnNzaWQpIC0gMSk7Ci0JZGF0YV9yZXMuc3RhdHVzLnJzc2kgPSBnX3dpZmlfc3RhX3N0YXR1cy5yc3NpOworCWRhdGFfcmVzLnN0YXR1cy5yc3NpID0gZ2V0X3Jzc2lfc3RhdHMoKTsvL2dfd2lmaV9zdGFfc3RhdHVzLnJzc2k7CiAJZGF0YV9yZXMuc3RhdHVzLnNpZ25hbF9sZXZlbCA9IGdfd2lmaV9zdGFfc3RhdHVzLnNpZ25hbF9sZXZlbDsKIAlkYXRhX3Jlcy5zdGF0dXMuaGFzX2FkZHIgPSBnX3dpZmlfc3RhX3N0YXR1cy5oYXNfYWRkcjsKIAlzdHJuY3B5KGRhdGFfcmVzLnN0YXR1cy5hZGRyLmFkZHIsIGdfd2lmaV9zdGFfc3RhdHVzLmFkZHIuYWRkciwgc2l6ZW9mKGRhdGFfcmVzLnN0YXR1cy5hZGRyLmFkZHIpIC0gMSk7CkBAIC0xMjg0LDYgKzEzNzAsNTQgQEAKIAlyZXR1cm4gcG1zZ19yc3A7CiB9CiAKK3N0YXRpYyBzY19pcGNfbXNnICp3aWZpX3Rlc3RfbW9kZV9yZXF1ZXN0KGNvbnN0IHNjX2lwY19tc2cqIGNvbnN0IHBtc2cpCit7CisJc2N3aWZpX3Rlc3RfdCAqcGRhdGFfaW5mbyA9IChzY3dpZmlfdGVzdF90ICopcG1zZy0+ZGF0YTsKKwlzY3dpZmlfY29tbW9uX3Jlc190IGNvbW1fcmVzID0gezB9OworCXNjX2lwY19tc2cgKnBtc2dfcnNwID0gc2NfaXBjX21zZ19uZXcoc2l6ZW9mKGNvbW1fcmVzKSk7CisJaW50IGlzX2VuYWJsZSA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZihOVUxMID09IHBtc2dfcnNwKSB7CisJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsICJ0ZXN0X21vZGUgaXBjbXNnIG5vIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKGdfd2lmaV9lbmFibGUgPT0gU0NfV0lGSV9FTkFCTEUpeworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCAid2lmaSBpcyBydW5uaW5nLCBjYW4ndCBzdGFydCB0ZXN0IG1vZGUhIik7CisJCWNvbW1fcmVzLnJlc3VsdCA9IFNDX0VSUl9CVVNZOworCQl3aWZpX2lwY21zZ19zZXQocG1zZy0+ZmRfY2xpLCBwbXNnLT5tc2dfcnNwLCAodm9pZCAqKSZjb21tX3Jlcywgc2l6ZW9mKGNvbW1fcmVzKSwgcG1zZ19yc3ApOworCQlyZXR1cm4gcG1zZ19yc3A7CisJfQorCisJaWYoU0NfV0lGSV9FTkFCTEUgPT0gcGRhdGFfaW5mby0+ZW5hYmxlKSB7CisJCWlzX2VuYWJsZSA9IDE7CisJCXJldCA9IHNlbmRfc29jX21zZyhORUFSX1BTLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9DQVBfV0lGSV9URVNUX0VOQUJMRSwgc2l6ZW9mKGlzX2VuYWJsZSksICZpc19lbmFibGUpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsICJ0ZXN0X21vZGUgaXBjX3NlbmRfbWVzc2FnZSBmYWlsLCByZXQ6JWRcbiIsIHJldCk7CisJCQljb21tX3Jlcy5yZXN1bHQgPSBTQ19FUlJfU09DOworCQkJd2lmaV9pcGNtc2dfc2V0KHBtc2ctPmZkX2NsaSwgcG1zZy0+bXNnX3JzcCwgKHZvaWQgKikmY29tbV9yZXMsIHNpemVvZihjb21tX3JlcyksIHBtc2dfcnNwKTsKKwkJCXJldHVybiBwbXNnX3JzcDsKKwkJfQorCQlnX3dpZmlfdGVzdG1vZGVfZW5hYmxlID0gU0NfV0lGSV9FTkFCTEU7CisJfQorCWVsc2UgeworCQlpc19lbmFibGUgPSAwOworCQlyZXQgPSBzZW5kX3NvY19tc2coTkVBUl9QUywgTU9EVUxFX0lEX1dJRkksIE1TR19DTURfQ0FQX1dJRklfVEVTVF9FTkFCTEUsIHNpemVvZihpc19lbmFibGUpLCAmaXNfZW5hYmxlKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCAidGVzdF9tb2RlIGlwY19zZW5kX21lc3NhZ2UgZmFpbCwgcmV0OiVkXG4iLCByZXQpOworCQkJY29tbV9yZXMucmVzdWx0ID0gU0NfRVJSX1NPQzsKKwkJCXdpZmlfaXBjbXNnX3NldChwbXNnLT5mZF9jbGksIHBtc2ctPm1zZ19yc3AsICh2b2lkICopJmNvbW1fcmVzLCBzaXplb2YoY29tbV9yZXMpLCBwbXNnX3JzcCk7CisJCQlyZXR1cm4gcG1zZ19yc3A7CisJCX0KKwkJZ193aWZpX3Rlc3Rtb2RlX2VuYWJsZSA9IFNDX1dJRklfRElTQUJMRTsKKwl9CisKKwljb21tX3Jlcy5yZXN1bHQgPT0gU0NfRVJSX1NVQ0NFU1M7CisJd2lmaV9pcGNtc2dfc2V0KHBtc2ctPmZkX2NsaSwgcG1zZy0+bXNnX3JzcCwgKHZvaWQgKikmY29tbV9yZXMsIHNpemVvZihjb21tX3JlcyksIHBtc2dfcnNwKTsKKwlyZXR1cm4gcG1zZ19yc3A7Cit9CisKIHN0YXRpYyBpbnQgd2lmaV9ldnRzX3Byb2MoY29uc3Qgc3RydWN0IF9zY19pcGNfZXZlbnRfKiBjb25zdCBwZXZ0LCBjb25zdCBzY19pcGNfbXNnKiBjb25zdCBwbXNnKQogewogCWludCBtc2dfaWQgPSBwbXNnLT5tc2dfcmVxOwpAQCAtMTM4NCw2ICsxNTE4LDExIEBACiAJY2FzZSBTQ1dJRklfU1RBX1NDQU5fUkVROgogCQlwbXNnX3JzcCA9IHdpZmlfc3RhX3NjYW5fcmVxdWVzdChwbXNnKTsKIAkJYnJlYWs7CisKKy8vd2lmaSB0ZXN0CisJY2FzZSBTQ1dJRklfQ01EX1RFU1RfTU9ERV9SRVE6CisJCXBtc2dfcnNwID0gd2lmaV90ZXN0X21vZGVfcmVxdWVzdChwbXNnKTsKKwkJYnJlYWs7CiAJCiAJZGVmYXVsdDoKIAkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwgIndpZmlfZXZ0c19wcm9jIHVua25vdyByZXEgbXNnLlxuIik7CmRpZmYgLS1naXQgYS9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9zZGsvbGlic2N0ZWwvaW5jbHVkZS9zY193aWZpLmggYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9zZGsvbGlic2N0ZWwvaW5jbHVkZS9zY193aWZpLmgKaW5kZXggMTJjZDllZi4uZDkzNTY4NiAxMDA3NTUKLS0tIGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vc2RrL2xpYnNjdGVsL2luY2x1ZGUvc2Nfd2lmaS5oCisrKyBiL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3Nkay9saWJzY3RlbC9pbmNsdWRlL3NjX3dpZmkuaApAQCAtNDgsNiArNDgsNyBAQAogCVNDX1dJRklfU1RBVFVTX0VOQUJMRUQsDQogCVNDX1dJRklfU1RBVFVTX0lOVkFMSURfTUFDLA0KIAlTQ19XSUZJX1NUQVRVU19ERVZfSU5JVF9GQUlMLA0KKwlTQ19XSUZJX1NUQVRVU19GSVJNV0FSRV9DUkFTSCwNCiB9IHNjX3dpZmlfZW5hYmxlX3N0YXR1c19lOw0KIA0KIHR5cGVkZWYgdm9pZCAoKnNjX3dpZmlfZW5hYmxlX3N0YXR1c19pbmRfY2JfZikoc2Nfd2lmaV9lbmFibGVfc3RhdHVzX2UgcHJlX3N0YXR1cywgc2Nfd2lmaV9lbmFibGVfc3RhdHVzX2Ugc3RhdHVzKTsNCkBAIC01Niw4ICs1Nyw5IEBACiB0eXBlZGVmIGVudW0NCiB7DQogCVNDX1dJRklfV09SS19NT0RFX01JTiA9IC0xLA0KLQlTQ19XSUZJX1dPUktfTU9ERV9BUDAgPSAwLCAJLy8yLjRHIHNpbmdsZSBhcCAvIGFwK3N0YQ0KLQlTQ19XSUZJX1dPUktfTU9ERV9BUDEsIAkJLy81RyBzaW5nbGUgYXAgLyBhcCtzdGENCisJU0NfV0lGSV9XT1JLX01PREVfQVAwID0gMCwgCS8vMi40RyBzaW5nbGUgYXAgLyBhcCtzdGEob25seSAyLjRHLCBzaW5nbGUgYmFuZCBjaGlwKQ0KKwlTQ19XSUZJX1dPUktfTU9ERV9BUDEsIAkJLy81RyBzaW5nbGUgYXAgLyBhcCtzdGEob25seSA1Rywgc2luZ2xlIGJhbmQgY2hpcCkNCisJU0NfV0lGSV9XT1JLX01PREVfU1RBLCAgICAgIC8vMi40RyBzaW5nbGUgc3RhIC8gMi40RyAmIDVHIHN0YQ0KIAlTQ19XSUZJX1dPUktfTU9ERV9NQVgNCiB9IHNjX3dpZmlfd29ya19tb2RlX2U7DQogDQpAQCAtNzQsOSArNzYsMTIgQEAKIHR5cGVkZWYgZW51bQ0KIHsNCiAJU0NfV0lGSV9BUF9NT0RFX01JTiA9IC0xLA0KLQlTQ19XSUZJX0FQX01PREVfODAyMTFCR04gPSAwLA0KKwlTQ19XSUZJX0FQX01PREVfODAyMTFCID0gMCwNCisJU0NfV0lGSV9BUF9NT0RFXzgwMjExQkcsDQorCVNDX1dJRklfQVBfTU9ERV84MDIxMUJHTiwNCiAJU0NfV0lGSV9BUF9NT0RFXzgwMjExQkdOQVhfMkcsDQotCVNDX1dJRklfQVBfTU9ERV84MDIxMUFOLCAvLzVHDQorCVNDX1dJRklfQVBfTU9ERV84MDIxMUEsIC8vNUcNCisJU0NfV0lGSV9BUF9NT0RFXzgwMjExQU4sDQogCVNDX1dJRklfQVBfTU9ERV84MDIxMUFOQUMsDQogCVNDX1dJRklfQVBfTU9ERV84MDIxMUFOQUNBWF81RywNCiAJU0NfV0lGSV9BUF9NT0RFX01BWA0KQEAgLTI3OSw2ICsyODQsMTkgQEAKICAgICBpbnQgIHVwdGltZTsgCQkvKio8IG9ubGluZSB0aW1lIGluIHNlYyAqLw0KIH0gc2NfbGFuaG9zdF90Ow0KIA0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB1bnNpZ25lZCBjaGFyIG1hY1s2XTsNCisgICAgc3RydWN0IGluX2FkZHIgYWRkcjsNCisgICAgY2hhciBob3N0bmFtZVsyMF07DQorfSBzY19zdGFfaW5mb190Ow0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKwlpbnQgbnVtOw0KKwlzY19zdGFfaW5mb190IHN0YVtTQ19XSUZJX01BWF9TVEFUSU9OX05VTV07DQorfSBzY193aWZpX2FwX3N0YV9pbmZvX3Q7DQorDQogLyoqDQogKiBAYnJpZWYgd2lmac34v9q1xMH3wb/Ns7zG0MXPog0KICogQHBhcmFtIHJ4X3BhY2tldHMgvdPK1bXEsPzK/Q0KQEAgLTY3Niw2ICs2OTQsMTcgQEAKIGludCBzY193aWZpX2xhbmhvc3RfZ2V0X2xpc3Qoc2NfbGFuaG9zdF90ICpsaXN0LCBpbnQgKmxpc3RfbGVuKTsNCiANCiAvKioNCisgKiBAYnJpZWYgQVDEo8q9z8K78cih0tHBrL3Tc3RhtcRtYWOhomhvc3RuYW1loaJpcNDFz6INCisgKiBAcGFyYW0gKGluKSBpZHg6IEFQxKPKvcv30v0NCisgKiBAcGFyYW0gKG91dCkgc3RhX2luZm+jutLRway903N0YbXE0MXPog0KKyAqIEByZXR1cm4JMCAtILPJuaYNCisgKgkJCcbky/vKp7DcDQorICogQG5vdGUgzt4NCisgKgkJIA0KKyAqLw0KK2ludCBzY193aWZpX2FwX3N0YV9pbmZvX2dldChzY193aWZpX2FwX2luZGV4X2UgaWR4LCBzY193aWZpX2FwX3N0YV9pbmZvX3QgKnN0YV9pbmZvKTsNCisNCisvKioNCiAgKiBAYnJpZWYgd2lmadDdw98NCiAgKiBAcGFyYW0gKGluKSANCiAgKiBAcGFyYW0gKG91dCkgDQpAQCAtNzMxLDYgKzc2MCwyMCBAQAogaW50IHNjX3dpZmlfZ2V0X3N0YV9wa3Rfc3RhdHMoc2Nfd2lmaV9wa3Rfc3RhdHNfdCAqcF9zdGF0KTsNCiANCiANCisvLy8vLy8vLy8vLy8vLy8vLy8vLy93aWZpIHRlc3QvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLyoqDQorICogQGJyaWVmILzT1Ni78tC21Nh3aWZpsuLK1MSjyr3H/bavDQorICogQHBhcmFtIChpbikgaXNfZW5hYmxlOiAxILzT1NgsIDAg0LbU2A0KKyAqIEBwYXJhbSAob3V0KSDO3g0KKyAqIEByZXR1cm4JMCAtILPJuaYNCisgKgkJCcbky/vKp7DcDQorICogQG5vdGUgvfbTw9PasuLK1MSjyr0s0+vG5Mv7YXBpvdO/2rPlzbss1f2zo8Sjyr3PwsfQzvC199PDIQ0KKyAqICAgICAgIMfSyLexo3dpZmnQvsasyc+157rz1rG909a00NCy4srUxKPKvaOszazKsdX9s6PEo8q9tKbT2rnYsdXXtMysIQ0KKyAqCQkgDQorICovDQoraW50IHNjX3dpZmlfZHJ2X3Rlc3RfbW9kZShpbnQgaXNfZW5hYmxlKTsNCisNCisNCiAjaWZkZWYgX19jcGx1c3BsdXMNCiB9DQogI2VuZGlmDQpkaWZmIC0tZ2l0IGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vc2RrL2xpYnNjdGVsL3dpZmkvc2Nfd2lmaS5jIGIvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vc2RrL2xpYnNjdGVsL3dpZmkvc2Nfd2lmaS5jCmluZGV4IDE5MGMwM2UuLmUyN2M0MjYgMTAwNzU1Ci0tLSBhL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3Nkay9saWJzY3RlbC93aWZpL3NjX3dpZmkuYworKysgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9zZGsvbGlic2N0ZWwvd2lmaS9zY193aWZpLmMKQEAgLTI1LDcgKzI1LDcgQEAKIA0KIC8qyc/Pws7E0MXPoiovDQogc3RydWN0IHNjd2lmaV9jb250ZXh0IHsJDQotCWludCBwcmVfd2lmaV9zdGF0dXM7DQorCXNjX3dpZmlfZW5hYmxlX3N0YXR1c19lIHByZV93aWZpX3N0YXR1czsNCiAJc2Nfd2lmaV9lbmFibGVfc3RhdHVzX2luZF9jYl9mIHdpZmlfc3RhdHVzX2NiOw0KIA0KIAkvL2FwDQpAQCAtNzAzLDYgKzcwMyw5IEBACiAJY2FzZSBTQ19XSUZJX1dPUktfTU9ERV9BUDE6DQogCQlzY19tb2RlID0gSU5fV0lGSV9XT1JLX01PREVfQVAxOw0KIAkJYnJlYWs7DQorCWNhc2UgU0NfV0lGSV9XT1JLX01PREVfU1RBOg0KKwkJc2NfbW9kZSA9IElOX1dJRklfV09SS19NT0RFX1NUQTsNCisJCWJyZWFrOw0KIA0KIAlkZWZhdWx0Og0KIAkJU0NMT0dFKCJ3b3JrX21vZGU6JWQgbm90IHN1cHBvcnQhXG4iLCBtb2RlKTsvL8DtwtvJz7K706az9s/WDQpAQCAtNzIyLDYgKzcyNSw5IEBACiAJY2FzZSBJTl9XSUZJX1dPUktfTU9ERV9BUDE6DQogCQlzY19tb2RlID0gU0NfV0lGSV9XT1JLX01PREVfQVAxOw0KIAkJYnJlYWs7DQorCWNhc2UgSU5fV0lGSV9XT1JLX01PREVfU1RBOg0KKwkJc2NfbW9kZSA9IFNDX1dJRklfV09SS19NT0RFX1NUQTsNCisJCWJyZWFrOw0KIA0KIAlkZWZhdWx0Og0KIAkJU0NMT0dFKCJ3b3JrX21vZGU6JWQgbm90IHN1cHBvcnQhXG4iLCBtb2RlKTsvL8DtwtvJz7K706az9s/WDQpAQCAtOTIyLDEyICs5MjgsMjEgQEAKIAkJcmV0dXJuIFNDX0VSUl9CQURQQVJBTTsNCiAJfQ0KIA0KLQlpZiAoaWR4ID09IFNDX1dJRklfQVBfSU5ERVhfQVAwICYmIG1vZGUgPT0gU0NfV0lGSV9BUF9NT0RFXzgwMjExQkdOKSB7DQorCWlmIChpZHggPT0gU0NfV0lGSV9BUF9JTkRFWF9BUDAgJiYgbW9kZSA9PSBTQ19XSUZJX0FQX01PREVfODAyMTFCKSB7DQorCQlyZXFfZGF0YS53bF9tb2RlID0gMDsNCisJfQ0KKwllbHNlIGlmIChpZHggPT0gU0NfV0lGSV9BUF9JTkRFWF9BUDAgJiYgbW9kZSA9PSBTQ19XSUZJX0FQX01PREVfODAyMTFCRykgew0KKwkJcmVxX2RhdGEud2xfbW9kZSA9IDM7DQorCX0NCisJZWxzZSBpZiAoaWR4ID09IFNDX1dJRklfQVBfSU5ERVhfQVAwICYmIG1vZGUgPT0gU0NfV0lGSV9BUF9NT0RFXzgwMjExQkdOKSB7DQogCQlyZXFfZGF0YS53bF9tb2RlID0gNDsNCiAJfQ0KIAllbHNlIGlmIChpZHggPT0gU0NfV0lGSV9BUF9JTkRFWF9BUDAgJiYgbW9kZSA9PSBTQ19XSUZJX0FQX01PREVfODAyMTFCR05BWF8yRykgew0KIAkJcmVxX2RhdGEud2xfbW9kZSA9IDY7DQogCX0NCisJZWxzZSBpZiAoaWR4ID09IFNDX1dJRklfQVBfSU5ERVhfQVAxICYmIG1vZGUgPT0gU0NfV0lGSV9BUF9NT0RFXzgwMjExQSkgew0KKwkJcmVxX2RhdGEud2xfbW9kZSA9IDM7DQorCX0NCiAJZWxzZSBpZiAoaWR4ID09IFNDX1dJRklfQVBfSU5ERVhfQVAxICYmIG1vZGUgPT0gU0NfV0lGSV9BUF9NT0RFXzgwMjExQU4pIHsNCiAJCXJlcV9kYXRhLndsX21vZGUgPSA0Ow0KIAl9DQpAQCAtMTM5NCw3ICsxNDA5LDcgQEAKIAlpbnQgbGlzdF9sZW4gPSBzdHJsZW4obWFjX2xpc3QpOw0KIA0KIAlpZiAobGlzdF9sZW4gPT0gMCkgew0KLQkJU0NMT0dFKCJtYWNfbGlzdCBlbXB0eSIpOw0KKwkJLy9TQ0xPR0UoIm1hY19saXN0IGVtcHR5Iik7DQogCQlyZXR1cm4gMTsNCiAJfQ0KIA0KQEAgLTE1NjYsMTIgKzE1ODEsMjEgQEAKIHN0YXRpYyBzY193aWZpX2FwX21vZGVfdHlwZV9lIHRyYW5zZV9hcF9tb2RlKHNjX3dpZmlfYXBfaW5kZXhfZSBpZHgsIGludCBtb2RlKQ0KIHsNCiAJc2Nfd2lmaV9hcF9tb2RlX3R5cGVfZSBzY19tb2RlID0gU0NfV0lGSV9BUF9NT0RFX01JTjsNCi0JaWYgKGlkeCA9PSBTQ19XSUZJX0FQX0lOREVYX0FQMCAmJiBtb2RlID09IDQpIHsNCisJaWYgKGlkeCA9PSBTQ19XSUZJX0FQX0lOREVYX0FQMCAmJiBtb2RlID09IDApIHsNCisJCXNjX21vZGUgPSBTQ19XSUZJX0FQX01PREVfODAyMTFCOw0KKwl9DQorCWVsc2UgaWYgKGlkeCA9PSBTQ19XSUZJX0FQX0lOREVYX0FQMCAmJiBtb2RlID09IDMpIHsNCisJCXNjX21vZGUgPSBTQ19XSUZJX0FQX01PREVfODAyMTFCRzsNCisJfQ0KKwllbHNlIGlmIChpZHggPT0gU0NfV0lGSV9BUF9JTkRFWF9BUDAgJiYgbW9kZSA9PSA0KSB7DQogCQlzY19tb2RlID0gU0NfV0lGSV9BUF9NT0RFXzgwMjExQkdOOw0KIAl9DQogCWVsc2UgaWYgKGlkeCA9PSBTQ19XSUZJX0FQX0lOREVYX0FQMCAmJiBtb2RlID09IDYpIHsNCiAJCXNjX21vZGUgPSBTQ19XSUZJX0FQX01PREVfODAyMTFCR05BWF8yRzsNCiAJfQ0KKwllbHNlIGlmIChpZHggPT0gU0NfV0lGSV9BUF9JTkRFWF9BUDEgJiYgbW9kZSA9PSAzKSB7DQorCQlzY19tb2RlID0gU0NfV0lGSV9BUF9NT0RFXzgwMjExQTsNCisJfQ0KIAllbHNlIGlmIChpZHggPT0gU0NfV0lGSV9BUF9JTkRFWF9BUDEgJiYgbW9kZSA9PSA0KSB7DQogCQlzY19tb2RlID0gU0NfV0lGSV9BUF9NT0RFXzgwMjExQU47DQogCX0NCkBAIC0yMzQxLDcgKzIzNjUsNiBAQAogDQogc3RhdGljIHZvaWQgZ2V0X2xhbmhvc3RfYnlfbWFjKHN0cnVjdCBsaXN0X2hlYWQgKmRoY3BfaW5mb19saXN0LCBjaGFyICptYWNfc3RyLCBzY19sYW5ob3N0X3QgKm5vZGUpDQogew0KLQlpbnQgZmluZF9uYW1lID0gMDsNCiAJdW5zaWduZWQgY2hhciBtYWNfYWRkcls2XSA9IHswfTsNCiAJREhDUE9GRkVSQUREUl9MSVNUX3QgKnBfZGhjcF9pbmZvICAgPSBOVUxMOw0KIAljaGFyIGlwX3N0clsxNl0gPSB7MH07DQpAQCAtMjQxNSw2ICsyNDM4LDcyIEBACiAJcmV0dXJuIFNDX0VSUl9TVUNDRVNTOw0KIH0NCiANCitzdGF0aWMgdm9pZCBnZXRfc3RhX2luZm9fYnlfbWFjKHN0cnVjdCBsaXN0X2hlYWQgKmRoY3BfaW5mb19saXN0LCB1bnNpZ25lZCBjaGFyICptYWNfYWRkciwgc2Nfc3RhX2luZm9fdCAqbm9kZSkNCit7DQorCURIQ1BPRkZFUkFERFJfTElTVF90ICpwX2RoY3BfaW5mbyAgID0gTlVMTDsNCisNCisJaWYoKHBfZGhjcF9pbmZvID0gZmluZF9tYXRjaF9zdGEoZGhjcF9pbmZvX2xpc3QsIG1hY19hZGRyKSkgIT0gTlVMTCkgew0KKwkJc3RybmNweShub2RlLT5ob3N0bmFtZSwgcF9kaGNwX2luZm8tPmRoY3BfaW5mby5ob3N0X25hbWUsIHNpemVvZihub2RlLT5ob3N0bmFtZSktMSk7DQorCQlub2RlLT5hZGRyLnNfYWRkciA9IHBfZGhjcF9pbmZvLT5kaGNwX2luZm8uaXA7DQorCX0NCisJDQorfSANCisNCitpbnQgc2Nfd2lmaV9hcF9zdGFfaW5mb19nZXQoc2Nfd2lmaV9hcF9pbmRleF9lIGlkeCwgc2Nfd2lmaV9hcF9zdGFfaW5mb190ICpzdGFfaW5mbykNCit7DQorCWludCBsaXN0X21heF9udW0gPSBTQ19XSUZJX01BWF9TVEFUSU9OX05VTTsNCisJaW50IGxpc3RfY3VyX251bSA9IDA7DQorCQ0KKwlzY3dpZmlfYXBfbWFjX2xpc3RfdCBtYWNfbGlzdCA9IHswfTsNCisJY2hhciAqcCA9IE5VTEw7DQorCWludCBpID0gMDsNCisJY2hhciBtYWNfdG1wWzE4XSA9IHswfTsNCisNCisJc3RydWN0IGxpc3RfaGVhZCBkaGNwX2luZm9fbGlzdDsNCisJDQorCWludCByZXQgPSBTQ19FUlJfRkFJTDsNCisJaWYgKHN0YV9pbmZvID09IE5VTEwpIHsNCisJCXJldHVybiBTQ19FUlJfQkFEUEFSQU07DQorCX0NCisNCisJaWYgKGlkeCA8PSBTQ19XSUZJX0FQX0lOREVYX01JTiB8fCBpZHggPj0gU0NfV0lGSV9BUF9JTkRFWF9NQVgpIHsNCisJCQlTQ0xPR0UoImFwX3N0YV9pbmZvX2dldCBpbnZhbGlkIGlkeDolZFxuIiwgaWR4KTsNCisJCQlyZXR1cm4gU0NfRVJSX0JBRFBBUkFNOw0KKwkJfQ0KKw0KKwlyZXQgPSBnZXRfbWFjX2xpc3QoaWR4LCAmbWFjX2xpc3QpOw0KKwlpZiAocmV0ICE9IFNDX0VSUl9TVUNDRVNTKSB7DQorCQlyZXR1cm4gcmV0Ow0KKwl9CQ0KKw0KKwlpZiAobWFjX2xpc3QubnVtIDw9IDApIHsNCisJCXN0YV9pbmZvLT5udW0gPSAwOw0KKwkJcmV0dXJuIFNDX0VSUl9TVUNDRVNTOw0KKwl9DQorDQorCWlmIChtYWNfbGlzdC5udW0gPiBsaXN0X21heF9udW0pIHsNCisJCWxpc3RfY3VyX251bSA9IGxpc3RfbWF4X251bTsNCisJCVNDTE9HRSgibWFjX2xpc3RbJWQtJWRdIG92ZXJmbG93IVxuIiwgbGlzdF9tYXhfbnVtLCBtYWNfbGlzdC5udW0pOw0KKwl9DQorCWVsc2Ugew0KKwkJbGlzdF9jdXJfbnVtID0gbWFjX2xpc3QubnVtOw0KKwl9DQorDQorCUlOSVRfTElTVF9IRUFEKCZkaGNwX2luZm9fbGlzdCk7DQorCXp0ZV9nZXRfbWFjX2xpc3RfZnJvbV9sZWFzZSgmZGhjcF9pbmZvX2xpc3QpOw0KKwkNCisJc3RhX2luZm8tPm51bSA9IGxpc3RfY3VyX251bTsNCisJZm9yIChpID0gMDsgaSA8IGxpc3RfY3VyX251bTsgaSsrKSB7CQkgDQorCQlwYXJzZV9tYWNfc3RyKG1hY19saXN0LnN0YV9zdGF0dXNbaV0ubWFjLCBzdGFfaW5mby0+c3RhW2ldLm1hYywgc2l6ZW9mKHN0YV9pbmZvLT5zdGFbaV0ubWFjKSk7DQorCQlnZXRfc3RhX2luZm9fYnlfbWFjKCZkaGNwX2luZm9fbGlzdCwgc3RhX2luZm8tPnN0YVtpXS5tYWMsICZzdGFfaW5mby0+c3RhW2ldKTsNCisJfQ0KKwkNCisJZnJlZV9kaGNwX2xpc3QoJmRoY3BfaW5mb19saXN0KTsNCisNCisJcmV0dXJuIFNDX0VSUl9TVUNDRVNTOw0KK30NCisNCisNCiBpbnQgc2Nfd2lmaV9zbGVlcCh2b2lkKQ0KIHsNCiAJc2NfaXBjX21zZyAqY29ubl9yZXFfbXNnID0gTlVMTDsNCkBAIC0yNTc0LDMgKzI2NjMsNDcgQEAKIAlyZXR1cm4gU0NfRVJSX1NVQ0NFU1M7DQogfQ0KIA0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vL3dpZmkgdGVzdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCitpbnQgc2Nfd2lmaV9kcnZfdGVzdF9tb2RlKGludCBpc19lbmFibGUpDQorew0KKwlzY19pcGNfbXNnICpjb25uX3JlcV9tc2cgPSBOVUxMOw0KKwlzY19pcGNfbXNnICpjb25uX3JzcF9tc2cgPSBOVUxMOw0KKwlzY3dpZmlfdGVzdF90IGNvbm5lY3RfaW5mbyA9IHswfTsNCisJc2N3aWZpX2NvbW1vbl9yZXNfdCAqY29tbV9yZXMgPSBOVUxMOw0KKwlpbnQgcmV0ID0gU0NfRVJSX0ZBSUw7DQorDQorCWlmIChpc19lbmFibGUgPT0gMSkgew0KKwkJY29ubmVjdF9pbmZvLmVuYWJsZSA9IFNDX1dJRklfRU5BQkxFOw0KKwl9DQorCWVsc2UgaWYgKGlzX2VuYWJsZSA9PSAwKSB7DQorCQljb25uZWN0X2luZm8uZW5hYmxlID0gU0NfV0lGSV9ESVNBQkxFOw0KKwl9DQorCWVsc2Ugew0KKwkJU0NMT0dFKCJzY193aWZpX2Rydl90ZXN0X21vZGUgcGFyYW0gJWQgaW52YWxpZCFcbiIsIGlzX2VuYWJsZSk7DQorCQlyZXR1cm4gU0NfRVJSX0JBRFBBUkFNOw0KKwl9DQorCWNvbm5fcmVxX21zZyA9IHNjd2lmaV9pcGNtc2dfc2V0KFNDV0lGSV9DTURfVEVTVF9NT0RFX1JFUSwgU0NXSUZJX0NNRF9URVNUX01PREVfUlNQLCAxLCAmY29ubmVjdF9pbmZvLCBzaXplb2YoY29ubmVjdF9pbmZvKSk7DQorCWlmKE5VTEwgPT0gY29ubl9yZXFfbXNnKSB7DQorCQlTQ0xPR0UoInNjX3dpZmlfZHJ2X3Rlc3RfbW9kZSBubyBtZW1vcnkhXG4iKTsNCisJCXJldHVybiBTQ19FUlJfTk9fTUVNT1JZOw0KKwl9DQorDQorCWlmKDAgIT0gc2NfaXBjX3NlbmRfbXNnX3dhaXRfcnNwKGNvbm5fcmVxX21zZywgJmNvbm5fcnNwX21zZykpIHsNCisJCVNDTE9HRSgic2Nfd2lmaV9kcnZfdGVzdF9tb2RlIG1zZyBmYWlsIVxuIik7DQorCQlyZXQgPSBTQ19FUlJfSVBDOw0KKwl9DQorCWVsc2Ugew0KKwkJY29tbV9yZXMgPSAoc2N3aWZpX2NvbW1vbl9yZXNfdCAqKWNvbm5fcnNwX21zZy0+ZGF0YTsNCisJCXJldCA9IGNvbW1fcmVzLT5yZXN1bHQ7DQorCQlpZihTQ19FUlJfU1VDQ0VTUyAhPSByZXQpIHsNCisJCQlTQ0xPR0UoInNjX3dpZmlfZHJ2X3Rlc3RfbW9kZSBmYWlsOiAlZCFcbiIsIHJldCk7DQorCQl9DQorCX0NCisNCisJc2N3aWZpX2lwY21zZ19mcmVlKGNvbm5fcmVxX21zZyk7DQorCXNjd2lmaV9pcGNtc2dfZnJlZShjb25uX3JzcF9tc2cpOw0KKwkNCisJcmV0dXJuIHJldDsNCit9DQorDQpkaWZmIC0tZ2l0IGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vdGVzdC93aWZpX2RlbW8vTWFrZWZpbGUgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9NYWtlZmlsZQppbmRleCAyZjRhNDQwLi5kNzdlMTU0IDEwMDc1NQotLS0gYS9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9NYWtlZmlsZQorKysgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9NYWtlZmlsZQpAQCAtNiw2ICs2LDkgQEAKIEVYRUMxID0gYXBzdGFfZGVtbwogT0JKUzEgPSBzY19hcHN0YXRpb24ubwogCitFWEVDMiA9IHdpZmlfdGVzdG1vZGVfZGVtbworT0JKUzIgPSBzY193aWZpX3Rlc3Rtb2RlLm8KKwogQ0ZMQUdTICs9IC1JLgogQ0ZMQUdTICs9IC1JLi9pbmMKIENGTEFHUyArPSAtSSQoQVBQX0RJUikvaW5jbHVkZQpAQCAtMTcsNyArMjAsNyBAQAogTERMSUJTICs9IC1scHRocmVhZAogTERMSUJTICs9IC1sc2N0ZWwgLUwkKExJQl9ESVIpL2xpYnNjdGVsCiAKLWFsbDogJChFWEVDKSAkKEVYRUMxKQorYWxsOiAkKEVYRUMpICQoRVhFQzEpICQoRVhFQzIpCiAKICQoRVhFQyk6ICQoT0JKUykKIAkkKENDKSAkKExERkxBR1MpIC1vICRAICReIC1XbCwtLXN0YXJ0LWdyb3VwICQoTERMSUJTKSAtV2wsLS1lbmQtZ3JvdXAKQEAgLTI2LDE2ICsyOSwyMyBAQAogJChFWEVDMSk6ICQoT0JKUzEpCiAJJChDQykgJChMREZMQUdTKSAtbyAkQCAkXiAtV2wsLS1zdGFydC1ncm91cCAkKExETElCUykgLVdsLC0tZW5kLWdyb3VwCiAJQGNwICRAICRALmVsZgorCQorJChFWEVDMik6ICQoT0JKUzIpCisJJChDQykgJChMREZMQUdTKSAtbyAkQCAkXiAtV2wsLS1zdGFydC1ncm91cCAkKExETElCUykgLVdsLC0tZW5kLWdyb3VwCisJQGNwICRAICRALmVsZgogCiByb21mczoKIAkkKFJPTUZTSU5TVCkgLWUgIC9zYmluLyQoRVhFQykKIAkkKFJPTUZTSU5TVCkgLWUgIC9zYmluLyQoRVhFQzEpCisJJChST01GU0lOU1QpIC1lICAvc2Jpbi8kKEVYRUMyKQogCQogY2xlYW46CiAJLXJtIC1mICQoRVhFQykgKi5lbGYgKi5nZGIgKi5vCiAJLXJtIC1mICQoRVhFQzEpICouZWxmICouZ2RiICoubworCS1ybSAtZiAkKEVYRUMyKSAqLmVsZiAqLmdkYiAqLm8KIAogCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJChPQkpTKSAkKExETElCUyQoTERMSUJTXyRAKSkKIAkkKENDKSAkKExERkxBR1MpIC1vICRAICQoT0JKUzEpICQoTERMSUJTJChMRExJQlNfJEApKQorCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJChPQkpTMikgJChMRExJQlMkKExETElCU18kQCkpCiAKIApkaWZmIC0tZ2l0IGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vdGVzdC93aWZpX2RlbW8vc2NfYXBzdGF0aW9uLmMgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9zY19hcHN0YXRpb24uYwppbmRleCAxZDU0OGRhLi45M2UwMDNkIDEwMDc1NQotLS0gYS9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9zY19hcHN0YXRpb24uYworKysgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9zY19hcHN0YXRpb24uYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPHRpbWUuaD4NCiAjaW5jbHVkZSA8c3lzbG9nLmg+DQogI2luY2x1ZGUgPHB0aHJlYWQuaD4NCisjaW5jbHVkZSA8c2lnbmFsLmg+DQogDQogI2luY2x1ZGUgInNjX3RlbF90eXBlcy5oIg0KIA0KQEAgLTIxLDYgKzIyLDI4IEBACiAjZGVmaW5lIEVYSVRfQ01EX1EJInFcbiINCiAjZGVmaW5lIEVYSVRfQ01EX0VYSVQJImV4aXRcbiINCiANCitzdGF0aWMgaW50IGdfdXNlcndpZmlfdGVybWluYXRlID0gMDsNCisNCitzdGF0aWMgdm9pZCB1c2VyX3dpZmlfdGVybWluYXRpb25faGFuZGxlcihpbnQgc2lnbnVtKQ0KK3sNCisgICAgZ191c2Vyd2lmaV90ZXJtaW5hdGUgPSAxOw0KKwlmcHV0cyhFWElUX0NNRF9RLCBzdGRvdXQpOw0KKwlwcmludGYoInVzZXJfd2lmaV90ZXJtaW5hdGlvbl9oYW5kbGVyIHNpZ251bSAlZFxuIixzaWdudW0pOw0KK30NCisNCitzdGF0aWMgdm9pZCB1c2VyX3dpZmlfaW5zdGFsbF9zaWduYWxfaGFuZGxlcih2b2lkKQ0KK3sNCisgICAgc3RydWN0IHNpZ2FjdGlvbiBzaWdfYWN0aW9uOw0KKw0KKyAgICBzaWdfYWN0aW9uLnNhX2hhbmRsZXIgPSB1c2VyX3dpZmlfdGVybWluYXRpb25faGFuZGxlcjsNCisgICAgc2lnZW1wdHlzZXQoJnNpZ19hY3Rpb24uc2FfbWFzayk7DQorICAgIHNpZ19hY3Rpb24uc2FfZmxhZ3MgPSAwOw0KKw0KKyAgICBzaWdhY3Rpb24oU0lHSU5ULCAmc2lnX2FjdGlvbiwgTlVMTCk7DQorICAgIHNpZ2FjdGlvbihTSUdIVVAsICZzaWdfYWN0aW9uLCBOVUxMKTsNCisgICAgc2lnYWN0aW9uKFNJR1RFUk0sICZzaWdfYWN0aW9uLCBOVUxMKTsNCit9DQorDQogDQogLy9kZW1vINXi0Km72LX3ybbSssO7uMkssLTKtbzK0rXO8dDox/O0psDtDQogc3RhdGljIHZvaWQgdXNlcl9zdGF0dXNfY2Ioc2Nfd2lmaV9lbmFibGVfc3RhdHVzX2UgcHJlX3N0YXR1cywgc2Nfd2lmaV9lbmFibGVfc3RhdHVzX2Ugc3RhdHVzKQ0KQEAgLTIwNCw3ICsyMjcsOCBAQAogCWludCBpID0gMDsNCiAJDQogCXByaW50ZigiW2Fwc3RhX2RlbW9ddGVzdCBiZWdpbi5cbiIpOw0KLQ0KKwkNCisJdXNlcl93aWZpX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIoKTsNCiAJdXNlcl93aWZpX2luaXQoKTsNCiANCiAJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsNCkBAIC0zMjAsNyArMzQ0LDcgQEAKIAl9DQogI2VuZGlmDQogCQ0KLQl3aGlsZSgxKSB7DQorCXdoaWxlKCFnX3VzZXJ3aWZpX3Rlcm1pbmF0ZSkgew0KIAkJbWVtc2V0KGNtZHN0ciwwLHNpemVvZihjbWRzdHIpKTsNCiAJCXByaW50ZigiW2Fwc3RhX2RlbW9dd2hlbiB3YW50IHRvIG9mZiwgaW5wdXQgY29tbWFuZDpcbiIpOw0KIAkNCmRpZmYgLS1naXQgYS9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9zY193aWZpX21haW4uYyBiL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3Rlc3Qvd2lmaV9kZW1vL3NjX3dpZmlfbWFpbi5jCmluZGV4IGE4ZDI4ZjIuLjcwMmMwMmMgMTAwNzU1Ci0tLSBhL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3Rlc3Qvd2lmaV9kZW1vL3NjX3dpZmlfbWFpbi5jCisrKyBiL2NhcC96eDI5NzUyMHYzL3p4aWNfY29kZS96eGljX3NvdXJjZS96eGljX2FwcF9vcGVuL3Rlc3Qvd2lmaV9kZW1vL3NjX3dpZmlfbWFpbi5jCkBAIC01Miw2ICs1Miw4IEBACiAJcHJpbnRmKCJ3aWZpX3NsZWVwXG4iKTsNCiAJcHJpbnRmKCJ3aWZpX3dha2V1cFxuIik7DQogCXByaW50Zigid2lmaV9zbGVlcF9nZXRcbiIpOw0KKwlwcmludGYoIndvcmtfbW9kZV9zZXRcbiIpOw0KKwlwcmludGYoIndvcmtfbW9kZV9nZXRcbiIpOw0KIAlwcmludGYoImFwX3NzaWRfc2V0IGlkIHNzaWRcbiIpOw0KIAlwcmludGYoImFwX2hpZGVfc2V0IGlkIGhpZGVcbiIpOw0KIAlwcmludGYoImFwX21vZGVfc2V0IGlkIG1vZGVcbiIpOw0KQEAgLTY1LDYgKzY3LDcgQEAKIAlwcmludGYoImFwX3N0b3AgaWRcbiIpOw0KIAlwcmludGYoImFwX3N0YXR1c19nZXQgaWRcbiIpOw0KIAlwcmludGYoImFwX2xhbmhvc3RcbiIpOw0KKwlwcmludGYoImFwX3N0YWluZm9fZ2V0IGlkXG4iKTsNCiAJcHJpbnRmKCJhcF9wa3RfZ2V0IGlkXG4iKTsNCiAJcHJpbnRmKCJzdGFfcGFyYW1fc2V0IHNzaWQgYXV0aCBwYXJpcyBwd1xuIik7DQogCXByaW50Zigic3RhX3BhcmFtX2dldFxuIik7DQpAQCAtMTE3LDYgKzEyMCwyNCBAQAogCX0NCiB9DQogDQorc3RhdGljIHZvaWQgcHJpbnRfYXBfc3RhaW5mbyhzY193aWZpX2FwX3N0YV9pbmZvX3QgKmluZm8pIA0KK3sNCisJaW50IGkgPSAwOw0KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnVtOyBpKyspIHsNCisJCWNoYXIgYWRkcnR4dFs0OF0gPSB7MH07DQorCQlpbmV0X250b3AoQUZfSU5FVCwgJmluZm8tPnN0YVtpXS5hZGRyLCBhZGRydHh0LCBzaXplb2YoYWRkcnR4dCkpOw0KKwkNCisJCXByaW50ZigiRWxlbWVudCAlZDpcbiIsIGkpOw0KKwkJcHJpbnRmKCJhZGRyOiAlMDhYIC0gJXNcbiIsIGluZm8tPnN0YVtpXS5hZGRyLnNfYWRkciwgYWRkcnR4dCk7DQorCQlwcmludGYoIm1hYzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIA0KKwkJCWluZm8tPnN0YVtpXS5tYWNbMF0sIGluZm8tPnN0YVtpXS5tYWNbMV0sIGluZm8tPnN0YVtpXS5tYWNbMl0sIA0KKwkJCWluZm8tPnN0YVtpXS5tYWNbM10sIGluZm8tPnN0YVtpXS5tYWNbNF0sIGluZm8tPnN0YVtpXS5tYWNbNV0pOw0KKwkJcHJpbnRmKCJob3N0bmFtZTogJXNcbiIsIGluZm8tPnN0YVtpXS5ob3N0bmFtZSk7DQorCQlwcmludGYoIlxuIik7DQorCX0NCit9DQorDQorDQogDQogc3RhdGljIHZvaWQgcHJpbnRfc3RhX3N0YXR1cyhzY193aWZpX3N0YV9zdGF0dXNfdCAqcF9tc2cpDQogew0KQEAgLTEyNCwxMyArMTQ1LDEzIEBACiAJcF9tc2ctPnJzc2ksIHBfbXNnLT5yZWFzb25fY29kZSk7DQogDQogCWlmIChwX21zZy0+aGFzX2FkZHIgPT0gMSkgew0KLQkJcHJpbnRmKCJbYXBzdGFfZGVtb11hZGRyIGlwOiVzLCBuZXRtYXNrOiVzLCBzdWJuZXRfYml0czolZCwgZ2F0ZXdheTolcywgZG5zcDolcywgZG5zczolc1xuIiwgDQorCQlwcmludGYoIlt3aWZpX2RlbW9dYWRkciBpcDolcywgbmV0bWFzazolcywgc3VibmV0X2JpdHM6JWQsIGdhdGV3YXk6JXMsIGRuc3A6JXMsIGRuc3M6JXNcbiIsIA0KIAkJCXBfbXNnLT5hZGRyLmFkZHIscF9tc2ctPmFkZHIubmV0bWFzayxwX21zZy0+YWRkci5zdWJuZXRfYml0cywNCiAJCQlwX21zZy0+YWRkci5nYXRld2F5LHBfbXNnLT5hZGRyLmRuc3AscF9tc2ctPmFkZHIuZG5zcyk7DQogCX0NCiANCiAJaWYgKHBfbXNnLT5oYXNfYWRkcjYgPT0gMSkgew0KLQkJcHJpbnRmKCJbYXBzdGFfZGVtb11hZGRyNiBpcDolcywgcHJlZml4OiVzLCBwcmVmaXhfYml0czolZCwgZ2F0ZXdheTolcywgZG5zcDolcywgZG5zczolc1xuIiwgDQorCQlwcmludGYoIlt3aWZpX2RlbW9dYWRkcjYgaXA6JXMsIHByZWZpeDolcywgcHJlZml4X2JpdHM6JWQsIGdhdGV3YXk6JXMsIGRuc3A6JXMsIGRuc3M6JXNcbiIsIA0KIAkJCXBfbXNnLT5hZGRyNi5hZGRyLHBfbXNnLT5hZGRyNi5wcmVmaXgscF9tc2ctPmFkZHI2LnByZWZpeF9iaXRzLA0KIAkJCXBfbXNnLT5hZGRyNi5nYXRld2F5LHBfbXNnLT5hZGRyNi5kbnNwLHBfbXNnLT5hZGRyNi5kbnNzKTsNCiAJfQ0KQEAgLTM4NCw2ICs0MDUsMTYgQEAKIAkJcHJpbnRmKCJbd2lmaV9kZW1vXWFwX2xhbmhvc3QgbGVuWyVkXSByZXQ9JWRcbiIsIGFycmF5X2xlbiwgcmV0KTsNCiAJCXByaW50X3NjX2xhbmhvc3RfdChhcnJheSwgYXJyYXlfbGVuKTsNCiAJfQ0KKwllbHNlIGlmKDAgPT0gc3RybmNtcChkYXRhLCAiYXBfc3RhaW5mb19nZXQiLCBzdHJsZW4oImFwX3N0YWluZm9fZ2V0IikpKSB7DQorCQlpbnQgaWQgPSAwOw0KKwkJc2Nfd2lmaV9hcF9zdGFfaW5mb190IHN0YXQgPSB7MH07DQorDQorCQlkYXRhID0gY21kc3RyICsgc3RybGVuKCJhcF9zdGFpbmZvX2dldCIpOw0KKwkJc3NjYW5mKGRhdGEsICIlZCIsICZpZCk7DQorCQlyZXQgPSBzY193aWZpX2FwX3N0YV9pbmZvX2dldChpZCwgJnN0YXQpOw0KKwkJcHJpbnRmKCJbd2lmaV9kZW1vXWFwX3N0YWluZm9fZ2V0WyVkXSByZXQ9JWRcbiIsIGlkLCByZXQpOw0KKwkJcHJpbnRfYXBfc3RhaW5mbygmc3RhdCk7DQorCX0NCiAJZWxzZSBpZigwID09IHN0cm5jbXAoZGF0YSwgImFwX3BrdF9nZXQiLCBzdHJsZW4oImFwX3BrdF9nZXQiKSkpIHsNCiAJCWludCBpZCA9IDA7DQogCQlzY193aWZpX3BrdF9zdGF0c190IHN0YXQgPSB7MH07DQpkaWZmIC0tZ2l0IGEvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vdGVzdC93aWZpX2RlbW8vc2Nfd2lmaV90ZXN0bW9kZS5jIGIvY2FwL3p4Mjk3NTIwdjMvenhpY19jb2RlL3p4aWNfc291cmNlL3p4aWNfYXBwX29wZW4vdGVzdC93aWZpX2RlbW8vc2Nfd2lmaV90ZXN0bW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmMzlkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXAvengyOTc1MjB2My96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi90ZXN0L3dpZmlfZGVtby9zY193aWZpX3Rlc3Rtb2RlLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qDQoruMPTptPDvfbTw9PavNPU2Lvy0LbU2HdpZmmy4srUxKPKvbXEx/22rywNCivT68bky/t3aWZpIGFwab3Tv9q6zdOm08O++bPlzbsszt63qLmytOYsx+vO8LrN1f2zo8Sjyr277NPDISEhDQorx9LIt7Gjd2lmadC+xqzJz7XnuvPWsb3T1rTQ0LLiytTEo8q9o6zNrMqx1f2zo8Sjyr20ptPaudix1de0zKwhDQorKi8NCisjaW5jbHVkZSA8Y3R5cGUuaD4NCisjaW5jbHVkZSA8ZXJybm8uaD4NCisjaW5jbHVkZSA8dW5pc3RkLmg+DQorI2luY2x1ZGUgPGdldG9wdC5oPg0KKyNpbmNsdWRlIDxsaW1pdHMuaD4NCisjaW5jbHVkZSA8bmV0ZGIuaD4NCisjaW5jbHVkZSA8c3RkYm9vbC5oPg0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDx0aW1lLmg+DQorI2luY2x1ZGUgPHN5c2xvZy5oPg0KKyNpbmNsdWRlIDxwdGhyZWFkLmg+DQorI2luY2x1ZGUgPHNpZ25hbC5oPg0KKw0KKyNpbmNsdWRlICJzY190ZWxfdHlwZXMuaCINCisNCisjaW5jbHVkZSAic2Nfd2lmaS5oIg0KKw0KKyNkZWZpbmUgRVhJVF9DTURfU1RPUAkic3RvcFxuIg0KKyNkZWZpbmUgRVhJVF9DTURfUQkicVxuIg0KKyNkZWZpbmUgRVhJVF9DTURfRVhJVAkiZXhpdFxuIg0KKw0KK3N0YXRpYyBpbnQgZ191c2Vyd2lmaV90ZXJtaW5hdGUgPSAwOw0KKw0KK3N0YXRpYyB2b2lkIHVzZXJfd2lmaV90ZXJtaW5hdGlvbl9oYW5kbGVyKGludCBzaWdudW0pDQorew0KKyAgICBnX3VzZXJ3aWZpX3Rlcm1pbmF0ZSA9IDE7DQorCWZwdXRzKEVYSVRfQ01EX1EsIHN0ZG91dCk7DQorCXByaW50ZigidXNlcl93aWZpX3Rlcm1pbmF0aW9uX2hhbmRsZXIgc2lnbnVtICVkXG4iLHNpZ251bSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHVzZXJfd2lmaV9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyKHZvaWQpDQorew0KKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ19hY3Rpb247DQorDQorICAgIHNpZ19hY3Rpb24uc2FfaGFuZGxlciA9IHVzZXJfd2lmaV90ZXJtaW5hdGlvbl9oYW5kbGVyOw0KKyAgICBzaWdlbXB0eXNldCgmc2lnX2FjdGlvbi5zYV9tYXNrKTsNCisgICAgc2lnX2FjdGlvbi5zYV9mbGFncyA9IDA7DQorDQorICAgIHNpZ2FjdGlvbihTSUdJTlQsICZzaWdfYWN0aW9uLCBOVUxMKTsNCisgICAgc2lnYWN0aW9uKFNJR0hVUCwgJnNpZ19hY3Rpb24sIE5VTEwpOw0KKyAgICBzaWdhY3Rpb24oU0lHVEVSTSwgJnNpZ19hY3Rpb24sIE5VTEwpOw0KK30NCisNCitzdGF0aWMgdm9pZCBwcmludFVzYWdlKGNvbnN0IGNoYXIgKk9wdCkNCit7DQorCXByaW50ZigiW3dpZmlfdGVzdG1vZGVdVXNhZ2U6ICVzXG4iLCBPcHQpOwkNCisJcHJpbnRmKCJ0ZXN0bW9kZV9lbmFibGVcbiIpOw0KKwlwcmludGYoInRlc3Rtb2RlX2Rpc2FibGVcbiIpOw0KKwlwcmludGYoIlxuIik7DQorfQ0KKw0KKw0KKy8vZGVtbw0KK3N0YXRpYyB2b2lkIHVzZXJfc3RhdHVzX2NiKHNjX3dpZmlfZW5hYmxlX3N0YXR1c19lIHByZV9zdGF0dXMsIHNjX3dpZmlfZW5hYmxlX3N0YXR1c19lIHN0YXR1cykNCit7DQorCXByaW50ZigiW3dpZmlfdGVzdG1vZGVddXNlcl9zdGF0dXNfY2I6JWQsJWRcbiIsIHByZV9zdGF0dXMsIHN0YXR1cyk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgdXNlcl93aWZpX2luaXQodm9pZCkNCit7DQorCWludCByZXQgPSAwOw0KKwkNCisJcmV0ID0gc2Nfd2lmaV9pbml0KCk7DQorCWlmKDAgIT0gcmV0KSB7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJDQorCS8v16Ky4bvYtfcgt8XU2mluaXTWrrrzDQorCS8vd2lmaQ0KKwlzY193aWZpX3NldF9lbmFibGVfc3RhdHVzX2luZF9jYih1c2VyX3N0YXR1c19jYik7DQorCQ0KKwlyZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0aWMgdm9pZCB1c2VyX2NtZF9wcm9jKGNoYXIgKmNtZHN0cikNCit7DQorCWNoYXIgKmRhdGEgPSBjbWRzdHI7DQorCWludCBkYXRhX2xlbiA9IHN0cmxlbihkYXRhKSAtIDE7LyogLXN0cmxlbigiXHIiKSovCQ0KKwljaGFyIHJlcXVlc3QgPSBkYXRhWzBdOw0KKwlpbnQgcmV0ID0gMDsNCisNCisJY21kc3RyW2RhdGFfbGVuXSA9ICdcMCc7DQorCXByaW50ZigiW3dpZmlfdGVzdG1vZGVdY21kPSVzXG4iLCBkYXRhKTsNCisJaWYoMCA9PSBzdHJuY21wKGRhdGEsICJ0ZXN0bW9kZV9lbmFibGUiLCBkYXRhX2xlbikpIHsNCisJCXJldCA9IHNjX3dpZmlfZHJ2X3Rlc3RfbW9kZSgxKTsNCisJCXByaW50ZigiW3dpZmlfdGVzdG1vZGVddGVzdG1vZGVfZW5hYmxlIHJldD0lZFxuIiwgcmV0KTsNCisJfQ0KKwllbHNlIGlmKDAgPT0gc3RybmNtcChkYXRhLCAidGVzdG1vZGVfZGlzYWJsZSIsIGRhdGFfbGVuKSkgew0KKwkJcmV0ID0gc2Nfd2lmaV9kcnZfdGVzdF9tb2RlKDApOw0KKwkJcHJpbnRmKCJbd2lmaV90ZXN0bW9kZV10ZXN0bW9kZV9kaXNhYmxlIHJldD0lZFxuIiwgcmV0KTsNCisJfQ0KKwllbHNlIHsNCisJCXByaW50ZigiUmVxdWVzdCB1bmtub3cuXG4iKTsNCisJCXByaW50VXNhZ2UoY21kc3RyKTsNCisJfQ0KK30NCisNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KK3sNCisJY2hhciBjbWRzdHJbMTI4XTsNCisJaW50IHJldCA9IFNDX0VSUl9TVUNDRVNTOw0KKwkNCisJcHJpbnRmKCJbd2lmaV90ZXN0bW9kZV10ZXN0IGJlZ2luXG4iKTsNCisNCisJdXNlcl93aWZpX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIoKTsNCisJdXNlcl93aWZpX2luaXQoKTsNCisNCisJd2hpbGUoIWdfdXNlcndpZmlfdGVybWluYXRlKSB7DQorCQltZW1zZXQoY21kc3RyLDAsc2l6ZW9mKGNtZHN0cikpOw0KKwkJDQorCQlwcmludGYoIlt3aWZpX3Rlc3Rtb2RlXVBsZWFzZSBpbnB1dCB0ZXN0IGNvbW1hbmQ6XG4iKTsNCisJDQorCQlpZihOVUxMICE9IGZnZXRzKGNtZHN0cixzaXplb2YoY21kc3RyKSAtIDEsc3RkaW4pKSB7DQorCQkJaWYoMCA9PSBzdHJjbXAoRVhJVF9DTURfU1RPUCxjbWRzdHIpIHx8IA0KKwkJCQkwID09IHN0cmNtcChFWElUX0NNRF9RLGNtZHN0cikgfHwgDQorCQkJCTAgPT0gc3RyY21wKEVYSVRfQ01EX0VYSVQsY21kc3RyKSkgew0KKwkJCQlicmVhazsNCisJCQl9DQorCQkJDQorCQkJcHJpbnRmKCJbd2lmaV90ZXN0bW9kZV1jbWRzdHI6JWQgJXNcbiIsIHN0cmxlbihjbWRzdHIpLCBjbWRzdHIpOw0KKwkJCWlmKDEgPj0gc3RybGVuKGNtZHN0cikpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKw0KKwkJCXVzZXJfY21kX3Byb2MoY21kc3RyKTsNCisJCX0NCisJfQ0KKw0KKwkvL3JldCA9IHNjX3dpZmlfZGlzYWJsZSgpOw0KKwkvL3ByaW50ZigiW3dpZmlfZGVtb11zY193aWZpX2Rpc2FibGUgcmV0OiVkXG4iLCByZXQpOw0KKwkNCisJc2Nfd2lmaV91bmluaXQoKTsNCisJcHJpbnRmKCJbd2lmaV90ZXN0bW9kZV10ZXN0IGVuZFxuIik7DQorCXJldHVybiAwOw0KK30NCisNCg==