[RFC PATCH v2 2/5] mpt: Add Smsdid and Smmpt supervisor domain core
Rahul Pathak <[email protected]> Mon, 27 Jul 2026 19:26:00 +0530
| Newsgroups | org.infradead.lists.opensbi |
|---|---|
| Message-ID | <[email protected]> |
SW50cm9kdWNlIHRoZSBzdXBlcnZpc29yZCBvbWFpbiBtZW1vcnktcHJvdGVjdGlvbiAoU21tcHQp IHRhYmxlCm1hbmFnZW1lbnQgY29yZS4gVGhpcyBhZGRzIHRoZSBtb2RlIGFnbm9zdGljIGNvcmUg bGF5ZXIgYW5kIHRoZQpwZXIgbW9kZSB0YWJsZSB3YWxrZXJzL2J1aWxkZXIuCgpBZGQgZGVmaW5l cyBmb3IgdGhlIG1tcHQgQ1NSIGVuY29kaW5nLCBNUFRFIGJpdCBsYXlvdXQsIHBlcm1pc3Npb24g ZmxhZ3MsCnN0cnVjdHVyZXMsIGZlbmNlIGhlbHBlcnMgYW5kIHRoZSBwdWJsaWMgaW50ZXJmYWNl cy4KCkl0IGltcGxlbWVudHMgdGhlIFJWNjQgc3VwcG9ydGVkIG1vZGVzIChTbW1wdDQzLzUyLzY0 KSBhbmQKdGhlIFJWMzIgbW9kZSAoU21tcHQzNCksIGl0cyBNUFQgdGFibGUgc3VwcG9ydC4KCkFs c28gaW1wbGVtZW50cyBtcHQgY29yZSB3aGljaCBpbnRlZ3JhdGVzIFNtbXB0IHdpdGggU0JJIGRv bWFpbnMgYW5kCm90aGVyIGNvcmUgbGF5ZXJzLgoKU2lnbmVkLW9mZi1ieTogUmFodWwgUGF0aGFr IDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KLS0tCiBpbmNsdWRlL3NiaS9zYmlfbXB0 LmggIHwgMzM0ICsrKysrKysrKysrKysrCiBsaWIvc2JpL29iamVjdHMubWsgICAgIHwgICAyICsK IGxpYi9zYmkvc2JpX21wdC5jICAgICAgfCA5MjYgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIGxpYi9zYmkvc2JpX21wdF9tb2RlLmMgfCA5OTcgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMjI1OSBpbnNlcnRp b25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9zYmkvc2JpX21wdC5oCiBjcmVhdGUg bW9kZSAxMDA2NDQgbGliL3NiaS9zYmlfbXB0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvc2Jp L3NiaV9tcHRfbW9kZS5jCgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zYmkvc2JpX21wdC5oIGIvaW5j bHVkZS9zYmkvc2JpX21wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi43 ZDE3YmQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2JpL3NiaV9tcHQuaApAQCAtMCww ICsxLDMzNCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0yLUNsYXVzZQorICoK KyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICogQXV0aG9yczogUmFo dWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAqLworCisjaWZuZGVm IF9fU0JJX01QVF9IX18KKyNkZWZpbmUgX19TQklfTVBUX0hfXworCisjaW5jbHVkZSA8c2JpL3Ni aV90eXBlcy5oPgorI2luY2x1ZGUgPHNiaS9yaXNjdl9sb2Nrcy5oPgorI2luY2x1ZGUgPHNiaS9z Ymlfc2NyYXRjaC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfYml0bWFwLmg+CisjaW5jbHVkZSA8c2Jp L3Jpc2N2X2FzbS5oPgorCitzdHJ1Y3Qgc2JpX2RvbWFpbjsKK3N0cnVjdCBzYmlfbXB0X2RvbWFp bjsKK3N0cnVjdCBzYmlfbXB0X2N0cmw7CitzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb247CisK Ky8qIENTUiBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0JJX0NTUl9NTVBUCQkweDM4MgorI2RlZmlu ZSBTQklfQ1NSX01TRENGRwkJMHg3NEUKKworLyogbW1wdCByZWdpc3RlciBmaWVsZCBkZWZpbml0 aW9ucyAqLworI2lmIF9fcmlzY3ZfeGxlbiA9PSA2NAorIyBkZWZpbmUgU0JJX01NUFRfTU9ERV9T SElGVAk2MFVMCisjIGRlZmluZSBTQklfTU1QVF9NT0RFX01BU0sJKFVMKDB4RikgPDwgU0JJX01N UFRfTU9ERV9TSElGVCkKKyMgZGVmaW5lIFNCSV9NTVBUX1NESURfU0hJRlQJNTJVTAorIyBkZWZp bmUgU0JJX01NUFRfU0RJRF9NQVNLCShVTCgweDNGKSA8PCBTQklfTU1QVF9TRElEX1NISUZUKQor IyBkZWZpbmUgU0JJX01NUFRfUFBOX01BU0sJVUwoMHgwMDAwMEZGRkZGRkZGRkZGKQorI2Vsc2UK KyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU0hJRlQJMzBVTAorIyBkZWZpbmUgU0JJX01NUFRfTU9E RV9NQVNLCShVTCgweDMpIDw8IFNCSV9NTVBUX01PREVfU0hJRlQpCisjIGRlZmluZSBTQklfTU1Q VF9TRElEX1NISUZUCTIyVUwKKyMgZGVmaW5lIFNCSV9NTVBUX1NESURfTUFTSwkoVUwoMHgzRikg PDwgU0JJX01NUFRfU0RJRF9TSElGVCkKKyMgZGVmaW5lIFNCSV9NTVBUX1BQTl9NQVNLCVVMKDB4 M0ZGRkZGKQorI2VuZGlmCisKKyNkZWZpbmUgU0JJX01NUFRfTU9ERV9CQVJFCTBVTAorI2lmIF9f cmlzY3ZfeGxlbiA9PSA2NAorIyBkZWZpbmUgU0JJX01NUFRfTU9ERV9TTU1QVDQzCTFVTAorIyBk ZWZpbmUgU0JJX01NUFRfTU9ERV9TTU1QVDUyCTJVTAorIyBkZWZpbmUgU0JJX01NUFRfTU9ERV9T TU1QVDY0CTNVTAorI2Vsc2UKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU01NUFQzNAkxVUwKKyNl bmRpZgorCisvKgorICogc2JpX21tcHRfZW5jb2RlKCkg4oCUIGFzc2VtYmxlIHRoZSBmdWxsIG1t cHQgQ1NSIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21tcHRf ZW5jb2RlKHUzMiBtb2RlLCB1MzIgc2RpZCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgcHBuKQor eworCXJldHVybiAoKCh1bnNpZ25lZCBsb25nKW1vZGUgPDwgU0JJX01NUFRfTU9ERV9TSElGVCkg JiBTQklfTU1QVF9NT0RFX01BU0spIHwKKwkgICAgICAgKCgodW5zaWduZWQgbG9uZylzZGlkIDw8 IFNCSV9NTVBUX1NESURfU0hJRlQpICYgU0JJX01NUFRfU0RJRF9NQVNLKSB8CisJICAgICAgIChw cG4gJiBTQklfTU1QVF9QUE5fTUFTSyk7Cit9CisKKy8qCisgKiBNUFRFIGJpdCBkZWZpbml0aW9u cworICovCisjZGVmaW5lIFNCSV9NUFRFX1YJCSgxVUwgPDwgMCkKKyNkZWZpbmUgU0JJX01QVEVf TAkJKDFVTCA8PCAxKQorI2RlZmluZSBTQklfTVBURV9OCQkoMVVMIDw8IDIpCisjZGVmaW5lIFNC SV9NUFRFX1BQTl9TSElGVAkxMFUKKyNkZWZpbmUgU0JJX01QVF9QQUdFX1NISUZUCTEyVQorI2Rl ZmluZSBTQklfTVBUX1BBR0VfU0laRQk0MDk2VUwKKyNkZWZpbmUgU0JJX01QVF9QQUdFX01BU0sJ KFNCSV9NUFRfUEFHRV9TSVpFIC0gMVVMKQorI2RlZmluZSBTQklfTVBURV9YV1JfQkFTRQk4VQor I2RlZmluZSBTQklfTVBURV9YV1JfV0lEVEgJM1UKKyNkZWZpbmUgU0JJX01QVEVfWFdSX01BU0sJ N1VMCisKK3N0YXRpYyBpbmxpbmUgdTMyIHNiaV9tcHRlX3h3cl9zaGlmdCh1MzIgbikKK3sKKwly ZXR1cm4gKFNCSV9NUFRFX1hXUl9CQVNFICsgbiAqIFNCSV9NUFRFX1hXUl9XSURUSCk7Cit9CisK K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzYmlfbXB0ZV9sZWFmX3NldF94d3IodW5zaWdu ZWQgbG9uZyBtcHRlLAorCQkJCQkJICAgIHUzMiBuLCB1OCB4d3IpCit7CisJdTMyIHNoID0gc2Jp X21wdGVfeHdyX3NoaWZ0KG4pOworCisJbXB0ZSAmPSB+KFNCSV9NUFRFX1hXUl9NQVNLIDw8IHNo KTsKKwltcHRlIHw9ICh4d3IgJiBTQklfTVBURV9YV1JfTUFTSykgPDwgc2g7CisJcmV0dXJuIG1w dGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzYmlfbXB0ZV9ub25sZWFmKHVu c2lnbmVkIGxvbmcgdGFibGVfcGEpCit7CisJcmV0dXJuICgoKHRhYmxlX3BhID4+IFNCSV9NUFRf UEFHRV9TSElGVCkgPDwgU0JJX01QVEVfUFBOX1NISUZUKQorCSAgICAgICB8IFNCSV9NUFRFX1Yp OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21wdGVfbm9ubGVhZl90YWJs ZV9wYSh1bnNpZ25lZCBsb25nIG1wdGUpCit7CisJcmV0dXJuICgobXB0ZSA+PiBTQklfTVBURV9Q UE5fU0hJRlQpIDw8IFNCSV9NUFRfUEFHRV9TSElGVCk7Cit9CisKKy8qCisgKiBYV1IgcGVybWlz c2lvbiBjb25zdGFudHMgKFhXUj0wMDAgbWVhbnMgbm8gYWNjZXNzKQorICovCisjZGVmaW5lIFNC SV9NUFRfUEVSTV9OT05FCTBVCisjZGVmaW5lIFNCSV9NUFRfUEVSTV9SCQkxVQorI2RlZmluZSBT QklfTVBUX1BFUk1fVwkJMlUKKyNkZWZpbmUgU0JJX01QVF9QRVJNX1gJCTRVCisjZGVmaW5lIFNC SV9NUFRfUEVSTV9SVwkJKFNCSV9NUFRfUEVSTV9SIHwgU0JJX01QVF9QRVJNX1cpCisjZGVmaW5l IFNCSV9NUFRfUEVSTV9SWAkJKFNCSV9NUFRfUEVSTV9SIHwgU0JJX01QVF9QRVJNX1gpCisjZGVm aW5lIFNCSV9NUFRfUEVSTV9SV1gJKFNCSV9NUFRfUEVSTV9SIHwgU0JJX01QVF9QRVJNX1cgfCBT QklfTVBUX1BFUk1fWCkKKworLyoKKyAqIFNESUQgY29uc3RhbnRzCisgKi8KKyNkZWZpbmUgU0JJ X01QVF9TRElETUFYCQk2VQorI2RlZmluZSBTQklfTVBUX01BWF9ET01BSU5TCSgxVUwgPDwgU0JJ X01QVF9TRElETUFYKQorI2RlZmluZSBTQklfTVBUX1NESURfSU5WQUxJRAlTQklfTVBUX01BWF9E T01BSU5TCisKKy8qCisgKiBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTjogTnVtYmVyIG9mIHJl Z2lvbnMgYSBkb21haW4gbWF5IGhhdmUKKyAqIFVzZWQgZm9yIHRyYWNraW5nIG9mIHJlZ2lvbnMK KyAqLworI2RlZmluZSBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTiAgMzJVCisKKy8qCisgKiBT TVNESUQgbWZlbmNlIGFuZCBtaW52YWwgcmF3IGVuY29kaW5ncworICoKKyAqIFItdHlwZSwgb3Bj b2RlPVNZU1RFTSgweDczKSwgZnVuY3QzPTAsIHJkPXgwLCByczE9UEFERFIsIHJzMj1TRElECisg KiBtZmVuY2UucGEgZnVuY3Q3PTB4MTkgLT4gMHgzMjAwMDA3MyB3aGVyZSByczE9cnMyPXgwCisg KiBtaW52YWwucGEgZnVuY3Q3PTB4MWIgLT4gMHgzNjAwMDA3MyB3aGVyZSByczE9cnMyPXgwCisg KgorICogLmluc24gciBvcGNvZGUsIGZ1bmMzLCBmdW5jNywgcmQsIHJzMSwgcnMyCisgKi8KKyNk ZWZpbmUgU0JJX01QVF9NRkVOQ0VfUEEocnMxLCByczIpCSIuaW5zbiByIDB4NzMsIDAsIDB4MTks IHgwLCAiIHJzMSAiLCAiIHJzMgorCisjZGVmaW5lIFNCSV9NUFRfTUlOVkFMX1BBKHJzMSwgcnMy KQkiLmluc24gciAweDczLCAwLCAweDFiLCB4MCwgIiByczEgIiwgIiByczIKKworLyoKKyAqIEZl bmNlIGFuZCBpbnZhbGlkYXRpb24gaGVscGVycworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2Jp X21wdF9mZW5jZV9hbGwodm9pZCkKK3sKKwlfX2FzbV9fIHZvbGF0aWxlKFNCSV9NUFRfTUZFTkNF X1BBKCJ4MCIsICJ4MCIpIDo6OiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBz YmlfbXB0X2ZlbmNlX3NkaWQodTMyIHNkaWQpCit7CisJdW5zaWduZWQgbG9uZyBzID0gKHVuc2ln bmVkIGxvbmcpc2RpZCAmIChTQklfTVBUX01BWF9ET01BSU5TIC0gMVVMKTsKKworCV9fYXNtX18g dm9sYXRpbGUoU0JJX01QVF9NRkVOQ0VfUEEoIngwIiwgIiUwIikgOjogInIiKHMpIDogIm1lbW9y eSIpOworfQorCisvKgorICogcnMxPXBhZGRyIGFuZCByczI9eDAKKyAqLworc3RhdGljIGlubGlu ZSB2b2lkIHNiaV9tcHRfbWZlbmNlX2FkZHIodW5zaWduZWQgbG9uZyBwYWRkcikKK3sKKwlfX2Fz bV9fIHZvbGF0aWxlKFNCSV9NUFRfTUZFTkNFX1BBKCIlMCIsICJ4MCIpIDo6ICJyIihwYWRkcikg OiAibWVtb3J5Iik7Cit9CisKKy8qCisgKiByczE9cGFkZHIgYW5kIHJzMj1zZGlkCisgKi8KK3N0 YXRpYyBpbmxpbmUgdm9pZCBzYmlfbXB0X21mZW5jZV9wYSh1bnNpZ25lZCBsb25nIHBhZGRyLCB1 MzIgc2RpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHMgPSAodW5zaWduZWQgbG9uZylzZGlkICYgKFNC SV9NUFRfTUFYX0RPTUFJTlMgLSAxVUwpOworCisJX19hc21fXyB2b2xhdGlsZShTQklfTVBUX01G RU5DRV9QQSgiJTAiLCAiJTEiKQorCQkJIDo6ICJyIihwYWRkciksICJyIihzKSA6ICJtZW1vcnki KTsKK30KKworLyoKKyAqIHJzMT0wIGFuZCByczI9MAorICovCitzdGF0aWMgaW5saW5lIHZvaWQg c2JpX21wdF9taW52YWxfYWxsKHZvaWQpCit7CisJLyogUHJpb3Igc3RvcmVzIGdsb2JhbGx5IHZp c2libGUgYmVmb3JlIGludmFsaWRhdGlvbiAqLworCV9fYXNtX18gdm9sYXRpbGUoInNmZW5jZS53 LmludmFsIiA6OjogIm1lbW9yeSIpOworCV9fYXNtX18gdm9sYXRpbGUoU0JJX01QVF9NSU5WQUxf UEEoIngwIiwgIngwIikgOjo6ICJtZW1vcnkiKTsKKwkvKiBJbnZhbGlkYXRpb24gY29tcGxldGVz IGJlZm9yZSBzdWJzZXF1ZW50IGltcGxpY2l0IGFjY2Vzc2VzICovCisJX19hc21fXyB2b2xhdGls ZSgic2ZlbmNlLmludmFsLmlyIiA6OjogIm1lbW9yeSIpOworfQorCisvKgorICogcnMxPXBhZGRy IGFuZCByczI9c2RpZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2JpX21wdF9taW52YWxfc2Rp ZCh1bnNpZ25lZCBsb25nIHBhLCB1MzIgc2RpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHMgPSAodW5z aWduZWQgbG9uZylzZGlkICYgKFNCSV9NUFRfTUFYX0RPTUFJTlMgLSAxVUwpOworCisJX19hc21f XyB2b2xhdGlsZSgic2ZlbmNlLncuaW52YWwiIDo6OiAibWVtb3J5Iik7CisJX19hc21fXyB2b2xh dGlsZShTQklfTVBUX01JTlZBTF9QQSgiJTAiLCAiJTEiKQorCQkJIDo6ICJyIihwYSksICJyIihz KSA6ICJtZW1vcnkiKTsKKwlfX2FzbV9fIHZvbGF0aWxlKCJzZmVuY2UuaW52YWwuaXIiIDo6OiAi bWVtb3J5Iik7Cit9CisKKy8qCisgKiBDb3JlIGRhdGEgc3RydWN0dXJlcworICovCitzdHJ1Y3Qg c2JpX21wdF9yZWdpb24geworCXVuc2lnbmVkIGxvbmcJcGE7CisJdW5zaWduZWQgbG9uZwlzaXpl OworCXU4CQl4d3I7CisJLyogcmVnaW9uIGlzIGxvY2tlZCBhbmQgZGVueSBtb2RpZmljYXRpb24g dmlhIGFkZC9yZW1vdmVfcmVnaW9uICovCisJYm9vbAkJbG9ja2VkOworCS8qIG1hcHBlZCBpbnRv IG1vcmUgdGhhbiBvbmUgZG9tYWluICovCisJYm9vbAkJc2hhcmVkOworfTsKKworLyoKKyAqIHN0 cnVjdCBzYmlfbXB0X21vZGUg4oCUIFNNTVBUIG1vZGUgZGVzY3JpcHRpb24uCisgKi8KK3N0cnVj dCBzYmlfbXB0X21vZGUgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdTMyCQltb2RlX3ZhbDsKKwor CS8qIEFzc2VtYmxlIHRoZSBNTVBUIENTUiB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcJKCplbmNv ZGVfbW1wdCkodW5zaWduZWQgbG9uZyBwcG4sIHUzMiBzZGlkKTsKKworCS8qIG1hcCBhIHJhbmdl IGluIE1QVCB0YWJsZSAqLworCWludAkJKCptYXBfcmFuZ2UpKHN0cnVjdCBzYmlfbXB0X2RvbWFp biAqZG9tLAorCQkJdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4d3Ip OworCisJLyogbnVtYmVyIGJ5dGVzIGZvciByb290IHRhYmxlIGFsbG9jYXRpb24gKi8KKwl1bnNp Z25lZCBsb25nCSgqcm9vdF90YWJsZV9zaXplKSh2b2lkKTsKKworCS8qIHJlcXVpcmVkIHJvb3Qg dGFibGUgcGh5c2ljYWwgYWRkcmVzcyBhbGlnbm1lbnQgKi8KKwl1bnNpZ25lZCBsb25nCSgqcm9v dF90YWJsZV9hbGlnbikodm9pZCk7CisKKwkvKiBjaGVjayBpZiBbcGEscGErc2l6ZV0gZml0cyBp biBzbW1wdCBtb2RlIHN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlICovCisJYm9vbAkJKCpwYV9pbl9y YW5nZSkodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworCS8qIG1hcCBm dWxsIHJhbmdlIG9mIGFkZHJlc3Mgc3BhY2Ugd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZSBtb2Rl ICovCisJaW50CQkoKm1hcF9mdWxsX3JhbmdlKShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwg dTggeHdyKTsKKworCS8qIHJlYWQgdGhlIHh3ciBmb3IgYSBQQSAqLworCXU4CQkoKmdldF94d3Ip KHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1bnNpZ25lZCBsb25nIHBhKTsKK307CisKK3N0 cnVjdCBzYmlfbXB0X2RvbWFpbiB7CisJdTMyCQkJc2RpZDsKKwlib29sCQkJdmFsaWQ7CisJdW5z aWduZWQgbG9uZwkJcm9vdF9wYTsKKwlzdHJ1Y3Qgc2JpX21wdF9tb2RlCSptb2RlOworCXN0cnVj dCBzYmlfZG9tYWluCSpzYmlfZG9tOworCXVuc2lnbmVkIGludAkJbnJlZ2lvbnM7CisJc3RydWN0 IHNiaV9tcHRfcmVnaW9uCXJlZ2lvbnNbU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU5dOworCXNw aW5sb2NrX3QJCWxvY2s7Cit9OworCisvKgorICogc3RydWN0IHNiaV9tcHRfY3RybCDigJQgUkRT TSBNUFQgc3RhdGUKKyAqLworc3RydWN0IHNiaV9tcHRfY3RybCB7CisJYm9vbAkJCXJlYWR5Owor CXN0cnVjdCBzYmlfbXB0X21vZGUJKm1vZGU7CisJLyogZGV0ZWN0ZWQgc2RpZGxlbiBmcm9tIG1t cHQgcHJvYmUgKi8KKwl1MzIJCQlzZGlkX2xlbjsKKwkvKiAyXnNkaWRfbGVuIOKAlCBydW50aW1l IGxpbWl0IGZvciBhbGwgZG9tYWluIG9wZXJhdGlvbnMgKi8KKwl1MzIJCQltYXhfZG9tYWluczsK Kwl1bnNpZ25lZCBsb25nCQlmd19wYTsKKwl1bnNpZ25lZCBsb25nCQlmd19zaXplOworCXN0cnVj dCBzYmlfbXB0X2RvbWFpbglkb21haW5zW1NCSV9NUFRfTUFYX0RPTUFJTlNdOworCXUzMgkJCW5k b21haW47CisJLyogc2RpZCBvZmZzZXQgaW4gc2NyYXRjaCAqLworCXVuc2lnbmVkIGxvbmcJCXNk aWRfb2Zmc2V0OworCS8qIGJpdG1hcCB0byB0cmFjayBhc3NpZ25lZC9mcmVlIFNESUQgKGJpdCBO IHNldCA9IFNESUQgTiBmcmVlKSAqLworCURFQ0xBUkVfQklUTUFQKHNkaWRfYml0bWFwLCBTQklf TVBUX01BWF9ET01BSU5TKTsKK307CisKK3N0cnVjdCBzYmlfbXB0X2N0cmwgKnNiaV9tcHRfY3Ry bF9nZXQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNiaV9tcHRfdGhpc2hhcnRfc2RpZCh2 b2lkKQoreworCXN0cnVjdCBzYmlfbXB0X2N0cmwgKmN0cmwgPSBzYmlfbXB0X2N0cmxfZ2V0KCk7 CisJdTMyICpwOworCisJaWYgKCFjdHJsLT5yZWFkeSB8fCAhY3RybC0+c2RpZF9vZmZzZXQpCisJ CXJldHVybiAodTMyKVNCSV9NUFRfU0RJRF9JTlZBTElEOworCXAgPSBzYmlfc2NyYXRjaF9vZmZz ZXRfcHRyKHNiaV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpLAorCQkJCSAgIGN0cmwtPnNkaWRfb2Zm c2V0KTsKKwlyZXR1cm4gKnA7Cit9CisKKy8qCisgKiBEb21haW4gY3JlYXRpb24gY29uZmlnCisg KgorICogc2JpX2RvbSBhbmQgcmVnaW9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICogd2hl biBhIHN1cGVydmlzb3IgZG9tYWluIGlzIGJhY2tlZCBieSBhIFNCSSBkb21haW4KKyAqIHRoZW4g dGhlIHJlZ2lvbnMgbGlzdCBhbmQgYWNjZXNzIHBlcm1pc3Npb25zIGFyZSBkZXJpdmVkCisgKiBm cm9tIHRoZSBTQkkgZG9tYWluIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBzYmlfbXB0X2RvbWFp bl9jb25maWcgeworCS8qIFNCSSBkb21haW4gd2hvc2UgUy9VIG1lbXJlZ2lvbnMgYXJlIG1hcHBl ZC4gKi8KKwlzdHJ1Y3Qgc2JpX2RvbWFpbgkqc2JpX2RvbTsKKwkvKiBwZXJtaXNzaW9uIGZvciBy ZWdpb25zIGluaGVyaXRlZCBmcm9tIHNiaV9kb20gKi8KKwl1OAkJCXh3cjsKKwkvKiBwcm90ZWN0 IGZpcm13YXJlIHJlZ2lvbnMgZm9yIHRoZSBkb21haW4gKi8KKwlib29sCQkJZndfcHJvdGVjdDsK KwkvKgorCSAqIGV4cGxpY2l0IHJlZ2lvbiBsaXN0IG1hcHBlZCBpbiBNUFQgdGFibGUuCisJICog TlVMTCB3aGVuIHNiaV9kb20gY292ZXJzIGV2ZXJ5dGhpbmcKKwkgKi8KKwlzdHJ1Y3Qgc2JpX21w dF9yZWdpb24JKnJlZ2lvbnM7CisJdTMyCQkJbnJlZ2lvbnM7Cit9OworCitpbnQgc2JpX21wdF9p bml0KHZvaWQpOworCitpbnQgc2JpX21wdF9kb21haW5fY3JlYXRlKGNvbnN0IHN0cnVjdCBzYmlf bXB0X2RvbWFpbl9jb25maWcgKmNmZywgdTMyICpvdXRfc2RpZCk7CisKK2ludCBzYmlfbXB0X2Rv bWFpbl9hZGRfcmVnaW9uKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25n IHNpemUsIHU4IHh3cik7CisKK2ludCBzYmlfbXB0X2RvbWFpbl9yZW1vdmVfcmVnaW9uKHUzMiBz ZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitpbnQgc2JpX21w dF9zaGFyZV9yZWdpb24odTMyIHNyY19zZGlkLCB1MzIgZHN0X3NkaWQsIHVuc2lnbmVkIGxvbmcg cGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggZHN0X3h3cik7CisKK2ludCBzYmlfbXB0X3Vuc2hh cmVfcmVnaW9uKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUp OworCitpbnQgc2JpX21wdF9oYXJ0X2FjdGl2YXRlKHUzMiBzZGlkKTsKKworaW50IHNiaV9tcHRf aGFydF9hY3RpdmF0ZV9mb3JfZG9tYWluKHN0cnVjdCBzYmlfZG9tYWluICpzYmlfZG9tKTsKKwor c3RydWN0IHNiaV9tcHRfZG9tYWluICpzYmlfbXB0X2RvbWFpbl9nZXQodTMyIHNkaWQpOworCit1 bnNpZ25lZCBsb25nIHNiaV9tcHRfcG9vbF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2ln bmVkIGxvbmcgYWxpZ24pOworCit2b2lkIHNiaV9tcHRfc2RpZF9mcmVlKHUzMiBzZGlkKTsKKwor aW50IHNiaV9tcHRfcXVlcnlfYWNjZXNzKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1OCAq b3V0X3h3cik7CisKK3ZvaWQgc2JpX21wdF9kdW1wKHZvaWQpOworCisjZW5kaWYgLyogX19TQklf TVBUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbGliL3NiaS9vYmplY3RzLm1rIGIvbGliL3NiaS9vYmpl Y3RzLm1rCmluZGV4IGMyOWM4ODhmLi4zYjNjM2VhMyAxMDA2NDQKLS0tIGEvbGliL3NiaS9vYmpl Y3RzLm1rCisrKyBiL2xpYi9zYmkvb2JqZWN0cy5tawpAQCAtMTA4LDMgKzEwOCw1IEBAIGxpYnNi aS1vYmpzLXkgKz0gc2JpX2V4cGVjdGVkX3RyYXAubwogbGlic2JpLW9ianMteSArPSBzYmlfY3Bw Yy5vCiBsaWJzYmktb2Jqcy0kKENDX1NVUFBPUlRfVkVDVE9SKSArPSBzYmlfdmVjdG9yLm8KIGxp YnNiaS1vYmpzLXkgKz0gc2JpX2ZwLm8KK2xpYnNiaS1vYmpzLXkgKz0gc2JpX21wdC5vCitsaWJz Ymktb2Jqcy15ICs9IHNiaV9tcHRfbW9kZS5vCmRpZmYgLS1naXQgYS9saWIvc2JpL3NiaV9tcHQu YyBiL2xpYi9zYmkvc2JpX21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw Li4zMDZmODJkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zYmkvc2JpX21wdC5jCkBAIC0wLDAg KzEsOTI2IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNlCisgKgor ICogQ29weXJpZ2h0IChjKSAyMDI2IFF1YWxjb21tIEluYy4KKyAqCisgKiBBdXRob3JzOiBSYWh1 bCBQYXRoYWsgPHJhaHVsLnBhdGhha0Bvc3MucXVhbGNvbW0uY29tPgorICovCisKKyNpbmNsdWRl IDxzYmkvc2JpX21wdC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfZG9tYWluLmg+CisjaW5jbHVkZSA8 c2JpL3NiaV9lcnJvci5oPgorI2luY2x1ZGUgPHNiaS9zYmlfaGFydC5oPgorI2luY2x1ZGUgPHNi aS9zYmlfaGVhcC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfc2NyYXRjaC5oPgorI2luY2x1ZGUgPHNi aS9zYmlfc3RyaW5nLmg+CisjaW5jbHVkZSA8c2JpL3NiaV9jb25zb2xlLmg+CisjaW5jbHVkZSA8 c2JpL3Jpc2N2X2xvY2tzLmg+CisjaW5jbHVkZSA8c2JpL3Jpc2N2X2FzbS5oPgorCitzdGF0aWMg c3RydWN0IHNiaV9tcHRfY3RybCBtcHRfY3RybDsKKworc3RydWN0IHNiaV9tcHRfY3RybCAqc2Jp X21wdF9jdHJsX2dldCh2b2lkKQoreworCXJldHVybiAmbXB0X2N0cmw7Cit9CisKK3N0cnVjdCBz YmlfbXB0X2RvbWFpbiAqc2JpX21wdF9kb21haW5fZ2V0KHUzMiBzZGlkKQoreworCXN0cnVjdCBz YmlfbXB0X2RvbWFpbiAqc2Q7CisKKwlpZiAoc2RpZCA+PSBtcHRfY3RybC5tYXhfZG9tYWlucykK KwkJcmV0dXJuIE5VTEw7CisKKwlzZCA9IG1wdF9jdHJsLmRvbWFpbnNbc2RpZF0udmFsaWQgPyAm bXB0X2N0cmwuZG9tYWluc1tzZGlkXSA6IE5VTEw7CisKKwlyZXR1cm4gc2Q7Cit9CisKKy8qIE1l bW9yeSBhbGxvY2F0b3IgZm9yIE1QVCB0YWJsZXMgZnJvbSBoZWFwICovCit1bnNpZ25lZCBsb25n IHNiaV9tcHRfcG9vbF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxp Z24pCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSAodW5zaWduZWQgbG9uZylzYmlfYWxpZ25lZF9h bGxvYyhhbGlnbiwgc2l6ZSk7CisKKwlpZiAoIXB0cikgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0 OiBhbGxvYyBmYWlsZWQgKHNpemU9MHglbHggYWxpZ249MHglbHgpXG4iLAorCQkJICAgc2l6ZSwg YWxpZ24pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNUFQgdGFibGVzIG11c3QgYmUgemVyb2Vk IHRvIG1hcmsgdGhlbSBpbnZhbGlkIChtcHRlLlYgPSAwKSAqLworCXNiaV9tZW1zZXQoKHZvaWQg KilwdHIsIDAsIHNpemUpOworCisJcmV0dXJuIHB0cjsKK30KKworLyogQ2hlY2sgaWYgdHdvIHJl Z2lvbnMgb3ZlcmxhcCAqLworc3RhdGljIGJvb2wgcmVnaW9uc19vdmVybGFwKHVuc2lnbmVkIGxv bmcgcGExLCB1bnNpZ25lZCBsb25nIHNpemUxLAorCQkJICAgdW5zaWduZWQgbG9uZyBwYTIsIHVu c2lnbmVkIGxvbmcgc2l6ZTIpCit7CisJcmV0dXJuIChwYTEgPCBwYTIgKyBzaXplMikgJiYgKHBh MiA8IHBhMSArIHNpemUxKTsKK30KKworLyogQ2hlY2sgaWYgYSByZWdpb24gaXMgY29tcGxldGVs eSBjb250YWluZWQgaW5zaWRlIGFub3RoZXIgcmVnaW9uICovCitzdGF0aWMgYm9vbCByZWdpb25f Y29udGFpbmVkKHVuc2lnbmVkIGxvbmcgY2hpbGRfcGEsIHVuc2lnbmVkIGxvbmcgY2hpbGRfc2l6 ZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9wYSwgdW5zaWduZWQgbG9uZyBwYXJlbnRf c2l6ZSkKK3sKKwlyZXR1cm4gKGNoaWxkX3BhID49IHBhcmVudF9wYSkgJiYKKwkgICAgICAgKGNo aWxkX3BhICsgY2hpbGRfc2l6ZSA8PSBwYXJlbnRfcGEgKyBwYXJlbnRfc2l6ZSk7Cit9CisKKy8q CisgKiBDaGVjayBpZiBhIHJlZ2lvbiBbcGEsIHBhK3NpemVdIG92ZXJsYXBzIHdpdGggYW55IG1h cHBlZAorICogcmVnaW9uIHdoaWNoIGlzIGxvY2tlZAorICovCitzdGF0aWMgYm9vbCByZWdpb25f b3ZlcmxhcHNfbG9ja2VkKGNvbnN0IHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAg IHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQg aTsKKworCWZvciAoaSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBpKyspCisJCWlmIChkb20tPnJl Z2lvbnNbaV0ubG9ja2VkICYmCisJCSAgICByZWdpb25zX292ZXJsYXAocGEsIHNpemUsIGRvbS0+ cmVnaW9uc1tpXS5wYSwgZG9tLT5yZWdpb25zW2ldLnNpemUpKQorCQkJcmV0dXJuIHRydWU7CisJ cmV0dXJuIGZhbHNlOworfQorCisvKiBQcm9iZSBTRElETEVOIGZyb20gdGhlIG1tcHQgQ1NSLiAq Lworc3RhdGljIHUzMiBwcm9iZV9zZGlkbGVuKHUzMiBtb2RlX3ZhbCkKK3sKKwl1bnNpZ25lZCBs b25nIHNhdmVkLCBzZGlkX3ZhbDsKKwl1MzIgc2RpZGxlbiA9IDA7CisKKwlzYXZlZCA9IGNzcl9y ZWFkKFNCSV9DU1JfTU1QVCk7CisKKwkvKiBQcm9ncmFtIGEgbGVnYWwgbm9uLUJhcmUgTU9ERSB3 aXRoIGFsbC1vbmVzIGluIHRoZSBTRElEIGZpZWxkICovCisJY3NyX3dyaXRlKFNCSV9DU1JfTU1Q VCwKKwkJICAoKCh1bnNpZ25lZCBsb25nKW1vZGVfdmFsIDw8IFNCSV9NTVBUX01PREVfU0hJRlQp ICYgU0JJX01NUFRfTU9ERV9NQVNLKSB8CisJCSAgU0JJX01NUFRfU0RJRF9NQVNLKTsKKworCXNk aWRfdmFsID0gKGNzcl9yZWFkKFNCSV9DU1JfTU1QVCkgJiBTQklfTU1QVF9TRElEX01BU0spID4+ IFNCSV9NTVBUX1NESURfU0hJRlQ7CisKKwl3aGlsZSAoc2RpZF92YWwpIHsKKwkJc2RpZGxlbiAr PSAxOworCQlzZGlkX3ZhbCA+Pj0gMTsKKwl9CisKKwlpZiAoc2RpZGxlbiA+IFNCSV9NUFRfU0RJ RE1BWCkKKwkJc2RpZGxlbiA9IFNCSV9NUFRfU0RJRE1BWDsKKworCWNzcl93cml0ZShTQklfQ1NS X01NUFQsIHNhdmVkKTsKKworCXJldHVybiBzZGlkbGVuOworfQorCisjaWYgX19yaXNjdl94bGVu ID09IDY0CitleHRlcm4gc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDQzX21vZGU7CitleHRlcm4g c3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDUyX21vZGU7CitleHRlcm4gc3RydWN0IHNiaV9tcHRf bW9kZSBzbW1wdDY0X21vZGU7CisjZWxzZQorZXh0ZXJuIHN0cnVjdCBzYmlfbXB0X21vZGUgc21t cHQzNF9tb2RlOworI2VuZGlmCisKK3N0YXRpYyBib29sIHByb2JlX21vZGUodTMyIG1vZGVfdmFs KQoreworCXUzMiBtOworCWNzcl93cml0ZShTQklfQ1NSX01NUFQsCisJCSAgKCh1bnNpZ25lZCBs b25nKW1vZGVfdmFsIDw8IFNCSV9NTVBUX01PREVfU0hJRlQpICYgU0JJX01NUFRfTU9ERV9NQVNL KTsKKworCW0gPSAoY3NyX3JlYWQoU0JJX0NTUl9NTVBUKSAmIFNCSV9NTVBUX01PREVfTUFTSykg Pj4gU0JJX01NUFRfTU9ERV9TSElGVDsKKworCXJldHVybiAobSA9PSBtb2RlX3ZhbCk7Cit9CisK KworLyoKKyAqIFByb2JlIFNNTVBUIG1vZGUgYW5kIGluaXRpYWxpemUgdGhlIHJlbGF0ZWQgbW9k ZSBvcHMKKyAqCisgKiBEZWxpYmVyYXRlbHkgcHJlZmVyIGNvdmVyYWdlIG92ZXIgbGF0ZW5jeSwg YmVjYXVzZSBsYXRlbmN5IGNhbiBiZQorICogaW1wcm92ZWQgYnkgdGhlIE1QVCBjYWNoZSB3aGlj aCBoYXJkd2FyZSBtYXkgaW1wbGVtZW50IGJ1dCB0aGUKKyAqIGNvdmVyYWdlIGlzIG5vdC4gU28g cGljayB0aGUgd2lkZXN0IG1vZGUgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogaGFyZHdh cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2JpX21wdF9tb2RlICppbml0X21wdF9tb2RlKHUzMiAq b3V0X21vZGVfdmFsKQoreworCXVuc2lnbmVkIGxvbmcgc2F2ZWQgPSBjc3JfcmVhZChTQklfQ1NS X01NUFQpOworCXN0cnVjdCBzYmlfbXB0X21vZGUgKnMgPSBOVUxMOworCXUzMiBtb2RlX3ZhbCA9 IDA7CisKKyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKwlpZiAocHJvYmVfbW9kZShTQklfTU1QVF9N T0RFX1NNTVBUNjQpKSB7CisJCXMgPSAmc21tcHQ2NF9tb2RlOworCQltb2RlX3ZhbCA9IFNCSV9N TVBUX01PREVfU01NUFQ2NDsKKwl9IGVsc2UgaWYgKHByb2JlX21vZGUoU0JJX01NUFRfTU9ERV9T TU1QVDUyKSkgeworCQlzID0gJnNtbXB0NTJfbW9kZTsKKwkJbW9kZV92YWwgPSBTQklfTU1QVF9N T0RFX1NNTVBUNTI7CisJfSBlbHNlIGlmIChwcm9iZV9tb2RlKFNCSV9NTVBUX01PREVfU01NUFQ0 MykpIHsKKwkJcyA9ICZzbW1wdDQzX21vZGU7CisJCW1vZGVfdmFsID0gU0JJX01NUFRfTU9ERV9T TU1QVDQzOworCX0KKyNlbHNlCisJaWYgKHByb2JlX21vZGUoU0JJX01NUFRfTU9ERV9TTU1QVDM0 KSkgeworCQlzID0gJnNtbXB0MzRfbW9kZTsKKwkJbW9kZV92YWwgPSBTQklfTU1QVF9NT0RFX1NN TVBUMzQ7CisJfQorI2VuZGlmCisKKwljc3Jfd3JpdGUoU0JJX0NTUl9NTVBULCBzYXZlZCk7CisK KwlpZiAob3V0X21vZGVfdmFsKQorCQkqb3V0X21vZGVfdmFsID0gbW9kZV92YWw7CisKKwlyZXR1 cm4gczsKK30KKworLyoKKyAqIG1wdF9tYXBfcmFuZ2VfcGVybSgpOiBNYXBzIFtwYSwgcGErc2l6 ZV0gcmVnaW9uIGludG8gc3VwZXJ2aXNvciBkb21haW4gTVBUIHRhYmxlCisgKiB3aXRoIGl0cyBh Y2Nlc3MgcGVybWlzc2lvbnMoeHdyKS4KKyAqCisgKiBsb2NrZWQ9dHJ1ZTogbWVhbnMgZW50cnkg aXMgaW1tdXRhYmxlIGFuZCBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuIFVzZWQgZm9yCisgKiBmaXJt d2FyZSBkZW55LWFsbCBhbmQgb3RoZXIgc3VjaCByZWdpb25zIGZvciBwZXJtYW5lbmV0IGFjY2Vz cyBwb2xpY3kuCisgKgorICogbG9ja2VkPWZhbHNlOiByZWdpb24gZW50cnkgaXMgbW9kaWZpYWJs ZSBhdCBydW50aW1lIHZpYSBhZGQvcmVtb3ZlX3JlZ2lvbi4KKyAqIFVzZWQgZm9yIFMvVS1tb2Rl IGFjY2Vzc2libGUgZG9tYWluIHJlZ2lvbnMuCisgKi8KKworc3RhdGljIGludCBtcHRfbWFwX3Jh bmdlX3Blcm0oc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sIHN0cnVjdCBzYmlfbXB0X21vZGUg KnNjaCwKKwkJCSAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4d3Is IGJvb2wgbG9ja2VkKQoreworCWludCByYzsKKwlib29sIGZpcnN0X2luX3JhbmdlOworCisJaWYg KCFzaXplKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IGludmFsaWQgc2l6ZSBmb3IgcmFuZ2Ug MHglbHhcbiIsIHBhKTsKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisJfQorCisJaWYgKChwYSAmIFNC SV9NUFRfUEFHRV9NQVNLKSB8fCAoc2l6ZSAmIFNCSV9NUFRfUEFHRV9NQVNLKSkgeworCQlzYmlf cHJpbnRmKCJzYmlfbXB0OiB1bmFsaWduZWQgcmFuZ2UgMHglbHgrMHglbHhcbiIsIHBhLCBzaXpl KTsKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisJfQorCisJaWYgKCFzY2gtPnBhX2luX3JhbmdlKHBh LCBzaXplKSkgeworCQkvKgorCQkgKiBBIHJlZ2lvbiB0aGF0IHBhX2luX3JhbmdlKCkgcmV0dXJu cyBmYWxzZSBmYWxscyBpbnRvIG9uZSBvZiB0d28KKwkJICogZGlmZmVyZW50IGNhc2VzIC0gUEEg d2hpY2ggaXMgb3V0IG9mIHJhbmdlIGZyb20gdGhlIG1hcHBhYmxlCisJCSAqIHJhbmdlIG9mIHRo YXQgbW9kZSBhbmQgc2Vjb25kIGlzIFBBIGlzIGluIHJhbmdlIGJ1dCB0aGUgZW5kCisJCSAqIChw YSArIHNpemUpIGlzIGNyb3NzaW5nIHRoZSBtYXBwYWJsZSByYW5nZS4KKwkJICoKKwkJICogRGlz dGluZ3Vpc2ggdGhlIHR3byBieSBwcm9iaW5nIHBhX2luX3JhbmdlKCkgZm9yIGp1c3QKKwkJICog dGhlIGZpcnN0IHBhZ2UgaW4gdGhhdCBiaWcgcmFuZ2UgYW5kIGlmIGV2ZW4gdGhlIGZpcnN0IHBh Z2UKKwkJICogaXMgb3V0IG9mIHJhbmdlIGl0IGlzIHRoZSBmaXJzdCBjYXNlIGFuZCBpZiB0aGUg YmFzZSBpcyBpbgorCQkgKiByYW5nZSBidXQgdGhlIHdob2xlIHJlZ2lvbiBpcyBub3QsIGl0IGlz IGNhc2UgbGF0ZXIuCisJCSAqLworCQlmaXJzdF9pbl9yYW5nZSA9IHNjaC0+cGFfaW5fcmFuZ2Uo cGEsIFNCSV9NUFRfUEFHRV9TSVpFKTsKKworCQlpZiAobG9ja2VkKSB7CisJCQlzYmlfcHJpbnRm KCJzYmlfbXB0OiBsb2NrZWQgcmVnaW9uIDB4JWx4KzB4JWx4IG91dCBvZiBtb2RlIHJhbmdlXG4i LAorCQkJCSAgIHBhLCBzaXplKTsKKwkJCXJldHVybiBTQklfRUlOVkFMOworCQl9CisKKwkJLyog UmVnaW9uIHdpdGggUEEgd2hpY2ggcGFydGlhbGx5IGNyb3Nzb3ZlciB0aGUgbWFwcGFibGUgc3Bh Y2UgKi8KKwkJaWYgKGZpcnN0X2luX3JhbmdlKSB7CisJCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBm YXRhbCByZWdpb24gMHglbHgrMHglbHggY3Jvc3NvdmVyIgorCQkJCSAgICIgbW9kZSAnJXMnIGNl aWxpbmc7IGhpZ2ggcGFydCBtYXkgYWxpYXMiCisJCQkJICAgIiB3aXRoIGxvdyBNUFRFIGVudHJp ZXMg4oCUIG5vdCBtYXBwaW5nIHRoaXMgcmVnaW9uXG4iLAorCQkJCSAgIHBhLCBzaXplLCBzY2gt Pm5hbWUpOworCQkJcmV0dXJuIFNCSV9FSU5WQUw7CisJCX0KKworCQkvKiBSZWdpb24gd2hpY2gg aXMgZW50aXJlbHkgYWJvdmUgdGhlIGNlaWxpbmcg4oCUIHVucmVhY2hhYmxlICovCisJCXNiaV9w cmludGYoInNiaV9tcHQ6IHNraXAgb3V0LW9mLXJhbmdlIDB4JWx4KzB4JWx4IgorCQkJICAgIiAo ZW50aXJlbHkgYWJvdmUgJyVzJyBjZWlsaW5nOyBubyBNUFQgZW50cnksXG4iLAorCQkJICAgcGEs IHNpemUsIHNjaC0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJjID0gc2NoLT5tYXBfcmFu Z2UoZG9tLCBwYSwgc2l6ZSwgeHdyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChk b20tPm5yZWdpb25zID49IFNCSV9NUFRfTUFYX1JFR0lPTlNfRE9NQUlOKQorCQlyZXR1cm4gU0JJ X0VOT01FTTsKKworCWRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXS5wYSA9IHBhOworCWRvbS0+ cmVnaW9uc1tkb20tPm5yZWdpb25zXS5zaXplID0gc2l6ZTsKKwlkb20tPnJlZ2lvbnNbZG9tLT5u cmVnaW9uc10ueHdyID0geHdyOworCWRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXS5sb2NrZWQg PSBsb2NrZWQ7CisJZG9tLT5yZWdpb25zW2RvbS0+bnJlZ2lvbnNdLnNoYXJlZCA9IGZhbHNlOwor CWRvbS0+bnJlZ2lvbnMrKzsKKworCXJldHVybiAwOworfQorCisvKgorICogbXB0X3h3cl9mcm9t X21lbXJlZ2lvbigpOiBkZXJpdmUgYW4gTVBURSBYV1IgZW5jb2RpbmcgZnJvbSBhIFNCSSBkb21h aW4KKyAqIG1lbXJlZ2lvbidzIFMvVSBhY2Nlc3MgZmxhZ3MsIGNsYW1wZWQgYnkgY2FwLgorICoK KyAqIGNhcCBpcyBhbiB1cHBlciBib3VuZCB0aGUgY2FsbGVyIG1heSBpbXBvc2UuIEEgcmVnaW9u IGZyb20gU0JJIGRvbWFpbgorICogbWF5IGhhdmUgbW9yZSBwZXJtaXNzaXZlIGFjY2VzcyBwZXJt aXNzaW9ucyB3aGljaCBhbiBzdXBlcnZpc29yIGRvbWFpbgorICogbWF5IHdhbnQgdG8gcmVzdGlj dCBhbmQgY2FwIHRoZW0uCisgKi8KK3N0YXRpYyB1OCBtcHRfeHdyX2Zyb21fbWVtcmVnaW9uKGNv bnN0IHN0cnVjdCBzYmlfZG9tYWluX21lbXJlZ2lvbiAqbXIsCisJCQkJIHU4IGNhcCkKK3sKKwl1 OCB4d3IgPSBTQklfTVBUX1BFUk1fTk9ORTsKKworCWlmIChtci0+ZmxhZ3MgJiBTQklfRE9NQUlO X01FTVJFR0lPTl9TVV9SRUFEQUJMRSkKKwkJeHdyIHw9IFNCSV9NUFRfUEVSTV9SOworCWlmICht ci0+ZmxhZ3MgJiBTQklfRE9NQUlOX01FTVJFR0lPTl9TVV9XUklUQUJMRSkKKwkJeHdyIHw9IFNC SV9NUFRfUEVSTV9XOworCWlmIChtci0+ZmxhZ3MgJiBTQklfRE9NQUlOX01FTVJFR0lPTl9TVV9F WEVDVVRBQkxFKQorCQl4d3IgfD0gU0JJX01QVF9QRVJNX1g7CisKKwl4d3IgJj0gY2FwOworCisJ LyogWFdSIGVuY29kaW5ncyAwYjAxMCAoVykgYW5kIDBiMTEwIChXWCkgYXJlIHJlc2VydmVkICov CisJaWYgKCh4d3IgJiBTQklfTVBUX1BFUk1fVykgJiYgISh4d3IgJiBTQklfTVBUX1BFUk1fUikp IHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogcmVnaW9uIDB4JWx4OiBXIHdpdGhvdXQgUiBpcyBh IHJlc2VydmVkIgorCQkJICAgIiBYV1IgZW5jb2Rpbmcg4oCUIGRlbnlpbmcgcmVnaW9uXG4iLCBt ci0+YmFzZSk7CisJCXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKKwl9CisKKwlyZXR1cm4geHdy OworfQorCisvKgorICogc2JpX21wdF9kb21haW5fY3JlYXRlKCk6IENyZWF0ZSBhIFN1cGVydmlz b3IgRG9tYWluCisgKi8KK2ludCBzYmlfbXB0X2RvbWFpbl9jcmVhdGUoY29uc3Qgc3RydWN0IHNi aV9tcHRfZG9tYWluX2NvbmZpZyAqY2ZnLAorCQkJICAgdTMyICpvdXRfc2RpZCkKK3sKKwlpbnQg cmM7CisJdTMyIHNkaWQsIGk7CisJdW5zaWduZWQgbG9uZyByb290X3BhOworCXN0cnVjdCBzYmlf bXB0X21vZGUgKnNjaDsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwljb25zdCBzdHJ1 Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb24gKm1yOworCXN0cnVjdCBzYmlfbXB0X2N0cmwgKmN0cmwg PSAmbXB0X2N0cmw7CisJdTggYmFzZV94d3IgPSBTQklfTVBUX1BFUk1fTk9ORTsKKworCWlmICgh Y3RybC0+cmVhZHkpCisJCXJldHVybiBTQklfRU5PREVWOworCisJaWYgKGNmZy0+c2JpX2RvbSAm JiBjZmctPm5yZWdpb25zKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHNiaV9kb20gYW5kIGV4 cGxpY2l0IHJlZ2lvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVxuIik7CisJCXJldHVybiBTQklf RUlOVkFMOworCX0KKworCS8qCisJICogc2RpZF9iaXRtYXAgZW1wdHkgbWVhbnMgZXZlcnkgYXZh aWxhYmxlIFNESUQgaXMKKwkgKiBjdXJyZW50bHkgaW4gdXNlIGFuZCBubyBkb21haW4gY2FuIGJl IGNyZWF0ZWQuCisJICovCisJaWYgKGJpdG1hcF9lbXB0eShjdHJsLT5zZGlkX2JpdG1hcCwgY3Ry bC0+bWF4X2RvbWFpbnMpKQorCQlyZXR1cm4gU0JJX0VOT01FTTsKKworCXNjaCA9IGN0cmwtPm1v ZGU7CisKKwlyb290X3BhID0gc2JpX21wdF9wb29sX2FsbG9jKHNjaC0+cm9vdF90YWJsZV9zaXpl KCksCisJCQkJICAgICBzY2gtPnJvb3RfdGFibGVfYWxpZ24oKSk7CisJaWYgKCFyb290X3BhKSB7 CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IE9PTSByb290IHRhYmxlXG4iKTsKKwkJcmV0dXJuIFNC SV9FTk9NRU07CisJfQorCisJLyoKKwkgKiBSb290IE1QVCBtZW1vcnkgYWxsb2NhdGVkIOKAlCB0 YWtlIFNESUQgZnJvbSBiaXRtYXAgZm9yIHJvb3Qgc3VwZXJ2aXNvcgorCSAqIGRvbWFpbgorCSAq LworCWZvciAoc2RpZCA9IDA7IHNkaWQgPCBjdHJsLT5tYXhfZG9tYWluczsgc2RpZCsrKQorCQlp ZiAoYml0bWFwX3Rlc3QoY3RybC0+c2RpZF9iaXRtYXAsIHNkaWQpKQorCQkJYnJlYWs7CisJYml0 bWFwX2NsZWFyKGN0cmwtPnNkaWRfYml0bWFwLCBzZGlkLCAxKTsKKworCWRvbSA9ICZjdHJsLT5k b21haW5zW3NkaWRdOworCVNQSU5fTE9DS19JTklUKGRvbS0+bG9jayk7CisKKwlkb20tPnNkaWQg PSBzZGlkOworCWRvbS0+dmFsaWQgPSB0cnVlOworCWRvbS0+cm9vdF9wYSA9IHJvb3RfcGE7CisJ ZG9tLT5tb2RlID0gc2NoOworCWRvbS0+c2JpX2RvbSA9IGNmZy0+c2JpX2RvbTsKKwlkb20tPm5y ZWdpb25zID0gMDsKKworCWlmIChjZmctPnNiaV9kb20pIHsKKwkJLyoKKwkJICogU2ltaWxhciB0 byBTQkkgZG9tYWluLCBjcmVhdGUgYSBiYXNlbGluZSB3aGljaAorCQkgKiBtYXBzIHdob2xlIG1h cHBhYmxlIGFkZHJlc3Mgc3BhY2UgYnkgYSBtb2RlIGFuZCBtYXJrIGl0CisJCSAqIHdpdGggWFdS IHBlcm1pc3Npb25zLiBMYXRlciBzZWxlY3RpdmVseSByZXN0cmljdCB0aGUKKwkJICogcGVybWlz c2lvbnMgaW4gYW5vdGhlciBwYXNzLgorCQkgKi8KKwkJc2JpX2RvbWFpbl9mb3JfZWFjaF9tZW1y ZWdpb24oY2ZnLT5zYmlfZG9tLCBtcikgeworCQkJaWYgKG1yLT5vcmRlciA8IHNpemVvZih1bnNp Z25lZCBsb25nKSAqIDgpCisJCQkJY29udGludWU7CisKKwkJCWlmICghKG1yLT5mbGFncyAmIFNC SV9ET01BSU5fTUVNUkVHSU9OX1NVX0FDQ0VTU19NQVNLKSkKKwkJCQljb250aW51ZTsKKworCQkJ YmFzZV94d3IgPSBtcHRfeHdyX2Zyb21fbWVtcmVnaW9uKG1yLCBjZmctPnh3cik7CisJCQlyYyA9 IHNjaC0+bWFwX2Z1bGxfcmFuZ2UoZG9tLCBiYXNlX3h3cik7CisJCQlpZiAocmMpCisJCQkJZ290 byBmYWlsOworCisJCQlpZiAoZG9tLT5ucmVnaW9ucyA8IFNCSV9NUFRfTUFYX1JFR0lPTlNfRE9N QUlOKSB7CisJCQkJc3RydWN0IHNiaV9tcHRfcmVnaW9uICpyID0gJmRvbS0+cmVnaW9uc1tkb20t Pm5yZWdpb25zKytdOworCQkJCXItPnBhID0gMDsKKwkJCQlyLT5zaXplID0gfjBVTCAmIH5TQklf TVBUX1BBR0VfTUFTSzsKKwkJCQlyLT54d3IgPSBiYXNlX3h3cjsKKwkJCQlyLT5sb2NrZWQgPSBm YWxzZTsKKwkJCQlyLT5zaGFyZWQgPSBmYWxzZTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwor CQkvKgorCQkgKiBBbm90aGVyIHBhc3MgdG8gbWFwIGV2ZXJ5IG90aGVyIHJlZ2lvbiB3aGljaCBo YXMgaXRzIG93bgorCQkgKiBwZXJtaXNzaW9ucyBkZXJpdmVkIGZyb20gdGhlIG1lbXJlZ2lvbidz IFMvVSBmbGFncy4KKwkJICovCisJCXNiaV9kb21haW5fZm9yX2VhY2hfbWVtcmVnaW9uKGNmZy0+ c2JpX2RvbSwgbXIpIHsKKwkJCWlmIChtci0+b3JkZXIgPj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcp ICogOCkKKwkJCQljb250aW51ZTsKKworCQkJcmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0oZG9tLCBz Y2gsIG1yLT5iYXNlLCBCSVQobXItPm9yZGVyKSwKKwkJCQkJCW1wdF94d3JfZnJvbV9tZW1yZWdp b24obXIsIGNmZy0+eHdyKSwgZmFsc2UpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZmFpbDsKKwkJ fQorCX0KKworCS8qIE1hcCBleHBsaWNpdCByZWdpb25zIHdoaWNoIGFyZSBub3QgcGFydCBvZiBh bnkgU0JJIGRvbWFpbiAqLworCWZvciAoaSA9IDA7IGkgPCBjZmctPm5yZWdpb25zOyBpKyspIHsK KwkJcmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0oZG9tLCBzY2gsIGNmZy0+cmVnaW9uc1tpXS5wYSwg Y2ZnLT5yZWdpb25zW2ldLnNpemUsCisJCQkJCWNmZy0+cmVnaW9uc1tpXS54d3IsIGZhbHNlKTsK KwkJaWYgKHJjKQorCQkJZ290byBmYWlsOworCX0KKworCS8qCisJICogTWFwIGZpcm13YXJlIHJl Z2lvbiB3aXRoIG5vIHBlcm1pc3Npb24gd2l0aCBhbmQgbWFyayBhcyBsb2NrZWQKKwkgKi8KKwlp ZiAoY2ZnLT5md19wcm90ZWN0KSB7CisJCXJjID0gbXB0X21hcF9yYW5nZV9wZXJtKGRvbSwgc2No LCBjdHJsLT5md19wYSwgY3RybC0+Zndfc2l6ZSwKKwkJCQkJU0JJX01QVF9QRVJNX05PTkUsIHRy dWUpOworCQlpZiAocmMpIHsKKwkJCXNiaV9wcmludGYoInNiaV9tcHQ6IGNhbm5vdCBwcm90ZWN0 IGZpcm13YXJlIgorCQkJCSAgICIgcmM9JWRcbiIsIHJjKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQor CX0KKworCWN0cmwtPm5kb21haW4rKzsKKwlpZiAob3V0X3NkaWQpCisJCSpvdXRfc2RpZCA9IHNk aWQ7CisKKwlzYmlfbXB0X2ZlbmNlX3NkaWQoc2RpZCk7CisKKwkvKiBUbyBiZSByZW1vdmVkICov CisJc2JpX3ByaW50Zigic2JpX21wdDogU0RJRCAldSByb290PTB4JWx4IG1vZGU9JXMgZG9tPSVz XG4iLAorCQkgICBzZGlkLCByb290X3BhLCBzY2gtPm5hbWUsIGNmZy0+c2JpX2RvbSA/IGNmZy0+ c2JpX2RvbS0+bmFtZSA6ICIobm9uZSkiKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwliaXRtYXBf c2V0KGN0cmwtPnNkaWRfYml0bWFwLCAoaW50KXNkaWQsIDEpOworCWRvbS0+dmFsaWQgPSBmYWxz ZTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBzYmlfbXB0X2RvbWFpbl9hZGRfcmVnaW9uKCk6 IE1hcCBhIHJlZ2lvbiBpbiBhIE1QVCB0YWJsZQorICovCitpbnQgc2JpX21wdF9kb21haW5fYWRk X3JlZ2lvbih1MzIgc2RpZCwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSAgICAgICB1bnNpZ25lZCBs b25nIHNpemUsIHU4IHh3cikKK3sKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlzdHJ1 Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisJaW50IHJjOworCisJaWYgKCFtcHRfY3RybC5yZWFkeSkK KwkJcmV0dXJuIFNCSV9FTk9ERVY7CisJaWYgKCFzaXplIHx8IChwYSAmIFNCSV9NUFRfUEFHRV9N QVNLKSB8fCAoc2l6ZSAmIFNCSV9NUFRfUEFHRV9NQVNLKSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7 CisKKwlkb20gPSBzYmlfbXB0X2RvbWFpbl9nZXQoc2RpZCk7CisJaWYgKCFkb20pCisJCXJldHVy biBTQklfRUlOVkFMOworCisJaWYgKHJlZ2lvbl9vdmVybGFwc19sb2NrZWQoZG9tLCBwYSwgc2l6 ZSkpIHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogMHglbHgrMHglbHggb3ZlcmxhcHMgbG9ja2Vk IgorCQkJICAgIiAoU0RJRCAldSlcbiIsIHBhLCBzaXplLCBzZGlkKTsKKwkJcmV0dXJuIFNCSV9F SU5WQUw7CisJfQorCisJaWYgKCFkb20tPm1vZGUtPnBhX2luX3JhbmdlKHBhLCBzaXplKSkgewor CQkvKgorCQkgKiBBIHJlZ2lvbiB0aGF0IHBhX2luX3JhbmdlKCkgcmVqZWN0cyBmYWxscyBpbnRv IG9uZSBvZiB0d28KKwkJICogZGlmZmVyZW50IGNhc2VzIC0gUEEgd2hpY2ggaXMgb3V0IG9mIHJh bmdlIGZyb20gdGhlIG1hcHBhYmxlCisJCSAqIHJhbmdlIG9mIHRoYXQgbW9kZSBhbmQgc2Vjb25k IGlzIFBBIGlzIGluIHJhbmdlIGJ1dCB0aGUgZW5kCisJCSAqIChQQSArIFNJWkUpIGlzIGNyb3Nz aW5nIHRoZSBtYXBwYWJsZSByYW5nZS4KKwkJICoKKwkJICogRGlzdGluZ3Vpc2ggdGhlIHR3byBi eSBwcm9iaW5nIHBhX2luX3JhbmdlKCkgZm9yIGp1c3QKKwkJICogdGhlIGJhc2UgcGFnZSBhbmQg aWYgZXZlbiB0aGUgYmFzZSBpcyBvdXQgb2YgcmFuZ2UgaXQgaXMKKwkJICogdGhlIGZpcnN0IGNh c2UgYW5kIGlmIHRoZSBiYXNlIGlzIGluIHJhbmdlIGJ1dCB0aGUgd2hvbGUKKwkJICogcmVnaW9u IGlzIG5vdCwgaXQgaXMgY2FzZSBsYXRlci4KKwkJICovCisJCWlmIChkb20tPm1vZGUtPnBhX2lu X3JhbmdlKHBhLCBTQklfTVBUX1BBR0VfU0laRSkpCisJCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiAw eCVseCsweCVseCBjcm9zc292ZXIgbW9kZSAnJXMnIgorCQkJCSAgICIgY2VpbGluZyAoU0RJRCAl dSkg4oCUIGhpZ2ggcGFydCB3b3VsZCBhbGlhczsiCisJCQkJICAgIiByZWplY3RlZFxuIiwKKwkJ CQkgICBwYSwgc2l6ZSwgZG9tLT5tb2RlLT5uYW1lLCBzZGlkKTsKKwkJZWxzZQorCQkJc2JpX3By aW50Zigic2JpX21wdDogMHglbHgrMHglbHggb3V0IG9mIHJhbmdlIgorCQkJCSAgICIgKFNESUQg JXUpXG4iLCBwYSwgc2l6ZSwgc2RpZCk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCXNw aW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEs IHNpemUsIHh3cik7CisJc3Bpbl91bmxvY2soJmRvbS0+bG9jayk7CisKKwlpZiAoIXJjKSB7CisJ CWlmIChkb20tPm5yZWdpb25zIDwgU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU4pIHsKKwkJCXIg PSAmZG9tLT5yZWdpb25zW2RvbS0+bnJlZ2lvbnMrK107CisJCQlyLT5wYSA9IHBhOworCQkJci0+ c2l6ZSA9IHNpemU7CisJCQlyLT54d3IgPSB4d3I7CisJCQlyLT5sb2NrZWQgPSBmYWxzZTsKKwkJ CXItPnNoYXJlZCA9IGZhbHNlOworCQl9CisKKwkJc2JpX21wdF9mZW5jZV9zZGlkKHNkaWQpOwor CX0KKworCXJldHVybiByYzsKK30KKworLyoKKyAqIHNiaV9tcHRfZG9tYWluX3JlbW92ZV9yZWdp b24oKTogVW5tYXAgYSByZWdpb24gZnJvbSB0aGUgTVBUIHRhYmxlCisgKi8KK2ludCBzYmlfbXB0 X2RvbWFpbl9yZW1vdmVfcmVnaW9uKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLAorCQkJCSAg dW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1 Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlzdHJ1Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisKKwlp ZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKworCWlmICghc2l6ZSB8 fCAocGEgJiBTQklfTVBUX1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykp CisJCXJldHVybiBTQklfRUlOVkFMOworCisJZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNkaWQp OworCWlmICghZG9tKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBk b20tPm5yZWdpb25zOyBpKyspIHsKKwkJciA9ICZkb20tPnJlZ2lvbnNbaV07CisKKwkJaWYgKHIt PmxvY2tlZCAmJiByZWdpb25fY29udGFpbmVkKHBhLCBzaXplLCByLT5wYSwgci0+c2l6ZSkpCisJ CQlyZXR1cm4gU0JJX0VERU5JRUQ7CisJCS8qCisJCSAqIFNoYXJlZCByZWdpb25zIG11c3QgYmUg cmVtb3ZlZCB2aWEgc2JpX21wdF91bnNoYXJlX3JlZ2lvbigpCisJCSAqIGJlY2F1c2UgdGhhdCBm dW5jdGlvbiBwcmV2ZW50cyBvbmUgZG9tYWluIHJldm9raW5nIGEgcmVnaW9uCisJCSAqIHRoYXQg YW5vdGhlciBkb21haW4gc3RpbGwgaGFzIG1hcHBlZC4KKwkJICovCisJCWlmIChyLT5zaGFyZWQg JiYgci0+cGEgPT0gcGEgJiYgci0+c2l6ZSA9PSBzaXplKQorCQkJcmV0dXJuIFNCSV9FREVOSUVE OworCX0KKworCXNwaW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3Jh bmdlKGRvbSwgcGEsIHNpemUsIFNCSV9NUFRfUEVSTV9OT05FKTsKKwlzcGluX3VubG9jaygmZG9t LT5sb2NrKTsKKworCWlmICghcmMpCisJCXNiaV9tcHRfZmVuY2Vfc2RpZChzZGlkKTsKKworCXJl dHVybiByYzsKK30KKworLyoKKyAqIFNoYXJlZCBtZW1vcnkgcmVnaW9ucworICoKKyAqIHNiaV9t cHRfc2hhcmVfcmVnaW9uKCkg4oCUIG1hcCBhIHJlZ2lvbiBpbnRvIGEgc2Vjb25kIGRvbWFpbi4K KyAqCisgKiBCb3RoIGRvbWFpbnMgTVBUIHRhYmxlcyBhcmUgdXBkYXRlZCBpbmRlcGVuZGVudGx5 IOKAlCBlYWNoIGhhcyBpdHMKKyAqIG93biByb290L2lubmVyL2xlYWYgdGFibGUgdHJlZS4gVGhl IHNhbWUgUEEgcmFuZ2UgY2FuIGhhdmUgZGlmZmVyZW50CisgKiBYV1IgcGVybWlzc2lvbnMgaW4g ZGlmZmVyZW50IGRvbWFpbnMuCisgKgorICovCisKK2ludCBzYmlfbXB0X3NoYXJlX3JlZ2lvbih1 MzIgc3JjX3NkaWQsIHUzMiBkc3Rfc2RpZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWdu ZWQgbG9uZyBzaXplLAorCQkJICB1OCBkc3RfeHdyKQoreworCXVuc2lnbmVkIGludCBpOworCWlu dCByYzsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNyY19kb20sICpkc3RfZG9tOworCisJaWYg KCFtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJuIFNCSV9FTk9ERVY7CisKKwlpZiAoIXNpemUgfHwg KHBhICYgU0JJX01QVF9QQUdFX01BU0spIHx8IChzaXplICYgU0JJX01QVF9QQUdFX01BU0spKQor CQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWlmIChzcmNfc2RpZCA9PSBkc3Rfc2RpZCkKKwkJcmV0 dXJuIFNCSV9FSU5WQUw7CisKKwlzcmNfZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNyY19zZGlk KTsKKwlkc3RfZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KGRzdF9zZGlkKTsKKwlpZiAoIXNyY19k b20gfHwgIWRzdF9kb20pCisJCXJldHVybiBTQklfRUlOVkFMOworCisJaWYgKHJlZ2lvbl9vdmVy bGFwc19sb2NrZWQoZHN0X2RvbSwgcGEsIHNpemUpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6 IHNoYXJlIDB4JWx4KzB4JWx4IG92ZXJsYXBzIGxvY2tlZCByZWdpb24gaW4gU0RJRCAldVxuIiwK KwkJCSAgIHBhLCBzaXplLCBkc3Rfc2RpZCk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKwor CS8qIFJlamVjdCByZXNlcnZlZCB4d3IgcGVybWlzc2lvbnM6IDBiMDEwIGFuZCAwYjExMCAoVyB3 aXRob3V0IFIpICovCisJaWYgKChkc3RfeHdyICYgU0JJX01QVF9QRVJNX1cpICYmICEoZHN0X3h3 ciAmIFNCSV9NUFRfUEVSTV9SKSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBzaGFyZSAweCVs eCsweCVseDogVyB3aXRob3V0IFIgaXMgYSByZXNlcnZlZCBYV1IgZW5jb2RpbmdcbiIsCisJCQkg ICBwYSwgc2l6ZSk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCWlmIChkc3RfZG9tLT5u cmVnaW9ucyA+PSBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTikgeworCQlzYmlfcHJpbnRmKCJz YmlfbXB0OiBzaGFyZTogU0RJRCAldSByZWdpb24gdGFibGUgZnVsbFxuIiwgZHN0X3NkaWQpOwor CQlyZXR1cm4gU0JJX0VOT01FTTsKKwl9CisKKwlzcGluX2xvY2soJmRzdF9kb20tPmxvY2spOwor CXJjID0gZHN0X2RvbS0+bW9kZS0+bWFwX3JhbmdlKGRzdF9kb20sIHBhLCBzaXplLCBkc3RfeHdy KTsKKwlzcGluX3VubG9jaygmZHN0X2RvbS0+bG9jayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7 CisKKwlkc3RfZG9tLT5yZWdpb25zW2RzdF9kb20tPm5yZWdpb25zXS5wYSA9IHBhOworCWRzdF9k b20tPnJlZ2lvbnNbZHN0X2RvbS0+bnJlZ2lvbnNdLnNpemUgPSBzaXplOworCWRzdF9kb20tPnJl Z2lvbnNbZHN0X2RvbS0+bnJlZ2lvbnNdLnh3ciA9IGRzdF94d3I7CisJZHN0X2RvbS0+cmVnaW9u c1tkc3RfZG9tLT5ucmVnaW9uc10ubG9ja2VkID0gZmFsc2U7CisJZHN0X2RvbS0+cmVnaW9uc1tk c3RfZG9tLT5ucmVnaW9uc10uc2hhcmVkID0gdHJ1ZTsKKwlkc3RfZG9tLT5ucmVnaW9ucysrOwor CisJZm9yIChpID0gMDsgaSA8IHNyY19kb20tPm5yZWdpb25zOyBpKyspIHsKKwkJaWYgKHNyY19k b20tPnJlZ2lvbnNbaV0ucGEgPT0gcGEgJiYKKwkJICAgIHNyY19kb20tPnJlZ2lvbnNbaV0uc2l6 ZSA9PSBzaXplKSB7CisJCQlzcmNfZG9tLT5yZWdpb25zW2ldLnNoYXJlZCA9IHRydWU7CisJCQli cmVhazsKKwkJfQorCX0KKworCXNiaV9tcHRfZmVuY2Vfc2RpZChzcmNfc2RpZCk7CisJc2JpX21w dF9mZW5jZV9zZGlkKGRzdF9zZGlkKTsKKworCXNiaV9wcmludGYoInNiaV9tcHQ6IHNoYXJlZCAw eCVseCsweCVseCBTRElEICV1IOKGkiBTRElEICV1IHh3cj0ldVxuIiwKKwkJICAgcGEsIHNpemUs IHNyY19zZGlkLCBkc3Rfc2RpZCwgZHN0X3h3cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAq IHNiaV9tcHRfdW5zaGFyZV9yZWdpb24oKSDigJQgVW5tYXAgYSBzaGFyZWQgcmVnaW9uIGZyb20g YSBkb21haW4uCisgKgorICogVGhlIG90aGVyIGRvbWFpbiByZW1haW5zIHVuYWZmZWN0ZWQganVz dCB0aGUgc2hhcmVkIGZsYWcgZ2V0cyByZW1vdmVkCisgKiBmb3IgdGhhdCByZWdpb24gZnJvbSBi b3RoIHRoZSBkb21haW5zLgorICovCitpbnQgc2JpX21wdF91bnNoYXJlX3JlZ2lvbih1MzIgc2Rp ZCwgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXUzMiBzOworCWlu dCByYzsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwg KnBlZXI7CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKwor CWlmICghc2l6ZSB8fCAocGEgJiBTQklfTVBUX1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBU X1BBR0VfTUFTSykpCisJCXJldHVybiBTQklfRUlOVkFMOworCisJZG9tID0gc2JpX21wdF9kb21h aW5fZ2V0KHNkaWQpOworCWlmICghZG9tKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWZvciAo aSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBpKyspIHsKKwkJaWYgKGRvbS0+cmVnaW9uc1tpXS5w YSA9PSBwYSAmJgorCQkgICAgZG9tLT5yZWdpb25zW2ldLnNpemUgPT0gc2l6ZSAmJgorCQkgICAg ZG9tLT5yZWdpb25zW2ldLnNoYXJlZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBkb20tPm5y ZWdpb25zKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHVuc2hhcmUgMHglbHgrMHglbHggbm90 IGZvdW5kIGluIFNESUQgJXVcbiIsCisJCQkgICBwYSwgc2l6ZSwgc2RpZCk7CisJCXJldHVybiBT QklfRUlOVkFMOworCX0KKworCXNwaW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9k ZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIFNCSV9NUFRfUEVSTV9OT05FKTsKKwlzcGluX3Vu bG9jaygmZG9tLT5sb2NrKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZG9tLT5ucmVn aW9ucyAtPSAxOworCWRvbS0+cmVnaW9uc1tpXSA9IGRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25z XTsKKworCS8qIENsZWFyIHRoZSBzaGFyZWQgZmxhZyBvbiBhbnkgb3RoZXIgZG9tYWluIHRoYXQg aGFzIHRoaXMgUEEgcmVnaW9uIHNoYXJlZC4qLworCWZvciAocyA9IDA7IHMgPCBtcHRfY3RybC5t YXhfZG9tYWluczsgcysrKSB7CisJCXBlZXIgPSBzYmlfbXB0X2RvbWFpbl9nZXQocyk7CisJCWlm ICghcGVlciB8fCBwZWVyID09IGRvbSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGog PCBwZWVyLT5ucmVnaW9uczsgaisrKQorCQkJaWYgKHBlZXItPnJlZ2lvbnNbal0ucGEgPT0gcGEg JiYgcGVlci0+cmVnaW9uc1tqXS5zaXplID09IHNpemUpCisJCQkJcGVlci0+cmVnaW9uc1tqXS5z aGFyZWQgPSBmYWxzZTsKKwl9CisKKwlzYmlfbXB0X2ZlbmNlX3NkaWQoc2RpZCk7CisKKwlyZXR1 cm4gMDsKK30KKworLyoKKyAqIERpc2FibGUgU01NUFQgb24gaGFydAorICovCit2b2lkIHNiaV9t cHRfaGFydF9kZWFjdGl2YXRlKHZvaWQpCit7CisJLyoKKwkgKiBtbXB0IGlzIGluYWN0aXZlIGlu IE0tbW9kZSBwZXIgc3BlYywgc28gbm8gQ1NSIHdyaXRlCisJICogaXMgbmVlZGVkLgorCSAqLwor fQorCisvKgorICogRW5hYmxlIFNNTVBUIG9uIGhhcnQKKyAqLworaW50IHNiaV9tcHRfaGFydF9h Y3RpdmF0ZSh1MzIgc2RpZCkKK3sKKwl1MzIgKnA7CisJdW5zaWduZWQgbG9uZyBwcG47CisJc3Ry dWN0IHNiaV9tcHRfZG9tYWluICpkb207CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1 cm4gU0JJX0VOT0RFVjsKKworCWRvbSA9IHNiaV9tcHRfZG9tYWluX2dldChzZGlkKTsKKwlpZiAo IWRvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlwcG4gPSBkb20tPnJvb3RfcGEgPj4gU0JJ X01QVF9QQUdFX1NISUZUOworCWNzcl93cml0ZShTQklfQ1NSX01NUFQsIGRvbS0+bW9kZS0+ZW5j b2RlX21tcHQocHBuLCBzZGlkKSk7CisJc2JpX21wdF9mZW5jZV9zZGlkKHNkaWQpOworCisJaWYg KG1wdF9jdHJsLnNkaWRfb2Zmc2V0KSB7CisJCXAgPSBzYmlfc2NyYXRjaF9vZmZzZXRfcHRyKHNi aV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpLCBtcHRfY3RybC5zZGlkX29mZnNldCk7CisJCSpwID0g c2RpZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFjdGl2YXRlIFNNTVBUIGZvciBh bGwgaGFydHMgd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBhbiBsaW5rZWQKKyAqIFNCSSBkb21h aW4gaW4gYW4gc3VwZXJ2aXNvciBkb21haW4uCisgKi8KK2ludCBzYmlfbXB0X2hhcnRfYWN0aXZh dGVfZm9yX2RvbWFpbihzdHJ1Y3Qgc2JpX2RvbWFpbiAqc2JpX2RvbSkKK3sKKwl1MzIgczsKKwor CWlmICghbXB0X2N0cmwucmVhZHkpCisJCXJldHVybiBTQklfRU5PREVWOworCWlmICghc2JpX2Rv bSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwkvKgorCSAqIFNlYXJjaCBhbGwgc3VwZXJ2aXNv ciBkb21haW5zIGZvciBhc3NvY2lhdGVkIHNiaV9kb20gYW5kCisJICogYWN0aXZhdGUgaGFydHMg Zm9yIHRoYXQgc3VwZXJ2aXNvciBkb21haW4KKwkgKi8KKwlmb3IgKHMgPSAwOyBzIDwgbXB0X2N0 cmwubWF4X2RvbWFpbnM7IHMrKykgeworCQlpZiAobXB0X2N0cmwuZG9tYWluc1tzXS52YWxpZCAm JiBtcHRfY3RybC5kb21haW5zW3NdLnNiaV9kb20gPT0gc2JpX2RvbSkKKwkJCXJldHVybiBzYmlf bXB0X2hhcnRfYWN0aXZhdGUocyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzYmlf bXB0X3NkaWRfZnJlZSgpOiBSZXR1cm5zIFNESUQgdG8gdGhlIGZyZWUgcG9vbCBhZnRlciBkb21h aW4gZGVzdHJveS4KKyAqLwordm9pZCBzYmlfbXB0X3NkaWRfZnJlZSh1MzIgc2RpZCkKK3sKKwlp ZiAoIW1wdF9jdHJsLnJlYWR5IHx8IHNkaWQgPj0gbXB0X2N0cmwubWF4X2RvbWFpbnMpCisJCXJl dHVybjsKKwliaXRtYXBfc2V0KG1wdF9jdHJsLnNkaWRfYml0bWFwLCAoaW50KXNkaWQsIDEpOwor CW1wdF9jdHJsLmRvbWFpbnNbc2RpZF0udmFsaWQgPSBmYWxzZTsKK30KKworLyoKKyAqIHNiaV9t cHRfcXVlcnlfYWNjZXNzKCk6IFJldHVybnMgdGhlIFhXUiBmb3IgYSBQQSBpbiBzdXBlcnZpc29y IGRvbWFpbihzZGlkKS4KKyAqLworaW50IHNiaV9tcHRfcXVlcnlfYWNjZXNzKHUzMiBzZGlkLCB1 bnNpZ25lZCBsb25nIHBhLCB1OCAqb3V0X3h3cikKK3sKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4g KmRvbTsKKworCWlmICghbXB0X2N0cmwucmVhZHkpCisJCXJldHVybiBTQklfRU5PREVWOworCisJ aWYgKCFvdXRfeHdyKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWRvbSA9IHNiaV9tcHRfZG9t YWluX2dldChzZGlkKTsKKwlpZiAoIWRvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlpZiAo IWRvbS0+bW9kZS0+cGFfaW5fcmFuZ2UocGEsIFNCSV9NUFRfUEFHRV9TSVpFKSkgeworCQkqb3V0 X3h3ciA9IFNCSV9NUFRfUEVSTV9OT05FOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2so JmRvbS0+bG9jayk7CisJKm91dF94d3IgPSBkb20tPm1vZGUtPmdldF94d3IoZG9tLCBwYSk7CisJ c3Bpbl91bmxvY2soJmRvbS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNiaV9t cHRfaW5pdCgpOiBJbml0aWFsaXplIE1QVCBzdHJ1Y3R1cmVzCisgKi8KK2ludCBzYmlfbXB0X2lu aXQodm9pZCkKK3sKKwl1MzIgKnA7CisJdTMyIG1vZGVfdmFsOworCXVuc2lnbmVkIGxvbmcgZndf ZW5kOworCXN0cnVjdCBzYmlfc2NyYXRjaCAqczsKKwlzdHJ1Y3Qgc2JpX3NjcmF0Y2ggKnNjcmF0 Y2ggPSBzYmlfc2NyYXRjaF90aGlzaGFydF9wdHIoKTsKKwl1bnNpZ25lZCBsb25nIGZ3X3BhID0g c2NyYXRjaC0+Zndfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBmd19zaXplID0gc2NyYXRjaC0+Zndf c2l6ZTsKKworCWlmIChtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNiaV9o YXJ0X2hhc19leHRlbnNpb24oc2NyYXRjaCwgU0JJX0hBUlRfRVhUX1NNU0RJRCkpIHsKKwkJc2Jp X3ByaW50Zigic2JpX21wdDogU21zZGlkIGV4dGVuc2lvbiBhYnNlbnRcbiIpOworCQlyZXR1cm4g U0JJX0VOT0RFVjsKKwl9CisKKwlpZiAoIXNiaV9oYXJ0X2hhc19leHRlbnNpb24oc2NyYXRjaCwg U0JJX0hBUlRfRVhUX1NNTVBUKSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBTbW1wdCBleHRl bnNpb24gYWJzZW50XG4iKTsKKwkJcmV0dXJuIFNCSV9FTk9ERVY7CisJfQorCisJbXB0X2N0cmwu bW9kZSA9IGluaXRfbXB0X21vZGUoJm1vZGVfdmFsKTsKKwlpZiAoIW1wdF9jdHJsLm1vZGUpIHsK KwkJc2JpX3ByaW50Zigic2JpX21wdDogV0FSTCBwcm9iZSBmb3VuZCBubyBtb2RlXG4iKTsKKwkJ cmV0dXJuIFNCSV9FTk9ERVY7CisJfQorCisJLyoKKwkgKiBTRElETEVOIG11c3QgYmUgcHJvYmVk IHdpdGggYSBsZWdhbCBub24tQmFyZSBNT0RFIHByb2dyYW1tZWQsCisJICogcHJvYmUgc2RpZGxl biBtdXN0IGJlIGRvbmUgb25seSBhZnRlciB0aGUgcHJvYmluZyB0aGUgbW9kZS4KKwkgKi8KKwlt cHRfY3RybC5zZGlkX2xlbiA9IHByb2JlX3NkaWRsZW4obW9kZV92YWwpOworCWlmICghbXB0X2N0 cmwuc2RpZF9sZW4pIHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogU0RJRExFTj0wIOKAlCBTRElE IGZpZWxkIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCXJldHVybiBTQklfRU5PREVWOworCX0KKwor CW1wdF9jdHJsLm1heF9kb21haW5zID0gMVVMIDw8IG1wdF9jdHJsLnNkaWRfbGVuOworCisJLyoK KwkgKiBJbml0aWFsaXNlIFNESUQgYml0bWFwCisJICogc2V0IGJpdHMgMC4uKG1heF9kb21haW5z LTEpIGFzIDEgbWFya2luZyB0aG9zZSBTRElEcyBmcmVlLgorCSAqLworCWJpdG1hcF9maWxsKG1w dF9jdHJsLnNkaWRfYml0bWFwLCBtcHRfY3RybC5tYXhfZG9tYWlucyk7CisKKwkvKiBSb3VuZCBm d19wYSBhbmQgZndfc2l6ZSB0byBwYWdlIGJvdW5kYXJpZXMgYmVmb3JlIHN0b3JpbmcuICovCisJ ZndfZW5kID0gKGZ3X3BhICsgZndfc2l6ZSArIFNCSV9NUFRfUEFHRV9TSVpFIC0gMVVMKSAmIH5T QklfTVBUX1BBR0VfTUFTSzsKKwltcHRfY3RybC5md19wYSA9IGZ3X3BhICYgflNCSV9NUFRfUEFH RV9NQVNLOworCW1wdF9jdHJsLmZ3X3NpemUgPSBmd19lbmQgLSBtcHRfY3RybC5md19wYTsKKwor CisJLyogUGVyLWhhcnQgU0RJRCBzY3JhdGNoIHNsb3Qg4oCUIGluaXRpYWxpc2UgYWxsIGhhcnRz IHRvIElOVkFMSUQgKi8KKwltcHRfY3RybC5zZGlkX29mZnNldCA9IHNiaV9zY3JhdGNoX2FsbG9j X29mZnNldChzaXplb2YodTMyKSk7CisJaWYgKCFtcHRfY3RybC5zZGlkX29mZnNldCkgeworCQlz YmlfcHJpbnRmKCJzYmlfbXB0OiBzY3JhdGNoIGFsbG9jIGZvciBTRElEIGZhaWxlZFxuIik7CisJ fQorCWVsc2UgeworCQlzYmlfZm9yX2VhY2hfaGFydGluZGV4KGkpIHsKKwkJCXMgPSBzYmlfaGFy dGluZGV4X3RvX3NjcmF0Y2goaSk7CisJCQlpZiAocykgeworCQkJCXAgPSBzYmlfc2NyYXRjaF9v ZmZzZXRfcHRyKHMsIG1wdF9jdHJsLnNkaWRfb2Zmc2V0KTsKKwkJCQkqcCA9IFNCSV9NUFRfU0RJ RF9JTlZBTElEOworCQkJfQorCQl9CisJfQorCisJbXB0X2N0cmwucmVhZHkgPSB0cnVlOworCisJ cmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWJ1ZyBkdW1wCisgKi8KK3ZvaWQgc2JpX21wdF9kdW1w KHZvaWQpCit7CisJdTMyIHM7CisJdW5zaWduZWQgaW50IHI7CisJY29uc3Qgc3RydWN0IHNiaV9t cHRfZG9tYWluICpkOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY2F0Y2hhbGxfc2l6ZSA9IH4wVUwg JiB+U0JJX01QVF9QQUdFX01BU0s7CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KSB7CisJCXNiaV9w cmludGYoInNiaV9tcHQ6IG5vdCBpbml0aWFsaXNlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlz YmlfcHJpbnRmKCJzYmlfbXB0OiBtb2RlPSUtMTBzIFNESURMRU49JXUgbWF4X2RvbWFpbnM9JXVc biIsIG1wdF9jdHJsLm1vZGUtPm5hbWUsCisJCSAgIG1wdF9jdHJsLnNkaWRfbGVuLCBtcHRfY3Ry bC5tYXhfZG9tYWlucyk7CisJc2JpX3ByaW50Zigicm9vdF9zaXplPTB4JWx4IHJvb3RfYWxpZ249 MHglbHhcbiIsCisJCSAgIG1wdF9jdHJsLm1vZGUtPnJvb3RfdGFibGVfc2l6ZSgpLCBtcHRfY3Ry bC5tb2RlLT5yb290X3RhYmxlX2FsaWduKCkpOworCXNiaV9wcmludGYoImZ3IDB4JTAxNmx4KzB4 JWx4ICBwb29sPWdsb2JhbCBoZWFwXG4iLAorCQkgICBtcHRfY3RybC5md19wYSwgbXB0X2N0cmwu Zndfc2l6ZSk7CisJZm9yIChzID0gMDsgcyA8IG1wdF9jdHJsLm1heF9kb21haW5zOyBzKyspIHsK KwkJYm9vbCBoYXNfYmFzZWxpbmUgPSBmYWxzZTsKKwkJdTggICBiYXNlbGluZV94d3IgPSBTQklf TVBUX1BFUk1fTk9ORTsKKworCQlkID0gJm1wdF9jdHJsLmRvbWFpbnNbc107CisJCWlmICghZC0+ dmFsaWQpCisJCQljb250aW51ZTsKKwkJc2JpX3ByaW50ZigiU0RJRCAlMnUgcm9vdD0weCUwMTZs eCByZWdpb25zPSV1IGRvbT0lc1xuIiwKKwkJCSAgIGQtPnNkaWQsIGQtPnJvb3RfcGEsIGQtPm5y ZWdpb25zLCBkLT5zYmlfZG9tID8gZC0+c2JpX2RvbS0+bmFtZSA6ICIobm9uZSkiKTsKKwkJZm9y IChyID0gMDsgciA8IGQtPm5yZWdpb25zOyByKyspIHsKKworCQkJaWYgKGQtPnJlZ2lvbnNbcl0u cGEgPT0gMCAmJgorCQkJICAgIGQtPnJlZ2lvbnNbcl0uc2l6ZSA9PSBjYXRjaGFsbF9zaXplKSB7 CisJCQkJaGFzX2Jhc2VsaW5lID0gdHJ1ZTsKKwkJCQliYXNlbGluZV94d3IgPSBkLT5yZWdpb25z W3JdLnh3cjsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc2JpX3ByaW50ZigiUy1Eb21haW4l dSBSZWdpb24lMDJ1ICAgICAgICAgIDogMHglMDE2bHgrMHglLTE2bHg6IHh3cj0ldSAoJWMlYyVj KSVzJXNcbiIsCisJCQkgICBkLT5zZGlkLCByLCBkLT5yZWdpb25zW3JdLnBhLAorCQkJICAgZC0+ cmVnaW9uc1tyXS5zaXplLAorCQkJICAgZC0+cmVnaW9uc1tyXS54d3IsCisJCQkgICAoZC0+cmVn aW9uc1tyXS54d3IgJiBTQklfTVBUX1BFUk1fUikgPyAnUicgOiAnLScsCisJCQkgICAoZC0+cmVn aW9uc1tyXS54d3IgJiBTQklfTVBUX1BFUk1fVykgPyAnVycgOiAnLScsCisJCQkgICAoZC0+cmVn aW9uc1tyXS54d3IgJiBTQklfTVBUX1BFUk1fWCkgPyAnWCcgOiAnLScsCisJCQkgICBkLT5yZWdp b25zW3JdLmxvY2tlZCA/ICIgW0xPQ0tFRF0iIDogIiIsCisJCQkgICBkLT5yZWdpb25zW3JdLnNo YXJlZCA/ICIgW1NIQVJFRF0iIDogIiIpOworCQl9CisKKwkJaWYgKGhhc19iYXNlbGluZSkgewor CQkJc2JpX3ByaW50ZigiUy1Eb21haW4ldSBEZWZhdWx0ICAgICAgICAgICA6ICUtMzdzOiB4d3I9 JXUgKCVjJWMlYykgICBbYmFzZWxpbmUsIG92ZXJsYXkgYnkgcmVnaW9ucyBhYm92ZV1cbiIsCisJ CQkJICAgZC0+c2RpZCwgIlJlc3Qgb2YgdGhlIGFkZHJlc3Mgc3BhY2UiLAorCQkJCSAgIGJhc2Vs aW5lX3h3ciwKKwkJCQkgICAoYmFzZWxpbmVfeHdyICYgU0JJX01QVF9QRVJNX1IpID8gJ1InIDog Jy0nLAorCQkJCSAgIChiYXNlbGluZV94d3IgJiBTQklfTVBUX1BFUk1fVykgPyAnVycgOiAnLScs CisJCQkJICAgKGJhc2VsaW5lX3h3ciAmIFNCSV9NUFRfUEVSTV9YKSA/ICdYJyA6ICctJyk7CisJ CX0KKwkJZWxzZSB7CisJCQlzYmlfcHJpbnRmKCJTLURvbWFpbiV1ICAgICAgICAgICA6IHh3cj0w ICgtLS0pICAgW25vIGJhc2VsaW5lIOKAlCB1bm1hcHBlZCBQQXMgZGVuaWVkXVxuIiwKKwkJCQkg ICBkLT5zZGlkKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9zYmkvc2JpX21wdF9tb2Rl LmMgYi9saWIvc2JpL3NiaV9tcHRfbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwLi44YmFmODNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zYmkvc2JpX21wdF9tb2Rl LmMKQEAgLTAsMCArMSw5OTcgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1D bGF1c2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjYgUXVhbGNvbW0gSW5jLgorICoKKyAqIEF1 dGhvcnM6IFJhaHVsIFBhdGhhayA8cmFodWwucGF0aGFrQG9zcy5xdWFsY29tbS5jb20+CisgKi8K KworI2luY2x1ZGUgPHNiaS9zYmlfbXB0Lmg+CisjaW5jbHVkZSA8c2JpL3NiaV9lcnJvci5oPgor I2luY2x1ZGUgPHNiaS9zYmlfc3RyaW5nLmg+CisjaW5jbHVkZSA8c2JpL3NiaV9jb25zb2xlLmg+ CisKKyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKworLyoKKyAqIFNtbXB0NDMgIOKAlCAgNDMtYml0 IHN1cGVydmlzb3IgcGh5c2ljYWwgYWRkcmVzcyAoU1BBKQorICogKy0tLS0tLS0tLSstLS0tLS0t LS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqIHwgIHBuWzJdICB8ICBwblsxXSAg fCAgcG5bMF0gIHwgICAgcGkgICB8IG9mZnNldCB8CisgKiB8IFs0MjozNF0gfCBbMzM6MjVdIHwg WzI0OjE2XSB8IFsxNToxMl0gfCBbMTE6MF0gfAorICogfCAgICA5YiAgIHwgICAgOWIgICB8ICAg IDliICAgfCAgICA0YiAgIHwgIDEyYiAgIHwKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0t LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rCisgKgorICogU21tcHQ1MiAg4oCUICA1Mi1iaXQgc3Vw ZXJ2aXNvciBwaHlzaWNhbCBhZGRyZXNzIChTUEEpCisgKiArLS0tLS0tLS0tKy0tLS0tLS0tLSst LS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqIHwgIHBuWzNdICB8ICBw blsyXSAgfCAgcG5bMV0gIHwgIHBuWzBdICB8ICAgIHBpICAgfCBvZmZzZXQgfAorICogfCBbNTE6 NDNdIHwgWzQyOjM0XSB8IFszMzoyNV0gfCBbMjQ6MTZdIHwgWzE1OjEyXSB8IFsxMTowXSB8Cisg KiB8ICAgIDliICAgfCAgICA5YiAgIHwgICAgOWIgICB8ICAgIDliICAgfCAgICA0YiAgIHwgIDEy YiAgIHwKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0t LS0tKy0tLS0tLS0tKworICoKKyAqIFNtbXB0NjQgIOKAlCAgNjQtYml0IHN1cGVydmlzb3IgcGh5 c2ljYWwgYWRkcmVzcyAoU1BBKQorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0t LS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICogfCAgcG5bNF0gIHwgIHBu WzNdICB8ICBwblsyXSAgfCAgcG5bMV0gIHwgIHBuWzBdICB8ICAgIHBpICAgfCBvZmZzZXQgfAor ICogfCBbNjM6NTJdIHwgWzUxOjQzXSB8IFs0MjozNF0gfCBbMzM6MjVdIHwgWzI0OjE2XSB8IFsx NToxMl0gfCBbMTE6MF0gfAorICogfCAgIDEyYiAgIHwgICAgOWIgICB8ICAgIDliICAgfCAgICA5 YiAgIHwgICAgOWIgICB8ICAgIDRiICAgfCAgMTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0t LS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICoK KyAqLworCisvKiBJbm50ZXIgZW50cmllcyBhcmUgTVBURXMgbm90IGluIHJvb3QgTVBUIHBhZ2Ug Ki8KKyNkZWZpbmUgUlY2NF9JTk5FUl9FTlRSSUVTCQk1MTJVCisjZGVmaW5lIFJWNjRfTVBURV9T SVpFCQkJOFVMCisjZGVmaW5lIFJWNjRfVEFCTEVfU0laRQkJCShSVjY0X0lOTkVSX0VOVFJJRVMg KiBSVjY0X01QVEVfU0laRSkKKworLyogU21tcHQ2NCByb290OiA0MDk2IGVudHJpZXMgw5cgOEIg PSAzMktCLCAzMktCIGFsaWduZWQgKi8KKyNkZWZpbmUgUlY2NF9ST09UX1NNTVBUNjRfRU5UUklF Uwk0MDk2VQorI2RlZmluZSBSVjY0X1JPT1RfU01NUFQ2NF9TSVpFCQkoUlY2NF9ST09UX1NNTVBU NjRfRU5UUklFUyAqIFJWNjRfTVBURV9TSVpFKQorCisjZGVmaW5lIFJWNjRfTlVNUEdJTlJBTkdF CQk0VQorI2RlZmluZSBSVjY0X1BBR0VTX1BFUl9NUFRFCQkoMVUgPDwgUlY2NF9OVU1QR0lOUkFO R0UpCisjZGVmaW5lIFJWNjRfUEFHRVNfUEVSX01QVEVfTUFTSwkoUlY2NF9QQUdFU19QRVJfTVBU RSAtIDFVKQorI2RlZmluZSBSVjY0X0lOTkVSX1BOX0JJVFMJCTlVCisKKy8qIEJ5dGVzIGNvdmVy ZWQgYnkgb25lIGNvbXBsZXRlIGxlYWYgdGFibGUgPSBwYWdlc19wZXJfbGVhZiDDlyBQQUdFX1NJ WkUgKi8KKyNkZWZpbmUgUlY2NF9MRUFGX1JBTkdFCQkJKFJWNjRfUEFHRVNfUEVSX01QVEUgKiBT QklfTVBUX1BBR0VfU0laRSkKKworLyoKKyAqIE5BUE9UIEc9NCBmb3IgU21tcHQ0MywgU21tcHQ1 MiBhbmQgU21tcHQ2NAorICoKKyAqIEc9NCBtZWFucyAyXihHKzEpPTMyIGNvbnRpZ3VvdXMgbGVh ZiBtcHRlIHdoaWNoIGZvcm0gYSBOQVBPVCBncm91cC4KKyAqIEVhY2ggUlY2NCBsZWFmIE1QVEUg Y292ZXJzIDY0S2lCIHNvIG9uZSBOQVBPVCBncm91cCBjb3ZlcnMgMk1pQi4KKyAqCisgKiBBbGwg b3RoZXIgRyB2YWx1ZXMgYXBhcnQgZnJvbSA0IGFyZSByZXNlcnZlZC4KKyAqLworI2RlZmluZSBS VjY0X05BUE9UX0cJCQk0VQorI2RlZmluZSBSVjY0X05BUE9UX0dfU0hJRlQJCTEyVQorI2RlZmlu ZSBSVjY0X05BUE9UX01QVEVfQ09VTlQJCSgxVSA8PCAoUlY2NF9OQVBPVF9HICsgMSkpCisjZGVm aW5lIFJWNjRfTkFQT1RfU0laRQkJCSgodW5zaWduZWQgbG9uZylSVjY0X05BUE9UX01QVEVfQ09V TlQgKiBSVjY0X0xFQUZfUkFOR0UpCisjZGVmaW5lIFJWNjRfTkFQT1RfUE4wX0FMSUdOCQlSVjY0 X05BUE9UX01QVEVfQ09VTlQKKworLyoKKyAqIFN3aXRoIHRvIGRpc2FibGUgTkFQT1QgY29tcGFj dGlvbiBvZiBNUFRFIGVudHJpZXMgd2hpbGUgd3JpdGluZy4KKyAqLworI2RlZmluZSBSVjY0X05B UE9UX0RJU0FCTEUJMAorCisvKgorICogU3VwZXJ2aXNvciBQaHlzdWNhbCBhZGRyZXNzIGZpZWxk cyBleHRyYWN0aW9uCisgKi8KKworLyoKKyAqIHJ2NjRfdGFibGVfaWR4KCkg4oCUIGV4dHJhY3Qg cG5bbGV2ZWxdIGZyb20gYSBTUEEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2NjRfdGFibGVf aWR4KHVuc2lnbmVkIGxvbmcgcGEsIHUzMiBsZXZlbCwKKwkJCSAgY29uc3Qgc3RydWN0IHNiaV9t cHRfbW9kZSAqc2NoKQoreworCXUzMiBzaGlmdCA9IDE2ICsgbGV2ZWwgKiA5OworCXUzMiBtYXNr ID0gKHNjaC0+bW9kZV92YWwgPT0gU0JJX01NUFRfTU9ERV9TTU1QVDY0ICYmIGxldmVsID09IDQp ID8gMHhGRkYgOiAweDFGRjsKKworCXJldHVybiAoKHBhID4+IHNoaWZ0KSAmIG1hc2spOworfQor CisvKgorICogcnY2NF90dXBsZV9pZHhfc2hpZnQoKSDigJQgWFdSIHR1cGxlIGluZGV4IHNoaWZ0 IGF0IGxldmVsIGkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2NjRfdHVwbGVfaWR4X3NoaWZ0 KHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4gKFNCSV9NUFRfUEFHRV9TSElGVCArIGxldmVsICogUlY2 NF9JTk5FUl9QTl9CSVRTKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcnY2NF90dXBsZV9pZHgo dW5zaWduZWQgbG9uZyBwYSwgdTMyIGxldmVsKQoreworCXJldHVybiAoKHBhID4+IHJ2NjRfdHVw bGVfaWR4X3NoaWZ0KGxldmVsKSkgJiBSVjY0X1BBR0VTX1BFUl9NUFRFX01BU0spOworfQorCisv KgorICogcnY2NF9tcHRlX3JhbmdlKCkg4oCUIGJ5dGVzIGNvdmVyZWQgYnkgb25lIE1QVEUgYXQg bGV2ZWwgTC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJ2NjRfbXB0ZV9yYW5n ZSh1MzIgbGV2ZWwpCit7CisJcmV0dXJuIFJWNjRfTEVBRl9SQU5HRSA8PCAobGV2ZWwgKiBSVjY0 X0lOTkVSX1BOX0JJVFMpOworfQorCisvKgorICogUlY2NCBNUFRFIFJlYWQvV3JpdGUgZnVuY3Rp b25zCisgKi8KKworc3RhdGljIGlubGluZSB1NjQgcnY2NF9yZWFkX21wdGUodW5zaWduZWQgbG9u ZyBwYSkKK3sKKwlyZXR1cm4gKih2b2xhdGlsZSB1NjQgKilwYTsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkIHJ2NjRfd3JpdGVfbXB0ZSh1bnNpZ25lZCBsb25nIHBhLCB1NjQgdikKK3sKKwkqKHZv bGF0aWxlIHU2NCAqKXBhID0gdjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJ2 NjRfbXB0ZV9wYSh1bnNpZ25lZCBsb25nIHRhYmxlX3BhLCB1MzIgaWR4KQoreworCXJldHVybiAo dGFibGVfcGEgKyBpZHggKiBSVjY0X01QVEVfU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyBydjY0X25leHRfdGFibGVfcGEodTY0IG1wdGUpCit7CisJcmV0dXJuICh1bnNp Z25lZCBsb25nKSgodTY0KShtcHRlID4+IFNCSV9NUFRFX1BQTl9TSElGVCkgPDwgU0JJX01QVF9Q QUdFX1NISUZUKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIE5hcG90IExlYWYgTVBURQorICoKKyAq IENvbnN0cnVjdHMgb25lIE1QVEUgdmFsdWUgdXNlZCBmb3IgYWxsCisgKiBSVjY0X05BUE9UX01Q VEVfQ09VTlQgZW50cmllcyBpbiBhIE5BUE9UIGdyb3VwLgorICoKKyAqIEFsbCBNUFRFcyBpbiB0 aGUgZ3JvdXAgYXJlIGlkZW50aWNhbAorICovCitzdGF0aWMgaW5saW5lIHU2NCBydjY0X25hcG90 X2xlYWZfbXB0ZSh1OCB4d3IpCit7CisJdTY0IG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVf TCB8IFNCSV9NUFRFX047CisKKwltcHRlID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIDAs IHh3cik7CisJbXB0ZSB8PSAoKHU2NClSVjY0X05BUE9UX0cgPDwgUlY2NF9OQVBPVF9HX1NISUZU KTsKKworCXJldHVybiBtcHRlOworfQorCisvKgorICogcnY2NF9uYXBvdF9sZWFmX3h3cigpIOKA lCByZWNvdmVyIHRoZSB1bmlmb3JtIFhXUiBmcm9tIGEgTkFQT1QgbGVhZi4KKyAqLworc3RhdGlj IGlubGluZSB1OCBydjY0X25hcG90X2xlYWZfeHdyKHU2NCBtcHRlKQoreworCXJldHVybiAoKG1w dGUgPj4gU0JJX01QVEVfWFdSX0JBU0UpICYgU0JJX01QVEVfWFdSX01BU0spOworfQorCisvKgor ICogcnY2NF9uYXBvdF9kZW1vdGUoKSDigJQgQ29udmVydCBhIE5hcG90IE1QVEUgZ3JvdXAgaW50 byBSVjY0X05BUE9UX01QVEVfQ09VTlQKKyAqIG5vcm1hbChOb24tTmFwb3QpIE1QVEUgY2Fycnlp bmcgdGhlIFNBTUUgcGVybWlzc2lvbi4KKyAqCisgKiBsZWFmX21wdGVfcGEgaXMgYW55IGxlYWYg bXB0ZSBwYSBmcm9tIHRoZSBOYXBvdCBncm91cAorICovCitzdGF0aWMgdm9pZCBydjY0X25hcG90 X2RlbW90ZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwKKwkJCSAgICAgIHVuc2lnbmVkIGxv bmcgbGVhZl9tcHRlX3BhLCB1bnNpZ25lZCBsb25nIHBhKQoreworCXU4IHh3cjsKKwl1MzIgcG4w LCBwZywgaTsKKwl1NjQgbGVhZjsKKwl1bnNpZ25lZCBsb25nIGdycF9iYXNlOworCisJeHdyID0g cnY2NF9uYXBvdF9sZWFmX3h3cihydjY0X3JlYWRfbXB0ZShsZWFmX21wdGVfcGEpKTsKKwlwbjAg PSBydjY0X3RhYmxlX2lkeChwYSwgMCwgZG9tLT5tb2RlKTsKKwlncnBfYmFzZSA9IGxlYWZfbXB0 ZV9wYSAtIChwbjAgJiAoUlY2NF9OQVBPVF9NUFRFX0NPVU5UIC0gMSkpICogUlY2NF9NUFRFX1NJ WkU7CisJbGVhZiA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOworCisJZm9yIChwZyA9IDA7IHBn IDwgUlY2NF9QQUdFU19QRVJfTVBURTsgcGcrKykKKwkJbGVhZiA9IHNiaV9tcHRlX2xlYWZfc2V0 X3h3cihsZWFmLCBwZywgeHdyKTsKKworCWZvciAoaSA9IDA7IGkgPCBSVjY0X05BUE9UX01QVEVf Q09VTlQ7IGkrKykKKwkJcnY2NF93cml0ZV9tcHRlKGdycF9iYXNlICsgaSAqIFJWNjRfTVBURV9T SVpFLCBsZWFmKTsKK30KKworLyoKKyAqIE1QVCB0YWJsZSBiZXN0LWxldmVsIHNlbGVjdGlvbgor ICoKKyAqIFJldHVybnMgdGhlIGhpZ2hlc3QgbGV2ZWwgYXQgd2hpY2ggdGhlIHJhbmdlIFtwYSwg cGErc2l6ZV0gY2FuIGJlCisgKiBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGxlYWYgTVBURS4gTGV2ZWwg MCBpcyBhbHdheXMgdmFsaWQgYmVjYXVzZSB0aGF0cworICogdGhlIGxhc3QgcmVzb3J0LgorICov CitzdGF0aWMgdTMyIHJ2NjRfYmVzdF9sZXZlbCh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBs b25nIHNpemUsCisJCQkgICB1MzIgdG9wX2xldmVsKQoreworCXUzMiBsdmw7CisJdW5zaWduZWQg bG9uZyByYW5nZTsKKworCWZvciAobHZsID0gdG9wX2xldmVsOyBsdmwgPj0gMTsgbHZsLS0pIHsK KwkJcmFuZ2UgPSBydjY0X21wdGVfcmFuZ2UobHZsKTsKKworCQlpZiAoc2l6ZSA+PSByYW5nZSAm JiAocGEgJiAocmFuZ2UgLSAxKSkgPT0gMCkKKwkJCXJldHVybiBsdmw7CisJfQorCXJldHVybiAw OworfQorCisvKgorICogR2VuZXJpYyBOLWxldmVsIHdhbGsgd2l0aCBsYXp5IHRhYmxlIGFsbG9j YXRpb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnY2NF9zcGxpdF9sZWFmKHVuc2lnbmVk IGxvbmcgcGFyZW50X2VwKQoreworCXU2NCBwYXJlbnQgPSBydjY0X3JlYWRfbXB0ZShwYXJlbnRf ZXApOworCXVuc2lnbmVkIGxvbmcgc3ViOworCXUzMiBqLCBwZywgc2g7CisJdTggeHdyOworCXU2 NCBjaGlsZDsKKworCXN1YiA9IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjY0X1RBQkxFX1NJWkUsIFNC SV9NUFRfUEFHRV9TSVpFKTsKKwlpZiAoIXN1YikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGogPSAw OyBqIDwgUlY2NF9JTk5FUl9FTlRSSUVTOyBqKyspIHsKKwkJc2ggPSBzYmlfbXB0ZV94d3Jfc2hp ZnQoaiA+PiA1KTsKKwkJeHdyID0gKCgodW5zaWduZWQgbG9uZylwYXJlbnQgPj4gc2gpICYgU0JJ X01QVEVfWFdSX01BU0spOworCQljaGlsZCA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOyAvKiBO PTAgdW5pZm9ybSBsZWFmICovCisKKwkJZm9yIChwZyA9IDA7IHBnIDwgUlY2NF9QQUdFU19QRVJf TVBURTsgcGcrKykKKwkJCWNoaWxkID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKGNoaWxkLCBwZywg eHdyKTsKKworCQlydjY0X3dyaXRlX21wdGUoc3ViICsgaiAqIFJWNjRfTVBURV9TSVpFLCBjaGls ZCk7CisJfQorCisJLyogcGFyZW50IGxlYWYgLT4gbm9uLWxlYWYgcG9pbnRlciB0byBNUFQgc3Vi IHRhYmxlLiAqLworCXJ2NjRfd3JpdGVfbXB0ZShwYXJlbnRfZXAsIHNiaV9tcHRlX25vbmxlYWYo c3ViKSk7CisKKwlyZXR1cm4gc3ViOworfQorCisvKgorICogV2FsayBhIE1QVCB0YWJsZSBhbmQg cmV0dXJuIE1QVEUgUEEgYW5kIGl0cyBzdWl0YWJsZSBsZXZlbAorICovCitzdGF0aWMgdW5zaWdu ZWQgbG9uZyBydjY0X3dhbGtfYWxsb2Moc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkJ ICAgICB1bnNpZ25lZCBsb25nIHBhLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJ CSAgICAgdTMyICpvdXRfbGV2ZWwsCisJCQkJICAgICB1MzIgdG9wX2xldmVsKQoreworCXUzMiBs dmwsIGlkeDsKKwl1NjQgbXB0ZTsKKwl1bnNpZ25lZCBsb25nIGVwLCBzdWIsIG5ld19wYTsKKwlj b25zdCBzdHJ1Y3Qgc2JpX21wdF9tb2RlICpzY2ggPSBkb20tPm1vZGU7CisJdW5zaWduZWQgbG9u ZyB0YWJsZV9wYSA9IGRvbS0+cm9vdF9wYTsKKwl1MzIgYmVzdF9sdmwgPSBydjY0X2Jlc3RfbGV2 ZWwocGEsIHNpemUsIHRvcF9sZXZlbCk7CisKKworCWZvciAobHZsID0gdG9wX2xldmVsOyBsdmwg Pj0gMTsgbHZsLS0pIHsKKwkJaWR4ID0gcnY2NF90YWJsZV9pZHgocGEsIGx2bCwgc2NoKTsKKwkJ ZXAgPSBydjY0X21wdGVfcGEodGFibGVfcGEsIGlkeCk7CisJCW1wdGUgPSBydjY0X3JlYWRfbXB0 ZShlcCk7CisKKwkJaWYgKG1wdGUgJiBTQklfTVBURV9MKSB7CisJCQlpZiAobHZsID4gYmVzdF9s dmwpIHsKKwkJCQlzdWIgPSBydjY0X3NwbGl0X2xlYWYoZXApOworCQkJCWlmICghc3ViKQorCQkJ CQlyZXR1cm4gMDsKKworCQkJCXRhYmxlX3BhID0gc3ViOworCQkJCWNvbnRpbnVlOworCQkJfQor CisJCQkqb3V0X2xldmVsID0gbHZsOworCQkJcmV0dXJuIGVwOworCQl9CisKKwkJaWYgKCEobXB0 ZSAmIFNCSV9NUFRFX1YpKSB7CisJCQlpZiAobHZsIDw9IGJlc3RfbHZsKSB7CisJCQkJKm91dF9s ZXZlbCA9IGx2bDsKKwkJCQlyZXR1cm4gZXA7CisJCQl9CisJCQkvKiBBbGxvY2F0ZSBpbm5lciB0 YWJsZSAoYWx3YXlzIDRLaUIsIGFsbCBsZXZlbHMsIGFsbCBtb2RlcykgKi8KKwkJCW5ld19wYSA9 IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjY0X1RBQkxFX1NJWkUsCisJCQkJCQkgICAgU0JJX01QVF9Q QUdFX1NJWkUpOworCQkJaWYgKCFuZXdfcGEpCisJCQkJcmV0dXJuIDA7CisKKwkJCXJ2NjRfd3Jp dGVfbXB0ZShlcCwgKHU2NClzYmlfbXB0ZV9ub25sZWFmKG5ld19wYSkpOworCQkJdGFibGVfcGEg PSBuZXdfcGE7CisJCX0KKwkJZWxzZSB7CisJCQl0YWJsZV9wYSA9IHJ2NjRfbmV4dF90YWJsZV9w YShtcHRlKTsKKwkJfQorCX0KKworCSpvdXRfbGV2ZWwgPSAwOworCisJcmV0dXJuIHJ2NjRfbXB0 ZV9wYSh0YWJsZV9wYSwgcnY2NF90YWJsZV9pZHgocGEsIDAsIHNjaCkpOworfQorCisvKgorICog R2VuZXJpYyBtYXBfcmFuZ2Ug4oCUIHNoYXJlZCBieSBTbW1wdDQzLCBTbW1wdDUyLCBTbW1wdDY0 CisgKgorICogTWFwcyBhIHJhbmdlIFtwYSwgcGErc2l6ZV0gaW4gdGhlIE1QVCB0YWJsZQorICov CitzdGF0aWMgaW50IF9fcnY2NF9tYXBfcmFuZ2Uoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20s CisJCQkgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgIHU4 IHh3ciwgdTMyIHRvcF9sZXZlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGN1ciA9IHBhOworCXVuc2ln bmVkIGxvbmcgZW5kID0gcGEgKyBzaXplOworCXVuc2lnbmVkIGxvbmcgbGVhZl9tcHRlX3BhLCBt cHRlX3JhbmdlLCBtcHRlX2Jhc2UsIG1wdGVfZW5kLCBiYXRjaF9lbmQ7CisJdTMyIGxldmVsLCBw bjAsIGksIHBnX2ZpcnN0LCBwZ19sYXN0LCBwZzsKKwl1NjQgbmFwb3QsIG1wdGU7CisKKwl3aGls ZSAoY3VyIDwgZW5kKSB7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSByZWdpb24gcXVhbGlmaWVz IGZvciBOQVBPVCByYW5nZSBhbmQgdGhlCisJCSAqIHJlZ2lvbiBpcyBjb250YWluZWQKKwkJICov CisJCWlmICgoY3VyICYgKFJWNjRfTkFQT1RfU0laRSAtIDEpKSA9PSAwICYmCisJCQkJY3VyICsg UlY2NF9OQVBPVF9TSVpFID4gY3VyICYmCisJCQkJY3VyICsgUlY2NF9OQVBPVF9TSVpFIDw9IGVu ZCkgeworCQkJbGVhZl9tcHRlX3BhID0gcnY2NF93YWxrX2FsbG9jKGRvbSwgY3VyLCBlbmQgLSBj dXIsICZsZXZlbCwgdG9wX2xldmVsKTsKKwkJCWlmICghbGVhZl9tcHRlX3BhKQorCQkJCXJldHVy biBTQklfRU5PTUVNOworCisJCQlwbjAgPSBydjY0X3RhYmxlX2lkeChjdXIsIDAsIGRvbS0+bW9k ZSk7CisKKwkJCWlmICghUlY2NF9OQVBPVF9ESVNBQkxFICYmIGxldmVsID09IDAgJiYgKHBuMCAm IChSVjY0X05BUE9UX1BOMF9BTElHTiAtIDEpKSA9PSAwKSB7CisJCQkJbmFwb3QgPSBydjY0X25h cG90X2xlYWZfbXB0ZSh4d3IpOworCisJCQkJZm9yIChpID0gMDsgaSA8IFJWNjRfTkFQT1RfTVBU RV9DT1VOVDsgaSsrKQorCQkJCQlydjY0X3dyaXRlX21wdGUobGVhZl9tcHRlX3BhICsgaSAqIFJW NjRfTVBURV9TSVpFLCBuYXBvdCk7CisKKwkJCQljdXIgKz0gUlY2NF9OQVBPVF9TSVpFOworCQkJ CWNvbnRpbnVlOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJbGVhZl9tcHRlX3BhID0gcnY2NF93 YWxrX2FsbG9jKGRvbSwgY3VyLCBlbmQgLSBjdXIsICZsZXZlbCwgdG9wX2xldmVsKTsKKwkJCWlm ICghbGVhZl9tcHRlX3BhKQorCQkJCXJldHVybiBTQklfRU5PTUVNOworCQl9CisKKwkJLyogTm9y bWFsIHBhdGggKi8KKwkJbXB0ZV9yYW5nZSA9IHJ2NjRfbXB0ZV9yYW5nZShsZXZlbCk7CisJCXBn X2ZpcnN0ID0gcnY2NF90dXBsZV9pZHgoY3VyLCBsZXZlbCk7CisJCW1wdGVfYmFzZSA9IGN1ciAm IH4obXB0ZV9yYW5nZSAtIDEpOworCisJCW1wdGVfZW5kID0gbXB0ZV9iYXNlICsgbXB0ZV9yYW5n ZTsKKwkJaWYgKG1wdGVfZW5kIDwgbXB0ZV9iYXNlKQorCQkJbXB0ZV9lbmQgPSB+MFVMOworCisJ CWJhdGNoX2VuZCA9IChlbmQgPCBtcHRlX2VuZCkgPyBlbmQgOiBtcHRlX2VuZDsKKwkJcGdfbGFz dCA9IHJ2NjRfdHVwbGVfaWR4KGJhdGNoX2VuZCAtIFNCSV9NUFRfUEFHRV9TSVpFLCBsZXZlbCk7 CisKKwkJLyoKKwkJKiBJZiB0aGlzIGxldmVsLTAgTVBURSBpcyBhIE5hcG90IG1lbWJlciwgZXhw YW5kIHRoZQorCQkqIHdob2xlIG5hdHVyYWxseS1hbGlnbmVkIGdyb3VwIHRvIHBsYWluIGxlYXZl cyBhbmQgd3JpdGUgc2FtZQorCQkqIHBlcm1pc3Npb25zIHh3cgorCQkqLworCQltcHRlID0gcnY2 NF9yZWFkX21wdGUobGVhZl9tcHRlX3BhKTsKKwkJaWYgKGxldmVsID09IDAgJiYgKG1wdGUgJiAo dTY0KVNCSV9NUFRFX04pKSB7CisJCQlydjY0X25hcG90X2RlbW90ZShkb20sIGxlYWZfbXB0ZV9w YSwgY3VyKTsKKwkJCXNiaV9tcHRfZmVuY2Vfc2RpZChkb20tPnNkaWQpOworCQkJbXB0ZSA9IHJ2 NjRfcmVhZF9tcHRlKGxlYWZfbXB0ZV9wYSk7CisJCX0KKworCQlpZiAoIShtcHRlICYgKHU2NCko U0JJX01QVEVfViB8IFNCSV9NUFRFX0wpKSkKKwkJCW1wdGUgPSAodTY0KShTQklfTVBURV9WIHwg U0JJX01QVEVfTCk7CisKKwkJZm9yIChwZyA9IHBnX2ZpcnN0OyBwZyA8PSBwZ19sYXN0OyBwZysr KQorCQkJbXB0ZSA9IHNiaV9tcHRlX2xlYWZfc2V0X3h3cihtcHRlLCBwZywgeHdyKTsKKworCQly djY0X3dyaXRlX21wdGUobGVhZl9tcHRlX3BhLCBtcHRlKTsKKworCQljdXIgPSBiYXRjaF9lbmQ7 CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXItbW9kZSBtbXB0IGVuY29kaW5nCisg Ki8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ0M19lbmNvZGVfbW1wdCh1bnNpZ25lZCBs b25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29kZShTQklfTU1QVF9N T0RFX1NNTVBUNDMsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0 NTJfZW5jb2RlX21tcHQodW5zaWduZWQgbG9uZyBwcG4sIHUzMiBzZGlkKQoreworCXJldHVybiBz YmlfbW1wdF9lbmNvZGUoU0JJX01NUFRfTU9ERV9TTU1QVDUyLCBzZGlkLCBwcG4pOworfQorCitz dGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDY0X2VuY29kZV9tbXB0KHVuc2lnbmVkIGxvbmcgcHBu LCB1MzIgc2RpZCkKK3sKKwlyZXR1cm4gc2JpX21tcHRfZW5jb2RlKFNCSV9NTVBUX01PREVfU01N UFQ2NCwgc2RpZCwgcHBuKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ0M19yb290 X3RhYmxlX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9UQUJMRV9TSVpFOworfQorCitzdGF0 aWMgdW5zaWduZWQgbG9uZyBzbW1wdDQzX3Jvb3RfdGFibGVfYWxpZ24odm9pZCkKK3sKKwlyZXR1 cm4gU0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNtbXB0NDNfcGFfaW5fcmFu Z2UodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxv bmcgcGFfbWF4ID0gMVVMIDw8IDQzOworCisJcmV0dXJuIChwYSA8IHBhX21heCAmJiBzaXplIDw9 IHBhX21heCAtIHBhKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ1Ml9yb290X3Rh YmxlX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9UQUJMRV9TSVpFOworfQorCitzdGF0aWMg dW5zaWduZWQgbG9uZyBzbW1wdDUyX3Jvb3RfdGFibGVfYWxpZ24odm9pZCkKK3sKKwlyZXR1cm4g U0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNtbXB0NTJfcGFfaW5fcmFuZ2Uo dW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcg cGFfbWF4ID0gMVVMIDw8IDUyOworCisJcmV0dXJuIChwYSA8IHBhX21heCAmJiBzaXplIDw9IHBh X21heCAtIHBhKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ2NF9yb290X3RhYmxl X3NpemUodm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9ST09UX1NNTVBUNjRfU0laRTsKK30KKworc3Rh dGljIHVuc2lnbmVkIGxvbmcgc21tcHQ2NF9yb290X3RhYmxlX2FsaWduKHZvaWQpCit7CisJcmV0 dXJuIFJWNjRfUk9PVF9TTU1QVDY0X1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNtbXB0NjRfcGFf aW5fcmFuZ2UodW5zaWduZWQgbG9uZyBwYSwKKwkJCQl1bnNpZ25lZCBsb25nIHNpemUpCit7CisJ LyoKKwkgKiBTbW1wdDY0IGNvdmVycyB0aGUgZnVsbCA2NC1iaXQgUEEgc3BhY2UuCisJICovCisJ cmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQZXItbW9kZSBtYXBfcmFuZ2Ugd3JhcHBlcnMKKyAq CisgKiBTbW1wdDQzOgorICogUm9vdCBsZXZlbCAyLCA5LWJpdCwgIDUxMiBlbnRyaWVzLCAgNEtp QiByb290IE1QVCBzaXplCisgKgorICogU21tcHQ1MjoKKyAqIFJvb3QgbGV2ZWwgMywgOS1iaXQs ICA1MTIgZW50cmllcywgIDRLaUIgcm9vdCBNUFQgc2l6ZQorICoKKyAqIFNtbXB0NjQ6CisgKiBS b290IGxldmVsIDQsIDEyLWJpdCwgNDA5NiBlbnRyaWVzLCAzMktpQiByb290IE1QVCBzaXplCisg Ki8KKworc3RhdGljIGludCBzbW1wdDQzX21hcF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4g KmRvbSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4 d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfcmFuZ2UoZG9tLCBwYSwgc2l6ZSwgeHdyLCAyKTsK K30KKworc3RhdGljIGludCBzbW1wdDUyX21hcF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4g KmRvbSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4 d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfcmFuZ2UoZG9tLCBwYSwgc2l6ZSwgeHdyLCAzKTsK K30KKworc3RhdGljIGludCBzbW1wdDY0X21hcF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4g KmRvbSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4 d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfcmFuZ2UoZG9tLCBwYSwgc2l6ZSwgeHdyLCA0KTsK K30KKworLyoKKyAqIF9fcnY2NF9tYXBfZnVsbF9yYW5nZSgpIOKAlCBXcml0ZSBldmVyeSBNUFRF IGF0IFJvb3QgTVBUCisgKgorICogV3JpdGVzIHh3ciBpbnRvIGV2ZXJ5IHJvb3QgdGFibGUgTVBU RSBkaXJlY3RseSBhcyBhIGxlYWYKKyAqIHN1cGVycGFnZSBjb3ZlcmluZyB0aGUgbW9kZSBlbnRp cmUgYWRkcmVzc2FibGUgUEEgcmFuZ2UuCisgKiBObyBpbnRlcm1pZGlhdGUgTVBUIHRhYmxlcyBh bGxvY2F0ZWQganVzdCBhbGwgbGVhZiBNUFRFcyBhdAorICogcm9vdCBsZXZlbC4KKyAqLworCitz dGF0aWMgaW50IF9fcnY2NF9tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRv bSwgdTggeHdyLAorCQkJCSB1bnNpZ25lZCBsb25nIHJvb3RfZW50cmllcykKK3sKKwl1MzIgcGc7 CisJdW5zaWduZWQgbG9uZyBpOworCXU2NCBtcHRlID0gU0JJX01QVEVfViB8IFNCSV9NUFRFX0w7 CisKKwlmb3IgKHBnID0gMDsgcGcgPCBSVjY0X1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQltcHRl ID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsg aSA8IHJvb3RfZW50cmllczsgaSsrKQorCQlydjY0X3dyaXRlX21wdGUocnY2NF9tcHRlX3BhKGRv bS0+cm9vdF9wYSwgaSksIG1wdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21t cHQ0M19tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgdTggeHdyKQor eworCXJldHVybiBfX3J2NjRfbWFwX2Z1bGxfcmFuZ2UoZG9tLCB4d3IsIFJWNjRfSU5ORVJfRU5U UklFUyk7Cit9CisKK3N0YXRpYyBpbnQgc21tcHQ1Ml9tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2Jp X21wdF9kb21haW4gKmRvbSwgdTggeHdyKQoreworCXJldHVybiBfX3J2NjRfbWFwX2Z1bGxfcmFu Z2UoZG9tLCB4d3IsIFJWNjRfSU5ORVJfRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbnQgc21tcHQ2 NF9tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgdTggeHdyKQorewor CXJldHVybiBfX3J2NjRfbWFwX2Z1bGxfcmFuZ2UoZG9tLCB4d3IsIFJWNjRfUk9PVF9TTU1QVDY0 X0VOVFJJRVMpOworfQorCisvKgorICogR2V0IHRoZSBhY2Nlc3MgcGVybWlzc2lvbnMoeHdyKSBv ZiBhIFBBCisgKi8KK3N0YXRpYyB1OCBfX3J2NjRfZ2V0X3h3cihzdHJ1Y3Qgc2JpX21wdF9kb21h aW4gKmRvbSwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSB1MzIgdG9wX2xldmVsKQoreworCWNvbnN0 IHN0cnVjdCBzYmlfbXB0X21vZGUgKnNjaCA9IGRvbS0+bW9kZTsKKwl1bnNpZ25lZCBsb25nIHRh YmxlX3BhID0gZG9tLT5yb290X3BhOworCXUzMiBsZXZlbCwgaWR4LCBwaTsKKwl1NjQgbXB0ZTsK KworCWZvciAobGV2ZWwgPSB0b3BfbGV2ZWw7IDsgbGV2ZWwtLSkgeworCQlpZHggPSBydjY0X3Rh YmxlX2lkeChwYSwgbGV2ZWwsIHNjaCk7CisJCW1wdGUgPSBydjY0X3JlYWRfbXB0ZShydjY0X21w dGVfcGEodGFibGVfcGEsIGlkeCkpOworCisJCWlmICghKG1wdGUgJiBTQklfTVBURV9WKSkKKwkJ CXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKKworCQlpZiAoIShtcHRlICYgU0JJX01QVEVfTCkg JiYgKG1wdGUgJiBTQklfTVBURV9OKSkKKwkJCXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKKwor CQlpZiAobXB0ZSAmIFNCSV9NUFRFX0wpIHsKKwkJCWlmIChtcHRlICYgU0JJX01QVEVfTikKKwkJ CQlyZXR1cm4gcnY2NF9uYXBvdF9sZWFmX3h3cihtcHRlKTsKKworCQkJcGkgPSBydjY0X3R1cGxl X2lkeChwYSwgbGV2ZWwpOworCisJCQlyZXR1cm4gKG1wdGUgPj4gc2JpX21wdGVfeHdyX3NoaWZ0 KHBpKSkgJiBTQklfTVBURV9YV1JfTUFTSzsKKwkJfQorCisJCWlmIChsZXZlbCA9PSAwKQorCQkJ cmV0dXJuIFNCSV9NUFRfUEVSTV9OT05FOworCisJCXRhYmxlX3BhID0gcnY2NF9uZXh0X3RhYmxl X3BhKG1wdGUpOworCX0KKworCXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKK30KKworc3RhdGlj IHU4IHNtbXB0NDNfZ2V0X3h3cihzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgdW5zaWduZWQg bG9uZyBwYSkKK3sKKwlyZXR1cm4gX19ydjY0X2dldF94d3IoZG9tLCBwYSwgMik7Cit9CisKK3N0 YXRpYyB1OCBzbW1wdDUyX2dldF94d3Ioc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sIHVuc2ln bmVkIGxvbmcgcGEpCit7CisJcmV0dXJuIF9fcnY2NF9nZXRfeHdyKGRvbSwgcGEsIDMpOworfQor CitzdGF0aWMgdTggc21tcHQ2NF9nZXRfeHdyKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1 bnNpZ25lZCBsb25nIHBhKQoreworCXJldHVybiBfX3J2NjRfZ2V0X3h3cihkb20sIHBhLCA0KTsK K30KKworc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDQzX21vZGUgPSB7CisJLm5hbWUJCQk9ICJT bW1wdDQzIiwKKwkubW9kZV92YWwJCT0gU0JJX01NUFRfTU9ERV9TTU1QVDQzLAorCS5lbmNvZGVf bW1wdAkJPSBzbW1wdDQzX2VuY29kZV9tbXB0LAorCS5tYXBfcmFuZ2UJCT0gc21tcHQ0M19tYXBf cmFuZ2UsCisJLnJvb3RfdGFibGVfc2l6ZQk9IHNtbXB0NDNfcm9vdF90YWJsZV9zaXplLAorCS5y b290X3RhYmxlX2FsaWduCT0gc21tcHQ0M19yb290X3RhYmxlX2FsaWduLAorCS5wYV9pbl9yYW5n ZQkJPSBzbW1wdDQzX3BhX2luX3JhbmdlLAorCS5tYXBfZnVsbF9yYW5nZQkJPSBzbW1wdDQzX21h cF9mdWxsX3JhbmdlLAorCS5nZXRfeHdyCQk9IHNtbXB0NDNfZ2V0X3h3ciwKK307CisKK3N0cnVj dCBzYmlfbXB0X21vZGUgc21tcHQ1Ml9tb2RlID0geworCS5uYW1lCQkJPSAiU21tcHQ1MiIsCisJ Lm1vZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01NUFQ1MiwKKwkuZW5jb2RlX21tcHQJCT0gc21t cHQ1Ml9lbmNvZGVfbW1wdCwKKwkubWFwX3JhbmdlCQk9IHNtbXB0NTJfbWFwX3JhbmdlLAorCS5y b290X3RhYmxlX3NpemUJPSBzbW1wdDUyX3Jvb3RfdGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9h bGlnbgk9IHNtbXB0NTJfcm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFuZ2UJCT0gc21tcHQ1 Ml9wYV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFuZ2UJCT0gc21tcHQ1Ml9tYXBfZnVsbF9yYW5n ZSwKKwkuZ2V0X3h3cgkJPSBzbW1wdDUyX2dldF94d3IsCit9OworCitzdHJ1Y3Qgc2JpX21wdF9t b2RlIHNtbXB0NjRfbW9kZSA9IHsKKwkubmFtZQkJCT0gIlNtbXB0NjQiLAorCS5tb2RlX3ZhbAkJ PSBTQklfTU1QVF9NT0RFX1NNTVBUNjQsCisJLmVuY29kZV9tbXB0CQk9IHNtbXB0NjRfZW5jb2Rl X21tcHQsCisJLm1hcF9yYW5nZQkJPSBzbW1wdDY0X21hcF9yYW5nZSwKKwkucm9vdF90YWJsZV9z aXplCT0gc21tcHQ2NF9yb290X3RhYmxlX3NpemUsCisJLnJvb3RfdGFibGVfYWxpZ24JPSBzbW1w dDY0X3Jvb3RfdGFibGVfYWxpZ24sCisJLnBhX2luX3JhbmdlCQk9IHNtbXB0NjRfcGFfaW5fcmFu Z2UsCisJLm1hcF9mdWxsX3JhbmdlCQk9IHNtbXB0NjRfbWFwX2Z1bGxfcmFuZ2UsCisJLmdldF94 d3IJCT0gc21tcHQ2NF9nZXRfeHdyLAorfTsKKworI2Vsc2UgLyogX19yaXNjdl94bGVuID09IDY0 ICovCisKKy8qCisgKiBTbW1wdDM0IChSVjMyKSAg4oCUICAzNC1iaXQgc3VwZXJ2aXNvciBwaHlz aWNhbCBhZGRyZXNzIChTUEEpCisgKgorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0t Ky0tLS0tLS0tKworICogfCAgcG5bMV0gIHwgIHBuWzBdICB8ICAgIHBpICAgfCBvZmZzZXQgfAor ICogfCBbMzM6MjVdIHwgWzI0OjE1XSB8IFsxNDoxMl0gfCBbMTE6MF0gfAorICogfCAgICA5YiAg IHwgICAxMGIgICB8ICAgIDNiICAgfCAgMTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0tLS0r LS0tLS0tLS0tKy0tLS0tLS0tKworICoKKyAqLworCisjZGVmaW5lIFJWMzJfTVBURV9TSVpFCQkJ NFVMCisjZGVmaW5lIFJWMzJfUk9PVF9FTlRSSUVTCQk1MTJVCisjZGVmaW5lIFJWMzJfTEVBRl9F TlRSSUVTCQkxMDI0VQorI2RlZmluZSBSVjMyX1JPT1RfU0laRQkJCShSVjMyX1JPT1RfRU5UUklF UyAqIFJWMzJfTVBURV9TSVpFKQorI2RlZmluZSBSVjMyX0xFQUZfU0laRQkJCShSVjMyX0xFQUZf RU5UUklFUyAqIFJWMzJfTVBURV9TSVpFKQorCisvKiBwbiBmaWVsZCB3aWR0aHMgKi8KKyNkZWZp bmUgUlYzMl9QTjFfQklUUwkJCTlVCisjZGVmaW5lIFJWMzJfUE4wX0JJVFMJCQkxMFUKKworI2Rl ZmluZSBSVjMyX05VTVBHSU5SQU5HRQkJM1UKKyNkZWZpbmUgUlYzMl9QQUdFU19QRVJfTVBURQkJ KDFVIDw8IFJWMzJfTlVNUEdJTlJBTkdFKQorI2RlZmluZSBSVjMyX1BBR0VTX1BFUl9NUFRFX01B U0sJKFJWMzJfUEFHRVNfUEVSX01QVEUgLSAxKQorCisvKiBSYW5nZSBjb3ZlcmVkIGJ5IG9uZSBN UFRFIGF0IGVhY2ggbGV2ZWwgKi8KKyNkZWZpbmUgUlYzMl9MRUFGX1JBTkdFCQkJKFJWMzJfUEFH RVNfUEVSX01QVEUgKiBTQklfTVBUX1BBR0VfU0laRSkKKyNkZWZpbmUgUlYzMl9ST09UX1JBTkdF CQkJKFJWMzJfTEVBRl9SQU5HRSA8PCBSVjMyX1BOMF9CSVRTKQorCisvKiBOQVBPVCBjb25zdGFu dHMgKEc9NikgKi8KKyNkZWZpbmUgUlYzMl9OQVBPVF9HCQkJNlUKKyNkZWZpbmUgUlYzMl9OQVBP VF9HX1NISUZUCQkxMlUKKyNkZWZpbmUgUlYzMl9OQVBPVF9DT1VOVAkJKDFVIDw8IChSVjMyX05B UE9UX0cgKyAxKSkKKyNkZWZpbmUgUlYzMl9OQVBPVF9TSVpFCQkJKFJWMzJfTkFQT1RfQ09VTlQg KiBSVjMyX0xFQUZfUkFOR0UpCisjZGVmaW5lIFJWMzJfTkFQT1RfUE4wX0FMSUdOCQlSVjMyX05B UE9UX0NPVU5UCisKKy8qCisgKiBTd2l0aCB0byBkaXNhYmxlIE5BUE9UIGNvbXBhY3Rpb24gb2Yg TVBURSBlbnRyaWVzIHdoaWxlIHdyaXRpbmcuCisgKi8KKyNkZWZpbmUgUlYzMl9OQVBPVF9ESVNB QkxFCTAKKworLyoKKyAqIHJ2MzJfcG4xX3RhYmxlX2lkeCgpIOKAlCBleHRyYWN0IHBuWzFdIGZy b20gYSBTUEEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2MzJfcG4xX3RhYmxlX2lkeCh1bnNp Z25lZCBsb25nIHBhKQoreworCXJldHVybiAoKHBhID4+IDI1KSAmIDB4MUZGVSk7Cit9CisKKy8q CisgKiBydjMyX3BuMF90YWJsZV9pZHgoKSDigJQgZXh0cmFjdCBwblswXSBmcm9tIGEgU1BBLgor ICovCitzdGF0aWMgaW5saW5lIHUzMiBydjMyX3BuMF90YWJsZV9pZHgodW5zaWduZWQgbG9uZyBw YSkKK3sKKwlyZXR1cm4gKChwYSA+PiAxNSkgJiAweDNGRlUpOworfQorCitzdGF0aWMgaW5saW5l IHUzMiBydjMyX3R1cGxlX2lkeF9zaGlmdCh1MzIgbGV2ZWwpCit7CisJcmV0dXJuIChsZXZlbCA9 PSAwKSA/IFNCSV9NUFRfUEFHRV9TSElGVCA6IFNCSV9NUFRfUEFHRV9TSElGVCArIFJWMzJfUE4w X0JJVFM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ2MzJfdHVwbGVfaWR4KHVuc2lnbmVkIGxv bmcgcGEsIHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4gKChwYSA+PiBydjMyX3R1cGxlX2lkeF9zaGlm dChsZXZlbCkpICYgUlYzMl9QQUdFU19QRVJfTVBURV9NQVNLKTsKK30KKworLyoKKyAqIEJ5dGVz IGNvdmVyZWQgYnkgb25lIE1QVEUgYXQgdGhlIGdpdmVuIGxldmVsCisgKi8KK3N0YXRpYyBpbmxp bmUgdW5zaWduZWQgbG9uZyBydjMyX21wdGVfcmFuZ2UodTMyIGxldmVsKQoreworCXJldHVybiAo bGV2ZWwgPT0gMCkgPyBSVjMyX0xFQUZfUkFOR0UgOiBSVjMyX1JPT1RfUkFOR0U7Cit9CisKKy8q CisgKiBSVjMyIE1QVEUgUmVhZC9Xcml0ZSBmdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB1 MzIgcnYzMl9yZWFkX21wdGUodW5zaWduZWQgbG9uZyBwYSkKK3sKKwlyZXR1cm4gKih2b2xhdGls ZSB1MzIgKilwYTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ2MzJfd3JpdGVfbXB0ZSh1bnNp Z25lZCBsb25nIHBhLCB1MzIgdikKK3sKKwkqKHZvbGF0aWxlIHUzMiAqKXBhID0gdjsKK30KKwor c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJ2MzJfbXB0ZV9wYSh1bnNpZ25lZCBsb25nIHRh YmxlX3BhLCB1MzIgaWR4KQoreworCXJldHVybiAodGFibGVfcGEgKyBpZHggKiBSVjMyX01QVEVf U0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBydjMyX25leHRfdGFibGVf cGEodTMyIG1wdGUpCit7CisJcmV0dXJuICgobXB0ZSA+PiBTQklfTVBURV9QUE5fU0hJRlQpIDw8 IFNCSV9NUFRfUEFHRV9TSElGVCk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBOYXBvdCBMZWFmIE1Q VEUKKyAqCisgKiBDb25zdHJ1Y3RzIG9uZSBNUFRFIHZhbHVlIHVzZWQgZm9yIGFsbCBSVjMyX05B UE9UX0NPVU5UIGVudHJpZXMKKyAqIGluIGEgTkFQT1QgZ3JvdXAuCisgKgorICogQWxsIE1QVEVz IGluIHRoZSBncm91cCBhcmUgaWRlbnRpY2FsCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2MzJf bmFwb3RfbGVhZih1OCB4d3IpCit7CisJdTMyIG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVf TCB8IFNCSV9NUFRFX047CisKKwltcHRlID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIDAs IHh3cik7CisJbXB0ZSB8PSAoKHUzMilSVjMyX05BUE9UX0cgPDwgUlYzMl9OQVBPVF9HX1NISUZU KTsKKworCXJldHVybiBtcHRlOworfQorCisvKgorICogR2V0IHRoZSB4d3IgZnJvbSBhIE5hcG90 IGxlYWYuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggcnYzMl9uYXBvdF94d3IodTMyIG1wdGUpCit7 CisJcmV0dXJuICgobXB0ZSA+PiBTQklfTVBURV9YV1JfQkFTRSkgJiBTQklfTVBURV9YV1JfTUFT Syk7Cit9CisKKy8qCisgKiBydjMyX25hcG90X2RlbW90ZSgpIOKAlCBDb252ZXJ0IGEgTmFwb3Qg TVBURSBncm91cCBpbnRvIFJWNjRfTkFQT1RfTVBURV9DT1VOVAorICogbm9ybWFsKE5vbi1OYXBv dCkgTVBURSBjYXJyeWluZyB0aGUgU0FNRSBwZXJtaXNzaW9uLgorICoKKyAqIGxlYWZfbXB0ZV9w YSBpcyBhbnkgb2YgdGhlIGdyb3VwIE1QVEUgUEEKKyAqLworc3RhdGljIHZvaWQgcnYzMl9uYXBv dF9kZW1vdGUoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkgICAgICB1bnNpZ25lZCBs b25nIGxlYWZfbXB0ZV9wYSwgdW5zaWduZWQgbG9uZyBwYSkKK3sKKwl1MzIgcGcsIGxlYWYsIGk7 CisJdW5zaWduZWQgbG9uZyBncnBfYmFzZTsKKwl1OCB4d3IgPSBydjMyX25hcG90X3h3cihydjMy X3JlYWRfbXB0ZShsZWFmX21wdGVfcGEpKTsKKwl1MzIgcG4wID0gcnYzMl9wbjBfdGFibGVfaWR4 KHBhKTsKKworCWdycF9iYXNlID0gbGVhZl9tcHRlX3BhIC0gKHBuMCAmIChSVjMyX05BUE9UX0NP VU5UIC0gMSkpICogUlYzMl9NUFRFX1NJWkU7CisKKwlsZWFmID0gKFNCSV9NUFRFX1YgfCBTQklf TVBURV9MKTsgLyogTj0wICovCisKKwlmb3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9N UFRFOyBwZysrKQorCQlsZWFmID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKGxlYWYsIHBnLCB4d3Ip OworCisJZm9yIChpID0gMDsgaSA8IFJWMzJfTkFQT1RfQ09VTlQ7IGkrKykKKwkJcnYzMl93cml0 ZV9tcHRlKGdycF9iYXNlICsgaSAqIFJWMzJfTVBURV9TSVpFLCBsZWFmKTsKK30KKworc3RhdGlj IGlubGluZSB1MzIgcnYzMl9iZXN0X2xldmVsKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxv bmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA+PSBSVjMyX1JPT1RfUkFOR0UgJiYgKHBhICYgKFJWMzJf Uk9PVF9SQU5HRSAtIDEpKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisv KgorICogTVBUIFdhbGsgZm9yIFJWMzIgU21tcHQ0MworICoKKyAqIFJldHVybnMgdGhlIFBBIG9m IHRoZSBNUFRFIGNvdmVyaW5nIHBhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ2MzJfd2Fs a19hbGxvYyhzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxv bmcgcGEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgICB1MzIgKm91dF9s ZXZlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3RfZXAgPSBydjMyX21wdGVfcGEoZG9tLT5yb290 X3BhLCBydjMyX3BuMV90YWJsZV9pZHgocGEpKTsKKwl1MzIgcm9vdF9tcHRlID0gcnYzMl9yZWFk X21wdGUocm9vdF9lcCk7CisJdTMyIGJlc3QgPSBydjMyX2Jlc3RfbGV2ZWwocGEsIHNpemUpOwor CXVuc2lnbmVkIGxvbmcgbGVhZl9wYTsKKworCWlmIChyb290X21wdGUgJiAodTMyKVNCSV9NUFRF X0wpIHsKKwkJLyogRXhpc3Rpbmcgcm9vdC1sZXZlbCBsZWFmICovCisJCSpvdXRfbGV2ZWwgPSAx OworCQlyZXR1cm4gcm9vdF9lcDsKKwl9CisKKwlpZiAoIShyb290X21wdGUgJiAodTMyKVNCSV9N UFRFX1YpICYmIGJlc3QgPT0gMSkgeworCQkvKiBuZXcgZW50cnksIHJhbmdlIGZpdHMgYXQgcm9v dCBsZXZlbCBzbyBza2lwIGxlYWYgYWxsb2NhdGlvbiAqLworCQkqb3V0X2xldmVsID0gMTsKKwkJ cmV0dXJuIHJvb3RfZXA7CisJfQorCisJaWYgKCEocm9vdF9tcHRlICYgKHUzMilTQklfTVBURV9W KSkgeworCQkvKiBBbGxvY2F0ZSBsZWFmIHRhYmxlIGZyb20gZ2xvYmFsIGhlYXAgKi8KKwkJbGVh Zl9wYSA9IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjMyX0xFQUZfU0laRSwKKwkJCQkJICAgICBTQklf TVBUX1BBR0VfU0laRSk7CisJCWlmICghbGVhZl9wYSkKKwkJCXJldHVybiAwOworCisJCXJ2MzJf d3JpdGVfbXB0ZShyb290X2VwLCBzYmlfbXB0ZV9ub25sZWFmKGxlYWZfcGEpKTsKKwkJKm91dF9s ZXZlbCA9IDA7CisKKwkJcmV0dXJuIHJ2MzJfbXB0ZV9wYShsZWFmX3BhLCBydjMyX3BuMF90YWJs ZV9pZHgocGEpKTsKKwl9CisKKwkvKiBWYWxpZCBub24tbGVhZjogZm9sbG93IFBQTiB0byBleGlz dGluZyBsZWFmIHRhYmxlICovCisJKm91dF9sZXZlbCA9IDA7CisKKwlyZXR1cm4gcnYzMl9tcHRl X3BhKHJ2MzJfbmV4dF90YWJsZV9wYShydjMyX3JlYWRfbXB0ZShyb290X2VwKSksIHJ2MzJfcG4w X3RhYmxlX2lkeChwYSkpOworfQorCisvKgorICogc21tcHQzNF9tYXBfcmFuZ2UoKTogTWFwcyBh IHJhbmdlIFtwYSwgcGErc2l6ZV0gaW4gdGhlIE1QVCB0YWJsZQorICovCisKK3N0YXRpYyBpbnQg c21tcHQzNF9tYXBfcmFuZ2Uoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkgICAgIHVu c2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggeHdyKQoreworCXVuc2lnbmVk IGxvbmcgY3VyID0gcGE7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBwYSArIHNpemU7CisJdW5zaWdu ZWQgbG9uZyBsZWFmX21wdGVfcGE7CisJdW5zaWduZWQgbG9uZyBtcHRlX3JhbmdlLCBtcHRlX2Jh c2UsIG1wdGVfZW5kLCBiYXRjaF9lbmQ7CisJdTMyIGxldmVsLCBwZ19maXJzdCwgcGdfbGFzdCwg cGcsIGk7CisJdTMyIG1wdGUsIG5hcG90OworCisJd2hpbGUgKGN1ciA8IGVuZCkgeworCQkvKgor CQkgKiBDaGVjayBpZiB0aGUgcmVnaW9uIHF1YWxpZmllcyBmb3IgTkFQT1QgcmFuZ2UgYW5kIHRo ZQorCQkgKiByZWdpb24gaXMgY29udGFpbmVkCisJCSAqLworCQlpZiAoKGN1ciAmIChSVjMyX05B UE9UX1NJWkUgLSAxKSkgPT0gMCAmJgorCQkJY3VyICsgUlYzMl9OQVBPVF9TSVpFID4gY3VyICYm CisJCQljdXIgKyBSVjMyX05BUE9UX1NJWkUgPD0gZW5kKSB7CisJCQlsZWFmX21wdGVfcGEgPSBy djMyX3dhbGtfYWxsb2MoZG9tLCBjdXIsIGVuZCAtIGN1ciwgJmxldmVsKTsKKwkJCWlmICghbGVh Zl9tcHRlX3BhKQorCQkJCXJldHVybiBTQklfRU5PTUVNOworCisJCQlpZiAoIVJWMzJfTkFQT1Rf RElTQUJMRSAmJiBsZXZlbCA9PSAwICYmIChydjMyX3BuMF90YWJsZV9pZHgoY3VyKSAmIChSVjMy X05BUE9UX1BOMF9BTElHTiAtIDEpKSA9PSAwKSB7CisJCQkJbmFwb3QgPSBydjMyX25hcG90X2xl YWYoeHdyKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBSVjMyX05BUE9UX0NPVU5UOyBpKyspCisJ CQkJCXJ2MzJfd3JpdGVfbXB0ZShsZWFmX21wdGVfcGEgKyBpICogUlYzMl9NUFRFX1NJWkUsIG5h cG90KTsKKworCQkJCWN1ciArPSBSVjMyX05BUE9UX1NJWkU7CisKKwkJCQljb250aW51ZTsKKwkJ CX0KKwkJfSBlbHNlIHsKKwkJCWxlYWZfbXB0ZV9wYSA9IHJ2MzJfd2Fsa19hbGxvYyhkb20sIGN1 ciwgZW5kIC0gY3VyLCAmbGV2ZWwpOworCQkJaWYgKCFsZWFmX21wdGVfcGEpCisJCQkJcmV0dXJu IFNCSV9FTk9NRU07CisJCX0KKworCQkvKiBOb3JtYWwgcGF0aCAqLworCQltcHRlX3JhbmdlID0g cnYzMl9tcHRlX3JhbmdlKGxldmVsKTsKKwkJcGdfZmlyc3QgPSBydjMyX3R1cGxlX2lkeChjdXIs IGxldmVsKTsKKwkJbXB0ZV9iYXNlID0gY3VyICYgfihtcHRlX3JhbmdlIC0gMVVMKTsKKwkJbXB0 ZV9lbmQgPSBtcHRlX2Jhc2UgKyBtcHRlX3JhbmdlOworCQliYXRjaF9lbmQgPSAoZW5kIDwgbXB0 ZV9lbmQpID8gZW5kIDogbXB0ZV9lbmQ7CisJCXBnX2xhc3QgPSBydjMyX3R1cGxlX2lkeChiYXRj aF9lbmQgLSBTQklfTVBUX1BBR0VfU0laRSwgbGV2ZWwpOworCisJCS8qCisJCSogSWYgdGhpcyBs ZXZlbC0wIE1QVEUgaXMgYSBOYXBvdCBtZW1iZXIsIGV4cGFuZCB0aGUKKwkJKiB3aG9sZSBuYXR1 cmFsbHktYWxpZ25lZCBncm91cCB0byBwbGFpbiBsZWF2ZXMgYW5kIHdyaXRlIHNhbWUKKwkJKiBw ZXJtaXNzaW9ucyB4d3IKKwkJKi8KKwkJbXB0ZSA9IHJ2MzJfcmVhZF9tcHRlKGxlYWZfbXB0ZV9w YSk7CisJCWlmIChsZXZlbCA9PSAwICYmIChtcHRlICYgKHUzMilTQklfTVBURV9OKSkgeworCQkJ cnYzMl9uYXBvdF9kZW1vdGUoZG9tLCBsZWFmX21wdGVfcGEsIGN1cik7CisJCQlzYmlfbXB0X2Zl bmNlX3NkaWQoZG9tLT5zZGlkKTsKKwkJCW1wdGUgPSBydjMyX3JlYWRfbXB0ZShsZWFmX21wdGVf cGEpOworCQl9CisJCWlmICghKG1wdGUgJiAodTMyKShTQklfTVBURV9WIHwgU0JJX01QVEVfTCkp KQorCQkJbXB0ZSA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOworCisJCWZvciAocGcgPSBwZ19m aXJzdDsgcGcgPD0gcGdfbGFzdDsgcGcrKykKKwkJCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94 d3IobXB0ZSwgcGcsIHh3cik7CisKKwkJcnYzMl93cml0ZV9tcHRlKGxlYWZfbXB0ZV9wYSwgbXB0 ZSk7CisJCWN1ciA9IGJhdGNoX2VuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1t cHQgZW5jb2RpbmcKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQzNF9lbmNvZGVfbW1w dCh1bnNpZ25lZCBsb25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29k ZShTQklfTU1QVF9NT0RFX1NNTVBUMzQsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25l ZCBsb25nIHNtbXB0MzRfcm9vdF90YWJsZV9zaXplKHZvaWQpCit7CisJcmV0dXJuIFJWMzJfUk9P VF9TSVpFOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDM0X3Jvb3RfdGFibGVfYWxp Z24odm9pZCkKK3sKKwlyZXR1cm4gU0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29s IHNtbXB0MzRfcGFfaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXpl KQoreworCS8qCisJICogUmV0dXJuIHRydWUgc2luY2UgMSA8PCAzNCB3aWwgYmUgVUIKKwkgKiBp biBSVjMyIGNhc2UgYW5kIGFueXdheXMgdmFyaWFibGVzIGFyZSBsaW1pdGVkIGJ5IFJWMzIKKwkg KiBhcmNoaXRlY3R1cmFsIHdpZHRoCisJICovCisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAq IHNtbXB0MzRfbWFwX2Z1bGxfcmFuZ2UoKSDigJQgV3JpdGUgZXZlcnkgTVBURSBhdCBSb290IE1Q VAorICoKKyAqIFdyaXRlcyB4d3IgaW50byBldmVyeSByb290IHRhYmxlIE1QVEUgZGlyZWN0bHkg YXMgYSBsZWFmCisgKiBzdXBlcnBhZ2UgY292ZXJpbmcgdGhlIG1vZGUgZW50aXJlIGFkZHJlc3Nh YmxlIFBBIHJhbmdlLgorICogTm8gaW50ZXJtaWRpYXRlIE1QVCB0YWJsZXMgYWxsb2NhdGVkIGp1 c3QgYWxsIGxlYWYgTVBURXMgYXQKKyAqIHJvb3QgbGV2ZWwuCisgKi8KKworc3RhdGljIGludCBz bW1wdDM0X21hcF9mdWxsX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3Ip Cit7CisJdTMyIG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVfTDsKKwl1MzIgcGcsIGk7CisK Kwlmb3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQltcHRlID0g c2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsgaSA8 IFJWMzJfUk9PVF9FTlRSSUVTOyBpKyspCisJCXJ2MzJfd3JpdGVfbXB0ZShydjMyX21wdGVfcGEo ZG9tLT5yb290X3BhLCBpKSwgbXB0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBh Y2Nlc3MgcGVybWlzc2lvbnMoeHdyKSBvZiBhIFBBICovCitzdGF0aWMgdTggc21tcHQzNF9nZXRf eHdyKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1bnNpZ25lZCBsb25nIHBhKQoreworCXUz MiBtcHRlLCBwaTsKKwl1bnNpZ25lZCBsb25nIHRhYmxlX3BhID0gZG9tLT5yb290X3BhOworCisJ bXB0ZSA9IHJ2MzJfcmVhZF9tcHRlKHJ2MzJfbXB0ZV9wYSh0YWJsZV9wYSwgcnYzMl9wbjFfdGFi bGVfaWR4KHBhKSkpOworCisJaWYgKCEobXB0ZSAmIFNCSV9NUFRFX1YpKQorCQlyZXR1cm4gU0JJ X01QVF9QRVJNX05PTkU7CisKKwlpZiAoIShtcHRlICYgU0JJX01QVEVfTCkgJiYgKG1wdGUgJiBT QklfTVBURV9OKSkKKwkJcmV0dXJuIFNCSV9NUFRfUEVSTV9OT05FOworCisJaWYgKG1wdGUgJiBT QklfTVBURV9MKSB7CisJCWlmIChtcHRlICYgU0JJX01QVEVfTikKKwkJCXJldHVybiBydjMyX25h cG90X3h3cihtcHRlKTsKKworCQlwaSA9IHJ2MzJfdHVwbGVfaWR4KHBhLCAxKTsKKwkJcmV0dXJu IChtcHRlID4+IHNiaV9tcHRlX3h3cl9zaGlmdChwaSkpICYgU0JJX01QVEVfWFdSX01BU0s7CisJ fQorCisJdGFibGVfcGEgPSBydjMyX25leHRfdGFibGVfcGEobXB0ZSk7CisJbXB0ZSA9IHJ2MzJf cmVhZF9tcHRlKHJ2MzJfbXB0ZV9wYSh0YWJsZV9wYSwgcnYzMl9wbjBfdGFibGVfaWR4KHBhKSkp OworCisJaWYgKCEobXB0ZSAmIFNCSV9NUFRFX1YpIHx8ICEobXB0ZSAmIFNCSV9NUFRFX0wpKQor CQlyZXR1cm4gU0JJX01QVF9QRVJNX05PTkU7CisKKwlpZiAobXB0ZSAmIFNCSV9NUFRFX04pCisJ CXJldHVybiBydjMyX25hcG90X3h3cihtcHRlKTsKKworCXBpID0gcnYzMl90dXBsZV9pZHgocGEs IDApOworCisJcmV0dXJuICgobXB0ZSA+PiBzYmlfbXB0ZV94d3Jfc2hpZnQocGkpKSAmIFNCSV9N UFRFX1hXUl9NQVNLKTsKK30KKworc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDM0X21vZGUgPSB7 CisJLm5hbWUgPSAiU21tcHQzNCIsCisJLm1vZGVfdmFsID0gU0JJX01NUFRfTU9ERV9TTU1QVDM0 LAorCS5lbmNvZGVfbW1wdCA9IHNtbXB0MzRfZW5jb2RlX21tcHQsCisJLm1hcF9yYW5nZSA9IHNt bXB0MzRfbWFwX3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUgPSBzbW1wdDM0X3Jvb3RfdGFibGVf c2l6ZSwKKwkucm9vdF90YWJsZV9hbGlnbiA9IHNtbXB0MzRfcm9vdF90YWJsZV9hbGlnbiwKKwku cGFfaW5fcmFuZ2UgPSBzbW1wdDM0X3BhX2luX3JhbmdlLAorCS5tYXBfZnVsbF9yYW5nZSA9IHNt bXB0MzRfbWFwX2Z1bGxfcmFuZ2UsCisJLmdldF94d3IgPSBzbW1wdDM0X2dldF94d3IsCit9Owor CisjZW5kaWYgLyogX19yaXNjdl94bGVuID09IDMyICovCi0tIAoyLjUxLjAKCgotLSAKb3BlbnNi aSBtYWlsaW5nIGxpc3QKb3BlbnNiaUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5p bmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vb3BlbnNiaQo=