ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZ2ZsdDExMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2dmbHQxMTBfZGVmY29uZmlnCmluZGV4IDViNjQxODQuLmE0MjJmNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZ2ZsdDExMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9nZmx0MTEwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKICMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMi4xMQotIyBUaHUgQXVnICAxIDE0OjA3OjU2IDIwMTMKKyMgVGh1IFNlcCAyNiAwODozMzozMSAyMDEzCiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CkBAIC0yMDEsNyArMjAxLDggQEAKICMgRmVyb2Nlb24gU29DIG9wdGlvbnMKICMKIENPTkZJR19NVjg4RjY1MDA9eQotQ09ORklHX01BQ0hfR0ZMVDIwMD15CisjIENPTkZJR19NQUNIX0dGTFQyMDAgaXMgbm90IHNldAorQ09ORklHX01BQ0hfR0ZMVDExMD15CiAjIENPTkZJR19KVEFHX0RFQlVHIGlzIG5vdCBzZXQKIAogIwpAQCAtMjIyLDcgKzIyMyw3IEBACiAjIENPTkZJR19NVl9JTkNMVURFX1RTIGlzIG5vdCBzZXQKIENPTkZJR19NVl9JTkNMVURFX1BPTj15CiBDT05GSUdfTVZfSU5DTFVERV9UUE09eQotQ09ORklHX01WX0lOQ0xVREVfQ1VTVD15CitDT05GSUdfTVZfSU5DTFVERV9DUEg9eQogQ09ORklHX01WX0lOQ0xVREVfU1dJVENIPXkKIENPTkZJR19NVl9HUFBfTUFYX1BJTlM9NzAKIENPTkZJR19NVl9EQ0FDSEVfU0laRT0weDQwMDAKQEAgLTM0NSw3ICszNDYsNyBAQAogIwogIyBDb250cm9sIGFuZCBTdGF0aXN0aWNzCiAjCi1DT05GSUdfTVZfRVRIX0RFQlVHX0NPREU9eQorIyBDT05GSUdfTVZfRVRIX0RFQlVHX0NPREUgaXMgbm90IHNldAogQ09ORklHX01WX0VUSF9TVEFUX0VSUj15CiBDT05GSUdfTVZfRVRIX1NUQVRfSU5GPXkKIENPTkZJR19NVl9FVEhfU1RBVF9EQkc9eQpAQCAtNDEwLDE0ICs0MTEsMTggQEAKICMKIAogIwotIyBTb0MgQ1VTVCBzdXBwb3J0CisjIFNvQyBDUEggc3VwcG9ydAogIwotQ09ORklHX01WX0NVU1Q9eQotQ09ORklHX01WX0NVU1RfSUdNUF9IQU5ETEU9eQotQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRT15Ci1DT05GSUdfTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEU9eQotIyBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEU9eQorQ09ORklHX01WX0NQSD15CisKKyMKKyMgQ1BIIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfTVZfQ1BIX0lHTVBfSEFORExFPXkKK0NPTkZJR19NVl9DUEhfTUxEX0hBTkRMRT15CitDT05GSUdfTVZfQ1BIX0JDX0hBTkRMRT15CisjIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUgaXMgbm90IHNldAorQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEU9eQogCiAjCiAjIFNvQyBQT04gc3VwcG9ydApAQCAtMTIzMiw3ICsxMjM3LDMzIEBACiAjIENPTkZJR19NTUNfQ0I3MTAgaXMgbm90IHNldAogIyBDT05GSUdfTU1DX1ZJQV9TRE1NQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorCisjCisjIExFRCBkcml2ZXJzCisjCisjIENPTkZJR19MRURTX1BDQTk1MzIgaXMgbm90IHNldAorQ09ORklHX0xFRFNfR1BJTz15CitDT05GSUdfTEVEU19HUElPX1BMQVRGT1JNPXkKKyMgQ09ORklHX0xFRFNfTFAzOTQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfUENBOTU1WCBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX0JEMjgwMiBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCitDT05GSUdfTEVEU19UUklHR0VSUz15CitDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKKyMgQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQgaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19UUklHR0VSX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX1RSSUdHRVJfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTiBpcyBub3Qgc2V0CitDT05GSUdfTEVEU19UUklHR0VSX0RPTlRfQ0xPQkJFUl9CUklHSFRORVNTPXkKKworIworIyBpcHRhYmxlcyB0cmlnZ2VyIGlzIHVuZGVyIE5ldGZpbHRlciBjb25maWcgKExFRCB0YXJnZXQpCisjCiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQpAQCAtMTI2MCw2ICsxMjkxLDcgQEAKICMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1MjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvS2NvbmZpZwppbmRleCA3OGE1YmU3Li4xNGM2YTM4IDEwMDc1NQotLS0gYS9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL0tjb25maWcKQEAgLTE4LDYgKzE4LDEwIEBACiAJYm9vbCAiR0ZMVDIwMCBib2FyZCIKIAlkZXBlbmRzIG9uIE1WODhGNjUwMAogCitjb25maWcgTUFDSF9HRkxUMTEwCisJYm9vbCAiR0ZMVDExMCBib2FyZCIKKwlkZXBlbmRzIG9uIE1WODhGNjUwMAorCiBlbmRjaG9pY2UKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvTWFrZWZpbGUKaW5kZXggOWVkMDUxMi4uYmY1ZThhOSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvTWFrZWZpbGUKQEAgLTIyMiw4ICsyMjIsOCBAQAogI1RQTQogb2JqLSQoQ09ORklHX01WX1RQTSkgKz0gLi4vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vCiAKLSNDVVNUCi1vYmotJChDT05GSUdfTVZfQ1VTVCkgKz0gLi4vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0LworI0NQSAorb2JqLSQoQ09ORklHX01WX0NQSCkgKz0gLi4vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvCiAKICNNQUNfTEVBUk4KIG9iai0kKENPTkZJR19NVl9NQUNfTEVBUk4pICs9IC4uL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbWFjX2xlYXJuLwpAQCAtMjQ0LDQgKzI0NCw1IEBACiAKICMgQm9hcmQKIG9iai0kKENPTkZJR19NQUNIX0dGTFQyMDApCQkrPSBib2FyZC1nZmx0MjAwLm8KK29iai0kKENPTkZJR19NQUNIX0dGTFQxMTApCQkrPSBib2FyZC1nZmx0MTEwLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvYm9hcmQtZ2ZsdDExMC5jIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvYm9hcmQtZ2ZsdDExMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmYxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9ib2FyZC1nZmx0MTEwLmMKQEAgLTAsMCArMSwxMjggQEAKKyNpbmNsdWRlIDxib2FyZEVudi9tdkJvYXJkRW52TGliLmg+CisjaW5jbHVkZSA8Z3BwL212R3BwLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2RlZmluZSBCT0FSRF9OQU1FCQkiZ2ZsdDExMCIKKworc3RhdGljIHNzaXplX3QgYm9hcmRfaHdfdmVyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjEuMFxuIik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihod192ZXIsIFNfSVJVR08sIGJvYXJkX2h3X3Zlcl9zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBib2FyZF9ncGlvX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lID0gInN5cy1ibHVlIiwKKwkJLmdwaW8gPSAxMiwKKwkJLmRlZmF1bHRfc3RhdGUgPSBMRURTX0dQSU9fREVGU1RBVEVfT0ZGLAorCX0sCisJeworCQkubmFtZSA9ICJzeXMtcmVkIiwKKwkJLmdwaW8gPSAxMywKKwkJLmRlZmF1bHRfc3RhdGUgPSBMRURTX0dQSU9fREVGU1RBVEVfT04sCisJfSwKK307CisKK3N0YXRpYyBpbnQgYm9hcmRfZ3Bpb19ibGlua19zZXQodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbG9uZyAqZGVsYXlfb24sCisJCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGJvYXJkX2dwaW9fbGVkc19kYXRhID0geworCS5ncGlvX2JsaW5rX3NldCA9IGJvYXJkX2dwaW9fYmxpbmtfc2V0LAorfTsKKworaW50IGJvYXJkX2dwaW9fYmxpbmtfc2V0KHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAorCQkJIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZikKK3sKKwlpbnQgaTsKKwlpbnQgYWN0aXZlX2xvdzsKKwlNVl9VMzIgbWFzayA9IDEgPDwgKGdwaW8gJTMyKTsKKwlNVl9VMzIgZ3JvdXAgPSBncGlvIC8gMzI7CisJTVZfVTMyIGN5Y2xlc19wZXJfbXMgPSBtdkJvYXJkVGNsa0dldCgpIC8gMTAwMDsKKwl1bnNpZ25lZCBsb25nIG1heF9kZWxheSA9IH4wIC8gY3ljbGVzX3Blcl9tczsKKworCWZvciAoaSA9IDA7IGkgPCBib2FyZF9ncGlvX2xlZHNfZGF0YS5udW1fbGVkczsgaSsrKSB7CisJCWlmIChncGlvID09IGJvYXJkX2dwaW9fbGVkc19kYXRhLmxlZHNbaV0uZ3BpbykgeworCQkJYWN0aXZlX2xvdyA9IGJvYXJkX2dwaW9fbGVkc19kYXRhLmxlZHNbaV0uYWN0aXZlX2xvdzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gYm9hcmRfZ3Bpb19sZWRzX2RhdGEubnVtX2xlZHMpCisJCXJldHVybiAtRUlOVkFMOworCisJKmRlbGF5X29uID0gbWluKCpkZWxheV9vbiwgbWF4X2RlbGF5KTsKKwkqZGVsYXlfb2ZmID0gbWluKCpkZWxheV9vZmYsIG1heF9kZWxheSk7CisKKwlpZiAoKmRlbGF5X29uICYmICpkZWxheV9vZmYpIHsKKwkJaWYgKGFjdGl2ZV9sb3cpCisJCQltdkdwcEJsaW5rQ250clNldChNVl9HUFBfQkxJTktfQ05UUl9BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlbGF5X29mZiAqIGN5Y2xlc19wZXJfbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVsYXlfb24gKiBjeWNsZXNfcGVyX21zKTsKKwkJZWxzZQorCQkJbXZHcHBCbGlua0NudHJTZXQoTVZfR1BQX0JMSU5LX0NOVFJfQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZWxheV9vbiAqIGN5Y2xlc19wZXJfbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVsYXlfb2ZmICogY3ljbGVzX3Blcl9tcyk7CisKKwkJbXZHcHBCbGlua0VuKGdyb3VwLCBtYXNrLCBtYXNrKTsKKwl9CisJZWxzZQorCQltdkdwcEJsaW5rRW4oZ3JvdXAsIG1hc2ssIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJvYXJkX2dwaW9fbGVkc19kZXZpY2UgPSB7CisgICAgICAgIC5uYW1lID0gImxlZHMtZ3BpbyIsCisgICAgICAgIC5pZCA9IC0xLAorICAgICAgICAuZGV2LnBsYXRmb3JtX2RhdGEgPSAmYm9hcmRfZ3Bpb19sZWRzX2RhdGEsCit9OworCitpbnQgX19pbml0IGJvYXJkX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworCWJvYXJkX2dwaW9fbGVkc19kYXRhLm51bV9sZWRzCisJCQk9IEFSUkFZX1NJWkUoYm9hcmRfZ3Bpb19sZWRzKTsKKwlib2FyZF9ncGlvX2xlZHNfZGF0YS5sZWRzID0gYm9hcmRfZ3Bpb19sZWRzOworCisJLyogL3N5cy9kZXZpY2VzL3BsYXRmb3JtLzxib2FyZF9uYW1lPiAqLworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKEJPQVJEX05BTUUsIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CisJCXJjID0gUFRSX0VSUihwZGV2KTsKKwkJcHJfZXJyKEJPQVJEX05BTUUgIjogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgZGV2aWNlXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vYm9hcmQgLT4gL3N5cy9kZXZpY2VzL3BsYXRmb3JtLzxib2FyZF9uYW1lPiAqLworCXJjID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBkZXYtPmRldi5wYXJlbnQtPmtvYmosICZwZGV2LT5kZXYua29iaiwKKwkJCSAgICAgICAiYm9hcmQiKTsKKwlpZiAocmMpCisJCXByX2VycihCT0FSRF9OQU1FICI6IGVycm9yICVkIGNyZWF0aW5nIGxpbmsgJ2JvYXJkJ1xuIiwgcmMpOworCisJLyogL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2JvYXJkL2h3X3ZlciAqLworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9od192ZXIpOworCWlmIChyYykKKwkJcHJfZXJyKEJPQVJEX05BTUUgIjogZXJyb3IgJWQgY3JlYXRpbmcgYXR0cmlidXRlICdod192ZXInXG4iLAorCQkJcmMpOworCisJcmMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmJvYXJkX2dwaW9fbGVkc19kZXZpY2UpOworCWlmIChyYykKKwkJcHJfZXJyKEJPQVJEX05BTUUgIjogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgR1BJTyBMRURzIGRldmljZVxuIiwKKwkJCXJjKTsKKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwoYm9hcmRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9jb25maWcvbXZSdWxlcy5tayBiL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2NvbmZpZy9tdlJ1bGVzLm1rCmluZGV4IDdjNDRhNWQuLjFlZmI5YjkgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2NvbmZpZy9tdlJ1bGVzLm1rCisrKyBiL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2NvbmZpZy9tdlJ1bGVzLm1rCkBAIC02Myw4ICs2Myw4IEBACiBMU1BfVFBNX1BMQVRfRElSICA9ICQoUExBVF9EUklWRVJTKS9tdl90cG0vcGxhdAogZW5kaWYKIAotaWZlcSAoJChDT05GSUdfTVZfSU5DTFVERV9DVVNUKSx5KQotTFNQX0NVU1RfQ09SRV9ESVIgID0gJChQTEFUX0RSSVZFUlMpL212X2N1c3QKK2lmZXEgKCQoQ09ORklHX01WX0lOQ0xVREVfQ1BIKSx5KQorTFNQX0NQSF9DT1JFX0RJUiAgPSAkKFBMQVRfRFJJVkVSUykvbXZfY3BoCiBlbmRpZgogCiBMU1BfRVpYTUxfRElSICAgICA9ICQoUExBVF9EUklWRVJTKS9tdl9lenhtbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IDZjYWI0NjMuLjFmMjYwNDUgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTMxLDcgKzMxLDcgQEAKIAljcHVfZG9faWRsZSgpOwogfQogCi0jZGVmaW5lIFVQT05fU0RLX1ZFUlNJT04gInVQT05fMi42LjI1X1JDNzciCisjZGVmaW5lIFVQT05fU0RLX1ZFUlNJT04gInVQT05fMi43LjI1X1JDOCIKIAogI2lmZGVmIF9fQklHX0VORElBTgogI2RlZmluZSBNVl9BUk1fMzJCSVRfTEUoWCkgKCgoKFgpJjB4ZmYpPDwyNCkgfCAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIva3cyX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIva3cyX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oCmluZGV4IDU1NjdmNTMuLjYzZTkxMGIgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2t3Ml9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaAorKysgYi9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9rdzJfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgKQEAgLTU0Myw3ICs1NDMsNyBAQAogI2RlZmluZSBHRkxUMTEwX01QUDBfNwkJMHgyMjIyMjIyMAogI2RlZmluZSBHRkxUMTEwX01QUDhfMTUJCTB4MDAwMDAwMDIKICNkZWZpbmUgR0ZMVDExMF9NUFAxNl8yMwkJMHgwMDQwMDAwMAotI2RlZmluZSBHRkxUMTEwX01QUDI0XzMxCQkweDAwMjAwNjUwCisjZGVmaW5lIEdGTFQxMTBfTVBQMjRfMzEJCTB4MDAyMDA1NTAKICNkZWZpbmUgR0ZMVDExMF9NUFAzMl8zNwkJMHgwMDAwMDAwMAogCiAvKiBHUFBzCkBAIC01NjksNyArNTY5LDkgQEAKICNkZWZpbmUgR0ZMVDExMF9HUFBfT1VUX0VOQV9MT1cJKEJJVDAgfCBCSVQxNCB8IEJJVDE2IHwgQklUMTcgfCBCSVQxOCB8IEJJVDE5IHwgQklUMjIgfCBCSVQyMyB8IEJJVDI0IHwgQklUMjd8IEJJVDMwIHwgQklUMzEpCiAjZGVmaW5lIEdGTFQxMTBfR1BQX09VVF9FTkFfTUlECShCSVQwIHwgQklUMyB8IEJJVDQpCiAKLSNkZWZpbmUgR0ZMVDExMF9HUFBfT1VUX1ZBTF9MT1cJMHgwCisvLyBCSVQxMiB0dXJucyB0aGUgTEVEIGJsdWUuCisvLyBCSVQxMyB0dXJucyB0aGUgTEVEIHJlZC4KKyNkZWZpbmUgR0ZMVDExMF9HUFBfT1VUX1ZBTF9MT1cJQklUMTMKICNkZWZpbmUgR0ZMVDExMF9HUFBfT1VUX1ZBTF9NSUQJMHgwCiAKICNkZWZpbmUgR0ZMVDExMF9HUFBfUE9MX0xPVwkJKEJJVDIzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9LY29uZmlnCmluZGV4IGE5OTQ0OGUuLjEzY2Q1NDAgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL0tjb25maWcKQEAgLTEyMSw4ICsxMjEsOCBAQAogICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgIFBsZWFzZSBkb24ndCBjaGFuZ2UgdGhpcyBjb25maWdzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAKLWNvbmZpZyBNVl9JTkNMVURFX0NVU1QKLQlib29sICJDdXN0b21lciBkcml2ZXIgU3VwcG9ydCIKK2NvbmZpZyBNVl9JTkNMVURFX0NQSAorCWJvb2wgIkNQSCBTdXBwb3J0IgogCWRlcGVuZHMgb24gTVY4OEY2NTAwCiAJZGVmYXVsdCB5CiAgICAgICAgIC0tLWhlbHAtLS0KQEAgLTQwMyw3ICs0MDMsNyBAQAogCiBzb3VyY2UgYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90c3UvS2NvbmZpZwogCi1zb3VyY2UgYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L0tjb25maWcKK3NvdXJjZSBhcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9LY29uZmlnCiAKIHNvdXJjZSBhcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9LY29uZmlnCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4NWU4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9LY29uZmlnCkBAIC0wLDAgKzEsMzcgQEAKK21lbnUgIlNvQyBDUEggc3VwcG9ydCIKK2RlcGVuZHMgb24gTVZfSU5DTFVERV9DUEgKKworY29uZmlnICBNVl9DUEgKKyAgICAgICAgYm9vbCAiU3VwcG9ydCBmb3IgTWFydmVsbCBDUFUgUGFja2V0IEhhbmRsZXIgRHJpdmVyIgorICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgLS0taGVscC0tLQorCitjb21tZW50ICJDUEggRHJpdmVyIE9wdGlvbnMiCitkZXBlbmRzIG9uIE1WX0NQSAorCitjb25maWcgIE1WX0NQSF9JR01QX0hBTkRMRQorICAgICAgICBib29sICJFbmFibGUgTVZfQ1BIIElHTVAgaGFuZGxpbmciCisgICAgICAgIGRlZmF1bHQgeQorICAgICAgICAtLS1oZWxwLS0tCisKK2NvbmZpZyAgTVZfQ1BIX01MRF9IQU5ETEUKKyAgICAgICAgYm9vbCAiRW5hYmxlIE1WX0NQSCBNTEQgaGFuZGxpbmciCisgICAgICAgIGRlZmF1bHQgeQorICAgICAgICAtLS1oZWxwLS0tCisKK2NvbmZpZyAgTVZfQ1BIX0JDX0hBTkRMRQorICAgICAgICBib29sICJFbmFibGUgTVZfQ1BIIGJyb2FkY2FzdCBoYW5kbGluZyIKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgCitjb25maWcgIE1WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorICAgICAgICBib29sICJFbmFibGUgTVZfQ1BIIHNhbXBsZSBVRFAgaGFuZGxpbmciCisgICAgICAgIGRlZmF1bHQgbgorICAgICAgICAtLS1oZWxwLS0tCisKK2NvbmZpZyAgTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorICAgICAgICBib29sICJFbmFibGUgTVZfQ1BIIGZsb3cgbWFwcGluZyBoYW5kbGluZyIKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIC0tLWhlbHAtLS0gICAgICAgIAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkMGRjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9NYWtlZmlsZQpAQCAtMCwwICsxLDI1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTWFydmVsbCBDUFUgUGFja2V0IEhhbmRsZXIKKyMKKworaWZlcSAoJChDT05GSUdfQVJDSF9GRVJPQ0VPTikseSkKKwlpbmNsdWRlICQoc3JjdHJlZSkvJChNQUNISU5FKS9jb25maWcvbXZSdWxlcy5taworZW5kaWYKKworaWZkZWYgQ09ORklHX01WX0hBTF9SVUxFU19QQVRICitpbmNsdWRlICQoc3JjdHJlZSkvaW5jbHVkZS9jb25maWcvYXV0by5jb25mCitpbmNsdWRlICQoc3JjdHJlZSkvJChzdWJzdCAiLCwkKENPTkZJR19NVl9IQUxfUlVMRVNfUEFUSCkpCitlbmRpZgorCitDUEhfT0JKUyArPSBtdl9jcGhfYXBpLm8gXAorCQltdl9jcGhfYXBwLm8gXAorCQltdl9jcGhfZGIubyBcCisJCW12X2NwaF9kZXYubyBcCisJCW12X2NwaF9mbG93Lm8gXAorCQltdl9jcGhfaW5mcmEubyBcCisJCW12X2NwaF9tb2QubyBcCisJCW12X2NwaF9uZXRkZXYubyBcCisJCW12X2NwaF9zeXNmcy5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorbXZfY3BoLW9ianMgOj0gJChDUEhfT0JKUykKK29iai0kKENPTkZJR19NVl9DUEgpICs9IG12X2NwaC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBpLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjNmZjdlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcGkuYwpAQCAtMCwwICsxLDU0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9hcGkuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBBUEkgZGVmaW5pdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfY29tcGxleF9wcm9maWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBUUE0gY29tcGxleCBwcm9maWxlIElEIAorKgorKiBJTlBVVFM6CisqICAgICAgIHByb2ZpbGVfaWQgICAtIFRQTSBjb21wbGV4IHByb2ZpbGUgSUQKKyogICAgICAgYWN0aXZlX3BvcnQgIC0gQWN0aXZlIFdBTiBwb3J0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZSAodHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCBwcm9maWxlX2lkLCBNVl9BUFBfR01BQ19QT1JUX0UgYWN0aXZlX3BvcnQpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfc2V0X2NvbXBsZXhfcHJvZmlsZShwcm9maWxlX2lkLCBhY3RpdmVfcG9ydCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9hcHBfc2V0X2NvbXBsZXhfcHJvZmlsZSIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF9mZWF0dXJlX2ZsYWcoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZSBzdXBwb3J0IGluIENQSCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBmZWF0dXJlIC0gQ1BIIHN1cHBvcnRlZCBmZWF0dXJlcworKiAgICAgICBzdGF0ZSAgIC0gRW5hYmxlIG9yIGRpc2FibGUgdGhpcyBmZWF0dXJlIGluIENQSAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3NldF9mZWF0dXJlX2ZsYWcgKENQSF9BUFBfRkVBVFVSRV9FIGZlYXR1cmUsIEJPT0wgc3RhdGUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfc2V0X2ZlYXR1cmVfZmxhZyhmZWF0dXJlLCBzdGF0ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9hcHBfc2V0X2ZlYXR1cmVfZmxhZyIpOworICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYWRkX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEFkZCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYWRkX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfYWRkX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSwgbW9kX2JtLCBtb2RfdmFsdWUsIGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX2FkZF9ydWxlIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGVsX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGVsX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfZGVsX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9hcHBfZGVsX3J1bGUiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF91cGRhdGVfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVXBkYXRlIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF91cGRhdGVfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF91cGRhdGVfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5LCBtb2RfYm0sIG1vZF92YWx1ZSwgZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9hcHBfdXBkYXRlX3J1bGUiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9nZXRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9nZXRfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICptb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICpmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF9nZXRfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5LCBtb2RfYm0sIG1vZF92YWx1ZSwgZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiZmFpbCB0byBjYWxsIGNwaF9hcHBfZ2V0X3J1bGVcbiIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FkZF9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0cyBmbG93IG1hcHBpbmcgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfYWRkX2Zsb3dfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdykKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2Zsb3dfYWRkX3J1bGUoY3BoX2Zsb3cpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfZmxvd19hZGRfcnVsZSIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RlbF9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBmbG93IG1hcHBpbmcgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZGVsX2Zsb3dfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdykKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2Zsb3dfZGVsX3J1bGUoY3BoX2Zsb3cpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfZmxvd19kZWxfcnVsZSIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2dldF9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0cyBmbG93IG1hcHBpbmcgcnVsZSBmb3IgdGFnZ2VkIGZyYW1lcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIElucHV0IHZpZCwgcGJpdHMsIGRpcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIG91dHB1dCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCAKKyogICAgICAgICAgICAgICAgICAgVC1DT05ULCBxdWV1ZSBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9nZXRfZmxvd19ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19nZXRfcnVsZShjcGhfZmxvdyk7CisgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiZmFpbCB0byBjYWxsIGNwaF9mbG93X2dldF9ydWxlXG4iKTsKKyAgICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2NsZWFyX2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgYWxsIGZsb3cgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9jbGVhcl9mbG93X3J1bGUoVk9JRCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2Zsb3dfY2xlYXJfcnVsZSgpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfZmxvd19jbGVhcl9ydWxlIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfY2xlYXJfZmxvd19ydWxlX2J5X21oKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFycyBmbG93IG1hcHBpbmcgcnVsZXMgYnkgTUgKKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgIC0gIE1hcnZlbGwgaGVhZGVyLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfY2xlYXJfZmxvd19ydWxlX2J5X21oKFVJTlQxNiBtaCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taChtaCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X2NsZWFyX3J1bGVfYnlfbWgiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfZmxvd19kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBkc2NwX21hcCAgLSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfc2V0X2Zsb3dfZHNjcF9tYXAoQ1BIX0RTQ1BfUEJJVFNfVCAqZHNjcF9tYXApCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X3NldF9kc2NwX21hcChkc2NwX21hcCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X3NldF9kc2NwX21hcCIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RlbF9mbG93X2RzY3BfbWFwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZWxfZmxvd19kc2NwX21hcChWT0lEKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19kZWxfZHNjcF9tYXAoKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGVsX2RzY3BfbWFwIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBjcGhfZ2V0X3Rjb250X3N0YXRlCisqKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldCBULUNPTlQgc3RhdGUKKyoqCisqKiBJTlBVVFM6CisqKiAgIHRjb250IC0gVC1DT05UCisqKgorKiogT1VUUFVUUzoKKyoqICAgTm9uZS4gCisqKgorKiogUkVUVVJOUzogICAgIAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4gIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIGNwaF9nZXRfdGNvbnRfc3RhdGUodW5zaWduZWQgaW50IHRjb250KQoreworICAgIHJldHVybiBjcGhfZGJfZ2V0X3Rjb250X3N0YXRlKHRjb250KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBjcGhfc2V0X3Rjb250X3N0YXRlCisqKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgVC1DT05UIHN0YXRlIGluIG12X2N1c3QKKyoqCisqKiBJTlBVVFM6CisqKiAgIHRjb250IC0gVC1DT05UCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLgorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAorKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgY3BoX3NldF90Y29udF9zdGF0ZSh1bnNpZ25lZCBpbnQgdGNvbnQsIGJvb2wgc3RhdGUpCit7CisgICAgcmV0dXJuIGNwaF9kYl9zZXRfdGNvbnRfc3RhdGUodGNvbnQsIHN0YXRlKTsKK30KKworRVhQT1JUX1NZTUJPTChjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9zZXRfZmVhdHVyZV9mbGFnKTsKK0VYUE9SVF9TWU1CT0woY3BoX2FkZF9hcHBfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9kZWxfYXBwX3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfdXBkYXRlX2FwcF9ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX2dldF9hcHBfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9hZGRfZmxvd19ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX2RlbF9mbG93X3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfZ2V0X2Zsb3dfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9jbGVhcl9mbG93X3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfc2V0X2Zsb3dfZHNjcF9tYXApOworRVhQT1JUX1NZTUJPTChjcGhfZGVsX2Zsb3dfZHNjcF9tYXApOworRVhQT1JUX1NZTUJPTChjcGhfZ2V0X3Rjb250X3N0YXRlKTsKK0VYUE9SVF9TWU1CT0woY3BoX3NldF90Y29udF9zdGF0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBpLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGZkYjhhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcGkuaApAQCAtMCwwICsxLDQxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9hcGkuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBBUEkgZGVmaW5pdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfQVBJX0hfCisjZGVmaW5lIF9NVl9DUEhfQVBJX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHlwZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVjbGFyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfY29tcGxleF9wcm9maWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBUUE0gY29tcGxleCBwcm9maWxlIElEIAorKgorKiBJTlBVVFM6CisqICAgICAgIHByb2ZpbGVfaWQgICAtIFRQTSBjb21wbGV4IHByb2ZpbGUgSUQKKyogICAgICAgYWN0aXZlX3BvcnQgIC0gQWN0aXZlIFdBTiBwb3J0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZSAodHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCBwcm9maWxlX2lkLCBNVl9BUFBfR01BQ19QT1JUX0UgYWN0aXZlX3BvcnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfZmVhdHVyZV9mbGFnKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmUgc3VwcG9ydCBpbiBDUEggCisqCisqIElOUFVUUzoKKyogICAgICAgZmVhdHVyZSAtIENQSCBzdXBwb3J0ZWQgZmVhdHVyZXMKKyogICAgICAgc3RhdGUgICAtIEVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpbiBDUEgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9zZXRfZmVhdHVyZV9mbGFnIChDUEhfQVBQX0ZFQVRVUkVfRSBmZWF0dXJlLCBCT09MIHN0YXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYWRkX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEFkZCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYWRkX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZWxfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kZWxfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3VwZGF0ZV9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3VwZGF0ZV9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZ2V0X2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZ2V0X2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAqbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hZGRfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2FkZF9mbG93X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZWxfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2RlbF9mbG93X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9nZXRfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldHMgZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBJbnB1dCB2aWQsIHBiaXRzLCBkaXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBvdXRwdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgCisqICAgICAgICAgICAgICAgICAgIFQtQ09OVCwgcXVldWUgYW5kIHBhY2tldCBtb2RpZmljYXRpb24gZm9yIFZJRCwgUC1iaXRzLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZ2V0X2Zsb3dfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2NsZWFyX2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgYWxsIGZsb3cgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9jbGVhcl9mbG93X3J1bGUoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2NsZWFyX2Zsb3dfcnVsZV9ieV9taCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgZmxvdyBtYXBwaW5nIHJ1bGVzIGJ5IE1ICisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAtICBNYXJ2ZWxsIGhlYWRlci4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2NsZWFyX2Zsb3dfcnVsZV9ieV9taChVSU5UMTYgbWgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfZmxvd19kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBkc2NwX21hcCAgLSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfc2V0X2Zsb3dfZHNjcF9tYXAoQ1BIX0RTQ1BfUEJJVFNfVCAqZHNjcF9tYXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZWxfZmxvd19kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZGVsX2Zsb3dfZHNjcF9tYXAoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX2dldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXQgVC1DT05UIHN0YXRlCisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBjcGhfZ2V0X3Rjb250X3N0YXRlKHVuc2lnbmVkIGludCB0Y29udCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX3NldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIFQtQ09OVCBzdGF0ZSBpbiBtdl9jdXN0CisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKKyoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNwaF9zZXRfdGNvbnRfc3RhdGUodW5zaWduZWQgaW50IHRjb250LCBib29sIHN0YXRlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfQVBJX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBwLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBwLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmZlNDM0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcHAuYwpAQCAtMCwwICsxLDE0ODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfYXBwLmMKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgYXBwbGljYXRpb24gbW9kdWxlIHRvIGltcGxlbWVudAorKiAgICAgICAgICAgICAgQ1BIIG1haW4gbG9naWMgYW5kIGhhbmRsZSBhcHBsaWNhdGlvbiBwYWNrZXRzIHN1Y2ggYXMgT01DSSwgZU9BTSwgCisqICAgICAgICAgICAgICBJR01QIHBhY2tldHMuCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENQSCBnbG9iYWwgdHJhY2UgZmxhZyAqLworVUlOVDMyIGdfY3BoX2dsb2JhbF90cmFjZSA9IENQSF9FUlJfTEVWRUx8Q1BIX1dBUk5fTEVWRUx8Q1BIX0lORk9fTEVWRUw7CisKK01WX0VOVU1fRU5UUllfVCBnX2VudW1fbWFwX3Byb2ZpbGVfaWRbXSA9Cit7CisgICAgeyBUUE1fUE9OX1dBTl9EVUFMX01BQ19JTlRfU1dJVENILCAgIlRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9QT05fV0FOX0cwX0lOVF9TV0lUQ0gsICAgICAgICAiVFBNX1BPTl9XQU5fRzBfSU5UX1NXSVRDSCJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRzFfTEFOX0cwX0lOVF9TV0lUQ0gsICJUUE1fUE9OX1dBTl9HMV9MQU5fRzBfSU5UX1NXSVRDSCJ9LAorICAgIHsgVFBNX0cwX1dBTl9HMV9JTlRfU1dJVENILCAgICAgICAgICJUUE1fRzBfV0FOX0cxX0lOVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9HMV9XQU5fRzBfSU5UX1NXSVRDSCwgICAgICAgICAiVFBNX0cxX1dBTl9HMF9JTlRfU1dJVENIIn0sCisgICAgeyBUUE1fUE9OX0cxX1dBTl9HMF9JTlRfU1dJVENILCAgICAgIlRQTV9QT05fRzFfV0FOX0cwX0lOVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9QT05fRzBfV0FOX0cxX0lOVF9TV0lUQ0gsICAgICAiVFBNX1BPTl9HMF9XQU5fRzFfSU5UX1NXSVRDSCJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRFVBTF9NQUNfRVhUX1NXSVRDSCwgICJUUE1fUE9OX1dBTl9EVUFMX01BQ19FWFRfU1dJVENIIn0sCisgICAgeyBUUE1fUE9OX1dBTl9HMV9NTkdfRVhUX1NXSVRDSCwgICAgIlRQTV9QT05fV0FOX0cxX01OR19FWFRfU1dJVENIIn0sCisgICAgeyBUUE1fUE9OX1dBTl9HMF9TSU5HTEVfUE9SVCwgICAgICAgIlRQTV9QT05fV0FOX0cwX1NJTkdMRV9QT1JUIn0sCisgICAgeyBUUE1fUE9OX1dBTl9HMV9TSU5HTEVfUE9SVCwgICAgICAgIlRQTV9QT05fV0FOX0cxX1NJTkdMRV9QT1JUIn0sCisgICAgeyBUUE1fUE9OX0cxX1dBTl9HMF9TSU5HTEVfUE9SVCwgICAgIlRQTV9QT05fRzFfV0FOX0cwX1NJTkdMRV9QT1JUIn0sCisgICAgeyBUUE1fUE9OX0cwX1dBTl9HMV9TSU5HTEVfUE9SVCwgICAgIlRQTV9QT05fRzBfV0FOX0cxX1NJTkdMRV9QT1JUZyJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRzBfRzFfTFBCSywgICAgICAgICAgICJUUE1fUE9OX1dBTl9HMF9HMV9MUEJLIn0sCisgICAgeyBUUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTiwgICAgICAgIlRQTV9QT05fV0FOX0cwX0cxX0RVQUxfTEFOIn0sICAgICAKK307CisKK3N0YXRpYyBNVl9FTlVNX0FSUkFZX1QgZ19lbnVtX2FycmF5X3Byb2ZpbGVfaWQgPQoreworICAgIHNpemVvZihnX2VudW1fbWFwX3Byb2ZpbGVfaWQpL3NpemVvZihnX2VudW1fbWFwX3Byb2ZpbGVfaWRbMF0pLAorICAgIGdfZW51bV9tYXBfcHJvZmlsZV9pZAorfTsKKworc3RhdGljIE1WX0VOVU1fRU5UUllfVCBnX2VudW1fbWFwX3Bvbl90eXBlW10gPQoreworICAgIHsgQ1BIX1BPTl9UWVBFX0VQT04sICJFUE9OIn0sCisgICAgeyBDUEhfUE9OX1RZUEVfR1BPTiwgIkdQT04ifSwKKyAgICB7IENQSF9QT05fVFlQRV9HQkUsICAiR0JFIn0sCisgICAgeyBDUEhfUE9OX1RZUEVfUDJQLCAgIlAyUCJ9LAorfTsKKworc3RhdGljIE1WX0VOVU1fQVJSQVlfVCBnX2VudW1fYXJyYXlfcG9uX3R5cGUgPQoreworICAgIHNpemVvZihnX2VudW1fbWFwX3Bvbl90eXBlKS9zaXplb2YoZ19lbnVtX21hcF9wb25fdHlwZVswXSksCisgICAgZ19lbnVtX21hcF9wb25fdHlwZQorfTsKKworc3RhdGljIE1WX0VOVU1fRU5UUllfVCBnX2VudW1fbWFwX2RpcltdID0KK3sKKyAgICB7IENQSF9ESVJfVVMsICAgICAgICJVUyJ9LAorICAgIHsgQ1BIX0RJUl9EUywgICAgICAgIkRTIn0sCisgICAgeyBDUEhfRElSX05PVF9DQVJFLCAiTm90IENhcmUifSwKK307CisKK3N0YXRpYyBNVl9FTlVNX0FSUkFZX1QgZ19lbnVtX2FycmF5X2RpciA9Cit7CisgICAgc2l6ZW9mKGdfZW51bV9tYXBfZGlyKS9zaXplb2YoZ19lbnVtX21hcF9kaXJbMF0pLAorICAgIGdfZW51bV9tYXBfZGlyCit9OworCitzdGF0aWMgTVZfRU5VTV9FTlRSWV9UIGdfZW51bV9tYXBfcnhfdHhbXSA9Cit7CisgICAgeyBDUEhfRElSX1JYLCAgICAgICAgICJSWCJ9LAorICAgIHsgQ1BIX0RJUl9UWCwgICAgICAgICAiVFgifSwKKyAgICB7IENQSF9SWF9UWF9OT1RfQ0FSRSwgIk5vdCBDYXJlIn0sCit9OworCitzdGF0aWMgTVZfRU5VTV9BUlJBWV9UIGdfZW51bV9hcnJheV9yeF90eCA9Cit7CisgICAgc2l6ZW9mKGdfZW51bV9tYXBfcnhfdHgpL3NpemVvZihnX2VudW1fbWFwX3J4X3R4WzBdKSwKKyAgICBnX2VudW1fbWFwX3J4X3R4Cit9OworCitzdGF0aWMgTVZfRU5VTV9FTlRSWV9UIGdfZW51bV9tYXBfZ21hY1tdID0KK3sKKyAgICB7IE1WX0FQUF9HTUFDX1BPUlRfMCwgICJHTUFDMCJ9LAorICAgIHsgTVZfQVBQX0dNQUNfUE9SVF8xLCAgIkdNQUMxIn0sCisgICAgeyBNVl9BUFBfUE9OX01BQ19QT1JULCAiUE9OIE1BQyJ9LAorfTsKKworc3RhdGljIE1WX0VOVU1fQVJSQVlfVCBnX2VudW1fYXJyYXlfZ21hYyA9Cit7CisgICAgc2l6ZW9mKGdfZW51bV9tYXBfZ21hYykvc2l6ZW9mKGdfZW51bV9tYXBfZ21hY1swXSksCisgICAgZ19lbnVtX21hcF9nbWFjCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV4dGVybmFsIERlY2xhcmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIENIQVIgKmNwaF9sb29rdXBfZW51bV9zdHIoTVZfRU5VTV9BUlJBWV9UICpwX2VudW1fYXJyYXksIElOVDMyIGVudW1fdmFsdWUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfc2V0X2NvbXBsZXhfcHJvZmlsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgVFBNIGNvbXBsZXggcHJvZmlsZSBJRCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwcm9maWxlX2lkICAgLSBUUE0gY29tcGxleCBwcm9maWxlIElECisqICAgICAgIGFjdGl2ZV9wb3J0ICAtIEFjdGl2ZSBXQU4gcG9ydAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9zZXRfY29tcGxleF9wcm9maWxlICh0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90IHByb2ZpbGVfaWQsIE1WX0FQUF9HTUFDX1BPUlRfRSBhY3RpdmVfcG9ydCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIC8qIENoZWNrIHRoZSByYW5nZSBvZiBwcm9maWxlX2lkICovCisgICAgaWYgKHByb2ZpbGVfaWQgPiBUUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTikKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicHJvZmlsZV9pZFslZF0gaXMgb3V0IG9mIHJhbmdlWzF+JWRdIFxuIiwgcHJvZmlsZV9pZCwgVFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU4pOworICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIC8qIENoZWNrIHRoZSByYW5nZSBvZiBhY3RpdmVfcG9ydCAqLworICAgIGlmIChhY3RpdmVfcG9ydCA+IE1WX0FQUF9QT05fTUFDX1BPUlQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImFjdGl2ZV9wb3J0WyVkXSBpcyBvdXQgb2YgcmFuZ2VbMH4lZF0gXG4iLCBhY3RpdmVfcG9ydCwgTVZfQVBQX1BPTl9NQUNfUE9SVCk7CisgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgcmMgPSBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9QUk9GSUxFX0lELCAmcHJvZmlsZV9pZCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9zZXRfcGFyYW0iKTsKKworICAgIHJjID0gY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fQUNUSVZFX1BPUlQsICZhY3RpdmVfcG9ydCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9zZXRfcGFyYW0iKTsKKyAgIAorICAgIHJldHVybiByYzsgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9zZXRfZmVhdHVyZV9mbGFnKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmUgc3VwcG9ydCBpbiBDUEggCisqCisqIElOUFVUUzoKKyogICAgICAgZmVhdHVyZSAtIENQSCBzdXBwb3J0ZWQgZmVhdHVyZXMKKyogICAgICAgc3RhdGUgICAtIEVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpbiBDUEgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfc2V0X2ZlYXR1cmVfZmxhZyAoQ1BIX0FQUF9GRUFUVVJFX0UgZmVhdHVyZSwgQk9PTCBzdGF0ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHN3aXRjaCAoZmVhdHVyZSkKKyAgICB7CisgICAgICAgIGNhc2UgQ1BIX0FQUF9GRUFUVVJFX0FQUDoKKyAgICAgICAgICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0FQUF9TVVBQT1JULCAmc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfQVBQX0ZFQVRVUkVfSUdNUDoKKyAgICAgICAgICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0lHTVBfU1VQUE9SVCwmc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0FQUF9GRUFUVVJFX0JDOgorICAgICAgICAgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fQkNfU1VQUE9SVCwgICZzdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfQVBQX0ZFQVRVUkVfRkxPVzoKKyAgICAgICAgICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVCwmc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0FQUF9GRUFUVVJFX1VEUDoKKyAgICAgICAgICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX1VEUF9TVVBQT1JULCAmc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJjOyAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3ZhbGlkYXRlX3BhcnNlX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoZSBwYXJzaW5nIGZpbGVkIG9mIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF92YWxpZGF0ZV9wYXJzZV9maWVsZCAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICAvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgcGFyc2VfYm0gKi8KKyAgICBpZiAocGFyc2VfYm0gPj0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9FTkQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBhcnNlX2JtWzB4JXhdIGlzIG91dCBvZiByYW5nZVsweDAxfjB4JXhdIFxuIiwgcGFyc2VfYm0sIENQSF9BUFBfUEFSU0VfRklFTERfRU5EKTsKKyAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBWYWxpZGF0ZSBkaXJlY3Rpb24gKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUikKKyAgICB7CisgICAgICAgIGlmIChwYXJzZV9rZXktPmRpciA+IENQSF9ESVJfTk9UX0NBUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBpcyBvdXQgb2YgcmFuZ2VbMH4lZF0gXG4iLCBwYXJzZV9rZXktPmRpciwgQ1BIX0RJUl9OT1RfQ0FSRSk7CisgICAgICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgUlgvVFggZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCkKKyAgICB7CisgICAgICAgIGlmIChwYXJzZV9rZXktPnJ4X3R4ID4gQ1BIX1JYX1RYX05PVF9DQVJFKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInJ4X3R4WyVkXSBpcyBvdXQgb2YgcmFuZ2VbMH4lZF0gXG4iLCBwYXJzZV9rZXktPnJ4X3R4LCBDUEhfUlhfVFhfTk9UX0NBUkUpOworICAgICAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgIH0gICAgCisKKyAgICAvKiBDb3VsZCBub3QgcGFyc2UgTm9uZSBJUHY0IEV0aCB0eXBlIGFuZCBJUHY0IHByb3RvY29sIHR5cGUgYXQgdGhlIHNhbWUgaW1lICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUpICYmCisgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKSAmJgorICAgICAgICAocGFyc2Vfa2V5LT5ldGhfdHlwZSAhPSBNVl9DUEhfRVRIX1RZUEVfSVBWNCkpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBhcnNlX2JtWzB4JXhdLCBldGhfdHlwZVsweCV4XSwgZG9lcyBub3Qgc3VwcG9ydCBwYXJzaW5nIE5vbmUgSVB2NCBFdGggdHlwZSBhbmQgSVB2NCBwcm90b2NvbCB0eXBlIGF0IHRoZSBzYW1lIHRpbWVcbiIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZV9ibSwgcGFyc2Vfa2V5LT5ldGhfdHlwZSk7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLyogQ291bGQgbm90IHBhcnNlIE5vbmUgSVB2NiBFdGggdHlwZSBhbmQgSVB2NCBwcm90b2NvbCB0eXBlIGF0IHRoZSBzYW1lIGltZSAqLworICAgIGlmICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9UWVBFKSAmJgorICAgICAgICAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkgfHwKKyAgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIpIHx8IAorICAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkpICYmCisgICAgICAgIChwYXJzZV9rZXktPmV0aF90eXBlICE9IE1WX0NQSF9FVEhfVFlQRV9JUFY2KSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGFyc2VfYm1bMHgleF0sIGV0aF90eXBlWzB4JXhdLCBkb2VzIG5vdCBzdXBwb3J0IHBhcnNpbmcgTm9uZSBJUHY2IEV0aCB0eXBlIGFuZCBJUHY2IE5IIG9yIElDTVAgdHlwZSBhdCB0aGUgc2FtZSB0aW1lXG4iLAorICAgICAgICAgICAgICAgICAgICAgcGFyc2VfYm0sIHBhcnNlX2tleS0+ZXRoX3R5cGUpOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0gICAgCisKKyAgICAvKiBDb3VsZCBub3QgcGFyc2UgRXRoIHN1YnR5cGUgYW5kIElQdjQgdGhlIHNhbWUgdGltZSAqLworICAgIGlmICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9TVUJUWVBFKSAmJgorICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSkpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBhcnNlX2JtWzB4JXhdLCBkb2VzIG5vdCBzdXBwb3J0IHBhcnNpbmcgRXRoIHN1YnR5cGUgYW5kIElQdjQgdHlwZSBhdCB0aGUgc2FtZSB0aW1lIFxuIiwgcGFyc2VfYm0pOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8qIENvdWxkIG5vdCBwYXJzZSBFdGggc3VidHlwZSBhbmQgSVB2NiB0aGUgc2FtZSB0aW1lICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUpICYmCisgICAgICAgICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxKSB8fAorICAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMikgfHwgCisgICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKSkpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBhcnNlX2JtWzB4JXhdLCBkb2VzIG5vdCBzdXBwb3J0IHBhcnNpbmcgRXRoIHN1YnR5cGUgYW5kIElQdjYgdHlwZSBhdCB0aGUgc2FtZSB0aW1lIFxuIiwgcGFyc2VfYm0pOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0gICAgCisKKyAgICAvKiBDb3VsZCBub3QgcGFyc2UgSVB2NCBhbmQgSVB2NiBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKSAmJgorICAgICAgICAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkgfHwKKyAgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIpIHx8IAorICAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkpKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYXJzZV9ibVsweCV4XSwgZG9lcyBub3Qgc3VwcG9ydCBwYXJzaW5nIElQdjQgYW5kIElQdjYgdHlwZSBhdCB0aGUgc2FtZSB0aW1lXG4iLCBwYXJzZV9ibSk7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgSUdNUHY2IHR5cGUgKi8KKyAgICBpZiAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkgJiYKKyAgICAgICAgKHBhcnNlX2tleS0+aWNtcHY2X3R5cGUgIT0gTVZfSUNNUFY2X1RZUEVfTUxEKSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGFyc2VfYm1bMHgleF0sIGljbXB2Nl90eXBlWyVkXSwgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBJQ01QdjYgTUxEIHR5cGVbJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgcGFyc2VfYm0sIHBhcnNlX2tleS0+aWNtcHY2X3R5cGUsIE1WX0lDTVBWNl9UWVBFX01MRCk7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfSAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF92YWxpZGF0ZV9tb2RfZmllbGQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVmFsaWRhdGUgdGhlIG1vZGlmaWNhdGlvbiBmaWxlZCBvZiBDUEggcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfdmFsaWRhdGVfbW9kX2ZpZWxkICgKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICAvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgbW9kX2JtICovCisgICAgaWYgKG1vZF9ibSA+PSBDUEhfQVBQX01PRF9GSUVMRF9FTkQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIm1vZF9ibVsweCV4XSBpcyBvdXQgb2YgcmFuZ2VbMHgwMX4weCV4XSBcbiIsIG1vZF9ibSwgQ1BIX0FQUF9NT0RfRklFTERfRU5EKTsKKyAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBEb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBHTUFDIGluZm9ybWF0aW9uIGFuZCBzdHJpcCBNSCBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgaWYgKChtb2RfYm0gJiBDUEhfQVBQX1JYX01PRF9BRERfR01BQykgJiYKKyAgICAgICAgKG1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX1NUUklQX01IKSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAibW9kX2JtWzB4JXhdLCBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBHTUFDIGluZm9ybWF0aW9uIGFuZCBzdHJpcHBpbmcgTUggYXQgdGhlIHNhbWUgdGltZSBcbiIsIG1vZF9ibSk7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfdmFsaWRhdGVfZnJ3ZF9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB0aGUgZm9yd2FyZGluZyBmaWxlZCBvZiBDUEggcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF92YWxpZGF0ZV9mcndkX2ZpZWxkICgKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICAvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgZnJ3ZF9ibSAqLworICAgIGlmIChmcndkX2JtID49IENQSF9BUFBfRlJXRF9GSUVMRF9FTkQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImZyd2RfYm1bMHgleF0gaXMgb3V0IG9mIHJhbmdlWzB4MDF+MHgleF0gXG4iLCBmcndkX2JtLCBDUEhfQVBQX0ZSV0RfRklFTERfRU5EKTsKKyAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9hZGRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9hZGRfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX3BhcnNlX2ZpZWxkKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgcGFyc2luZyBmaWVsZCIpOworICAgIAorICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9tb2RfZmllbGQobW9kX2JtLCBtb2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgbW9kaWZpY2F0aW9uIGZpZWxkIik7CisKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfZnJ3ZF9maWVsZChmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIGZvcndhcmRpbmcgZmllbGQiKTsKKworICAgIHJjID0gY3BoX2RiX2FkZF9hcHBfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5LCBtb2RfYm0sIG1vZF92YWx1ZSwgZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9hZGRfYXBwX3J1bGUiKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2RlbF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2RlbF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfcGFyc2VfZmllbGQocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBwYXJzaW5nIGZpZWxkIik7CisgICAgCisgICAgcmMgPSBjcGhfZGJfZGVsX2FwcF9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfZGVsX2FwcF9ydWxlIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF91cGRhdGVfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF91cGRhdGVfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX3BhcnNlX2ZpZWxkKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgcGFyc2luZyBmaWVsZCIpOworICAgIAorICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9tb2RfZmllbGQobW9kX2JtLCBtb2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgbW9kaWZpY2F0aW9uIGZpZWxkIik7CisKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfZnJ3ZF9maWVsZChmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIGZvcndhcmRpbmcgZmllbGQiKTsKKworICAgIHJjID0gY3BoX2RiX3VwZGF0ZV9hcHBfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5LCBtb2RfYm0sIG1vZF92YWx1ZSwgZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl91cGRhdGVfYXBwX3J1bGUiKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2dldF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2dldF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAqbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfcGFyc2VfZmllbGQocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBwYXJzaW5nIGZpZWxkIik7CisgICAgCisgICAgcmMgPSBjcGhfZGJfZ2V0X2FwcF9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXksIG1vZF9ibSwgbW9kX3ZhbHVlLCBmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJmYWlsIHRvIGNhbGwgY3BoX2FwcF9nZXRfcnVsZVxuIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9nZXRfcnVsZV9ieV9kaXJfcHJvdG8oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIGFjY29yZGluZyB0byBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9nZXRfcnVsZV9ieV9kaXJfcHJvdG8gKAorICAgIENQSF9ESVJfRSAgICAgICAgICAgICAgZGlyLAorICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgcHJvdG9fdHlwZSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgKnBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICAqcGFyc2Vfa2V5LAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICAqbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICAqbW9kX3ZhbHVlLAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICAqZnJ3ZF9ibSwKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9kYl9nZXRfYXBwX3J1bGVfYnlfZGlyX3Byb3RvKGRpciwgcHJvdG9fdHlwZSwgcGFyc2VfYm0sIHBhcnNlX2tleSwgbW9kX2JtLCBtb2RfdmFsdWUsIGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfZ2V0X2FwcF9ydWxlX2J5X2Rpcl9wcm90byIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbmNyZWFzZSBSWCBjb3VudGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfcGFyc2VfZmllbGQocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBwYXJzaW5nIGZpZWxkIik7CisgICAgCisgICAgcmMgPSBjcGhfZGJfaW5jcmVhc2VfY291bnRlcihwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX2luY3JlYXNlX2NvdW50ZXIiKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046ICBJbmNyZWFzZSBSWCBjb3VudGVyIGFjY29yZGluZyB0byBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8gKAorICAgIENQSF9ESVJfRSBkaXIsCisgICAgVUlOVDE2ICAgIHByb3RvX3R5cGUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byhkaXIsIHByb3RvX3R5cGUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8iKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhcnNlX2dlX3BvcnRfdHlwZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgR0VNQUMgcG9ydCB0eXBlIGJ5IHByb2ZpbGUgSUQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBwb3J0X3R5cGUgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfcGFyc2VfZ2VfcG9ydF90eXBlICgKKyAgICBDUEhfUE9SVF9TVEFURV9UICAgICAgICAgICpwb3J0X3R5cGUpCit7CisgICAgdHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCAgcHJvZmlsZV9pZCAgPSAwOworICAgIE1WX0FQUF9HTUFDX1BPUlRfRSAgICAgICAgIGFjdGl2ZV9wb3J0ID0gMDsKKyAgICBNVl9TVEFUVVMgICAgICAgICAgICAgICAgICByYyAgICAgICAgICA9IE1WX09LOworCisgICAgLyogR2V0IFByb2ZpbGUgSUQgYW5kIGFjdGl2ZSBXQU4gcG9ydCAqLworICAgIGNwaF9kYl9nZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX1BST0ZJTEVfSUQsICAmcHJvZmlsZV9pZCk7CisgICAgY3BoX2RiX2dldF9wYXJhbShDUEhfREJfUEFSQU1fQUNUSVZFX1BPUlQsICZhY3RpdmVfcG9ydCk7CisKKyAgICBzd2l0Y2ggKHByb2ZpbGVfaWQpCisgICAgeworICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRzFfTEFOX0cwX0lOVF9TV0lUQ0g6ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRFVBTF9NQUNfRVhUX1NXSVRDSDogICAgICAgICAgICAKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTjogICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3R5cGUgID0gTVZfQVBQX1BPUlRfV0FOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0cwX0lOVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRzBfU0lOR0xFX1BPUlQ6ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRzBfRzFfTFBCSzogICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9JTlZBTElEOyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfdHlwZSAgPSBNVl9BUFBfUE9SVF9XQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFBNX0cwX1dBTl9HMV9JTlRfU1dJVENIOgorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9XQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0lOVkFMSUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUE1fRzFfV0FOX0cwX0lOVF9TV0lUQ0g6CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX1dBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfSU5WQUxJRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRQTV9QT05fRzFfV0FOX0cwX0lOVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgVFBNX1BPTl9HMV9XQU5fRzBfU0lOR0xFX1BPUlQ6ICAgICAgICAgICAgCisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX1dBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3R5cGUgID0gTVZfQVBQX1BPUlRfV0FOOworCisgICAgICAgICAgICBpZiAoYWN0aXZlX3BvcnQgPT0gTVZfQVBQX0dNQUNfUE9SVF8xKSB7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfSU5BQ1RJVkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfSU5BQ1RJVkU7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRQTV9QT05fRzBfV0FOX0cxX0lOVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgVFBNX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlQ6ICAgICAgICAgICAgCisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX1dBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3R5cGUgID0gTVZfQVBQX1BPUlRfV0FOOworCisgICAgICAgICAgICBpZiAoYWN0aXZlX3BvcnQgPT0gTVZfQVBQX0dNQUNfUE9SVF8wKSB7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfSU5BQ1RJVkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfSU5BQ1RJVkU7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0cxX01OR19FWFRfU1dJVENIOgorICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0cxX1NJTkdMRV9QT1JUOiAgICAgICAgICAgIAorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0lOVkFMSUQ7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF90eXBlICA9IE1WX0FQUF9QT1JUX1dBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9JTlZBTElEOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0lOVkFMSUQ7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfSU5WQUxJRDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhcnNlX3BlZXJfcG9ydCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgcGVlciBHRU1BQyBwb3J0CisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgICAgLSBPcmlnaW5hbCBwb3J0CisqCisqIE9VVFBVVFM6CisqICAgICAgIHBlZXJfcG9ydCAgIC0gUGVlciBwb3J0CisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3BhcnNlX3BlZXJfcG9ydCAoCisgICAgSU5UMzIgICAgcG9ydCwKKyAgICBJTlQzMiAgICpwZWVyX3BvcnQpCit7CisgICAgVUlOVDMyICAgICAgICAgICAgaWR4ID0gMDsKKyAgICBDUEhfUE9SVF9TVEFURV9UICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF9OVU1dOworICAgIE1WX1NUQVRVUyAgICAgICAgIHJjICA9IE1WX0ZBSUw7CisKKyAgICAvKiBWZXJpZnkgcG9ydCAqLworICAgIGlmIChwb3J0ID4gTVZfQVBQX1BPTl9NQUNfUE9SVCApIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwb3J0WyVkXSBpcyBvdXQgb2YgcmFuZ2VbMH4lZF0gXG4iLCBwb3J0LCBNVl9BUFBfUE9OX01BQ19QT1JUKTsKKyAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICB9CisgICAgCisgICAgLyogR2V0IHBvcnQgdHlwZSAqLworICAgIHJjID0gY3BoX2FwcF9wYXJzZV9nZV9wb3J0X3R5cGUoJnBvcnRfdHlwZVswXSk7CisKKyAgICAvKiBTZWFyY2ggZm9yIHBlZXIgcG9ydCAqLworICAgIGlmIChwb3J0X3R5cGVbcG9ydF0ucG9ydF90eXBlID09IE1WX0FQUF9QT1JUX0xBTikKKyAgICB7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgTVZfQVBQX0dNQUNfUE9SVF9OVU07IGlkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWR4ID09IHBvcnQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoKHBvcnRfdHlwZVtpZHhdLnBvcnRfdHlwZSAgPT0gTVZfQVBQX1BPUlRfV0FOKSAmJgorICAgICAgICAgICAgICAgIChwb3J0X3R5cGVbaWR4XS5wb3J0X3N0YXRlID09IE1WX0dFX1BPUlRfQUNUSVZFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcGVlcl9wb3J0ID0gaWR4OworICAgICAgICAgICAgICAgIHJjICA9IE1WX09LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3R5cGUgPT0gTVZfQVBQX1BPUlRfV0FOKQorICAgIHsKKyAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgTVZfQVBQX0dNQUNfUE9SVF9OVU07IGlkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWR4ID09IHBvcnQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAocG9ydF90eXBlW2lkeF0ucG9ydF90eXBlICA9PSBNVl9BUFBfUE9SVF9MQU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBlZXJfcG9ydCA9IGlkeDsKKyAgICAgICAgICAgICAgICByYyAgPSBNVl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgIAorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhcnNlX2RpcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBQYXJzZSBhcHBsaWNhdGlvbiBwYWNrZXQgdG8gb3V0cHV0IHBhcnNlIGJpdG1hcCBhbmQgdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAtIEdFIE1BQyBwb3J0CisqICAgICAgIHJ4ICAgIC0gV2hldGhlciBSWCBwYXRoCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFJldHVybiBkaXJlY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ1BIX0RJUl9FIGNwaF9hcHBfcGFyc2VfZGlyICgKKyAgICBJTlQzMiAgICBwb3J0LAorICAgIEJPT0wgICAgIHJ4KQoreworICAgIENQSF9QT1JUX1NUQVRFX1QgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfTlVNXTsKKyAgICBNVl9TVEFUVVMgICAgICAgIHJjICA9IE1WX09LOworICAgIENQSF9ESVJfRSAgICAgICAgZGlyID0gQ1BIX0RJUl9JTlZBTElEOworCisgICAgLyogUGFyc2UgcG9ydCAqLworICAgIGlmIChwb3J0ID4gTVZfQVBQX1BPTl9NQUNfUE9SVCApIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwb3J0WyVkXSBpcyBvdXQgb2YgcmFuZ2VbMH4lZF0gXG4iLCBwb3J0LCBNVl9BUFBfUE9OX01BQ19QT1JUKTsKKyAgICAgICAgcmV0dXJuIGRpcjsKKyAgICB9CisKKyAgICAvKiBHZXQgR01BQyBXQU4vTEFOIHR5cGUgKi8KKyAgICByYyA9IGNwaF9hcHBfcGFyc2VfZ2VfcG9ydF90eXBlKCZwb3J0X3R5cGVbMF0pOworICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZmFpbCB0byBjYWxsIGNwaF9hcHBfcGFyc2VfZ2VfcG9ydF90eXBlKCkgXG4iKTsKKyAgICAgICAgcmV0dXJuIGRpcjsKKyAgICB9CisKKyAgICAvKiBSeCBkaXIgKi8KKyAgICBpZiAocnggPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGlmICgocG9ydF90eXBlW3BvcnRdLnBvcnRfdHlwZSAgPT0gTVZfQVBQX1BPUlRfV0FOKSAmJgorICAgICAgICAgICAgKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3N0YXRlID09IE1WX0dFX1BPUlRfQUNUSVZFKSkKKyAgICAgICAgICAgIGRpciA9IENQSF9ESVJfRFM7CisgICAgICAgIGVsc2UgaWYgKChwb3J0X3R5cGVbcG9ydF0ucG9ydF90eXBlICA9PSBNVl9BUFBfUE9SVF9MQU4pICYmCisgICAgICAgICAgICAgICAgIChwb3J0X3R5cGVbcG9ydF0ucG9ydF9zdGF0ZSA9PSBNVl9HRV9QT1JUX0FDVElWRSkpCisgICAgICAgICAgICBkaXIgPSBDUEhfRElSX1VTOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpciA9IENQSF9ESVJfSU5WQUxJRDsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBpcyBpbnZhbGlkIFxuIiwgZGlyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUeCBkaXIgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3R5cGUgID09IE1WX0FQUF9QT1JUX1dBTikgJiYKKyAgICAgICAgICAgIChwb3J0X3R5cGVbcG9ydF0ucG9ydF9zdGF0ZSA9PSBNVl9HRV9QT1JUX0FDVElWRSkpCisgICAgICAgICAgICBkaXIgPSBDUEhfRElSX1VTOworICAgICAgICBlbHNlIGlmICgocG9ydF90eXBlW3BvcnRdLnBvcnRfdHlwZSAgPT0gTVZfQVBQX1BPUlRfTEFOKSAmJgorICAgICAgICAgICAgICAgICAocG9ydF90eXBlW3BvcnRdLnBvcnRfc3RhdGUgPT0gTVZfR0VfUE9SVF9BQ1RJVkUpKQorICAgICAgICAgICAgZGlyID0gQ1BIX0RJUl9EUzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaXIgPSBDUEhfRElSX0lOVkFMSUQ7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gaXMgaW52YWxpZCBcbiIsIGRpcik7CisgICAgICAgIH0gICAgCisgICAgfQorCisgICAgcmV0dXJuIGRpcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhcnNlX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBQYXJzZSBhcHBsaWNhdGlvbiBwYWNrZXQgdG8gb3V0cHV0IHBhcnNlIGJpdG1hcCBhbmQgdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgICAgIC0gR0UgTUFDIHBvcnQKKyogICAgICAgc2tiX2RhdGEgICAtIFBvaW50ZXIgdG8gU0tCIGRhdGEgaG9sZGluZyBhcHBsaWNhdGlvbiBwYWNrZXQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9wYXJzZV9wYWNrZXQgKAorICAgIElOVDMyICAgICAgICAgICAgICAgICAgcG9ydCwKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgKnNrYl9kYXRhLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSAqcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICAqcGFyc2Vfa2V5KQoreworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIGV0aF90eXBlICAgICA9IDA7CisgICAgc3RydWN0IGlwdjZoZHIgICAgICAgICAqcF9pcHY2X2hkciAgID0gTlVMTDsKKyAgICBzdHJ1Y3QgaXB2Nl9ob3BvcHRfaGRyICpwX2hvcG9wdF9oZHIgPSBOVUxMOworICAgIHN0cnVjdCBpY21wNmhkciAgICAgICAgKnBfaWNtcF9oZHIgICA9IE5VTEw7ICAgIAorICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgKnBfZmllbGQgICAgICA9IE5VTEw7CisgICAgTVZfU1RBVFVTICAgICAgICAgICAgICAgcmMgICAgICAgICAgID0gTVZfT0s7CisKKyAgICAqcGFyc2VfYm0gPSAwOworICAgIG1lbXNldChwYXJzZV9rZXksIDAsIHNpemVvZihDUEhfQVBQX1BBUlNFX1QpKTsKKworICAgIC8qIFBhcnNlIGRpciAqLworICAgIHBhcnNlX2tleS0+ZGlyID0gY3BoX2FwcF9wYXJzZV9kaXIocG9ydCwgVFJVRSk7CisgICAgaWYocGFyc2Vfa2V5LT5kaXIgPT0gQ1BIX0RJUl9JTlZBTElEKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJkaXJbJWRdIGlzIGludmFsaWQgXG4iLCBwYXJzZV9rZXktPmRpcik7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfQorICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUjsKKworICAgIC8qIFBhcnNlIFJYL1RYICovCisgICAgcGFyc2Vfa2V5LT5yeF90eCA9IENQSF9ESVJfUlg7CisgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFg7CisgICAgCisgICAgLyogUGFyc2UgTWFydmVsbCBoZWFkZXIgKi8KKyAgICBpZiAocGFyc2Vfa2V5LT5kaXIgPT0gQ1BIX0RJUl9VUykKKyAgICAgICAgcGFyc2Vfa2V5LT5taCA9IChudG9ocygqKFVJTlQxNiAqKXNrYl9kYXRhKSAmIE1WX1ZBTElEX01IX01BU0spOworICAgIGVsc2UKKyAgICAgICAgcGFyc2Vfa2V5LT5taCA9IChudG9ocygqKFVJTlQxNiAqKXNrYl9kYXRhKSAmIE1WX1ZBTElEX0dIX01BU0spOworICAgICpwYXJzZV9ibSAgICB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX01IOworICAgIAorICAgIC8qIFBhcnNlIEV0aCB0eXBlICovCisgICAgcF9maWVsZCAgPSBza2JfZGF0YSArIE1WX0VUSF9NSF9TSVpFICsgRVRIX0FMRU4gKyBFVEhfQUxFTjsKKyAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgd2hpbGUgKGV0aF90eXBlID09IE1WX1RQSURfODEwMCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzg4QTggfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF85MTAwKSB7CisgICAgICAgIHBfZmllbGQgKz0gVkxBTl9ITEVOOworICAgICAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgfQorICAgIHBhcnNlX2tleS0+ZXRoX3R5cGUgPSBldGhfdHlwZTsKKyAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRTsKKworICAgIC8qIFBhcnNlIElQdjQgdHlwZSAqLworICAgIGlmIChldGhfdHlwZSA9PSBFVEhfUF9JUCkgeworICAgICAgICBwX2ZpZWxkICs9IE1WX0NQSF9FVEhfVFlQRV9MRU47CisgICAgICAgIHBfZmllbGQgKz0gTVZfSVBWNF9QUk9UT19PRkZTRVQ7CisgICAgICAgIHBhcnNlX2tleS0+aXB2NF90eXBlID0gKihVSU5UOCAqKXBfZmllbGQ7CisgICAgICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRTsKKyAgICB9CisgICAgLyogUGFyc2UgSVB2NiB0eXBlICovCisgICAgZWxzZSBpZiAoZXRoX3R5cGUgPT0gRVRIX1BfSVBWNikgeworICAgICAgICAKKyAgICAgICAgcF9pcHY2X2hkciA9IChzdHJ1Y3QgaXB2NmhkciAqKShwX2ZpZWxkICsgTVZfQ1BIX0VUSF9UWVBFX0xFTik7CisgICAgICAgIHBhcnNlX2tleS0+aXB2Nl9uaDEgPSBwX2lwdjZfaGRyLT5uZXh0aGRyOworICAgICAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMTsKKworICAgICAgICBpZiAocF9pcHY2X2hkci0+bmV4dGhkciAhPSBORVhUSERSX0hPUCkKKyAgICAgICAgICByZXR1cm4gcmM7CisKKyAgICAgICAgcF9ob3BvcHRfaGRyID0gKHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKikoKFVJTlQ4ICopcF9pcHY2X2hkciArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCisgICAgICAgIHBhcnNlX2tleS0+aXB2Nl9uaDIgPSBwX2hvcG9wdF9oZHItPm5leHRoZHI7CisgICAgICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyOworCisgICAgICAgIGlmIChwX2hvcG9wdF9oZHItPm5leHRoZHIgIT0gSVBQUk9UT19JQ01QVjYpCisgICAgICAgICAgICByZXR1cm4gcmM7CisKKyAgICAgICAgcF9pY21wX2hkciA9ICAoc3RydWN0IGljbXA2aGRyICopKChVSU5UOCAqKXBfaG9wb3B0X2hkciArIGlwdjZfb3B0bGVuKHBfaG9wb3B0X2hkcikpOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChwX2ljbXBfaGRyLT5pY21wNl90eXBlKSB7CisgICAgICAgICAgICBjYXNlIElDTVBWNl9NR01fUVVFUlk6CisgICAgICAgICAgICBjYXNlIElDTVBWNl9NR01fUkVQT1JUOgorICAgICAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1JFRFVDVElPTjoKKyAgICAgICAgICAgIGNhc2UgSUNNUFY2X01MRDJfUkVQT1JUOgorICAgICAgICAgICAgICAgIHBhcnNlX2tleS0+aWNtcHY2X3R5cGUgPSBNVl9JQ01QVjZfVFlQRV9NTEQ7CisgICAgICAgICAgICAgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisgICAgLyogUGFyc2UgRXRoZW5ldCBzdWJ0eXBlICovCisgICAgZWxzZSB7CisgICAgICAgIHBhcnNlX2tleS0+ZXRoX3N1YnR5cGUgPSAoKihVSU5UOCAqKShwX2ZpZWxkICsgTVZfQ1BIX0VUSF9UWVBFX0xFTikpOworICAgICAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbW9kX3J4X3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgUlggYXBwbGljYXRpb24gcGFja2V0CisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHNrYiAgICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogICAgICAgcnhfZGVzYyAgIC0gUlggZGVzY3JpcHRvcgorKiAgICAgICBtb2RfYm0gICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9tb2RfcnhfcGFja2V0ICggIAorICAgIElOVDMyICAgICAgICAgICAgICAgIHBvcnQsCisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2LAorICAgIHN0cnVjdCBza19idWZmICAgICAgKnNrYiwKKyAgICBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjLAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAqbW9kX3ZhbHVlKQoreworICAgIFVJTlQ4ICAgICAqcF9kYXRhID0gTlVMTDsKKyAgICBNVl9TVEFUVVMgIHJjICAgICA9IE1WX09LOworCisgICAgLyogU2F2ZSBHTUFDIEluZm9ybWF0aW9uICovICAgIAorICAgIGlmIChtb2RfYm0gJiBDUEhfQVBQX1JYX01PRF9BRERfR01BQykKKyAgICB7CisgICAgICAgIHBfZGF0YSAgICAgPSAoVUlOVDggKilza2ItPmRhdGE7CisgICAgICAgIHBfZGF0YVswXSAmPSAweDBGOworICAgICAgICBwX2RhdGFbMF0gfD0gKChwb3J0ICYgMHgwRikgPDwgNCk7CisgICAgfQorCisgICAgLyogUmVwbGFjZSBwcm90b2NvbCB0eXBlICovCisgICAgc2tiLT50YWlsICAgICs9IHJ4X2Rlc2MtPmRhdGFTaXplOworICAgIHNrYi0+bGVuICAgICAgPSByeF9kZXNjLT5kYXRhU2l6ZTsKKworICAgIGlmIChtb2RfYm0gJiBDUEhfQVBQX1JYX01PRF9TVFJJUF9NSCkKKyAgICB7CisKKyAgICAgICAgc2tiLT5kYXRhICs9IE1WX0VUSF9NSF9TSVpFOworICAgICAgICBza2ItPnRhaWwgLT0gTVZfRVRIX01IX1NJWkU7CisgICAgICAgIHNrYi0+bGVuICAtPSBNVl9FVEhfTUhfU0laRTsKKyAgICB9IAorICAgIAorICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisgICAgaWYgKG1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX1JFUExBQ0VfUFJPVE9fVFlQRSkKKyAgICB7CisgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBtb2RfdmFsdWUtPnByb3RvX3R5cGU7CisgICAgfSAgICAKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX21vZF90eF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IFRYIGFwcGxpY2F0aW9uIHBhY2tldAorKgorKiBJTlBVVFM6CisqICAgICAgIHNrYiAgICAgICAgIC0gUG9pbnRlciB0byBTS0IgZGF0YSBob2RpbmcgYXBwbGljYXRpb24gcGFja2V0CisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKiAgICAgICBtb2RfYm0gICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfbW9kX3R4X3BhY2tldCAoCisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICpza2IsCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgICptb2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICBpZiAobW9kX2JtICYgQ1BIX0FQUF9UWF9NT0RfQUREX01IX0JZX0RSSVZFUikKKyAgICB7CisgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyB8PSBNVl9FVEhfRl9NSDsKKyAgICB9IAorCisgICAgaWYgKG1vZF9ibSAmIENQSF9BUFBfVFhfTU9EX05PX1BBRCkKKyAgICB7CisgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyB8PSBNVl9FVEhfRl9OT19QQUQ7CisgICAgfSAKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3NldF9mcndkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbgorKgorKiBJTlBVVFM6CisqICAgICAgIHNrYiAgICAgICAgIC0gUG9pbnRlciB0byBTS0IgZGF0YSBob2RpbmcgYXBwbGljYXRpb24gcGFja2V0CisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKiAgICAgICBmcndkX2JtICAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9zZXRfZnJ3ZCAoCisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICpza2IsCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICAqZnJ3ZF92YWx1ZSkgCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICBpZiAoZnJ3ZF9ibSAmIENQSF9BUFBfRlJXRF9TRVRfVFJHX1BPUlQpCisgICAgeworICAgICAgIHR4X3NwZWNfb3V0LT50eHAgPSBmcndkX3ZhbHVlLT50cmdfcG9ydDsKKyAgICB9IAorCisgICAgaWYgKGZyd2RfYm0gJiBDUEhfQVBQX0ZSV0RfU0VUX1RSR19RVUVVRSkKKyAgICB7CisgICAgICAgdHhfc3BlY19vdXQtPnR4cSA9IGZyd2RfdmFsdWUtPnRyZ19xdWV1ZTsKKyAgICB9IAorCisgICAgaWYgKGZyd2RfYm0gJiBDUEhfQVBQX0ZSV0RfU0VUX0dFTV9QT1JUKQorICAgIHsKKyAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9ICgoZnJ3ZF92YWx1ZS0+Z2VtX3BvcnQgPDwgOCl8MHgwMDEwKTsKKyAgICB9CisKKyAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9yeF9iYygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBicm9hZGNhc3QgcGFja2V0cyAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBwa3QgICAgIC0gTWFydmVsbCBwYWNrZXQgaW5mb3JtYXRpb24KKyogICAgICAgcnhfZGVzYyAtIFJYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfYXBwX3J4X2JjKElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGhfcGJ1ZiAqcGt0LCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKQoreworICAgIENQSF9GTE9XX0VOVFJZX1QgICAgICBmbG93X3J1bGU7CisgICAgSU5UMzIgICAgICAgICAgICAgICAgIHBlZXJfcG9ydCA9IDA7CisgICAgSU5UMzIgICAgICAgICAgICAgICAgIHJ4X3NpemUgICA9IDA7CisgICAgSU5UMzIgICAgICAgICAgICAgICAgIG9mZnNldCAgICA9IDA7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgIHN0YXRlICAgICA9IEZBTFNFOworICAgIHN0cnVjdCBza19idWZmICAgICAgICpza2Jfb2xkICAgPSBOVUxMOworICAgIHN0cnVjdCBza19idWZmICAgICAgICpza2JfbmV3ICAgPSBOVUxMOworICAgIE1WX1NUQVRVUyAgICAgICAgICAgICByYyAgICAgICAgPSBNVl9PSzsKKyAgICAKKyAgICAvKiBDaGVjayB3aGV0aGVyIG5lZWQgdG8gaGFuZGxlIGJyb2FkY2FzdCBwYWNrZXQgKi8KKyAgICBjcGhfZGJfZ2V0X3BhcmFtKENQSF9EQl9QQVJBTV9CQ19TVVBQT1JULCAmc3RhdGUpOworICAgIGlmIChzdGF0ZSA9PSBGQUxTRSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBQYXJzZSBwYWNrZXRzICovCisgICAgc2tiX29sZCA9IChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyk7CisgICAgc2tiX25ldyA9IChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyk7CisgICAgcmMgPSBjcGhfZmxvd19wYXJzZV9wYWNrZXQocG9ydCwgc2tiX29sZC0+ZGF0YSwgVFJVRSwgVFJVRSwgJmZsb3dfcnVsZSk7CisgICAgaWYgKHJjICE9IE1WX09LKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfcGFyc2VfcGFja2V0LCByYzwlZD4gXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFUvUyAqLworICAgIGlmKGZsb3dfcnVsZS5kaXIgPT0gQ1BIX0RJUl9VUykKKyAgICB7ICAKKyAgICAgICAgLyogRm9yd2FyZCBwYWNrZXQgdG8gcGVlciBwb3J0ICovCisgICAgICAgIHJjID0gY3BoX2FwcF9wYXJzZV9wZWVyX3BvcnQocG9ydCwgJnBlZXJfcG9ydCk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJmYWlsIHRvIGNhbGwgY3BoX2FwcF9wYXJzZV9wZWVyX3BvcnQsIHJjPCVkPiBcbiIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKwlNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAicGVlcl9wb3J0PSVkXG4iLCBwZWVyX3BvcnQpOworCisgICAgICAgIC8qIEZvcndhcmQgcGFja2V0ICovCisgICAgICAgIGlmIChuZXRpZl9ydW5uaW5nKG12X25ldF9kZXZzW3BlZXJfcG9ydF0pKSB7CisgICAgICAgICAgICAvKiBDb3B5IGEgbmV3IFNLQiAqLworICAgICAgICAgICAgc2tiX29sZC0+dGFpbCArPSByeF9kZXNjLT5kYXRhU2l6ZTsKKyAgICAgICAgICAgIHNrYl9vbGQtPmxlbiAgID0gcnhfZGVzYy0+ZGF0YVNpemU7CisgICAgICAgICAgICBza2JfbmV3ID0gc2tiX2NvcHkoc2tiX29sZCwgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICBpZihza2JfbmV3ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tiX25ldyA9IHNrYl9vbGQ7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdl9uZXRfZGV2c1twZWVyX3BvcnRdLT5uZXRkZXZfb3BzLT5uZG9fc3RhcnRfeG1pdChza2Jfb2xkLCBtdl9uZXRfZGV2c1twZWVyX3BvcnRdKTsgICAgICAKKyAgICAgICAgfQorICAgIH0KK291dDoKKyAgICAvKiBTdHJpcGUgVkxBTiB0YWcsIHRoZW4gc2VuZCB0byBMaW51eCBuZXR3b3JrIHN0YWNrICovCisgICAgb2Zmc2V0ICAgICAgICAgPSBjcGhfZmxvd19zdHJpcF92bGFuKFRSVUUsIHNrYl9uZXctPmRhdGEpOworICAgIHNrYl9uZXctPmRhdGEgKz0gb2Zmc2V0OworICAgIHJ4X3NpemUgICAgICAgLT0gb2Zmc2V0OworCisgICAgLyogU3RyaXAgTUggKi8KKyAgICBza2JfbmV3LT5kYXRhICs9IE1WX0VUSF9NSF9TSVpFOworICAgIG9mZnNldCAgICAgICAgKz0gTVZfRVRIX01IX1NJWkU7CisKKyAgICBza2JfbmV3LT50YWlsICAgIC09IG9mZnNldDsKKyAgICBza2JfbmV3LT5sZW4gICAgIC09IG9mZnNldDsKKyAgICBza2JfbmV3LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYl9uZXcsIGRldik7CisKKyAgICBjcGhfcmVjX3NrYihwb3J0LCBza2JfbmV3KTsKKworICAgIHJldHVybiAxOyAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9wcm9maWxlX2lkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIHByb2ZpbGUgSUQgc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9wcm9maWxlX2lkKElOVDMyIGVudW1fdmFsdWUpCit7CisgICAgcmV0dXJuIG10eXBlX2xvb2t1cF9lbnVtX3N0cigmZ19lbnVtX2FycmF5X3Byb2ZpbGVfaWQsIGVudW1fdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX3Bvbl90eXBlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIFBPTiB0eXBlIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfcG9uX3R5cGUoSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICByZXR1cm4gbXR5cGVfbG9va3VwX2VudW1fc3RyKCZnX2VudW1fYXJyYXlfcG9uX3R5cGUsIGVudW1fdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX2RpcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBkaXJlY3Rpb24gc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9kaXIoSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICByZXR1cm4gbXR5cGVfbG9va3VwX2VudW1fc3RyKCZnX2VudW1fYXJyYXlfZGlyLCBlbnVtX3ZhbHVlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9yeF90eCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBSWC9UWCBkaXJlY3Rpb24gc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9yeF90eChJTlQzMiBlbnVtX3ZhbHVlKQoreworICAgIHJldHVybiBtdHlwZV9sb29rdXBfZW51bV9zdHIoJmdfZW51bV9hcnJheV9yeF90eCwgZW51bV92YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfZ21hYygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBHTUFDIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfZ21hYyhJTlQzMiBlbnVtX3ZhbHVlKQoreworICAgIHJldHVybiBtdHlwZV9sb29rdXBfZW51bV9zdHIoJmdfZW51bV9hcnJheV9nbWFjLCBlbnVtX3ZhbHVlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplcyBDUEggYXBwbGljYXRpb24gbW9kdWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfYXBwX2luaXQoVk9JRCkKK3sKKyAgICAKKyAgICBjcGhfZGJfaW5pdCgpOworICAgIAorICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X3RyYWNlX2ZsYWcoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpzZXRzIGNwaCB0cmFjZSBmbGFnLgorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9zZXRfdHJhY2VfZmxhZyhVSU5UMzIgZmxhZykKK3sKKyAgICBnX2NwaF9nbG9iYWxfdHJhY2UgPSBmbGFnOworICAgIAorICAgIHJldHVybiBNVl9PSzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcHAuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGEwMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwcC5oCkBAIC0wLDAgKzEsNzc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2FwcC5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGFwcGxpY2F0aW9uIG1vZHVsZSB0byBpbXBsZW1lbnQKKyogICAgICAgICAgICAgIENQSCBtYWluIGxvZ2ljIGFuZCBoYW5kbGUgYXBwbGljYXRpb24gcGFja2V0cyBzdWNoIGFzIE9NQ0ksIGVPQU0sIAorKiAgICAgICAgICAgICAgSUdNUCBwYWNrZXRzLgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfQVBQX0hfCisjZGVmaW5lIF9NVl9DUEhfQVBQX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUeXBlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1WX1ZBTElEX01IX01BU0sgIDB4MDA3RiAgLyogVmFsaWQgTUggZmlsZWQgaW4gQ1BIICovCisjZGVmaW5lIE1WX1ZBTElEX0dIX01BU0sgIDB4MEZGRiAgLyogVmFsaWQgTUggZmlsZWQgaW4gQ1BIICovCisKKworLyogQ1BIIGFwcGxpY2F0aW9uIHBhY2tldHMgcGFyc2luZyBmaWVsZCBkZWZpbml0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIgICAgICAgICAgPSAweDEsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCAgICAgICAgPSAweDIsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9NSCAgICAgICAgICAgPSAweDQsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRSAgICAgPSAweDgsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRSAgPSAweDEwLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFICAgID0gMHgyMCwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxICAgICA9IDB4NDAsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMiAgICAgPSAweDgwLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUgID0gMHgxMDAsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FTkQgICAgICAgICAgPSAweDIwMAorfSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0U7CisKK3R5cGVkZWYgZW51bQoreworICAgIENQSF9ESVJfVVMgICAgICAgPSAwLAorICAgIENQSF9ESVJfRFMgICAgICAgPSAxLAorICAgIENQSF9ESVJfTk9UX0NBUkUgPSAyLAorICAgIENQSF9ESVJfTlVNICAgICAgPSAyLAorICAgIENQSF9ESVJfSU5WQUxJRCAgPSAzCit9IENQSF9ESVJfRTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0RJUl9SWCAgICAgICAgID0gMCwKKyAgICBDUEhfRElSX1RYICAgICAgICAgPSAxLAorICAgIENQSF9SWF9UWF9OT1RfQ0FSRSA9IDIsCit9IENQSF9SWF9UWF9FOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENQSF9ESVJfRSAgIGRpcjsKKyAgICBDUEhfUlhfVFhfRSByeF90eDsKKyAgICBVSU5UMTYgICAgICBtaDsKKyAgICBVSU5UMTYgICAgICBldGhfdHlwZTsKKyAgICBVSU5UOCAgICAgICBldGhfc3VidHlwZTsKKyAgICBVSU5UOCAgICAgICBpcHY0X3R5cGU7CisgICAgVUlOVDggICAgICAgaXB2Nl9uaDE7CisgICAgVUlOVDggICAgICAgaXB2Nl9uaDI7CisgICAgVUlOVDMyICAgICAgaWNtcHY2X3R5cGU7Cit9IENQSF9BUFBfUEFSU0VfVDsKKworLyogQ1BIIGFwcGxpY2F0aW9uIHBhY2tldHMgbW9kaWZpY2F0aW9uIGZpZWxkIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfQVBQX1JYX01PRF9BRERfR01BQyAgICAgICAgICAgPSAweDEsCisgICAgQ1BIX0FQUF9SWF9NT0RfUkVQTEFDRV9QUk9UT19UWVBFID0gMHgyLAorICAgIENQSF9BUFBfUlhfTU9EX1NUUklQX01IICAgICAgICAgICA9IDB4NCwKKyAgICBDUEhfQVBQX1RYX01PRF9BRERfTUhfQllfRFJJVkVSICAgPSAweDgsCisgICAgQ1BIX0FQUF9UWF9NT0RfTk9fUEFEICAgICAgICAgICAgID0gMHgxMCwKKyAgICBDUEhfQVBQX01PRF9DSEFOR0VfU1RBVEUgICAgICAgICAgPSAweDIwLAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0VORCAgICAgICAgICAgICA9IDB4NDAKK30gQ1BIX0FQUF9NT0RfRklFTERfRTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMTYgICBwcm90b190eXBlOworICAgIEJPT0wgICAgIHN0YXRlOworfSBDUEhfQVBQX01PRF9UOworCisvKiBDUEggYXBwbGljYXRpb24gcGFja2V0cyBmb3J3YXJkaW5nIGZpZWxkIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfQVBQX0ZSV0RfU0VUX1RSR19QT1JUICAgICA9IDB4MSwKKyAgICBDUEhfQVBQX0ZSV0RfU0VUX1RSR19RVUVVRSAgICA9IDB4MiwKKyAgICBDUEhfQVBQX0ZSV0RfU0VUX0dFTV9QT1JUICAgICA9IDB4NCwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRU5EICAgICAgICA9IDB4OAorfSBDUEhfQVBQX0ZSV0RfRklFTERfRTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UOCAgIHRyZ19wb3J0OworICAgIFVJTlQ4ICAgdHJnX3F1ZXVlOworICAgIFVJTlQxNiAgZ2VtX3BvcnQ7Cit9IENQSF9BUFBfRlJXRF9UOworCisvKiBUUE0gY29ubmVjdGlvbiBwcm9maWxlIGRlZmluaXRpb24gZnJvbSAidHBtX3R5cGVzLmgiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBUUE1fUE9OX1dBTl9EVUFMX01BQ19JTlRfU1dJVENIID0gMSwKKyAgICBUUE1fUE9OX1dBTl9HMF9JTlRfU1dJVENILAorICAgIFRQTV9QT05fV0FOX0cxX0xBTl9HMF9JTlRfU1dJVENILAorICAgIFRQTV9HMF9XQU5fRzFfSU5UX1NXSVRDSCwKKyAgICBUUE1fRzFfV0FOX0cwX0lOVF9TV0lUQ0gsCisgICAgVFBNX1BPTl9HMV9XQU5fRzBfSU5UX1NXSVRDSCwKKyAgICBUUE1fUE9OX0cwX1dBTl9HMV9JTlRfU1dJVENILAorICAgIFRQTV9QT05fV0FOX0RVQUxfTUFDX0VYVF9TV0lUQ0gsCisgICAgVFBNX1BPTl9XQU5fRzFfTU5HX0VYVF9TV0lUQ0gsCisgICAgVFBNX1BPTl9XQU5fRzBfU0lOR0xFX1BPUlQsCisgICAgVFBNX1BPTl9XQU5fRzFfU0lOR0xFX1BPUlQsCisgICAgVFBNX1BPTl9HMV9XQU5fRzBfU0lOR0xFX1BPUlQsCisgICAgVFBNX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlQsCisgICAgVFBNX1BPTl9XQU5fRzBfRzFfTFBCSywKKyAgICBUUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTgorfSB0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90OworCisvKiBQT04gdHlwZSBkZWZpbml0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX1BPTl9UWVBFX0VQT04gPSAwLAorICAgIENQSF9QT05fVFlQRV9HUE9OLAorICAgIENQSF9QT05fVFlQRV9HQkUsCisgICAgQ1BIX1BPTl9UWVBFX1AyUCwKKyAgICBDUEhfUE9OX1RZUEVfTUFYCit9IENQSF9QT05fVFlQRV9FOworCisKKy8qIENQSCBmZWF0dXJlIGZsYWcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfQVBQX0ZFQVRVUkVfQVBQID0gMCwKKyAgICBDUEhfQVBQX0ZFQVRVUkVfSUdNUCwKKyAgICBDUEhfQVBQX0ZFQVRVUkVfQkMsCisgICAgQ1BIX0FQUF9GRUFUVVJFX0ZMT1csCisgICAgQ1BIX0FQUF9GRUFUVVJFX1VEUCwKK30gQ1BIX0FQUF9GRUFUVVJFX0U7CisKKworLyogQ1BIIHBhcnNlL21vZGlmaWNhdGlvbiBmaWVsZCBkZWZpbml0aW9uIGZvciBiYy9pZ21wIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ1BIX0RJUl9FICAgICAgZGlyOyAgIAorICAgIFVJTlQzMiAgICAgICAgIHNyY19wb3J0OworICAgIFVJTlQxNiAgICAgICAgIHZpZDsKKyAgICBVSU5UOCAgICAgICAgICBwYml0czsKKyAgICBVSU5UOCAgICAgICAgICBkc2NwOworfSBDUEhfUEFDS0VUX1BBUlNFX1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDUEhfRElSX0UgICAgICBkaXI7ICAgCisgICAgVUlOVDMyICAgICAgICAgc3JjX3BvcnQ7CisgICAgVUlOVDE2ICAgICAgICAgdmlkOworICAgIFVJTlQ4ICAgICAgICAgIHBiaXRzOworICAgIFVJTlQ4ICAgICAgICAgIGRzY3A7Cit9IENQSF9QQUNLRVRfTU9EX1Q7CisKKy8qIEdNQUMgcG9ydCBzdGF0ZSBkZWZpbml0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBNVl9BUFBfUE9SVF9UWVBFX0UgICBwb3J0X3R5cGU7CisgICAgTVZfR0VfUE9SVF9TVEFURV9FICAgcG9ydF9zdGF0ZTsKK30gQ1BIX1BPUlRfU1RBVEVfVDsKKworLyogRGVidWcgcmVsYXRlZCBkZWZpbml0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIFVJTlQzMiBnX2NwaF9nbG9iYWxfdHJhY2U7CisKKyNkZWZpbmUgQ1BIX0dMT0JBTF9UUkFDRSBnX2NwaF9nbG9iYWxfdHJhY2UKKyNkZWZpbmUgQ1BIX0RFQlVHX0xFVkVMICAweDAwMDAwMDAxCisjZGVmaW5lIENQSF9JTkZPX0xFVkVMICAgMHgwMDAwMDAwMgorI2RlZmluZSBDUEhfV0FSTl9MRVZFTCAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ1BIX0VSUl9MRVZFTCAgICAweDAwMDAwMDA4CisKKyNkZWZpbmUgTVZfQ1BIX1BSSU5UKGxldmVsLCBmb3JtYXQsIC4uLikgXAorICAgIHsgXAorICAgICAgICBpZiAobGV2ZWwgJiBDUEhfR0xPQkFMX1RSQUNFKSBcCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlcyhsaW5lOiVkKSAiZm9ybWF0LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKTsgXAorICAgIH0KKworI2RlZmluZSBNVl9DUEhfQ0xFQU5fUFJJTlQobGV2ZWwsIGZvcm1hdCwgLi4uKSBcCisgICAgeyBcCisgICAgICAgIGlmIChsZXZlbCAmIENQSF9HTE9CQUxfVFJBQ0UpIFwKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gZm9ybWF0LCAjI19fVkFfQVJHU19fKTsgXAorICAgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVjbGFyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfc2V0X2NvbXBsZXhfcHJvZmlsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgVFBNIGNvbXBsZXggcHJvZmlsZSBJRCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwcm9maWxlX2lkICAgLSBUUE0gY29tcGxleCBwcm9maWxlIElECisqICAgICAgIGFjdGl2ZV9wb3J0ICAtIEFjdGl2ZSBXQU4gcG9ydAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9zZXRfY29tcGxleF9wcm9maWxlICh0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90IHByb2ZpbGVfaWQsIE1WX0FQUF9HTUFDX1BPUlRfRSBhY3RpdmVfcG9ydCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9zZXRfZmVhdHVyZV9mbGFnKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmUgc3VwcG9ydCBpbiBDUEggCisqCisqIElOUFVUUzoKKyogICAgICAgZmVhdHVyZSAtIENQSCBzdXBwb3J0ZWQgZmVhdHVyZXMKKyogICAgICAgc3RhdGUgICAtIEVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpbiBDUEgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfc2V0X2ZlYXR1cmVfZmxhZyAoQ1BIX0FQUF9GRUFUVVJFX0UgZmVhdHVyZSwgQk9PTCBzdGF0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9hZGRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9hZGRfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2RlbF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2RlbF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfdXBkYXRlX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVXBkYXRlIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfdXBkYXRlX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9nZXRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9nZXRfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgKmZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2dldF9ydWxlX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIHJ1bGUgYWNjb3JkaW5nIHRvIHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2dldF9ydWxlX2J5X2Rpcl9wcm90byAoCisgICAgQ1BIX0RJUl9FICAgICAgICAgICAgICBkaXIsCisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICBwcm90b190eXBlLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSAqcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgICpwYXJzZV9rZXksCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgICptb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgICpmcndkX2JtLAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluY3JlYXNlIFJYIGNvdW50ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXIgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiAgSW5jcmVhc2UgUlggY291bnRlciBhY2NvcmRpbmcgdG8gcHJvdG9jb2wgdHlwZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRpciAgICAgICAgLSBEaXJlY3Rpb24KKyogICAgICAgcHJvdG9fdHlwZSAtIFNLQiBwcm90b2NvbCB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvICgKKyAgICBDUEhfRElSX0UgZGlyLAorICAgIFVJTlQxNiAgICBwcm90b190eXBlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhcnNlX2dlX3BvcnRfdHlwZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgR0VNQUMgcG9ydCB0eXBlIGJ5IHByb2ZpbGUgSUQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBwb3J0X3R5cGUgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfcGFyc2VfZ2VfcG9ydF90eXBlICgKKyAgICBDUEhfUE9SVF9TVEFURV9UICAgICAgICAgICpwb3J0X3R5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFyc2VfZGlyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFBhcnNlIGFwcGxpY2F0aW9uIHBhY2tldCB0byBvdXRwdXQgcGFyc2UgYml0bWFwIGFuZCB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgIC0gR0UgTUFDIHBvcnQKKyogICAgICAgcnggICAgLSBXaGV0aGVyIFJYIHBhdGgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgUmV0dXJuIGRpcmVjdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDUEhfRElSX0UgY3BoX2FwcF9wYXJzZV9kaXIgKAorICAgIElOVDMyICAgIHBvcnQsCisgICAgQk9PTCAgICAgcngpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFyc2VfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFBhcnNlIGFwcGxpY2F0aW9uIHBhY2tldCB0byBvdXRwdXQgcGFyc2UgYml0bWFwIGFuZCB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAgLSBHRSBNQUMgcG9ydAorKiAgICAgICBza2JfZGF0YSAgIC0gUG9pbnRlciB0byBTS0IgZGF0YSBob2xkaW5nIGFwcGxpY2F0aW9uIHBhY2tldAorKgorKiBPVVRQVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3BhcnNlX3BhY2tldCAoCisgICAgSU5UMzIgICAgICAgICAgICAgICAgICBwb3J0LAorICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAqc2tiX2RhdGEsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FICpwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgICpwYXJzZV9rZXkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbW9kX3J4X3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgUlggYXBwbGljYXRpb24gcGFja2V0CisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHNrYiAgICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogICAgICAgcnhfZGVzYyAgIC0gUlggZGVzY3JpcHRvcgorKiAgICAgICBtb2RfYm0gICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9tb2RfcnhfcGFja2V0ICggIAorICAgIElOVDMyICAgICAgICAgICAgICAgIHBvcnQsCisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2LAorICAgIHN0cnVjdCBza19idWZmICAgICAgKnNrYiwKKyAgICBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjLAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAqbW9kX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX21vZF90eF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IFRYIGFwcGxpY2F0aW9uIHBhY2tldAorKgorKiBJTlBVVFM6CisqICAgICAgIHNrYiAgICAgICAgIC0gUG9pbnRlciB0byBTS0IgZGF0YSBob2RpbmcgYXBwbGljYXRpb24gcGFja2V0CisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKiAgICAgICBtb2RfYm0gICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfbW9kX3R4X3BhY2tldCAoCisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICpza2IsCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgICptb2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfc2V0X2Zyd2QoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0IHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uCisqCisqIElOUFVUUzoKKyogICAgICAgc2tiICAgICAgICAgLSBQb2ludGVyIHRvIFNLQiBkYXRhIGhvZGluZyBhcHBsaWNhdGlvbiBwYWNrZXQKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqICAgICAgIGZyd2RfYm0gICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3NldF9mcndkICgKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgKnNrYiwKKyAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0LAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3J4X2JjKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VpdmVkIGJyb2FkY2FzdCBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHBrdCAgICAgLSBNYXJ2ZWxsIHBhY2tldCBpbmZvcm1hdGlvbgorKiAgICAgICByeF9kZXNjIC0gUlggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9hcHBfcnhfYmMoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aF9wYnVmICpwa3QsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX3Byb2ZpbGVfaWQoKQorKgorKiBERVNDUklQVElPTjpsb29rdXAgcHJvZmlsZSBJRCBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX3Byb2ZpbGVfaWQoSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfcG9uX3R5cGUoKQorKgorKiBERVNDUklQVElPTjpsb29rdXAgUE9OIHR5cGUgc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9wb25fdHlwZShJTlQzMiBlbnVtX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9kaXIoKQorKgorKiBERVNDUklQVElPTjpsb29rdXAgZGlyZWN0aW9uIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfZGlyKElOVDMyIGVudW1fdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX3J4X3R4KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIFJYL1RYIGRpcmVjdGlvbiBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX3J4X3R4KElOVDMyIGVudW1fdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX2dtYWMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgR01BQyBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX2dtYWMoSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemVzIENQSCBhcHBsaWNhdGlvbiBtb2R1bGUuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9hcHBfaW5pdChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X3RyYWNlX2ZsYWcoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpzZXRzIGNwaCB0cmFjZSBmbGFnLgorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9zZXRfdHJhY2VfZmxhZyhVSU5UMzIgZmxhZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX0FQUF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2RiLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YWQ4Mzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2RiLmMKQEAgLTAsMCArMSwxNTQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2RiLmMKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgZGF0YSBiYXNlIGltcGxlbWVudGF0aW9uCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorI2luY2x1ZGUgImV6eG1sLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBDUEhfQVBQX0RCX1QgZ19jcGhfYXBwX2RiOworQ0hBUiAqZ19jcGhfeG1sX2NmZ19maWxlICAgICAgICAgPSBVU19DUEhfWE1MX0NGR19GSUxFOworQ0hBUiAqZ19vbnVfcHJvZmlsZV94bWxfY2ZnX2ZpbGUgPSBVU19PTlVfUFJPRklMRV9YTUxfQ0ZHX0ZJTEU7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX3NldF9wYXJhbSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgQ1BIIERCIHBhcmFtZXRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcmFtICAgLSBUaGUgcGFyYW1ldGVyIHR5cGUKKyogICAgICAgdmFsdWUgICAtIFBhcmFtZXRlciB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX3NldF9wYXJhbSAoQ1BIX0RCX1BBUkFNX0UgcGFyYW0sIFZPSUQgKnZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgc3dpdGNoIChwYXJhbSkKKyAgICB7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX1BST0ZJTEVfSUQ6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIucHJvZmlsZV9pZCAgID0gKih0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90ICopdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQUNUSVZFX1BPUlQ6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIuYWN0aXZlX3BvcnQgID0gKihNVl9BUFBfR01BQ19QT1JUX0UgKil2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9BUFBfU1VQUE9SVDoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5hcHBfc3VwcG9ydCAgPSAqKEJPT0wgKil2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9JR01QX1NVUFBPUlQ6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIuaWdtcF9zdXBwb3J0ID0gKihCT09MICopdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQkNfU1VQUE9SVDoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5iY19zdXBwb3J0ICAgPSAqKEJPT0wgKil2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9GTE9XX1NVUFBPUlQ6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIuZmxvd19zdXBwb3J0ID0gKihCT09MICopdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fVURQX1NVUFBPUlQ6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIudWRwX3N1cHBvcnQgID0gKihCT09MICopdmFsdWU7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQkNfQ09VTlRFUjoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5iY19jb3VudCAgICAgPSAqKFVJTlQzMiAqKXZhbHVlOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2dldF9wYXJhbSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIERCIHBhcmFtZXRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcmFtICAgLSBUaGUgcGFyYW1ldGVyIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgdmFsdWUgICAtIFBhcmFtZXRlciB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF9wYXJhbSAoQ1BIX0RCX1BBUkFNX0UgcGFyYW0sIFZPSUQgKnZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgc3dpdGNoIChwYXJhbSkKKyAgICB7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX1BST0ZJTEVfSUQ6CisgICAgICAgICAgICAqKHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi5wcm9maWxlX2lkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0FDVElWRV9QT1JUOgorICAgICAgICAgICAgKihNVl9BUFBfR01BQ19QT1JUX0UgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi5hY3RpdmVfcG9ydDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9BUFBfU1VQUE9SVDoKKyAgICAgICAgICAgICooQk9PTCAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLmFwcF9zdXBwb3J0OworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0lHTVBfU1VQUE9SVDoKKyAgICAgICAgICAgICooQk9PTCAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLmlnbXBfc3VwcG9ydDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9CQ19TVVBQT1JUOgorICAgICAgICAgICAgKihCT09MICopdmFsdWUgPSBnX2NwaF9hcHBfZGIuYmNfc3VwcG9ydDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9GTE9XX1NVUFBPUlQ6CisgICAgICAgICAgICAqKEJPT0wgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi5mbG93X3N1cHBvcnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fVURQX1NVUFBPUlQ6CisgICAgICAgICAgICAqKEJPT0wgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi51ZHBfc3VwcG9ydDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9CQ19DT1VOVEVSOgorICAgICAgICAgICAgKihVSU5UMzIgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi5iY19jb3VudDsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfY29tcGFyZV9ydWxlcygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJlIHRoZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5IG9mIHR3byBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtXzEgICAtIFBhcnNpbmcgYml0bWFwIG9mIGZpcnN0IENQSCBydWxlCisqICAgICAgIHBhcnNlX2tleV8xICAtIFBhcnNpbmcga2V5IG9mIGZpcnN0IENQSCBydWxlCisqICAgICAgIHBhcnNlX2JtXzIgICAtIFBhcnNpbmcgYml0bWFwIG9mIHNlY29uZCBDUEggcnVsZQorKiAgICAgICBwYXJzZV9rZXlfMiAgLSBQYXJzaW5nIGtleSBvZiBzZWNvbmQgQ1BIIHJ1bGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZGJfY29tcGFyZV9ydWxlcyAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtXzEsIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXlfMSwgCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtXzIsCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleV8yKQoreworICAgIGlmIChwYXJzZV9ibV8xID09IHBhcnNlX2JtXzIpCisgICAgeworICAgICAgICAvKiBDb21wYXJlIGRpcmVjdGlvbiAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfRElSKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPmRpciAhPSBwYXJzZV9rZXlfMi0+ZGlyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgZGlyWyVkXSwgbmV3IGRpclslZF0gXG4iLCBwYXJzZV9rZXlfMS0+ZGlyLCBwYXJzZV9rZXlfMi0+ZGlyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYXJlIFJYIGRpcmVjdGlvbiAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+cnhfdHggIT0gcGFyc2Vfa2V5XzItPnJ4X3R4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgcnhfdHhbJWRdLCBuZXcgcnhfdHhbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPnJ4X3R4LCBwYXJzZV9rZXlfMi0+cnhfdHgpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBNYXJ2ZWxsIGhlYWRlciAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfTUgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+bWggIT0gcGFyc2Vfa2V5XzItPm1oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgbWhbJWRdLCBuZXcgbWhbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPm1oLCBwYXJzZV9rZXlfMi0+bWgpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhcmUgRXRoIHR5cGUgKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9UWVBFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPmV0aF90eXBlIT0gcGFyc2Vfa2V5XzItPmV0aF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgZXRoX3R5cGVbJWRdLCBuZXcgZXRoX3R5cGVbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPmV0aF90eXBlLCBwYXJzZV9rZXlfMi0+ZXRoX3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBFdGggc3VidHlwZSAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+ZXRoX3N1YnR5cGUgIT0gcGFyc2Vfa2V5XzItPmV0aF9zdWJ0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgZXRoX3N1YnR5cGVbJWRdLCBuZXcgZXRoX3N1YnR5cGVbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPmV0aF9zdWJ0eXBlLCBwYXJzZV9rZXlfMi0+ZXRoX3N1YnR5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhcmUgSVBWNCB0eXBlICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+aXB2NF90eXBlICE9IHBhcnNlX2tleV8yLT5pcHY0X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBpcHY0X3R5cGVbJWRdLCBuZXcgaXB2NF90eXBlWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5pcHY0X3R5cGUsIHBhcnNlX2tleV8yLT5pcHY0X3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhcmUgSVBWNiB0eXBlICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5pcHY2X25oMSAhPSBwYXJzZV9rZXlfMi0+aXB2Nl9uaDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBpcHY2X25oMVslZF0sIG5ldyBpcHY2X25oMVslZF0gXG4iLCBwYXJzZV9rZXlfMS0+aXB2Nl9uaDEsIHBhcnNlX2tleV8yLT5pcHY2X25oMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcGFyZSBJUHY2IE5IICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5pcHY2X25oMiE9IHBhcnNlX2tleV8yLT5pcHY2X25oMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIGlwdjZfbmgyWyVkXSwgbmV3IGlwdjZfbmgyWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5pcHY2X25oMiwgcGFyc2Vfa2V5XzItPmlwdjZfbmgyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYXJlIElDTVB2NiB0eXBlICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5pY21wdjZfdHlwZSAhPSBwYXJzZV9rZXlfMi0+aWNtcHY2X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBpY21wdjZfdHlwZVslZF0sIG5ldyBpY21wdjZfdHlwZVslZF0gXG4iLCBwYXJzZV9rZXlfMS0+aWNtcHY2X3R5cGUsIHBhcnNlX2tleV8yLT5pY21wdjZfdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2NvbXBhcmVfcnVsZV9hbmRfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENvbXBhcmUgdGhlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgb2YgQ1BIIGFuZCB0aGUgcGFja2V0CisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm1fcnVsZSAgICAgLSBQYXJzaW5nIGJpdG1hcCBvZiBDUEggcnVsZQorKiAgICAgICBwYXJzZV9rZXlfcnVsZSAgICAtIFBhcnNpbmcga2V5IG9mIENQSCBydWxlCisqICAgICAgIHBhcnNlX2JtX3BhY2tldCAgIC0gUGFyc2luZyBiaXRtYXAgb2YgcGFja2V0CisqICAgICAgIHBhcnNlX2tleV9wYWNrZXQgIC0gUGFyc2luZyBrZXkgb2YgcGFja2V0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2Ugc2FtZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGRpZmZlcmVudCwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2RiX2NvbXBhcmVfcnVsZV9hbmRfcGFja2V0ICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm1fcnVsZSwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5X3J1bGUsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtX3BhY2tldCwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5X3BhY2tldCkKK3sgIAorICAgIC8qIENoZWNrIGRpcmVjdGlvbiAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIpCisgICAgeworICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmRpciAhPSBDUEhfRElSX05PVF9DQVJFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGRpciBmaWVsZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmRpciAhPSBwYXJzZV9rZXlfcGFja2V0LT5kaXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBkaXJbJWRdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgZGlyWyVkXSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5kaXIsIHBhcnNlX2tleV9ydWxlLT5kaXIpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIFJYL1RYIGRpcmVjdGlvbiAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCkKKyAgICB7CisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+cnhfdHggIT0gQ1BIX1JYX1RYX05PVF9DQVJFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gZGlyIFJYL1RYIGZpZWxkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+cnhfdHggIT0gcGFyc2Vfa2V5X3BhY2tldC0+cnhfdHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCByeF90eFslZF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSByeF90eFslZF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+cnhfdHgsIHBhcnNlX2tleV9ydWxlLT5yeF90eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgTWFydmVsbCBoZWFkZXIgKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfTUgpCisgICAgeworICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9NSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIE1IIGZpZWxkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5taCAhPSBwYXJzZV9rZXlfcGFja2V0LT5taCkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBtaFsweCV4XSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIG1oWzB4JXhdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPm1oLCBwYXJzZV9rZXlfcnVsZS0+bWgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgRXRoIHR5cGUgKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUpCisgICAgeworICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGV0aF90eXBlIGZpZWxkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5ldGhfdHlwZSAhPSBwYXJzZV9rZXlfcGFja2V0LT5ldGhfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBldGhfdHlwZVsweCV4XSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIGV0aF90eXBlWzB4JXhdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPmV0aF90eXBlLCBwYXJzZV9rZXlfcnVsZS0+ZXRoX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgRXRoIHN1YnR5cGUgKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUpCisgICAgeworICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGV0aF9zdWJ0eXBlIGZpZWxkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5ldGhfc3VidHlwZSAhPSBwYXJzZV9rZXlfcGFja2V0LT5ldGhfc3VidHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBldGhfc3VidHlwZVslZF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBldGhfc3VidHlwZVslZF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+ZXRoX3N1YnR5cGUsIHBhcnNlX2tleV9ydWxlLT5ldGhfc3VidHlwZSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBJUFY0IHR5cGUgKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKQorICAgIHsKKyAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gaXB2NF90eXBlIGZpZWxkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5pcHY0X3R5cGUgIT0gcGFyc2Vfa2V5X3BhY2tldC0+aXB2NF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGlwdjRfdHlwZVslZF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBpcHY0X3R5cGVbJWRdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPmlwdjRfdHlwZSwgcGFyc2Vfa2V5X3J1bGUtPmlwdjRfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBJUFY2IE5IMSAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkKKyAgICB7CisgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gaXB2Nl9uaDEgZmllbGRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmlwdjZfbmgxICE9IHBhcnNlX2tleV9wYWNrZXQtPmlwdjZfbmgxKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGlwdjZfbmgxWyVkXSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIGlwdjZfbmgxWyVkXSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5pcHY2X25oMSwgcGFyc2Vfa2V5X3J1bGUtPmlwdjZfbmgxKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIElQdjYgTkgyICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKQorICAgIHsKKyAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIpKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBpcHY2X25oMiBmaWVsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+aXB2Nl9uaDIgIT0gcGFyc2Vfa2V5X3BhY2tldC0+aXB2Nl9uaDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaXB2Nl9uaDJbJWRdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgaXB2Nl9uaDJbJWRdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPmlwdjZfbmgyLCBwYXJzZV9rZXlfcnVsZS0+aXB2Nl9uaDIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgSUNNUHY2IHR5cGUgKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpCisgICAgeworICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGljbXB2Nl90eXBlIGZpZWxkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5pY21wdjZfdHlwZSAhPSBwYXJzZV9rZXlfcGFja2V0LT5pY21wdjZfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBpY21wdjZfdHlwZVslZF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBpY21wdjZfdHlwZVslZF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+aWNtcHY2X3R5cGUsIHBhcnNlX2tleV9ydWxlLT5pY21wdjZfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfY2hlY2tfZHVwbGljYXRlX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBkdXBsaWNhdGUgQ1BIIHJ1bGUgdy8gc2FtZSBwYXJzZSBiaXRtYXAKKyogICAgICAgICAgICAgIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBJbiBjYXNlIGhhcyBkdXBsaWNhdGVkIHJ1bGUsIHJldHVybiBUUlVFLCAKKyogICAgICAgSW4gY2FzZSBoYXMgbm90IGR1cGxpY2F0ZWQgcnVsZSwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2RiX2NoZWNrX2R1cGxpY2F0ZV9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlICA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICByYyAgICAgICAgICA9IEZBTFNFOworICAgCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICByYyA9IGNwaF9kYl9jb21wYXJlX3J1bGVzKHBfY3BoX3J1bGUtPnBhcnNlX2JtLCAmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5LCBwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfYWRkX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEFkZCBhcHBsaWNhdGlvbiB0eXBlIENQSCBydWxlIHRvIGRhdGEgYmFzZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9hZGRfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgIHJjICAgICAgICAgPSBUUlVFOworICAgIHVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisgICAgCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgIC8qIFNlYWNoIGZvciBhbiBmcmVlIGVudHJ5ICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTTsgaWR4KyspCisgICAgeworICAgICAgICBpZiAoZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF0udmFsaWQgPT0gRkFMU0UpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBObyBmcmVlIGVudHJ5ICovCisgICAgaWYgKGlkeCA9PSBDUEhfQVBQX01BWF9SVUxFX05VTSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiTm8gZnJlZSBDUEggZW50cnkgXG4iKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBNVl9GVUxMOworICAgIH0KKworICAgIC8qIERvIG5vdCBhZGQgbmV3IHJ1bGUgaWYgdGhlcmUgaXMgYWxyZWFkeSBkdXBsaWNhdGVkIHJ1bGUgKi8KKyAgICByYyA9IGNwaF9kYl9jaGVja19kdXBsaWNhdGVfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBpZiAocmMgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiQWxyZWFkeSBoYXMgZHVwbGljYXRlZCBydWxlLCBjb3VsZCBub3QgYWRkIG5ldyBDUEggcnVsZSBcbiIpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIE1WX0VSUk9SOworICAgIH0gICAgICAgIAorICAgIAorICAgIC8qIFNhdmUgQ1BIIHJ1bGUgZm9yIGFwcGxpY2F0aW9uIHBhY2tldCAqLworICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgcF9jcGhfcnVsZS0+cGFyc2VfYm0gPSBwYXJzZV9ibTsKKyAgICBtZW1jcHkoJnBfY3BoX3J1bGUtPnBhcnNlX2tleSwgIHBhcnNlX2tleSwgIHNpemVvZihDUEhfQVBQX1BBUlNFX1QpKTsKKyAgICBwX2NwaF9ydWxlLT5tb2RfYm0gICA9IG1vZF9ibTsKKyAgICBtZW1jcHkoJnBfY3BoX3J1bGUtPm1vZF92YWx1ZSwgIG1vZF92YWx1ZSwgIHNpemVvZihDUEhfQVBQX01PRF9UKSk7CisgICAgcF9jcGhfcnVsZS0+ZnJ3ZF9ibSAgPSBmcndkX2JtOworICAgIG1lbWNweSgmcF9jcGhfcnVsZS0+ZnJ3ZF92YWx1ZSwgZnJ3ZF92YWx1ZSwgc2l6ZW9mKENQSF9BUFBfRlJXRF9UKSk7CisgICAgcF9jcGhfcnVsZS0+dmFsaWQgICAgPSBUUlVFOworICAgIGdfY3BoX2FwcF9kYi5ydWxlX251bSArKzsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGVsX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBhcHBsaWNhdGlvbiB0eXBlIENQSCBydWxlIGZyb20gZGF0YSBiYXNlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2RlbF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSAgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgcmMgICAgICAgICAgPSBGQUxTRTsKKyAgICB1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9jcGhfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcmMgPSBjcGhfZGJfY29tcGFyZV9ydWxlcyhwX2NwaF9ydWxlLT5wYXJzZV9ibSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSwgcGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgICAgICAgICBpZiAocmMgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQocF9jcGhfcnVsZSwgMCwgc2l6ZW9mKENQSF9BUFBfUlVMRV9UKSk7CisgICAgICAgICAgICAgICAgcF9jcGhfcnVsZS0+dmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBnX2NwaF9hcHBfZGIucnVsZV9udW0gLS07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl91cGRhdGVfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVXBkYXRlIGFwcGxpY2F0aW9uIHR5cGUgQ1BIIHJ1bGUgZnJvbSBkYXRhIGJhc2UgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX3VwZGF0ZV9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSAgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgcmMgICAgICAgICAgPSBGQUxTRTsKKyAgICB1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOyAgIAorICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9jcGhfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcmMgPSBjcGhfZGJfY29tcGFyZV9ydWxlcyhwX2NwaF9ydWxlLT5wYXJzZV9ibSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSwgcGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgICAgICAgICBpZiAocmMgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2NwaF9ydWxlLT5tb2RfYm0gICA9IG1vZF9ibTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnBfY3BoX3J1bGUtPm1vZF92YWx1ZSwgIG1vZF92YWx1ZSwgIHNpemVvZihDUEhfQVBQX01PRF9UKSk7CisgICAgICAgICAgICAgICAgcF9jcGhfcnVsZS0+ZnJ3ZF9ibSAgPSBmcndkX2JtOworICAgICAgICAgICAgICAgIG1lbWNweSgmcF9jcGhfcnVsZS0+ZnJ3ZF92YWx1ZSwgZnJ3ZF92YWx1ZSwgc2l6ZW9mKENQSF9BUFBfRlJXRF9UKSk7CisKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2dldF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgYXBwbGljYXRpb24gdHlwZSBDUEggcnVsZSBmcm9tIGRhdGEgYmFzZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAqbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlICA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICByYyAgICAgICAgICA9IEZBTFNFOworICAgIHVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7ICAgCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICByYyA9IGNwaF9kYl9jb21wYXJlX3J1bGVfYW5kX3BhY2tldChwX2NwaF9ydWxlLT5wYXJzZV9ibSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSwgcGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgICAgICAgICBpZiAocmMgPT0gVFJVRSkKKyAgICAgICAgICAgIHsgICAKKyAgICAgICAgICAgICAgICBpZiAocF9jcGhfcnVsZS0+bW9kX3ZhbHVlLnN0YXRlID09IFRSVUUpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKm1vZF9ibSAgPSBwX2NwaF9ydWxlLT5tb2RfYm07CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShtb2RfdmFsdWUsICZwX2NwaF9ydWxlLT5tb2RfdmFsdWUsIHNpemVvZihDUEhfQVBQX01PRF9UKSk7CisgICAgICAgICAgICAgICAgICAgICpmcndkX2JtID0gcF9jcGhfcnVsZS0+ZnJ3ZF9ibTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGZyd2RfdmFsdWUsICZwX2NwaF9ydWxlLT5mcndkX3ZhbHVlLCBzaXplb2YoQ1BIX0FQUF9GUldEX1QpKTsKKworICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIE1WX0ZBSUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2dldF9hcHBfcnVsZV9ieV9kaXJfcHJvdG8oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IGFwcGxpY2F0aW9uIHR5cGUgQ1BIIHJ1bGUgZnJvbSBkYXRhIGJhc2UgYnkgcHJvdG9jb2wgdHlwZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRpciAgICAgICAgLSBEaXJlY3Rpb24KKyogICAgICAgcHJvdG9fdHlwZSAtIFNLQiBwcm90b2NvbCB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9nZXRfYXBwX3J1bGVfYnlfZGlyX3Byb3RvICgKKyAgICBDUEhfRElSX0UgICAgICAgICAgICAgIGRpciwKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgIHByb3RvX3R5cGUsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FICpwYXJzZV9ibSwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgKnBhcnNlX2tleSwgICAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgICptb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgKmZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOyAgIAorICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9jcGhfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgaWYgKChwX2NwaF9ydWxlLT5tb2RfYm0gJiBDUEhfQVBQX1JYX01PRF9SRVBMQUNFX1BST1RPX1RZUEUpICYmCisgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPm1vZF92YWx1ZS5wcm90b190eXBlID09IHByb3RvX3R5cGUpICYmCisgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPm1vZF92YWx1ZS5zdGF0ZSAgICAgID09IFRSVUUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocF9jcGhfcnVsZS0+cGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUikgJiYKKyAgICAgICAgICAgICAgICAgICAgKChwX2NwaF9ydWxlLT5wYXJzZV9rZXkuZGlyID09IENQSF9ESVJfTk9UX0NBUkUpfHwocF9jcGhfcnVsZS0+cGFyc2Vfa2V5LmRpciA9PSBkaXIpKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5wYXJzZV9rZXkucnhfdHggPT0gQ1BIX0RJUl9UWCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcGFyc2VfYm0gPSBwX2NwaF9ydWxlLT5wYXJzZV9ibTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBhcnNlX2tleSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSwgc2l6ZW9mKENQSF9BUFBfUEFSU0VfVCkpOworICAgICAgICAgICAgICAgICAgICAqbW9kX2JtICAgPSBwX2NwaF9ydWxlLT5tb2RfYm07CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShtb2RfdmFsdWUsICZwX2NwaF9ydWxlLT5tb2RfdmFsdWUsIHNpemVvZihDUEhfQVBQX01PRF9UKSk7CisgICAgICAgICAgICAgICAgICAgICpmcndkX2JtICA9IHBfY3BoX3J1bGUtPmZyd2RfYm07CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShmcndkX3ZhbHVlLCAmcF9jcGhfcnVsZS0+ZnJ3ZF92YWx1ZSwgc2l6ZW9mKENQSF9BUFBfRlJXRF9UKSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfaW5jcmVhc2VfY291bnRlcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbmNyZWFzZSBSWCBjb3VudGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2luY3JlYXNlX2NvdW50ZXIgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgIHJjICAgICAgICAgID0gTVZfRkFJTDsKKyAgICB1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOyAgIAorICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9jcGhfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcmMgPSBjcGhfZGJfY29tcGFyZV9ydWxlX2FuZF9wYWNrZXQocF9jcGhfcnVsZS0+cGFyc2VfYm0sICZwX2NwaF9ydWxlLT5wYXJzZV9rZXksIHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgICAgICAgICAgaWYgKHJjID09IFRSVUUpCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgaWYgKHBfY3BoX3J1bGUtPm1vZF92YWx1ZS5zdGF0ZSA9PSBUUlVFKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfY3BoX3J1bGUtPmNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogIEluY3JlYXNlIFJYIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvIChDUEhfRElSX0UgZGlyLAorICAgIFVJTlQxNiAgICBwcm90b190eXBlKQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSAgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7ICAgCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBkaXIgYW5kIHByb3RvY29sIHR5cGUgKi8KKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIGlmICgocF9jcGhfcnVsZS0+bW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfUkVQTEFDRV9QUk9UT19UWVBFKSAmJgorICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5tb2RfdmFsdWUucHJvdG9fdHlwZSA9PSBwcm90b190eXBlKSAmJgorICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5tb2RfdmFsdWUuc3RhdGUgICAgICA9PSBUUlVFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICgocF9jcGhfcnVsZS0+cGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUikgJiYKKyAgICAgICAgICAgICAgICAgICAgKChwX2NwaF9ydWxlLT5wYXJzZV9rZXkuZGlyID09IENQSF9ESVJfTk9UX0NBUkUpIHx8IAorICAgICAgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPnBhcnNlX2tleS5kaXIgPT0gZGlyKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5wYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFgpICYmCisgICAgICAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+cGFyc2Vfa2V5LnJ4X3R4ID09IENQSF9ESVJfVFgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9jcGhfcnVsZS0+Y291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9PSzsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfeG1sX3BhcmFtKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCB0aGUgWE1MIHBhcmFtZXRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X3htbF9wYXJhbShWT0lEKQoreworICAgIGV6eG1sX3QgICAgIHhtbF9oZWFkOworICAgIGV6eG1sX3QgICAgIHhtbF9lbGVtZW50OworICAgIGV6eG1sX3QgICAgIHhtbF9hdHRyOworICAgIFVJTlQzMiAgICAgIGF0dHJfdmFsdWUgPSAwOworICAgIEJPT0wgICAgICAgIGJvb2xfdmFsdWUgPSBUUlVFOworICAgIGNvbnN0IENIQVIgKm5hbWUgICAgICAgPSBOVUxMOworICAgIGNvbnN0IENIQVIgKnZhbHVlICAgICAgPSBOVUxMOyAgCisgICAgSU5UMzIgICAgICAgcmMgICAgICAgICA9IE1WX09LOworCisgICAgLyogUmVhZCBPTlUgcHJvZmlsZSBYTUwgZmlsZSAqLworICAgIGlmICgoeG1sX2hlYWQgPSBlenhtbF9wYXJzZV9maWxlKGdfb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX3BhcnNlX2ZpbGUoKSBvZiAlcyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIGdfb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlKTsKKyAgICAgICAgcmMgPSBNVl9OT1RfRk9VTkQ7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorCisgICAgaWYgKCh4bWxfZWxlbWVudCA9IGV6eG1sX2dldCh4bWxfaGVhZCwgWE1MX1BST0ZJTEVfRUxNX0NBUEFCSUxJVFksIC0xKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2dldCgpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfUFJPRklMRV9FTE1fQ0FQQUJJTElUWSk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKworICAgIH0KKyAgICAKKyAgICBmb3IgKHhtbF9hdHRyID0gZXp4bWxfY2hpbGQoeG1sX2VsZW1lbnQsIFhNTF9QUk9GSUxFX0VMTV9BVFRSSUIpOyB4bWxfYXR0cjsgeG1sX2F0dHIgPSB4bWxfYXR0ci0+bmV4dCkKKyAgICB7IAorICAgICAgICAvKiBQYXJzZSBhdHRyaWJ1dGUgdHlwZSBhbmQgdmFsdWUgKi8KKyAgICAgICAgbmFtZSA9IGV6eG1sX2F0dHIoeG1sX2F0dHIsIFhNTF9QUk9GSUxFX0FUVFJfTkFNRSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2F0dHIoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX1BST0ZJTEVfQVRUUl9OQU1FKTsKKyAgICAgICAgICAgIHJjID0gTVZfTk9UX0ZPVU5EOyAgICAgICAgCisgICAgICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgWE1MX1BST0ZJTEVfTkFNRV9QUk9GSUxFKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IGV6eG1sX2F0dHIoeG1sX2F0dHIsIFhNTF9QUk9GSUxFX0FUVFJfVkFMVUUpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfYXR0cigpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfUFJPRklMRV9BVFRSX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICByYyA9IE1WX05PVF9GT1VORDsgICAgICAgIAorICAgICAgICAgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cl92YWx1ZSA9IG10eXBlX2dldF9kaWdpdF9udW0odmFsdWUpOworCisgICAgICAgICAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9QUk9GSUxFX0lELCAmYXR0cl92YWx1ZSk7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCBYTUxfUFJPRklMRV9OQU1FX0FDVElWRV9QT1JUKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IGV6eG1sX2F0dHIoeG1sX2F0dHIsIFhNTF9QUk9GSUxFX0FUVFJfVkFMVUUpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfYXR0cigpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfUFJPRklMRV9BVFRSX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICByYyA9IE1WX05PVF9GT1VORDsgICAgICAgIAorICAgICAgICAgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cl92YWx1ZSA9IG10eXBlX2dldF9kaWdpdF9udW0odmFsdWUpOworCisgICAgICAgICAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9BQ1RJVkVfUE9SVCwgJmF0dHJfdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZXp4bWxfZnJlZSh4bWxfaGVhZCk7CisKKyAgICAvKiBSZWFkIENQSCBYTUwgZmlsZSAqLworICAgIGlmICgoeG1sX2hlYWQgPSBlenhtbF9wYXJzZV9maWxlKGdfY3BoX3htbF9jZmdfZmlsZSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9wYXJzZV9maWxlKCkgb2YgJXMgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBnX2NwaF94bWxfY2ZnX2ZpbGUpOworICAgICAgICByYyA9IE1WX05PVF9GT1VORDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisKKyAgICAvKiBSZWFkIGFwcGxpY2F0aW9uIHN1cHBvcnQgZmxhZyovCisgICAgaWYgKCh4bWxfZWxlbWVudCA9IGV6eG1sX2dldCh4bWxfaGVhZCwgWE1MX0NQSF9FTE1fQVBQX1NVUFBPUlQsIC0xKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2dldCgpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfQ1BIX0VMTV9BUFBfU1VQUE9SVCk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgaWYgKHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgYXR0cl92YWx1ZSA9IG10eXBlX2dldF9kaWdpdF9udW0oeG1sX2VsZW1lbnQtPnR4dCk7CisgICAgYm9vbF92YWx1ZSA9IChhdHRyX3ZhbHVlICE9IDApPyBUUlVFOkZBTFNFOworICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0FQUF9TVVBQT1JULCAmYm9vbF92YWx1ZSk7CisKKyAgICAvKiBSZWFkIElHTVAgc3VwcG9ydCBmbGFnKi8KKyAgICBpZiAoKHhtbF9lbGVtZW50ID0gZXp4bWxfZ2V0KHhtbF9oZWFkLCBYTUxfQ1BIX0VMTV9JR01QX1NVUFBPUlQsIC0xKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2dldCgpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfQ1BIX0VMTV9JR01QX1NVUFBPUlQpOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGlmICh4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiB4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGF0dHJfdmFsdWUgPSBtdHlwZV9nZXRfZGlnaXRfbnVtKHhtbF9lbGVtZW50LT50eHQpOworICAgIGJvb2xfdmFsdWUgPSAoYXR0cl92YWx1ZSAhPSAwKT8gVFJVRTpGQUxTRTsKKyAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9JR01QX1NVUFBPUlQsICZib29sX3ZhbHVlKTsKKworICAgIC8qIFJlYWQgQkMgc3VwcG9ydCBmbGFnKi8KKyAgICBpZiAoKHhtbF9lbGVtZW50ID0gZXp4bWxfZ2V0KHhtbF9oZWFkLCBYTUxfQ1BIX0VMTV9CQ19TVVBQT1JULCAtMSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9nZXQoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX0NQSF9FTE1fQkNfU1VQUE9SVCk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgaWYgKHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgYXR0cl92YWx1ZSA9IG10eXBlX2dldF9kaWdpdF9udW0oeG1sX2VsZW1lbnQtPnR4dCk7CisgICAgYm9vbF92YWx1ZSA9IChhdHRyX3ZhbHVlICE9IDApPyBUUlVFOkZBTFNFOworICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0JDX1NVUFBPUlQsICZib29sX3ZhbHVlKTsKKworICAgIC8qIFJlYWQgRGF0YSBmbG93IG1hcHBpbmcgc3VwcG9ydCBmbGFnKi8KKyAgICBpZiAoKHhtbF9lbGVtZW50ID0gZXp4bWxfZ2V0KHhtbF9oZWFkLCBYTUxfQ1BIX0VMTV9GTE9XX1NVUFBPUlQsIC0xKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2dldCgpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfQ1BIX0VMTV9GTE9XX1NVUFBPUlQpOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGlmICh4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiB4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGF0dHJfdmFsdWUgPSBtdHlwZV9nZXRfZGlnaXRfbnVtKHhtbF9lbGVtZW50LT50eHQpOworICAgIGJvb2xfdmFsdWUgPSAoYXR0cl92YWx1ZSAhPSAwKT8gVFJVRTpGQUxTRTsKKyAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9GTE9XX1NVUFBPUlQsICZib29sX3ZhbHVlKTsKKworICAgIC8qIFJlYWQgVURQIHBvcnQgbWFwcGluZyBzdXBwb3J0IGZsYWcqLworICAgIGlmICgoeG1sX2VsZW1lbnQgPSBlenhtbF9nZXQoeG1sX2hlYWQsIFhNTF9DUEhfRUxNX1VEUF9TVVBQT1JULCAtMSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9nZXQoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX0NQSF9FTE1fVURQX1NVUFBPUlQpOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGlmICh4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiB4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGF0dHJfdmFsdWUgPSBtdHlwZV9nZXRfZGlnaXRfbnVtKHhtbF9lbGVtZW50LT50eHQpOworICAgIGJvb2xfdmFsdWUgPSAoYXR0cl92YWx1ZSAhPSAwKT8gVFJVRTpGQUxTRTsKKyAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9VRFBfU1VQUE9SVCwgJmJvb2xfdmFsdWUpOworCitmcmVlX2V4aXQ6CisgICAgZXp4bWxfZnJlZSh4bWxfaGVhZCk7CisgICAgcmV0dXJuIHJjOyAgICAgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX2RiX2dldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXQgVC1DT05UIHN0YXRlCisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZGJfZ2V0X3Rjb250X3N0YXRlKFVJTlQzMiB0Y29udCkKK3sKKyAgICAvKiBDaGVjayB0Y29udCAqLworICAgIGlmICh0Y29udCA+PSBNVl9UQ09OVF9MTElEX05VTSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAidGNvbnRbJWRdIGlzIGlsbGVnYWwsIHNob3VsZCBiZSBsZXNzIHRoYW4gWyVkXVxuIiwgdGNvbnQsIE1WX1RDT05UX0xMSURfTlVNKTsgCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gZ19jcGhfYXBwX2RiLnRjb250X3N0YXRlW3Rjb250XTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBjcGhfZGJfc2V0X3Rjb250X3N0YXRlCisqKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgVC1DT05UIHN0YXRlIGluIG12X2NwaAorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisqKgorKiogT1VUUFVUUzoKKyoqICAgTm9uZS4gCisqKgorKiogUkVUVVJOUzogICAgIAorKiogIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCisqKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfc2V0X3Rjb250X3N0YXRlKFVJTlQzMiB0Y29udCwgQk9PTCBzdGF0ZSkKK3sKKyAgICAvKiBDaGVjayB0Y29udCAqLworICAgIGlmICh0Y29udCA+PSBNVl9UQ09OVF9MTElEX05VTSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAidGNvbnRbJWRdIGlzIGlsbGVnYWwsIHNob3VsZCBiZSBsZXNzIHRoYW4gWyVkXVxuIiwgdGNvbnQsIE1WX1RDT05UX0xMSURfTlVNKTsgCisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIC8qIEFwcGx5IHQtY29udCBzdGF0ZSB0byBtdl9jcGggKi8KKyAgICBnX2NwaF9hcHBfZGIudGNvbnRfc3RhdGVbdGNvbnRdID0gc3RhdGU7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2Rpc3BsYXlfcGFyc2VfZmllbGQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGlzcGxheSBDUEggcnVsZSBwYXJzaW5nIGZpZWxkCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kaXNwbGF5X3BhcnNlX2ZpZWxkKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICJQYXJzZSBmaWVsZCgweCV4KTogIiwgcGFyc2VfYm0pOyAgICAKKworICAgIC8qIFByaW50IGRpcmVjdGlvbiAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRElSKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRGlyKCVzKSwgIiwgY3BoX2FwcF9sb29rdXBfZGlyKHBhcnNlX2tleS0+ZGlyKSk7CisgICAgfQorCisgICAgLyogUHJpbnQgVFgvUlggZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlJYL1RYKCVzKSwgIiwgY3BoX2FwcF9sb29rdXBfcnhfdHgocGFyc2Vfa2V5LT5yeF90eCkpOworICAgIH0KKworICAgIC8qIFByaW50IE1hcnZlbGwgaGVhZGVyICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9NSCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIk1IKDB4JXgpLCAiLCBwYXJzZV9rZXktPm1oKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBFdGggdHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJFdGggdHlwZSgweCUwNHgpLCAiLCBwYXJzZV9rZXktPmV0aF90eXBlKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBFdGggc3VidHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJFdGggc3VidHlwZSglZCksICIsIHBhcnNlX2tleS0+ZXRoX3N1YnR5cGUpOworICAgIH0KKworICAgIC8qIFByaW50IElQVjQgdHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiSVB2NCB0eXBlKCVkKSwgIiwgcGFyc2Vfa2V5LT5pcHY0X3R5cGUpOworICAgIH0KKworICAgIC8qIFByaW50IElQdjYgTkgxICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIklQdjYgTkgxKCVkKSwgIiwgcGFyc2Vfa2V5LT5pcHY2X25oMSk7CisgICAgfQorCisgICAgLyogUHJpbnQgSVB2NiBOSDIgKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiSVB2NiBOSDIoJWQpLCAiLCBwYXJzZV9rZXktPmlwdjZfbmgyKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBJQ01QdjYgdHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJJQ01QdjYgdHlwZSglZCkiLCBwYXJzZV9rZXktPmljbXB2Nl90eXBlKTsKKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIG1vZGlmaWNhdGlvbiBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQoCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlKQoreworICAgIHByaW50ayhLRVJOX0lORk8gIk1vZCBmaWVsZCgweCV4KTogIiwgbW9kX2JtKTsgICAgCisKKyAgICAvKiBQcmludCBwcm90b2NvbCB0eXBlICovCisgICAgaWYgKG1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX1JFUExBQ0VfUFJPVE9fVFlQRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlByb3RvIHR5cGUoMHgleCksICIsIG1vZF92YWx1ZS0+cHJvdG9fdHlwZSk7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAic3RhdGUoJXMpIiwgKG1vZF92YWx1ZS0+c3RhdGU9PVRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7ICAKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIHJ1bGUgZm9yd2FyZGluZyBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICJGb3J3YXJkIGZpZWxkKDB4JXgpOiAiLCBmcndkX2JtKTsgICAgCisKKyAgICAvKiBQcmludCB0YXJnZXQgcG9ydCAqLworICAgIGlmIChmcndkX2JtICYgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUE9SVCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlRhcmdldCBwb3J0KCVkKSwgIiwgZnJ3ZF92YWx1ZS0+dHJnX3BvcnQpOworICAgIH0KKworICAgIC8qIFByaW50IHRhcmdldCBxdWV1ZSAqLworICAgIGlmIChmcndkX2JtICYgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUVVFVUUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJUYXJnZXQgcXVldWUoJWQpLCAiLCBmcndkX3ZhbHVlLT50cmdfcXVldWUpOworICAgIH0KKworICAgIC8qIFByaW50IEdFTSBwb3J0ICovCisgICAgaWYgKGZyd2RfYm0gJiBDUEhfQVBQX0ZSV0RfU0VUX0dFTV9QT1JUKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiR2VtIHBvcnQoJWQpIiwgZnJ3ZF92YWx1ZS0+Z2VtX3BvcnQpOworICAgIH0gICAgCisKKworICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7ICAKKworICAgIHJldHVybiBNVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X2FsbCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IGFsbCBDUEggcnVsZXMgaW4gZGF0YSBiYXNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kaXNwbGF5X2FsbChWT0lEKQoreworICAgIENQSF9BUFBfUlVMRV9UICpwX2NwaF9ydWxlID0gTlVMTDsKKyAgICBVSU5UMzIgICAgICAgICAgaWR4ICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgIHJ1bGVfaWR4ICAgPSAwOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ1BIIEFwcGxpY2F0aW9uIERhdGEgQmFzZSwgdG90YWwgcnVsZSBudW1iZXJbJXVdXG4iLCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOworICAgIHByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiVFBNIGNvbXBsZXggcHJvZmlsZTogJXMsIGFjdGl2ZSBXQU46ICVzXG4iLCAKKyAgICAgICAgICAgY3BoX2FwcF9sb29rdXBfcHJvZmlsZV9pZChnX2NwaF9hcHBfZGIucHJvZmlsZV9pZCksIAorICAgICAgICAgICBjcGhfYXBwX2xvb2t1cF9nbWFjKGdfY3BoX2FwcF9kYi5hY3RpdmVfcG9ydCkpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiR2VuZXJpYyBhcHBsaWNhdGlvbiBoYW5kbGluZyBzdXBwcG9ydDogJXNcbiIsIAorICAgICAgIChnX2NwaF9hcHBfZGIuYXBwX3N1cHBvcnQgPT0gVFJVRSk/IkVuYWJsZWQiOiJEaXNhYmxlZCIpOworICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfSUdNUF9IQU5ETEUKKyAgICBwcmludGsoS0VSTl9JTkZPICJJR01QL01MRCBoYW5kbGluZyBzdXBwcG9ydDogJXNcbiIsIAorICAgICAgICAgICAoZ19jcGhfYXBwX2RiLmlnbXBfc3VwcG9ydCA9PSBUUlVFKT8iRW5hYmxlZCI6IkRpc2FibGVkIik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVl9DUEhfQkNfSEFORExFICAKKyAgICBwcmludGsoS0VSTl9JTkZPICJCcm9hZGNhc3QgaGFuZGxpbmcgc3VwcHBvcnQ6ICVzXG4iLCAKKyAgICAgICAgICAgKGdfY3BoX2FwcF9kYi5iY19zdXBwb3J0ID09IFRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUgICAKKyAgICBwcmludGsoS0VSTl9JTkZPICJEYXRhIGZsb3cgbWFwcGluZy9tb2RpZmljYXRpb24gc3VwcHBvcnQ6ICVzXG4iLCAgICAgCisgICAgICAgICAgIChnX2NwaF9hcHBfZGIuZmxvd19zdXBwb3J0ID09IFRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorICAgIHByaW50ayhLRVJOX0lORk8gIlVEUCBwb3J0IG1hcHBpbmcgc3VwcHBvcnQ6ICVzXG4iLAorICAgICAgICAgICAoZ19jcGhfYXBwX2RiLnVkcF9zdXBwb3J0ID09IFRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKyNlbmRpZgorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ1BIIHRvdGFsIHJ1bGUgbnVtYmVyOiAlZFxuIiwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgICAgCisKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJDUEggcnVsZTogIyVkXG4iLCBydWxlX2lkeCk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZChwX2NwaF9ydWxlLT5wYXJzZV9ibSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQocF9jcGhfcnVsZS0+bW9kX2JtLCAgICAgJnBfY3BoX3J1bGUtPm1vZF92YWx1ZSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKHBfY3BoX3J1bGUtPmZyd2RfYm0sICAgJnBfY3BoX3J1bGUtPmZyd2RfdmFsdWUpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ291bnRlcjogJWRcblxuIiwgcF9jcGhfcnVsZS0+Y291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiTWlzLW1hdGNoZWQgb3IgYnJvYWRjYXN0IGNvdW50ZXI6ICVkXG4iLCBnX2NwaF9hcHBfZGIuYmNfY291bnQpOyAgICAKKworICAgIHByaW50ayhLRVJOX0lORk8gIlQtQ09OVCBTdGF0ZVxuIik7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBNVl9UQ09OVF9MTElEX05VTTsgaWR4KyspCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJULUNPTlRbJWRdOiAlc1xuIiwgaWR4LCAoZ19jcGhfYXBwX2RiLnRjb250X3N0YXRlW2lkeF0gPT0gVFJVRSk/IlRSVUUiOiJGQUxTRSIpOworICAgIH0KKworICAgIHJldHVybiBNVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGRhdGEgYmFzZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2luaXQoVk9JRCkKK3sKKyAgICBVSU5UMzIgICAgaWR4ID0gMDsKKyAgICBNVl9TVEFUVVMgcmMgID0gTVZfT0s7CisKKyAgICBtZW1zZXQoJmdfY3BoX2FwcF9kYiwgMCwgc2l6ZW9mKGdfY3BoX2FwcF9kYikpOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU07IGlkeCsrKQorICAgICAgICBnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XS52YWxpZCA9IEZBTFNFOworCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlICovCisgICAgZ19jcGhfYXBwX2RiLnByb2ZpbGVfaWQgICA9IFRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0g7CisgICAgZ19jcGhfYXBwX2RiLmFjdGl2ZV9wb3J0ICA9IE1WX0FQUF9QT05fTUFDX1BPUlQ7CisgICAgZ19jcGhfYXBwX2RiLmFwcF9zdXBwb3J0ICA9IFRSVUU7CisgICAgZ19jcGhfYXBwX2RiLmlnbXBfc3VwcG9ydCA9IEZBTFNFOworICAgIGdfY3BoX2FwcF9kYi5iY19zdXBwb3J0ICAgPSBGQUxTRTsKKyAgICBnX2NwaF9hcHBfZGIuZmxvd19zdXBwb3J0ID0gRkFMU0U7CisgICAgZ19jcGhfYXBwX2RiLnVkcF9zdXBwb3J0ICA9IEZBTFNFOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBNVl9UQ09OVF9MTElEX05VTTsgaWR4KyspCisgICAgICAgIGdfY3BoX2FwcF9kYi50Y29udF9zdGF0ZVtpZHhdID0gRkFMU0U7CisKKyAgICAvKiBJbml0IHNwaW4gbG9jayAqLworICAgIHNwaW5fbG9ja19pbml0KCZnX2NwaF9hcHBfZGIuYXBwX2xvY2spOworCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2RiLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTkwM2RlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2RiLmgKQEAgLTAsMCArMSw1MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZGIuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBkYXRhIGJhc2UgaW1wbGVtZW50YXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0RCX0hfCisjZGVmaW5lIF9NVl9DUEhfREJfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEYXRhIHR5cGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVVNfQ1BIX1hNTF9DRkdfRklMRSAgICAgICAgICAiL2V0Yy94bWxfcGFyYW1zL2NwaF94bWxfY2ZnX2ZpbGUueG1sIgorI2RlZmluZSBVU19PTlVfUFJPRklMRV9YTUxfQ0ZHX0ZJTEUgICIvZXRjL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbCIKKworI2RlZmluZSBYTUxfUFJPRklMRV9FTE1fQ0FQQUJJTElUWSAgICJDYXBhYmlsaXR5IgorI2RlZmluZSBYTUxfUFJPRklMRV9FTE1fQVRUUklCICAgICAgICJhdHRyaWIiCisjZGVmaW5lIFhNTF9QUk9GSUxFX0FUVFJfTkFNRSAgICAgICAgIm5hbWUiCisjZGVmaW5lIFhNTF9QUk9GSUxFX0FUVFJfVkFMVUUgICAgICAgInZhbHVlIgorI2RlZmluZSBYTUxfUFJPRklMRV9OQU1FX1BST0ZJTEUgICAgICJDb21wbGV4IHByb2ZpbGUiCisjZGVmaW5lIFhNTF9QUk9GSUxFX05BTUVfQUNUSVZFX1BPUlQgIkFjdGl2ZSB3YW4iCisKKyNkZWZpbmUgWE1MX0NQSF9FTE1fQVBQX1NVUFBPUlQgICAgICAiYXBwX3N1cHBvcnQiCisjZGVmaW5lIFhNTF9DUEhfRUxNX0lHTVBfU1VQUE9SVCAgICAgImlnbXBfc3VwcG9ydCIKKyNkZWZpbmUgWE1MX0NQSF9FTE1fQkNfU1VQUE9SVCAgICAgICAiYmNfc3VwcG9ydCIKKyNkZWZpbmUgWE1MX0NQSF9FTE1fRkxPV19TVVBQT1JUICAgICAiZmxvd19zdXBwb3J0IgorI2RlZmluZSBYTUxfQ1BIX0VMTV9VRFBfU1VQUE9SVCAgICAgICJ1ZHBfc3VwcG9ydCIKKworCisvKiBDUEggcnVsZSBkZWZpbml0aW9uIGZvciBhcHBsaWNhdGlvbiBwYWNrZXQgaGFuZGxpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJPT0wgICAgICAgICAgICAgICAgICB2YWxpZDsKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm07CisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgIHBhcnNlX2tleTsKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtOworICAgIENQSF9BUFBfTU9EX1QgICAgICAgICBtb2RfdmFsdWU7CisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm07CisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgIGZyd2RfdmFsdWU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIGNvdW50OyAKK30gQ1BIX0FQUF9SVUxFX1Q7CisKKy8qIENQSCBkYXRhIGJhc2UgZm9yIGFwcGxpY2F0aW9uIHBhY2tldCBoYW5kbGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ1BIX0FQUF9NQVhfUlVMRV9OVU0gICg2NCkKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCAgcHJvZmlsZV9pZDsgICAgICAgLyogQ29tcGxleCBwcm9maWxlIElELCBzZWUgdHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCAgKi8KKyAgICBNVl9BUFBfR01BQ19QT1JUX0UgICAgICAgICBhY3RpdmVfcG9ydDsgICAgICAvKiBDdXJyZW50IGFjdGl2ZSBXQU4gR0UgcG9ydCwgc2VlIE1WX0FQUF9HTUFDX1BPUlRfRSAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgIGFwcF9zdXBwb3J0OyAgICAgIC8qIFdoZXRoZXIgc3VwcG9ydCBnZW5lcmljIGFwcGxpY2F0aW9uIGhhbmRsaW5nICAgICAgICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgaWdtcF9zdXBwb3J0OyAgICAgLyogV2hldGhlciBzdXBwb3J0IElHTVAvTUxEIHBhY2tldCBoYW5kbGluZyAgICAgICAgICAgKi8KKyAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICBiY19zdXBwb3J0OyAgICAgICAvKiBXaGV0aGVyIHN1cHBvcnQgVS9TIGJyb2FkY2FzdCBwYWNrZXQgaGFuZGxpbmcgICAgICAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfc3VwcG9ydDsgICAgIC8qIFdoZXRoZXIgc3VwcG9ydCBmbG93IG1hcHBpbmcgaGFuZGxpbmcgaW4gQ1BIICAgICAgICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgdWRwX3N1cHBvcnQ7ICAgICAgLyogV2hldGhlciBzdXBwb3J0IFVEUCBwb3J0IG1hcHBpbmcgaW4gQ1BIICAgICAgICAgICAgKi8KKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBydWxlX251bTsgICAgICAgICAvKiBDdXJyZW50IGFwcGxpY2F0aW9uIHJ1bGUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAqLworICAgIENQSF9BUFBfUlVMRV9UICAgICAgICAgICAgIGNwaF9ydWxlW0NQSF9BUFBfTUFYX1JVTEVfTlVNXTsgLyogQ1BIIGFwcGxpY2F0aW9uIHJ1bGVzICAgICAgICAgICAgICAgICovCisgICAgc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgYXBwX2xvY2s7ICAgICAgICAgLyogU3BpbiBsb2NrIGZvciBhcHBsaWNhdGlvbiBydWxlIG9wZXJhdGlvbiAgICAgICAgICAgKi8KKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBiY19jb3VudDsgICAgICAgICAvKiBDb3VudGVyIGZvciBtaXMtbWF0Y2hlZCBwYWNrZXRzLCB1c3VhbGx5IGlzIGJjICAgICAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgIHRjb250X3N0YXRlW01WX1RDT05UX0xMSURfTlVNXTsvKiBULUNPTlQgc3RhdGUgdXNlZCB0byBjb250cm9sIFNXRiAgICAgICovCit9IENQSF9BUFBfREJfVDsKKworLyogQ1BIIGRhdGFiYXNlIHBhcmFtZXRlciBlbnVtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0RCX1BBUkFNX1BST0ZJTEVfSUQgPSAwLAorICAgIENQSF9EQl9QQVJBTV9BQ1RJVkVfUE9SVCwKKyAgICBDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQsICAgIAorICAgIENQSF9EQl9QQVJBTV9JR01QX1NVUFBPUlQsCisgICAgQ1BIX0RCX1BBUkFNX0JDX1NVUFBPUlQsCisgICAgQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVCwKKyAgICBDUEhfREJfUEFSQU1fVURQX1NVUFBPUlQsICAgIAorICAgIENQSF9EQl9QQVJBTV9CQ19DT1VOVEVSCit9IENQSF9EQl9QQVJBTV9FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX3NldF9wYXJhbSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgQ1BIIERCIHBhcmFtZXRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcmFtICAgLSBUaGUgcGFyYW1ldGVyIHR5cGUKKyogICAgICAgdmFsdWUgICAtIFBhcmFtZXRlciB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX3NldF9wYXJhbSAoQ1BIX0RCX1BBUkFNX0UgcGFyYW0sIFZPSUQgKnZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X3BhcmFtKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggREIgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyYW0gICAtIFRoZSBwYXJhbWV0ZXIgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICB2YWx1ZSAgIC0gUGFyYW1ldGVyIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X3BhcmFtIChDUEhfREJfUEFSQU1fRSBwYXJhbSwgVk9JRCAqdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9hZGRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfYWRkX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kZWxfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBDUEggcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2RlbF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl91cGRhdGVfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVXBkYXRlIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfdXBkYXRlX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgKm1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICpmcndkX2JtLAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X2FwcF9ydWxlX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgYXBwbGljYXRpb24gdHlwZSBDUEggcnVsZSBmcm9tIGRhdGEgYmFzZSBieSBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF9hcHBfcnVsZV9ieV9kaXJfcHJvdG8gKAorICAgIENQSF9ESVJfRSAgICAgICAgICAgICAgZGlyLAorICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgcHJvdG9fdHlwZSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgKnBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICAqcGFyc2Vfa2V5LCAgICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfaW5jcmVhc2VfY291bnRlcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbmNyZWFzZSBSWCBjb3VudGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2luY3JlYXNlX2NvdW50ZXIgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046ICBJbmNyZWFzZSBSWCBjb3VudGVyIGFjY29yZGluZyB0byBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byAoQ1BIX0RJUl9FIGRpciwKKyAgICBVSU5UMTYgICAgcHJvdG9fdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2dldF94bWxfcGFyYW0oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IHRoZSBYTUwgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9nZXRfeG1sX3BhcmFtKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9kYl9nZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2RiX2dldF90Y29udF9zdGF0ZShVSU5UMzIgdGNvbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9kYl9zZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3BoCisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKKyoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9zZXRfdGNvbnRfc3RhdGUoVUlOVDMyIHRjb250LCBCT09MIHN0YXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIHBhcnNpbmcgZmllbGQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfcGFyc2VfZmllbGQoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGlzcGxheSBDUEggcnVsZSBtb2RpZmljYXRpb24gZmllbGQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfbW9kX2ZpZWxkKAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2Rpc3BsYXlfZnJ3ZF9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIGZvcndhcmRpbmcgZmllbGQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfZnJ3ZF9maWVsZCgKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2Rpc3BsYXlfYWxsKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIGRhdGEgYmFzZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kaXNwbGF5X2FsbChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBkYXRhIGJhc2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfaW5pdChWT0lEKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfREJfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzY4NTFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5jCkBAIC0wLDAgKzEsNDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2Rldi5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGNoYXIgZGV2aWNlIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKworLyogVXNlZCB0byBwcmV2ZW50IG11bHRpcGxlIGFjY2VzcyB0byBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgICAgICAgICAgICAgICBnX2NwaF9kZXZpY2Vfb3BlbiA9IDA7CitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZ19jcGhfbWlzY19kZXY7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9vcGVuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBleGVjdXRlcyBkZXZpY2Ugb3BlbiBhY3Rpb25zCisqCisqIElOUFVUUzoKKyogICAgICAgaW5vZGUgLSBEZXZpY2UgaW5vZGUgcG9pbnRlci4KKyogICAgICAgZmlsZSAgLSBGaWxlIGhhbmRsZXIuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQzMiBjcGhfZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworI2lmIDAKKyAgICBpZiAoZ19jcGhfZGV2aWNlX29wZW4gPiAwKQorICAgICAgICByZXR1cm4gLUVCVVNZOworI2VuZGlmCisKKyAgICBnX2NwaF9kZXZpY2Vfb3BlbisrOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfcmVsZWFzZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgZGV2aWNlIHJlbGVhc2UgYWN0aW9ucworKgorKiBJTlBVVFM6CisqICAgICAgIGlub2RlIC0gRGV2aWNlIGlub2RlIHBvaW50ZXIuCisqICAgICAgIGZpbGUgIC0gRmlsZSBoYW5kbGVyLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UMzIgY3BoX2Rldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJFbnRlclxuIik7CisKKyNpZiAwCisgICAgaWYgKGNwaF9kZXZpY2Vfb3BlbiA+IDApCisgICAgICAgIGNwaF9kZXZpY2Vfb3Blbi0tOworI2VuZGlmCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfaW9jdGwoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGlvY3RsIGNvbW1hbmRzCisqCisqIElOUFVUUzoKKyogICAgICAgaW5vZGUgLSBEZXZpY2UgaW5vZGUgcG9pbnRlci4KKyogICAgICAgZmlsZSAgLSBGaWxlIGhhbmRsZXIuCisqICAgICAgIGNtZCAgIC0gQ29tbWFuZC4KKyogICAgICAgYXJnICAgLSBQb250ZXIgdG8gYXJnLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UMzIgY3BoX2Rldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgVUlOVDMyIGNtZCwgVUxPTkcgYXJnKQoreworICAgIENQSF9JT0NUTF9BUFBfUlVMRV9UICAgIGNwaF9hcHBfcnVsZTsKKyAgICBDUEhfSU9DVExfRkxPV19NQVBfVCAgICBjcGhfZmxvd19tYXA7CisgICAgQ1BIX0lPQ1RMX0RTQ1BfTUFQX1QgICAgY3BoX2RzY3BfbWFwOworICAgIENQSF9JT0NUTF9NSVNDX1QgICAgICAgIGNwaF9taXNjOworICAgIENQSF9JT0NUTF9UQ09OVF9TVEFURV9UIGNwaF90Y29udDsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgICByYyAgPSAtRUlOVkFMOworCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICAgICAgLyogQ1BIIGFwcGxpY2F0aW9uIHBhY2tldCBoYW5kbGluZyBJT0NUTAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfU0VUX0NPTVBMRVhfUFJPRklMRTogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9taXNjLCAoQ1BIX0lPQ1RMX01JU0NfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9NSVNDX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUoY3BoX21pc2MucHJvZmlsZV9pZCwgY3BoX21pc2MuYWN0aXZlX3BvcnQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfU0VUX0ZFQVRVUkVfRkxBRzogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9taXNjLCAoQ1BIX0lPQ1RMX01JU0NfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9NSVNDX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3NldF9mZWF0dXJlX2ZsYWcoY3BoX21pc2MuZmVhdHVyZV90eXBlLCBjcGhfbWlzYy5mZWF0dXJlX2ZsYWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0FQUF9BRERfUlVMRTogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9hcHBfcnVsZSwgKENQSF9JT0NUTF9BUFBfUlVMRV9UICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX2FkZF9hcHBfcnVsZShjcGhfYXBwX3J1bGUucGFyc2VfYm0sICZjcGhfYXBwX3J1bGUucGFyc2Vfa2V5LCBjcGhfYXBwX3J1bGUubW9kX2JtLCAmY3BoX2FwcF9ydWxlLm1vZF92YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BoX2FwcF9ydWxlLmZyd2RfYm0sICZjcGhfYXBwX3J1bGUuZnJ3ZF92YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9BUFBfREVMX1JVTEU6ICAgICAgICAKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfYXBwX3J1bGUsIChDUEhfSU9DVExfQVBQX1JVTEVfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9BUFBfUlVMRV9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9kZWxfYXBwX3J1bGUoY3BoX2FwcF9ydWxlLnBhcnNlX2JtLCAmY3BoX2FwcF9ydWxlLnBhcnNlX2tleSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9BUFBfVVBEQVRFX1JVTEU6ICAgICAgICAKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfYXBwX3J1bGUsIChDUEhfSU9DVExfQVBQX1JVTEVfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9BUFBfUlVMRV9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF91cGRhdGVfYXBwX3J1bGUoY3BoX2FwcF9ydWxlLnBhcnNlX2JtLCAmY3BoX2FwcF9ydWxlLnBhcnNlX2tleSwgY3BoX2FwcF9ydWxlLm1vZF9ibSwgJmNwaF9hcHBfcnVsZS5tb2RfdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaF9hcHBfcnVsZS5mcndkX2JtLCAmY3BoX2FwcF9ydWxlLmZyd2RfdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfQVBQX0dFVF9SVUxFOiAgICAgICAgCisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2FwcF9ydWxlLCAoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfQVBQX1JVTEVfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfZ2V0X2FwcF9ydWxlKGNwaF9hcHBfcnVsZS5wYXJzZV9ibSwgJmNwaF9hcHBfcnVsZS5wYXJzZV9rZXksICZjcGhfYXBwX3J1bGUubW9kX2JtLCAmY3BoX2FwcF9ydWxlLm1vZF92YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwaF9hcHBfcnVsZS5mcndkX2JtLCAmY3BoX2FwcF9ydWxlLmZyd2RfdmFsdWUpOworCisgICAgICAgICAgICBpZihyYyAhPSBNVl9PSykKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKworICAgICAgICAgICAgaWYoY29weV90b191c2VyKChDUEhfSU9DVExfQVBQX1JVTEVfVCopYXJnLCAmY3BoX2FwcF9ydWxlLCBzaXplb2YoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIC8qIENQSCBmbG93IG1hcHBpbmcgSU9DVEwKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfQUREX1JVTEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfYWRkX2Zsb3dfcnVsZSgmY3BoX2Zsb3dfbWFwLmZsb3dfbWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfREVMX1JVTEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfZGVsX2Zsb3dfcnVsZSgmY3BoX2Zsb3dfbWFwLmZsb3dfbWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfR0VUX1JVTEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICByYyA9IGNwaF9nZXRfZmxvd19ydWxlKCZjcGhfZmxvd19tYXAuZmxvd19tYXApOworICAgICAgICAKKyAgICAgICAgICAgIGlmKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAKKyAgICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QqKWFyZywgJmNwaF9mbG93X21hcCwgc2l6ZW9mKENQSF9JT0NUTF9GTE9XX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X3RvX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0gICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9GTE9XX0NMRUFSX1JVTEU6CisgICAgICAgICAgICByYyA9IGNwaF9jbGVhcl9mbG93X3J1bGUoKTsKKyAgICAgICAgICAgIGJyZWFrOyAKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9GTE9XX0NMRUFSX1JVTEVfQllfTUg6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfY2xlYXJfZmxvd19ydWxlX2J5X21oKGNwaF9mbG93X21hcC5mbG93X21hcC5taCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9GTE9XX1NFVF9EU0NQX01BUDoKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfZHNjcF9tYXAsIChDUEhfSU9DVExfRFNDUF9NQVBfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9EU0NQX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9zZXRfZmxvd19kc2NwX21hcCgmY3BoX2RzY3BfbWFwLmRzY3BfbWFwKTsKKyAgICAgICAgICAgIGJyZWFrOyAgCisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfRkxPV19ERUxfRFNDUF9NQVA6CisgICAgICAgICAgICByYyA9IGNwaF9kZWxfZmxvd19kc2NwX21hcCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfU0VUX1RDT05UX0xMSURfU1RBVEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX3Rjb250LCAoVUlOVDMyICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX1RDT05UX1NUQVRFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3NldF90Y29udF9zdGF0ZShjcGhfdGNvbnQudGNvbnQsIGNwaF90Y29udC5zdGF0ZSk7CisgICAgICAgICAgICBicmVhazsgIAorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX1NFVFVQOgorICAgICAgICAgICAgcmMgPSBjcGhfZGV2X3NldHVwKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICB9CisKK2lvY3RsX2VycjoKKyAgICByZXR1cm4ocmMpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdfY3BoX2Rldl9mb3BzID0gCit7CisgICAgLm9wZW4gICAgPSBjcGhfZGV2X29wZW4sCisgICAgLnJlbGVhc2UgPSBjcGhfZGV2X3JlbGVhc2UsCisgICAgLmlvY3RsICAgPSBjcGhfZGV2X2lvY3RsLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGV2X3NldHVwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHVwIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZXZfc2V0dXAoVk9JRCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgID0gTVZfT0s7CisKKyAgICAvKiBHZXQgcGFyYW1ldGVyIGZyb20gWE1MIGZpbGUgKi8KKyAgICByYyA9IGNwaF9kYl9nZXRfeG1sX3BhcmFtKCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9nZXRfeG1sX3BhcmFtIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZXZfaW5pdChWT0lEKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJFbnRlclxuIik7CisKKyAgICBnX2NwaF9taXNjX2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKyAgICBnX2NwaF9taXNjX2Rldi5uYW1lICA9IE1WX0NQSF9ERVZJQ0VfTkFNRTsKKyAgICBnX2NwaF9taXNjX2Rldi5mb3BzICA9ICZnX2NwaF9kZXZfZm9wczsKKworICAgIHJjID0gbWlzY19yZWdpc3RlcigmZ19jcGhfbWlzY19kZXYpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBtaXNjX3JlZ2lzdGVyIik7CisKKyAgICByYyA9IGNwaF9uZXRkZXZfaW5pdCgpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfbmV0ZGV2X2luaXQiKTsKKworICAgIHJjID0gY3BoX3N5c2ZzX2luaXQoKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX3N5c2ZzX2luaXQiKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIkNQSDogbWlzYyBkZXZpY2UgJXMgcmVnaXN0ZXJlZCB3aXRoIG1pbm9yOiAlZFxuIiwgTVZfQ1BIX0RFVklDRV9OQU1FLCBnX2NwaF9taXNjX2Rldi5taW5vcik7CisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2h1dGRvd24oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2h1dGRvd24gQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCBjcGhfZGV2X3NodXRkb3duKFZPSUQpCit7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworICAgIGNwaF9zeXNmc19leGl0KCk7CisKKyAgICBtaXNjX2RlcmVnaXN0ZXIoJmdfY3BoX21pc2NfZGV2KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ODQ0Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5oCkBAIC0wLDAgKzEsMTUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2Rldi5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGNoYXIgZGV2aWNlIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0RFVl9IXworI2RlZmluZSBfTVZfQ1BIX0RFVl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBNVl9DUEhfREVWSUNFX05BTUUgICJjcGgiCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9NQUdJQyAgKCdDJykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVjbGFyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2V0dXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0dXAgZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Rldl9zZXR1cChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGV2X3NodXRkb3duKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZGV2X2luaXQgKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2h1dGRvd24oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2h1dGRvd24gQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCAgIGNwaF9kZXZfc2h1dGRvd24gKFZPSUQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX0RFVl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzAxNDMxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmMKQEAgLTAsMCArMSwyMDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2Zsb3cuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBmbG93IG1vZHVsZSB0byBoYW5kbGUgdGhlIAorKiAgICAgICAgICAgICAgZmxvdyBtYXBwaW5nLCBWTEFOIG1vZGlmaWNhdGlvbiBvZiBkYXRhIHRyYWZmaWMKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDEyRGVjMjAxMQorKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4xCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBEYXRhIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIENQSF9GTE9XX1RBQkxFX1QgZ3NfZmxvd190YWJsZTsKK3N0YXRpYyBDUEhfRFNDUF9QQklUU19UIGdzX2RzY3BfbWFwX3RhYmxlOworCitzdGF0aWMgTVZfRU5VTV9FTlRSWV9UIGdfZW51bV9tYXBfb3BfdHlwZVtdID0KK3sKKyAgICB7IENQSF9WTEFOX09QX0FTSVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTSVMifSwKKyAgICB7IENQSF9WTEFOX09QX0RJU0NBUkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRJU0NBUkQifSwKKyAgICB7IENQSF9WTEFOX09QX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFERCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfRFNDUCwgICAgICAgICAgICAgICAgICAgICAiQUREX0NPUFlfRFNDUCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfT1VURVJfUEJJVCwgICAgICAgICAgICAgICAiQUREX0NPUFlfT1VURVJfUEJJVCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfSU5ORVJfUEJJVCwgICAgICAgICAgICAgICAiQUREX0NPUFlfSU5ORVJfUEJJVCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHUywgICAgICAgICAgICAgICAgICAgICAgICAiQUREXzJfVEFHUyJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHU19DT1BZX0RTQ1AsICAgICAgICAgICAgICAiQUREXzJfVEFHU19DT1BZX0RTQ1AifSwKKyAgICB7IENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9QQklULCAgICAgICAgICAgICAgIkFERF8yX1RBR1NfQ09QWV9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRU0ifSwKKyAgICB7IENQSF9WTEFOX09QX1JFTV8yX1RBR1MsICAgICAgICAgICAgICAgICAgICAgICAgIlJFTV8yX1RBR1MifSwKKyAgICB7IENQSF9WTEFOX09QX1JFUExBQ0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFUExBQ0UifSwgICAgCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX1ZJRCwgICAgICAgICAgICAgICAgICAgICAgICJSRVBMQUNFX1ZJRCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9QQklULCAgICAgICAgICAgICAgICAgICAgICAiUkVQTEFDRV9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUiwgICAgICAgICAgICJSRVBMQUNFX0lOTkVSX0FERF9PVVRFUiJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9BRERfT1VURVJfQ09QWV9QQklULCAiUkVQTEFDRV9JTk5FUl9BRERfT1VURVJfQ09QWV9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX1JFTV9PVVRFUiwgICAgICAgICAgICJSRVBMQUNFX0lOTkVSX1JFTV9PVVRFUiJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRV8yVEFHUywgICAgICAgICAgICAgICAgICAgICAiUkVQTEFDRV8yVEFHUyJ9LCAgICAKKyAgICB7IENQSF9WTEFOX09QX1JFUExBQ0VfMlRBR1NfVklELCAgICAgICAgICAgICAgICAgIlJFUExBQ0VfMlRBR1NfVklEIn0sCisgICAgeyBDUEhfVkxBTl9PUF9TV0FQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTV0FQIn0gICAgCit9OworCitzdGF0aWMgTVZfRU5VTV9BUlJBWV9UIGdfZW51bV9hcnJheV9vcF90eXBlID0KK3sKKyAgICBzaXplb2YoZ19lbnVtX21hcF9vcF90eXBlKS9zaXplb2YoZ19lbnVtX21hcF9vcF90eXBlWzBdKSwKKyAgICBnX2VudW1fbWFwX29wX3R5cGUKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9nZXRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIGZsb3cgbWFwcGluZyBydWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIGZsb3cgICAgICAgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqICAgICAgIGZvcl9wYWNrZXQgLSBXaGV0aGVyIGdldCBydWxlIGZvciBwYWNrZXQgb3IgZm9yIG5ldyBDUEggcnVsZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19kYl9nZXRfcnVsZSAoQ1BIX0ZMT1dfRU5UUllfVCAqZmxvdywgQk9PTCBmb3JfcGFja2V0KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCAqcF9mbG93X3J1bGUgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgIHJjICAgICAgICAgID0gRkFMU0U7CisgICAgdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKyAgICAvKiBUcmF2ZXJzZSBDUEggZmxvdyBydWxlIHRhYmxlICovCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfRkxPV19FTlRSWV9OVU0pICYmIChydWxlX2lkeCA8IGdzX2Zsb3dfdGFibGUucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfZmxvd19ydWxlID0gJmdzX2Zsb3dfdGFibGUuZmxvd19ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhY2tldCBvciBuZXcgcnVsZSBydWxlIGRhdGEgYmFzZSBydWxlICovCisgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgaWYgKGZvcl9wYWNrZXQgPT0gVFJVRSkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZShmbG93LCBwX2Zsb3dfcnVsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19jb21wYXJlX3J1bGVzKGZsb3csIHBfZmxvd19ydWxlKTsKKworICAgICAgICAgICAgaWYgKHJjID09IFRSVUUpCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgZmxvdy0+b3BfdHlwZSA9IHBfZmxvd19ydWxlLT5vcF90eXBlOworICAgICAgICAgICAgICAgIG1lbWNweSgmZmxvdy0+bW9kX291dGVyX3RjaSwgJnBfZmxvd19ydWxlLT5tb2Rfb3V0ZXJfdGNpLCBzaXplb2YoQ1BIX0ZMT1dfVENJX1QpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmZsb3ctPm1vZF9pbm5lcl90Y2ksICZwX2Zsb3dfcnVsZS0+bW9kX2lubmVyX3RjaSwgc2l6ZW9mKENQSF9GTE9XX1RDSV9UKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZmbG93LT5wa3RfZnJ3ZCwgICAgICAmcF9mbG93X3J1bGUtPnBrdF9mcndkLCAgICAgIHNpemVvZihDUEhfRkxPV19GUldEX1QpKTsKKworICAgICAgICAgICAgICAgIC8qIEluY3JlYXNlIGNvdW50ICovCisgICAgICAgICAgICAgICAgaWYgKGZvcl9wYWNrZXQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+Y291bnQgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5jb3VudCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19nZXRfcnVsZV9ieV92aWQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBmbG93IG1hcHBpbmcgcnVsZSBieSBWSUQsIG9ubHkgdXNlZCB0byBjb21wYXJlIHBhY2tldCBhbmQgZGIgcnVsZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBmbG93ICAgICAgIC0gRmxvdyBwYXJzaW5nIGZpZWxkIHZhbHVlcworKiAgICAgICBmb3JfcGFja2V0IC0gV2hldGhlciBnZXQgcnVsZSBmb3IgcGFja2V0IG9yIGZvciBuZXcgQ1BIIHJ1bGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfZ2V0X3J1bGVfYnlfdmlkIChDUEhfRkxPV19FTlRSWV9UICpmbG93KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCAqcF9mbG93X3J1bGUgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgIHJjICAgICAgICAgID0gRkFMU0U7CisgICAgdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKyAgICAvKiBUcmF2ZXJzZSBDUEggZmxvdyBydWxlIHRhYmxlICovCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfRkxPV19FTlRSWV9OVU0pICYmIChydWxlX2lkeCA8IGdzX2Zsb3dfdGFibGUucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfZmxvd19ydWxlID0gJmdzX2Zsb3dfdGFibGUuZmxvd19ydWxlW2lkeF07CisKKyAgICAgICAgLyogQ29tcGFyZSBwYWNrZXQgb3IgbmV3IHJ1bGUgcnVsZSBkYXRhIGJhc2UgcnVsZSAqLworICAgICAgICBpZiAocF9mbG93X3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGVfdmlkKGZsb3csIHBfZmxvd19ydWxlKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb3ctPm9wX3R5cGUgPSBwX2Zsb3dfcnVsZS0+b3BfdHlwZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmZsb3ctPm1vZF9vdXRlcl90Y2ksICZwX2Zsb3dfcnVsZS0+bW9kX291dGVyX3RjaSwgc2l6ZW9mKENQSF9GTE9XX1RDSV9UKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZmbG93LT5tb2RfaW5uZXJfdGNpLCAmcF9mbG93X3J1bGUtPm1vZF9pbm5lcl90Y2ksIHNpemVvZihDUEhfRkxPV19UQ0lfVCkpOworICAgICAgICAgICAgICAgIG1lbWNweSgmZmxvdy0+cGt0X2Zyd2QsICAgICAgJnBfZmxvd19ydWxlLT5wa3RfZnJ3ZCwgICAgICBzaXplb2YoQ1BIX0ZMT1dfRlJXRF9UKSk7CisKKyAgICAgICAgICAgICAgICAvKiBJbmNyZWFzZSBjb3VudCAqLworICAgICAgICAgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+Y291bnQgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5jb3VudCsrOworCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9GQUlMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RiX2FkZF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEFkZCBmbG93IHJ1bGUgdG8gZGF0YWJhc2UgCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2RiX2FkZF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBDUEhfRkxPV19FTlRSWV9UICpwX2Zsb3dfcnVsZSA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICAgcmMgICAgICAgICAgPSBNVl9PSzsKKyAgICB1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKworICAgIC8qIElmIHRoZSBmbG93IHRhYmxlIGlzIGZ1bGwgKi8KKyAgICBpZiAoZ3NfZmxvd190YWJsZS5ydWxlX251bSA+PSBDUEhfRkxPV19FTlRSWV9OVU0pCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCksIGZsb3cgcnVsZSB0YWJsZSBpcyBmdWxsPCVkPiBcbiIsIF9fRlVOQ1RJT05fXywgZ3NfZmxvd190YWJsZS5ydWxlX251bSk7CisgICAgICAgIHJldHVybiBNVl9GVUxMOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgY29uZmxpY3RlZCBydWxlcyAqLworICAgIGlmIChjcGhfZmxvd19kYl9nZXRfcnVsZShjcGhfZmxvdywgRkFMU0UpID09IE1WX09LKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIiVzKCksIGFscmVhZHkgaGFzIGNvbmZsaWN0IGZsb3cgcnVsZSBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICB9CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgCisgICAgLyogVHJhdmVyc2UgQ1BIIGZsb3cgcnVsZSB0YWxlICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfRkxPV19FTlRSWV9OVU07IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9mbG93X3J1bGUgPSAmZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9mbG93X3J1bGUtPnZhbGlkID09IEZBTFNFKQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaWR4ID09IENQSF9GTE9XX0VOVFJZX05VTSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmxvdyBydWxlIHRhYmxlIGlzIGZ1bGw8JWQ+IFxuIiwgX19GVU5DVElPTl9fLCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgICAgIAorICAgICAgICByZXR1cm4gTVZfRlVMTDsgICAgCisgICAgfQorCisgICAgLyogU2F2ZSB0byBkYiAqLworICAgIG1lbWNweShwX2Zsb3dfcnVsZSwgY3BoX2Zsb3csIHNpemVvZihDUEhfRkxPV19FTlRSWV9UKSk7CisgICAgcF9mbG93X3J1bGUtPnZhbGlkID0gVFJVRTsKKyAgICBwX2Zsb3dfcnVsZS0+Y291bnQgPSAwOworICAgIGdzX2Zsb3dfdGFibGUucnVsZV9udW0gKys7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiByYzsgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9kZWxfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgQ1BIIGZsb3cgbWFwcGluZyBydWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIGZsb3cgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X2RiX2RlbF9ydWxlIChDUEhfRkxPV19FTlRSWV9UICpmbG93KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCAqcF9mbG93X3J1bGUgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgIHJjICAgICAgICAgID0gTVZfT0s7CisgICAgdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisgCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7ICAgIAorICAgIC8qIFRyYXZlcnNlIENQSCBmbG93IHJ1bGUgdGFsZSAqLworICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0ZMT1dfRU5UUllfTlVNKSAmJiAocnVsZV9pZHggPCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2Zsb3dfcnVsZSA9ICZnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19jb21wYXJlX3J1bGVzKGZsb3csIHBfZmxvd19ydWxlKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIG1lbXNldChwX2Zsb3dfcnVsZSwgMCwgc2l6ZW9mKENQSF9GTE9XX0VOVFJZX1QpKTsKKyAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+dmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBnc19mbG93X3RhYmxlLnJ1bGVfbnVtLS07CisKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9jbGVhcl9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFyIENQSCBmbG93IG1hcHBpbmcgcnVsZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZSAoVk9JRCkKK3sKKyAgICBVSU5UMzIgaWR4ID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7ICAgIAorICAgIC8qIEluaXRpYWxpemVzIGZsb3cgcnVsZSAqLworICAgIG1lbXNldCgoVUlOVDggKikmZ3NfZmxvd190YWJsZSwgMCwgc2l6ZW9mKENQSF9GTE9XX1RBQkxFX1QpKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IENQSF9GTE9XX0VOVFJZX05VTTsgaWR4KyspCisgICAgICAgIGdzX2Zsb3dfdGFibGUuZmxvd19ydWxlW2lkeF0udmFsaWQgPSBGQUxTRTsKKyAgICAKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RiX2NsZWFyX3J1bGVfYnlfbWgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXIgQ1BIIGZsb3cgbWFwcGluZyBydWxlcyBieSBNSC4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgLSAgTWFydmVsbCBoZWFkZXIuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X2RiX2NsZWFyX3J1bGVfYnlfbWggKFVJTlQxNiBtaCkKK3sKKyAgICBDUEhfRkxPV19FTlRSWV9UICAgKnBfZmxvd19ydWxlID0gTlVMTDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIGlkeCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKyAgICAKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgCisgICAgLyogSW5pdGlhbGl6ZXMgZmxvdyBydWxlICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfRkxPV19FTlRSWV9OVU07IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9mbG93X3J1bGUgPSAmZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XTsKKworICAgICAgICBpZiAoKHBfZmxvd19ydWxlLT52YWxpZCA9PSBUUlVFKSAmJgorICAgICAgICAgICAgKHBfZmxvd19ydWxlLT5taCA9PSBtaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldChwX2Zsb3dfcnVsZSwgMCwgc2l6ZW9mKENQSF9GTE9XX0VOVFJZX1QpKTsKKyAgICAgICAgICAgIHBfZmxvd19ydWxlLT52YWxpZCA9IEZBTFNFOworICAgICAgICAgICAgZ3NfZmxvd190YWJsZS5ydWxlX251bS0tOworICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGJfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBmbG93IG1hcHBpbmcgZGF0YWJhc2UuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfZGJfaW5pdCAoVk9JRCkKK3sKKyAgICBVSU5UMzIgaWR4ID0gMDsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplcyBmbG93IHJ1bGUgKi8KKyAgICBtZW1zZXQoKFVJTlQ4ICopJmdzX2Zsb3dfdGFibGUsIDAsIHNpemVvZihDUEhfRkxPV19UQUJMRV9UKSk7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfRkxPV19FTlRSWV9OVU07IGlkeCsrKQorICAgICAgICBnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdLnZhbGlkID0gRkFMU0U7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2spOworCisgICAgLyogSW5pdGlhbGl6ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLworICAgIG1lbXNldCgoVUlOVDggKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihDUEhfRFNDUF9QQklUU19UKSk7CisgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd192ZXJpZnlfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBWZXJpZnkgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICB0Y2kgICAgICAgICAtIFRQSUQsIFZMQU4gSUQsIFAtYml0cyBpbmZvcm1hdGlvbi4KKyogICAgICAgcGFyc2VfZmllbGQgLSBXaGV0aGVyIHRoZSBUQ0kgaXMgZnJvbSBwYXJzaW5nIGZpZWxkLgorKiAgICAgICB0Y2lfZmllbGQgICAtIHRoZSBUQ0kgZmllbGQgbmVlZCB0byBiZSBjaGVja2VkLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBUUlVFLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MICBjcGhfZmxvd192ZXJpZnlfdGNpKENQSF9GTE9XX1RDSV9UICp0Y2ksIEJPT0wgcGFyc2VfZmllbGQsIENQSF9UQ0lfRklFTERfRSB0Y2lfZmllbGQpCit7CisgICAgVUlOVDE2IG1heF92aWQgICA9IDA7CisgICAgVUlOVDE2IG1heF9wYml0cyA9IDA7CisgICAgCisgICAgaWYgKFRSVUUgPT0gcGFyc2VfZmllbGQpIHsKKyAgICAgICAgbWF4X3ZpZCAgID0gTVZfQ1BIX1ZJRF9OT1RfQ0FSRV9WQUxVRTsKKyAgICAgICAgbWF4X3BiaXRzID0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWF4X3ZpZCAgID0gTVZfVkxBTl9JRF9NQVg7CisgICAgICAgIG1heF9wYml0cyA9IE1WX1BCSVRTX01BWDsgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKiBDaGVjayBUUElEICovCisgICAgaWYgKCh0Y2ktPnRwaWQgIT0gTVZfVFBJRF84MTAwKSAmJgorICAgICAgICAodGNpLT50cGlkICE9IE1WX1RQSURfOTEwMCkgJiYKKyAgICAgICAgKHRjaS0+dHBpZCAhPSBNVl9UUElEXzg4QTgpICYmCisgICAgICAgICgodGNpLT50cGlkICE9IE1WX0NQSF9UUElEX05PVF9DQVJFX1ZBTFVFKSAmJiAocGFyc2VfZmllbGQgPT0gVFJVRSkpKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAidHBpZFsweCV4XSBpcyBpbnZhbGlkIFxuIiwgdGNpLT50cGlkKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIFZJRCAqLworICAgIGlmICgodGNpX2ZpZWxkID09IENQSF9UQ0lfRklFTERfVklEKSB8fAorICAgICAgICAodGNpX2ZpZWxkID09IENQSF9UQ0lfRklFTERfVklEX1BCSVQpIHx8CisgICAgICAgICh0Y2lfZmllbGQgPT0gQ1BIX1RDSV9GSUVMRF9BTEwpKSB7CisgICAgaWYgKHRjaS0+dmlkID4gbWF4X3ZpZCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInZpZFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHRjaS0+dmlkLCBtYXhfdmlkKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgUC1iaXRzICovCisgICAgaWYgKCh0Y2lfZmllbGQgPT0gQ1BIX1RDSV9GSUVMRF9QQklUKSB8fAorICAgICAgICAodGNpX2ZpZWxkID09IENQSF9UQ0lfRklFTERfVklEX1BCSVQpIHx8CisgICAgICAgICh0Y2lfZmllbGQgPT0gQ1BIX1RDSV9GSUVMRF9BTEwpKSB7CisgICAgaWYgKHRjaS0+cGJpdHMgPiBtYXhfcGJpdHMpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYml0c1slZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHRjaS0+cGJpdHMsIG1heF9wYml0cyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3ZlcmlmeV9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFZlcmlmeSBmbG93IG1hcHBpbmcgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBUUlVFLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MICBjcGhfZmxvd192ZXJpZnlfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdywgQk9PTCBmdWxsKQoreworICAgIENQSF9ESVJfRSAgICAgICAgICBkaXIgICAgICAgICA9IENQSF9ESVJfVVM7CisgICAgQ1BIX0ZMT1dfUEFSU0VfRSAgIHBhcnNlX2JtICAgID0gMDsKKyAgICBDUEhfVkxBTl9PUF9UWVBFX0Ugb3BfdHlwZSAgICAgPSAwOyAgICAKKyAgICBDUEhfRkxPV19GUldEX1QgICAqcF9wa3RfZndkICAgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgICByYyAgICAgICAgICA9IFRSVUU7CisKKyAgICAvKiBHZXQgaW5wdXQgaW5mb3JtYXRpb246IFZJRCwgUC1iaXRzLi4uICovCisgICAgaWYgKGNwaF9mbG93ID09IE5VTEwpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjcGhfZmxvdyBpcyBOVUxMIFxuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IAorCisgICAgZGlyICAgICAgID0gIGNwaF9mbG93LT5kaXI7ICAgIAorICAgIHBhcnNlX2JtICA9ICBjcGhfZmxvdy0+cGFyc2VfYm07CisgICAgb3BfdHlwZSAgID0gIGNwaF9mbG93LT5vcF90eXBlOyAgICAKKyAgICBwX3BrdF9md2QgPSAmY3BoX2Zsb3ctPnBrdF9mcndkOworCisgICAgLyogQ2hlY2sgZGlyICovCisgICAgaWYgKGRpciA+PSBDUEhfRElSX05PVF9DQVJFKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgZGlyLCBDUEhfRElSX05PVF9DQVJFKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIHBhcnNlX2JtICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOKSAmJiAKKyAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiQ2Fubid0IHNldCBwYXJzZV9ibSBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTiBhbmQgQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gYXQgdGhlIHNhbWUgdGltZSBcbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgICAgIAorCisgICAgLyogQ2hlY2sgb3BfdHlwZSAqLworICAgIGlmIChvcF90eXBlID4gQ1BIX1ZMQU5fT1BfU1dBUCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIm9wX3R5cGVbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG4iLCBvcF90eXBlLCBDUEhfVkxBTl9PUF9TV0FQKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgICAvKiBDaGVjayBUQ0kgKi8KKyAgICBpZiAoKHBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4pIHx8CisgICAgICAgIChwYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX1RXT19WTEFOKSkgeworICAgICAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5wYXJzZV9vdXRlcl90Y2ksIFRSVUUsIENQSF9UQ0lfRklFTERfVklEX1BCSVQpOworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIH0KKworICAgIGlmIChwYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX1RXT19WTEFOKSB7CisgICAgICAgIHJjID0gY3BoX2Zsb3dfdmVyaWZ5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX2lubmVyX3RjaSwgVFJVRSwgQ1BIX1RDSV9GSUVMRF9WSURfUEJJVCk7CisgICAgICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChjcGhfZmxvdy0+b3BfdHlwZSkgeworICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FTSVM6CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRU06CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVNXzJfVEFHUzoKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9TV0FQOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREOgorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0U6CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9SRU1fT1VURVI6CisgICAgICAgICAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5tb2Rfb3V0ZXJfdGNpLCBGQUxTRSwgQ1BIX1RDSV9GSUVMRF9WSURfUEJJVCk7CisgICAgICAgICAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfQ09QWV9EU0NQOgorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERF9DT1BZX09VVEVSX1BCSVQ6CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfSU5ORVJfUEJJVDoKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFX1ZJRDoKKyAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfdmVyaWZ5X3RjaSgmY3BoX2Zsb3ctPm1vZF9vdXRlcl90Y2ksIEZBTFNFLCBDUEhfVENJX0ZJRUxEX1ZJRCk7CisgICAgaWYgKHJjID09IEZBTFNFKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfMl9UQUdTOgorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfMlRBR1M6CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9BRERfT1VURVI6CisgICAgICAgICAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5tb2Rfb3V0ZXJfdGNpLCBGQUxTRSwgQ1BIX1RDSV9GSUVMRF9WSURfUEJJVCk7CisgICAgICAgICAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5tb2RfaW5uZXJfdGNpLCBGQUxTRSwgQ1BIX1RDSV9GSUVMRF9WSURfUEJJVCk7CisgICAgICAgICAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfMl9UQUdTX0NPUFlfRFNDUDoKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfMl9UQUdTX0NPUFlfUEJJVDoKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFXzJUQUdTX1ZJRDoKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUl9DT1BZX1BCSVQ6CisgICAgICAgICAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5tb2Rfb3V0ZXJfdGNpLCBGQUxTRSwgQ1BIX1RDSV9GSUVMRF9WSUQpOworICAgICAgICAgICAgaWYgKHJjID09IEZBTFNFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBjcGhfZmxvd192ZXJpZnlfdGNpKCZjcGhfZmxvdy0+bW9kX2lubmVyX3RjaSwgRkFMU0UsIENQSF9UQ0lfRklFTERfVklEKTsKKyAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfUEJJVDoKKyAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfdmVyaWZ5X3RjaSgmY3BoX2Zsb3ctPm1vZF9vdXRlcl90Y2ksIEZBTFNFLCBDUEhfVENJX0ZJRUxEX1BCSVQpOworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgdGFyZ2V0IHBvcnQvcXVldWUvR0VNIHBvcnQgKi8gCisgICAgaWYgKHBfcGt0X2Z3ZC0+dHJnX3BvcnQgPiBNVl9UQ09OVF9MTElEX01BWCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInRyZ19wb3J0WyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgcF9wa3RfZndkLT50cmdfcG9ydCwgTVZfVENPTlRfTExJRF9NQVgpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHBfcGt0X2Z3ZC0+dHJnX3F1ZXVlID4gTVZfUVVFVUVfTUFYKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiU1dGIHRyZ19xdWV1ZVslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHBfcGt0X2Z3ZC0+dHJnX3F1ZXVlLCBNVl9RVUVVRV9NQVgpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgIAorCisgICAgaWYgKHBfcGt0X2Z3ZC0+dHJnX2h3Zl9xdWV1ZSA+IE1WX1FVRVVFX01BWCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIkhXRiB0cmdfcXVldWVbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG4iLCBwX3BrdF9md2QtPnRyZ19od2ZfcXVldWUsIE1WX1FVRVVFX01BWCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAgICAgIAorCisgICAgaWYgKHBfcGt0X2Z3ZC0+Z2VtX3BvcnQgPiBNVl9HRU1fUE9SVF9NQVgpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJnZW1fcG9ydFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHBfcGt0X2Z3ZC0+Z2VtX3BvcnQsIE1WX0dFTV9QT1JUX01BWCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kaXNwbGF5X3RjaSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IFRDSSB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHRjaSAgICAgICAgIC0gVENJIGZpZWxkCisqICAgICAgIHRyYWNlX2xldmVsIC0gVHJhY2UgYW5kIGRlYnVnIGxldmVsCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCAgY3BoX2Zsb3dfZGlzcGxheV90Y2koQ1BIX0ZMT1dfVENJX1QgKnRjaSwgVUlOVDMyIHRyYWNlX2xldmVsKQoreworICAgIE1WX0NQSF9QUklOVCh0cmFjZV9sZXZlbCwgCisgICAgICAgICAgICAgICAgICJUUElEWzB4JXhdLCB2aWRbJWRdLCBwLWJpdHNbJWRdXG4iLAorICAgICAgICAgICAgICAgICAoKHRjaSAhPSBOVUxMKT8gdGNpLT50cGlkOjApLAorICAgICAgICAgICAgICAgICAoKHRjaSAhPSBOVUxMKT8gdGNpLT52aWQ6MCksIAorICAgICAgICAgICAgICAgICAoKHRjaSAhPSBOVUxMKT8gdGNpLT5wYml0czowKSk7CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2FkZF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfYWRkX3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpCit7CisgICAgQk9PTCByYyA9IFRSVUU7CisKKyAgICAvKiBEaXNwbGF5IGlucHV0IENQSCBmbG93ICovCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgCisgICAgICAgICAgICAgICAgICItLS0tPlxuIGRlZmF1bHQgcnVsZVslc10sIGRpclslZF0sIHBhcnNlIGJtWyV4XSwgbWhbJWRdLCBldGggdHlwZVsweCV4XSwgb3AgdHlwZVslZF0sIHRyZyBwb3J0WyVkXSwgU1dGIHF1ZXVlWyVkXSwgSFdGIHF1ZXVlWyVkXSwgR0VNIHBvcnRbJWRdXG4iLAorICAgICAgICAgICAgICAgICAoY3BoX2Zsb3ctPmlzX2RlZmF1bHQgPT0gVFJVRSk/ICJZZXMiOiJObyIsCisgICAgICAgICAgICAgICAgIGNwaF9mbG93LT5kaXIsIGNwaF9mbG93LT5wYXJzZV9ibSwgY3BoX2Zsb3ctPm1oLCBjcGhfZmxvdy0+ZXRoX3R5cGUsIGNwaF9mbG93LT5vcF90eXBlLAorICAgICAgICAgICAgICAgICBjcGhfZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQsIGNwaF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUsIGNwaF9mbG93LT5wa3RfZnJ3ZC50cmdfaHdmX3F1ZXVlLCBjcGhfZmxvdy0+cGt0X2Zyd2QuZ2VtX3BvcnQpOworICAgIGNwaF9mbG93X2Rpc3BsYXlfdGNpKCZjcGhfZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLCBDUEhfREVCVUdfTEVWRUwpOworICAgIGNwaF9mbG93X2Rpc3BsYXlfdGNpKCZjcGhfZmxvdy0+cGFyc2VfaW5uZXJfdGNpLCBDUEhfREVCVUdfTEVWRUwpOworICAgIGNwaF9mbG93X2Rpc3BsYXlfdGNpKCZjcGhfZmxvdy0+bW9kX291dGVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPm1vZF9pbm5lcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisgICAgICAgICAgICAKKyAgICAvKiBWZXJpZnkgQ1BIIGZsb3cgcnVsZSAqLworICAgIHJjID0gY3BoX2Zsb3dfdmVyaWZ5X3J1bGUoY3BoX2Zsb3csIFRSVUUpOworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCksIHZlcmlmeSBydWxlIGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIC8qIEFkZCBmbG93IHJ1bGUgdG8gZGF0YSBiYXNlICovCisgICAgaWYgKGNwaF9mbG93X2RiX2FkZF9ydWxlKGNwaF9mbG93KSAhPSBNVl9PSykgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCksIGZhaWwgdG8gY2FsbCBjcGhfZmxvd19kYl9hZGRfcnVsZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZBSUw7CisgICAgfQorCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kZWxfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2RlbF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIC8qIERpc3BsYXkgaW5wdXQgQ1BIIGZsb3cgKi8KKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAKKyAgICAgICAgICAgICAgICAgIi0tLS0+XG4gZGVmYXVsdCBydWxlWyVzXSwgZGlyWyVkXSwgcGFyc2UgYm1bJXhdLCBtaFslZF0sIGV0aCB0eXBlWzB4JXhdLCBvcCB0eXBlWyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgKGNwaF9mbG93LT5pc19kZWZhdWx0ID09IFRSVUUpPyAiWWVzIjoiTm8iLAorICAgICAgICAgICAgICAgICBjcGhfZmxvdy0+ZGlyLCBjcGhfZmxvdy0+cGFyc2VfYm0sIGNwaF9mbG93LT5taCwgY3BoX2Zsb3ctPmV0aF90eXBlLCBjcGhfZmxvdy0+b3BfdHlwZSk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9vdXRlcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9pbm5lcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisKKyAgICAvKiBEZWxldGUgZmxvdyBydWxlIGZyb20gZGF0YSBiYXNlICovCisgICAgaWYgKGNwaF9mbG93X2RiX2RlbF9ydWxlKGNwaF9mbG93KSAhPSBNVl9PSykgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCksIGZhaWwgdG8gY2FsbCBjcGhfZmxvd19kYl9kZWxfcnVsZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZBSUw7CisgICAgfQorCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsKKworICAgIHJldHVybiBNVl9PSzsgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZ2V0X3RhZ19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldHMgZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBJbnB1dCB2aWQsIHBiaXRzLCBkaXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBvdXRwdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgCisqICAgICAgICAgICAgICAgICAgVC1DT05ULCBxdWV1ZSBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2dldF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIC8qIERpc3BsYXkgaW5wdXQgQ1BIIGZsb3cgKi8KKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLAorICAgICAgICAgICAgICAgICAiLS0tLT5cblBhY2tldCBmbG93IHJ1bGU6IGRlZmF1bHQgcnVsZVslc10sIGRpclslZF0sIHBhcnNlIGJtWyV4XSwgbWhbJWRdLCBldGggdHlwZVsweCV4XVxuIiwKKyAgICAgICAgICAgICAgICAgKGNwaF9mbG93LT5pc19kZWZhdWx0ID09IFRSVUUpPyAiWWVzIjoiTm8iLAorICAgICAgICAgICAgICAgICBjcGhfZmxvdy0+ZGlyLCBjcGhfZmxvdy0+cGFyc2VfYm0sIGNwaF9mbG93LT5taCwgY3BoX2Zsb3ctPmV0aF90eXBlKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX291dGVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX2lubmVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKworICAgIC8qIEdldCBmbG93IHJ1bGUgZnJvbSBkYXRhIGJhc2UgKi8KKyAgICBpZiAoY3BoX2Zsb3dfZGJfZ2V0X3J1bGUoY3BoX2Zsb3csIFRSVUUpICE9IE1WX09LKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICIlcygpLCBmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGJfZ2V0X3J1bGVcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY2xlYXJfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgYWxsIGZsb3cgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfY2xlYXJfcnVsZShWT0lEKQoreworICAgIC8qIERpc3BsYXkgaW5wdXQgQ1BIIGZsb3cgKi8KKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAKKyAgICAgICAgICAgICAgICAgIi0tLS0+XG4iKTsKKworICAgIC8qIENsZWFyIGZsb3cgcnVsZSBmcm9tIGRhdGEgYmFzZSAqLworICAgIGlmIChjcGhfZmxvd19kYl9jbGVhcl9ydWxlKCkgIT0gTVZfT0spIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpLCBmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZBSUw7CisgICAgfQorCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsgCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2NsZWFyX3J1bGVfYnlfbWgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXJzIGZsb3cgbWFwcGluZyBydWxlcyBieSBNSAorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgLSAgTWFydmVsbCBoZWFkZXIuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taChVSU5UMTYgbWgpCit7CisgICAgLyogRGlzcGxheSBpbnB1dCBDUEggZmxvdyAqLworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsIAorICAgICAgICAgICAgICAgICAiLS0tLT4gIG1oKCVkKVxuIiwgbWgpOworCisgICAgLyogQ2xlYXIgZmxvdyBydWxlIGZyb20gZGF0YSBiYXNlICovCisgICAgaWYgKGNwaF9mbG93X2RiX2NsZWFyX3J1bGVfYnlfbWgobWgpICE9IE1WX09LKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2NsZWFyX3J1bGVfYnlfbWhcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7IAorICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zZXRfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0cyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgZHNjcF9tYXAgIC0gRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfc2V0X2RzY3BfbWFwKENQSF9EU0NQX1BCSVRTX1QgKmRzY3BfbWFwKQoreworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsIAorICAgICAgICAgICAgICAgICAiLS0tLT4gaW5fdXNlWyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgKChkc2NwX21hcCE9IE5VTEwpPyBkc2NwX21hcC0+aW5fdXNlOjApKTsKKworICAgIGlmIChkc2NwX21hcCA9PSBOVUxMKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiSW5wdXQgZHNjcF9tYXAgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIC8qIENhc2UgMTogdG8gZW5hYmxlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KKyAgICBpZiAoZHNjcF9tYXAtPmluX3VzZSAhPSAwKSB7CisgICAgICAgIG1lbWNweSgmZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbMF0sICZkc2NwX21hcC0+cGJpdHNbMF0sIHNpemVvZihnc19kc2NwX21hcF90YWJsZS5wYml0cykpOworICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAxOworICAgIAorICAgIH0KKyAgICAvKiBDYXNlIDI6IHRvIGRpc2FibGUgRFNDUCB0byBQLWJpdHMgbWFwcGluZyAqLworICAgIGVsc2UgeworICAgICAgICBtZW1zZXQoKFVJTlQ4ICopJmdzX2RzY3BfbWFwX3RhYmxlLCAwLCBzaXplb2YoZ3NfZHNjcF9tYXBfdGFibGUpKTsKKyAgICAgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKKyAgICB9CisgICAgCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsKKworICAgIHJldHVybiBNVl9PSzsgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kZWxfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfZGVsX2RzY3BfbWFwKFZPSUQpCit7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIi0tLS0+XG4iKTsKKworICAgIC8qIENsZWFyIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KKyAgICBtZW1zZXQoKFVJTlQ4ICopJmdzX2RzY3BfbWFwX3RhYmxlLCAwLCBzaXplb2YoZ3NfZHNjcF9tYXBfdGFibGUpKTsKKyAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAwOworICAgIAorICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfYWRkX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIG9uZSBWTEFOIHRhZyBiZWhpbmQgb2Ygc291cmNlIE1BQyBhZGRyZXNzLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldAorKiAgICAgICB0cGlkICAgLSBUeXBlIG9mIFZMQU4gSUQKKyogICAgICAgdmlkICAgIC0gVkxBTiB0byBiZSBhZGRlZAorKiAgICAgICBwYml0cyAgLSBQLWJpdHMgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19hZGRfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgdHBpZCwgVUlOVDE2IHZpZCwgVUlOVDggcGJpdHMpCit7CisgICAgVUlOVDggICpwX25ldyAgPSBOVUxMOworICAgIFVJTlQxNiAqcF92bGFuID0gTlVMTDsKKyAgICBVSU5UMzIgIGxlbiAgICA9IDA7CisKKyAgICBwX25ldyA9IHBfZGF0YSAtIE1WX1ZMQU5fSExFTjsKKworICAgIGlmIChUUlVFID09IG1oKQorICAgICAgICBsZW4gPSBNVl9FVEhfTUhfU0laRSArIE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworICAgIGVsc2UKKyAgICAgICAgbGVuID0gTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisKKyAgICBtZW1tb3ZlKHBfbmV3LCBwX2RhdGEsIGxlbik7CisKKyAgICBwX3ZsYW4gPSAoVUlOVDE2ICopKHBfbmV3ICArIGxlbik7CisgICAgCisgICAgLyogU2V0IFZMQU4gVHlwZSAqLworICAgICpwX3ZsYW4gPSBodG9ucyh0cGlkKTsKKyAgICBwX3ZsYW4rKzsKKworICAgIC8qIFNldCBWSUQgKyBwcmlvcml0eSAqLyAgICAKKyAgICAqcF92bGFuID0gaHRvbnMoKHZpZCAmIE1WX1ZMQU5fSURfTUFTSykgfCAoKHBiaXRzICYgTVZfUEJJVFNfTUFTSykgPDwgTVZfUEJJVFNfU0hJRlQpKTsKKworICAgIHJldHVybiAtTVZfVkxBTl9ITEVOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RlbF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBvbmUgVkxBTiB0YWcgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfZGVsX3ZsYW4oQk9PTCBtaCwgVUlOVDggKnBfZGF0YSkKK3sKKyAgICBVSU5UOCAgKnBfbmV3ICA9IE5VTEw7CisgICAgVUlOVDMyICBsZW4gICAgPSAwOworCisgICAgcF9uZXcgPSBwX2RhdGEgKyBNVl9WTEFOX0hMRU47CisKKyAgICBpZiAoVFJVRSA9PSBtaCkKKyAgICAgICAgbGVuID0gTVZfRVRIX01IX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKyAgICBlbHNlCisgICAgICAgIGxlbiA9IE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworCisgICAgbWVtbW92ZShwX25ldywgcF9kYXRhLCBsZW4pOworCisgICAgcmV0dXJuIE1WX1ZMQU5fSExFTjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zdHJpcF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgVkxBTiB0YWdzIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0LgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X3N0cmlwX3ZsYW4oQk9PTCBtaCwgVUlOVDggKnBfZGF0YSkKK3sKKyAgICBJTlQzMiAgb2Zmc2V0ICAgICAgID0gMDsKKyAgICBJTlQzMiAgdG90YWxfb2Zmc2V0ID0gMDsgICAgCisgICAgVUlOVDE2IGV0aF90eXBlICAgICA9IDA7CisgICAgVUlOVDggKnBfZmllbGQgICAgICA9IE5VTEw7CisgICAgVUlOVDMyIGxlbiAgICAgICAgICA9IDA7CisKKyAgICBpZiAoVFJVRSA9PSBtaCkKKyAgICAgICAgbGVuID0gTVZfRVRIX01IX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKyAgICBlbHNlCisgICAgICAgIGxlbiA9IE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworCisgICAgcF9maWVsZCAgPSBwX2RhdGEgKyBsZW47CisgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworCisgICAgd2hpbGUgKGV0aF90eXBlID09IE1WX1RQSURfODEwMCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzg4QTggfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF85MTAwKSAKKyAgICB7CisgICAgICAgIG9mZnNldCAgID0gY3BoX2Zsb3dfZGVsX3ZsYW4obWgsIHBfZGF0YStvZmZzZXQpOworICAgICAgICAKKyAgICAgICAgcF9maWVsZCArPSBvZmZzZXQ7CisgICAgICAgIGV0aF90eXBlID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICAgICAgdG90YWxfb2Zmc2V0ICs9IG9mZnNldDsKKyAgICB9ICAgIAorCisgICAgcmV0dXJuIHRvdGFsX29mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19yZXBsYWNlX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUmVwbGFjZSBvbmUgVkxBTiB0YWcgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgdHBpZCAgIC0gVHlwZSBvZiBWTEFOIElECisqICAgICAgIHZpZCAgICAtIFZMQU4gdG8gYmUgYWRkZWQKKyogICAgICAgcGJpdHMgIC0gUC1iaXRzIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfcmVwbGFjZV92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiB0cGlkLCBVSU5UMTYgdmlkLCBVSU5UOCBwYml0cykKK3sKKyAgICBVSU5UMTYgKnBfdmxhbiA9IE5VTEw7CisgICAgVUlOVDMyICBsZW4gICAgPSAwOworCisgICAgaWYgKFRSVUUgPT0gbWgpCisgICAgICAgIGxlbiA9IE1WX0VUSF9NSF9TSVpFICsgTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisgICAgZWxzZQorICAgICAgICBsZW4gPSBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKworICAgIHBfdmxhbiA9IChVSU5UMTYgKikocF9kYXRhICsgbGVuKTsKKyAgICAKKyAgICAvKiBTZXQgVkxBTiBUeXBlICovCisgICAgKnBfdmxhbiA9IGh0b25zKHRwaWQpOworICAgIHBfdmxhbisrOworICAgIAorICAgIC8qIFNldCBWSUQgKyBwcmlvcml0eSAqLworICAgICpwX3ZsYW4gPSBodG9ucygodmlkICYgTVZfVkxBTl9JRF9NQVNLKSB8ICgocGJpdHMgJiBNVl9QQklUU19NQVNLKSA8PCBNVl9QQklUU19TSElGVCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfc3dhcF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFN3YXAgYmV0d2VlbiB0d28gVkxBTiB0YWcuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfc3dhcF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEpCit7CisgICAgVUlOVDMyICpwX3RjaSA9IE5VTEw7CisgICAgVUlOVDMyICB0Y2kxICA9IDA7CisgICAgVUlOVDMyICB0Y2kyICA9IDA7CisgICAgVUlOVDMyICBsZW4gICAgPSAwOworCisgICAgaWYgKFRSVUUgPT0gbWgpCisgICAgICAgIGxlbiA9IE1WX0VUSF9NSF9TSVpFICsgTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisgICAgZWxzZQorICAgICAgICBsZW4gPSBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKworICAgIHBfdGNpID0gKFVJTlQzMiAqKShwX2RhdGEgKyBsZW4pOworICAgIAorICAgIC8qIFNhdmUgZmlyc3QgVENJICovCisgICAgdGNpMSA9IG50b2hsKCpwX3RjaSk7CisgICAgcF90Y2krKzsKKworICAgIC8qIFNhdmUgc2Vjb25kIFRDSSBhbmQgcmVwbGFjZSBpdCB3LyBmaXJzdCBUQ0kgKi8KKyAgICB0Y2kyICAgPSBudG9obCgqcF90Y2kpOworICAgICpwX3RjaSA9IGh0b25sKHRjaTEpOworCisgICAgLyogR28gYmFjayB0byByZXBsY2UgZmlyc3QgVENJICovCisgICAgcF90Y2ktLTsgICAgCisgICAgKnBfdGNpID0gaHRvbmwodGNpMik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfcGFyc2VfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFBhcnNlIHBhY2tldCBhbmQgb3V0cHV0IGZsb3cgaW5mb3JtYXRpb24uCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAtIFNvdXJjZSBHTUFDIHBvcnQKKyogICAgICAgZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIHJ4ICAgLSBXaGV0aGVyIGluIFJYIGRpcgorKiAgICAgICBtaCAgIC0gV2hldGhlciBoYXMgTWFydmVsbCBoZWFkZXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgZmxvdyAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfcGFyc2VfcGFja2V0IChJTlQzMiBwb3J0LCBVSU5UOCAqZGF0YSwgQk9PTCByeCwgQk9PTCBtaCwgQ1BIX0ZMT1dfRU5UUllfVCAqZmxvdykKK3sKKyAgICBVSU5UMTYgICAgICBldGhfdHlwZSA9IDA7IAorICAgIFVJTlQ4ICAgICAgKnBfZmllbGQgID0gTlVMTDsKKyAgICBVSU5UOCAgICAgICBwcm90byAgICA9IDA7CisgICAgTVZfU1RBVFVTICAgcmMgICAgICAgPSBNVl9PSzsKKyAgICBzdHJ1Y3QgaXB2NmhkciAgICAgICAgICpwX2lwdjZfaGRyICAgPSBOVUxMOworICAgIHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKnBfaG9wb3B0X2hkciA9IE5VTEw7CisgICAgc3RydWN0IGljbXA2aGRyICAgICAgICAqcF9pY21wX2hkciAgID0gTlVMTDsgICAgIAorCisgICAgbWVtc2V0KGZsb3csIDAsIHNpemVvZihDUEhfRkxPV19FTlRSWV9UKSk7CisgICAgCisgICAgLyogUGFyc2UgRGlyZWN0aW9uICovCisgICAgZmxvdy0+ZGlyID0gY3BoX2FwcF9wYXJzZV9kaXIocG9ydCwgcngpOworICAgIGlmKGZsb3ctPmRpciA9PSBDUEhfRElSX0lOVkFMSUQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gaXMgaW52YWxpZCBcbiIsIGZsb3ctPmRpcik7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKFRSVUUgPT0gbWgpCisgICAgeworICAgICAgICAvKiBQYXJzZSBNYXJ2ZWxsIGhlYWRlciAqLworICAgICAgICBpZiAoZmxvdy0+ZGlyID09IENQSF9ESVJfVVMpCisgICAgICAgICAgICBmbG93LT5taCA9IChudG9ocygqKFVJTlQxNiAqKWRhdGEpICYgTVZfVkFMSURfTUhfTUFTSyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZsb3ctPm1oID0gKG50b2hzKCooVUlOVDE2ICopZGF0YSkgJiBNVl9WQUxJRF9HSF9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX01IOworICAgICAgICBwX2ZpZWxkICA9IGRhdGEgKyBNVl9FVEhfTUhfU0laRSArIEVUSF9BTEVOICsgRVRIX0FMRU47ICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBfZmllbGQgID0gZGF0YSArIEVUSF9BTEVOICsgRVRIX0FMRU47IAorICAgIH0KKworICAgIC8qIFBhcnNlIFZMQU4gdGFnICovCisgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgIGlmIChldGhfdHlwZSA9PSBNVl9UUElEXzgxMDAgfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF84OEE4IHx8IGV0aF90eXBlID09IE1WX1RQSURfOTEwMCkgCisgICAgeworICAgICAgICBmbG93LT5wYXJzZV9ibSB8PSBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTjsKKyAgICAgICAgCisgICAgICAgIGZsb3ctPnBhcnNlX291dGVyX3RjaS50cGlkID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICAgICAgcF9maWVsZCArPSBNVl9DUEhfVFBJRF9MRU47CisKKyAgICAgICAgZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCAgID0gKG50b2hzKCooVUlOVDE2ICopcF9maWVsZCkgJiBNVl9WTEFOX0lEX01BU0spOworICAgICAgICBmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPSAoKG50b2hzKCooVUlOVDE2ICopcF9maWVsZCkgPj4gTVZfUEJJVFNfU0hJRlQpJiBNVl9QQklUU19NQVNLKTsKKyAgICAgICAgCisgICAgICAgIHBfZmllbGQgKz0gTVZfQ1BIX1ZMQU5fVEFHX0xFTjsKKworICAgICAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgICAgIGlmIChldGhfdHlwZSA9PSBNVl9UUElEXzgxMDAgfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF84OEE4IHx8IGV0aF90eXBlID09IE1WX1RQSURfOTEwMCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb3ctPnBhcnNlX2JtICY9IH5DUEhfRkxPV19QQVJTRV9FWFRfVkxBTjsKKyAgICAgICAgICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX1RXT19WTEFOOworICAgICAgICAgICAgCisgICAgICAgICAgICBmbG93LT5wYXJzZV9pbm5lcl90Y2kudHBpZCA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgICAgICAgICBwX2ZpZWxkICs9IE1WX0NQSF9UUElEX0xFTjsKKworICAgICAgICAgICAgZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnZpZCAgID0gKG50b2hzKCooVUlOVDE2ICopcF9maWVsZCkgJiBNVl9WTEFOX0lEX01BU0spOworICAgICAgICAgICAgZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID0gKChudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpID4+IE1WX1BCSVRTX1NISUZUKSYgTVZfUEJJVFNfTUFTSyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBfZmllbGQgKz0gTVZfQ1BIX1ZMQU5fVEFHX0xFTjsKKworICAgICAgICAgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgICAgICB9ICAgICAgCisgICAgfSAgICAKKyAgICB3aGlsZSAoZXRoX3R5cGUgPT0gTVZfVFBJRF84MTAwIHx8IGV0aF90eXBlID09IE1WX1RQSURfODhBOCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzkxMDApIHsKKyAgICAgICAgcF9maWVsZCArPSBWTEFOX0hMRU47CisgICAgICAgIGV0aF90eXBlID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICB9CisgICAgLyogUGFyc2UgRXRoIHR5cGUgKi8gICAgCisgICAgZmxvdy0+ZXRoX3R5cGUgPSBldGhfdHlwZTsKKyAgICBmbG93LT5wYXJzZV9ibSB8PSBDUEhfRkxPV19QQVJTRV9FVEhfVFlQRTsKKworICAgIC8qIFBhcnNlIE11bHRpY2FzdCBwcm90b2NvbCAqLworICAgIGlmIChNVl9DUEhfRVRIX1RZUEVfSVBWNCA9PSBmbG93LT5ldGhfdHlwZSkgeworICAgICAgICBwX2ZpZWxkICs9IE1WX0NQSF9FVEhfVFlQRV9MRU47CisgICAgICAgIHBfZmllbGQgKz0gTVZfSVBWNF9QUk9UT19PRkZTRVQ7CisgICAgICAgIHByb3RvID0gKihVSU5UOCAqKXBfZmllbGQ7CisKKyAgICAgICAgaWYgKElQUFJPVE9fSUdNUCA9PSBwcm90bykKKyAgICAgICAgICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX01DX1BST1RPOworICAgIH0KKyAgICBlbHNlIGlmIChNVl9DUEhfRVRIX1RZUEVfSVBWNiA9PSBmbG93LT5ldGhfdHlwZSkgeworICAgICAgICBwX2lwdjZfaGRyID0gKHN0cnVjdCBpcHY2aGRyICopKHBfZmllbGQgKyBNVl9DUEhfRVRIX1RZUEVfTEVOKTsKKworICAgICAgICBpZiAoTkVYVEhEUl9IT1AgPT0gcF9pcHY2X2hkci0+bmV4dGhkcikgeworICAgICAgICAgICAgcF9ob3BvcHRfaGRyID0gKHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKikoKFVJTlQ4ICopcF9pcHY2X2hkciArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCisgICAgICAgICAgICBpZiAoSVBQUk9UT19JQ01QVjYgPT0gcF9ob3BvcHRfaGRyLT5uZXh0aGRyKSB7CisgICAgICAgICAgICAgICAgcF9pY21wX2hkciA9ICAoc3RydWN0IGljbXA2aGRyICopKChVSU5UOCAqKXBfaG9wb3B0X2hkciArIGlwdjZfb3B0bGVuKHBfaG9wb3B0X2hkcikpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAocF9pY21wX2hkci0+aWNtcDZfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBWNl9NR01fUVVFUlk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9SRURVQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUFY2X01MRDJfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+cGFyc2VfYm0gfD0gQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jb21wYXJlX3J1bGVzKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENvbXBhcmUgdHdvIGZsb3cgcnVsZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfcnVsZSAgLSBUaGUgcGFyc2luZyBmaWVsZCB2YWx1ZXMgY29tZSBmcm9tIHRoZSBwYWNrZXRzCisqICAgICAgIGRiX3J1bGUgICAgIC0gVGhlIGZsb3cgcnVsZSBzdG9yZWQgaW4gZmxvdyBkYXRhYmFzZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBJbiBjYXNlIHNhbWUsIHJldHVybiBUUlVFLCAKKyogICAgICAgSW4gY2FzZSBkaWZmZXJlbnQsIHJldHVybiBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIGNwaF9mbG93X2NvbXBhcmVfcnVsZXMgKENQSF9GTE9XX0VOVFJZX1QgKnBhcnNlX3J1bGUsIENQSF9GTE9XX0VOVFJZX1QgKmRiX3J1bGUpCit7CisgICAgLyogQ2hlY2sgZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX3J1bGUtPmRpciAhPSBkYl9ydWxlLT5kaXIpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIENoZWNrIHBhcnNlX2JtICovCisgICAgaWYgKHBhcnNlX3J1bGUtPnBhcnNlX2JtICE9IGRiX3J1bGUtPnBhcnNlX2JtKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorCisgICAgLyogQ2hlY2sgTUggaWYgbmVlZGVkICovCisgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfTUgpCisgICAgeworICAgICAgICBpZiAocGFyc2VfcnVsZS0+bWggIT0gZGJfcnVsZS0+bWgpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgaXQgaXMgZGVmYXVsdCBydWxlICovCisgICAgaWYgKHBhcnNlX3J1bGUtPmlzX2RlZmF1bHQgIT0gZGJfcnVsZS0+aXNfZGVmYXVsdCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAorICAgIC8qIENoZWNrIFZMQU4gSUQgKi8KKyAgICBpZiAocGFyc2VfcnVsZS0+aXNfZGVmYXVsdCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTikgfHwgIAorICAgICAgICAgICAgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQgIT0gZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKHBhcnNlX3J1bGUtPnBhcnNlX291dGVyX3RjaS5wYml0cyAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kucGJpdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX1RXT19WTEFOKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnRwaWQgIT0gZGJfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnRwaWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKHBhcnNlX3J1bGUtPnBhcnNlX2lubmVyX3RjaS5wYml0cyAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kucGJpdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIEV0aGVybmV0IHR5cGUgaWYgbmVlZGVkICovCisgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfRVRIX1RZUEUpCisgICAgeworICAgICAgICBpZiAocGFyc2VfcnVsZS0+ZXRoX3R5cGUgIT0gZGJfcnVsZS0+ZXRoX3R5cGUpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ29tcGFyZSBmbG93IHBhY2tldCBhbmQgcnVsZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwYWNrZXRfcnVsZSAtIFRoZSBwYXJzaW5nIGZpZWxkIHZhbHVlcyBjb21lIGZyb20gdGhlIHBhY2tldHMKKyogICAgICAgZGJfcnVsZSAgICAgLSBUaGUgZmxvdyBydWxlIHN0b3JlZCBpbiBmbG93IGRhdGFiYXNlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2Ugc2FtZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGRpZmZlcmVudCwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGUgKENQSF9GTE9XX0VOVFJZX1QgKnBhY2tldF9ydWxlLCBDUEhfRkxPV19FTlRSWV9UICpkYl9ydWxlKQoreworICAgIC8qIENoZWNrIGRpcmVjdGlvbiAqLworICAgIGlmICgocGFja2V0X3J1bGUtPmRpciAhPSBkYl9ydWxlLT5kaXIpICYmCisgICAgICAgIChkYl9ydWxlLT5kaXIgIT0gQ1BIX0RJUl9OT1RfQ0FSRSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIENoZWNrIE11bHRpY2FzdCBwcm90b2NvbCAqLworICAgICBpZiAoKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE8pICE9IChwYWNrZXRfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NQ19QUk9UTykpCisgICAgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIE1IIGlmIG5lZWRlZCAqLworICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NSCkgJiYKKyAgICAgICAgKHBhY2tldF9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX01IKSApCisgICAgeworICAgICAgICBpZiAocGFja2V0X3J1bGUtPm1oICE9IGRiX3J1bGUtPm1oKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIGl0IGlzIGRlZmF1bHQgcnVsZSAqLworICAgIGlmIChwYWNrZXRfcnVsZS0+aXNfZGVmYXVsdCAhPSBkYl9ydWxlLT5pc19kZWZhdWx0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgCisgICAgLyogQ2hlY2sgVkxBTiBJRCAqLworICAgIGlmICgocGFja2V0X3J1bGUtPnBhcnNlX2JtICYgKENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOIHwgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKQorICAgICAgICAgIT0gKGRiX3J1bGUtPnBhcnNlX2JtICYgKENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOIHwgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChwYWNrZXRfcnVsZS0+aXNfZGVmYXVsdCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTikgfHwgIAorICAgICAgICAgICAgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCkgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQgIT0gTVZfQ1BIX1RQSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkICE9IE1WX0NQSF9WSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICE9IGRiX3J1bGUtPnBhcnNlX291dGVyX3RjaS5wYml0cykgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICE9IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX1RXT19WTEFOKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCkgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnRwaWQgIT0gTVZfQ1BIX1RQSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkICE9IE1WX0NQSF9WSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzICE9IGRiX3J1bGUtPnBhcnNlX2lubmVyX3RjaS5wYml0cykgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzICE9IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIEV0aGVybmV0IHR5cGUgaWYgbmVlZGVkICovCisgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfRVRIX1RZUEUpCisgICAgeworICAgICAgICBpZiAocGFja2V0X3J1bGUtPmV0aF90eXBlICE9IGRiX3J1bGUtPmV0aF90eXBlKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2NvbXBhcmVfcGFja2V0X2FuZF9ydWxlX3ZpZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJlIGZsb3cgcGFja2V0IGFuZCBydWxlIHcvIG9ubHkgVklELgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhY2tldF9ydWxlIC0gVGhlIHBhcnNpbmcgZmllbGQgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFja2V0cworKiAgICAgICBkYl9ydWxlICAgICAtIFRoZSBmbG93IHJ1bGUgc3RvcmVkIGluIGZsb3cgZGF0YWJhc2UKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZV92aWQgKENQSF9GTE9XX0VOVFJZX1QgKnBhY2tldF9ydWxlLCBDUEhfRkxPV19FTlRSWV9UICpkYl9ydWxlKQoreworICAgIC8qIENoZWNrIGRpcmVjdGlvbiAqLworICAgIGlmICgocGFja2V0X3J1bGUtPmRpciAhPSBkYl9ydWxlLT5kaXIpICYmCisgICAgICAgIChkYl9ydWxlLT5kaXIgIT0gQ1BIX0RJUl9OT1RfQ0FSRSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIENoZWNrIE11bHRpY2FzdCBwcm90b2NvbCAqLworICAgICBpZiAoKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE8pICE9IChwYWNrZXRfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NQ19QUk9UTykpCisgICAgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIE1IIGlmIG5lZWRlZCAqLworICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NSCkgJiYKKyAgICAgICAgKHBhY2tldF9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX01IKSApCisgICAgeworICAgICAgICBpZiAocGFja2V0X3J1bGUtPm1oICE9IGRiX3J1bGUtPm1oKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIGl0IGlzIGRlZmF1bHQgcnVsZSAqLworICAgIGlmIChwYWNrZXRfcnVsZS0+aXNfZGVmYXVsdCAhPSBkYl9ydWxlLT5pc19kZWZhdWx0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBDaGVjayBWTEFOIElEICovCisgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2VfYm0gJiAoQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gfCBDUEhfRkxPV19QQVJTRV9UV09fVkxBTikpCisgICAgICAgICAhPSAoZGJfcnVsZS0+cGFyc2VfYm0gJiAoQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gfCBDUEhfRkxPV19QQVJTRV9UV09fVkxBTikpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKHBhY2tldF9ydWxlLT5pc19kZWZhdWx0ID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgaWYgKChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOKSB8fAorICAgICAgICAgICAgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQgIT0gTVZfQ1BIX1RQSURfTk9UX0NBUkVfVkFMVUUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAoZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICE9IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgIGlmICgocGFja2V0X3J1bGUtPnBhcnNlX291dGVyX3RjaS52aWQgIT0gZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCkgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCAhPSBNVl9DUEhfVklEX05PVF9DQVJFX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCAhPSBNVl9DUEhfVFBJRF9OT1RfQ0FSRV9WQUxVRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgIGlmIChkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kucGJpdHMgIT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkICE9IE1WX0NQSF9WSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayBFdGhlcm5ldCB0eXBlIGlmIG5lZWRlZCAqLworICAgIGlmIChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX0VUSF9UWVBFKQorICAgIHsKKyAgICAgICAgaWYgKHBhY2tldF9ydWxlLT5ldGhfdHlwZSAhPSBkYl9ydWxlLT5ldGhfdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19tb2RfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBwYWNrZXQgYWNjb3JkaW5nIHRvIGZsb3cgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIHNrYiAgICAgICAgLSBQb2ludGVyIHRvIHBhY2tldAorKiAgICAgICBtaCAgICAgICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIGZsb3cgICAgICAgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqICAgICAgIG91dF9vZmZzZXQgLSBPZmZzZXQgb2YgcGFja2V0CisqICAgICAgIHJ4ICAgICAgICAgLSBXaGV0aGVyIFJYIG9yIFRYCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X21vZF9wYWNrZXQgKHN0cnVjdCBza19idWZmICpza2IsICBCT09MIG1oLCBDUEhfRkxPV19FTlRSWV9UICpmbG93LCBJTlQzMiAqb3V0X29mZnNldCkKK3sKKyAgICBJTlQzMiAgb2Zmc2V0ID0gMDsKKyAgICBVSU5UMTYgdHBpZCAgID0gMDsgICAgCisgICAgVUlOVDE2IHZpZCAgICA9IDA7CisgICAgVUlOVDggIHBiaXRzICA9IDA7CisgICAgQk9PTCAgIHJjICAgICA9IE1WX09LOworCisgICAgc3dpdGNoIChmbG93LT5vcF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BU0lTOgorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfRElTQ0FSRDoKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERDoKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfRFNDUDoKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERF9DT1BZX09VVEVSX1BCSVQ6CisgICAgICAgICAgICB0cGlkICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfQ09QWV9JTk5FUl9QQklUOgorICAgICAgICAgICAgdHBpZCAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgcGJpdHMgID0gKGZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0czsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgcGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHUzoKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgID0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7ICAgCisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBmbG93LT5tb2RfaW5uZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9EU0NQOgorICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7ICAgCisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2RfaW5uZXJfdGNpLnZpZCwgZmxvdy0+bW9kX2lubmVyX3RjaS5wYml0cyk7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfMl9UQUdTX0NPUFlfUEJJVDoKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIHBiaXRzICA9IChmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHM7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsgCisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIHBiaXRzKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFTToKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2RlbF92bGFuKG1oLCBza2ItPmRhdGEpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVNXzJfVEFHUzoKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19kZWxfdmxhbihtaCwgc2tiLT5kYXRhKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19kZWxfdmxhbihtaCwgc2tiLT5kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0U6CisgICAgICAgICAgICB0cGlkICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9WSUQ6CisgICAgICAgICAgICB0cGlkID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworCisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFX1BCSVQ6CisgICAgICAgICAgICB0cGlkID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworCisgICAgICAgICAgICB2aWQgICAgPSAoZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCA9PSBNVl9DUEhfVklEX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kudmlkOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUjoKKyAgICAgICAgICAgIHRwaWQgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIGZsb3ctPm1vZF9pbm5lcl90Y2kucGJpdHMpOworICAgICAgICAgICAgdHBpZCA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfQUREX09VVEVSX0NPUFlfUEJJVDoKKyAgICAgICAgICAgIHRwaWQgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICB0cGlkID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgcGJpdHMgICA9IChmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHM7ICAgICAgICAgICAgCisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfUkVNX09VVEVSOgorICAgICAgICAgICAgb2Zmc2V0ICA9IGNwaF9mbG93X2RlbF92bGFuKG1oLCBza2ItPmRhdGEpOworICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfMlRBR1M6CisgICAgICAgICAgICB0cGlkICAgID0gZmxvdy0+bW9kX2lubmVyX3RjaS50cGlkID8gZmxvdy0+bW9kX2lubmVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ICA9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBmbG93LT5tb2RfaW5uZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19zd2FwX3ZsYW4obWgsIHNrYi0+ZGF0YSk7CisgICAgICAgICAgICB0cGlkICAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFXzJUQUdTX1ZJRDoKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgID0gKGZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0czsKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2RfaW5uZXJfdGNpLnZpZCwgcGJpdHMpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X3N3YXBfdmxhbihtaCwgc2tiLT5kYXRhKTsKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgID0gKGZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0czsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1NXQVA6CisgICAgICAgICAgICBvZmZzZXQgID0gY3BoX2Zsb3dfc3dhcF92bGFuKG1oLCBza2ItPmRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTYXZlIFNLQiBkYXRhIG9mZnNldCAqLworICAgIHNrYi0+ZGF0YSAgKz0gb2Zmc2V0OworICAgIHNrYi0+bGVuICAgLT0gb2Zmc2V0OworICAgICpvdXRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19tb2RfZnJ3ZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgZm9yd2FyZGluZyBwYXJhbWV0ZXIgb2YgdHJhbnNtaXRpbmcgcGFja2V0IGFjY29yZGluZyB0byBmbG93IHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBmbG93ICAgICAgICAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X21vZF9mcndkIChDUEhfRkxPV19FTlRSWV9UICpmbG93LCBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworICAgIAorICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQ7CisgICAgdHhfc3BlY19vdXQtPnR4cSAgICAgPSBmbG93LT5wa3RfZnJ3ZC50cmdfcXVldWU7CisgICAgaWYgKChGQUxTRSA9PSBjcGhfZGJfZ2V0X3Rjb250X3N0YXRlKHR4X3NwZWNfb3V0LT50eHApKSB8fAorICAgICAgICAoZmxvdy0+b3BfdHlwZSA9PSBDUEhfVkxBTl9PUF9ESVNDQVJEKSkKKyAgICAgICAgdHhfc3BlY19vdXQtPnR4cSA9IE1WX0lOVkFMSURfUVVFVUVfTlVNOworICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChmbG93LT5wa3RfZnJ3ZC5nZW1fcG9ydCA8PCA4KXwweDAwMTApOworICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKKyAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IE1WX0VUSF9GX01IOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3NlbmRfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VpdmVkIGFwcGxpY2F0aW9uIHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgZGV2X291dCAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHBrdCAgICAgICAgIC0gTWFydmVsbCBwYWNrZXQgaW5mb3JtYXRpb24KKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfb3V0LCBzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKK3sKKworCisjaWYgMAorICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBNVl9FVEhfUFJJVihkZXZfb3V0KTsKKyAgICBpbnQgZnJhZ3MgPSAwOworICAgIGJvb2wgdHhfc3BlY19yZWFkeSA9IGZhbHNlOworICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyB0eF9zcGVjOworICAgIHUzMiB0eF9jbWQ7CisgICAgc3RydWN0IHR4X3F1ZXVlICp0eHFfY3RybCA9IE5VTEw7CisgICAgc3RydWN0IG5ldGFfdHhfZGVzYyAqdHhfZGVzYzsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgKnNrYjsKKworCisgICAgc2tiID0gKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKTsKKworICAgIHJlYWRfbG9jaygmcHAtPnJ3bG9jayk7CisKKyAgICBpZiAoIShuZXRpZl9ydW5uaW5nKGRldl9vdXQpKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIiFuZXRpZl9ydW5uaW5nKCkgaW4gJXNcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogR2V0IFRYUSAod2l0aG91dCBCTSkgdG8gc2VuZCBwYWNrZXQgZ2VuZXJhdGVkIGJ5IExpbnV4ICovCisgICAgaWYgKHR4X3NwZWNfcmVhZHkgPT0gZmFsc2UpIHsKKyAgICAgICAgdHhfc3BlYy50eHAgICAgPSB0eF9zcGVjX291dC0+dHhwOworICAgICAgICB0eF9zcGVjLnR4cSAgICA9IHR4X3NwZWNfb3V0LT50eHE7CisgICAgICAgIHR4X3NwZWMuaHdfY21kID0gdHhfc3BlY19vdXQtPmh3X2NtZDsKKyAgICAgICAgdHhfc3BlYy5mbGFncyAgPSB0eF9zcGVjX291dC0+ZmxhZ3M7CisgICAgfQorCisgICAgdHhxX2N0cmwgPSAmcHAtPnR4cV9jdHJsW3R4X3NwZWMudHhwICogQ09ORklHX01WX0VUSF9UWFEgKyB0eF9zcGVjLnR4cV07CisgICAgaWYgKHR4cV9jdHJsID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZGF0ZSB0eHAvdHhxICglZC8lZClcbiIsIF9fZnVuY19fLCB0eF9zcGVjLnR4cCwgdHhfc3BlYy50eHEpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnR4cV9jdHJsLT5xdWV1ZV9sb2NrKTsKKworI2lmIDAKKyNpZmRlZiBDT05GSUdfTVZfRVRIX1RTTworICAgIC8qIEdTTy9UU08gKi8KKyAgICBpZiAoc2tiX2lzX2dzbyhza2IpKSB7CisgICAgICAgIGZyYWdzID0gbXZfZXRoX3R4X3Rzbyhza2IsIGRldl9vdXQsICZ0eF9zcGVjLCB0eHFfY3RybCk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1RTTyAqLworI2VuZGlmCisKKyAgICBmcmFncyA9IDE7CisKKyNpZiAwCisgICAgaWYgKHR4X3NwZWMuZmxhZ3MgJiBNVl9FVEhfRl9NSCkgeworICAgICAgICBpZiAodHhfc3BlYy5mbGFncyAmIE1WX0VUSF9GX1NXSVRDSCkKKyAgICAgICAgICAgIG1oID0gZGV2X3ByaXYtPnR4X3ZsYW5fbWg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1oID0gcHAtPnR4X21oOworCisgICAgICAgIGlmIChtdl9ldGhfc2tiX21oX2FkZChza2IsIG1oKSkgeworICAgICAgICAgICAgZnJhZ3MgPSAwOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICB0eF9kZXNjID0gbXZfZXRoX3R4X2Rlc2NfZ2V0KHR4cV9jdHJsLCBmcmFncyk7CisgICAgaWYgKHR4X2Rlc2MgPT0gTlVMTCkgeworICAgICAgICBmcmFncyA9IDA7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHR4X2NtZCA9IE5FVEFfVFhfTDRfQ1NVTV9OT1Q7CisKKyNpZmRlZiBDT05GSUdfTVZfUE9OCisgICAgdHhfZGVzYy0+aHdfY21kID0gdHhfc3BlYy5od19jbWQ7CisjZW5kaWYKKworICAgIC8qIEZJWE1FOiBiZXdhcmUgb2Ygbm9ubGluZWFyIC0tQksgKi8KKyAgICB0eF9kZXNjLT5kYXRhU2l6ZSA9IHNrYl9oZWFkbGVuKHNrYik7CisKKyAgICB0eF9kZXNjLT5idWZQaHlzQWRkciA9IG12T3NDYWNoZUZsdXNoKE5VTEwsIHNrYi0+ZGF0YSwgdHhfZGVzYy0+ZGF0YVNpemUpOworCisgICAgaWYgKGZyYWdzID09IDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QgYW5kIExhc3QgZGVzY3JpcHRvcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHR4X3NwZWMuZmxhZ3MgJiBNVl9FVEhfRl9OT19QQUQpCisgICAgICAgICAgICB0eF9jbWQgfD0gTkVUQV9UWF9GX0RFU0NfTUFTSyB8IE5FVEFfVFhfTF9ERVNDX01BU0s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4X2NtZCB8PSBORVRBX1RYX0ZMWl9ERVNDX01BU0s7CisKKyAgICAgICAgdHhfZGVzYy0+Y29tbWFuZCA9IHR4X2NtZDsKKyAgICAgICAgbXZfZXRoX3R4X2Rlc2NfZmx1c2godHhfZGVzYyk7CisKKyAgICAgICAgdHhxX2N0cmwtPnNoYWRvd190eHFbdHhxX2N0cmwtPnNoYWRvd190eHFfcHV0X2ldID0gKChNVl9VTE9ORykgc2tiIHwgTVZfRVRIX1NIQURPV19TS0IpOworICAgICAgICBtdl9ldGhfc2hhZG93X2luY19wdXQodHhxX2N0cmwpOworICAgIH0gCisKKyAgICB0eHFfY3RybC0+dHhxX2NvdW50ICs9IGZyYWdzOworCisjaWZkZWYgQ09ORklHX01WX0VUSF9ERUJVR19DT0RFCisgICAgaWYgKHBwLT5mbGFncyAmIE1WX0VUSF9GX0RCR19UWCkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXMgLSBldGhfdHhfJWx1OiBwb3J0PSVkLCB0eHA9JWQsIHR4cT0lZCwgc2tiPSVwLCBoZWFkPSVwLCBkYXRhPSVwLCBzaXplPSVkXG4iLAorICAgICAgICAgICAgICAgZGV2X291dC0+bmFtZSwgZGV2X291dC0+c3RhdHMudHhfcGFja2V0cywgcHAtPnBvcnQsIHR4X3NwZWMudHhwLCB0eF9zcGVjLnR4cSwgc2tiLAorICAgICAgICAgICAgICAgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyAgICAgICAgbXZfZXRoX3R4X2Rlc2NfcHJpbnQodHhfZGVzYyk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfREVCVUdfQ09ERSAqLworCisjaWZkZWYgQ09ORklHX01WX1BPTgorICAgIGlmIChNVl9QT05fUE9SVChwcC0+cG9ydCkpCisgICAgICAgIG12TmV0YVBvblR4cUJ5dGVzQWRkKHBwLT5wb3J0LCB0eF9zcGVjLnR4cCwgdHhfc3BlYy50eHEsIHNrYi0+bGVuKTsKKyNlbmRpZiAvKiBDT05GSUdfTVZfUE9OICovCisKKyAgICAvKiBFbmFibGUgdHJhbnNtaXQgKi8KKyAgICBtdk5ldGFUeHFQZW5kRGVzY0FkZChwcC0+cG9ydCwgdHhfc3BlYy50eHAsIHR4X3NwZWMudHhxLCBmcmFncyk7CisKKyAgICBTVEFUX0RCRyh0eHFfY3RybC0+c3RhdHMudHhxX3R4ICs9IGZyYWdzKTsKKworb3V0OgorICAgIGlmIChmcmFncyA+IDApIHsKKyAgICAgICAgZGV2X291dC0+c3RhdHMudHhfcGFja2V0cysrOworICAgICAgICBkZXZfb3V0LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZfb3V0LT5zdGF0cy50eF9kcm9wcGVkKys7CisgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisgICAgfQorCisjaWZuZGVmIENPTkZJR19NVl9FVEhfVFhET05FX0lTUgorICAgIGlmICh0eHFfY3RybCkgeworICAgICAgICBpZiAodHhxX2N0cmwtPnR4cV9jb3VudCA+PSBtdl9jdHJsX3R4ZG9uZSkgeworICAgICAgICAgICAgdTMyIHR4X2RvbmUgPSBtdl9ldGhfdHhxX2RvbmUocHAsIHR4cV9jdHJsKTsKKworICAgICAgICAgICAgU1RBVF9ESVNUKCh0eF9kb25lIDwgcHAtPmRpc3Rfc3RhdHMudHhfZG9uZV9kaXN0X3NpemUpID8gcHAtPmRpc3Rfc3RhdHMudHhfZG9uZV9kaXN0W3R4X2RvbmVdKysgOiAwKTsKKworICAgICAgICB9CisgICAgICAgIC8qIElmIGFmdGVyIGNhbGxpbmcgbXZfZXRoX3R4cV9kb25lLCB0eHFfY3RybC0+dHhxX2NvdW50IGVxdWFscyBmcmFncywgd2UgbmVlZCB0byBzZXQgdGhlIHRpbWVyICovCisgICAgICAgIGlmICgodHhxX2N0cmwtPnR4cV9jb3VudCA9PSBmcmFncykgJiYgKGZyYWdzID4gMCkpCisgICAgICAgICAgICBtdl9ldGhfYWRkX3R4X2RvbmVfdGltZXIocHApOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1RYRE9ORV9JU1IgKi8KKworICAgIGlmICh0eHFfY3RybCkKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHhxX2N0cmwtPnF1ZXVlX2xvY2spOworCisgICAgcmVhZF91bmxvY2soJnBwLT5yd2xvY2spOworCisjZW5kaWYgICAgCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2xvb2t1cF9vcF90eXBlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIG9wZXJhdGlvbiB0eXBlIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2Zsb3dfbG9va3VwX29wX3R5cGUoSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICByZXR1cm4gbXR5cGVfbG9va3VwX2VudW1fc3RyKCZnX2VudW1fYXJyYXlfb3BfdHlwZSwgZW51bV92YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGlzcGxheV9hbGwoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRpc3BsYXlzIHZhbGlkIGZsb3cgbWFwcGluZyB0YWJsZXMgYW5kIERTQ1AgCisqICAgICAgICAgICAgICB0byBQLWJpdHMgbWFwcGluZyB0YWJsZWZvciB1bnRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfZGlzcGxheV9hbGwgKFZPSUQpCit7CisgICAgVUlOVDMyICAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfRkxPV19FTlRSWV9UICpwX2Zsb3dfcnVsZSA9IE5VTEw7CisgICAgSU5UMzIgICAgICAgICAgICAgb2Zmc2V0ICAgICAgPSAwOworICAgIFVJTlQ4ICAgICAgICAgICAgIGJ1ZmZbNTEyXTsKKworICAgIC8qIFByaW50IGZsb3cgcnVsZSBlbnRyaWVzICovCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1BIIEZsb3cgUnVsZSBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiVG90YWwgcnVsZSBudW1iZXI6JWQsIE1heCBydWxlIG51bWJlcjolZCBcbiIsIGdzX2Zsb3dfdGFibGUucnVsZV9udW0sIENQSF9GTE9XX0VOVFJZX05VTSk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxQYXJzZSBvdXRlciAgICAgICB8UGFyc2UgaW5uZXIgICAgICAgfE1vZCBvdXRlciAgICAgICAgIHxNb2QgSW5uZXIgICAgICAgICB8Rm9yd2FyZFxuIik7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiZGlyIGRlZmF1bHQgcGFyc2VfYm0gbWggICBldHkgICAgdHBpZCAgIHZpZCAgcGJpdHMgIHRwaWQgICB2aWQgIHBiaXRzICB0cGlkICAgdmlkICBwYml0cyAgdHBpZCAgIHZpZCAgcGJpdHMgIHBvcnQgcXVldWUgaHdmX3F1ZXVlIGdlbSAgY291bnQgICAgb3BfdHlwZVxuIik7CisgICAgLyogVHJhdmVyc2UgQ1BIIGZsb3cgcnVsZSB0YWxlICovCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfRkxPV19FTlRSWV9OVU0pICYmIChydWxlX2lkeCA8IGdzX2Zsb3dfdGFibGUucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfZmxvd19ydWxlID0gJmdzX2Zsb3dfdGFibGUuZmxvd19ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgKi8KKyAgICAgICAgaWYgKHBfZmxvd19ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICAKKyAgICAgICAgICAgICAgICAgICAiJTIuMnMgICUzLjNzICAgICAweCUwNHggICAlLTRkIDB4JTA0eCAweCUwNHggJS00ZCAlMWQgICAgICAweCUwNHggJS00ZCAlMWQgICAgICAweCUwNHggJS00ZCAlMWQgICAgICAweCUwNHggJS00ZCAlMWQgICAgICAlMWQgICAgJTFkICAgICAlMWQgICAgICAgICAlLTRkICUtOGQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgY3BoX2FwcF9sb29rdXBfZGlyKHBfZmxvd19ydWxlLT5kaXIpLCAocF9mbG93X3J1bGUtPmlzX2RlZmF1bHQgPT0gVFJVRSk/ICJZZXMiOiJObyAiLCAKKyAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+cGFyc2VfYm0sICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5taCwgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+ZXRoX3R5cGUsCisgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPnBhcnNlX291dGVyX3RjaS50cGlkLCBwX2Zsb3dfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCwgcF9mbG93X3J1bGUtPnBhcnNlX291dGVyX3RjaS5wYml0cywgCisgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPnBhcnNlX2lubmVyX3RjaS50cGlkLCBwX2Zsb3dfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnZpZCwgcF9mbG93X3J1bGUtPnBhcnNlX2lubmVyX3RjaS5wYml0cywKKyAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+bW9kX291dGVyX3RjaS50cGlkLCAgIHBfZmxvd19ydWxlLT5tb2Rfb3V0ZXJfdGNpLnZpZCwgICBwX2Zsb3dfcnVsZS0+bW9kX291dGVyX3RjaS5wYml0cywKKyAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+bW9kX2lubmVyX3RjaS50cGlkLCAgIHBfZmxvd19ydWxlLT5tb2RfaW5uZXJfdGNpLnZpZCwgICBwX2Zsb3dfcnVsZS0+bW9kX2lubmVyX3RjaS5wYml0cywKKyAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+cGt0X2Zyd2QudHJnX3BvcnQsICAgIHBfZmxvd19ydWxlLT5wa3RfZnJ3ZC50cmdfcXVldWUsICBwX2Zsb3dfcnVsZS0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSwgcF9mbG93X3J1bGUtPnBrdF9mcndkLmdlbV9wb3J0LCAKKyAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+Y291bnQsICAgICAgICAgICAgICAgIGNwaF9mbG93X2xvb2t1cF9vcF90eXBlKHBfZmxvd19ydWxlLT5vcF90eXBlKSk7CisgICAgICAgIH0KKyAgICB9ICAgCisKKyAgICAvKiBQcmludCAgRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLworICAgIHByaW50ayhLRVJOX0lORk8gIlxuTVZfQ1BIIERTQ1AgdG8gUC1iaXRzIE1hcHBpbmcgVGFibGVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAgCisgICAgaWYgKGdzX2RzY3BfbWFwX3RhYmxlLmluX3VzZSA9PSAwKSB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIk5vIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmdcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRFNDUFtQYml0c11cbiIpOworCisgICAgICAgIG1lbXNldChidWZmLCAwLCBzaXplb2YoYnVmZikpOworICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IE1WX0NQSF9EU0NQX1BCSVRTX1RBQkxFX01BWF9TSVpFOyBpZHgrKykgeworICAgICAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoYnVmZitvZmZzZXQsICIlMi4yZFslMi4yZF0gIiwgaWR4LCBnc19kc2NwX21hcF90YWJsZS5wYml0c1tpZHhdKTsKKyAgICAgICAgICAgIGlmICgoKGlkeCsxKSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKGJ1ZmYrb2Zmc2V0LCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYnVmZik7CisgICAgfQorICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7CisgCisgICAgcmV0dXJuIE1WX09LOyAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemVzIENQSCBmbG93IG1hcHBpbmcgZGF0YSBzdHJ1Y3R1cmUuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfaW5pdChWT0lEKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19kYl9pbml0KCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2luaXQiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTZlOWVlMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmgKQEAgLTAsMCArMSw2MzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZmxvdy5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGZsb3cgbW9kdWxlIHRvIGhhbmRsZSB0aGUgCisqICAgICAgICAgICAgICBmbG93IG1hcHBpbmcsIFZMQU4gbW9kaWZpY2F0aW9uIG9mIGRhdGEgdHJhZmZpYworKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMTJEZWMyMDExCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjEKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfRkxPV19IXworI2RlZmluZSBfTVZfQ1BIX0ZMT1dfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogICAgICAgICAgICAgICAgICAgICAgICBEYXRhIEVudW0gYW5kIFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1WX0NQSF9UUElEX05PVF9DQVJFX1ZBTFVFICAgICAgICgwKSAgICAgLyogRG9lcyBub3QgY2FyZSBmb3IgVFBJRCAgICAgKi8KKyNkZWZpbmUgTVZfQ1BIX1ZJRF9OT1RfQ0FSRV9WQUxVRSAgICAgICAgKDQwOTYpICAvKiBEb2VzIG5vdCBjYXJlIGZvciBWSUQgICAgICAqLworI2RlZmluZSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUgICAgICAoOCkgICAgIC8qIERvZXMgbm90IGNhcmUgZm9yIFAtYml0cyAgICovCisjZGVmaW5lIE1WX0NQSF9EU0NQX05PVF9DQVJFX1ZBTFVFICAgICAgICg2NCkgICAgLyogRG9lcyBub3QgY2FyZSBmb3IgRFNDUCAgICAgKi8KKworI2RlZmluZSBNVl9DUEhfVFBJRF9JTlZBTElEX1ZBTFVFICAgICAgICAoMHhGRkZGKS8qIE5vIHZhbGlkIFRQSUQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1WX0NQSF9WSURfSU5WQUxJRF9WQUxVRSAgICAgICAgICgweEZGRkYpLyogTm8gdmFsaWQgVklEICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVZfQ1BIX1BCSVRTX0lOVkFMSURfVkFMVUUgICAgICAgKDB4RkYpICAvKiBObyB2YWxpZCBQLWJpdHMgICAgICAgICAgICAqLworI2RlZmluZSBNVl9DUEhfRFNDUF9JTlZBTElEX1ZBTFVFICAgICAgICAoMHhGRikgIC8qIE5vIHZhbGlkIERTQ1AgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVZfQ1BIX0RFRkFVTFRfVU5UQUdfUlVMRSAgICAgICAgKDQwOTYrMSkvKiBEZWZhdWx0IHVudGFnZ2VkICBydWxlICAgICAqLworI2RlZmluZSBNVl9DUEhfREVGQVVMVF9TSU5HTEVfVEFHX1JVTEUgICAoNDA5NisyKS8qIERlZmF1bHQgc2lubGdlIHRhZ2dlZCAgcnVsZSovCisjZGVmaW5lIE1WX0NQSF9ERUZBVUxUX0RPVUJMRV9VTlRBR19SVUxFICg0MDk2KzMpLyogRGVmYXVsdCBkb3VibGUgdGFnZ2VkICBydWxlKi8KKworLyogQ1BIIGZsb3cgbWFwcGluZyBydWxlIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfVkxBTl9PUF9BU0lTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBDUEhfVkxBTl9PUF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAKKyAgICBDUEhfVkxBTl9PUF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgIAorICAgIENQSF9WTEFOX09QX0FERF9DT1BZX0RTQ1AgICAgICAgICAgICAgICAgICAgICAgPSAzLAorICAgIENQSF9WTEFOX09QX0FERF9DT1BZX09VVEVSX1BCSVQgICAgICAgICAgICAgICAgPSA0LAorICAgIENQSF9WTEFOX09QX0FERF9DT1BZX0lOTkVSX1BCSVQgICAgICAgICAgICAgICAgPSA1LAorICAgIENQSF9WTEFOX09QX0FERF8yX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LAorICAgIENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9EU0NQICAgICAgICAgICAgICAgPSA3LAorICAgIENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9QQklUICAgICAgICAgICAgICAgPSA4LAorICAgIENQSF9WTEFOX09QX1JFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LAorICAgIENQSF9WTEFOX09QX1JFTV8yX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9WSUQgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLAorICAgIENQSF9WTEFOX09QX1JFUExBQ0VfUEJJVCAgICAgICAgICAgICAgICAgICAgICAgPSAxMywKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUiAgICAgICAgICAgID0gMTQsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9BRERfT1VURVJfQ09QWV9QQklUICA9IDE1LAorICAgIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfUkVNX09VVEVSICAgICAgICAgICAgPSAxNiwKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFXzJUQUdTICAgICAgICAgICAgICAgICAgICAgID0gMTcsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV8yVEFHU19WSUQgICAgICAgICAgICAgICAgICA9IDE4LAorICAgIENQSF9WTEFOX09QX1NXQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOQorfSBDUEhfVkxBTl9PUF9UWVBFX0U7CisKK3R5cGVkZWYgc3RydWN0IGNwaF9mbG93X2Zyd2QgeworICAgIFVJTlQ4ICB0cmdfcG9ydDsKKyAgICBVSU5UOCAgdHJnX3F1ZXVlOworICAgIFVJTlQ4ICB0cmdfaHdmX3F1ZXVlOworICAgIFVJTlQxNiBnZW1fcG9ydDsKK30gQ1BIX0ZMT1dfRlJXRF9UOworCit0eXBlZGVmIHN0cnVjdCBjcGhfZmxvd190Y2kgeworICAgIFVJTlQxNiAgdHBpZDsKKyAgICBVSU5UMTYgIHZpZDsKKyAgICBVSU5UOCAgIHBiaXRzOworfSBDUEhfRkxPV19UQ0lfVDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0ZMT1dfUEFSU0VfTUggICAgICAgID0gMHgwMSwgIC8qIHBhcnNpbmcgTWFydmVsbCBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gID0gMHgwMiwgIC8qIHBhcnNpbmcgZXh0ZXJuYWwgVkxBTiB0YWcgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4gID0gMHgwNCwgIC8qIHBhcnNpbmcgYm90aCBvZiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgVkxBTiB0YWdzICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfRVRIX1RZUEUgID0gMHgwOCwgIC8qIHBhcnNpbmcgRXRoZXJuZXQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE8gID0gMHgxMCwgIC8qIHBhcnNpbmcgbXVsdGljYXN0IHByb3RvY29sICAgICAgICAgICAgICAgICAgICAgICovCit9IENQSF9GTE9XX1BBUlNFX0U7CisKK3R5cGVkZWYgZW51bQoreworICAgIENQSF9UQ0lfRklFTERfVklELAorICAgIENQSF9UQ0lfRklFTERfQ0ZJLAorICAgIENQSF9UQ0lfRklFTERfUEJJVCwKKyAgICBDUEhfVENJX0ZJRUxEX1ZJRF9QQklULAorICAgIENQSF9UQ0lfRklFTERfQUxMLAorfSBDUEhfVENJX0ZJRUxEX0U7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQk9PTCAgICAgICAgICAgICAgIHZhbGlkOworICAgIENQSF9ESVJfRSAgICAgICAgICBkaXI7CisgICAgQ1BIX0ZMT1dfUEFSU0VfRSAgIHBhcnNlX2JtOworICAgIEJPT0wgICAgICAgICAgICAgICBpc19kZWZhdWx0OworICAgIFVJTlQxNiAgICAgICAgICAgICBtaDsKKyAgICBDUEhfRkxPV19UQ0lfVCAgICAgcGFyc2Vfb3V0ZXJfdGNpOworICAgIENQSF9GTE9XX1RDSV9UICAgICBwYXJzZV9pbm5lcl90Y2k7CisgICAgVUlOVDE2ICAgICAgICAgICAgIGV0aF90eXBlOworICAgIENQSF9WTEFOX09QX1RZUEVfRSBvcF90eXBlOworICAgIENQSF9GTE9XX1RDSV9UICAgICBtb2Rfb3V0ZXJfdGNpOworICAgIENQSF9GTE9XX1RDSV9UICAgICBtb2RfaW5uZXJfdGNpOworICAgIENQSF9GTE9XX0ZSV0RfVCAgICBwa3RfZnJ3ZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgY291bnQ7Cit9IENQSF9GTE9XX0VOVFJZX1Q7CisKKyNkZWZpbmUgQ1BIX0ZMT1dfRU5UUllfTlVNICAgKDUxMikKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMzIgICAgICAgICAgICAgcnVsZV9udW07CisgICAgc3BpbmxvY2tfdCAgICAgICAgIGZsb3dfbG9jazsKKyAgICBDUEhfRkxPV19FTlRSWV9UICAgZmxvd19ydWxlW0NQSF9GTE9XX0VOVFJZX05VTV07Cit9IENQSF9GTE9XX1RBQkxFX1Q7CisKKy8qIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGUgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTVZfQ1BIX0RTQ1BfUEJJVFNfVEFCTEVfTUFYX1NJWkUgICg2NCkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgaW5fdXNlOworICAgIFVJTlQ4ICBwYml0c1tNVl9DUEhfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRV07Cit9IENQSF9EU0NQX1BCSVRTX1Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19hZGRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfYWRkX3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RlbF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfZGVsX3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2NsZWFyX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXJzIGFsbCBmbG93IG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X2NsZWFyX3J1bGUoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgZmxvdyBtYXBwaW5nIHJ1bGVzIGJ5IE1ICisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAtICBNYXJ2ZWxsIGhlYWRlci4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19jbGVhcl9ydWxlX2J5X21oKFVJTlQxNiBtaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZ2V0X3RhZ19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldHMgZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBJbnB1dCB2aWQsIHBiaXRzLCBkaXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBvdXRwdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgCisqICAgICAgICAgICAgICAgICAgVC1DT05ULCBxdWV1ZSBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2dldF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19nZXRfcnVsZV9ieV92aWQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBmbG93IG1hcHBpbmcgcnVsZSBieSBWSUQsIG9ubHkgdXNlZCB0byBjb21wYXJlIHBhY2tldCBhbmQgZGIgcnVsZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBmbG93ICAgICAgIC0gRmxvdyBwYXJzaW5nIGZpZWxkIHZhbHVlcworKiAgICAgICBmb3JfcGFja2V0IC0gV2hldGhlciBnZXQgcnVsZSBmb3IgcGFja2V0IG9yIGZvciBuZXcgQ1BIIHJ1bGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfZ2V0X3J1bGVfYnlfdmlkIChDUEhfRkxPV19FTlRSWV9UICpmbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zZXRfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0cyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgZHNjcF9tYXAgIC0gRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19zZXRfZHNjcF9tYXAoQ1BIX0RTQ1BfUEJJVFNfVCAqZHNjcF9tYXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RlbF9kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X2RlbF9kc2NwX21hcChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19hZGRfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgb25lIFZMQU4gdGFnIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIHRwaWQgICAtIFR5cGUgb2YgVkxBTiBJRAorKiAgICAgICB2aWQgICAgLSBWTEFOIHRvIGJlIGFkZGVkCisqICAgICAgIHBiaXRzICAtIFAtYml0cyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X2FkZF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiB0cGlkLCBVSU5UMTYgdmlkLCBVSU5UOCBwYml0cyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGVsX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIG9uZSBWTEFOIHRhZyBiZWhpbmQgb2Ygc291cmNlIE1BQyBhZGRyZXNzLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldC4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19kZWxfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19yZXBsYWNlX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUmVwbGFjZSBvbmUgVkxBTiB0YWcgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgdHBpZCAgIC0gVHlwZSBvZiBWTEFOIElECisqICAgICAgIHZpZCAgICAtIFZMQU4gdG8gYmUgYWRkZWQKKyogICAgICAgcGJpdHMgIC0gUC1iaXRzIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfcmVwbGFjZV92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiB0cGlkLCBVSU5UMTYgdmlkLCBVSU5UOCBwYml0cyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfc3dhcF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFN3YXAgYmV0d2VlbiB0d28gVkxBTiB0YWcuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfc3dhcF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3N0cmlwX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBWTEFOIHRhZ3MgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfc3RyaXBfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jb21wYXJlX3J1bGVzKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENvbXBhcnNlIHR3byBmbG93IHJ1bGVzLgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX3J1bGUgIC0gVGhlIHBhcnNpbmcgZmllbGQgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFja2V0cworKiAgICAgICBkYl9ydWxlICAgICAtIFRoZSBmbG93IHJ1bGUgc3RvcmVkIGluIGZsb3cgZGF0YWJhc2UKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZmxvd19jb21wYXJlX3J1bGVzIChDUEhfRkxPV19FTlRSWV9UICpwYXJzZV9ydWxlLCBDUEhfRkxPV19FTlRSWV9UICpkYl9ydWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJlIGZsb3cgcGFja2V0IGFuZCBydWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhY2tldF9ydWxlIC0gVGhlIHBhcnNpbmcgZmllbGQgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFja2V0cworKiAgICAgICBkYl9ydWxlICAgICAtIFRoZSBmbG93IHJ1bGUgc3RvcmVkIGluIGZsb3cgZGF0YWJhc2UKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZSAoQ1BIX0ZMT1dfRU5UUllfVCAqcGFja2V0X3J1bGUsIENQSF9GTE9XX0VOVFJZX1QgKmRiX3J1bGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2NvbXBhcmVfcGFja2V0X2FuZF9ydWxlX3ZpZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJlIGZsb3cgcGFja2V0IGFuZCBydWxlIHcvIG9ubHkgVklELgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhY2tldF9ydWxlIC0gVGhlIHBhcnNpbmcgZmllbGQgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFja2V0cworKiAgICAgICBkYl9ydWxlICAgICAtIFRoZSBmbG93IHJ1bGUgc3RvcmVkIGluIGZsb3cgZGF0YWJhc2UKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZV92aWQgKENQSF9GTE9XX0VOVFJZX1QgKnBhY2tldF9ydWxlLCBDUEhfRkxPV19FTlRSWV9UICpkYl9ydWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19wYXJzZV9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUGFyc2UgcGFja2V0IGFuZCBvdXRwdXQgZmxvdyBpbmZvcm1hdGlvbi4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0IC0gU291cmNlIEdNQUMgcG9ydAorKiAgICAgICBkYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgcnggICAtIFdoZXRoZXIgaW4gUlggZGlyCisqCisqIE9VVFBVVFM6CisqICAgICAgIGZsb3cgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X3BhcnNlX3BhY2tldCAoSU5UMzIgcG9ydCwgVUlOVDggKmRhdGEsIEJPT0wgcngsIEJPT0wgbWgsIENQSF9GTE9XX0VOVFJZX1QgKmZsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X21vZF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IHBhY2tldCBhY2NvcmRpbmcgdG8gZmxvdyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgc2tiICAgICAgICAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIG1oICAgICAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgZmxvdyAgICAgICAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyogICAgICAgb3V0X29mZnNldCAtIE9mZnNldCBvZiBwYWNrZXQKKyogICAgICAgcnggICAgICAgICAtIFdoZXRoZXIgUlggb3IgVFgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfbW9kX3BhY2tldCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgIEJPT0wgbWgsIENQSF9GTE9XX0VOVFJZX1QgKmZsb3csIElOVDMyICpvdXRfb2Zmc2V0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19tb2RfZnJ3ZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgZm9yd2FyZGluZyBwYXJhbWV0ZXIgb2YgdHJhbnNtaXRpbmcgcGFja2V0IGFjY29yZGluZyB0byBmbG93IHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBmbG93ICAgICAgICAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X21vZF9mcndkIChDUEhfRkxPV19FTlRSWV9UICpmbG93LCBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zZW5kX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBhcHBsaWNhdGlvbiBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIGRldl9vdXQgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBwa3QgICAgICAgICAtIE1hcnZlbGwgcGFja2V0IGluZm9ybWF0aW9uCisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X291dCwgIHN0cnVjdCBldGhfcGJ1ZiAqcGt0LAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2xvb2t1cF9vcF90eXBlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIG9wZXJhdGlvbiB0eXBlIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2Zsb3dfbG9va3VwX29wX3R5cGUoSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGlzcGxheV9hbGwoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRpc3BsYXlzIHZhbGlkIGZsb3cgbWFwcGluZyB0YWJsZXMgYW5kIERTQ1AgCisqICAgICAgICAgICAgICB0byBQLWJpdHMgbWFwcGluZyB0YWJsZWZvciB1bnRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19kaXNwbGF5X2FsbChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemVzIENQSCBmbG93IG1hcHBpbmcgZGF0YSBzdHJ1Y3R1cmUuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19pbml0KFZPSUQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9GTE9XX01BUF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2hlYWRlci5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjZmRlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaGVhZGVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9oZWFkZXIuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBoZWFkZXIgZmlsZQorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfSEVBREVSX0hfCisjZGVmaW5lIF9NVl9DUEhfSEVBREVSX0hfCisKKy8qIEluY2x1ZGUgRmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bXZDb21tb24uaD4KKyNpbmNsdWRlIDxtdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2Lmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaW5mcmEuaCIKKyNpbmNsdWRlICJtdl9jcGhfYXBwLmgiCisjaW5jbHVkZSAibXZfY3BoX2Zsb3cuaCIKKyNpbmNsdWRlICJtdl9jcGhfZGIuaCIKKyNpbmNsdWRlICJtdl9jcGhfYXBpLmgiCisjaW5jbHVkZSAibXZfY3BoX21uZ19pZi5oIgorI2luY2x1ZGUgIm12X2NwaF9kZXYuaCIKKyNpbmNsdWRlICJtdl9jcGhfbmV0ZGV2LmgiCisjaW5jbHVkZSAibXZfY3BoX3N5c2ZzLmgiCisKKyNlbmRpZiAvKiBfTVZfQ1BIX0hFQURFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2luZnJhLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaW5mcmEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NGIyOTViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2luZnJhLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfaW5mcmEuYworKgorKiBERVNDUklQVElPTjogSW5jbHVkZSB1c2VyIHNwYWNlIGluZnJhc3RydWN0dXJlIG1vZHVsZXMgZGVmaW5pdGlvbnMKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIENIQVIgZ191bmtub3duX3N0cltdID0gIjx1bmtub3duPiI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1pbmRleF90cG1fc3JjX3RvX2FwcF9wb3J0KCkKKyoKKyogREVTQ1JJUFRJT046Q29udmVydCBUUE0gc291cmNlIHBvcnQgdG8gYXBwbGljYXRpb24gVU5JIHBvcnQgCisqCisqIElOUFVUUzoKKyogICAgICAgc3JjX3BvcnQgICAgLSBUUE0gc291cmNlIHBvcnQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgQXBwbGljYXRpb24gVU5JIHBvcnQgaW5kZXgKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYXBwbGljYXRpb24gVU5JIHBvcnQgaW5kZXguIAorKiAgICAgICBPbiBlcnJvciByZXR1cm4gaW52YWxpZCBhcHBsaWNhdGlvbiBVTkkgcG9ydCBpbmRleC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9BUFBfRVRIX1BPUlRfVU5JX0UgbWluZGV4X3RwbV9zcmNfdG9fYXBwX3BvcnQodHBtX3NyY19wb3J0X3R5cGVfdCBzcmNfcG9ydCkKK3sKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JX0UgYXBwX3BvcnQgPSBNVl9BUFBfRVRIX1BPUlRfSU5WQUxJRDsKKworICAgIC8qIFNob3VsZCBtb2RpZnkgYmVsb3cgY29kZSBpbiBjYXNlIHN1cHBvcnQgbW9yZSB0aGFuIGZvdXIgVU5JIHBvcnRzICovCisgICAgaWYgKHNyY19wb3J0IDw9IFRQTV9TUkNfUE9SVF9VTklfMykKKyAgICB7CisgICAgICAgIGFwcF9wb3J0ID0gTVZfQVBQX0VUSF9QT1JUX0lOREVYX01JTiArIChzcmNfcG9ydCAtIFRQTV9TUkNfUE9SVF9VTklfMCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBhcHBfcG9ydDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtaW5kZXhfbWhfdG9fYXBwX2xsaWQoKQorKgorKiBERVNDUklQVElPTjpDb252ZXJ0IE1hcnZlbGwgaGVhZGVyIHRvIGFwcGxpY2F0aW9uIExMSUQgCisqCisqIElOUFVUUzoKKyogICAgICAgbWggIC0gTWFydmVsbCBoZWFkZXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgQXBwbGljYXRpb24gTExJRAorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhcHBsaWNhdGlvbiBMTElELiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJuIGludmFsaWQgYXBwbGljYXRpb24gTExJRC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9UQ09OVF9MTElEX0UgbWluZGV4X21oX3RvX2FwcF9sbGlkKFVJTlQxNiBtaCkKK3sKKyAgICBNVl9UQ09OVF9MTElEX0UgbGxpZCAgICAgICA9IE1WX1RDT05UX0xMSURfSU5WQUxJRDsKKyAgICBVSU5UOCAgICAgICAgICAgbGxpZF9pbmRleCA9IDA7CisKKyAgICBsbGlkX2luZGV4ID0gKG1oID4+IDgpICYgMHgwZjsKKyAgICAKKyAgICBpZiAobGxpZF9pbmRleCA+IDApCisgICAgeworICAgICAgICBpZiAoMHgwZiA9PSBsbGlkX2luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBsbGlkID0gTVZfVENPTlRfTExJRF9CUk9BRENBU1Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsbGlkID0gbGxpZF9pbmRleCAtMTsKKyAgICAgICAgICAgIGlmKGxsaWQgPiBNVl9UQ09OVF9MTElEXzcpCisgICAgICAgICAgICAgICAgbGxpZCA9IE1WX1RDT05UX0xMSURfSU5WQUxJRDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gbGxpZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdHlwZV9nZXRfZGlnaXRfbnVtKCkKKyoKKyogREVTQ1JJUFRJT046Q29udmVydCBjaGFyYWN0ZXIgc3RyaW5nIHRvIGRpZ2l0YWwgbnVtYmVyIAorKgorKiBJTlBVVFM6CisqICAgICAgIHN0ciAgIC0gQ2hhcmFjdGVyIHN0cmluZworKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIERpZ2l0YWwgbnVtYmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitVSU5UMzIgbXR5cGVfZ2V0X2RpZ2l0X251bShjb25zdCBDSEFSICAqc3RyKQoreworICAgIFVJTlQzMiAgdmFsID0gMDsKKworICAgIGlmICgoc3RyWzFdID09ICd4JykgfHwgKHN0clsxXSA9PSAnWCcpKQorICAgICAgICBzc2NhbmYoJnN0clsyXSwgIiV4IiwgJnZhbCk7CisgICAgZWxzZQorICAgICAgICB2YWwgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDEwKTsKKworICAgIHJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXR5cGVfbG9va3VwX2VudW1fc3RyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIGVudW0gc3RyaW5nIGFjY29yZGluZyB0byBlbnVtIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgcF9lbnVtX2FycmF5ICAgLSBQb2ludGVyIHRvIGVudW0gYXJyYXkKKyogICAgICAgZW51bV92YWx1ZSAgICAgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICptdHlwZV9sb29rdXBfZW51bV9zdHIoTVZfRU5VTV9BUlJBWV9UICpwX2VudW1fYXJyYXksIElOVDMyIGVudW1fdmFsdWUpCit7CisgICAgSU5UMzIgaWR4OworICAgIAorICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcF9lbnVtX2FycmF5LT5lbnVtX251bTsgaWR4KyspCisgICAgeworICAgICAgICBpZiAoZW51bV92YWx1ZSA9PSBwX2VudW1fYXJyYXktPmVudW1fYXJyYXlbaWR4XS5lbnVtX3ZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIHBfZW51bV9hcnJheS0+ZW51bV9hcnJheVtpZHhdLmVudW1fc3RyOworICAgIH0KKyAgICByZXR1cm4gZ191bmtub3duX3N0cjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdXRpbHNfaXNfZnJ3ZF9icm9hZGNhc3RfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046Q2hlY2sgd2hldGhlciBwYWNrZXQgaXMgZGlyZWN0bHkgZm9yd2FyZGVkIGJyb2FkY2FzdCBvbmUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkYXRhICAgLSBwYWNrZXQgZGF0YQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRSVUU6IGJyb2FkY2FzdCBwYWNrZXQsIEZBTFNFOm5vbmUgYnJvYWRjYXN0IHBhY2tldAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgbXV0aWxzX2lzX2Zyd2RfYnJvYWRjYXN0X3BhY2tldChjaGFyICpkYXRhKQoreworICAgIGNoYXIgYmNfbWFjWzZdID0gezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9OworICAgIGNoYXIgKnBfZGF0YTsKKworICAgIHBfZGF0YSA9IGRhdGEgKyBNVl9FVEhfTUhfU0laRTsKKworICAgIGlmICghbWVtY21wKHBfZGF0YSwgJmJjX21hY1swXSwgc2l6ZW9mKGJjX21hYykpKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9pbmZyYS5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2luZnJhLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTM4ZDFhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9pbmZyYS5oCkBAIC0wLDAgKzEsNDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2luZnJhLmgKKyoKKyogREVTQ1JJUFRJT046IEluY2x1ZGUgdXNlciBzcGFjZSBpbmZyYXN0cnVjdHVyZSBtb2R1bGVzIGRlZmluaXRpb25zCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9JTkZSQV9IXworI2RlZmluZSBfTVZfQ1BIX0lORlJBX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEYXRhIFR5cGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgICAgICAgICAgY2hhciAgICAgIElOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICBVSU5UODsKK3R5cGVkZWYgICAgICAgICAgc2hvcnQgICAgIElOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgVUlOVDE2OwordHlwZWRlZiAgICAgICAgICBpbnQgICAgICAgSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBVSU5UMzI7Cit0eXBlZGVmICAgICAgICAgIGxvbmcgbG9uZyBJTlQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJTlQ2NDsKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICAgIENIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICBVQ0hBUjsKK3R5cGVkZWYgICAgICAgICAgbG9uZyAgICAgIExPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICBVTE9ORzsKKwordHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgVk9JRDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgICAgIFNUQVRVUzsKKwordHlwZWRlZiBib29sICAgICAgICAgICAgICAgQk9PTDsKKyNkZWZpbmUgVFJVRSAgICAgICAgICAgICAgIHRydWUKKyNkZWZpbmUgRkFMU0UgICAgICAgICAgICAgIGZhbHNlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUG9ydCBJbmRleCBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRXRoZXJuZXQgcG9ydCBpbmRleCAqLworI2RlZmluZSBNVl9BUFBfRVRIX1BPUlRfSU5ERVhfTUlOIDEKKyNkZWZpbmUgTVZfQVBQX0VUSF9QT1JUX0lOREVYX01BWCA0CisjZGVmaW5lIE1WX0FQUF9FVEhfUE9SVF9OVU0gICAgICAgKE1WX0FQUF9FVEhfUE9SVF9JTkRFWF9NQVgtTVZfQVBQX0VUSF9QT1JUX0lOREVYX01JTisxKQorCit0eXBlZGVmIGVudW0geworICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfMCAgID0gMSwKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzEsCisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV8yLAorICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfMywKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzQsCisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV81LAorICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfNiwKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzcsCisgICAgTVZfQVBQX0VUSF9QT1JUX0lOVkFMSUQgICAKK30gIE1WX0FQUF9FVEhfUE9SVF9VTklfRTsKKworLyogVm9JUCBwb3J0IGluZGV4ICovCisjZGVmaW5lIE1WX0FQUF9WT0lQX1BPUlRfSU5ERVhfTUlOIDEKKyNkZWZpbmUgTVZfQVBQX1ZPSVBfUE9SVF9JTkRFWF9NQVggMgorI2RlZmluZSBNVl9BUFBfVk9JUF9QT1JUX05VTSAgICAgICAoTVZfQVBQX1ZPSVBfUE9SVF9JTkRFWF9NQVgtTVZfQVBQX1ZPSVBfUE9SVF9JTkRFWF9NSU4rMSkKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9BUFBfVk9JUF9QT1JUXzAgPSAxLAorICAgIE1WX0FQUF9WT0lQX1BPUlRfMQorfSAgTVZfQVBQX1ZPSVBfUE9SVF9FOworCisvKiBXSUZJIFNTSUQgcG9ydCBpbmRleCAqLworI2RlZmluZSBNVl9BUFBfU1NJRF9JTkRFWF9NSU4gMQorI2RlZmluZSBNVl9BUFBfU1NJRF9JTkRFWF9NQVggNAordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9BUFBfU1NJRF8wID0gMSwKKyAgICBNVl9BUFBfU1NJRF8xLAorICAgIE1WX0FQUF9TU0lEXzIsCisgICAgTVZfQVBQX1NTSURfMywKKyAgICBNVl9BUFBfU1NJRF80LAorICAgIE1WX0FQUF9TU0lEXzUsCisgICAgTVZfQVBQX1NTSURfNiwKKyAgICBNVl9BUFBfU1NJRF83Cit9ICBNVl9BUFBfU1NJRF9FOworCisvKiBVU0IgcG9ydCBpbmRleCAqLworI2RlZmluZSBNVl9BUFBfVVNCX1BPUlRfSU5ERVhfTUlOIDEKKyNkZWZpbmUgTVZfQVBQX1VTQl9QT1JUX0lOREVYX01BWCAyCisjZGVmaW5lIE1WX0FQUF9VU0JfUE9SVF9OVU0gICAgICAgKE1WX0FQUF9VU0JfUE9SVF9JTkRFWF9NQVgtTVZfQVBQX1VTQl9QT1JUX0lOREVYX01JTisxKQorCit0eXBlZGVmIGVudW0geworICAgIE1WX0FQUF9VU0JfUE9SVF8wID0gMSwKKyAgICBNVl9BUFBfVVNCX1BPUlRfMQorfSAgTVZfQVBQX1VTQl9QT1JUX0U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdFIE1BQyBQb3J0IEluZGV4IERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICAgIE1WX0FQUF9HTUFDX1BPUlRfMCAgICAgICA9IDAsCisgICAgTVZfQVBQX0dNQUNfUE9SVF8xLAorICAgIE1WX0FQUF9QT05fTUFDX1BPUlQsCisgICAgTVZfQVBQX0dNQUNfUE9SVF9OVU0gICAgID0gMywKKyAgICBNVl9BUFBfR01BQ19QT1JUX0lOVkFMSUQgPSAzLAorfSAgTVZfQVBQX0dNQUNfUE9SVF9FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBULUNPTlQvTExJRCBJbmRleCBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNVl9UQ09OVF9MTElEX01JTiAwCisjZGVmaW5lIE1WX1RDT05UX0xMSURfTUFYIDcKKyNkZWZpbmUgTVZfVENPTlRfTExJRF9OVU0gKE1WX1RDT05UX0xMSURfTUFYLU1WX1RDT05UX0xMSURfTUlOKzEpCisKK3R5cGVkZWYgZW51bSB7CisgICAgTVZfVENPTlRfTExJRF8wID0gMCwKKyAgICBNVl9UQ09OVF9MTElEXzEsCisgICAgTVZfVENPTlRfTExJRF8yLAorICAgIE1WX1RDT05UX0xMSURfMywKKyAgICBNVl9UQ09OVF9MTElEXzQsCisgICAgTVZfVENPTlRfTExJRF81LAorICAgIE1WX1RDT05UX0xMSURfNiAsCisgICAgTVZfVENPTlRfTExJRF83LCAKKyAgICBNVl9UQ09OVF9MTElEXzgsCisgICAgTVZfVENPTlRfTExJRF85LAorICAgIE1WX1RDT05UX0xMSURfMTAsCisgICAgTVZfVENPTlRfTExJRF8xMSwKKyAgICBNVl9UQ09OVF9MTElEXzEyLAorICAgIE1WX1RDT05UX0xMSURfMTMsCisgICAgTVZfVENPTlRfTExJRF8xNCAsCisgICAgTVZfVENPTlRfTExJRF8xNSwgCisgICAgTVZfVENPTlRfTExJRF9CUk9BRENBU1QsCisgICAgTVZfVENPTlRfTExJRF9JTlZBTElECit9IE1WX1RDT05UX0xMSURfRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV0FOIGFuZCBMQU4gSW5kZXggRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTVZfQVBQX1BPUlRfV0FOID0gMCwKKyAgICBNVl9BUFBfUE9SVF9MQU4sCisgICAgTVZfQVBQX1BPUlRfSU5WQUxJRCwKK30gIE1WX0FQUF9QT1JUX1RZUEVfRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0VNIFBvcnQgSW5kZXggRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVZfR0VNX1BPUlRfTUlOICAwCisjZGVmaW5lIE1WX0dFTV9QT1JUX01BWCAgNDA5NQorI2RlZmluZSBNVl9HRU1fUE9SVF9OVU0gIChNVl9HRU1fUE9SVF9NQVgtTVZfR0VNX1BPUlRfTUlOKzEpCisjZGVmaW5lIE1WX0dFTV9QT1JUX01BU0sgMHgwRkZGCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFF1ZXVlIEluZGV4IERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1WX1FVRVVFX01JTiAgMAorI2RlZmluZSBNVl9RVUVVRV9NQVggIDcKKyNkZWZpbmUgTVZfUVVFVUVfTlVNICAoTVZfUVVFVUVfTUFYLU1WX1FVRVVFX01JTisxKQorI2RlZmluZSBNVl9JTlZBTElEX1FVRVVFX05VTSAgKDB4RkYpIC8qIEludmFsaWQgcXVldWUgbnVtYmVyICAqLworCit0eXBlZGVmIGVudW0geworICAgIE1WX1FVRVVFXzAgPSAwLAorICAgIE1WX1FVRVVFXzEsCisgICAgTVZfUVVFVUVfMiwKKyAgICBNVl9RVUVVRV8zLAorICAgIE1WX1FVRVVFXzQsCisgICAgTVZfUVVFVUVfNSwKKyAgICBNVl9RVUVVRV82LAorICAgIE1WX1FVRVVFXzcKK30gIE1WX1FVRVVFX0U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZMQU4gSUQvUC1iaXRzIEluZGV4IERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1WX1ZMQU5fSURfTUlOICAwCisjZGVmaW5lIE1WX1ZMQU5fSURfTUFYIDQwOTUKKyNkZWZpbmUgTVZfVkxBTl9JRF9OVU0gKE1WX1ZMQU5fSURfTUFYLU1WX1ZMQU5fSURfTUlOKzEpCisjZGVmaW5lIE1WX1ZMQU5fSURfTUFTSyAweDBGRkYKKyNkZWZpbmUgTVZfVkxBTl9JRF9JTlZBTElEX1ZBTFVFIDB4RkZGRgorCisjZGVmaW5lIE1WX1BCSVRTX01JTiAgIDAKKyNkZWZpbmUgTVZfUEJJVFNfTUFYICAgNworI2RlZmluZSBNVl9QQklUU19OVU0gIChNVl9QQklUU19NQVgtTVZfUEJJVFNfTUlOKzEpCisjZGVmaW5lIE1WX1BCSVRTX1NISUZUIDEzCisjZGVmaW5lIE1WX1BCSVRTX01BU0sgMHgwNworI2RlZmluZSBNVl9QQklUU19JTlZBTElEX1ZBTFVFIDB4RkYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXQU4gUG9ydCBTdGF0ZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9HRV9QT1JUX0lOQUNUSVZFID0gMCwKKyAgICBNVl9HRV9QT1JUX0FDVElWRSwKKyAgICBNVl9HRV9QT1JUX0lOVkFMSUQsCit9ICBNVl9HRV9QT1JUX1NUQVRFX0U7CisKKy8qIEVudW0gZm9yIHdlbGwga25vd24gVFBJRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTVZfVFBJRF84MTAwIDB4ODEwMAorI2RlZmluZSBNVl9UUElEXzg4QTggMHg4OEE4CisjZGVmaW5lIE1WX1RQSURfOTEwMCAweDkxMDAKKyNkZWZpbmUgTVZfQ1BIX1RQSURfTEVOICAgICAgKDIpCisjZGVmaW5lIE1WX0NQSF9WTEFOX1RBR19MRU4gICgyKQorI2RlZmluZSBNVl9DUEhfRVRIX1RZUEVfTEVOICAoMikKKyNkZWZpbmUgTVZfSVBWNF9QUk9UT19PRkZTRVQgKDkpCisjZGVmaW5lIE1WX0lDTVBWNl9UWVBFX01MRCAgICgxKQorI2RlZmluZSBNVl9DUEhfRVRIX1RZUEVfSVBWNCAoMHgwODAwKQorI2RlZmluZSBNVl9DUEhfRVRIX1RZUEVfSVBWNiAoMHg4NkREKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRQTSBTb3VyY2UgcG9ydCAtIHVzZWQgdG8gc3BlY2lmeSB0aHJvdWdoIHdoaWNoIHBvcnQgdGhlIHBhY2tldCBlbnRlcmVkIHRoZSBwcm9jZXNzb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICAgIFRQTV9TUkNfUE9SVF9VTklfMCwgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV8xLCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JXzIsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfMywgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV80LCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JXzUsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfNiwgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV83LCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JX1ZJUlQsICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9XQU4sICAgICAgICAgIC8qIGRvd25zdHJhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfQU5ZLCAgICAgIC8qIHVwc3RyZWFtIC0gYWxsIFVOSSBwb3J0cyAqLworICAgIFRQTV9TUkNfUE9SVF9XQU5fT1JfTEFOLCAgIC8qIEFueSBQb3J0LCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCAqLworICAgIFRQTV9TUkNfUE9SVF9JTExFR0FMID0gMHhGRgorfSB0cG1fc3JjX3BvcnRfdHlwZV90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayBBUEkgcmV0dXJuIHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmV0LCBsb2cpIFwKK3tcCisgICAgSU5UMzIgcmMgPSAwIDtcCisgICAgaWYoKHJjID0gKHJldCkpICE9IDApXAorICAgIHtcCisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXMoJWQpIGVycm9yOiVzICwgcmV0KCVkKVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgKGxvZyksIHJjKTtcCisgICAgICAgIHJldHVybiAocmMpIDtcCisgICAgfVwKK30KKworI2RlZmluZSBDUEhfVEJMX0VOVFJZX05VTShhKSAoc2l6ZW9mKGEpL3NpemVvZihhWzBdKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRW51bSBmb3IgZGlzcGxheQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSU5UMzIgIGVudW1fdmFsdWU7CisgICAgQ0hBUiAgKmVudW1fc3RyOworfSBNVl9FTlVNX0VOVFJZX1Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSU5UMzIgICAgICAgICAgICBlbnVtX251bTsKKyAgICBNVl9FTlVNX0VOVFJZX1QgKmVudW1fYXJyYXk7Cit9IE1WX0VOVU1fQVJSQVlfVDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVjbGFyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1pbmRleF90cG1fc3JjX3RvX2FwcF9wb3J0KCkKKyoKKyogREVTQ1JJUFRJT046Q29udmVydCBUUE0gc291cmNlIHBvcnQgdG8gYXBwbGljYXRpb24gVU5JIHBvcnQgCisqCisqIElOUFVUUzoKKyogICAgICAgc3JjX3BvcnQgICAgLSBUUE0gc291cmNlIHBvcnQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgQXBwbGljYXRpb24gVU5JIHBvcnQgaW5kZXgKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYXBwbGljYXRpb24gVU5JIHBvcnQgaW5kZXguIAorKiAgICAgICBPbiBlcnJvciByZXR1cm4gaW52YWxpZCBhcHBsaWNhdGlvbiBVTkkgcG9ydCBpbmRleC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9BUFBfRVRIX1BPUlRfVU5JX0UgbWluZGV4X3RwbV9zcmNfdG9fYXBwX3BvcnQodHBtX3NyY19wb3J0X3R5cGVfdCBzcmNfcG9ydCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWluZGV4X21oX3RvX2FwcF9sbGlkKCkKKyoKKyogREVTQ1JJUFRJT046Q29udmVydCBNYXJ2ZWxsIGhlYWRlciB0byBhcHBsaWNhdGlvbiBMTElEIAorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAtIE1hcnZlbGwgaGVhZGVyCisqCisqIE9VVFBVVFM6CisqICAgICAgIEFwcGxpY2F0aW9uIExMSUQKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYXBwbGljYXRpb24gTExJRC4gCisqICAgICAgIE9uIGVycm9yIHJldHVybiBpbnZhbGlkIGFwcGxpY2F0aW9uIExMSUQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVENPTlRfTExJRF9FIG1pbmRleF9taF90b19hcHBfbGxpZChVSU5UMTYgbWgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG10eXBlX2dldF9kaWdpdF9udW0oKQorKgorKiBERVNDUklQVElPTjpDb252ZXJ0IGNoYXJhY3RlciBzdHJpbmcgdG8gZGlnaXRhbCBudW1iZXIgCisqCisqIElOUFVUUzoKKyogICAgICAgc3RyICAgLSBDaGFyYWN0ZXIgc3RyaW5nCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRGlnaXRhbCBudW1iZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VJTlQzMiBtdHlwZV9nZXRfZGlnaXRfbnVtKGNvbnN0IENIQVIgICpzdHIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG10eXBlX2xvb2t1cF9lbnVtX3N0cigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBlbnVtIHN0cmluZyBhY2NvcmRpbmcgdG8gZW51bSB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBfZW51bV9hcnJheSAgIC0gUG9pbnRlciB0byBlbnVtIGFycmF5CisqICAgICAgIGVudW1fdmFsdWUgICAgIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqbXR5cGVfbG9va3VwX2VudW1fc3RyKE1WX0VOVU1fQVJSQVlfVCAqcF9lbnVtX2FycmF5LCBJTlQzMiBlbnVtX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdXRpbHNfaXNfZnJ3ZF9icm9hZGNhc3RfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046Q2hlY2sgd2hldGhlciBwYWNrZXQgaXMgZGlyZWN0bHkgZm9yd2FyZGVkIGJyb2FkY2FzdCBvbmUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkYXRhICAgLSBwYWNrZXQgZGF0YQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRSVUU6IGJyb2FkY2FzdCBwYWNrZXQsIEZBTFNFOm5vbmUgYnJvYWRjYXN0IHBhY2tldAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgbXV0aWxzX2lzX2Zyd2RfYnJvYWRjYXN0X3BhY2tldChjaGFyICpkYXRhKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX0lORlJBX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbW5nX2lmLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbW5nX2lmLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmNmYmQzZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9tbmdfaWYuaApAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9tbmdfaWYuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBtYW5hZ2VtZW50IGludGVyZmFjZSBkZWZpbml0aW9uCisqICAgICAgICAgICAgICBmb3IgaW9jdGwKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDExRGVjMjAxMQorKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4xCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX01OR19JRl9IXworI2RlZmluZSBfTVZfQ1BIX01OR19JRl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogSW5jbHVkZSBGaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisKKy8qIERlZmluaXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNVl9DUEhfSU9DVExfU0VUX0NPTVBMRVhfUFJPRklMRSAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMSwgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX1NFVF9GRUFUVVJFX0ZMQUcgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDIsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9BUFBfQUREX1JVTEUgICAgICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAzLCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfQVBQX0RFTF9SVUxFICAgICAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgNCwgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0FQUF9VUERBVEVfUlVMRSAgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDUsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9BUFBfR0VUX1JVTEUgICAgICAgICAgICAgX0lPUihNVl9DUEhfSU9DVExfTUFHSUMsICA2LCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfRkxPV19BRERfUlVMRSAgICAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgNywgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0ZMT1dfREVMX1JVTEUgICAgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDgsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9GTE9XX0dFVF9SVUxFICAgICAgICAgICAgX0lPUihNVl9DUEhfSU9DVExfTUFHSUMsICA5LCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfRkxPV19DTEVBUl9SVUxFICAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMTAsIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0ZMT1dfQ0xFQVJfUlVMRV9CWV9NSCAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDExLCBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9GTE9XX1NFVF9EU0NQX01BUCAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAxMiwgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfRkxPV19ERUxfRFNDUF9NQVAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMTMsIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX1NFVF9UQ09OVF9MTElEX1NUQVRFICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDE0LCBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9TRVRVUCAgICAgICAgICAgICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAxNSwgVUlOVDMyKQorCisvKiBUeXBlZGVmcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtOyAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgcGFyc2Vfa2V5OyAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibTsgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgIG1vZF92YWx1ZTsgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm07IAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICBmcndkX3ZhbHVlOworCit9IENQSF9JT0NUTF9BUFBfUlVMRV9UOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENQSF9GTE9XX0VOVFJZX1QgZmxvd19tYXA7Cit9IENQSF9JT0NUTF9GTE9XX01BUF9UOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENQSF9EU0NQX1BCSVRTX1QgZHNjcF9tYXA7Cit9IENQSF9JT0NUTF9EU0NQX01BUF9UOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgcHJvZmlsZV9pZDsKKyAgICBNVl9BUFBfR01BQ19QT1JUX0UgICAgICAgIGFjdGl2ZV9wb3J0OworICAgIENQSF9BUFBfRkVBVFVSRV9FICAgICAgICAgZmVhdHVyZV90eXBlOworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9mbGFnOyAKK30gQ1BIX0lPQ1RMX01JU0NfVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMzIgIHRjb250OworICAgIEJPT0wgICAgc3RhdGU7Cit9IENQSF9JT0NUTF9UQ09OVF9TVEFURV9UOworCisvKiBNViBDUEggQ2hhciBEZXZpY2UgU3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICBDUEhfSU9DVExfQVBQX1JVTEVfVCAgICBjcGhfaW9jdGxfYXBwX3J1bGU7CisgIENQSF9JT0NUTF9GTE9XX01BUF9UICAgIGNwaF9pb2N0bF9mbG93X21hcDsKKyAgQ1BIX0lPQ1RMX0RTQ1BfTUFQX1QgICAgY3BoX2lvY3RsX2RzY3BfbWFwOworICBDUEhfSU9DVExfTUlTQ19UICAgICAgICBjcGhfaW9jdGxfbWlzYzsKKyAgQ1BIX0lPQ1RMX1RDT05UX1NUQVRFX1QgY3BoX2lvY3RsX3Rjb250OworCisgIHN0cnVjdCBjZGV2ICAgICAgICAgICAgIGNkZXY7ICAKK30gQ1BIX0NERVZfVDsKKworLyogR2xvYmFsIHZhcmlhYmxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR2xvYmFsIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfTU5HX0lGX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbW9kLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWViZTMxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9tb2QuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9tb2QuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBtb2R1bGUgZGVmaW5pdGlvbiAKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKyNkZWZpbmUgQ1BIX01PRFVMRV9WRVJTSU9OICAiMjItSmFuLTIwMTMiCisjZGVmaW5lIENQSF9NT0RVTEVfREVTQyAgICAgIk1hcnZlbGwgQ1BVIFBhY2tldCBIYW5kbGVyIE1vZHVsZSIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfbW9kX2V4aXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRXhpdCBmcm9tIENQSCBtb2R1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVk9JRCBfX2V4aXQgY3BoX21vZF9leGl0KFZPSUQpCit7CisgICAgY3BoX2Rldl9zaHV0ZG93bigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9tb2RfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBtb2R1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVDMyIF9faW5pdCBjcGhfbW9kX2luaXQoVk9JRCkKK3sKKyAgICBpZiAoY3BoX2Rldl9pbml0KCkgIT0gMCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG5DUEggbW9kdWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCBcblxuIik7CisgICAgICAgIHJldHVybiBNVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBwcmludGsoS0VSTl9JTkZPICJcbkNQSCBtb2R1bGUgaW5zZXJ0ZWQgLSAlc1xuXG4iLCBDUEhfTU9EVUxFX1ZFUlNJT04pOyAqLworCisgICAgcmV0dXJuIE1WX09LOworfQorCitkZXZpY2VfaW5pdGNhbGxfc3luYyhjcGhfbW9kX2luaXQpOworCittb2R1bGVfZXhpdChjcGhfbW9kX2V4aXQpOworCitNT0RVTEVfQVVUSE9SICgiVmljdG9yIEd1Iik7CitNT0RVTEVfVkVSU0lPTiAoQ1BIX01PRFVMRV9WRVJTSU9OKTsKK01PRFVMRV9ERVNDUklQVElPTiAoQ1BIX01PRFVMRV9ERVNDKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbmV0ZGV2LmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbmV0ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODgzNjIwYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9uZXRkZXYuYwpAQCAtMCwwICsxLDg4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9uZXRkZXYuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBuZXR3b3JrIGRldmljZSBwYXJ0IGRlZmluaXRpb24gCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKworI2luY2x1ZGUgPGN0cmxFbnYvbXZDdHJsRW52TGliLmg+CisKKyNpbmNsdWRlICJtdkRlYnVnLmgiCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIERlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUb3RhbCBFdGggcG9ydCBudW1iZXIgKi8KK3N0YXRpYyBJTlQzMiBnc19tdl9ldGhfcG9ydF9udW0gPSAwOworCisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFCitzdGF0aWMgc3RydWN0IG12X3BvcnRfdHhfc3BlYyAgICB1ZHBfcG9ydF9zcGVjX2NmZ1tDT05GSUdfTVZfRVRIX1BPUlRTX05VTV07CisjZGVmaW5lIFBPUlRfRU5UUklFUyAgICAgICAgQ1BIX1RCTF9FTlRSWV9OVU0odWRwX3BvcnRfc3BlY19jZmcpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBEZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBJTlQzMiBjcGhfZGF0YV9mbG93X3R4KElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIG1oLCBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9yZWNfc2tiKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNlbmQgU0tCIHBhY2tldCB0byBsaW51eCBuZXR3b3JrIGFuZCBpbmNyZXNlIGNvdW50ZXIgIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIHNrYiAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCBjcGhfcmVjX3NrYihJTlQzMiBwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgIFVJTlQzMiByeF9zdGF0dXMgICAgPSAwOworICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBOVUxMOworCisgICAgcnhfc3RhdHVzID0gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKyAgICBwcCAgICAgICAgPSBtdl9ldGhfcG9ydF9ieV9pZChwb3J0KTsKKyAgICBTVEFUX0RCRyhpZiAocnhfc3RhdHVzKSAocHAtPnN0YXRzLnJ4X2Ryb3Bfc3crKykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFja2V0X3J4KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VpdmVkIGFwcGxpY2F0aW9uIHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogICAgICAgcnhfZGVzYyAtIFJYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UMzIgY3BoX2FwcF9wYWNrZXRfcngoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKK3sKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0gPSAwOworICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICBwYXJzZV9rZXk7CisgICAgSU5UMzIgICAgICAgICAgICAgICAgIHJjICAgICAgID0gTVZfT0s7CisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSAgID0gMDsKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgbW9kX3ZhbHVlOyAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSAgPSAwOyAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgZnJ3ZF92YWx1ZTsKKyAgICBCT09MICAgICAgICAgICAgICAgICAgc3RhdGUgICAgPSBGQUxTRTsgICAgCisKKyAgICAvKiBDaGVjayB3aGV0aGVyIG5lZWQgdG8gaGFuZGxlIGdlbmVyaWMgYXBwbGljYXRpb24gcGFja2V0ICovCisgICAgY3BoX2RiX2dldF9wYXJhbShDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQsICZzdGF0ZSk7CisgICAgaWYgKHN0YXRlID09IEZBTFNFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1lbXNldCgmcGFyc2Vfa2V5LCAgMCwgc2l6ZW9mKHBhcnNlX2tleSkpOworICAgIG1lbXNldCgmbW9kX3ZhbHVlLCAgMCwgc2l6ZW9mKG1vZF92YWx1ZSkpOworICAgIG1lbXNldCgmZnJ3ZF92YWx1ZSwgMCwgc2l6ZW9mKGZyd2RfdmFsdWUpKTsgICAgCisKKyAgICAvKiBQYXJzZSBhcHBsaWNhdGlvbiBwYWNrZXQgKi8KKyAgICByYyA9IGNwaF9hcHBfcGFyc2VfcGFja2V0KHBvcnQsIHNrYi0+ZGF0YSwgJnBhcnNlX2JtLCAmcGFyc2Vfa2V5KTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9wYXJzZV9wYWNrZXQsIHJjKCVkKVxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBHZXQgQ1BIIGFwcGxpY2F0aW9uIHJ1bGUgKi8KKyAgICByYyA9IGNwaF9hcHBfZ2V0X3J1bGUocGFyc2VfYm0sICZwYXJzZV9rZXksICZtb2RfYm0sICZtb2RfdmFsdWUsICZmcndkX2JtLCAmZnJ3ZF92YWx1ZSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9nZXRfcnVsZSwgcmMoJWQpXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEluY3JlYXNlIGNvdW50ZXIgKi8KKyAgICByYyA9IGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcihwYXJzZV9ibSwgJnBhcnNlX2tleSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbCB0byBjYWxsIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlciwgcmMoJWQpXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEFwcGx5IG1vZGlmaWNhdGlvbiAqLworICAgIHJjID0gY3BoX2FwcF9tb2RfcnhfcGFja2V0KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjLCBtb2RfYm0sICZtb2RfdmFsdWUpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX21vZF9yeF9wYWNrZXQsIHJjKCVkKVxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgLyogU2VuZCB0byBMaW51eCBOZXR3b3JrIFN0YWNrICovCisgICAgY3BoX3JlY19za2IocG9ydCwgc2tiKTsKKworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFja2V0X3R4KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRyYXNtaXRpbmcgYXBwbGljYXRpb24gcGFja2V0cyAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgICAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHNrYiAgICAgICAgIC0gU0tCIGJ1ZmZlciB0byByZWNlaXZlIHBhY2tldAorKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfYXBwX3BhY2tldF90eChJTlQzMiBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCit7CisgICAgQ1BIX0RJUl9FICAgICAgICAgICAgIGRpcjsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgcHJvdG9fdHlwZSA9IDA7CisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtICAgPSAwOworICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICBwYXJzZV9rZXk7ICAgICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtICAgICA9IDA7CisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgIG1vZF92YWx1ZTsgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0gICAgPSAwOyAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgZnJ3ZF92YWx1ZTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgcmMgICAgICAgICA9IE1WX09LOworICAgIEJPT0wgICAgICAgICAgICAgICAgICBzdGF0ZSAgICAgID0gRkFMU0U7ICAgIAorCisgICAgLyogQ2hlY2sgd2hldGhlciBuZWVkIHRvIGhhbmRsZSBnZW5lcmljIGFwcGxpY2F0aW9uIHBhY2tldCAqLworICAgIGNwaF9kYl9nZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0FQUF9TVVBQT1JULCAmc3RhdGUpOworICAgIGlmIChzdGF0ZSA9PSBGQUxTRSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1zZXQoJnBhcnNlX2tleSwgIDAsIHNpemVvZihwYXJzZV9rZXkpKTsKKyAgICBtZW1zZXQoJm1vZF92YWx1ZSwgIDAsIHNpemVvZihtb2RfdmFsdWUpKTsKKyAgICBtZW1zZXQoJmZyd2RfdmFsdWUsIDAsIHNpemVvZihmcndkX3ZhbHVlKSk7ICAgIAorICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKKyAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IDA7CisKKyAgICAvKiBHZXQgZGlyZWN0aW9uIG9mIHBhY2tldCAqLworICAgIGRpciA9IGNwaF9hcHBfcGFyc2VfZGlyKHBvcnQsIEZBTFNFKTsKKyAgICBpZihkaXIgPT0gQ1BIX0RJUl9JTlZBTElEKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJkaXJbJWRdIGlzIGludmFsaWQgXG4iLCBkaXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9ICAgCisgICAgCisgICAgLyogR2V0IHRoZSBwcm90b2NvbCB0eXBlIGFwcGxpY2F0aW9uIHBhY2tldCAqLworICAgIHByb3RvX3R5cGUgPSBza2ItPnByb3RvY29sOworCisgICAgLyogR2V0IENQSCBhcHBsaWNhdGlvbiBydWxlIGJ5IHByb3RvY29sIHR5cGUgKi8KKyAgICByYyA9IGNwaF9hcHBfZ2V0X3J1bGVfYnlfZGlyX3Byb3RvKGRpciwgcHJvdG9fdHlwZSwgJnBhcnNlX2JtLCAmcGFyc2Vfa2V5LCAmbW9kX2JtLCAmbW9kX3ZhbHVlLCAmZnJ3ZF9ibSwgJmZyd2RfdmFsdWUpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAiRmFpbCB0byBjYWxsIGNwaF9hcHBfZ2V0X3J1bGVfYnlfZGlyX3Byb3RvXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogSW5jcmVhc2UgY291bnRlciAqLworICAgIHJjID0gY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byhkaXIsIHByb3RvX3R5cGUpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvLCByYyglZClcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogU2VwY2lhbCBoYW5kbGluZyBmb3IgSUdNUCBhbmQgTUxEICovCisgICAgaWYgKCgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSkgJiYgCisgICAgICAgIChwYXJzZV9rZXkuaXB2NF90eXBlID09IE1WX0lQX1BST1RPX0lHTVApKSAgfHwKKyAgICAgICAgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpICYmIAorICAgICAgICAocGFyc2Vfa2V5LmljbXB2Nl90eXBlID09IE1WX0lDTVBWNl9UWVBFX01MRCkpKQorICAgIHsKKyAgICAgICAgaWYgKGNwaF9kYXRhX2Zsb3dfdHgocG9ydCwgZGV2LCBza2IsIFRSVUUsIHR4X3NwZWNfb3V0KSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIEFwcGx5IG1vZGlmaWNhdGlvbiBhbmQgc2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8KKyAgICByYyA9IGNwaF9hcHBfbW9kX3R4X3BhY2tldChza2IsIHR4X3NwZWNfb3V0LCBtb2RfYm0sICZtb2RfdmFsdWUpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX21vZF90eF9wYWNrZXQsIHJjKCVkKVxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBTZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiAqLworICAgIHJjID0gY3BoX2FwcF9zZXRfZnJ3ZChza2IsIHR4X3NwZWNfb3V0LCBmcndkX2JtLCAmZnJ3ZF92YWx1ZSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbCB0byBjYWxsIGNwaF9hcHBfc2V0X2Zyd2QsIHJjKCVkKVxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcGhfY29weV90eF9zcGVjKHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqIHR4X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZsYWdzLCB1aW50MzJfdCBod19jbWQpCit7CisgICAgdHhfc3BlYy0+dHhwID0gdHhwOworICAgIHR4X3NwZWMtPnR4cSA9IHR4cTsKKyAgICB0eF9zcGVjLT5od19jbWQgPSBod19jbWQ7CisgICAgdHhfc3BlYy0+ZmxhZ3MgPSBmbGFnczsKK30KKworaW50IGNwaF91ZHBfc3BlY19wcmludChpbnQgcG9ydCkKK3sKKyAgICBJTlQzMiBpOworICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZChwb3J0KTsKKyAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NwZWM7CisKKyAgICBpZiAoIXBwKQorICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworICAgIHVkcF9zcGVjID0gJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0WzBdKTsKKworICAgIHByaW50aygiXG4qKioqIHBvcnQgIyVkIC0gVFggVURQIERlc3QgUG9ydCBjb25maWd1cmF0aW9uICoqKioqXG4iLCBwb3J0KTsKKyAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIHByaW50aygiSUQgdWRwX2RzdCAgIHR4cCAgICB0eHEgICAgZmxhZ3MgICAgaHdfY21kICAgICBmdW5jX2FkZFxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFswXSk7IGkrKykgeworICAgICAgICBpZiAodWRwX3NwZWNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKQorICAgICAgICAgICAgcHJpbnRrKCIlMmQgICAlMDRkICAgICAgJWQgICAgICAlZCAgICAgMHglMDR4ICAgMHglMDh4ICAgMHglcFxuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBudG9ocyh1ZHBfc3BlY1tpXS51ZHBfcG9ydCksCisgICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eHAsIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxLAorICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MsIHVkcF9zcGVjW2ldLnR4X3NwZWMuaHdfY21kLAorICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhfZnVuYyk7CisgICAgfQorICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisgICAgdWRwX3NwZWMgPSAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbMF0pOworCisgICAgcHJpbnRrKCIqKioqIHBvcnQgIyVkIC0gVFggVURQIFNvdXJjZSBQb3J0IGNvbmZpZ3VyYXRpb24gKioqKipcbiIsIHBvcnQpOworICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIHByaW50aygiSUQgdWRwX3NyYyAgIHR4cCAgICB0eHEgICAgIGZsYWdzICAgIGh3X2NtZCAgICAgZnVuY19hZGRcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyYykvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbMF0pOyBpKyspIHsKKyAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkKKyAgICAgICAgICAgIHByaW50aygiJTJkICAgJTA0ZCAgICAgICVkICAgICAgJWQgICAgIDB4JTA0eCAgIDB4JTA4eCAgIDB4JXBcbiIsCisgICAgICAgICAgICAgICAgICAgaSwgbnRvaHModWRwX3NwZWNbaV0udWRwX3BvcnQpLAorICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhwLCB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSwKKyAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLmZsYWdzLCB1ZHBfc3BlY1tpXS50eF9zcGVjLmh3X2NtZCwKKyAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4X2Z1bmMpOworICAgIH0KKyAgICBwcmludGsoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgY3BoX3VkcF9zcGVjX3ByaW50X2FsbCh2b2lkKQoreworICAgIElOVDMyIHBvcnQ7CisKKyAgICBmb3IgKHBvcnQ9MDtwb3J0IDwgQ09ORklHX01WX0VUSF9QT1JUU19OVU0gO3BvcnQrKykgeworICAgICAgICBjcGhfdWRwX3NwZWNfcHJpbnQocG9ydCk7CisgICAgfQorfQorCitNVl9TVEFUVVMgIGNwaF91ZHBfaW50X3NwZWNfc2V0KHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjICp1ZHBfc3BlYywgdWludDE2X3QgdWRwX3BvcnQsIElOVDMyIHRhYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsIHVpbnQxNl90IGZsYWdzLCB1aW50MzJfdCBod19jbWQpCit7CisgICAgSU5UMzIgaTsKKworICAgIC8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RzICovCisgICAgZm9yIChpPTA7IGkgPCB0YWJsZV9zaXplO2krKykgeworICAgICAgICBpZiAodWRwX3NwZWNbaV0udWRwX3BvcnQgPT0gaHRvbnModWRwX3BvcnQpICYmCisgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIGNwaF9jb3B5X3R4X3NwZWMoJih1ZHBfc3BlY1tpXS50eF9zcGVjKSwgdHhwLCB0eHEsIGZsYWdzLCBod19jbWQpOworICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIGVtcHR5ICovCisgICAgZm9yIChpPTA7IGkgPCB0YWJsZV9zaXplO2krKykgeworICAgICAgICBpZiAodWRwX3NwZWNbaV0udHhfc3BlYy50eHEgPT0gTVZfRVRIX1RYUV9JTlZBTElEKSB7CisgICAgICAgICAgICB1ZHBfc3BlY1tpXS51ZHBfcG9ydCA9IGh0b25zKHVkcF9wb3J0KTsKKyAgICAgICAgICAgIGNwaF9jb3B5X3R4X3NwZWMoJih1ZHBfc3BlY1tpXS50eF9zcGVjKSwgdHhwLCB0eHEsIGZsYWdzLCBod19jbWQpOworICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKE1WX0ZVTEwpOworfQorCisKK01WX1NUQVRVUyAgY3BoX3VkcF9zcmNfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9zcmNfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQoreworICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZCh0eF9wb3J0KTsKKyAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NyY19zcGVjID0gdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyYzsKKyAgICBNVl9TVEFUVVMgbXZfc3RhdHVzOworCisgICAgaWYgKCFwcCkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBtdl9zdGF0dXMgPSBjcGhfdWRwX2ludF9zcGVjX3NldCh1ZHBfc3JjX3NwZWMsIHVkcF9zcmNfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhwLCB0eHEsIGZsYWdzLCBod19jbWQpOworCisgICAgaWYgKG12X3N0YXR1cyAhPSBNVl9PSykKKyAgICAgICAgcHJpbnRrKCIlczogVURQIFNwZWNpYWwgU291cmNlIFBvcnQgVGFibGUgaXMgZnVsbFxuIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuKG12X3N0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKGNwaF91ZHBfc3JjX3NwZWNfc2V0KTsKKworCitNVl9TVEFUVVMgIGNwaF91ZHBfZGVzdF9zcGVjX3NldChpbnQgdHhfcG9ydCwgdWludDE2X3QgdWRwX2Rlc3RfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQoreworICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZCh0eF9wb3J0KTsKKyAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX2RzdF9zcGVjID0gdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdDsKKyAgICBNVl9TVEFUVVMgbXZfc3RhdHVzOworCisgICAgaWYgKCFwcCkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBtdl9zdGF0dXMgPSBjcGhfdWRwX2ludF9zcGVjX3NldCh1ZHBfZHN0X3NwZWMsIHVkcF9kZXN0X3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKKworICAgIGlmIChtdl9zdGF0dXMgIT0gTVZfT0spCisgICAgICAgIHByaW50aygiJXM6IFVEUCBTcGVjaWFsIERlc3QuIFBvcnQgVGFibGUgaXMgZnVsbFxuIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuKG12X3N0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKGNwaF91ZHBfZGVzdF9zcGVjX3NldCk7CisKKwordm9pZCAgY3BoX3VkcF90YWJsZV9pbml0KHZvaWQpCit7CisgICAgSU5UMzIgbnVtX3BvcnRzID0gUE9SVF9FTlRSSUVTOworICAgIElOVDMyIHR4X3BvcnQsIGk7CisKKyAgICBpZiAobnVtX3BvcnRzID4gZ3NfbXZfZXRoX3BvcnRfbnVtKQorICAgICAgICBudW1fcG9ydHMgPSBnc19tdl9ldGhfcG9ydF9udW07CisKKworICAgIGZvciAodHhfcG9ydD0wOyB0eF9wb3J0PG51bV9wb3J0czt0eF9wb3J0KyspIHsKKworICAgICAgICAvKiBJbnZhbGlkYXRlIFVEUCBEZXN0IHBvcnRzLCBzZXQgdHhxPWludmFsaWQgICovCisgICAgICAgIGZvciAoaT0wO2k8KHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFswXSkpO2krKykgeworICAgICAgICAgICAgbWVtc2V0KCYodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFtpXSksIDAsIHNpemVvZihzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYykpOworICAgICAgICAgICAgdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFtpXS50eF9zcGVjLnR4cSA9IE1WX0VUSF9UWFFfSU5WQUxJRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEludmFsaWRhdGUgVURQIFNvdXJjZSBwb3J0cywgLCBzZXQgdHhxPWludmFsaWQgKi8KKyAgICAgICAgZm9yIChpPTA7aTwoc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjWzBdKSk7aSsrKSB7CisgICAgICAgICAgICBtZW1zZXQoJih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjW2ldKSwgMCwgc2l6ZW9mKHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjKSk7CisgICAgICAgICAgICB1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMudHhxID0gTVZfRVRIX1RYUV9JTlZBTElEOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuOworfQorCitpbnQgY3BoX3VkcF9wb3J0X3R4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKK3sKKyAgICBzdHJ1Y3QgaXBoZHIgICppcGhkcnAgICA9IE5VTEw7CisgICAgc3RydWN0IHVkcGhkciAqdWRwaGRycCAgPSBOVUxMOworICAgIElOVDMyIGk7CisKKyAgICBpZiAocG9ydCA+IENPTkZJR19NVl9FVEhfUE9SVFNfTlVNKSB7CisgICAgICAgIHByaW50aygiUG9ydCBFcnJvclxuIik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBpZiAoc2tiLT5wcm90b2NvbCA9PSBNVl9DUEhfRVRIX1RZUEVfSVBWNCkgeworICAgICAgICAvKiBHZXQgVURQIFBvcnQgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjIpCisgICAgaXBoZHJwID0gc2tiLT5uaC5pcGg7CisjZWxzZQorICAgIGlwaGRycCA9IGlwX2hkcihza2IpOworI2VuZGlmCisKKyAgICAgICAgaWYgKChpcGhkcnApICYmIChpcGhkcnAtPnByb3RvY29sID09IElQUFJPVE9fVURQKSkgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKKyAgICAgICAgdWRwaGRycCA9IHNrYi0+aC51aDsKKyNlbHNlCisgICAgICAgIHVkcGhkcnAgPSB1ZHBfaGRyKHNrYik7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICh1ZHBoZHJwKSB7CisgICAgICAgICAgICAgICAgaWYgKHVkcGhkcnAgPT0gKHN0cnVjdCB1ZHBoZHIgKilpcGhkcnApIHsKKyAgICAgICAgICAgICAgICAgICAgdWRwaGRycCA9IChzdHJ1Y3QgdWRwaGRyICopKChjaGFyICopdWRwaGRycCArICg0KihpcGhkcnAtPmlobCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRmluZCBjb25maWd1cmVkIFVEUCBTb3VyY2UgUG9ydCovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyYykvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbMF0pO2krKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHVkcGhkcnAtPnNvdXJjZSA9PSB1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjW2ldLnVkcF9wb3J0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5ICh0eF9zcGVjX291dCwgJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMpLCBzaXplb2Yoc3RydWN0IG12X2V0aF90eF9zcGVjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiZm91bmQgdWRwX3NyYyAweCglMDR4KVxuIiwgbnRvaHModWRwaGRycC0+c291cmNlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBGaW5kIGNvbmZpZ3VyZWQgVURQIERlc3QuIFBvcnQqLworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3QpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0WzBdKTtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1ZHBoZHJwLT5kZXN0ID09IHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbaV0udWRwX3BvcnQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKHR4X3NwZWNfb3V0LCAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbaV0udHhfc3BlYyksIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJmb3VuZCB1ZHBfZHN0IDB4KCUwNHgpXG4iLCBudG9ocyh1ZHBoZHJwLT5kZXN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSB7CisgICAgICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgVURQLCB1ZHAgc291cmNlIG9yIGRlc3QgcG9ydCBub3QgZm91bmQgdWRwX3NyYygleCl4IHVkcF9kc3QoJXgpeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHVkcGhkcnAtPnNvdXJjZSksIG50b2hzKHVkcGhkcnAtPmRlc3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocG9ydCA9PSBNVl9QT05fUE9SVF9JRCApCisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiTk9UIFVEUCwgaXBfcHJvdG8oJWQpIFxuIiwgaXBoZHJwLT5wcm90b2NvbCk7CisgICAgfQorICAgIGVsc2UgaWYgKHBvcnQgPT0gTVZfUE9OX1BPUlRfSUQpCisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJOT1QgSVAsIHByb3RvKCVkKSBcbiIsIHNrYi0+cHJvdG9jb2wpOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RhdGFfZmxvd19yeCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBhcHBsaWNhdGlvbiBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHNrYiAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIHJ4X2Rlc2MgLSBSWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVDMyIGNwaF9kYXRhX2Zsb3dfcngoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKK3sKKyAgICBDUEhfRkxPV19FTlRSWV9UIGZsb3dfcnVsZTsKKyAgICBJTlQzMiAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgQk9PTCAgICAgICAgICAgICBzdGF0ZSAgPSBGQUxTRTsKKyAgICBNVl9TVEFUVVMgICAgICAgIHJjICAgICA9IE1WX09LOworCisgICAgaWYgKE1WX1BPTl9QT1JUX0lEICE9IHBvcnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgY3BoX2RiX2dldF9wYXJhbShDUEhfREJfUEFSQU1fRkxPV19TVVBQT1JULCAmc3RhdGUpOworICAgIAorICAgIGlmIChzdGF0ZSA9PSBUUlVFKSAKKyAgICB7CisgICAgICAgIC8qIFBhcnNlIHBhY2tldHMgKi8KKyAgICAgICAgcmMgPSBjcGhfZmxvd19wYXJzZV9wYWNrZXQocG9ydCwgc2tiLT5kYXRhLCBUUlVFLCBUUlVFLCAmZmxvd19ydWxlKTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X3BhcnNlX3BhY2tldCwgcmMoJWQpIFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogR2V0IE5vbmUgZGVmYXVsdCBDUEggZGF0YSBmbG93IHJ1bGUgYXQgZmlyc3QgKi8KKyAgICAgICAgZmxvd19ydWxlLmlzX2RlZmF1bHQgPSBGQUxTRTsKKyAgICAgICAgcmMgPSBjcGhfZmxvd19nZXRfcnVsZSgmZmxvd19ydWxlKTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBHZXQgZGVmYXVsdCBDUEggZGF0YSBmbG93IHJ1bGUgc2Vjb25kbHkgKi8KKyAgICAgICAgICAgIGZsb3dfcnVsZS5pc19kZWZhdWx0ID0gVFJVRTsKKyAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG1vZGlmeSBwYWNrZXQgKi8KKyAgICAgICAgcmMgPSBjcGhfZmxvd19tb2RfcGFja2V0KHNrYiwgVFJVRSwgJmZsb3dfcnVsZSwgJm9mZnNldCk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpOmZhaWwgdG8gY2FsbCBjcGhfZmxvd19tb2RfcnhfcGFja2V0LCByYyglZCkgXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RhdGFfZmxvd190eCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB0cmFzbWl0aW5nIGFwcGxpY2F0aW9uIHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBza2IgICAgICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogICAgICAgbWggICAgICAgICAgLSBXaGV0aGVyIGhhcyBtYXJ2ZWxsIGhlYWRlcgorKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZGF0YV9mbG93X3R4KElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgbWgsIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCit7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCBmbG93X3J1bGU7CisgICAgSU5UMzIgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgIEJPT0wgICAgICAgICAgICAgbF9taDsKKyAgICBCT09MICAgICAgICAgICAgIHN0YXRlICA9IEZBTFNFOworICAgIE1WX1NUQVRVUyAgICAgICAgcmMgICAgID0gTVZfT0s7CisKKyAgICBpZiAoTVZfUE9OX1BPUlRfSUQgIT0gcG9ydCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjcGhfZGJfZ2V0X3BhcmFtKENQSF9EQl9QQVJBTV9GTE9XX1NVUFBPUlQsICZzdGF0ZSk7CisgICAgCisgICAgaWYgKHN0YXRlID09IFRSVUUpIAorICAgIHsKKyAgICAgICAgLyogRGVjaWRlIHdoZXRoZXIgbmVlZCB0byBoYW5kbGUgTWFydmVsbCBoZWFkZXIgKi8KKyAgICAgICAgbF9taCA9IG1oOworICAgICAgICBpZiAoVFJVRSA9PSBtdXRpbHNfaXNfZnJ3ZF9icm9hZGNhc3RfcGFja2V0KHNrYi0+ZGF0YSkpCisgICAgICAgICAgICAgIGxfbWggPSBUUlVFOworCisgICAgICAgIC8qIFBhcnNlIHBhY2tldHMgKi8KKyAgICAgICAgcmMgPSBjcGhfZmxvd19wYXJzZV9wYWNrZXQocG9ydCwgc2tiLT5kYXRhLCBGQUxTRSwgbF9taCwgJmZsb3dfcnVsZSk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpOmZhaWwgdG8gY2FsbCBjcGhfZmxvd19wYXJzZV9wYWNrZXQsIHJjPCVkPiBcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgQ1BIIGRhdGEgZmxvdyBydWxlICovCisgICAgICAgIGZsb3dfcnVsZS5pc19kZWZhdWx0ID0gRkFMU0U7CisgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgLyogSGFuZGxlIG11bHRpY2F0IHBhY2tldHMgYXMgdW5pY2FzdCBvbmUgKi8KKyAgICAgICAgICAgIGlmIChmbG93X3J1bGUucGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NQ19QUk9UTykgeworICAgICAgICAgICAgICAgIGZsb3dfcnVsZS5wYXJzZV9ibSAmPSB+Q1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE87CisgICAgICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19nZXRfcnVsZV9ieV92aWQoJmZsb3dfcnVsZSk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19nZXRfcnVsZSgmZmxvd19ydWxlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfcnVsZS5pc19kZWZhdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X2dldF9ydWxlLCByYzwlZD4gXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgZmxvd19ydWxlLmlzX2RlZmF1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X2dldF9ydWxlLCByYzwlZD4gXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogbW9kaWZ5IHBhY2tldCAqLworICAgICAgICByYyA9IGNwaF9mbG93X21vZF9wYWNrZXQoc2tiLCBsX21oLCAmZmxvd19ydWxlLCAmb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X21vZF9yeF9wYWNrZXQsIHJjPCVkPiBcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBTdHJpcCBUWCBNSCAqLworICAgICAgICBpZiAoVFJVRSA9PSBsX21oKSAKKyAgICAgICAgeworICAgICAgICAgICAgc2tiLT5kYXRhICArPSBNVl9FVEhfTUhfU0laRTsKKyAgICAgICAgICAgIHNrYi0+bGVuICAgLT0gTVZfRVRIX01IX1NJWkU7CisgICAgICAgIH0KKworICAgICAgICAvKiBtb2RpZnkgcGFja2V0ICovCisgICAgICAgIHJjID0gY3BoX2Zsb3dfbW9kX2Zyd2QoJmZsb3dfcnVsZSwgdHhfc3BlY19vdXQpOworICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKTpmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfbW9kX2Zyd2QsIHJjPCVkPiBcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3J4X2Z1bmMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZWQgc3BlY2lhbCBwYWNrZXRzIAorKiAgICAgICAgICAgICAgZnJvbSBuZXR3b3JrIGRyaXZlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIHJ4cSAgICAgLSBDUFUgcmVjZWl2ZWQgcXVldWUKKyogICAgICAgZGV2ICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgcGt0ICAgICAtIE1hcnZlbGwgcGFja2V0IGluZm9ybWF0aW9uCisqICAgICAgIHJ4X2Rlc2MgLSBSWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjcGhfcnhfZnVuYyhpbnQgcG9ydCwgaW50IHJ4cSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGV0aF9wYnVmICpwa3QsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCit7CisgICAgVUlOVDMyIGlkeCAgICA9IDA7CisgICAgSU5UMzIgIG9mZnNldCA9IDA7CisgICAgVUlOVDggIGJ1ZmZbNTEyXTsKKworICAgIE1WX0NQSF9DTEVBTl9QUklOVChDUEhfREVCVUdfTEVWRUwsICJcbiIpOworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJFbnRlclxuIik7CisKKyAgICBpZiAoZGV2ID09IE5VTEwgfHwgcGt0ID09IE5VTEwgfHwgcnhfZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIHByaW50aygiJXM6IE5VTEwgUG9pbnRlciBkZXYoJXApIHBrdCglcCkgcnhfZGVzYyglcClcbiIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGV2LCBwa3QsIHJ4X2Rlc2MpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJ4X2Rlc2MtPnBuY0luZm8gJiBORVRBX1BOQ19SWF9TUEVDSUFMKQorICAgIHsKKyAgICAgICAgLyogUmVjZWl2ZSBhcHBsaWNhdGlvbiBwYWNrZXRzICovCisgICAgICAgIGlmIChjcGhfYXBwX3BhY2tldF9yeChwb3J0LCBkZXYsIChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyksIHJ4X2Rlc2MpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLyogSGFuZGxlIHRoZSBicm9hZGNhc3QgcGFja2V0IGluIGNhc2UgaXQgaXMgZW5hYmxlZCAqLworI2lmZGVmIENPTkZJR19NVl9DUEhfQkNfSEFORExFCisgICAgICAgIGlmIChjcGhfYXBwX3J4X2JjKHBvcnQsIGRldiwgcGt0LCByeF9kZXNjKSkKKyAgICAgICAgICAgIHJldHVybjsKKyNlbmRpZiAKKworICAgICAgICAvKiBEb2VzIG5vdCBtYXRjaCB3aXRoIENQSCBhcHBsaWNhdGlvbiBydWxlcyAqLworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiU3BlY2lhbCBwa3QgYXJyaXZlZCBmcm9tIHBvcnQoJWQpLCB3YXMgbm90IGhhbmRsZWQuIFxuIiwgcG9ydCk7CisgICAgICAgIGRldl9rZnJlZV9za2JfYW55KChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbykpOyAgCisgICAgICAgIE1WX0NQSF9DTEVBTl9QUklOVChDUEhfREVCVUdfTEVWRUwsICJJbnB1dCBQYWNrZXQgZmlyc3QgMjQgYnl0ZXM6XG4iKTsKKyAgICAgICAgbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZihidWZmKSk7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgNDg7IGlkeCsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZihidWZmK29mZnNldCwgIiUwMnggIiwgKigoKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKSktPmRhdGEgKyBpZHgpKTsKKyAgICAgICAgfQorICAgICAgICBNVl9DUEhfQ0xFQU5fUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAgIiVzXG4iLCBidWZmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiBIYW5kbGUgcmVjZWl2ZWQgZGF0YSBmbG93IHBhY2tldHMgKi8KKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorICAgICAgICBpZiAoY3BoX2RhdGFfZmxvd19yeChwb3J0LCBkZXYsIChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyksIHJ4X2Rlc2MpKSB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiRmxvdyBtYXBwaW5nXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3R4X2Z1bmMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0cmFubWl0dGluZyBzcGVjaWFsIHBhY2tldHMgCisqICAgICAgICAgICAgICB0byBuZXR3b3JrIGRyaXZlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF90eF9mdW5jKElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQoreworICAgIC8qIFRyYW5zbWl0IGFwcGxpY2F0aW9uIHBhY2tldHMgKi8KKyAgICBpZiAoY3BoX2FwcF9wYWNrZXRfdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBUcmFuc21pdCBkYXRhIGZsb3cgcGFja2V0cyAqLworI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgaWYgKGNwaF9kYXRhX2Zsb3dfdHgocG9ydCwgZGV2LCBza2IsIEZBTFNFLCB0eF9zcGVjX291dCkpCisgICAgICAgIHJldHVybiAxOworI2VuZGlmCisKKyAgICAvKiBUcmFuc21pdCBkYXRhIGZsb3cgcGFja2V0cyBieSBVRFAgU291cmNlIFBvcnQgb3IgRGVzdCBQb3J0ICovCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorICAgIGlmIChjcGhfdWRwX3BvcnRfdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKKyAgICAgICAgcmV0dXJuIDE7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9uZXRkZXZfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBuZXR3b3JrIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9uZXRkZXZfaW5pdChWT0lEKQoreworICAgIFVJTlQzMiBwb3J0X2k7CisKKyAgICAvKiBSZXRyaWV2ZSBFdGggcG9ydCBudW1iZXIsIGFzIGluIG12X2V0aF9pbml0X21vZHVsZSAqLworICAgIGdzX212X2V0aF9wb3J0X251bSA9IG12Q3RybEV0aE1heFBvcnRHZXQoKTsKKworICAgIGlmIChnc19tdl9ldGhfcG9ydF9udW0gPiBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSkKKyAgICAgICAgZ3NfbXZfZXRoX3BvcnRfbnVtID0gQ09ORklHX01WX0VUSF9QT1JUU19OVU07CisKKyAgICAvKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uIHBhY2tldCBoYW5kbGluZyAqLworICAgIGNwaF9hcHBfaW5pdCgpOworICAgIAorICAgIC8qIEluaXRpYWxpemUgVURQIHBvcnQgbWFwcGluZyBmZWF0dXJlICovICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKKyAgICBjcGhfdWRwX3RhYmxlX2luaXQoKTsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSBkYXRhIGZsb3cgbWFwcGluZyBmZWF0dXJlICovCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICBjcGhfZmxvd19pbml0KCk7CisjZW5kaWYKKworICAgIC8qIFJlZ2lzdGVyIHNwZWNpYWwgcmVjZWl2ZSBjaGVjayBmdW5jdGlvbiAqLworI2lmZGVmIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTAorICAgIGZvciAocG9ydF9pID0gMDtwb3J0X2kgPCBnc19tdl9ldGhfcG9ydF9udW07IHBvcnRfaSsrKSB7CisgICAgICAgIG12X2V0aF9yeF9zcGVjaWFsX3Byb2NfZnVuYyhwb3J0X2ksIGNwaF9yeF9mdW5jKTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMICovCisKKyAgICAvKiBSZWdpc3RlciBzcGVjaWFsIHRyYW5zbWl0IGNoZWNrIGZ1bmN0aW9uICovCisjaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCisgICAgZm9yIChwb3J0X2kgPSAwOyBwb3J0X2kgPCBnc19tdl9ldGhfcG9ydF9udW07IHBvcnRfaSsrKSB7CisgICAgICAgIG12X2V0aF90eF9zcGVjaWFsX2NoZWNrX2Z1bmMocG9ydF9pLCBjcGhfdHhfZnVuYyk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTCAqLworICAgIHJldHVybiBNVl9PSzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9uZXRkZXYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9uZXRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZTU5YmJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX25ldGRldi5oCkBAIC0wLDAgKzEsMTU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX25ldGRldi5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIG5ldHdvcmsgZGV2aWNlIHBhcnQgZGVmaW5pdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMTFEZWMyMDExCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfTkVUREVWX0hfCisjZGVmaW5lIF9NVl9DUEhfTkVUREVWX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgPG12Q29tbW9uLmg+CisjaW5jbHVkZSA8bXZPcy5oPgorI2luY2x1ZGUgPG12X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaD4KKworCisjZGVmaW5lIE1WX0NQSF9NQVNfVURQX1NSQ19QT1JUICAgICAgICAgIDgKKyNkZWZpbmUgTVZfQ1BIX01BU19VRFBfRFNUX1BPUlQgICAgICAgICAgOAorI2RlZmluZSBNVl9DUEhfTlVNX0xMSUQgICAgICAgICAgICAgICAgICA4CisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFCitzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyB7CisgICAgX19iZTE2ICAgIHVkcF9wb3J0OworICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyB0eF9zcGVjOworfTsKKworc3RydWN0IG12X3BvcnRfdHhfc3BlYyB7CisgICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgdWRwX3NyY1tNVl9DUEhfTUFTX1VEUF9TUkNfUE9SVF07CisgICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgdWRwX2RzdFtNVl9DUEhfTUFTX1VEUF9EU1RfUE9SVF07Cit9OworCit2b2lkIGNwaF91ZHBfc3BlY19wcmludF9hbGwodm9pZCk7CitNVl9TVEFUVVMgIGNwaF91ZHBfc3JjX3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfc3JjX3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCk7CitNVl9TVEFUVVMgIGNwaF91ZHBfZGVzdF9zcGVjX3NldChpbnQgdHhfcG9ydCwgdWludDE2X3QgdWRwX2Rlc3RfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9yZWNfc2tiKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNlbmQgU0tCIHBhY2tldCB0byBsaW51eCBuZXR3b3JrIGFuZCBpbmNyZXNlIGNvdW50ZXIgIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIHNrYiAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCBjcGhfcmVjX3NrYihJTlQzMiBwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfbmV0ZGV2X2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBDUEggbmV0d29yayBkZXZpY2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfbmV0ZGV2X2luaXQoVk9JRCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfTkVUREVWX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfc3lzZnMuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxNmJkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfc3lzZnMuYwpAQCAtMCwwICsxLDEyMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfc3lzZnMuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBzeXNmcyBjb21tYW5kIGRlZmluaXRpb24gCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGdiZS9tdk5ldGEuaD4KKyNpbmNsdWRlIDxwbmMvbXZQbmMuaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19oZWxwKENIQVIgKmJ1ZikKK3sKKyAgICBJTlQzMiBvZmYgPSAwOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIGhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgdGhpcyBoZWxwXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBoZWxwX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IGFkZGl0aW9uYWwgaGVscCBmb3IgcGFyYW1ldGVyc1xuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHNob3dfYXBwX2RiICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgYWxsIGluZm9ybWF0aW9uIGluIGFwcGxpY2F0aW9uIHJ1bGUgZGF0YSBiYXNlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBzaG93X3BhcnNlX25hbWUgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IHN5c2ZzIHBhcnNpbmcgcnVsZSBkYXRhIGJhc2VcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHNob3dfbW9kX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgc3lzZnMgbW9kaWZpY2F0aW9uIHJ1bGUgZGF0YSBiYXNlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBzaG93X2Zyd2RfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IHN5c2ZzIG1vZGlmaWNhdGlvbiBydWxlIGRhdGEgYmFzZVxuIik7CisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICB1ZHBfcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IHNwZWNpYWwgdWRwIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydCBjb25maWd1cmF0aW9uXG4iKTsgICAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgc2hvd19mbG93X3J1bGUgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyBmbG93IG1hcHBpbmcgcnVsZXMgXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgY2xlYXJfZmxvd19ydWxlICAgICAgICAgICAgICAgICAgICAgIC0gY2xlYXIgYWxsIGZsb3cgbWFwcGluZyBydWxlc1xuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgZGVsX2RzY3BfbWFwICAgICAgICAgICAgICAgICAgICAgICAgIC0gZGVsZXRlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXNcbiIpOworI2VuZGlmCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcHJvZmlsZV9pZCBhY3RpdmVfcG9ydCAgICAgICAgICAgICAgID4gc2V0X2NvbXBsZXggICAgIC0gU2V0IFRQTSBjb21wbGV4IHByb2ZpbGUgSUQgYW5kIGFjdGl2ZSBHTUFDIHBvcnQsIDA6R01BQzAsIDE6R01BQzEsIDI6UE9OIE1BQ1xuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gZmVhdHVyZSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgID4gc2V0X2ZsYWcgICAgICAgIC0gU2V0IHRoZSBzdXBwb3J0IG9mIENQSCBmZWF0dXJlOiByZWZlciB0byBiZWxvdyBhZGRpdGlvbmFsIGluZm8sIHN0YXRlIDA6ZGlzYWJsZSwgMTplbmFibGVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHRjb250IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICA+IHNldF90Y29udCAgICAgICAtIFNldCBULUNPTlQgc3RhdGUgaW4gQ1BILCBULUNPTlQgMH43LCBzdGF0ZSwgMTplbmFibGUsIDA6ZGlzYWJsZVxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGhleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHRyYWNlX2xldmVsICAgICAtIFNldCBjcGggdHJhY2UgbGV2ZWwgYml0bWFwLiAweDAxOmRlYnVnLCAweDAyOmluZm8sIDB4MDQ6d2FybiwgMHgwODplcnJvclxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gbmFtZSBibShoZXgpIGRpciByeChoZXgpIG1oKGhleCkgZXR5KGhleCkgZXN0eSBpcHY0dHkgbmgxIG5oMiBpY21wdHkgPiBhZGRfcGFyc2UgICAtIGFkZCBwYXJzaW5nIGZpZWxkLCBkaXIgMDpVL1MsIDE6RC9TLCAyOk5vdCBjYXJlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBkZWxfcGFyc2UgICAgICAgLSBkZWxldGUgcGFyc2luZyBmaWVsZFxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG5hbWUgYm0oaGV4KSBwcm90b190eXBlKGhleCkgc3RhdGUgICA+IGFkZF9tb2QgICAgICAgICAtIGFkZCBtb2RpZmljYXRpb24gZmllbGQsIHN0YXRlIDA6ZGlhYmxlLCAxOmVuYWJsZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gZGVsX21vZCAgICAgICAgIC0gZGVsZXRlIG1vZGlmaWNhdGlvbiBmaWVsZFxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG5hbWUgYm0oaGV4KSB0cmdfcG9ydCB0cmdfcXVldWUgZ2VtICA+IGFkZF9mcndkICAgICAgICAtIGFkZCBmb3J3YXJkaW5nIGZpZWxkXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBkZWxfZnJ3ZCAgICAgICAgLSBkZWxldGUgZm9yd2FyZGluZyBmaWVsZFxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHBhcnNlX25hbWUgbW9kX25hbWUgZnJ3ZF9uYW1lICAgICAgICA+IGFkZF9hcHBfcnVsZSAgICAtIGFkZCBhcHBsaWNhdGlvbiBydWxlXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcGFyc2VfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgID4gZGVsX2FwcF9ydWxlICAgIC0gZGVsZXRlIGFwcGxpY2F0aW9uIHJ1bGVcbiIpOyAgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcGFyc2VfbmFtZSBtb2RfbmFtZSBmcndkX25hbWUgICAgICAgID4gdXBkYXRlX2FwcF9ydWxlIC0gdXBkYXRlIGFwcGxpY2F0aW9uIHJ1bGVcbiIpOyAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwYXJzZV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBnZXRfYXBwX3J1bGUgICAgLSBnZXQgYXBwbGljYXRpb24gcnVsZVxuIik7ICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwIHVkcF9zcmMoZGVjKSB0eHAgdHhxIGZsYWdzIGh3X2NtZCAgPiB1ZHBfc3JjICAgICAgICAgLSBzZXQgdWRwIHNvdXJjZSBwb3J0IHNwZWNpYWwgVHggYmVoYXZpb3JcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHAgdWRwX2RzdChkZWMpIHR4cCB0eHEgZmxhZ3MgaHdfY21kICA+IHVkcF9kc3QgICAgICAgICAtIHNldCB1ZHAgZGVzdGluYXRpb24gcG9ydCBzcGVjaWFsIFR4IGJlaGF2aW9yXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICB8UGFyc2Ugb3V0ZXIgICAgfFBhcnNlIGlubmVyICAgICAgICAgICAgIHxNb2Qgb3V0ZXIgICAgICB8TW9kIElubmVyICAgICAgfEZvcndhcmRcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGRpciBkZWZhdWx0IHBhcnNlX2JtIG1oIGV0eSAgdHBpZCB2aWQgcGJpdHMgIHRwaWQgdmlkIHBiaXRzICBvcF90eXBlICB0cGlkIHZpZCBwYml0cyAgdHBpZCB2aWQgcGJpdHMgIHBvcnQgcXVldWUgaHdmX3F1ZXVlIGdlbSA+IGFkZF9mbG93X3J1bGUgLSBBZGQgZmxvdyBydWxlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBkaXIgZGVmYXVsdCBwYXJzZV9ibSBtaCBldHkgIHRwaWQgdmlkIHBiaXRzICB0cGlkIHZpZCBwYml0cyAgPiBkZWxfZmxvd19ydWxlICAgLSBkZWxldGUgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGRpciBkZWZhdWx0IHBhcnNlX2JtIG1oIGV0eSAgdHBpZCB2aWQgcGJpdHMgIHRwaWQgdmlkIHBiaXRzICA+IGdldF9mbG93X3J1bGUgICAtIGdldCBmbG93IG1hcHBpbmcgcnVsZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcGJpdHMwIHBiaXRzMSAuLi4gcGJpdHM2MiBwYml0czYzICAgICAgICAgICAgICAgICAgICA+IHNldF9kc2NwX21hcCAgICAtIHNldCBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBvZmY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfaGVscF9hZGQoQ0hBUiAqYnVmKQoreworICAgIElOVDMyIG9mZiA9IDA7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIkNQSCBhZGRpdGlvbmFsIGhlbHAgZm9yIHBhcmFtZXRlcnNcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJbR2VuZXJpYyBQYXJhbWV0ZXJzXVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImZlYXR1cmU6XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMDpHZW5lcmljIGFwcGxpY2F0aW9uLCAxOklHTVAvTUxEIHN1cHBvcnQsIDI6QnJvYWRjYXN0IHN1cHBvcnQsIDM6RGF0YSBmbG93IG1hcHBpbmcgc3VwcG9ydCwgNDogVURQIHBvcnQgbWFwcGluZyBzdXBwb3J0XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiW0FwcCBQYXJhbWV0ZXJzXVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgInBhcnNlIGJtOlxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDB4MDE6UEFSU0VfRklFTERfRElSICAgICAgICAgICAgICAweDAyOlBBUlNFX0ZJRUxEX01IICAgICAgICAgICAgICAgMHgwNDpQQVJTRV9GSUVMRF9FVEhfVFlQRSAgICAgICAgIDB4MDg6UEFSU0VfRklFTERfRVRIX1NVQlRZUEVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAweDEwOlBBUlNFX0ZJRUxEX0lQVjRfVFlQRSAgICAgICAgMHgyMDpQQVJTRV9GSUVMRF9JUFY2X05IMSAgICAgICAgIDB4NDA6UEFSU0VfRklFTERfSVBWNl9OSDIgICAgICAgICAweDgwOlBBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZGlyOiAwOiBVL1MsIDE6RC9TLCAyOiBOb3QgY2FyZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgInJ4OiAwOiBSWCwgMTpUWFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIm1vZCBibTpcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAweDAxOlJYX01PRF9BRERfR01BQyAgICAgICAgICAgICAgMHgwMjpSWF9NT0RfUkVQTEFDRV9QUk9UT19UWVBFICAgIDB4MDQ6UlhfTU9EX1NUUklQX01IICAgICAgICAgICAgICAweDA4OlRYX01PRF9BRERfTUhfQllfRFJJVkVSXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMHgxMDpDUEhfQVBQX1RYX01PRF9OT19QQUQgICAgICAgIDB4MjA6TU9EX1NFVF9TVEFURVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImZyd2QgYm06XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMHgwMTpGUldEX1NFVF9UUkdfUE9SVCAgICAgICAgICAgIDB4MDI6RlJXRF9TRVRfVFJHX1FVRVVFICAgICAgICAgICAweDA0OkZSV0RfU0VUX0dFTV9QT1JUXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiW0Zsb3cgUGFyYW1ldGVyc11cbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJkaXI6IDA6IFUvUywgMTpEL1MsIDI6IE5vdCBjYXJlXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImRlZmF1bHQ6IDA6IG5vdCBkZWZhdWx0LCAxOmRlZmF1bHRcbiIpOyAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiYm06XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMHgwMTpQQVJTRV9NSCAgICAgICAgICAgICAgICAgICAgIDB4MDI6UEFSU0VfRVhUX1ZMQU4gICAgICAgICAgICAgICAweDA0OlBBUlNFX1RXT19WTEFOICAgICAgICAgICAgICAgMHgwODpQQVJTRV9FVEhfVFlQRVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIm1oKGhleCksIGV0eShoZXgpLCB0cGlkKGhleCksIHZpZChkZWMpLCBwYml0cyhkZWMpXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIm9wX3R5cGU6XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMDA6QVNJUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxOkRJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAwMjpBREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDM6QUREX0NPUFlfRFNDUFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDA0OkFERF9DT1BZX09VVEVSX1BCSVQgICAgICAgICAgICAwNTpBRERfQ09QWV9JTk5FUl9QQklUICAgICAgICAgICAgMDY6QUREXzJfVEFHUyAgICAgICAgICAgICAgICAgICAgIDA3OkFERF8yX1RBR1NfQ09QWV9EU0NQXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMDg6QUREXzJfVEFHU19DT1BZX1BCSVQgICAgICAgICAgIDA5OlJFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDpSRU1fMl9UQUdTICAgICAgICAgICAgICAgICAgICAgMTE6UkVQTEFDRVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDEyOlJFUExBQ0VfVklEICAgICAgICAgICAgICAgICAgICAxMzpSRVBMQUNFX1BCSVQgICAgICAgICAgICAgICAgICAgMTQ6UkVQTEFDRV9JTk5FUl9BRERfT1VURVIgICAgICAgIDE1OlJFUExBQ0VfSU5ORVJfQUREX09VVEVSX0NPUFlfUEJJVFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDE2OlJFUExBQ0VfSU5ORVJfUkVNX09VVEVSICAgICAgICAxNzpSRVBMQUNFXzJUQUdTICAgICAgICAgICAgICAgICAgMTg6UkVQTEFDRV8yVEFHU19WSUQgICAgICAgICAgICAgIDE5OlNXQVBcbiIpOworICAKKyAgICByZXR1cm4gb2ZmOworfQorCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZyBmaWVsZCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ1BIX1NZU0ZTX1BBUlNFX1QgY3BoX3N5c2ZzX3BhcnNlX3RhYmxlW0NQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlldOworCitzdGF0aWMgQ1BIX1NZU0ZTX1JVTEVfVCBjcGhfcGFyc2VfcnVsZV9kYiA9Cit7CisgICAgLm1heF9lbnRyeV9udW0gICAgPSBDUEhfU1lTRlNfRklFTERfTUFYX0VOVFJZLAorICAgIC5lbnRyeV9udW0gICAgICAgID0gMCwKKyAgICAuZW50cnlfc2l6ZSAgICAgICA9IHNpemVvZihDUEhfU1lTRlNfUEFSU0VfVCksCisgICAgLmVudHJ5X2FyYSAgICAgICAgPSBjcGhfc3lzZnNfcGFyc2VfdGFibGUKK307CisKK3N0YXRpYyBWT0lEIGNwaF9zeXNmc19pbml0X3BhcnNlX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgICpwX2VudHJ5ID0gKENQSF9TWVNGU19QQVJTRV9UICopY3BoX3BhcnNlX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICAvL3ByaW50ayhLRVJOX0lORk8gIiVzOiBJbml0IERCXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX3BhcnNlX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIHBfZW50cnktPm5hbWVbMF0gPSAwOworICAgIH0KK30KKworQ1BIX1NZU0ZTX1BBUlNFX1QgKmNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUoQ0hBUiAqbmFtZSkKK3sKKyAgICBDUEhfU1lTRlNfUEFSU0VfVCAqcF9lbnRyeSA9IChDUEhfU1lTRlNfUEFSU0VfVCAqKWNwaF9wYXJzZV9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX3BhcnNlX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAocF9lbnRyeS0+bmFtZSwgbmFtZSkgPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0NQSF9TWVNGU19QQVJTRV9UICpjcGhfc3lzZnNfZmluZF9mcmVlX3BhcnNlX2VudHJ5KFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX1BBUlNFX1QgKiljcGhfcGFyc2VfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfcGFyc2VfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0JPT0wgY3BoX3N5c2ZzX2RlbF9wYXJzZV9lbnRyeV9ieV9uYW1lKENIQVIgKm5hbWUpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX1BBUlNFX1QgKiljcGhfcGFyc2VfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfcGFyc2VfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChwX2VudHJ5LT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwX2VudHJ5LT5uYW1lWzBdICA9IDA7CisgICAgICAgICAgICBwX2VudHJ5LT5wYXJzZV9ibSA9IDA7CisgICAgICAgICAgICBtZW1zZXQoJnBfZW50cnktPnBhcnNlX2tleSwgMCwgc2l6ZW9mKHBfZW50cnktPnBhcnNlX2tleSkpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIGNwaF9zeXNmc19zaG93X3BhcnNlX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX1BBUlNFX1QgKiljcGhfcGFyc2VfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfcGFyc2VfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUGFyc2UgZW50cnkoJWQpIG5hbWUoJXMpXG4iLCBpZHgsIHBfZW50cnktPm5hbWUpOworICAgICAgICAgICAgY3BoX2RiX2Rpc3BsYXlfcGFyc2VfZmllbGQocF9lbnRyeS0+cGFyc2VfYm0sICZwX2VudHJ5LT5wYXJzZV9rZXkpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGZpZWxkIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ1BIX1NZU0ZTX01PRF9UIGNwaF9zeXNmc19tb2RfdGFibGVbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9FTlRSWV07CisKK3N0YXRpYyBDUEhfU1lTRlNfUlVMRV9UIGNwaF9tb2RfcnVsZV9kYiA9Cit7CisgICAgLm1heF9lbnRyeV9udW0gICAgPSBDUEhfU1lTRlNfRklFTERfTUFYX0VOVFJZLAorICAgIC5lbnRyeV9udW0gICAgICAgID0gMCwKKyAgICAuZW50cnlfc2l6ZSAgICAgICA9IHNpemVvZihDUEhfU1lTRlNfTU9EX1QpLAorICAgIC5lbnRyeV9hcmEgICAgICAgID0gY3BoX3N5c2ZzX21vZF90YWJsZQorfTsKKworc3RhdGljIFZPSUQgY3BoX3N5c2ZzX2luaXRfbW9kX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX01PRF9UICAqcF9lbnRyeSA9IChDUEhfU1lTRlNfTU9EX1QgKiljcGhfbW9kX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgLy9wcmludGsoS0VSTl9JTkZPICIlczogSW5pdCBEQlxuIiwgX19GVU5DVElPTl9fKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9tb2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgcF9lbnRyeS0+bmFtZVswXSA9IDA7CisgICAgfQorfQorCitDUEhfU1lTRlNfTU9EX1QgKmNwaF9zeXNmc19maW5kX21vZF9lbnRyeV9ieV9uYW1lKENIQVIgKm5hbWUpCit7CisgICAgQ1BIX1NZU0ZTX01PRF9UICAqcF9lbnRyeSA9IChDUEhfU1lTRlNfTU9EX1QgKiljcGhfbW9kX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfbW9kX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAocF9lbnRyeS0+bmFtZSwgbmFtZSkgPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0NQSF9TWVNGU19NT0RfVCAqY3BoX3N5c2ZzX2ZpbmRfZnJlZV9tb2RfZW50cnkoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfTU9EX1QgICpwX2VudHJ5ID0gKENQSF9TWVNGU19NT0RfVCAqKWNwaF9tb2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9tb2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0JPT0wgY3BoX3N5c2ZzX2RlbF9tb2RfZW50cnlfYnlfbmFtZShDSEFSICpuYW1lKQoreworICAgIENQSF9TWVNGU19NT0RfVCAgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX01PRF9UICopY3BoX21vZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX21vZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKHBfZW50cnktPm5hbWUsIG5hbWUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfZW50cnktPm5hbWVbMF0gPSAwOworICAgICAgICAgICAgcF9lbnRyeS0+bW9kX2JtICA9IDA7CisgICAgICAgICAgICBtZW1zZXQoJnBfZW50cnktPm1vZF92YWx1ZSwgMCwgc2l6ZW9mKHBfZW50cnktPm1vZF92YWx1ZSkpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIGNwaF9zeXNmc19zaG93X21vZF9kYihWT0lEKQoreworICAgIENQSF9TWVNGU19NT0RfVCAgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX01PRF9UICopY3BoX21vZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX21vZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAocF9lbnRyeS0+bmFtZVswXSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJNb2QgZW50cnkoJWQpIG5hbWUoJXMpXG4iLCBpZHgsIHBfZW50cnktPm5hbWUpOworICAgICAgICAgICAgY3BoX2RiX2Rpc3BsYXlfbW9kX2ZpZWxkKHBfZW50cnktPm1vZF9ibSwgJnBfZW50cnktPm1vZF92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBGb3J3YXJkaW5nIGZpZWxkIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBDUEhfU1lTRlNfRlJXRF9UIGNwaF9zeXNmc19mcndkX3RhYmxlW0NQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlldOworCitzdGF0aWMgQ1BIX1NZU0ZTX1JVTEVfVCBjcGhfZnJ3ZF9ydWxlX2RiID0KK3sKKyAgICAubWF4X2VudHJ5X251bSAgICA9IENQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlksCisgICAgLmVudHJ5X251bSAgICAgICAgPSAwLAorICAgIC5lbnRyeV9zaXplICAgICAgID0gc2l6ZW9mKENQSF9TWVNGU19GUldEX1QpLAorICAgIC5lbnRyeV9hcmEgICAgICAgID0gY3BoX3N5c2ZzX2Zyd2RfdGFibGUKK307CisKK3N0YXRpYyBWT0lEIGNwaF9zeXNmc19pbml0X2Zyd2RfZGIoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXQgREJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfZnJ3ZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBwX2VudHJ5LT5uYW1lWzBdID0gMDsKKyAgICB9Cit9CisKK0NQSF9TWVNGU19GUldEX1QgKmNwaF9zeXNmc19maW5kX2Zyd2RfZW50cnlfYnlfbmFtZShDSEFSICpuYW1lKQoreworICAgIENQSF9TWVNGU19GUldEX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX0ZSV0RfVCAqKWNwaF9mcndkX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfZnJ3ZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKHBfZW50cnktPm5hbWUsIG5hbWUpID09IDApIAorICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitDUEhfU1lTRlNfRlJXRF9UICpjcGhfc3lzZnNfZmluZF9mcmVlX2Zyd2RfZW50cnkoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0JPT0wgY3BoX3N5c2ZzX2RlbF9mcndkX2VudHJ5X2J5X25hbWUoQ0hBUiAqbmFtZSkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChwX2VudHJ5LT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwX2VudHJ5LT5uYW1lWzBdID0gMDsKKyAgICAgICAgICAgIHBfZW50cnktPmZyd2RfYm0gPSAwOworICAgICAgICAgICAgbWVtc2V0KCZwX2VudHJ5LT5mcndkX3ZhbHVlLCAwLCBzaXplb2YocF9lbnRyeS0+ZnJ3ZF92YWx1ZSkpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIGNwaF9zeXNmc19zaG93X2Zyd2RfZGIoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRnJ3ZCBlbnRyeSglZCkgbmFtZSglcylcbiIsIGlkeCwgcF9lbnRyeS0+bmFtZSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKHBfZW50cnktPmZyd2RfYm0sICZwX2VudHJ5LT5mcndkX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIFNZUyBGUyBQYXJzaW5nIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIENIQVIgKmJ1ZikKK3sKKyAgICBJTlQzMiAgICAgICBvZmYgID0gMDsKKyAgICBjb25zdCBDSEFSICpuYW1lID0gYXR0ci0+YXR0ci5uYW1lOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgaWYgKCFzdHJjbXAobmFtZSwgImhlbHAiKSApIHsKKyAgICAgICAgb2ZmID0gY3BoX3NwZWNfcHJvY19oZWxwKGJ1Zik7CisgICAgfQorICAgIGlmICghc3RyY21wKG5hbWUsICJoZWxwX2FkZCIpICkgeworICAgICAgICBvZmYgPSBjcGhfc3BlY19wcm9jX2hlbHBfYWRkKGJ1Zik7CisgICAgfSAgICAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzaG93X2FwcF9kYiIpICkgeworICAgICAgICBjcGhfZGJfZGlzcGxheV9hbGwoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2hvd19wYXJzZV9uYW1lIikgKSB7CisgICAgICAgIGNwaF9zeXNmc19zaG93X3BhcnNlX2RiKCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNob3dfbW9kX25hbWUiKSApIHsKKyAgICAgICAgY3BoX3N5c2ZzX3Nob3dfbW9kX2RiKCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNob3dfZnJ3ZF9uYW1lIikgKSB7CisgICAgICAgIGNwaF9zeXNmc19zaG93X2Zyd2RfZGIoKTsKKyAgICB9CisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAgICAgICAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ1ZHBfcG9ydHMiKSkgeworICAgICAgICBjcGhfdWRwX3NwZWNfcHJpbnRfYWxsKCk7CisgICAgfQorI2VuZGlmICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFICAgICAgICAgIAorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNob3dfZmxvd19ydWxlIikpIHsKKyAgICAgICAgY3BoX2Zsb3dfZGlzcGxheV9hbGwoKTsKKyAgICB9IAorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImNsZWFyX2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIGNwaF9mbG93X2NsZWFyX3J1bGUoKTsKKyAgICB9ICAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJkZWxfZHNjcF9tYXAiKSkgeworICAgICAgICBjcGhfZmxvd19kZWxfZHNjcF9tYXAoKTsKKyAgICB9ICAgICAKKyNlbmRpZiAgICAKKyAgICBlbHNlCisgICAgICAgIG9mZiA9IGNwaF9zcGVjX3Byb2NfaGVscChidWYpOworCisgICAgcmV0dXJuIG9mZjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY18xX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgVUlOVDMyICAgICAgdjEgICAgPSAwOworICAgIFVMT05HICAgICAgIGZsYWdzID0gMDsgICAgCisgICAgTVZfU1RBVFVTICAgcmMgICAgPSAgTVZfT0s7CisKKyAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICAvKiBSZWFkIGlucHV0ICovCisgICAgc3NjYW5mKGJ1ZiwgIiV4IiwgJnYxKTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgaWYgKCFzdHJjbXAobmFtZSwgInRyYWNlX2xldmVsIikpIHsKKyAgICAgICAgcmMgPSBjcGhfc2V0X3RyYWNlX2ZsYWcodjEpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBzZXQgdHJhY2UgbGV2ZWw8MHgleD5cbiIsIHYxKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gc2V0IHRyYWNlIGxldmVsPDB4JXg+XG4iLCB2MSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY18yX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgVUlOVDMyICAgICAgdjEgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHYyICAgID0gMDsKKyAgICBVTE9ORyAgICAgICBmbGFncyA9IDA7ICAgIAorICAgIE1WX1NUQVRVUyAgIHJjICAgID0gIE1WX09LOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlZCAlZCIsICZ2MSwgJnYyKTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgaWYgKCFzdHJjbXAobmFtZSwgInNldF9jb21wbGV4IikpIHsKKyAgICAgICAgcmMgPSBjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZSh2MSwgdjIpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBzZXQgY29tcGxleCBwcm9maWxlPCVkPiBhY3RpdmUgcG9ydDwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIHNldCBjb21wbGV4IHByb2ZpbGU8JWQ+IGFjdGl2ZSBwb3J0PCVkPlxuIiwgdjEsIHYyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzZXRfZmxhZyIpKSB7CisgICAgICAgIHJjID0gY3BoX3NldF9mZWF0dXJlX2ZsYWcodjEsIHYyKTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gc2V0IGZlYXR1cmU8JWQ+IHRvIDwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIHNldCBmZWF0dXJlPCVkPiB0bzwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2V0X3Rjb250IikpIHsKKyAgICAgICAgcmMgPSBjcGhfc2V0X3Rjb250X3N0YXRlKHYxLCB2Mik7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIHNldCB0Y29udDwlZD4gdG8gPCVkPlxuIiwgdjEsIHYyKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gc2V0IHRjb250PCVkPiB0bzwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0KKyAgICB9ICAgIAorICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworCisgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfbmFtZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIENIQVIgICAgICAgIG5hbWUxW0NQSF9TWVNGU19GSUVMRF9NQVhfTEVOKzFdOworICAgIFVJTlQzMiAgICAgIHYxICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2MiAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjMgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY0ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2NSAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjYgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY3ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2OCAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjkgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHYxMCAgID0gMDsKKyAgICBVTE9ORyAgICAgICBmbGFncyA9IDA7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfcGFyc2VfZW50cnkgPSBOVUxMOworICAgIENQSF9TWVNGU19NT0RfVCAgICpwX21vZF9lbnRyeSAgID0gTlVMTDsKKyAgICBDUEhfU1lTRlNfRlJXRF9UICAqcF9mcndkX2VudHJ5ICA9IE5VTEw7CisKKyAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKworICAgIGlmICghc3RyY21wKG5hbWUsICJhZGRfcGFyc2UiKSkgeworICAgICAgICAvKiBSZWFkIGlucHV0ICovCisgICAgICAgIHNzY2FuZihidWYsICIlcyAleCAlZCAlZCAlZCAleCAlZCAlZCAlZCAlZCAlZCIsIG5hbWUxLCAmdjEsICZ2MiwgJnYzLCAmdjQsICZ2NSwgJnY2LCAmdjcsICZ2OCwgJnY5LCAmdjEwKTsKKworICAgICAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIAorICAgICAgICBwX3BhcnNlX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfcGFyc2VfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmKHBfcGFyc2VfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiQWxyZWFkeSBoYXMgdGhlIHBhcnNlIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKworICAgICAgICBwX3BhcnNlX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJlZV9wYXJzZV9lbnRyeSgpOworICAgICAgICBpZighcF9wYXJzZV9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJObyBmcmVlIHBhcnNlIGVudHJ5XG4iKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdHJjcHkocF9wYXJzZV9lbnRyeS0+bmFtZSwgbmFtZTEpOworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9ibSAgICAgICAgICAgICAgPSB2MTsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmRpciAgICAgICAgID0gdjI7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5yeF90eCAgICAgICA9IHYzOworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkubWggICAgICAgICAgPSB2NDsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmV0aF90eXBlICAgID0gdjU7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5ldGhfc3VidHlwZSA9IHY2OworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkuaXB2NF90eXBlICAgPSB2NzsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmlwdjZfbmgxICAgID0gdjg7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5pcHY2X25oMiAgICA9IHY5OworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkuaWNtcHY2X3R5cGUgPSB2MTA7CisgICAgICAgIAorICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIHBhcnNlIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworCisgICAgICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFkZF9tb2QiKSkgeworICAgICAgICAvKiBSZWFkIGlucHV0ICovCisgICAgICAgIHNzY2FuZihidWYsICIlcyAleCAleCAlZCIsIG5hbWUxLCAmdjEsICZ2MiwgJnYzKTsKKworICAgICAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgICAgICAKKyAgICAgICAgcF9tb2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9tb2RfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmKHBfbW9kX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIkFscmVhZHkgaGFzIHRoZSBtb2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorCisgICAgICAgIHBfbW9kX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJlZV9tb2RfZW50cnkoKTsKKyAgICAgICAgaWYoIXBfbW9kX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIk5vIGZyZWUgbW9kIGVudHJ5XG4iKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisKKyAgICAgICAgc3RyY3B5KHBfbW9kX2VudHJ5LT5uYW1lLCBuYW1lMSk7CisgICAgICAgIHBfbW9kX2VudHJ5LT5tb2RfYm0gICAgICAgICAgICAgICAgPSB2MTsKKyAgICAgICAgcF9tb2RfZW50cnktPm1vZF92YWx1ZS5wcm90b190eXBlICA9IHYyOworICAgICAgICBpZiAodjMpCisgICAgICAgICAgICBwX21vZF9lbnRyeS0+bW9kX3ZhbHVlLnN0YXRlICAgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwX21vZF9lbnRyeS0+bW9kX3ZhbHVlLnN0YXRlICAgPSBGQUxTRTsKKyAgICAgICAgCisgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBhZGQgbW9kIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworICAgICAgICAKKyAgICAgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYWRkX2Zyd2QiKSkgeworICAgICAgICAvKiBSZWFkIGlucHV0ICovCisgICAgICAgIHNzY2FuZihidWYsICIlcyAleCAlZCAlZCAlZCIsIG5hbWUxLCAmdjEsICZ2MiwgJnYzLCAmdjQpOworCisgICAgICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgIAorICAgICAgICBwX2Zyd2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9mcndkX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZihwX2Zyd2RfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiQWxyZWFkeSBoYXMgdGhlIGZyd2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorCisgICAgICAgIHBfZnJ3ZF9lbnRyeSA9IGNwaF9zeXNmc19maW5kX2ZyZWVfZnJ3ZF9lbnRyeSgpOworICAgICAgICBpZighcF9mcndkX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIk5vIGZyZWUgZnJ3ZCBlbnRyeVxuIik7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3RyY3B5KHBfZnJ3ZF9lbnRyeS0+bmFtZSwgbmFtZTEpOworICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfYm0gICAgICAgICAgICAgID0gdjE7CisgICAgICAgIHBfZnJ3ZF9lbnRyeS0+ZnJ3ZF92YWx1ZS50cmdfcG9ydCAgPSB2MjsKKyAgICAgICAgcF9mcndkX2VudHJ5LT5mcndkX3ZhbHVlLnRyZ19xdWV1ZSA9IHYzOworICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfdmFsdWUuZ2VtX3BvcnQgID0gdjQ7CisgICAgICAgIAorICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIGZyd2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7CisKKyAgICAgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9ICAgCisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgQ0hBUiAgICAgICAgbmFtZTFbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ0hBUiAgICAgICAgbmFtZTJbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ0hBUiAgICAgICAgbmFtZTNbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07ICAgIAorICAgIFVMT05HICAgICAgIGZsYWdzID0gMDsKKyAgICBNVl9TVEFUVVMgICByYyAgICA9ICBNVl9PSzsgICAgCisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfcGFyc2VfZW50cnkgPSBOVUxMOworICAgIENQSF9TWVNGU19NT0RfVCAgICpwX21vZF9lbnRyeSAgID0gTlVMTDsgICAgCisgICAgQ1BIX1NZU0ZTX0ZSV0RfVCAgKnBfZnJ3ZF9lbnRyeSAgPSBOVUxMOworICAgIENQSF9TWVNGU19NT0RfVCAgICBtb2RfZW50cnk7ICAgIAorICAgIENQSF9TWVNGU19GUldEX1QgICBmcndkX2VudHJ5OworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlcyAlcyAlcyIsIG5hbWUxLCBuYW1lMiwgbmFtZTMpOworCisgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiYWRkX2FwcF9ydWxlIikpIHsKKyAgICAgICAgcF9wYXJzZV9lbnRyeSA9IGNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZighcF9wYXJzZV9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgcGFyc2UgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICBwX21vZF9lbnRyeSA9IGNwaF9zeXNmc19maW5kX21vZF9lbnRyeV9ieV9uYW1lKG5hbWUyKTsKKyAgICAgICAgaWYoIXBfbW9kX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoImFkZF9hcHBfcnVsZTogaW52YWxpZCBtb2QgbmFtZSA8JXM+XG4iLCBuYW1lMik7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICBwX2Zyd2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9mcndkX2VudHJ5X2J5X25hbWUobmFtZTMpOworICAgICAgICBpZighcF9mcndkX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoImFkZF9hcHBfcnVsZTogaW52YWxpZCBmcndkIG5hbWUgPCVzPlxuIiwgbmFtZTMpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0gICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICByYyA9IGNwaF9hZGRfYXBwX3J1bGUocF9wYXJzZV9lbnRyeS0+cGFyc2VfYm0sICZwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21vZF9lbnRyeS0+bW9kX2JtLCAmcF9tb2RfZW50cnktPm1vZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZnJ3ZF9lbnRyeS0+ZnJ3ZF9ibSwgJnBfZnJ3ZF9lbnRyeS0+ZnJ3ZF92YWx1ZSk7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGFkZCBhcHAgcnVsZVxuIik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIGFkZCBhcHAgcnVsZVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX2FwcF9ydWxlIikpIHsKKyAgICAgICAgcF9wYXJzZV9lbnRyeSA9IGNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZighcF9wYXJzZV9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgcGFyc2UgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfZGVsX2FwcF9ydWxlKHBfcGFyc2VfZW50cnktPnBhcnNlX2JtLCAmcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIGFwcCBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIGFwcCBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVwZGF0ZV9hcHBfcnVsZSIpKSB7CisgICAgICAgIHBfcGFyc2VfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9wYXJzZV9lbnRyeV9ieV9uYW1lKG5hbWUxKTsKKyAgICAgICAgaWYoIXBfcGFyc2VfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiYWRkX2FwcF9ydWxlOiBpbnZhbGlkIHBhcnNlIG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgcF9tb2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9tb2RfZW50cnlfYnlfbmFtZShuYW1lMik7CisgICAgICAgIGlmKCFwX21vZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgbW9kIG5hbWUgPCVzPlxuIiwgbmFtZTIpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgcF9mcndkX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJ3ZF9lbnRyeV9ieV9uYW1lKG5hbWUzKTsKKyAgICAgICAgaWYoIXBfZnJ3ZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgZnJ3ZCBuYW1lIDwlcz5cbiIsIG5hbWUzKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9ICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfdXBkYXRlX2FwcF9ydWxlKHBfcGFyc2VfZW50cnktPnBhcnNlX2JtLCAmcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tb2RfZW50cnktPm1vZF9ibSwgJnBfbW9kX2VudHJ5LT5tb2RfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfYm0sICZwX2Zyd2RfZW50cnktPmZyd2RfdmFsdWUpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byB1cGRhdGUgYXBwIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byB1cGRhdGUgYXBwIHJ1bGVcbiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJnZXRfYXBwX3J1bGUiKSkgeworICAgICAgICBwX3BhcnNlX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfcGFyc2VfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmKCFwX3BhcnNlX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoImFkZF9hcHBfcnVsZTogaW52YWxpZCBwYXJzZSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisgICAgICAgCisgICAgICAgIHJjID0gY3BoX2dldF9hcHBfcnVsZShwX3BhcnNlX2VudHJ5LT5wYXJzZV9ibSwgJnBfcGFyc2VfZW50cnktPnBhcnNlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RfZW50cnkubW9kX2JtLCAmbW9kX2VudHJ5Lm1vZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcndkX2VudHJ5LmZyd2RfYm0sICZmcndkX2VudHJ5LmZyd2RfdmFsdWUpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X3BhcnNlX2ZpZWxkKHBfcGFyc2VfZW50cnktPnBhcnNlX2JtLCAmcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZChtb2RfZW50cnkubW9kX2JtLCAmbW9kX2VudHJ5Lm1vZF92YWx1ZSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKGZyd2RfZW50cnkuZnJ3ZF9ibSwgJmZyd2RfZW50cnkuZnJ3ZF92YWx1ZSk7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJObyB2YWxpZCBDUEggYXBwIHJ1bGVcbiIpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJkZWxfcGFyc2UiKSkgeworICAgICAgICByYyA9IGNwaF9zeXNmc19kZWxfcGFyc2VfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmIChyYyA9PSBUUlVFKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIHBhcnNlIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBkZWxldGUgcGFyc2UgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX21vZCIpKSB7CisgICAgICAgIHJjID0gY3BoX3N5c2ZzX2RlbF9tb2RfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmIChyYyA9PSBUUlVFKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIG1vZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIG1vZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJkZWxfZnJ3ZCIpKSB7CisgICAgICAgIHJjID0gY3BoX3N5c2ZzX2RlbF9mcndkX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZiAocmMgPT0gVFJVRSkgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGRlbGV0ZSBmcndkIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBkZWxldGUgZnJ3ZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfSAgCisgICAgfSAgICAKKyAgICBlbHNlCisgICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKKworICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm4gbGVuOworfQorCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY191ZHBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgVUlOVDMyICAgICAgdjEgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHYyICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2MyAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjQgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY1ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2NiAgICA9IDA7CisgICAgVUxPTkcgICAgICAgZmxhZ3MgPSAwOworICAgIE1WX1NUQVRVUyAgIHJjICAgID0gIE1WX09LOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlZCAlZCAleCAleCAleCAleCIsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1LCAmdjYpOworCisgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidWRwX3NyYyIpKSB7CisgICAgICAgIHJjID0gY3BoX3VkcF9zcmNfc3BlY19zZXQodjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGFkZCBVRFAgc3JjIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBhZGQgVURQIHNyYyBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVkcF9kc3QiKSkgeworICAgICAgICByYyA9IGNwaF91ZHBfZGVzdF9zcGVjX3NldCh2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIFVEUCBkZXN0IHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBhZGQgVURQIGRlc3QgcnVsZVxuIik7CisgICAgICAgIH0gICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfZmxvd19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgICAgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIFVJTlQzMiAgICAgICAgIHYwICAgID0gMDsgICAgICAgIAorICAgIFVJTlQzMiAgICAgICAgIHYxICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MiAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjMgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHY0ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2NSAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjYgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHY3ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2OCAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjkgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxMCAgID0gMDsgICAgCisgICAgVUlOVDMyICAgICAgICAgdjExICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxMiAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTMgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjE0ICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxNSAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTYgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjE3ICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxOCAgID0gMDsgCisgICAgVUlOVDMyICAgICAgICAgdjE5ICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYyMCAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MjEgICA9IDA7ICAgCisgICAgVUxPTkcgICAgICAgICAgZmxhZ3MgPSAwOworICAgIE1WX1NUQVRVUyAgICAgIHJjICAgID0gIE1WX09LOworICAgIENQSF9GTE9XX0VOVFJZX1QgY3BoX2Zsb3c7CisKKyAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICAvKiBSZWFkIGlucHV0ICovCisgICAgc3NjYW5mKGJ1ZiwgIiVkICVkICV4ICV4ICV4ICV4ICVkICVkICV4ICVkICVkICVkICV4ICVkICVkICV4ICVkICVkICVkICVkICVkICVkIiwgJnYwLCAmdjEsICZ2MiwgJnYzLCAmdjQsICZ2NSwgJnY2LCAmdjcsICZ2OCwgJnY5LCAmdjEwLCAmdjExLCAmdjEyLCAmdjEzLCAmdjE0LCAmdjE1LCAmdjE2LCAmdjE3LCAmdjE4LCAmdjE5LCAmdjIwLCAmdjIxKTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRSAgIAorICAgIGlmICghc3RyY21wKG5hbWUsICJhZGRfZmxvd19ydWxlIikpIHsKKyAgICAgICAgbWVtc2V0KCZjcGhfZmxvdywgMCwgc2l6ZW9mKGNwaF9mbG93KSk7CisgICAgICAgIGNwaF9mbG93LmRpciAgICAgICAgPSAoQ1BIX0RJUl9FKXYwOworICAgICAgICBjcGhfZmxvdy5pc19kZWZhdWx0ID0gdjE/IFRSVUUgOiBGQUxTRTsgICAgICAgIAorICAgICAgICBjcGhfZmxvdy5wYXJzZV9ibSAgPSAoQ1BIX0ZMT1dfUEFSU0VfRSl2MjsKKyAgICAgICAgY3BoX2Zsb3cubWggICAgICAgID0gKFVJTlQxNil2MzsKKyAgICAgICAgY3BoX2Zsb3cuZXRoX3R5cGUgID0gKFVJTlQxNil2NDsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjU7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY2OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kucGJpdHMgID0gKFVJTlQ4KXY3OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kudHBpZCAgID0gKFVJTlQxNil2ODsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnZpZCAgICA9IChVSU5UMTYpdjk7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS5wYml0cyAgPSAoVUlOVDgpdjEwOworICAgICAgICBjcGhfZmxvdy5vcF90eXBlICAgICAgICAgICAgICAgID0gKENQSF9WTEFOX09QX1RZUEVfRSl2MTE7ICAgICAgICAKKyAgICAgICAgY3BoX2Zsb3cubW9kX291dGVyX3RjaS50cGlkICAgICA9IChVSU5UMTYpdjEyOworICAgICAgICBjcGhfZmxvdy5tb2Rfb3V0ZXJfdGNpLnZpZCAgICAgID0gKFVJTlQxNil2MTM7CisgICAgICAgIGNwaF9mbG93Lm1vZF9vdXRlcl90Y2kucGJpdHMgICAgPSAoVUlOVDgpdjE0OworICAgICAgICBjcGhfZmxvdy5tb2RfaW5uZXJfdGNpLnRwaWQgICAgID0gKFVJTlQxNil2MTU7CisgICAgICAgIGNwaF9mbG93Lm1vZF9pbm5lcl90Y2kudmlkICAgICAgPSAoVUlOVDE2KXYxNjsKKyAgICAgICAgY3BoX2Zsb3cubW9kX2lubmVyX3RjaS5wYml0cyAgICA9IChVSU5UOCl2MTc7CisgICAgICAgIGNwaF9mbG93LnBrdF9mcndkLnRyZ19wb3J0ICAgICAgPSAoVUlOVDgpdjE4OworICAgICAgICBjcGhfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUgICAgID0gKFVJTlQ4KXYxOTsKKyAgICAgICAgY3BoX2Zsb3cucGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSA9IChVSU5UOCl2MjA7ICAgICAgICAKKyAgICAgICAgY3BoX2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgICAgICA9IChVSU5UMTYpdjIxOworICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfZmxvd19hZGRfcnVsZSgmY3BoX2Zsb3cpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBhZGQgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBhZGQgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOworICAgICAgICB9ICAgICAgICAKKyAgICB9ICAgCisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIG1lbXNldCgmY3BoX2Zsb3csIDAsIHNpemVvZihjcGhfZmxvdykpOworICAgICAgICBjcGhfZmxvdy5kaXIgICAgICAgID0gKENQSF9ESVJfRSl2MDsKKyAgICAgICAgY3BoX2Zsb3cuaXNfZGVmYXVsdCA9IHYxPyBUUlVFIDogRkFMU0U7ICAKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfYm0gID0gKENQSF9GTE9XX1BBUlNFX0UpdjI7CisgICAgICAgIGNwaF9mbG93Lm1oICAgICAgICA9IChVSU5UMTYpdjM7CisgICAgICAgIGNwaF9mbG93LmV0aF90eXBlICA9IChVSU5UMTYpdjQ7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS50cGlkICAgPSAoVUlOVDE2KXY1OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kudmlkICAgID0gKFVJTlQxNil2NjsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICA9IChVSU5UOCl2NzsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjg7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY5OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kucGJpdHMgID0gKFVJTlQ4KXYxMDsKKyAgICAgICAgCisgICAgICAgIHJjID0gY3BoX2Zsb3dfZGVsX3J1bGUoJmNwaF9mbG93KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZ2V0X2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIG1lbXNldCgmY3BoX2Zsb3csIDAsIHNpemVvZihjcGhfZmxvdykpOworICAgICAgICBjcGhfZmxvdy5kaXIgICAgICAgID0gKENQSF9ESVJfRSl2MDsKKyAgICAgICAgY3BoX2Zsb3cuaXNfZGVmYXVsdCA9IHYxPyBUUlVFIDogRkFMU0U7ICAKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfYm0gID0gKENQSF9GTE9XX1BBUlNFX0UpdjI7CisgICAgICAgIGNwaF9mbG93Lm1oICAgICAgICA9IChVSU5UMTYpdjM7CisgICAgICAgIGNwaF9mbG93LmV0aF90eXBlICA9IChVSU5UMTYpdjQ7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS50cGlkICAgPSAoVUlOVDE2KXY1OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kudmlkICAgID0gKFVJTlQxNil2NjsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICA9IChVSU5UOCl2NzsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjg7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY5OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kucGJpdHMgID0gKFVJTlQ4KXYxMDsKKyAgICAgICAgICAgIAorICAgICAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKCZjcGhfZmxvdyk7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGdldCBmbG93IHJ1bGVcbiIpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgICAgICAgICAgICAgICAgfFBhcnNlIG91dGVyICAgICAgIHxQYXJzZSBpbm5lciAgICAgICB8TW9kIG91dGVyICAgICAgICAgfE1vZCBJbm5lciAgICAgICAgIHxGb3J3YXJkXG4iKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImRpciBkZWZhdWx0IHRwYXJzZV9ibSBtaCAgIGV0eSAgICB0cGlkICAgdmlkICBwYml0cyAgdHBpZCAgIHZpZCAgcGJpdHMgIHRwaWQgICB2aWQgIHBiaXRzICB0cGlkICAgdmlkICBwYml0cyAgcG9ydCBxdWV1ZSBod2ZfcXVldWUgZ2VtICBvcF90eXBlXG4iKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIAorICAgICAgICAgICAgICAgICAgICIlMi4ycyAgJTQuNHMgICAgMHglMDR4ICAgJS00ZCAweCUwNHggMHglMDR4ICU0ZCAlMWQgICAgICAweCUwNHggJTRkICUxZCAgICAgIDB4JTA0eCAlNGQgJTFkICAgICAgMHglMDR4ICU0ZCAlMWQgICAgICAlMWQgICAgJTFkICAgICAlMWQgICAgICAgICAlNGQgJXMgXG4iLAorICAgICAgICAgICAgICAgICAgIGNwaF9hcHBfbG9va3VwX2RpcihjcGhfZmxvdy5kaXIpLCAoY3BoX2Zsb3cuaXNfZGVmYXVsdCA9PSBUUlVFKSA/IlllcyI6Ik5vIiwgY3BoX2Zsb3cucGFyc2VfYm0sCisgICAgICAgICAgICAgICAgICAgY3BoX2Zsb3cubWgsIGNwaF9mbG93LmV0aF90eXBlLAorICAgICAgICAgICAgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS50cGlkLCBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kudmlkLCBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kucGJpdHMsIAorICAgICAgICAgICAgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS50cGlkLCBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kudmlkLCBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kucGJpdHMsCisgICAgICAgICAgICAgICAgICAgY3BoX2Zsb3cubW9kX291dGVyX3RjaS50cGlkLCAgIGNwaF9mbG93Lm1vZF9vdXRlcl90Y2kudmlkLCAgIGNwaF9mbG93Lm1vZF9vdXRlcl90Y2kucGJpdHMsCisgICAgICAgICAgICAgICAgICAgY3BoX2Zsb3cubW9kX2lubmVyX3RjaS50cGlkLCAgIGNwaF9mbG93Lm1vZF9pbm5lcl90Y2kudmlkLCAgIGNwaF9mbG93Lm1vZF9pbm5lcl90Y2kucGJpdHMsCisgICAgICAgICAgICAgICAgICAgY3BoX2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQsICAgIGNwaF9mbG93LnBrdF9mcndkLnRyZ19xdWV1ZSwgIGNwaF9mbG93LnBrdF9mcndkLnRyZ19od2ZfcXVldWUsIGNwaF9mbG93LnBrdF9mcndkLmdlbV9wb3J0LCAKKyAgICAgICAgICAgICAgICAgICBjcGhfZmxvd19sb29rdXBfb3BfdHlwZShjcGhfZmxvdy5vcF90eXBlKSk7CisgICAgICAgICAgICAgCisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIGdldCBmbG93XG4iKTsKKyAgICAgICAgfQorICAgIH0gICAKKyAgICBlbHNlCisgICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKKyNlbmRpZgorCisgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfZHNjcF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAgICAgICpuYW1lID0gYXR0ci0+YXR0ci5uYW1lOworICAgIFVJTlQzMiAgICAgICAgICAgdls2NF07CisgICAgVUlOVDMyICAgICAgICAgICBpbmRleCA9IDA7CisgICAgVUxPTkcgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgTVZfU1RBVFVTICAgICAgICByYyAgICA9ICBNVl9PSzsgICAgIAorICAgIENQSF9EU0NQX1BCSVRTX1QgZHNjcF9tYXA7CisKKyAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICAvKiBSZWFkIGlucHV0ICovCisgICAgc3NjYW5mKGJ1ZiwgIiVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICIsCisgICAgICAgICAgICZ2WzBdLCAgJnZbMV0sICAmdlsyXSwgICZ2WzNdLCAgJnZbNF0sICAmdls1XSwgICZ2WzZdLCAgJnZbN10sCisgICAgICAgICAgICZ2WzhdLCAgJnZbOV0sICAmdlsxMF0sICZ2WzExXSwgJnZbMTJdLCAmdlsxM10sICZ2WzE0XSwgJnZbMTVdLAorICAgICAgICAgICAmdlsxNl0sICZ2WzE3XSwgJnZbMThdLCAmdlsxOV0sICZ2WzIwXSwgJnZbMjFdLCAmdlsyMl0sICZ2WzIzXSwKKyAgICAgICAgICAgJnZbMjRdLCAmdlsyNV0sICZ2WzI2XSwgJnZbMjddLCAmdlsyOF0sICZ2WzI5XSwgJnZbMzBdLCAmdlszMV0sCisgICAgICAgICAgICZ2WzMyXSwgJnZbMzNdLCAmdlszNF0sICZ2WzM1XSwgJnZbMzZdLCAmdlszN10sICZ2WzM4XSwgJnZbMzldLAorICAgICAgICAgICAmdls0MF0sICZ2WzQxXSwgJnZbNDJdLCAmdls0M10sICZ2WzQ0XSwgJnZbNDVdLCAmdls0Nl0sICZ2WzQ3XSwKKyAgICAgICAgICAgJnZbNDhdLCAmdls0OV0sICZ2WzUwXSwgJnZbNTFdLCAmdls1Ml0sICZ2WzUzXSwgJnZbNTRdLCAmdls1NV0sCisgICAgICAgICAgICZ2WzU2XSwgJnZbNTddLCAmdls1OF0sICZ2WzU5XSwgJnZbNjBdLCAmdls2MV0sICZ2WzYyXSwgJnZbNjNdKTsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA2NDsgaW5kZXgrKykgeworICAgICAgICBkc2NwX21hcC5wYml0c1tpbmRleF0gPSAoVUlOVDgpdltpbmRleF07CisgICAgfQorICAgIGRzY3BfbWFwLmluX3VzZSA9IDE7CisKKyAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisgICAgaWYgKCFzdHJjbXAobmFtZSwgInNldF9kc2NwX21hcCIpKSB7ICAgIAorICAgICAgICByYyA9IGNwaF9mbG93X3NldF9kc2NwX21hcCgmZHNjcF9tYXApOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBzZXQgRFNDUCB0byBQLWJpdHMgbWFwcGluZ1xuIik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIHNldCBEU0NQIHRvIFAtYml0cyBtYXBwaW5nXG4iKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworCisgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiBsZW47Cit9CisjZW5kaWYKKworc3RhdGljIERFVklDRV9BVFRSKGhlbHAsICAgICAgICAgICAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihoZWxwX2FkZCwgICAgICAgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2hvd19hcHBfZGIsICAgICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHNob3dfcGFyc2VfbmFtZSwgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzaG93X21vZF9uYW1lLCAgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2hvd19mcndkX25hbWUsICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUgCitzdGF0aWMgREVWSUNFX0FUVFIodWRwX3BvcnRzLCAgICAgICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKK3N0YXRpYyBERVZJQ0VfQVRUUihzaG93X2Zsb3dfcnVsZSwgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2xlYXJfZmxvd19ydWxlLCBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGRlbF9kc2NwX21hcCwgICAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKKyNlbmRpZgorc3RhdGljIERFVklDRV9BVFRSKHNldF9jb21wbGV4LCAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jXzJfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHNldF9mbGFnLCAgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jXzJfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGFkZF9wYXJzZSwgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX25hbWVfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbF9wYXJzZSwgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2FwcF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWRkX21vZCwgICAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfbmFtZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsX21vZCwgICAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZGRfZnJ3ZCwgICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19uYW1lX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxfZnJ3ZCwgICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGFkZF9hcHBfcnVsZSwgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2FwcF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsX2FwcF9ydWxlLCAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfYXBwX3J1bGUsIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdldF9hcHBfcnVsZSwgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2FwcF9zdG9yZSk7CisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAKK3N0YXRpYyBERVZJQ0VfQVRUUih1ZHBfc3JjLCAgICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY191ZHBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHVkcF9kc3QsICAgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX3VkcF9zdG9yZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorc3RhdGljIERFVklDRV9BVFRSKGFkZF9mbG93X3J1bGUsICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbF9mbG93X3J1bGUsICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdldF9mbG93X3J1bGUsICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHNldF9kc2NwX21hcCwgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2RzY3Bfc3RvcmUpOworI2VuZGlmCitzdGF0aWMgREVWSUNFX0FUVFIoc2V0X3Rjb250LCAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfMl9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodHJhY2VfbGV2ZWwsICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfMV9zdG9yZSk7CisKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNwaF9zcGVjX3Byb2NfYXR0cnNbXSA9IHsKKyAgICAmZGV2X2F0dHJfaGVscC5hdHRyLAorICAgICZkZXZfYXR0cl9oZWxwX2FkZC5hdHRyLAorICAgICZkZXZfYXR0cl9zaG93X2FwcF9kYi5hdHRyLAorICAgICZkZXZfYXR0cl9zaG93X3BhcnNlX25hbWUuYXR0ciwKKyAgICAmZGV2X2F0dHJfc2hvd19tb2RfbmFtZS5hdHRyLAorICAgICZkZXZfYXR0cl9zaG93X2Zyd2RfbmFtZS5hdHRyLAorI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUgICAgIAorICAgICZkZXZfYXR0cl91ZHBfcG9ydHMuYXR0ciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgJmRldl9hdHRyX3Nob3dfZmxvd19ydWxlLmF0dHIsCisgICAgJmRldl9hdHRyX2NsZWFyX2Zsb3dfcnVsZS5hdHRyLAorICAgICZkZXZfYXR0cl9kZWxfZHNjcF9tYXAuYXR0ciwKKyNlbmRpZiAgICAKKyAgICAmZGV2X2F0dHJfc2V0X2NvbXBsZXguYXR0ciwKKyAgICAmZGV2X2F0dHJfc2V0X2ZsYWcuYXR0ciwKKyAgICAmZGV2X2F0dHJfYWRkX3BhcnNlLmF0dHIsCisgICAgJmRldl9hdHRyX2RlbF9wYXJzZS5hdHRyLAorICAgICZkZXZfYXR0cl9hZGRfbW9kLmF0dHIsCisgICAgJmRldl9hdHRyX2RlbF9tb2QuYXR0ciwKKyAgICAmZGV2X2F0dHJfYWRkX2Zyd2QuYXR0ciwKKyAgICAmZGV2X2F0dHJfZGVsX2Zyd2QuYXR0ciwKKyAgICAmZGV2X2F0dHJfYWRkX2FwcF9ydWxlLmF0dHIsICAgIAorICAgICZkZXZfYXR0cl9kZWxfYXBwX3J1bGUuYXR0ciwKKyAgICAmZGV2X2F0dHJfdXBkYXRlX2FwcF9ydWxlLmF0dHIsCisgICAgJmRldl9hdHRyX2dldF9hcHBfcnVsZS5hdHRyLAorI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUgICAgICAgCisgICAgJmRldl9hdHRyX3VkcF9zcmMuYXR0ciwKKyAgICAmZGV2X2F0dHJfdWRwX2RzdC5hdHRyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICAmZGV2X2F0dHJfYWRkX2Zsb3dfcnVsZS5hdHRyLAorICAgICZkZXZfYXR0cl9kZWxfZmxvd19ydWxlLmF0dHIsCisgICAgJmRldl9hdHRyX2dldF9mbG93X3J1bGUuYXR0ciwKKyAgICAmZGV2X2F0dHJfc2V0X2RzY3BfbWFwLmF0dHIsCisjZW5kaWYKKyAgICAmZGV2X2F0dHJfc2V0X3Rjb250LmF0dHIsCisgICAgJmRldl9hdHRyX3RyYWNlX2xldmVsLmF0dHIsCisKKyAgICBOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjcGhfc3BlY19wcm9jX2dyb3VwID0geworICAgIC5uYW1lID0gInByb3RvIiwKKyAgICAuYXR0cnMgPSBjcGhfc3BlY19wcm9jX2F0dHJzLAorfTsKKworSU5UMzIgY3BoX3N5c2ZzX2luaXQoVk9JRCkKK3sKKyAgICBJTlQzMiAgICAgICAgICBlcnIgPSAwOworICAgIHN0cnVjdCBkZXZpY2UgKnBkICA9IE5VTEw7CisKKyAgICBwZCA9IGJ1c19maW5kX2RldmljZV9ieV9uYW1lKCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgImNwaCIpOworICAgIGlmICghcGQpIHsKKyAgICAgICAgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiY3BoIiwgLTEsIE5VTEwsIDApOworICAgICAgICBwZCA9IGJ1c19maW5kX2RldmljZV9ieV9uYW1lKCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgImNwaCIpOworICAgIH0KKworICAgIGlmICghcGQpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIiVzOiBjYW5ub3QgZmluZCBjcGggZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBwZCA9ICZwbGF0Zm9ybV9idXM7CisgICAgfQorCisgICAgZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZC0+a29iaiwgJmNwaF9zcGVjX3Byb2NfZ3JvdXApOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic3lzZnMgZ3JvdXAgZmFpbGVkICVkXG4iLCBlcnIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBJbml0IENQSCBTWVMgRlMgZGF0YSBiYXNlIHRvIGhvbGQgcGFyc2UvbW9kL2Zyd2QgdmFsdWVzICovCisgICAgY3BoX3N5c2ZzX2luaXRfcGFyc2VfZGIoKTsKKyAgICBjcGhfc3lzZnNfaW5pdF9tb2RfZGIoKTsgICAgCisgICAgY3BoX3N5c2ZzX2luaXRfZnJ3ZF9kYigpOworCitvdXQ6CisgICAgcmV0dXJuIGVycjsKK30KKworVk9JRCBjcGhfc3lzZnNfZXhpdChWT0lEKQoreworICAgIHN0cnVjdCBkZXZpY2UgKnBkID0gTlVMTDsKKworICAgIHBkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCAiY3BoIik7CisgICAgaWYgKCFwZCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiIlczogY2Fubm90IGZpbmQgQ1BIIGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN5c2ZzX3JlbW92ZV9ncm91cCgmcGQtPmtvYmosICZjcGhfc3BlY19wcm9jX2dyb3VwKTsKKworICAgIC8qcHJpbnRrKEtFUk5fSU5GTyAiPSBDUEggTW9kdWxlIFNZUyBGUyBleGl0IHN1Y2Nlc3NmdWxseSA9XG4iKTsqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX3N5c2ZzLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODNhMTVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX3N5c2ZzLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfc3lzZnMuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBzeXNmcyBjb21tYW5kIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDExRGVjMjAxMQorKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4xCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX1NZU0ZTX0hfCisjZGVmaW5lIF9NVl9DUEhfU1lTRlNfSF8KKyAgICAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBDUEhfU1lTRlNfRklFTERfTUFYX0xFTiAgICgzMikKKyNkZWZpbmUgQ1BIX1NZU0ZTX0ZJRUxEX01BWF9FTlRSWSAoNjQpCisKKworLyogQ29tbW9uIERCIHN0cnVjdHVyZSBmb3IgZW50cmllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSU5UMzIgIG1heF9lbnRyeV9udW07CisgICAgSU5UMzIgIGVudHJ5X251bTsKKyAgICBJTlQzMiAgZW50cnlfc2l6ZTsKKyAgICBWT0lEICAqZW50cnlfYXJhOworfSBDUEhfU1lTRlNfUlVMRV9UOworCisvKiBQYXJzaW5nIGZpbGVkIGVudHJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgbmFtZVtDUEhfU1lTRlNfRklFTERfTUFYX0xFTisxXTsKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm07CisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgIHBhcnNlX2tleTsKK30gQ1BIX1NZU0ZTX1BBUlNFX1Q7CisKKy8qIE1vZGlmaWNhdGlvbiBmaWxlZCBlbnRyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0hBUiAgICAgICAgICAgICAgICAgIG5hbWVbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibTsgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgIG1vZF92YWx1ZTsKK30gQ1BIX1NZU0ZTX01PRF9UOworCisvKiBGb3J3YXJkaW5nIGZpbGVkIGVudHJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgbmFtZVtDUEhfU1lTRlNfRklFTERfTUFYX0xFTisxXTsKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibTsKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgZnJ3ZF92YWx1ZTsKK30gQ1BIX1NZU0ZTX0ZSV0RfVDsKKworCitJTlQzMiBjcGhfc3lzZnNfaW5pdChWT0lEKTsKK1ZPSUQgY3BoX3N5c2ZzX2V4aXQoVk9JRCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX1NZU0ZTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmM2YTQyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotbWVudSAiU29DIENVU1Qgc3VwcG9ydCIKLWRlcGVuZHMgb24gTVZfSU5DTFVERV9DVVNUCi0KLWNvbmZpZyAgTVZfQ1VTVAotICAgICAgICBib29sICJTdXBwb3J0IGZvciBNYXJ2ZWxsIEN1c3RvbWVyIERyaXZlciIKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIC0tLWhlbHAtLS0KLQotY29uZmlnICBNVl9DVVNUX0lHTVBfSEFORExFCi0gICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DVVNUIElHTVAgaGFuZGxpbmciCi0gICAgICAgIGRlZmF1bHQgeQotICAgICAgICAtLS1oZWxwLS0tCi0KLWNvbmZpZyAgTVZfQ1VTVF9NTERfSEFORExFCi0gICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DVVNUIE1MRCBoYW5kbGluZyIKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIC0tLWhlbHAtLS0KLQotY29uZmlnICBNVl9DVVNUX0xQQktfREVURUNUX0hBTkRMRQotICAgICAgICBib29sICJFbmFibGUgTVZfQ1VTVCBVTkkgbG9vcGJhY2sgZGV0ZWN0IGhhbmRsaW5nIgotICAgICAgICBkZWZhdWx0IHkKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAKLWNvbmZpZyAgTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotICAgICAgICBib29sICJFbmFibGUgTVZfQ1VTVCBzYW1wbGUgVURQIGhhbmRsaW5nIgotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgLS0taGVscC0tLQotCi1jb25maWcgIE1WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DVVNUIGZsb3cgbWFwcGluZyBoYW5kbGluZyIKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIC0tLWhlbHAtLS0gICAgICAgIAotCi1lbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZDI4YjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIE1hcnZlbGwgQ3VzdG9tZXIgZHJpdmVyCi0jCi0KLWlmZXEgKCQoQ09ORklHX0FSQ0hfRkVST0NFT04pLHkpCi0JaW5jbHVkZSAkKHNyY3RyZWUpLyQoTUFDSElORSkvY29uZmlnL212UnVsZXMubWsKLWVuZGlmCi0KLWlmZGVmIENPTkZJR19NVl9IQUxfUlVMRVNfUEFUSAotaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvY29uZmlnL2F1dG8uY29uZgotaW5jbHVkZSAkKHNyY3RyZWUpLyQoc3Vic3QgIiwsJChDT05GSUdfTVZfSEFMX1JVTEVTX1BBVEgpKQotZW5kaWYKLQotQ1VTVF9PQkpTICs9IAltdl9jdXN0X2Rldi5vIFwKLQkJbXZfY3VzdF9tb2QubyBcCi0JCW12X2N1c3RfZmxvd19tYXAubyBcCi0JCW12X2N1c3RfbmV0ZGV2Lm8gXAotCQltdl9jdXN0X3N5c2ZzLm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1tdl9jdXN0LW9ianMgOj0gJChDVVNUX09CSlMpCi1vYmotJChDT05GSUdfTVZfQ1VTVCkgKz0gbXZfY3VzdC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Rldi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5ZjkzYWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIAotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSogCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qIAotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfZGV2LmMKLSoKLSogREVTQ1JJUFRJT046Ci0qICAgICAgIAotKiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotCi0jaW5jbHVkZSAibXZfY3VzdF9kZXYuaCIKLSNpbmNsdWRlICJtdl9jdXN0X25ldGRldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfZmxvd19tYXAuaCIKLSNpbmNsdWRlICJtdl9jdXN0X21uZ19pZi5oIgotCi0KLS8qIFVzZWQgdG8gcHJldmVudCBtdWx0aXBsZSBhY2Nlc3MgdG8gZGV2aWNlICovCi1zdGF0aWMgaW50ICAgICAgICAgICAgICAgbXZjdXN0X2RldmljZV9vcGVuID0gMDsKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtdmN1c3RfbWlzY19kZXY7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG12Y3VzdF9kZXZfb3BlbgotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGV4ZWN1dGUgZGV2aWNlIG9wZW4gYWN0aW9ucwotKioKLSoqICBQQVJBTUVURVJTOiAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBtdmN1c3RfZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JTVZDVVNUX0RFQlVHX1BSSU5UKCJFbnRlciIpOwotCi0gICAvLyBpZiAobXZjdXN0X2RldmljZV9vcGVuID4gMCkKLSAgIC8vICAgICByZXR1cm4gLUVCVVNZOwotCi0JbXZjdXN0X2RldmljZV9vcGVuKys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgbXZjdXN0X2Rldl9yZWxlYXNlCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZSBkZXZpY2UgcmVsZWFzZSBhY3Rpb25zCi0qKgotKiogIFBBUkFNRVRFUlM6ICAKLSoqICAgICAgICAgICAgICAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqCi0qKiAgT1VUUFVUUzogICAgIE5vbmUKLSoqCi0qKiAgUkVUVVJOUzogICAgICgwKQotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IG12Y3VzdF9kZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICBNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0KLSAgIC8vIGlmIChtdmN1c3RfZGV2aWNlX29wZW4gPiAwKQotICAgLy8gICAgIG12Y3VzdF9kZXZpY2Vfb3Blbi0tOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG12X2N1c3RfZGV2X2lvY3RsCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZSBJTyBjb21tYW5kcwotKioKLSoqICBQQVJBTUVURVJTOiAgc3RydWN0IGlub2RlICppbm9kZQotKiogICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscAotKiogICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kCi0qKiAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBtdmN1c3RfZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLSAgICBtdl9jdXN0X2lvY3RsX29tY2lfc2V0X3QgICAgICBjdXN0X29tY2lfc2V0OwotICAgIG12X2N1c3RfaW9jdGxfbGxpZF9zZXRfdCAgICAgIGN1c3RfbGxpZF9zZXQ7Ci0gICAgbXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICAgICAgY3VzdF9mbG93X21hcDsKLSAgICBtdl9jdXN0X2lvY3RsX2RzY3BfbWFwX3QgICAgICBjdXN0X2RzY3BfbWFwOwotICAgIG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3QgICAgIGN1c3RfYXBwX2V0eXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICByYzsKLQotICBpbnQgIHJldCA9IC1FSU5WQUw7Ci0KLSAgICBNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0KLSAgc3dpdGNoKGNtZCkKLSAgewotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX09NQ0lfU0VUOgotCi0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmN1c3Rfb21jaV9zZXQsIChtdl9jdXN0X2lvY3RsX29tY2lfc2V0X3QqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfb21jaV9zZXRfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJjID0gbXZfY3VzdF9vbWNpX3NldChjdXN0X29tY2lfc2V0LnRjb250LCBjdXN0X29tY2lfc2V0LnR4cSwgY3VzdF9vbWNpX3NldC5nZW1wb3J0LCBjdXN0X29tY2lfc2V0LmtlZXBfcnhfbWgpOwotICAgICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoIm12X2N1c3Rfb21jaV9zZXQgZmFpbGVkXG4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX09NQ0lfRU5BQkxFOgotCi0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmVuYWJsZSwgKGludCAqKWFyZywgc2l6ZW9mKGludCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLSAgICAgICAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChNVl9DVVNUX0FQUF9UWVBFX09NQ0ksIGVuYWJsZSk7Ci0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0VPQU1fRU5BQkxFOgotCi0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmVuYWJsZSwgKGludCAqKWFyZywgc2l6ZW9mKGludCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLSAgICAgICAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChNVl9DVVNUX0FQUF9UWVBFX09BTSwgZW5hYmxlKTsKLSAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1WX0NVU1RfSU9DVExfRU9BTV9MTElEX1NFVDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9sbGlkX3NldCwgKGludCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfbGxpZF9zZXRfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG12X2N1c3RfZW9hbV9sbGlkX3NldChjdXN0X2xsaWRfc2V0LmxsaWQsICYoY3VzdF9sbGlkX3NldC5sbGlkX21hY1swXSksIGN1c3RfbGxpZF9zZXQudHhxKTsKLSAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1WX0NVU1RfSU9DVExfTUFQX1JVTEVfU0VUOgotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X2Zsb3dfbWFwLCAobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICopYXJnLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF9tYXBfcnVsZV9zZXQoJmN1c3RfZmxvd19tYXApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1WX0NVU1RfSU9DVExfRFNDUF9NQVBfU0VUOgotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X2RzY3BfbWFwLCAobXZfY3VzdF9pb2N0bF9kc2NwX21hcF90ICopYXJnLCBzaXplb2YobXZfY3VzdF9pb2N0bF9kc2NwX21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF9kc2NwX21hcF9zZXQoJmN1c3RfZHNjcF9tYXAuZHNjcF9tYXApOwotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX0RFTDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9mbG93X21hcCwgKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJldCA9IG12X2N1c3RfbWFwX3J1bGVfZGVsKCh1aW50MTZfdCljdXN0X2Zsb3dfbWFwLnZpZCwgKHVpbnQ4X3QpY3VzdF9mbG93X21hcC5wYml0cywgY3VzdF9mbG93X21hcC5kaXIpOwotICAgICAgICAgIGJyZWFrOyAKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0RTQ1BfTUFQX0RFTDoKLQotICAgICAgICAgIHJldCA9IG12X2N1c3RfZHNjcF9tYXBfZGVsKCk7Ci0gICAgICAgICAgYnJlYWs7IAotICAgICAgICAgIAotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX0NMRUFSOgotICAgICAgCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF9tYXBfcnVsZV9jbGVhcigpOwotICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICAKLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9UQUdfTUFQX1JVTEVfR0VUOgotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X2Zsb3dfbWFwLCAobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICopYXJnLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfQotICAgICAgCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF90YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3dfbWFwKTsKLQotICAgICAgICAgIGlmKHJldCAhPSBNVl9DVVNUX09LKQotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLQotICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KilhcmcsICZjdXN0X2Zsb3dfbWFwLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX1VOVEFHX01BUF9SVUxFX0dFVDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9mbG93X21hcCwgKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLSAgICAgIAotICAgICAgICAgIHJldCA9IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3dfbWFwKTsKLQotICAgICAgICAgIGlmKHJldCAhPSBNVl9DVVNUX09LKQotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLQotICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KilhcmcsICZjdXN0X2Zsb3dfbWFwLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0FQUF9FVEhfVFlQRV9TRVQ6Ci0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmN1c3RfYXBwX2V0eXBlLCAobXZfY3VzdF9pb2N0bF9hcHBfZXR5cGVfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3QpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtdl9jdXN0X2FwcF9ldHlwZV9zZXQoY3VzdF9hcHBfZXR5cGUuYXBwX3R5cGUsIGN1c3RfYXBwX2V0eXBlLmV0aF90eXBlKTtcCi0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsgCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0ID0gLUVJTlZBTDsKLSAgfQotCi1pb2N0bEVycjoKLSAgICByZXR1cm4ocmV0KTsKLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtdmN1c3RfZGV2X2ZvcHMgPSAKLXsKLQkub3BlbiAgICA9IG12Y3VzdF9kZXZfb3BlbiwKLQkucmVsZWFzZSA9IG12Y3VzdF9kZXZfcmVsZWFzZSwKLQkuaW9jdGwgICA9IG12Y3VzdF9kZXZfaW9jdGwsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICBtdmN1c3RfZGV2X2luaXQKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgREVTQ1JJUFRJT046IAotKioKLSoqICBQQVJBTUVURVJTOiAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50MzJfdCBtdmN1c3RfZGV2X2luaXQodm9pZCkKLXsKLSAgICBpbnQgcmM7Ci0KLSAgICBNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0gICAgCi0gICAgbXZjdXN0X21pc2NfZGV2Lm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOwotICAgIG12Y3VzdF9taXNjX2Rldi5uYW1lICA9IE1WQ1VTVF9ERVZJQ0VfTkFNRTsKLSAgICBtdmN1c3RfbWlzY19kZXYuZm9wcyAgPSAmbXZjdXN0X2Rldl9mb3BzOwotCi0gICAgcmMgPSBtaXNjX3JlZ2lzdGVyKCZtdmN1c3RfbWlzY19kZXYpOwotICAgIGlmIChyYyAhPSAwKSAKLSAgICB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoInJjPSVkIixyYyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByYyA9IG12Y3VzdF9uZXRkZXZfaW5pdCgpOwotICAgIGlmIChyYyAhPSAwKSAKLSAgICB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoInJjPSVkIixyYyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByYyA9IG12Y3VzdF9zeXNmc19pbml0KCk7Ci0gICAgaWYgKHJjICE9IDApIAotICAgIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgicmM9JWQiLHJjKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHByaW50aygiTVZDVVNUOiBtaXNjIGRldmljZSAlcyByZWdpc3RlcmVkIHdpdGggbWlub3I6ICVkXG4iLCBNVkNVU1RfREVWSUNFX05BTUUsIG12Y3VzdF9taXNjX2Rldi5taW5vcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgbXZjdXN0X2Rldl9zaHV0ZG93bgotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogCi0qKgotKiogIFBBUkFNRVRFUlM6ICAKLSoqICAgICAgICAgICAgICAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqCi0qKiAgT1VUUFVUUzogICAgIE5vbmUKLSoqCi0qKiAgUkVUVVJOUzogICAgICgwKQotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG12Y3VzdF9kZXZfc2h1dGRvd24odm9pZCkKLXsKLQlNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0KLSAgICBtdmN1c3Rfc3lzZnNfZGVsZXRlKCk7Ci0KLSAgICBtaXNjX2RlcmVnaXN0ZXIoJm12Y3VzdF9taXNjX2Rldik7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9kZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQyNTAzYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9kZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKgotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfZGV2LmgKLSoKLSogREVTQ1JJUFRJT046Ci0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTVZfQ1VTVF9ERVZfSF9fCi0jZGVmaW5lIF9fTVZfQ1VTVF9ERVZfSF9fCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLSNkZWZpbmUgTVZfQ1VTVF9WRVJTSU9OICAgICAiVjIuNi4yNSIKLSNkZWZpbmUgTVZDVVNUX0RFVklDRV9OQU1FICAiY3VzdCIKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9NQUdJQyAoJ0MnKQotCi0jaWZkZWYgTVZfQ1VTVF9ERUJVRwotI2RlZmluZSBNVkNVU1RfREVCVUdfUFJJTlQoZm9ybWF0LCAuLi4pICAgcHJpbnRrKCIlcyglZCk6ICAiZm9ybWF0LF9fRlVOQ1RJT05fXyxfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXykKLSNlbHNlCi0jZGVmaW5lIE1WQ1VTVF9ERUJVR19QUklOVChmb3JtYXQsIC4uLikKLSNlbmRpZgotCi0jZGVmaW5lIE1WQ1VTVF9FUlJfUFJJTlQoZm9ybWF0LCAuLi4pICAgICBwcmludGsoIiVzKCVkKSBFUlJPUjogICJmb3JtYXQsX19GVU5DVElPTl9fLF9fTElORV9fLCAjI19fVkFfQVJHU19fKQotCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIHBsYXRmb3JtX2J1c190eXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiBwcm90b3R5cGVzIC0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50MzJfdCBtdmN1c3RfZGV2X2luaXQgICAgICAgICh2b2lkKTsKLXZvaWQgICAgbXZjdXN0X2Rldl9zaHV0ZG93biAgICAodm9pZCk7Ci0KLWludCAgICAgbXZjdXN0X25ldGRldl9pbml0ICAgICAodm9pZCk7Ci1pbnQgICAgIG12Y3VzdF9zeXNmc19pbml0ICAgICAgKHZvaWQpOwotdm9pZCAgICBtdmN1c3Rfc3lzZnNfZGVsZXRlICAgICh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi12b2lkICAgIG12X2N1c3RfdWRwX3NwZWNfcHJpbnRfYWxsICh2b2lkKTsKLSNlbmRpZgotdm9pZCAgICBtdl9jdXN0X2RlYnVnX2luZm9fc2V0ICAgICAoaW50IHZhbCk7Ci0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLXZvaWQgbXZfY3VzdF9mbG93X21hcF9wcmludCh2b2lkKTsKLQotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qX19NVl9DVVNUX0RFVl9IX18qLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3NzMzZTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qIFRoaXMgaXMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgU09VUkNFIENPREUgb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwOwotKiB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBub3QgYmUgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMsIGNvcGllZAotKiBvciBkdXBsaWNhdGVkIGluIGFueSBmb3JtLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBwcmlvcgotKiB3cml0dGVuIHBlcm1pc3Npb24gb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qCi0qIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQotKiBESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5Ci0qIGRpc2NsYWltZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogbXZfY3VzdF9mbG93X21hcC5jCi0qCi0qIERFU0NSSVBUSU9OOgotKiAgIFZpY3RvciAgLSBpbml0aWFsIHZlcnNpb24gY3JlYXRlZC4gICAxMi9EZWMvMjAxMSAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bXZDb21tb24uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvaXB2Ni5oPgotCi0jaW5jbHVkZSA8bXZPcy5oPgotI2luY2x1ZGUgPGN0cmxFbnYvbXZDdHJsRW52TGliLmg+Ci0KLSNpbmNsdWRlICJtdl9jdXN0X2Rldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfbmV0ZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9mbG93X21hcC5oIgotI2luY2x1ZGUgIm12X2N1c3RfbW5nX2lmLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgbXZfY3VzdF92aWRfaW5kZXhfdCAgZ3NfdmlkX2luZGV4X3RhYmxlW01WX0NVU1RfRkxPV19ESVJfTlVNXTsKLXN0YXRpYyBtdl9jdXN0X3BiaXRzX21hcF90ICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9OVU1dW01WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFXTsKLXN0YXRpYyBtdl9jdXN0X2RzY3BfcGJpdHNfdCBnc19kc2NwX21hcF90YWJsZTsKLQotc3RhdGljIHVpbnQzMl90IGdzX212X2N1c3RfdHJhY2VfZmxhZyA9IDA7Ci0KLS8qIERlZmluZWQgdG8gc3VwcG9ydCBULUNPTlQgc3RhdGUgKi8KLXN0YXRpYyBib29sIGdzX3Rjb250X3N0YXRlW0NQSF9NQVhfVENPTlRfTlVNXTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIERlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9zZXRfdHJhY2VfZmxhZwotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIG12X2N1c3QgdHJhY2UgZmxhZy4KLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIGVuVHJhY2UgICAgIC0gRW5hYmxlIG9yIGRpc2FibGUgbXZfY3VzdCB0cmFjZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotaW50IG12X2N1c3Rfc2V0X3RyYWNlX2ZsYWcodWludDMyX3QgZW5UcmFjZSkKLXsKLSAgICBnc19tdl9jdXN0X3RyYWNlX2ZsYWcgPSBlblRyYWNlOwotICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdmFsaWRfcGJpdHNfdGFibGVfZ2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldHMgYXZhaWxhYmxlIFAtYml0cyBtYXBwaW5nIHRhYmxlLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIEF2YWlsYWJsZSBQLWJpdHMgbWFwcGluZyB0YWJsZSBpbmRleC4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotdWludDMyX3QgbXZfY3VzdF92YWxpZF9wYml0c190YWJsZV9nZXQobXZfY3VzdF9mbG93X2Rpcl9lIGRpcikKLXsKLSAgICB1aW50MzJfdCB0YWJsZV9pZHggPSAwOwotCi0gICAgLyogVGFibGUgaW5kZXggTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUgaXMgcmVzZXJ2ZWQgZm9yIHRhZ2dlZCBkZWZhdWx0IHBhY2tldHMgKi8KLSAgICBmb3IgKHRhYmxlX2lkeD0wOyB0YWJsZV9pZHg8TVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUtMTsgdGFibGVfaWR4KyspIHsKLSAgICAKLSAgICAgICBpZiAoZ3NfcGJpdHNfbWFwX3RhYmxlW2Rpcl1bdGFibGVfaWR4XS5pbl91c2UgPT0gMCkKLSAgICAgICAgICAgcmV0dXJuIHRhYmxlX2lkeDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X3BiaXRzX3RhYmxlX3N0YXR1c19nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBQLWJpdHMgbWFwcGluZyB0YWJsZSBzdGF0dXMuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBwYml0c19tYXAgICAtIFAtYml0cyBtYXBwaW5nIHRhYmxlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgMDpObyBQLWJpdHMgbWFwcGluZyBydWxlIGV4aXN0IGluIGN1cnJlbnQgdGFibGUsIDE6IHN0aWxsIGV4aXN0cyBQLWJpdHMgbWFwcGluZyBydWxlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCi11aW50MzJfdCBtdl9jdXN0X3BiaXRzX3RhYmxlX3N0YXR1c19nZXQobXZfY3VzdF9wYml0c19tYXBfdCAqcGJpdHNfbWFwKQotewotICAgIHVpbnQzMl90IHBiaXRzX2lkeCA9IDA7Ci0KLSAgICBmb3IgKHBiaXRzX2lkeD0wOyBwYml0c19pZHg8TVZfQ1VTVF9QQklUU19NQVBfTUFYX0VOVFJZX05VTTsgcGJpdHNfaWR4KyspIHsKLSAgICAKLSAgICAgICBpZiAocGJpdHNfbWFwLT5wa3RfZndkW3BiaXRzX2lkeF0uaW5fdXNlICE9IDApCi0gICAgICAgICAgIHJldHVybiBNVl9DVVNUX09LOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfc2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgR1BPTiBmbG93IG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIGN1c3RfZmxvdyAgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfbWFwX3J1bGVfc2V0KG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqY3VzdF9mbG93KQotewotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICpwVmlkRW50cnkgID0gTlVMTDsKLSAgICBtdl9jdXN0X3BiaXRzX21hcF90ICAqcFBiaXRzTWFwICA9IE5VTEw7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIHBiaXRzSW5kZXggPSAwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBpbmRleCAgICAgID0gMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgdmlkICAgICAgICA9IDA7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIHBiaXRzICAgICAgPSAwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtb2RfdmlkICAgID0gMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgbW9kX3BiaXRzICA9IDA7ICAgCi0gICAgbXZfY3VzdF9mbG93X2Rpcl9lICAgIGRpciAgICAgICAgPSBNVl9DVVNUX0ZMT1dfRElSX1VTOyAgICAKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgICAqcGt0X2Z3ZCAgICA9IE5VTEw7Ci0KLSAgICAvKiBHZXQgaW5wdXQgaW5mb3JtYXRpb246IFZJRCwgUC1iaXRzLi4uICovCi0gICAgaWYgKGN1c3RfZmxvdyA9PSBOVUxMKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgImN1c3RfZmxvdyBpcyBOVUxMIFxuXHIiKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9IAotICAgIHZpZCAgICAgICA9ICBjdXN0X2Zsb3ctPnZpZDsKLSAgICBwYml0cyAgICAgPSAgY3VzdF9mbG93LT5wYml0czsKLSAgICBtb2RfdmlkICAgPSAgY3VzdF9mbG93LT5tb2RfdmlkOwotICAgIG1vZF9wYml0cyA9ICBjdXN0X2Zsb3ctPm1vZF9wYml0czsgICAgCi0gICAgcGt0X2Z3ZCAgID0gJmN1c3RfZmxvdy0+cGt0X2Zyd2Q7Ci0gICAgZGlyICAgICAgID0gIGN1c3RfZmxvdy0+ZGlyOwotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PSVzOiB2aWRbJWRdLCBwYml0c1slZF0sIG1vZF92aWRbJWRdLCBtb2RfcGJpdHNbJWRdLCBULUNPTlRbJWRdLCBTV0YgcXVldWVbJWRdLCBIV0YgcXVldWVbJWRdLCBHRU0gcG9ydFslZF0sIGRpclslZF1cblxyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZpZCwgcGJpdHMsIG1vZF92aWQsIG1vZF9wYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGt0X2Z3ZCE9IE5VTEwpPyBwa3RfZndkLT50cmdfcG9ydDowKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBrdF9md2QhPSBOVUxMKT8gcGt0X2Z3ZC0+dHJnX3F1ZXVlOjApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGt0X2Z3ZCE9IE5VTEwpPyBwa3RfZndkLT50cmdfaHdmX3F1ZXVlOjApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGt0X2Z3ZCE9IE5VTEwpPyBwa3RfZndkLT5nZW1fcG9ydDowKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+ZGlyKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBWSUQgKi8KLSAgICBpZiAodmlkID4gKE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFIC0gMSkpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAidmlkWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCB2aWQsIChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0gICAgCi0gICAgLyogQ2hlY2sgUC1iaXRzICovCi0gICAgaWYgKHBiaXRzID4gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJQLWJpdHNbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHBiaXRzLCBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBtb2QgVklEICovCi0gICAgaWYgKG1vZF92aWQgPiAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJtb2RfdmlkWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBtb2RfdmlkLCAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIG1vZCBQLWJpdHMgKi8KLSAgICBpZiAobW9kX3BiaXRzID4gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJtb2RfcGJpdHNbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIG1vZF9wYml0cywgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZGlyICovCi0gICAgaWYgKGRpciA+PSBNVl9DVVNUX0ZMT1dfRElSX05VTSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJkaXJbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIGRpciwgTVZfQ1VTVF9GTE9XX0RJUl9OVU0tMSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfSAgICAKLQotICAgIC8qIENoZWNrIHRhcmdldCBwb3J0L3F1ZXVlL0dFTSBwb3J0ICovIAotICAgIGlmIChwa3RfZndkLT50cmdfcG9ydCA+IE1WX0NVU1RfTUFYX1RSR19QT1JUX1ZBTFVFKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgInRyZ19wb3J0WyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwa3RfZndkLT50cmdfcG9ydCwgTVZfQ1VTVF9NQVhfVFJHX1BPUlRfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLQotICAgIGlmIChwa3RfZndkLT50cmdfcXVldWUgPiBNVl9DVVNUX01BWF9UUkdfUVVFVUVfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiU1dGIHRyZ19xdWV1ZVslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgcGt0X2Z3ZC0+dHJnX3F1ZXVlLCBNVl9DVVNUX01BWF9UUkdfUVVFVUVfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0gICAKLQotICAgIGlmIChwa3RfZndkLT50cmdfaHdmX3F1ZXVlID4gTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgIkhXRiB0cmdfcXVldWVbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHBrdF9md2QtPnRyZ19xdWV1ZSwgTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9ICAgICAgIAotCi0gICAgaWYgKHBrdF9md2QtPmdlbV9wb3J0ID4gTVZfQ1VTVF9NQVhfR0VNX1BPUlRfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAidHJnX3F1ZXVlWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwa3RfZndkLT5nZW1fcG9ydCwgTVZfQ1VTVF9NQVhfR0VNX1BPUlRfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0gICAgICAgICAgCi0gCi0gICAgCi0gICAgLyogRmluZCBWSUQgaW5kZXggZW50cnkgYnkgVklEICovICAgIAotICAgIHBWaWRFbnRyeSA9ICZnc192aWRfaW5kZXhfdGFibGVbZGlyXS5wYml0c19tYXBfaW5kZXhbdmlkXTsKLQotICAgIC8qIEdldCBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIC8qIElmIHRoaXMgVklEIGluZGV4IGVudHJ5IGRvZXMgbm90IHBvaW50IHRvIGFueSBQLWJpdHMgbWFwcGluZyB0YWJsZSwKLSAgICAgICBuZWVkIHRvIHNlYXJjaCBmb3IgYW4gYXZhaWxhYmxlIFAtYml0cyBtYXBwaW5nIHRhYmxlICAgICAgICAgICAgICovCi0gICAgaWYgKCpwVmlkRW50cnkgPj0gTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpIHsKLSAgICAgICAgLyogUmVzZXJ2ZWQgZm9yIGRlZmF1bHQgdGFnZ2VkIHJ1bGUgKi8KLSAgICAgICAgaWYgKHZpZCA9PSBNVl9DVVNUX0RFRkFVTFRfU0lOR0xFX1RBR19SVUxFKQotICAgICAgICAgICAgcGJpdHNJbmRleCA9IE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFIC0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcGJpdHNJbmRleCA9IG12X2N1c3RfdmFsaWRfcGJpdHNfdGFibGVfZ2V0KGRpcik7Ci0gICAgICAgIAotICAgICAgICBpZiAocGJpdHNJbmRleCA+PSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiICVkIFAtYml0cyBtYXBwaW5nIHRhYmxlIGhhcyB1c2VkIG91dFxuXHIiLCBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVgpOwotICAgICAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsgICAgIAotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAgIC8qIEluIGNhc2UgdGhhdCB0aGUgVklEIGluZGV4IGFscmVhZHkgcG9pbnRzIHRvIGEgUC1iaXRzIG1hcHBpbmcgdGFibGUsCi0gICAgICAgTmVlZCB0byByZXBsYWNlIHRoZSBmb3J3YXJkaW5nIGluZm9ybWF0aW9uIG9mIHRoaXMgUC1iaXQgbWFwcGluZyB0YWJsZSAqLwotICAgIGVsc2UgewotICAgICAgICBwYml0c0luZGV4ID0gKnBWaWRFbnRyeTsKLSAgICB9Ci0gICAgcFBiaXRzTWFwID0gJmdzX3BiaXRzX21hcF90YWJsZVtkaXJdW3BiaXRzSW5kZXhdOwotCi0gICAgLyogSWYgbGVnYWwgUC1iaXRzIGlzIGNvbmZpZ3VyZWQgKi8KLSAgICBpZiAocGJpdHMgPCBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKSB7Ci0gICAgICAgIC8qIEluIGNhc2UgdG8gZW5hYmxlIHBhY2tldCBmb3J3YXJkaW5nICovCi0gICAgICAgIGlmIChwa3RfZndkLT5pbl91c2UgIT0gMCkgewotICAgICAgICAKLSAgICAgICAgICAgIC8qIFNhdmUgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiAqLyAgICAgICAgCi0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19wb3J0ICAgICAgPSBwa3RfZndkLT50cmdfcG9ydDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX3F1ZXVlICAgICA9IHBrdF9md2QtPnRyZ19xdWV1ZTsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX2h3Zl9xdWV1ZSA9IHBrdF9md2QtPnRyZ19od2ZfcXVldWU7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLmdlbV9wb3J0ICAgICAgPSBwa3RfZndkLT5nZW1fcG9ydDsKLQotICAgICAgICAgICAgLyogU2F2ZSBtb2RfdmlkIG1vZF9wYml0cyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfdmlkW3BiaXRzXSAgICAgICAgICAgPSBtb2RfdmlkOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNdICAgICAgICAgPSBtb2RfcGJpdHM7Ci0KLSAgICAgICAgICAgIC8qIEVuYWJsZSBpbl91c2UgZmxhZyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5pbl91c2UgICAgPSAxOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICAgICAgPSAxOwotCi0gICAgICAgICAgICAvKiBTYXZlIFAtYml0IG1hcHBpbmcgdGFibGUgaW5kZXggaW4gVklEIGluZGV4IHRhYmxlICovCi0gICAgICAgICAgICAqcFZpZEVudHJ5ID0gcGJpdHNJbmRleDsgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgLyogSW4gY2FzZSB0byBkaXNhYmxlIHBhY2tldCBmb3J3YXJkaW5nICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogQ2xlYXIgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiAqLyAgICAgICAgCi0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19wb3J0ICAgICAgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS50cmdfcXVldWUgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX2h3Zl9xdWV1ZSA9IDA7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLmdlbV9wb3J0ICAgICAgPSAwOwotCi0gICAgICAgICAgICAvKiBDbGVhciBtb2RfdmlkIG1vZF9wYml0cyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfdmlkW3BiaXRzXSAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNdICAgICAgICAgPSAwOyAgICAgICAgICAKLQotICAgICAgICAgICAgLyogRGlzYWJsZSBpbl91c2UgZmxhZyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5pbl91c2UgICAgPSAwOwotICAgICAgICAgICAgaWYgKG12X2N1c3RfcGJpdHNfdGFibGVfc3RhdHVzX2dldChwUGJpdHNNYXApICE9IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICBwUGJpdHNNYXAtPmluX3VzZSAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICAqcFZpZEVudHJ5ICAgICAgICAgICAgICAgICAgICAgID0gTVZfQ1VTVF9JTlZBTElEX1BCSVRTX1RBQkxFX0lOREVYOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgKnBWaWRFbnRyeSAgICAgICAgICAgICAgICAgICAgICA9IHBiaXRzSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogSWYgZG9lcyBub3QgY2FyZSBmb3IgUC1iaXRzLCBlYWNoIFAtYml0cyBtYXBwaW5nIGVudHJ5IHNob3VsZCBiZSBzZXQgKi8KLSAgICBlbHNlIGlmIChwYml0cyA9PSBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKSB7Ci0KLSAgICAgICAgaW5kZXggPSBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFOwotCi0gICAgICAgIC8qIEluIGNhc2UgdG8gZW5hYmxlIHBhY2tldCBmb3J3YXJkaW5nICovCi0gICAgICAgIGlmIChwa3RfZndkLT5pbl91c2UgIT0gMCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBTYXZlIGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8gICAgICAgIAotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS50cmdfcG9ydCAgICAgID0gcGt0X2Z3ZC0+dHJnX3BvcnQ7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbaW5kZXhdLnRyZ19xdWV1ZSAgICAgPSBwa3RfZndkLT50cmdfcXVldWU7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19od2ZfcXVldWUgPSBwa3RfZndkLT50cmdfaHdmX3F1ZXVlOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS5nZW1fcG9ydCAgICAgID0gcGt0X2Z3ZC0+Z2VtX3BvcnQ7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbaW5kZXhdLmluX3VzZSAgICAgICAgPSAxOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBTYXZlIG1vZF92aWQgbW9kX3BiaXRzICovCi0gICAgICAgICAgICBwUGJpdHNNYXAtPm1vZF92aWRbaW5kZXhdICAgICAgICAgICA9IG1vZF92aWQ7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPm1vZF9wYml0c1tpbmRleF0gICAgICAgICA9IG1vZF9wYml0czsgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKiBFbmFibGUgaW5fdXNlIGZsYWcgKi8KLSAgICAgICAgICAgIHBQYml0c01hcC0+aW5fdXNlID0gMTsKLQotICAgICAgICAgICAgLyogU2F2ZSBQLWJpdCBtYXBwaW5nIHRhYmxlIGluZGV4IGluIFZJRCBpbmRleCB0YWJsZSAqLwotICAgICAgICAgICAgKnBWaWRFbnRyeSA9IHBiaXRzSW5kZXg7ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIC8qIEluIGNhc2UgdG8gZGlzYWJsZSBwYWNrZXQgZm9yd2FyZGluZyAqLwotICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENsZWFyIGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8gICAgICAgIAotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS50cmdfcG9ydCAgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0udHJnX3F1ZXVlICAgICA9IDA7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19od2ZfcXVldWUgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS5nZW1fcG9ydCAgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0uaW5fdXNlICAgICAgICA9IDA7Ci0gICAgICAgICAgICAvKiBjbGVhciBtb2RfdmlkIG1vZF9wYml0cyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfdmlkW2luZGV4XSAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbaW5kZXhdICAgICAgICAgPSAwOwotCi0gICAgICAgICAgICAvKiBEaXNhYmxlIGluX3VzZSBmbGFnICovCi0gICAgICAgICAgICBpZiAobXZfY3VzdF9wYml0c190YWJsZV9zdGF0dXNfZ2V0KHBQYml0c01hcCkgIT0gTVZfQ1VTVF9PSykgewotICAgICAgICAgICAgICAgIHBQYml0c01hcC0+aW5fdXNlICAgICAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgICAgICpwVmlkRW50cnkgICAgICAgICAgICAgICAgICAgICAgPSBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUGJpdHNNYXAtPmluX3VzZSAgICAgICAgICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICAqcFZpZEVudHJ5ICAgICAgICAgICAgICAgICAgICAgID0gcGJpdHNJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09ICVzOlxuXHIiLF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7ICAgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9kc2NwX21hcF9zZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBHUE9OIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIGRzY3BfbWFwICAgICAtIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfZHNjcF9tYXBfc2V0KG12X2N1c3RfZHNjcF9wYml0c190ICpkc2NwX21hcCkKLXsKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FTlRFUj09JXM6IGluX3VzZVslZF1cblxyIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkc2NwX21hcCE9IE5VTEwpPyBkc2NwX21hcC0+aW5fdXNlOjApKTsKLSAgICB9Ci0KLSAgICBpZiAoZHNjcF9tYXAgPT0gTlVMTCkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJJbnB1dCBkc2NwX21hcCBpcyBOVUxMXG5cciIpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLQotICAgIC8qIENhc2UgMTogdG8gZW5hYmxlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KLSAgICBpZiAoZHNjcF9tYXAtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgIG1lbWNweSgmZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbMF0sICZkc2NwX21hcC0+cGJpdHNbMF0sIHNpemVvZihnc19kc2NwX21hcF90YWJsZS5wYml0cykpOwotICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAxOwotICAgIAotICAgIH0KLSAgICAvKiBDYXNlIDI6IHRvIGRpc2FibGUgRFNDUCB0byBQLWJpdHMgbWFwcGluZyAqLwotICAgIGVsc2UgewotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihnc19kc2NwX21hcF90YWJsZSkpOwotICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT0gJXM6XG5cciIsX19GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7ICAgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfcnVsZV9kZWwKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGVsZXRlcyBHUE9OIGZsb3cgbWFwcGluZyBydWxlcwotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgdmlkICAgICAgICAgLSBWTEFOIElELgotKiogICAgICBwYml0cyAgICAgIC0gODAyLjFwIHZhbHVlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUgCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfbWFwX3J1bGVfZGVsKHVpbnQxNl90IHZpZCwgdWludDhfdCBwYml0cywgbXZfY3VzdF9mbG93X2Rpcl9lIGRpcikKLXsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAqcFZpZEVudHJ5ICA9IE5VTEw7Ci0gICAgbXZfY3VzdF9wYml0c19tYXBfdCAgKnBQYml0c01hcCAgPSBOVUxMOwotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PTogdmlkWyVkXSxwYml0c1slZF1cblxyIiwgdmlkLCBwYml0cyk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgVklEICovCi0gICAgaWYgKHZpZCA+IChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgInZpZFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgdmlkLCAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIFAtYml0cyAqLwotICAgIGlmIChwYml0cyA+IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiUC1iaXRzWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwYml0cywgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZGlyICovCi0gICAgaWYgKGRpciA+PSBNVl9DVVNUX0ZMT1dfRElSX05VTSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJkaXJbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIGRpciwgTVZfQ1VTVF9GTE9XX0RJUl9OVU0tMSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfSAgIAotCi0gICAgLyogRmluZCBWSUQgaW5kZXggZW50cnkgYnkgVklEICovICAgIAotICAgIHBWaWRFbnRyeSA9ICZnc192aWRfaW5kZXhfdGFibGVbZGlyXS5wYml0c19tYXBfaW5kZXhbdmlkXTsKLQotICAgIGlmICgqcFZpZEVudHJ5ID49IE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFKSB7Ci0gICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLCIlcywgcFZpZEVudHJ5WyVkXSwgZG9lcyBub3QgbmVlZCB0byBkZWxldGUgXG5cciIsX19GVU5DVElPTl9fLCAqcFZpZEVudHJ5KTsgICAgCi0gICAgICAgIHJldHVybiBNVl9DVVNUX09LOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBGaW5kIFAtYml0cyBtYXBwaW5nIHRhYmxlICovCi0gICAgcFBiaXRzTWFwID0gJmdzX3BiaXRzX21hcF90YWJsZVtkaXJdWypwVmlkRW50cnldOwotCi0gICAgLyogRGVsZXRlIFAtYml0cyBtYXBwaW5nIHJ1bGUgKi8KLSAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19wb3J0ICAgPSAwOwotICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX3F1ZXVlICA9IDA7Ci0gICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5nZW1fcG9ydCAgID0gMDsKLSAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLmluX3VzZSAgICAgPSAwOwotICAgIHBQYml0c01hcC0+bW9kX3ZpZFtwYml0c10gICAgICAgICAgICA9IDA7Ci0gICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNdICAgICAgICAgID0gMDsgICAgICAgICAgCi0gICAgCi0gICAgLyogRGlzYWJsZSBpbl91c2UgZmxhZyAqLwotICAgIGlmIChtdl9jdXN0X3BiaXRzX3RhYmxlX3N0YXR1c19nZXQocFBiaXRzTWFwKSE9IE1WX0NVU1RfT0spIHsKLSAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICAgPSAwOwotICAgICAgICAqcFZpZEVudHJ5ICAgICAgICAgICAgICAgICAgICAgICA9IE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWDsKLSAgICB9Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT06XG5cciIpOwotICAgIH0KLQotICAgIHJldHVybiBNVl9DVVNUX09LOyAgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9kc2NwX21hcF9kZWwKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGVsZXRlcyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBOb25lLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X2RzY3BfbWFwX2RlbCh2b2lkKQotewotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVOVEVSPT1cblxyIik7Ci0gICAgfQotCi0gICAgLyogQ2xlYXIgRFNDUCB0byBQLWJpdHMgbWFwcGluZyAqLwotICAgIGVsc2UgewotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihnc19kc2NwX21hcF90YWJsZSkpOwotICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfY2xlYXIKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY2xlYXJzIGFsbCBHUE9OIGZsb3cgbWFwcGluZyBydWxlcwotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfcnVsZV9jbGVhcih2b2lkKQotewotICAgIHVpbnQzMl90IHBiaXRzX2luZGV4ID0gMDsKLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVOVEVSPT1cblxyIik7Ci0gICAgfQotCi0gICAgLyogQ2xlYXIgVklEIGluZGV4IHRhYmxlICAgICAgICAgICAgICAqLwotICAgIG1lbXNldCgodWludDhfdCAqKSZnc192aWRfaW5kZXhfdGFibGUsIE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWCwgc2l6ZW9mKGdzX3ZpZF9pbmRleF90YWJsZSkpOwotCi0gICAgLyogQ2xlYXIgUC1iaXRzIG1hcHBpbmcgdGFibGVzICAgICAgICAqLwotICAgIGZvciAocGJpdHNfaW5kZXg9MDsgcGJpdHNfaW5kZXg8TVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkU7IHBiaXRzX2luZGV4KyspIHsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVtwYml0c19pbmRleF0sIDAsIHNpemVvZihtdl9jdXN0X3BiaXRzX21hcF90KSk7Ci0gICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVtwYml0c19pbmRleF0uaW5fdXNlID0gMDsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVtwYml0c19pbmRleF0sIDAsIHNpemVvZihtdl9jdXN0X3BiaXRzX21hcF90KSk7Ci0gICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVtwYml0c19pbmRleF0uaW5fdXNlID0gMDsgICAgICAgIAotICAgIH0KLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVYSVQ9PVxuXHIiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTVZfQ1VTVF9PSzsgIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdGFnX21hcF9ydWxlX2dldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXRzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCi0qKgotKiogIElOUFVUUzoKLSoqICAgIGN1c3RfZmxvdyAgLSBwYXJzaW5nIHZpZCwgcGJpdHMsIGRpcgotKioKLSoqICBPVVRQVVRTOgotKiogICAgY3VzdF9mbG93ICAtIG91dCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCBULUNPTlQsIHF1ZXVlLgotKiogICAgICAgICAgICAgICAgIGFuZCBwYWNrZXQgbW9kaWZpY2F0aW9uIGZvciBWSUQsIFAtYml0cwotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X3RhZ19tYXBfcnVsZV9nZXQobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICpjdXN0X2Zsb3cpCi17Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgKnBWaWRFbnRyeSAgPSBOVUxMOwotICAgIG12X2N1c3RfcGJpdHNfbWFwX3QgICpwUGJpdHNNYXAgID0gTlVMTDsKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgICAqcFBrdEZyd2QgICA9IE5VTEw7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIHZpZCAgICAgICAgPSAwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBwYml0cyAgICAgID0gMDsgIAotICAgIG12X2N1c3RfZmxvd19kaXJfZSAgICBkaXIgICAgICAgID0gTVZfQ1VTVF9GTE9XX0RJUl9VUzsgICAgIAotICAgIG12X2N1c3RfcGt0X2Zyd2RfdCAgICpwa3RfZndkICAgID0gTlVMTDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgaW5kZXggICAgICA9IDA7ICAgIAotCi0gICAgLyogR2V0IGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICB2aWQgICAgID0gY3VzdF9mbG93LT52aWQ7Ci0gICAgcGJpdHMgICA9IGN1c3RfZmxvdy0+cGJpdHM7Ci0gICAgZGlyICAgICA9IGN1c3RfZmxvdy0+ZGlyOwotICAgIHBrdF9md2QgPSAmY3VzdF9mbG93LT5wa3RfZnJ3ZDsKLSAgICAKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FTlRFUj09OiB2aWRbJWRdLCBwYml0c1slZF0sIGRpclslZF1cblxyIiwgdmlkLCBwYml0cywgZGlyKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBWSUQgKi8KLSAgICBpZiAodmlkID4gKE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFIC0gMSkpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAidmlkWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCB2aWQsIChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0gICAgCi0gICAgLyogQ2hlY2sgUC1iaXRzICovCi0gICAgaWYgKHBiaXRzID4gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJQLWJpdHNbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHBiaXRzLCBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBkaXIgKi8KLSAgICBpZiAoZGlyID49IE1WX0NVU1RfRkxPV19ESVJfTlVNKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgImRpclslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgZGlyLCBNVl9DVVNUX0ZMT1dfRElSX05VTS0xKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9ICAgIAotCi0gICAgLyogU2V0IGRlZmF1bHQgdmFsdWVzICovCi0gICAgY3VzdF9mbG93LT5tb2RfdmlkICAgPSBNVl9DVVNUX1ZJRF9OT1RfQ0FSRV9WQUxVRTsKLSAgICBjdXN0X2Zsb3ctPm1vZF9wYml0cyA9IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUU7IAotICAgIAotICAgIC8qIEZpbmQgVklEIGluZGV4IGVudHJ5IGJ5IFZJRCAqLyAgICAKLSAgICBwVmlkRW50cnkgPSAmZ3NfdmlkX2luZGV4X3RhYmxlW2Rpcl0ucGJpdHNfbWFwX2luZGV4W3ZpZF07Ci0KLSAgICBpZiAoKnBWaWRFbnRyeSA+PSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkgewotICAgICAgICAgLy9NVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICIlcywgcFZpZEVudHJ5WyVkXSwgTm8gbWF0Y2hlZCBQLWJpdHMgbWFwcGluZyB0YWJsZSBcblxyIixfX0ZVTkNUSU9OX18sICpwVmlkRW50cnkpOyAgICAKLQotICAgICAgICBwa3RfZndkLT5pbl91c2UgPSAwOwotICAgICAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVYSVQ9PVxuXHIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLQotICAgIC8qIEZpbmQgUC1iaXRzIG1hcHBpbmcgdGFibGUgKi8KLSAgICBwUGJpdHNNYXAgPSAmZ3NfcGJpdHNfbWFwX3RhYmxlW2Rpcl1bKnBWaWRFbnRyeV07ICAgIAotCi0gICAgLyogR2V0IHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uICovCi0gICAgaW5kZXggPSBwYml0czsKLQotICAgIHBQa3RGcndkID0gJnBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF07Ci0KLSAgICAvKiBJZiBzcGVjaWZpYyBmbG93IG1hcHBpbmcgcnVsZSBleGlzdHMgKi8KLSAgICBpZiAocFBrdEZyd2QtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgIHBrdF9md2QtPnRyZ19wb3J0ICAgICAgPSBwUGt0RnJ3ZC0+dHJnX3BvcnQ7Ci0gICAgICAgIGlmIChmYWxzZSA9PSBtdl9jdXN0X2dldF90Y29udF9zdGF0ZShwUGt0RnJ3ZC0+dHJnX3BvcnQpKQotICAgICAgICAgICAgcGt0X2Z3ZC0+dHJnX3F1ZXVlID0gQ1BIX0lOVkFMSURfVFJHVF9RVUVVRTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBrdF9md2QtPnRyZ19xdWV1ZSA9IHBQa3RGcndkLT50cmdfcXVldWU7Ci0gICAgICAgIHBrdF9md2QtPnRyZ19od2ZfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX2h3Zl9xdWV1ZTsKLSAgICAgICAgcGt0X2Z3ZC0+Z2VtX3BvcnQgICAgICA9IHBQa3RGcndkLT5nZW1fcG9ydDsKLSAgICAgICAgY3VzdF9mbG93LT5tb2RfdmlkICAgICA9IHBQYml0c01hcC0+bW9kX3ZpZFtpbmRleF07Ci0gICAgICAgIGN1c3RfZmxvdy0+bW9kX3BiaXRzICAgPSBwUGJpdHNNYXAtPm1vZF9wYml0c1tpbmRleF07Ci0gICAgICAgIHBrdF9md2QtPmluX3VzZSAgICAgICAgPSAxOwotICAgICAgICAKLSAgICAgICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJnX3BvcnQoJWQpLCB0cmdfcXVldWUoJWQpIHRyZ19od2ZfcXVldWUoJWQpIGdlbV9wb3J0KCVkKSwgbW9kX3ZpZCglZCksIG1vZF9wYml0cyglZClcblxyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcG9ydCwgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QuZ2VtX3BvcnQsIGN1c3RfZmxvdy0+bW9kX3ZpZCwgY3VzdF9mbG93LT5tb2RfcGJpdHMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAvKiBJZiBzcGVjaWZpYyBmbG93IG1hcHBpbmcgcnVsZSBkb2VzIG5vdCBleGlzdCwgbG9vayBmb3IgZGVmYXVsdCBydWxlICovCi0gICAgZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRTsKLSAgICAgICAgcFBrdEZyd2QgPSAmcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XTsKLQotICAgICAgICAvKiBJZiBkZWZhdWx0IGZsb3cgbWFwcGluZyBydWxlIGV4aXN0cyAqLwotICAgICAgICBpZiAocFBrdEZyd2QtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgICAgICBwa3RfZndkLT50cmdfcG9ydCAgICAgID0gcFBrdEZyd2QtPnRyZ19wb3J0OwotICAgICAgICAgICAgaWYgKGZhbHNlID09IG12X2N1c3RfZ2V0X3Rjb250X3N0YXRlKHBQa3RGcndkLT50cmdfcG9ydCkpCi0gICAgICAgICAgICAgICAgcGt0X2Z3ZC0+dHJnX3F1ZXVlID0gQ1BIX0lOVkFMSURfVFJHVF9RVUVVRTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcGt0X2Z3ZC0+dHJnX3F1ZXVlID0gcFBrdEZyd2QtPnRyZ19xdWV1ZTsKLSAgICAgICAgICAgIHBrdF9md2QtPnRyZ19od2ZfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX2h3Zl9xdWV1ZTsKLSAgICAgICAgICAgIHBrdF9md2QtPmdlbV9wb3J0ICAgICAgPSBwUGt0RnJ3ZC0+Z2VtX3BvcnQ7Ci0gICAgICAgICAgICBjdXN0X2Zsb3ctPm1vZF92aWQgICAgID0gcFBiaXRzTWFwLT5tb2RfdmlkW2luZGV4XTsKLSAgICAgICAgICAgIGN1c3RfZmxvdy0+bW9kX3BiaXRzICAgPSBwUGJpdHNNYXAtPm1vZF9wYml0c1tpbmRleF07Ci0gICAgICAgICAgICBwa3RfZndkLT5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICAgICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmdfcG9ydCglZCksIHRyZ19xdWV1ZSglZCkgdHJnX2h3Zl9xdWV1ZSglZCkgZ2VtX3BvcnQoJWQpLCBtb2RfdmlkKCVkKSwgbW9kX3BiaXRzKCVkKVxuXHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcG9ydCwgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLmdlbV9wb3J0LCBjdXN0X2Zsb3ctPm1vZF92aWQsIGN1c3RfZmxvdy0+bW9kX3BiaXRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAKLSAgICAgICAgICAgIHBrdF9md2QtPmluX3VzZSAgICAgID0gMDsKLSAgICAgICAgICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF91bnRhZ19tYXBfcnVsZV9nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBHUE9OIGZsb3cgbWFwcGluZyBydWxlIGZvciB1bnRhZ2dlZCBmcmFtZXMuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBkc2NwICAgICAgICAgLSBEU0NQIHZhbHVlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIGN1c3RfZmxvdyAgICAtIHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgR0VNIHBvcnQsIFQtQ09OVCwgcXVldWUuCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqY3VzdF9mbG93KQotewotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICpwVmlkRW50cnkgID0gTlVMTDsKLSAgICBtdl9jdXN0X3BiaXRzX21hcF90ICAqcFBiaXRzTWFwICA9IE5VTEw7Ci0gICAgbXZfY3VzdF9wa3RfZnJ3ZF90ICAgKnBQa3RGcndkICAgPSBOVUxMOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBwYml0c0luZGV4ID0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRTsKLSAgICBtdl9jdXN0X2Zsb3dfZGlyX2UgICAgZGlyICAgICAgICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIGRzY3AgICAgICAgPSAwOwotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PTogZHNjcFslZF0gXG5cciIsIGRzY3ApOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRhcmdldCBwb3J0L3F1ZXVlL0dFTSBwb3J0ICovCi0gICAgaWYgKGN1c3RfZmxvdyA9PSBOVUxMKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgImN1c3RfZmxvdyBpcyBOVUxMIFxuXHIiKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZm9yd2FyZGluZyBmbGFnIHRvIGZhbHNlIGF0IGZpcnN0ICovCi0gICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC5pbl91c2UgPSAwOwotICAgIGN1c3RfZmxvdy0+bW9kX3ZpZCAgICAgICAgID0gTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUU7Ci0gICAgY3VzdF9mbG93LT5tb2RfcGJpdHMgICAgICAgPSBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFOyAKLQotICAgIGRpciAgPSBjdXN0X2Zsb3ctPmRpcjsgIAotICAgIGRzY3AgPSBjdXN0X2Zsb3ctPmRzY3A7ICAKLQotICAgIC8qIENoZWNrIERTQ1AgKi8KLSAgICBpZiAoZHNjcCA8IE1WX0NVU1RfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRSkgewotICAgICAgICBpZiAoZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlICE9IDApIHsKLSAgICAgICAgICAgIHBiaXRzSW5kZXggPSBnc19kc2NwX21hcF90YWJsZS5wYml0c1tkc2NwXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBiaXRzSW5kZXggPiBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKXsKLSAgICAgICAgLy9NVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJwYml0c0luZGV4WyVkXSBpcyBpbGxlZ2FsIFxuXHIiLCBwYml0c0luZGV4KTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBGaW5kIFAtYml0cyBtYXBwaW5nIHRhYmxlICovCi0gICAgcFZpZEVudHJ5ID0gJmdzX3ZpZF9pbmRleF90YWJsZVtkaXJdLnBiaXRzX21hcF9pbmRleFtNVl9DVVNUX0RFRkFVTFRfVU5UQUdfUlVMRV07Ci0KLSAgICBpZiAoKnBWaWRFbnRyeSA+PSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkgewotICAgICAgICAvL01WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sIiVzLCBwVmlkRW50cnlbJWRdLCBkb2VzIG5vdCBleGlzdCBcblxyIixfX0ZVTkNUSU9OX18sICpwVmlkRW50cnkpOyAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UgewotICAgICAgICAKLSAgICAgICAgcFBiaXRzTWFwID0gJmdzX3BiaXRzX21hcF90YWJsZVtkaXJdWypwVmlkRW50cnldOwotCi0gICAgICAgIGlmIChwUGJpdHNNYXAtPmluX3VzZSAhPSAwKSB7Ci0KLSAgICAgICAgICAgIHBQa3RGcndkICA9ICZwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNJbmRleF07Ci0gICAgICAgICAgICBpZiAocFBrdEZyd2QtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcG9ydCAgICAgID0gcFBrdEZyd2QtPnRyZ19wb3J0OyAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PSBtdl9jdXN0X2dldF90Y29udF9zdGF0ZShwUGt0RnJ3ZC0+dHJnX3BvcnQpKQotICAgICAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19xdWV1ZSA9IENQSF9JTlZBTElEX1RSR1RfUVVFVUU7Ci0gICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX3F1ZXVlOwotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSA9IHBQa3RGcndkLT50cmdfaHdmX3F1ZXVlOwotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QuZ2VtX3BvcnQgICAgICA9IHBQa3RGcndkLT5nZW1fcG9ydDsKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPm1vZF92aWQgICAgICAgICAgICAgICAgPSBwUGJpdHNNYXAtPm1vZF92aWRbcGJpdHNJbmRleF07Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LT5tb2RfcGJpdHMgICAgICAgICAgICAgID0gcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNJbmRleF07Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJnX3BvcnQoJWQpLCB0cmdfcXVldWUoJWQpLCB0cmdfaHdmX3F1ZXVlKCVkKSwgZ2VtX3BvcnQoJWQpLCBtb2RfdmlkKCVkKSwgbW9kX3BiaXRzKCVkKVxuXHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3F1ZXVlLCBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19od2ZfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC5nZW1fcG9ydCwgY3VzdF9mbG93LT5tb2RfdmlkLCBjdXN0X2Zsb3ctPm1vZF9wYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT06XG5cciIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBNVl9DVVNUX09LOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAKLSAgICB9Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT06XG5cciIpOwotICAgIH0KLQotICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGlzcGxheXMgdmFsaWQgR1BPTiBmbG93IG1hcHBpbmcgdGFibGVzIGFuZCBEU0NQIAotKiogICAgICAgICAgICAgICAgIHRvIFAtYml0cyBtYXBwaW5nIHRhYmxlZm9yIHVudGFnZ2VkIGZyYW1lcy4KLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIE5vbmUuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQodm9pZCkKLXsKLSAgICB1aW50MzJfdCAgaW5kZXggPSAwOwotICAgIHVpbnQzMl90ICB0YWJsZV9pbmRleCA9IDA7Ci0KLSAgICAvL01WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sIj09RU5URVI9PVxuXHIiKTsKLQotICAgIC8qIFByaW50IFZhbGlkIFZJRCBpbmRleCBlbnRyaWVzICovCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiSW4gVXBzdHJlYW0gRGlyZWN0aW9uICAgICAgXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1VTVCBWTEFOIElEIEluZGV4IFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgICAgICAgICAKLSAgICBwcmludGsoS0VSTl9JTkZPICJWSUQgICBQLWJpdHNfdGFibGVfaW5kZXhcbiIpOwotICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8TVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkU7IGluZGV4KyspIHsKLSAgICAgICAgaWYoZ3NfdmlkX2luZGV4X3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdLnBiaXRzX21hcF9pbmRleFtpbmRleF0gPCBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiU0LjRkICAgJWRcbiIsIGluZGV4LCBnc192aWRfaW5kZXhfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU10ucGJpdHNfbWFwX2luZGV4W2luZGV4XSk7ICAgIAotICAgIH0KLSAgICBwcmludGsoS0VSTl9JTkZPICJcblxuIik7Ci0KLSAgICAvKiBQcmludCBQLWJpdHMgbWFwcGluZyB0YWJsZXMgKi8KLSAgICBwcmludGsoS0VSTl9JTkZPICJNVl9DVVNUIFAtYml0cyBGbG93IE1hcHBpbmcgVGFibGVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOyAgCi0gICAgZm9yICh0YWJsZV9pbmRleD0wOyB0YWJsZV9pbmRleDxNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRTsgdGFibGVfaW5kZXgrKykgewotICAgICAgICBpZihnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLmluX3VzZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUC1iaXRzIEZsb3cgTWFwcGluZyBUYWJsZSAlZFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgdGFibGVfaW5kZXgpOyAKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJQLWJpdHMgIGluX3VzZSAgbW9kX3ZpZCBtb2RfcGJpdHMgdHJnX3BvcnQgIHRyZ19xdWV1ZSAgdHJnX2h3Zl9xdWV1ZSAgZ2VtX3BvcnRcbiIpOyAKLSAgICAgICAgICAgICAgICBmb3IgKGluZGV4PTA7IGluZGV4PE1WX0NVU1RfUEJJVFNfTUFQX01BWF9FTlRSWV9OVU07IGluZGV4KyspIAotICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlMS4xZCAgICAgICAlMy4zcyAgICAgJTQuNGQgICAgJTEuMWQgICAgICAgICAgJTIuMmQgICAgICAgICUyLjJkICAgICAgICAgJTIuMmQgICAgICAgICAgICAlNC40ZFxuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLmluX3VzZSE9MCk/ICJZRVMiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5tb2RfdmlkW2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVt0YWJsZV9pbmRleF0ubW9kX3BiaXRzW2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVt0YWJsZV9pbmRleF0ucGt0X2Z3ZFtpbmRleF0udHJnX3BvcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS50cmdfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLnRyZ19od2ZfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLmdlbV9wb3J0KTsgICAgCi0gICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ayhLRVJOX0lORk8gIlxuXG4iKTsKLQotICAgIHByaW50ayhLRVJOX0lORk8gIkluIERvd25zdHJlYW0gRGlyZWN0aW9uICAgIFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7IAotICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NVU1QgVkxBTiBJRCBJbmRleCBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAgICAgICAgCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiVklEICAgUC1iaXRzX3RhYmxlX2luZGV4XG4iKTsKLSAgICBmb3IgKGluZGV4PTA7IGluZGV4PE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmKGdzX3ZpZF9pbmRleF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXS5wYml0c19tYXBfaW5kZXhbaW5kZXhdIDwgTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpCi0gICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlNC40ZCAgICVkXG4iLCBpbmRleCwgZ3NfdmlkX2luZGV4X3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdLnBiaXRzX21hcF9pbmRleFtpbmRleF0pOyAgICAKLSAgICB9Ci0gICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5cbiIpOwotCi0gICAgLyogUHJpbnQgUC1iaXRzIG1hcHBpbmcgdGFibGVzICovCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1VTVCBQLWJpdHMgRmxvdyBNYXBwaW5nIFRhYmxlc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsgIAotICAgIGZvciAodGFibGVfaW5kZXg9MDsgdGFibGVfaW5kZXg8TVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkU7IHRhYmxlX2luZGV4KyspIHsKLSAgICAgICAgaWYoZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW3RhYmxlX2luZGV4XS5pbl91c2UgIT0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlAtYml0cyBGbG93IE1hcHBpbmcgVGFibGUgJWRcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsIHRhYmxlX2luZGV4KTsgCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUC1iaXRzICBpbl91c2UgIG1vZF92aWQgbW9kX3BiaXRzIHRyZ19xdWV1ZSAgdHJnX2h3Zl9xdWV1ZSAgXG4iKTsgCi0gICAgICAgICAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleDxNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNOyBpbmRleCsrKSAKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJTEuMWQgICAgICAgJTMuM3MgICAgICU0LjRkICAgICUxLjFkICAgICAgICAlMi4yZCAgICAgICAgICUyLjJkICAgICAgICAgICAgICBcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS5pbl91c2UhPTApPyAiWUVTIjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVt0YWJsZV9pbmRleF0ubW9kX3ZpZFtpbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bdGFibGVfaW5kZXhdLm1vZF9wYml0c1tpbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLnRyZ19xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVt0YWJsZV9pbmRleF0ucGt0X2Z3ZFtpbmRleF0udHJnX2h3Zl9xdWV1ZSk7ICAgIAotICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGsoS0VSTl9JTkZPICJcblxuIik7ICAgIAotCi0gICAgLyogUHJpbnQgRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NVU1QgRFNDUCB0byBQLWJpdHMgTWFwcGluZyBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAKLSAgICBpZiAoZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID09IDApIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTm8gRFNDUCB0byBQLWJpdHMgbWFwcGluZ1xuIik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRFNDUCAgUGJpdHNcbiIpOyAKLSAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleDxNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNOyBpbmRleCsrKQotICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJTIuMmQgICAgICUxLjFkXG4iLCAKLSAgICAgICAgICAgICAgICAgICBpbmRleCwgZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbaW5kZXhdKTsgICAgCi0gICAgfQotICAgIHByaW50ayhLRVJOX0lORk8gIlxuXG4iKTsKLQotICAgIC8vTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywiPT1FWElUPT1cblxyIik7ICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOyAKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X2Zsb3dfbWFwX2luaXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgbXZfY3VzdCBmbG93IG1hcHBpbmcgZGF0YSBzdHJ1Y3R1cmUuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBOb25lLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCi1pbnQgbXZfY3VzdF9mbG93X21hcF9pbml0KHZvaWQpCi17Ci0gICAgdWludDMyX3QgaW5kZXggPSAwOwotICAgIAotICAgIC8qIEluaXRpYWxpemVzIFZJRCBpbmRleCB0YWJsZSAgICAgICAgICAgICAgKi8KLSAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfdmlkX2luZGV4X3RhYmxlLCBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVgsIHNpemVvZihnc192aWRfaW5kZXhfdGFibGUpKTsKLQotICAgIC8qIEluaXRpYWxpemVzIFAtYml0cyBtYXBwaW5nIHRhYmxlcyAgICAgICAgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRTsgaW5kZXgrKykgewotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW2luZGV4XSwgMCwgc2l6ZW9mKG12X2N1c3RfcGJpdHNfbWFwX3QpKTsKLSAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW2luZGV4XS5pbl91c2UgPSAwOwotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW2luZGV4XSwgMCwgc2l6ZW9mKG12X2N1c3RfcGJpdHNfbWFwX3QpKTsKLSAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW2luZGV4XS5pbl91c2UgPSAwOyAgICAgICAgCi0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIG1lbXNldCgodWludDhfdCAqKSZnc19kc2NwX21hcF90YWJsZSwgMCwgc2l6ZW9mKG12X2N1c3RfZHNjcF9wYml0c190KSk7Ci0gICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKLQotICAgIC8qIEluaXRpYWxpemVzIFQtQ09OVCBzdGF0ZSwgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZSAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IENQSF9NQVhfVENPTlRfTlVNOyBpbmRleCsrKQotICAgICAgICBnc190Y29udF9zdGF0ZVtpbmRleF0gPSBmYWxzZTsKLSAgICAgICAgCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUKLSoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQotKioKLSoqIElOUFVUUzoKLSoqICAgdGNvbnQgLSBULUNPTlQKLSoqCi0qKiBPVVRQVVRTOgotKiogICBOb25lLiAKLSoqCi0qKiBSRVRVUk5TOiAgICAgCi0qKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUodWludDMyX3QgdGNvbnQpCi17Ci0gICAgLyogQ2hlY2sgdGNvbnQgKi8KLSAgICBpZiAodGNvbnQgPj0gQ1BIX01BWF9UQ09OVF9OVU0pCi0gICAgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9FUlIsInRjb250WyVkXSBpcyBpbGxlZ2FsLCBzaG91bGQgYmUgbGVzcyB0aGFuIFslZF1cbiIsIHRjb250LCBDUEhfTUFYX1RDT05UX05VTSk7IAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdzX3Rjb250X3N0YXRlW3Rjb250XTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiBtdl9jdXN0X3NldF90Y29udF9zdGF0ZQotKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIFQtQ09OVCBzdGF0ZSBpbiBtdl9jdXN0Ci0qKgotKiogSU5QVVRTOgotKiogICB0Y29udCAtIFQtQ09OVAotKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4KLSoqCi0qKiBPVVRQVVRTOgotKiogICBOb25lLiAKLSoqCi0qKiBSRVRVUk5TOiAgICAgCi0qKiAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKHVpbnQzMl90IHRjb250LCBib29sIHN0YXRlKQotewotICAgIC8qIENoZWNrIHRjb250ICovCi0gICAgaWYgKHRjb250ID49IENQSF9NQVhfVENPTlRfTlVNKQotICAgIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fRVJSLCJ0Y29udFslZF0gaXMgaWxsZWdhbCwgc2hvdWxkIGJlIGxlc3MgdGhhbiBbJWRdXG4iLCB0Y29udCwgQ1BIX01BWF9UQ09OVF9OVU0pOyAKLSAgICAgICAgcmV0dXJuIE1WX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQXBwbHkgdC1jb250IHN0YXRlIHRvIG12X2N1c3QgKi8KLSAgICBnc190Y29udF9zdGF0ZVt0Y29udF0gPSBzdGF0ZTsKLQotICAgIHJldHVybiBNVl9PSzsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NzU0MmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSoKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSoKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X2Zsb3dfbWFwLmgKLSoKLSogREVTQ1JJUFRJT046Ci0qICAgVmljdG9yICAtIGluaXRpYWwgdmVyc2lvbiBjcmVhdGVkLiAgIDEyL0RlYy8yMDExIAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19tdl9jdXN0X2Zsb3dfbWFwX2hfXwotI2RlZmluZSBfX212X2N1c3RfZmxvd19tYXBfaF9fCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSBFbnVtIGFuZCBTdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNVkNVU1RfVFJBQ0VfUFJJTlQobGV2ZWwsIGZvcm1hdCwgLi4uKSAgIHByaW50ayhsZXZlbCAiJXMoJWQpOiJmb3JtYXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTVZfQ1VTVF9PSyAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBNVl9DVVNUX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgKDEpCi0KLSNkZWZpbmUgQ1BIX01BWF9UQ09OVF9OVU0gICAgICAgICAgICAgICAgICg4KSAgICAvKiBNYXhpbXVtIFQtQ09OVCBudW1iZXIgICAgKi8KLSNkZWZpbmUgQ1BIX0lOVkFMSURfVFJHVF9RVUVVRSAgICAgICAgICAgICgweEZGKSAvKiBJbnZhbGlkIHRhcmdldCBxdWV1ZSBudW1iZXIgICovCi0KLSNkZWZpbmUgTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUUgICAgICAgICg0MDk2KSAvKiBEb2VzIG5vdCBjYXJlIGZvciBWSUQgICAgKi8KLSNkZWZpbmUgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSAgICAgICg4KSAgICAvKiBEb2VzIG5vdCBjYXJlIGZvciBQLWJpdHMgKi8KLSNkZWZpbmUgTVZfQ1VTVF9EU0NQX05PVF9DQVJFX1ZBTFVFICAgICAgICg2NCkgICAvKiBEb2VzIG5vdCBjYXJlIGZvciBEU0NQICAgKi8KLQotI2RlZmluZSBNVl9DVVNUX01BWF9UUkdfUE9SVF9WQUxVRSAgICAgICAgKDgtMSkgIC8qIE1heGltdW0gdGFyZ2V0IHBvcnQgdmFsdWUsIFQtQ09OVDcgKi8KLSNkZWZpbmUgTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFICAgICAgICg3KSAgICAvKiBNYXhpbXVtIHRhcmdldCBxdWV1ZSB2YWx1ZSAgICAgICAgICovCi0jZGVmaW5lIE1WX0NVU1RfTUFYX0dFTV9QT1JUX1ZBTFVFICAgICAgICAoNDA5NSkgLyogTWF4aW11bSBHRU0gcG9ydCB2YWx1ZSAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWCAoMHhmZikgLyogSW52YWxpZCBQYml0cyB0YWJsZSBpbmRleCB2YWx1ZSBpbiBWSUQgaW5kZXggdGFibGUqLwotCi0jZGVmaW5lIE1WX0NVU1RfREVGQVVMVF9VTlRBR19SVUxFICAgICAgICAoNDA5NisxKS8qIERlZmF1bHQgdW50YWdnZWQgIHJ1bGUgICAgICAgICovCi0jZGVmaW5lIE1WX0NVU1RfREVGQVVMVF9TSU5HTEVfVEFHX1JVTEUgICAoNDA5NisyKS8qIERlZmF1bHQgc2lubGdlIHRhZ2dlZCAgcnVsZSAgICovCi0jZGVmaW5lIE1WX0NVU1RfREVGQVVMVF9ET1VCTEVfVU5UQUdfUlVMRSAoNDA5NiszKS8qIERlZmF1bHQgZG91YmxlIHRhZ2dlZCAgcnVsZSAgICovCi0KLS8qIFZMQU4gSUQgaW5kZXggdGFibGUgZGVmaW5pdGlvbiBmb3IgZmxvdyBtYXBwaW5nICovCi0jZGVmaW5lIE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFICAoNDA5Nis0KQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgcGJpdHNfbWFwX2luZGV4W01WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFXTsKLX0gbXZfY3VzdF92aWRfaW5kZXhfdDsKLQotLyogUC1iaXRzIGZsb3cgbWFwcGluZyB0YWJsZSBkZWZpbml0aW9uICovCi10eXBlZGVmIHVpbnQzMl90IG12X2N1c3RfdHJnX3BvcnRfdHlwZV90OwotdHlwZWRlZiB1aW50MzJfdCBtdl9jdXN0X2dlbV9wb3J0X2tleV90OwotdHlwZWRlZiBzdHJ1Y3QgbXZfY3VzdF9wa3RfZnJ3ZCB7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgaW5fdXNlOwotICAgIG12X2N1c3RfdHJnX3BvcnRfdHlwZV90IHRyZ19wb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgdHJnX3F1ZXVlOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB0cmdfaHdmX3F1ZXVlOyAgICAKLSAgICBtdl9jdXN0X2dlbV9wb3J0X2tleV90ICBnZW1fcG9ydDsKLX0gbXZfY3VzdF9wa3RfZnJ3ZF90OwotCi0jZGVmaW5lIE1WX0NVU1RfUEJJVFNfTUFQX01BWF9FTlRSWV9OVU0gICAoOCsxKQotI2RlZmluZSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSAgKDY0KQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDMyX3QgICAgICAgICAgIGluX3VzZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgbW9kX3ZpZFtNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgbW9kX3BiaXRzW01WX0NVU1RfUEJJVFNfTUFQX01BWF9FTlRSWV9OVU1dOyAgICAKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgcGt0X2Z3ZFtNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNXTsKLX0gbXZfY3VzdF9wYml0c19tYXBfdDsKLQotLyogRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSBkZWZpbml0aW9uICovCi0jZGVmaW5lIE1WX0NVU1RfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRSAgKDY0KQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQzMl90IGluX3VzZTsKLSAgICB1aW50OF90ICBwYml0c1tNVl9DVVNUX0RTQ1BfUEJJVFNfVEFCTEVfTUFYX1NJWkVdOwotfSBtdl9jdXN0X2RzY3BfcGJpdHNfdDsKLSAKLXR5cGVkZWYgZW51bQotewotICAgIE1WX0NVU1RfRkxPV19ESVJfVVMgICA9IDAsCi0gICAgTVZfQ1VTVF9GTE9XX0RJUl9EUyAgID0gMSwKLSAgICBNVl9DVVNUX0ZMT1dfRElSX05VTSAgPSAyCi19IG12X2N1c3RfZmxvd19kaXJfZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBtdl9jdXN0X2Zsb3dfZGlyX2UgZGlyOwotICAgIGludCAgICAgICAgICAgICAgICB2aWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIHBiaXRzOwotICAgIGludCAgICAgICAgICAgICAgICBkc2NwOyAgCi0gICAgaW50ICAgICAgICAgICAgICAgIG1vZF92aWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIG1vZF9wYml0czsKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgcGt0X2Zyd2Q7Ci19IG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X3NldF90cmFjZV9mbGFnCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgbXZfY3VzdCB0cmFjZSBmbGFnLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgZW5UcmFjZSAgICAgLSBFbmFibGUgb3IgZGlzYWJsZSBtdl9jdXN0IHRyYWNlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCi1pbnQgbXZfY3VzdF9zZXRfdHJhY2VfZmxhZyh1aW50MzJfdCBlblRyYWNlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X21hcF9ydWxlX3NldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBjdXN0X2Zsb3cgIC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX3NldChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKmN1c3RfZmxvdyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9kc2NwX21hcF9zZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBHUE9OIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgSU5QVVRTOgotKiogICAgZHNjcF9tYXAgICAtIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMuCi0qKgotKiogIE9VVFBVVFM6Ci0qKiAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoMCkuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X2RzY3BfbWFwX3NldChtdl9jdXN0X2RzY3BfcGJpdHNfdCAqZHNjcF9tYXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfZGVsCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRlbGV0ZXMgR1BPTiBmbG93IG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIHZpZCAgICAgICAgIC0gVkxBTiBJRC4KLSoqICAgICAgcGJpdHMgICAgICAtIDgwMi4xcCB2YWx1ZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX2RlbCh1aW50MTZfdCB2aWQsIHVpbnQ4X3QgcGJpdHMsIG12X2N1c3RfZmxvd19kaXJfZSBkaXIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfZHNjcF9tYXBfZGVsCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRlbGV0ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcwotKioKLSoqICBJTlBVVFM6Ci0qKiAgICBOb25lLgotKioKLSoqICBPVVRQVVRTOgotKiogICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKDApLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9kc2NwX21hcF9kZWwodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfcnVsZV9jbGVhcgotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjbGVhcnMgYWxsIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogIElOUFVUUzoKLSoqICAgIE5vbmUuCi0qKgotKiogIE9VVFBVVFM6Ci0qKiAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoMCkuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX2NsZWFyKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdGFnX21hcF9ydWxlX2dldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXRzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCi0qKgotKiogIElOUFVUUzoKLSoqICAgIGN1c3RfZmxvdyAgLSBwYXJzaW5nIHZpZCwgcGJpdHMsIGRpcgotKioKLSoqICBPVVRQVVRTOgotKiogICAgY3VzdF9mbG93ICAtIG91dCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCBULUNPTlQsIHF1ZXVlLgotKiogICAgICAgICAgICAgICAgIGFuZCBwYWNrZXQgbW9kaWZpY2F0aW9uIGZvciBWSUQsIFAtYml0cwotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zICgwKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfdGFnX21hcF9ydWxlX2dldChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKmN1c3RfZmxvdyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF91bnRhZ19tYXBfcnVsZV9nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBHUE9OIGZsb3cgbWFwcGluZyBydWxlIGZvciB1bnRhZ2dlZCBmcmFtZXMuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBkc2NwICAgICAgICAgLSBEU0NQIHZhbHVlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIGN1c3RfZmxvdyAgICAtIHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgR0VNIHBvcnQsIFQtQ09OVCwgcXVldWUuCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqY3VzdF9mbG93KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X21hcF90YWJsZV9wcmludAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBkaXNwbGF5cyB2YWxpZCBHUE9OIGZsb3cgbWFwcGluZyB0YWJsZXMgYW5kIERTQ1AgCi0qKiAgICAgICAgICAgICAgIHRvIFAtYml0cyBtYXBwaW5nIHRhYmxlZm9yIHVudGFnZ2VkIGZyYW1lcy4KLSoqCi0qKiAgSU5QVVRTOgotKiogICAgTm9uZS4KLSoqCi0qKiAgT1VUUFVUUzoKLSoqICAgIE5vbmUuCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKDApLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9mbG93X21hcF9pbml0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIG12X2N1c3QgZmxvdyBtYXBwaW5nIGRhdGEgc3RydWN0dXJlLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zICgwKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotaW50IG12X2N1c3RfZmxvd19tYXBfaW5pdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiBtdl9jdXN0X2dldF90Y29udF9zdGF0ZQotKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXQgVC1DT05UIHN0YXRlCi0qKgotKiogSU5QVVRTOgotKiogICB0Y29udCAtIFQtQ09OVAotKioKLSoqIE9VVFBVVFM6Ci0qKiAgIE5vbmUuIAotKioKLSoqIFJFVFVSTlM6ICAgICAKLSoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBtdl9jdXN0X2dldF90Y29udF9zdGF0ZSh1aW50MzJfdCB0Y29udCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUKLSoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3VzdAotKioKLSoqIElOUFVUUzoKLSoqICAgdGNvbnQgLSBULUNPTlQKLSoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0qKgotKiogT1VUUFVUUzoKLSoqICAgTm9uZS4gCi0qKgotKiogUkVUVVJOUzogICAgIAotKiogIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBtdl9jdXN0X3NldF90Y29udF9zdGF0ZSh1aW50MzJfdCB0Y29udCwgYm9vbCBzdGF0ZSk7Ci0KLSNlbmRpZiAvKiBfX212X2N1c3RfZmxvd19tYXBfaF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tbmdfaWYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21uZ19pZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzBhODFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21uZ19pZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qIAotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKiAKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X21uZ19pZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKiBERVNDUklQVElPTiA6IFRoaXMgZmlsZSBjb250YWlucyBPTlUgTVYgQ1VTVCBNYW5hZ2VtZW50IEludGVyZmFjZSAgICAgICAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX01WX0NVU1RfTU5HX0lGX0hfCi0jZGVmaW5lIF9NVl9DVVNUX01OR19JRl9IXwotCi0vKiBJbmNsdWRlIEZpbGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLQotLyogRGVmaW5pdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfT01DSV9TRVQgICAgICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgMSwgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9FT0FNX0xMSURfU0VUICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICAyLCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX0VPQU1fRU5BQkxFICAgICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDMsICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfT01DSV9FTkFCTEUgICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgNCwgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9NQVBfUlVMRV9TRVQgICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICA1LCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX0RTQ1BfTUFQX1NFVCAgICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDYsICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfTUFQX1JVTEVfREVMICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgNywgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9EU0NQX01BUF9ERUwgICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICA4LCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX0NMRUFSICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDksICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfVEFHX01BUF9SVUxFX0dFVCAgICAgICAgX0lPUihNVl9DVVNUX0lPQ1RMX01BR0lDLCAgMTAsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9VTlRBR19NQVBfUlVMRV9HRVQgICAgICBfSU9SKE1WX0NVU1RfSU9DVExfTUFHSUMsICAxMSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX0FQUF9FVEhfVFlQRV9TRVQgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDEyLCB1bnNpZ25lZCBpbnQpCi0KLS8qIEVudW1zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUeXBlZGVmcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50ICAgICAgICAgICAgICAgIHRjb250OwotICAgIGludCAgICAgICAgICAgICAgICB0eHE7Ci0gICAgaW50ICAgICAgICAgICAgICAgIGdlbXBvcnQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIGtlZXBfcnhfbWg7Ci19IG12X2N1c3RfaW9jdGxfb21jaV9zZXRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgbGxpZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgdHhxOwotICAgIHVpbnQ4X3QgICAgICAgICAgICBsbGlkX21hY1s2XTsKLX0gbXZfY3VzdF9pb2N0bF9sbGlkX3NldF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG12X2N1c3RfZHNjcF9wYml0c190IGRzY3BfbWFwOwotfSBtdl9jdXN0X2lvY3RsX2RzY3BfbWFwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbXZfY3VzdF9hcHBfdHlwZV9lIGFwcF90eXBlOwotICAgIHVpbnQxNl90ICAgICAgICAgICBldGhfdHlwZTsKLX0gbXZfY3VzdF9pb2N0bF9hcHBfZXR5cGVfdDsKLQotLyogTVZfQ1VTVCBDaGFyIERldmljZSBTdHJ1Y3R1cmUgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIG12X2N1c3RfaW9jdGxfb21jaV9zZXRfdCAgICAgIG12X2N1c3RfaW9jdGxfb21jaV9zZXQ7Ci0gIG12X2N1c3RfaW9jdGxfbGxpZF9zZXRfdCAgICAgIG12X2N1c3RfaW9jdGxfbGxpZF9zZXQ7Ci0gIG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAgICAgIG12X2N1c3RfaW9jdGxfZmxvd19tYXA7Ci0gIG12X2N1c3RfaW9jdGxfZHNjcF9tYXBfdCAgICAgIG12X2N1c3RfaW9jdGxfZHNjcF9tYXA7Ci0gIG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3QgICAgIG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlOwotCi0gIHN0cnVjdCBjZGV2ICBjZGV2OwotfSBtdl9jdXN0X2NkZXZfdDsKLQotLyogR2xvYmFsIHZhcmlhYmxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFsIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFsIHZhcmlhYmxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFsIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogTWFjcm9zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZW5kaWYgLyogX01WX0NVU1RfTU5HX0lGX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tb2QuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2U5MjE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21vZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIAotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSogCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qIAotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfbW9kLmMKLSoKLSogREVTQ1JJUFRJT046Ci0qICAgICAgIAotKiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlICJtdl9jdXN0X2Rldi5oIgotCi0KLSNpZmRlZiBNT0RVTEVfTElDRU5TRQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtdl9jdXN0X21vZF9leGl0KHZvaWQpCi17Ci0gICAgbXZjdXN0X2Rldl9zaHV0ZG93bigpOwotfQotbW9kdWxlX2V4aXQobXZfY3VzdF9tb2RfZXhpdCk7Ci0KLQotc3RhdGljIGludCBfX2luaXQgbXZfY3VzdF9tb2RfaW5pdCh2b2lkKQotewotICAgIGlmIChtdmN1c3RfZGV2X2luaXQoKSAhPSAwKQotICAgIHsKLSAgICAgICAgLy9tdl9jdXN0X21vZF9leGl0KCk7Ci0gICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG5NVl9DVVNUIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmYWlsZWQgXG5cbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5NVl9DVVNUIG1vZHVsZSBpbnNlcnRlZCAtICVzXG5cbiIsTVZfQ1VTVF9WRVJTSU9OKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vL21vZHVsZV9pbml0KG12X2N1c3RfbW9kX2luaXQpOwotZGV2aWNlX2luaXRjYWxsX3N5bmMobXZfY3VzdF9tb2RfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTdiMDc2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSoKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSoKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X25ldGRldi5jCi0qCi0qIERFU0NSSVBUSU9OOgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxtdkNvbW1vbi5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC9pcHY2Lmg+Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRQotI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxtdk9zLmg+Ci0jaW5jbHVkZSA8Y3RybEVudi9tdkN0cmxFbnZMaWIuaD4KLQotI2luY2x1ZGUgIm12X2N1c3RfZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9uZXRkZXYuaCIKLSNpbmNsdWRlICJtdl9jdXN0X2Zsb3dfbWFwLmgiCi0jaW5jbHVkZSAibXZfY3VzdF9tbmdfaWYuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEV4dGVybmFsICBkZWNsYXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogR2xvYmFsIHN0YXRpYyBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBZVVZBTCAtIHVwZGF0ZSB0byBwbmMgZGVmaW5lICovCi0jZGVmaW5lICAgICBNSF9HRU1fUE9SVF9NQVNLICAgICAgICAgICAgICAgICgweDBGRkYpCi0jZGVmaW5lICAgICBNSF9FUE9OX09BTV9UWVBFICAgICAgICAgICAgICAgICgweDg4MDkpCi0jZGVmaW5lICAgICBFVFlfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICgweDA4MDApCi0jZGVmaW5lICAgICBJUFY0X1BST1RPX09GRlNFVCAgICAgICAgICAgICAgICg5KQotI2RlZmluZSAgICAgTVZfQ1VTVF9TV0ZfVFhfUVVFVUUgICAgICAgICAgICAoNikKLQotI2RlZmluZSAgICAgQ1VTVF9UQkxfTlVNX0VOVFJJRVMoYSkgICAgICAgICAoc2l6ZW9mKGEpL3NpemVvZihhWzBdKSkKLQotLypTdGF0aWMgRGVjbGFyYXRpb25zICovCi1zdGF0aWMgaW50ICAgIG12X2V0aF9wb3J0c19udW0gICAgID0gMDsKLXN0YXRpYyBpbnQgICAgbXZfY3VzdF9kZWJ1Z19jb2RlICAgPSAwOwotCi1zdGF0aWMgaW50ICAgIG12X2N1c3Rfb21jaV9nZW1wb3J0ID0gMDsKLXN0YXRpYyBpbnQgICAgbXZfY3VzdF9vbWNpX3J4X2doICAgPSAwOwotc3RhdGljIGludCAgICBtdl9jdXN0X29hbV9yeF9naCAgICA9IDA7Ci0KLS8qIFByb3RvY29sIGRlZmluaXRpb25zICovCi1zdGF0aWMgc3RydWN0IG12X2V0aF90eF9zcGVjICAgICBvbWNpX21nbXRfdHhfc3BlYyA9IHswLCAwLCAwLCBNVl9DVVNUX1NXRl9UWF9RVUVVRX07Ci1zdGF0aWMgc3RydWN0IG12X2VvYW1fbGxpZF9zcGVjICBlcG9uX21nbXRfdHhfc3BlY1tNVl9DVVNUX05VTV9MTElEXTsKLSNkZWZpbmUgRVBPTl9NR01UX0VOVFJJRVMgICBDVVNUX1RCTF9OVU1fRU5UUklFUyhlcG9uX21nbXRfdHhfc3BlYykKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi1zdGF0aWMgc3RydWN0IG12X3BvcnRfdHhfc3BlYyAgICB1ZHBfcG9ydF9zcGVjX2NmZ1tDT05GSUdfTVZfRVRIX1BPUlRTX05VTV07Ci0jZGVmaW5lIFBPUlRfRU5UUklFUyAgICAgICAgQ1VTVF9UQkxfTlVNX0VOVFJJRVModWRwX3BvcnRfc3BlY19jZmcpCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotc3RhdGljIGludCAgICBtdl9jdXN0X2Zsb3dfbWFwID0gMDsKLSNlbmRpZgotCi0vKiBEZWZhdWx0IEFwcGxpY2F0aW9uIEV0aGVybmV0IHR5cGUgdXNlZCBmb3Igc29ja2V0IGFuZCBza2IgKi8KLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9JR01QICAgICAgKDB4QTAwMCkKLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9NTEQgICAgICAgKDB4QUIwMCkKLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9MUEJLICAgICAgKDB4RkZGQSkKLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9PQU0gICAgICAgKDB4QkFCQSkKLS8qIFRoZSBFdGhlcm5ldCB0cHllIG9mIE9BTS9PTUNJIGNvdWxkIGJlIHNhbWUgc2luY2UgdGhleSB3aWxsIG5vdCB1c2UgYXQgdGhlIHNhbWUgdGltZSovCi0jZGVmaW5lIE1WX0NVU1RfRVRIX1RZUEVfT01DSSAgICAgICgweEJBQkEpCi0KLS8qIEdsb2JhbCBjdXN0IGNvbmZpZ3VyYXRpb24qLwotLyogUGF5IGF0dGVudGlvbiB0aGF0IHRoZSBvcmRlciBjb3VsZCBiZSBiZSBjaGFuZ2VkIGFuZCB0aGUgZW50cnkgY291bGQgbm90IGJlIHJlbW92ZWQgKi8KLXN0YXRpYyBtdl9jdXN0X2FwcF9jb25maWdfdCBnQ3VzdENvbmZpZ1tdID0KLXsKLSAgICAvKiBBcHBsaWNhdGlvbiBUeXBlICovICAgLyogRW5hYmxlIEZsYWcgKi8gICAvKkFwcGxpY2F0aW9uIEV0aCB0eXBlKi8gICAvKiBBcHBsaWNhdGlvbiBEZXNjcmlwdGlvbiovCi0gICAge01WX0NVU1RfQVBQX1RZUEVfSUdNUCwgIE1WX0NVU1RfQVBQX0RJU0FCTEUsIE1WX0NVU1RfRVRIX1RZUEVfSUdNUCwgICAgICJJR01QIGFwcGxpY2F0aW9uIn0sCi0gICAge01WX0NVU1RfQVBQX1RZUEVfTUxELCAgIE1WX0NVU1RfQVBQX0RJU0FCTEUsIE1WX0NVU1RfRVRIX1RZUEVfTUxELCAgICAgICJNTEQgYXBwbGljYXRpb24ifSwKLSAgICB7TVZfQ1VTVF9BUFBfVFlQRV9MUEJLLCAgTVZfQ1VTVF9BUFBfRElTQUJMRSwgTVZfQ1VTVF9FVEhfVFlQRV9MUEJLLCAgICAgIkxvb3BiYWNrIGRldGVjdGlvbiBhcHBsaWNhdGlvbiJ9LAotICAgIHtNVl9DVVNUX0FQUF9UWVBFX09BTSwgICBNVl9DVVNUX0FQUF9ESVNBQkxFLCBNVl9DVVNUX0VUSF9UWVBFX09BTSwgICAgICAiZU9BTSBhcHBsaWNhdGlvbiJ9LAotICAgIHtNVl9DVVNUX0FQUF9UWVBFX09NQ0ksICBNVl9DVVNUX0FQUF9ESVNBQkxFLCBNVl9DVVNUX0VUSF9UWVBFX09NQ0ksICAgICAiT01DSSBhcHBsaWNhdGlvbiJ9LCAgICAKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBtdl9jdXN0X2RlYnVnX2luZm9fc2V0KGludCB2YWwpCi17Ci0gICAgbXZfY3VzdF9kZWJ1Z19jb2RlID0gdmFsOwotICAgIHJldHVybjsKLX0KLQotCi12b2lkIG12X2N1c3RfYXBwX2ZsYWdfc2V0KG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZSwgdWludDE2X3QgZW5hYmxlKQotewotICAgIGlmIChtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXMoKSBJbiwgYXBwX3R5cGVbJWRdLCBlbmFibGVbJWRdIFxuIiwgX19mdW5jX18sIGFwcF90eXBlLCBlbmFibGUpOwotICAgIAotICAgIGlmIChhcHBfdHlwZSA+IChNVl9DVVNUX0FQUF9UWVBFX01BWC0xKSkKLSAgICB7Ci0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgYXBwbGljYXRpb24gdHlwZVslZF0sIGFsbG93ZWQgbWF4IHR5cGVbJWRdICBcbiIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGFwcF90eXBlLCBNVl9DVVNUX0FQUF9UWVBFX01BWC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhcHBfdHlwZSA9PSBNVl9DVVNUX0FQUF9UWVBFX09NQ0kpCi0gICAgewotICAgICAgICBpZiAoZW5hYmxlKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5lbmFibGUpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoIkVQT04gaXMgYWxyZWFkeSB2YWxpZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9FTkFCTEU7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgICAgICBtdl9jdXN0X2Zsb3dfbWFwICAgPSAxOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9ESVNBQkxFOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICAgICAgbXZfY3VzdF9mbG93X21hcCAgID0gMDsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoYXBwX3R5cGUgPT0gTVZfQ1VTVF9BUFBfVFlQRV9PQU0pCi0gICAgewotICAgICAgICBpZiAoZW5hYmxlKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT01DSV0uZW5hYmxlKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJHUE9OIGlzIGFscmVhZHkgdmFsaWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9FTkFCTEU7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgICAgICBtdl9jdXN0X2Zsb3dfbWFwICAgPSAwOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmVuYWJsZSA9IE1WX0NVU1RfQVBQX0RJU0FCTEU7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgICAgICBtdl9jdXN0X2Zsb3dfbWFwICAgPSAwOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkKLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW2FwcF90eXBlXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9FTkFCTEU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW2FwcF90eXBlXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9ESVNBQkxFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9hcHBfZmxhZ19zZXQpOwotCi0KLXZvaWQgbXZfY3VzdF9hcHBfZXR5cGVfc2V0KG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZSwgdWludDE2X3QgZXRoX3R5cGUpCi17Ci0gICAgaWYgKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgcHJpbnRrKCIlcygpIEluLCBhcHBfdHlwZVslZF0sIGV0aF90eXBlWyVkXSBcbiIsIF9fZnVuY19fLCBhcHBfdHlwZSwgZXRoX3R5cGUpOwotICAgIAotICAgIGlmIChhcHBfdHlwZSA+IChNVl9DVVNUX0FQUF9UWVBFX01BWC0xKSkKLSAgICB7Ci0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgYXBwbGljYXRpb24gdHlwZVslZF0sIGFsbG93ZWQgbWF4IHR5cGVbJWRdICBcbiIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGFwcF90eXBlLCBNVl9DVVNUX0FQUF9UWVBFX01BWC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdDdXN0Q29uZmlnW2FwcF90eXBlXS5ldGhfdHlwZSA9IGV0aF90eXBlOwotCi0gICAgcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X2FwcF9ldHlwZV9zZXQpOwotCi0KLXZvaWQgbXZfY3VzdF9yZWNfc2tiKGludCBwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotICAgIHVpbnQzMl90IHJ4X3N0YXR1czsKLSAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwOwotCi0gICAgcnhfc3RhdHVzID0gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLSAgICBwcCA9IG12X2V0aF9wb3J0X2J5X2lkKHBvcnQpOwotICAgIFNUQVRfREJHKGlmIChyeF9zdGF0dXMpIChwcC0+c3RhdHMucnhfZHJvcF9zdysrKSk7Ci19Ci0KLXZvaWQgbXZfY3VzdF9vbWNpX3J4X2doX3NldChpbnQgdmFsKQotewotICAgIG12X2N1c3Rfb21jaV9yeF9naCA9IHZhbDsKLSAgICByZXR1cm47Ci19Ci0KLWludCBtdl9jdXN0X29tY2lfdHhfc2V0KGludCB0Y29udCwgaW50IHR4cSkKLXsKLSAgICBpZiAobXZOZXRhVHhwQ2hlY2soTVZfUE9OX1BPUlRfSUQsIHRjb250KSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAodHhxPDAgfHwgdHhxPkNPTkZJR19NVl9FVEhfVFhRKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG9tY2lfbWdtdF90eF9zcGVjLnR4cCA9IHRjb250OwotICAgIG9tY2lfbWdtdF90eF9zcGVjLnR4cSA9IHR4cTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIG12X2N1c3Rfb21jaV9nZW1wb3J0X3NldChpbnQgZ2VtcG9ydCkKLXsKLSAgICBtdl9jdXN0X29tY2lfZ2VtcG9ydCA9IGdlbXBvcnQ7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIG12X2N1c3Rfb21jaV9od19jbWRfc2V0KHVpbnQzMl90IGh3X2NtZCkKLXsKLSAgICBvbWNpX21nbXRfdHhfc3BlYy5od19jbWQgPSBod19jbWQ7Ci19Ci0KLWludCBtdl9jdXN0X29tY2lfc2V0KGludCB0Y29udCwgaW50IHR4cSwgaW50IGdlbV9wb3J0LCBpbnQga2VlcF9yeF9taCkKLXsKLSAgICBpbnQgcmV0LCBod19jbWQ7Ci0KLSAgICBvbWNpX21nbXRfdHhfc3BlYy50eF9mdW5jID0gTlVMTDsKLSAgICBvbWNpX21nbXRfdHhfc3BlYy5mbGFncyA9IE1WX0VUSF9GX05PX1BBRCB8IE1WX0VUSF9GX01IOwotCi0gICAgcmV0ID0gbXZfY3VzdF9vbWNpX3R4X3NldCh0Y29udCwgdHhxKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoIm12X2N1c3Rfb21jaV90eF9zZXQgLSByZXQoJWQpICBcbiIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgbXZfY3VzdF9vbWNpX2dlbXBvcnRfc2V0KGdlbV9wb3J0KTsKLSAgICBod19jbWQgPSAoKGdlbV9wb3J0IDw8IDgpIHwgMHgwMDEwKTsKLSAgICBtdl9jdXN0X29tY2lfaHdfY21kX3NldChod19jbWQpOwotICAgIG12X2N1c3Rfb21jaV9yeF9naF9zZXQoa2VlcF9yeF9taCk7Ci0KLSAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChNVl9DVVNUX0FQUF9UWVBFX09NQ0ksIE1WX0NVU1RfQVBQX0VOQUJMRSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9vbWNpX3NldCk7Ci0KLXZvaWQgbXZfY3VzdF9vbWNpX3ByaW50KHZvaWQpCi17Ci0gICAgcHJpbnRrKCIqKioqKioqKioqKioqIE9NQ0kgQ29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKlxuXG4iKTsKLSAgICBwcmludGsoIk9NQ0k6IHZhbGlkID0gJWQsIGdlbXBvcnQgPSAlZCwgZXRodHlwZSA9IDB4JTA0eCwgZ2hfa2VlcCA9ICVkXG4iLAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmVuYWJsZSwKLSAgICAgICAgICAgbXZfY3VzdF9vbWNpX2dlbXBvcnQsIAotICAgICAgICAgICBudG9ocyhnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmV0aF90eXBlKSwgCi0gICAgICAgICAgIG12X2N1c3Rfb21jaV9yeF9naCk7Ci0gICAgcHJpbnRrKCJPTUNJOiB0eHAgICA9ICVkLCB0eHEgPSAlZCwgaHdfY21kID0gMHglMDh4LCBmbGFncyA9IDB4JTA0eCBvbiBUWCBcbiIsCi0gICAgICAgICAgIG9tY2lfbWdtdF90eF9zcGVjLnR4cCwgb21jaV9tZ210X3R4X3NwZWMudHhxLCBvbWNpX21nbXRfdHhfc3BlYy5od19jbWQsIG9tY2lfbWdtdF90eF9zcGVjLmZsYWdzKTsKLSAgICBwcmludGsoIlxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9vbWNpX2dlbV9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGdoOwotCi0gICAgZ2ggPSBudG9ocygqKHVpbnQxNl90ICopZGF0YSk7Ci0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6Z2g9IDB4KCUwNHgpIC0gbXZfY3VzdF9vbWNpX2dlbXBvcnQ9IDB4KCUwNHgpICBcbiIsIF9fZnVuY19fLCBnaCwgbXZfY3VzdF9vbWNpX2dlbXBvcnQpOwotCi0gICAgLyogQ29tcGFyZSBHSCBmb3Igb21jaV9nZW1wb3J0ICovCi0gICAgaWYgKCAoZ2ggJiBNSF9HRU1fUE9SVF9NQVNLKSAhPSBtdl9jdXN0X29tY2lfZ2VtcG9ydCApIHsKLSAgICAgICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgcHJpbnRrKCIlczogY29tcGFyZSBHSCBmb3IgT01DSV9nZW1wb3J0IGZhaWxlZDogZ2g9IDB4KCUwNHgpIC0gbXZfY3VzdF9vbWNpX2dlbXBvcnQ9IDB4KCUwNHgpICBcbiIsIF9fZnVuY19fLCBnaCwgbXZfY3VzdF9vbWNpX2dlbXBvcnQpOwotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKDEpOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3Rfb21jaV9yeChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCByeF9ieXRlczsKLQotICAgIGlmICghbXZfY3VzdF9vbWNpX2dlbV9wYXJzZShza2ItPmRhdGEpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAobXZfY3VzdF9vbWNpX3J4X2doKSB7Ci0gICAgICAgIHJ4X2J5dGVzID0gcnhfZGVzYy0+ZGF0YVNpemU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBza2ItPmRhdGEgKz0gTVZfRVRIX01IX1NJWkU7Ci0gICAgICAgIHJ4X2J5dGVzID0gcnhfZGVzYy0+ZGF0YVNpemUgLSBNVl9FVEhfTUhfU0laRTsKLSAgICB9Ci0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3Rfb21jaV90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQotewotICAgIGlmICgoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmV0aF90eXBlKSkKLSAgICAgICAgJiYgKE1WX0NVU1RfQVBQX0VOQUJMRSA9PSBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmVuYWJsZSkKLSAgICAgICAgJiYgKHBvcnQgPT0gTVZfUE9OX1BPUlRfSUQpKSB7Ci0gICAgICAgIG1lbWNweSAodHhfc3BlY19vdXQsICZvbWNpX21nbXRfdHhfc3BlYywgc2l6ZW9mKHN0cnVjdCBtdl9ldGhfdHhfc3BlYykpOwotICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICBwcmludGsoIiVzIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBtdl9jdXN0X29hbV9yeF9naF9zZXQoaW50IHZhbCkKLXsKLSAgICBtdl9jdXN0X29hbV9yeF9naCA9IHZhbDsKLSAgICByZXR1cm47Ci19Ci0KLWludCBtdl9jdXN0X2VvYW1fbGxpZF9zZXQoaW50IGxsaWQsIHVpbnQ4X3QgKmxsaWRfbWFjLCBpbnQgdHhxKQotewotCi0gICAgaWYgKG12TmV0YVR4cENoZWNrKE1WX1BPTl9QT1JUX0lELCBsbGlkKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBpZiAodHhxPDAgfHwgdHhxPkNPTkZJR19NVl9FVEhfVFhRKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKCFsbGlkX21hYykgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgbWVtY3B5KCh2b2lkICopICYoZXBvbl9tZ210X3R4X3NwZWNbbGxpZF0ubGxpZF9tYWNfYWRkcmVzcyksICh2b2lkICopIGxsaWRfbWFjLCBFVEhfQUxFTik7Ci0KLSAgICBlcG9uX21nbXRfdHhfc3BlY1tsbGlkXS50eF9zcGVjLnR4cSA9IHR4cTsKLQotICAgIHJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X2VvYW1fbGxpZF9zZXQpOwotCi12b2lkIG12X2N1c3RfZW9hbV9pbml0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGk9MDtpIDwoRVBPTl9NR01UX0VOVFJJRVMpO2krKykgewotICAgICAgICBtZW1zZXQoJmVwb25fbWdtdF90eF9zcGVjW2ldLDAsIHNpemVvZihzdHJ1Y3QgbXZfZW9hbV9sbGlkX3NwZWMpKTsKLQotICAgICAgICAvKiBFYWNoIHRhYmxlIGVudHJ5IChpKSBhLXByaW9yaSBjb3JyZXNwb25kcyB0byBMTElEIChpKSAqLwotICAgICAgICBlcG9uX21nbXRfdHhfc3BlY1tpXS50eF9zcGVjLnR4cCA9IGk7Ci0KLSAgICAgICAgLyogVGhlIG12X25ldGEgZHJpdmVyIHdpbGwgYWRkIHRoZSBkZWZhdWx0IE1ILiBUaGUgTUggdmFsdWUgaGFzIG5vIHNpZ25pZmljYW5jZSBpbiBFUE9OIFVwc3RyZWFtICovCi0gICAgICAgIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MgPSBNVl9FVEhfRl9NSDsKLSAgICB9Ci0KLSAgICAvKiBJbiBSeCwga2VlcCB0aGUgTUggZm9yIEVPQU0gKi8KLSAgICBtdl9jdXN0X29hbV9yeF9naF9zZXQoMSk7Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBtdl9jdXN0X2VvYW1fcHJpbnQodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICBwcmludGsoIioqKioqKioqKioqKiogZU9BTSBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqXG5cbiIpOwotICAgIHByaW50aygiRU9BTTogdmFsaWQgPSAlZCwgZXRodHlwZSA9IDB4JTA0eCwgZ2hfa2VlcCA9ICVkXG4iLAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlLCAKLSAgICAgICAgICAgbnRvaHMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmV0aF90eXBlKSwgCi0gICAgICAgICAgIG12X2N1c3Rfb2FtX3J4X2doKTsKLSAgICBmb3IgKGk9MDtpIDwoRVBPTl9NR01UX0VOVFJJRVMpO2krKykgewotICAgICAgICBwcmludGsoImxsaWQlZDogbWFjPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCB0eHA9JWQsIHR4cT0lZCwgaHdfY21kPTB4JTA4eCwgZmxhZ3MgPSAweCUwNHhcbiIsCi0gICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1swXSxlcG9uX21nbXRfdHhfc3BlY1tpXS5sbGlkX21hY19hZGRyZXNzWzFdLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1syXSxlcG9uX21nbXRfdHhfc3BlY1tpXS5sbGlkX21hY19hZGRyZXNzWzNdLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1s0XSxlcG9uX21nbXRfdHhfc3BlY1tpXS5sbGlkX21hY19hZGRyZXNzWzVdLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0udHhfc3BlYy50eHAsIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMudHhxLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0udHhfc3BlYy5od19jbWQsIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MpOwotICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfZW9hbV90eXBlX3BhcnNlKHVpbnQ4X3QgKmRhdGEpCi17Ci0gICAgdWludDE2X3QgZXR5OwotCi0gICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKShkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOKSk7Ci0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6IGV0eSAweCglMDR4KVxuIiwgX19mdW5jX18sIGV0eSk7Ci0KLSAgICAvKiBDb21wYXJlIEVQT04gT0FNIGV0aGVyX3R5cGUgKi8KLSAgICBpZiAoZXR5ID09IE1IX0VQT05fT0FNX1RZUEUpCi0gICAgICAgIHJldHVybigxKTsKLQotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2Vwb25fb2FtX3J4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKQotewotICAgIHVpbnQzMl90IHJ4X2J5dGVzOwotCi0gICAgaWYgKCFtdl9jdXN0X2VvYW1fdHlwZV9wYXJzZShza2ItPmRhdGEpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChtdl9jdXN0X29hbV9yeF9naCkgewotICAgICAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2tiLT5kYXRhICs9IE1WX0VUSF9NSF9TSVpFOwotICAgICAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplIC0gTVZfRVRIX01IX1NJWkU7Ci0gICAgfQotCi0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmV0aF90eXBlKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCi0gICAgc2tiLT5kZXYgPSBkZXY7Ci0jZW5kaWYKLSAgICBtdl9jdXN0X3JlY19za2IocG9ydCwgc2tiKTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbXZfY3VzdF9lb2FtX3R4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQotewotICAgIGludCBtYWNfbWF0Y2gsIGk7Ci0KLSAgICBpZiAoKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmV0aF90eXBlKSkKLSAgICAgICAgJiYgKE1WX0NVU1RfQVBQX0VOQUJMRSA9PSBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlKQotICAgICAgICAmJiBwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSB7Ci0gICAgICAgIC8qIExvb2t1cCBNQUMgQWRkcmVzcyAqLwotICAgICAgICBmb3IgKGk9MDsgaTwoRVBPTl9NR01UX0VOVFJJRVMpO2krKykgewotICAgICAgICAgICAgbWFjX21hdGNoID0gbWVtY21wKCh2b2lkICopICYoZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoc2tiLT5kYXRhICsgLypNVl9FVEhfTUhfU0laRSArKi8gRVRIX0FMRU4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOKTsKLSAgICAgICAgICAgIGlmICghbWFjX21hdGNoKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5ICh0eF9zcGVjX291dCwgJmVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMsIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKLSAgICAgICAgICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMsIGxsaWQgPSAlZCIsIF9fZnVuY19fLCBpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBTb3VyY2UgTUFDIEFkZHJlc3Mgbm90IGZvdW5kICovCi0gICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkgewotICAgICAgICAgICAgcHJpbnRrKCIoJXMpSW5wdXQgUGFja2V0IGZpcnN0IGJ5dGVzOlxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgZm9yIChpPTA7aTwyNDtpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSU4PT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOwotICAgICAgICAgICAgICAgIHByaW50ayAoIiUwMnggIiwgKihza2ItPmRhdGEgKyBpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0lHTVBfSEFORExFCi12b2lkIG12X2N1c3RfaWdtcF9wcmludCh2b2lkKQotewotICAgIHByaW50aygiKioqKioqKioqKioqKiBJR01QIENvbmZpZ3VyYXRpb24gKioqKioqKioqKioqKioqKipcblxuIik7Ci0gICAgcHJpbnRrKCJJR01QIHZhbGlkID0gJWQsICBldGh0eXBlID0gMHglMDR4IFxuIiwKLSAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5lbmFibGUsIAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX0lHTVBdLmV0aF90eXBlKTsKLSAgICBwcmludGsoIklHTVAgZGVmYXVsdCB0eHEgPSAlZFxuIixNVl9DVVNUX1NXRl9UWF9RVUVVRSk7Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfaWdtcF9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGV0eTsKLSAgICB1aW50OF90ICBwcm90bzsKLSAgICB1aW50OF90ICpmaWVsZHAgPSBkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIHdoaWxlIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDkxMDAgfHwgZXR5ID09IDB4ODhBOCkgewotICAgICAgICBmaWVsZHArPSBWTEFOX0hMRU47Ci0gICAgICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIH0KLQotICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgcHJpbnRrKCIlczpldHkgMHgoJTA0eClcbiIsIF9fZnVuY19fLCBldHkpOwotCi0gICAgaWYgKGV0eSA9PSBFVFlfSVBWNCkgewotICAgICAgICBmaWVsZHArPSAyOwotICAgICAgICBmaWVsZHArPSBJUFY0X1BST1RPX09GRlNFVDsKLSAgICAgICAgcHJvdG8gPSAqZmllbGRwOwotICAgICAgICBpZiAobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgcHJpbnRrKCIlczpwcm90byAweCglMDJ4KVxuIiwgX19mdW5jX18sIHByb3RvKTsKLQotICAgICAgICBpZiAocHJvdG8gPT0gSVBQUk9UT19JR01QKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgIH0KLQotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2lnbXBfcngoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDMyX3QgcnhfYnl0ZXM7Ci0KLSAgICBpZiAoIW12X2N1c3RfaWdtcF9wYXJzZShza2ItPmRhdGEpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIFRvIEluZGljYXRlIHRoZSBzb3VyY2UgR01BQyAqLwotICAgIHNrYi0+ZGF0YVswXSA9IHBvcnQ7Ci0KLSAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplOwotCi0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3RfaWdtcF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5lbmFibGUgPT0gTVZfQ1VTVF9BUFBfRU5BQkxFKSB7Ci0gICAgICAgIC8qIENoZWNrIGFwcGxpY2F0aW9uIEV0aGVybmV0IHR5cGUgKi8KLSAgICAgICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5ldGhfdHlwZSkpIHsKLQotICAgICAgICAgICAgLyogVGhlIE1hcHBpbmcgYW5kIFZMQU4gbW9kIHNob3VsZCBiZSBzdXBwb3J0IGluIG5leHQgcGhhc2UgKi8KLSAgICAgICAgICAgIGlmIChNVl9QT05fUE9SVF9JRCA9PSBwb3J0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyA9IE1WX0VUSF9GX01IOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gMDsKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gTVZfQ1VTVF9TV0ZfVFhfUVVFVUU7Ci0gICAgICAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9IDA7Ci0jaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCi0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRQotdm9pZCBtdl9jdXN0X21sZF9wcmludCh2b2lkKQotewotICAgIHByaW50aygiKioqKioqKioqKioqKiBNTEQgQ29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKlxuXG4iKTsKLSAgICBwcmludGsoIk1MRCB2YWxpZCA9ICVkLCAgZXRodHlwZSA9IDB4JTA0eCBcbiIsCi0gICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTUxEXS5lbmFibGUsIAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZXRoX3R5cGUpOwotICAgIHByaW50aygiTUxEIGRlZmF1bHQgdHhxID0gJWRcbiIsTVZfQ1VTVF9TV0ZfVFhfUVVFVUUpOwotICAgIHByaW50aygiXG4iKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X21sZF9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGV0eTsKLSAgICB1aW50OF90ICpmaWVsZHAgPSBkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotCi0KLSAgICAvKiBMb29wIHRocm91Z2ggVkxBTiB0YWdzICovCi0gICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgd2hpbGUgKGV0eSA9PSAweDgxMDAgfHwgZXR5ID09IDB4OTEwMCB8fGV0eSA9PSAweDg4QTgpIHsKLSAgICAgICAgZmllbGRwKz0gVkxBTl9ITEVOOwotICAgICAgICBldHkgPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLSAgICB9Ci0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6ZXR5IDB4KCUwNHgpXG4iLCBfX2Z1bmNfXywgZXR5KTsKLQotICAgIGlmIChldHkgPT0gRVRIX1BfSVBWNikgCi0gICAgewotICAgICAgICBzdHJ1Y3QgaXB2NmhkciAqaGRyID0gKHN0cnVjdCBpcHY2aGRyICopKGZpZWxkcCsyKTsKLSAgICAgICAgc3RydWN0IGlwdjZfaG9wb3B0X2hkciAqaG9wb3B0aGRyIDsKLSAgICAgICAgc3RydWN0IGljbXA2aGRyICpwaWM7Ci0KLSAgICAgICAgaWYgKGhkci0+bmV4dGhkciAhPSBORVhUSERSX0hPUCApCi0gICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaG9wb3B0aGRyID0gKHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKikoKHVpbnQ4X3QgKiloZHIrIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwotCi0gICAgICAgIGlmICggaG9wb3B0aGRyLT5uZXh0aGRyICE9IElQUFJPVE9fSUNNUFY2KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgcGljID0gIChzdHJ1Y3QgaWNtcDZoZHIgKikoKHVpbnQ4X3QgKilob3BvcHRoZHIraXB2Nl9vcHRsZW4oaG9wb3B0aGRyKSk7Ci0KLSAgICAgICAgc3dpdGNoIChwaWMtPmljbXA2X3R5cGUpIHsKLSAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1FVRVJZOgotICAgICAgICBjYXNlIElDTVBWNl9NR01fUkVQT1JUOgotICAgICAgICBjYXNlIElDTVBWNl9NR01fUkVEVUNUSU9OOgotICAgICAgICBjYXNlIElDTVBWNl9NTEQyX1JFUE9SVDoKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X21sZF9yeChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCByeF9ieXRlczsKLQotICAgIGlmICghbXZfY3VzdF9tbGRfcGFyc2Uoc2tiLT5kYXRhKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBUbyBJbmRpY2F0ZSB0aGUgc291cmNlIEdNQUMgKi8KLSAgICBza2ItPmRhdGFbMF0gPSBwb3J0OwotCi0gICAgcnhfYnl0ZXMgPSByeF9kZXNjLT5kYXRhU2l6ZTsKLQotICAgIHNrYi0+dGFpbCArPSByeF9ieXRlczsKLSAgICBza2ItPmxlbiA9IHJ4X2J5dGVzOwotICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTUxEXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0KLSAgICBtdl9jdXN0X3JlY19za2IocG9ydCwgc2tiKTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbXZfY3VzdF9tbGRfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9NTERdLmVuYWJsZSA9PSBNVl9DVVNUX0FQUF9FTkFCTEUpIHsKLSAgICAgICAgLyogQ2hlY2sgYXBwbGljYXRpb24gRXRoZXJuZXQgdHlwZSAqLwotICAgICAgICBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZXRoX3R5cGUpKSB7Ci0KLSAgICAgICAgICAgIC8qIFRoZSBNYXBwaW5nIGFuZCBWTEFOIG1vZCBzaG91bGQgYmUgc3VwcG9ydCBpbiBuZXh0IHBoYXNlICovCi0gICAgICAgICAgICBpZiAoTVZfUE9OX1BPUlRfSUQgPT0gcG9ydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgPSBNVl9FVEhfRl9NSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9IDA7Ci0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhxICAgICA9IE1WX0NVU1RfU1dGX1RYX1FVRVVFOwotICAgICAgICAgICAgdHhfc3BlY19vdXQtPmh3X2NtZCAgPSAwOwotI2lmZGVmIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTAotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0xQQktfREVURUNUX0hBTkRMRQotdm9pZCBtdl9jdXN0X2xvb3BkZXRfcHJpbnQodm9pZCkKLXsKLSAgICBwcmludGsoIioqKioqKioqKioqKiogVU5JIGxvb3BiYWNrIGRldGVjdGlvbiBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqXG5cbiIpOwotICAgIHByaW50aygiTHBiayBkZXRlY3QgdmFsaWQgPSAlZCwgIGV0aHR5cGUgPSAweCUwNHggXG4iLAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX0xQQktdLmVuYWJsZSwgCi0gICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZXRoX3R5cGUpOwotICAgIHByaW50aygiTHBiayBkZXRlY3QgZGVmYXVsdCB0eHEgPSAlZFxuIixNVl9DVVNUX1NXRl9UWF9RVUVVRSk7Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfbG9vcGRldF9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGV0eTsKLSAgICB1aW50OF90ICpmaWVsZHAgPSBkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIHdoaWxlIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDkxMDAgfHxldHkgPT0gMHg4OEE4KSB7Ci0gICAgICAgIGZpZWxkcCs9IFZMQU5fSExFTjsKLSAgICAgICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgfQotICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgcHJpbnRrKCIlczogZXR5IDB4KCUwNHgpXG4iLCBfX2Z1bmNfXywgZXR5KTsKLQotICAgIC8qIENvbXBhcmUgRVBPTiBPQU0gZXRoZXJfdHlwZSAqLwotICAgIGlmIChldHkgPT0gZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5ldGhfdHlwZSkKLSAgICAgICAgcmV0dXJuKDEpOwotCi0gICAgcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfbG9vcGRldF9yeChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCByeF9ieXRlczsKLQotICAgIGlmICghbXZfY3VzdF9sb29wZGV0X3BhcnNlKHNrYi0+ZGF0YSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIC8qIFRvIEluZGljYXRlIHRoZSBzb3VyY2UgR01BQyAqLwotICAgIHNrYi0+ZGF0YVswXSA9IHBvcnQ7Ci0KLSAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplOwotCi0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3RfbG9vcGRldF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpZiAoTVZfQ1VTVF9BUFBfRU5BQkxFID09IGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZW5hYmxlKSB7Ci0gICAgICAgIC8qIENoZWNrIGFwcGxpY2F0aW9uIEV0aGVybmV0IHR5cGUgKi8KLSAgICAgICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5ldGhfdHlwZSkpIHsKLSAgICAgICAgIAotICAgICAgICAgICAgaWYgKE1WX1BPTl9QT1JUX0lEID09IHBvcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzID0gTVZfRVRIX0ZfTUg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cCAgICAgPSAwOwotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cSAgICAgPSBNVl9DVVNUX1NXRl9UWF9RVUVVRTsKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gMDsKLSNpZmRlZiBDT05GSUdfTVZfRVRIX1RYX1NQRUNJQUwKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKLSNlbmRpZiAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLXN0YXRpYyBpbmxpbmUgdm9pZCBtdl9jdXN0X2NvcHlfdHhfc3BlYyhzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKiB0eF9zcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQotewotICAgIHR4X3NwZWMtPnR4cCA9IHR4cDsKLSAgICB0eF9zcGVjLT50eHEgPSB0eHE7Ci0gICAgdHhfc3BlYy0+aHdfY21kID0gaHdfY21kOwotICAgIHR4X3NwZWMtPmZsYWdzID0gZmxhZ3M7Ci19Ci0KLWludCBtdl9jdXN0X3VkcF9zcGVjX3ByaW50KGludCBwb3J0KQotewotICAgIGludCBpOwotICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZChwb3J0KTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NwZWM7Ci0KLSAgICBpZiAoIXBwKQotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLQotICAgIHVkcF9zcGVjID0gJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0WzBdKTsKLQotICAgIHByaW50aygiXG4qKioqIHBvcnQgIyVkIC0gVFggVURQIERlc3QgUG9ydCBjb25maWd1cmF0aW9uICoqKioqXG4iLCBwb3J0KTsKLSAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgIHByaW50aygiSUQgdWRwX2RzdCAgIHR4cCAgICB0eHEgICAgZmxhZ3MgICAgaHdfY21kICAgICBmdW5jX2FkZFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFswXSk7IGkrKykgewotICAgICAgICBpZiAodWRwX3NwZWNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKQotICAgICAgICAgICAgcHJpbnRrKCIlMmQgICAlMDRkICAgICAgJWQgICAgICAlZCAgICAgMHglMDR4ICAgMHglMDh4ICAgMHglcFxuIiwKLSAgICAgICAgICAgICAgICAgICBpLCBudG9ocyh1ZHBfc3BlY1tpXS51ZHBfcG9ydCksCi0gICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eHAsIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxLAotICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MsIHVkcF9zcGVjW2ldLnR4X3NwZWMuaHdfY21kLAotICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhfZnVuYyk7Ci0gICAgfQotICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCi0gICAgdWRwX3NwZWMgPSAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbMF0pOwotCi0gICAgcHJpbnRrKCIqKioqIHBvcnQgIyVkIC0gVFggVURQIFNvdXJjZSBQb3J0IGNvbmZpZ3VyYXRpb24gKioqKipcbiIsIHBvcnQpOwotICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgIHByaW50aygiSUQgdWRwX3NyYyAgIHR4cCAgICB0eHEgICAgIGZsYWdzICAgIGh3X2NtZCAgICAgZnVuY19hZGRcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyYykvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbMF0pOyBpKyspIHsKLSAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkKLSAgICAgICAgICAgIHByaW50aygiJTJkICAgJTA0ZCAgICAgICVkICAgICAgJWQgICAgIDB4JTA0eCAgIDB4JTA4eCAgIDB4JXBcbiIsCi0gICAgICAgICAgICAgICAgICAgaSwgbnRvaHModWRwX3NwZWNbaV0udWRwX3BvcnQpLAotICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhwLCB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSwKLSAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLmZsYWdzLCB1ZHBfc3BlY1tpXS50eF9zcGVjLmh3X2NtZCwKLSAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4X2Z1bmMpOwotICAgIH0KLSAgICBwcmludGsoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLXZvaWQgbXZfY3VzdF91ZHBfc3BlY19wcmludF9hbGwodm9pZCkKLXsKLSAgICBpbnQgcG9ydDsKLQotICAgIGZvciAocG9ydD0wO3BvcnQgPCBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSA7cG9ydCsrKSB7Ci0gICAgICAgIG12X2N1c3RfdWRwX3NwZWNfcHJpbnQocG9ydCk7Ci0gICAgfQotfQotCi1NVl9TVEFUVVMgIG12X2N1c3RfdWRwX2ludF9zcGVjX3NldChzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NwZWMsIHVpbnQxNl90IHVkcF9wb3J0LCBpbnQgdGFibGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RzICovCi0gICAgZm9yIChpPTA7IGkgPCB0YWJsZV9zaXplO2krKykgewotICAgICAgICBpZiAodWRwX3NwZWNbaV0udWRwX3BvcnQgPT0gaHRvbnModWRwX3BvcnQpICYmCi0gICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpIHsKLSAgICAgICAgICAgIG12X2N1c3RfY29weV90eF9zcGVjKCYodWRwX3NwZWNbaV0udHhfc3BlYyksIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKLSAgICAgICAgICAgIHJldHVybiBNVl9PSzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDaGVjayBlbXB0eSAqLwotICAgIGZvciAoaT0wOyBpIDwgdGFibGVfc2l6ZTtpKyspIHsKLSAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxID09IE1WX0VUSF9UWFFfSU5WQUxJRCkgewotICAgICAgICAgICAgdWRwX3NwZWNbaV0udWRwX3BvcnQgPSBodG9ucyh1ZHBfcG9ydCk7Ci0gICAgICAgICAgICBtdl9jdXN0X2NvcHlfdHhfc3BlYygmKHVkcF9zcGVjW2ldLnR4X3NwZWMpLCB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7Ci0gICAgICAgICAgICByZXR1cm4gTVZfT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oTVZfRlVMTCk7Ci19Ci0KLQotTVZfU1RBVFVTICBtdl9jdXN0X3VkcF9zcmNfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9zcmNfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQotewotICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZCh0eF9wb3J0KTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NyY19zcGVjID0gdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyYzsKLSAgICBNVl9TVEFUVVMgbXZfc3RhdHVzOwotCi0gICAgaWYgKCFwcCkKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBtdl9zdGF0dXMgPSBtdl9jdXN0X3VkcF9pbnRfc3BlY19zZXQodWRwX3NyY19zcGVjLCB1ZHBfc3JjX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKLQotICAgIGlmIChtdl9zdGF0dXMgIT0gTVZfT0spCi0gICAgICAgIHByaW50aygiJXM6IFVEUCBTcGVjaWFsIFNvdXJjZSBQb3J0IFRhYmxlIGlzIGZ1bGxcbiIsIF9fZnVuY19fKTsKLQotICAgIHJldHVybihtdl9zdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X3VkcF9zcmNfc3BlY19zZXQpOwotCi0KLU1WX1NUQVRVUyAgbXZfY3VzdF91ZHBfZGVzdF9zcGVjX3NldChpbnQgdHhfcG9ydCwgdWludDE2X3QgdWRwX2Rlc3RfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQotewotICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZCh0eF9wb3J0KTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX2RzdF9zcGVjID0gdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdDsKLSAgICBNVl9TVEFUVVMgbXZfc3RhdHVzOwotCi0gICAgaWYgKCFwcCkKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBtdl9zdGF0dXMgPSBtdl9jdXN0X3VkcF9pbnRfc3BlY19zZXQodWRwX2RzdF9zcGVjLCB1ZHBfZGVzdF9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7Ci0KLSAgICBpZiAobXZfc3RhdHVzICE9IE1WX09LKQotICAgICAgICBwcmludGsoIiVzOiBVRFAgU3BlY2lhbCBEZXN0LiBQb3J0IFRhYmxlIGlzIGZ1bGxcbiIsIF9fZnVuY19fKTsKLQotICAgIHJldHVybihtdl9zdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X3VkcF9kZXN0X3NwZWNfc2V0KTsKLQotCi12b2lkICBtdl9jdXN0X3VkcF90YWJsZV9kZWwodm9pZCkKLXsKLSAgICBpbnQgbnVtX3BvcnRzID0gUE9SVF9FTlRSSUVTOwotICAgIGludCB0eF9wb3J0LCBpOwotCi0gICAgaWYgKG51bV9wb3J0cyA+IG12X2V0aF9wb3J0c19udW0pCi0gICAgICAgIG51bV9wb3J0cyA9IG12X2V0aF9wb3J0c19udW07Ci0KLQotICAgIGZvciAodHhfcG9ydD0wOyB0eF9wb3J0PG51bV9wb3J0czt0eF9wb3J0KyspIHsKLQotICAgICAgICAvKiBJbnZhbGlkYXRlIFVEUCBEZXN0IHBvcnRzLCBzZXQgdHhxPWludmFsaWQgICovCi0gICAgICAgIGZvciAoaT0wO2k8KHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFswXSkpO2krKykgewotICAgICAgICAgICAgbWVtc2V0KCYodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFtpXSksIDAsIHNpemVvZihzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYykpOwotICAgICAgICAgICAgdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFtpXS50eF9zcGVjLnR4cSA9IE1WX0VUSF9UWFFfSU5WQUxJRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEludmFsaWRhdGUgVURQIFNvdXJjZSBwb3J0cywgLCBzZXQgdHhxPWludmFsaWQgKi8KLSAgICAgICAgZm9yIChpPTA7aTwoc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjWzBdKSk7aSsrKSB7Ci0gICAgICAgICAgICBtZW1zZXQoJih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjW2ldKSwgMCwgc2l6ZW9mKHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjKSk7Ci0gICAgICAgICAgICB1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMudHhxID0gTVZfRVRIX1RYUV9JTlZBTElEOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1pbnQgbXZfY3VzdF91ZHBfcG9ydF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgc3RydWN0IGlwaGRyICAqIGlwaGRycCAgID0gTlVMTDsKLSAgICBzdHJ1Y3QgdWRwaGRyICogdWRwaGRycCAgPSBOVUxMOwotICAgIGludCBpOwotCi0gICAgaWYgKHBvcnQgPiBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSkgewotICAgICAgICBwcmludGsoIlBvcnQgRXJyb3JcbiIpOwotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotCi0gICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gRVRZX0lQVjQpIHsKLSAgICAgICAgLyogR2V0IFVEUCBQb3J0ICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQotICAgIGlwaGRycCA9IHNrYi0+bmguaXBoOwotI2Vsc2UKLSAgICBpcGhkcnAgPSBpcF9oZHIoc2tiKTsKLSNlbmRpZgotCi0gICAgICAgIGlmICgoaXBoZHJwKSAmJiAoaXBoZHJwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjIpCi0gICAgICAgIHVkcGhkcnAgPSBza2ItPmgudWg7Ci0jZWxzZQotICAgICAgICB1ZHBoZHJwID0gdWRwX2hkcihza2IpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAodWRwaGRycCkgewotICAgICAgICAgICAgICAgIGlmICh1ZHBoZHJwID09IChzdHJ1Y3QgdWRwaGRyICopaXBoZHJwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVkcGhkcnAgPSAoc3RydWN0IHVkcGhkciAqKSgoY2hhciAqKXVkcGhkcnAgKyAoNCooaXBoZHJwLT5paGwpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEZpbmQgY29uZmlndXJlZCBVRFAgU291cmNlIFBvcnQqLwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjWzBdKTtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1ZHBoZHJwLT5zb3VyY2UgPT0gdWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS51ZHBfcG9ydCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICh1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSAodHhfc3BlY19vdXQsICYodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjKSwgc2l6ZW9mKHN0cnVjdCBtdl9ldGhfdHhfc3BlYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBmb3VuZCB1ZHBfc3JjIDB4KCUwNHgpXG4iLCBfX2Z1bmNfXywgbnRvaHModWRwaGRycC0+c291cmNlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGaW5kIGNvbmZpZ3VyZWQgVURQIERlc3QuIFBvcnQqLwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3QpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0WzBdKTtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1ZHBoZHJwLT5kZXN0ID09IHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbaV0udWRwX3BvcnQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKHR4X3NwZWNfb3V0LCAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbaV0udHhfc3BlYyksIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogZm91bmQgdWRwX2RzdCAweCglMDR4KVxuIiwgX19mdW5jX18sIG50b2hzKHVkcGhkcnAtPmRlc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIGlmICggKHBvcnQgPT0gTVZfUE9OX1BPUlRfSUQpICYmIG12X2N1c3RfZGVidWdfY29kZSkgewotICAgICAgICAgICAgcHJpbnRrKCIlczpERUJVRyA6IFBhY2tldCBVRFAsIHVkcCBzb3VyY2Ugb3IgZGVzdCBwb3J0IG5vdCBmb3VuZCB1ZHBfc3JjKCV4KXggdWRwX2RzdCgleCl4XG4iLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLG50b2hzKHVkcGhkcnAtPnNvdXJjZSksIG50b2hzKHVkcGhkcnAtPmRlc3QpKTsKLSAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSAmJiBtdl9jdXN0X2RlYnVnX2NvZGUgKQotICAgICAgICAgICAgcHJpbnRrKCIlczpERUJVRyA6IE5PVCBVRFAsIGlwX3Byb3RvKCVkKSBcbiIsIF9fZnVuY19fLCBpcGhkcnAtPnByb3RvY29sKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSAmJiBtdl9jdXN0X2RlYnVnX2NvZGUgKQotICAgICAgICBwcmludGsoIiVzOkRFQlVHIDogTk9UIElQLCBwcm90byglZCkgXG4iLCBfX2Z1bmNfXywgc2tiLT5wcm90b2NvbCk7Ci0KLSAgICByZXR1cm4gMDsKLQotfQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotdm9pZCBtdl9jdXN0X2Zsb3dfbWFwX3ByaW50KHZvaWQpCi17Ci0gICAgcHJpbnRrKCIqKioqKioqKioqKioqIEZsb3cgTWFwcGluZyBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqXG5cbiIpOwotICAgIHByaW50aygiRmxvdyBtYXBwaW5nIHZhbGlkID0gJWRcbiIsIG12X2N1c3RfZmxvd19tYXApOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfZmxvd19tYXBfcGFyc2UodWludDhfdCAqZGF0YSwgdWludDE2X3QgKnZsYW4sIHVpbnQ4X3QgKnBiaXRzLCB1aW50OF90IGRpcikKLXsKLSAgICB1aW50MTZfdCBldHk7Ci0gICAgdWludDhfdCAqZmllbGRwIDsKLQotICAgIGlmIChNVl9DVVNUX0ZMT1dfRElSX1VTID09IGRpcikKLSAgICAgICAgZmllbGRwID0gZGF0YSArIEVUSF9BTEVOICsgRVRIX0FMRU47Ci0gICAgZWxzZQotICAgICAgICBmaWVsZHAgPSBkYXRhICsgRVRIX0FMRU4gKyBFVEhfQUxFTiArIE1WX0VUSF9NSF9TSVpFOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIGlmIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDg4QTggfHwgZXR5ID09IDB4OTEwMCkgewotICAgICAgICBmaWVsZHAgKz0gMjsKLSAgICAgICAgKnZsYW4gID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgICAgICpwYml0cyA9ICgqdmxhbiA+PiAxMyApICYgMHg3OwotICAgICAgICAqdmxhbiAgPSAoKnZsYW4pICYgMHhmZmY7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybigwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9mbG93X21hcF9tb2QodWludDhfdCAqZGF0YSwgdWludDE2X3QgdmlkLCB1aW50OF90IHBiaXRzLCB1aW50OF90IGRpcikKLXsKLSAgICB1aW50MTZfdCBldHkgID0gMDsKLSAgICB1aW50MTZfdCB2bGFuID0gMDsKLSAgICB1aW50OF90ICpmaWVsZHA7Ci0KLSAgICBpZiAoTVZfQ1VTVF9GTE9XX0RJUl9VUyA9PSBkaXIpCi0gICAgICAgIGZpZWxkcCA9IGRhdGEgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotICAgIGVsc2UKLSAgICAgICAgZmllbGRwID0gZGF0YSArIEVUSF9BTEVOICsgRVRIX0FMRU4gKyBNVl9FVEhfTUhfU0laRTsKLQotICAgIC8qIElmIG5vdCBuZWVkIHRvIG1vZGlmeSBWSUQgb3IgUC1iaXRzICovCi0gICAgaWYoKHZpZCA9PSBNVl9DVVNUX1ZJRF9OT1RfQ0FSRV9WQUxVRSkgJiYKLSAgICAgICAocGJpdHMgPT0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkpCi0gICAgICAgIHJldHVybiAoMSk7Ci0KLSAgICAvKiBMb29wIHRocm91Z2ggVkxBTiB0YWdzICovCi0gICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgaWYgKGV0eSA9PSAweDgxMDAgfHwgZXR5ID09IDB4ODhBOCB8fCBldHkgPT0gMHg5MTAwKSB7Ci0gICAgICAgIGZpZWxkcCArPSAyOwotCi0gICAgICAgIHZsYW4gPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLQotICAgICAgICBpZiAodmlkIDwgTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUUpCi0gICAgICAgICAgICB2bGFuID0gKHZsYW4gJiAweGYwMDApIHwgKHZpZCAmIDB4ZmZmKTsKLSAgICAgICAgaWYgKHBiaXRzIDwgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkKLSAgICAgICAgICAgIHZsYW4gPSAodmxhbiAmIDB4MGZmZikgfCAoKHBiaXRzICYgMHg3KSA8PCAxMyk7Ci0KLSAgICAgICAgKih1aW50MTZfdCAqKWZpZWxkcCA9IGh0b25zKHZsYW4pOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfZmxvd19tYXBfcngoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDE2X3QgdmxhbiAgICAgICAgPSAwOwotICAgIHVpbnQ4X3QgIHBiaXRzICAgICAgID0gMDsKLSAgICBpbnQgICAgICBidGFnICAgICAgICA9IDA7Ci0gICAgaW50ICAgICAgcmV0ICAgICAgICAgPSAwOwotICAgIG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCBjdXN0X2Zsb3c7Ci0KLSAgICBpZiAoTVZfUE9OX1BPUlRfSUQgIT0gcG9ydCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAobXZfY3VzdF9mbG93X21hcCkgewotCi0gICAgICAgIC8qIFBhcnNlIHBhY2tldHMgdG8gY2hlY2sgd2hldGhlciBpdCBpcyB0YWdnZWQgb3IgdW50YWdnZWQsIGFuZCBnZXQgdmxhbiBhbmQgcGJpdHMgaW4gdGFnZ2VkIG1vZGUgKi8KLSAgICAgICAgYnRhZyA9IG12X2N1c3RfZmxvd19tYXBfcGFyc2Uoc2tiLT5kYXRhLCAmdmxhbiwgJnBiaXRzLCBNVl9DVVNUX0ZMT1dfRElSX0RTKTsKLSAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIiAlcyBUWCBwYWNrZXQgMSBidGFnWyVkXSB2bGFuWyVkXSAgcGJpdHNbJWRdXG4iLCBfX2Z1bmNfXywgYnRhZywgdmxhbiwgcGJpdHMpOwotCi0gICAgICAgIC8qIFRoZSBmcmFtZSBpcyB0YWdnZWQgKi8KLSAgICAgICAgaWYgKGJ0YWcgPT0gMSkgewotICAgICAgICAgICAgY3VzdF9mbG93LnZpZCAgICA9IHZsYW47Ci0gICAgICAgICAgICBjdXN0X2Zsb3cucGJpdHMgID0gcGJpdHM7Ci0gICAgICAgICAgICBjdXN0X2Zsb3cuZGlyICAgID0gTVZfQ1VTVF9GTE9XX0RJUl9EUzsKLQotICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF90YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOwotICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIiAlcyBUWCBwYWNrZXQgMiB0cmdfcG9ydFslZF0gdHJnX3F1ZXVlWyVkXSAgZ2VtX3BvcnRbJWRdXG4iLCBfX2Z1bmNfXywgcGt0X2Z3ZC50cmdfcG9ydCwgcGt0X2Z3ZC50cmdfcXVldWUsIHBrdF9md2QuZ2VtX3BvcnQpOwotCi0gICAgICAgICAgICAvKiBNb2RpZnkgVklEIGFuZCBQLWJpdHMgaWYgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAocmV0ID09IE1WX0NVU1RfT0spIHsKLQotICAgICAgICAgICAgICAgIC8qIG1vZGlmeSBWSUQgYW5kIFAtYml0cyBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICByZXQgPSBtdl9jdXN0X2Zsb3dfbWFwX21vZChza2ItPmRhdGEsIGN1c3RfZmxvdy5tb2RfdmlkLCBjdXN0X2Zsb3cubW9kX3BiaXRzLCBNVl9DVVNUX0ZMT1dfRElSX0RTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbXZfY3VzdF9mbG93X21hcF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgc3RydWN0IGlwaGRyICppcGhkcnAgPSBOVUxMOwotICAgIHVpbnQxNl90IHZsYW4gICAgICAgID0gMDsKLSAgICB1aW50OF90ICBwYml0cyAgICAgICA9IDA7Ci0gICAgaW50ICAgICAgYnRhZyAgICAgICAgPSAwOwotICAgIGludCAgICAgIHJldCAgICAgICAgID0gMDsKLSAgICBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgY3VzdF9mbG93OwotCi0gICAgaWYgKE1WX1BPTl9QT1JUX0lEICE9IHBvcnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG12X2N1c3RfZmxvd19tYXApIHsKLQotICAgICAgICBjdXN0X2Zsb3cuZGlyICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7Ci0KLSAgICAgICAgLyogUGFyc2UgcGFja2V0cyB0byBjaGVjayB3aGV0aGVyIGl0IGlzIHRhZ2dlZCBvciB1bnRhZ2dlZCwgYW5kIGdldCB2bGFuIGFuZCBwYml0cyBpbiB0YWdnZWQgbW9kZSAqLwotICAgICAgICBidGFnID0gbXZfY3VzdF9mbG93X21hcF9wYXJzZShza2ItPmRhdGEsICZ2bGFuLCAmcGJpdHMsIE1WX0NVU1RfRkxPV19ESVJfVVMpOwotCi0gICAgICAgIC8qIFRoZSBmcmFtZSBpcyB0YWdnZWQgKi8KLSAgICAgICAgaWYgKGJ0YWcgPT0gMSkgewotICAgICAgICAgICAgY3VzdF9mbG93LnZpZCAgICA9IHZsYW47Ci0gICAgICAgICAgICBjdXN0X2Zsb3cucGJpdHMgID0gcGJpdHM7Ci0KLSAgICAgICAgICAgIHJldCA9IG12X2N1c3RfdGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsKLSAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICIgJXMgVFggcGFja2V0IDIgdHJnX3BvcnRbJWRdIHRyZ19xdWV1ZVslZF0gIGdlbV9wb3J0WyVkXVxuIiwgX19mdW5jX18sIHBrdF9md2QudHJnX3BvcnQsIHBrdF9md2QudHJnX3F1ZXVlLCBwa3RfZndkLmdlbV9wb3J0KTsKLQotICAgICAgICAgICAgLyogU2V0IEdFTSBwb3J0LCB0YXJnZXQgcG9ydCBhbmQgcXVldWUgKi8KLSAgICAgICAgICAgIGlmIChyZXQgPT0gTVZfQ1VTVF9PSykgewotICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9ICh1OCljdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQ7Ci0gICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gKHU4KWN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWU7Ci0gICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgPDwgOCl8MHgwMDEwKTsKLSAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IE1WX0VUSF9GX01IOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIG1vZGlmeSBWSUQgYW5kIFAtYml0cyBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF9mbG93X21hcF9tb2Qoc2tiLT5kYXRhLCBjdXN0X2Zsb3cubW9kX3ZpZCwgY3VzdF9mbG93Lm1vZF9wYml0cywgTVZfQ1VTVF9GTE9XX0RJUl9VUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBMb29rIGZvciBydWxlcyB0aGF0IGRvZXMgbm90IGNhcmUgVkxBTiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy52aWQgICA9IE1WX0NVU1RfREVGQVVMVF9TSU5HTEVfVEFHX1JVTEU7Ci0gICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF90YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOwotCi0gICAgICAgICAgICAgICAgLyogU2V0IEdFTSBwb3J0LCB0YXJnZXQgcG9ydCBhbmQgcXVldWUgKi8KLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gKHU4KWN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gKHU4KWN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9ICgoY3VzdF9mbG93LnBrdF9mcndkLmdlbV9wb3J0IDw8IDgpfDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IE1WX0VUSF9GX01IOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZnkgVklEIGFuZCBQLWJpdHMgaWYgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtdl9jdXN0X2Zsb3dfbWFwX21vZChza2ItPmRhdGEsIGN1c3RfZmxvdy5tb2RfdmlkLCBjdXN0X2Zsb3cubW9kX3BiaXRzLCBNVl9DVVNUX0ZMT1dfRElSX1VTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBUaGUgZnJhbWUgaXMgdW50YWdnZWQsIHRyeSB0byBnZXQgRFNDUCB2YWx1ZSAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChza2ItPnByb3RvY29sID09IEVUWV9JUFY0KSB7Ci0gICAgICAgICAgICAgICAgLyogR2V0IFVEUCBQb3J0ICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQotICAgICAgICAgICAgICAgIGlwaGRycCA9IHNrYi0+bmguaXBoOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBpcGhkcnAgPSBpcF9oZHIoc2tiKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5kc2NwICA9IChpcGhkcnAtPnRvcyA+PiAyKSAmIDB4M2Y7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LmRpciAgID0gTVZfQ1VTVF9GTE9XX0RJUl9VUzsKLQotICAgICAgICAgICAgICAgIHJldCA9IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOwotICAgICAgICAgICAgICAgIC8qIFNldCBHRU0gcG9ydCwgdGFyZ2V0IHBvcnQgYW5kIHF1ZXVlICovCi0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBNVl9DVVNUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9IGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gY3VzdF9mbG93LnBrdF9mcndkLnRyZ19xdWV1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgPDwgOCl8MHgwMDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyAgID0gTVZfRVRIX0ZfTUg7OwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LmRzY3AgID0gMDsKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cuZGlyICAgPSBNVl9DVVNUX0ZMT1dfRElSX1VTOwotCi0gICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF91bnRhZ19tYXBfcnVsZV9nZXQoJmN1c3RfZmxvdyk7Ci0gICAgICAgICAgICAgICAgLyogU2V0IEdFTSBwb3J0LCB0YXJnZXQgcG9ydCBhbmQgcXVldWUgKi8KLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gY3VzdF9mbG93LnBrdF9mcndkLnRyZ19wb3J0OwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cSAgICAgPSBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmh3X2NtZCAgPSAoKGN1c3RfZmxvdy5wa3RfZnJ3ZC5nZW1fcG9ydCA8PCA4KXwweDAwMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzICAgPSBNVl9FVEhfRl9NSDs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLQotCi12b2lkIG12X2N1c3RfcHJpbnQoaW50IHR5cGUpCi17Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9JR01QX0hBTkRMRQotICAgICAgICBjYXNlIE1WX0NVU1RfQVBQX1RZUEVfSUdNUDoKLSAgICAgICAgICAgIG12X2N1c3RfaWdtcF9wcmludCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9NTERfSEFORExFCi0gICAgICAgIGNhc2UgTVZfQ1VTVF9BUFBfVFlQRV9NTEQ6Ci0gICAgICAgICAgICBtdl9jdXN0X21sZF9wcmludCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEUKLSAgICAgICAgY2FzZSBNVl9DVVNUX0FQUF9UWVBFX0xQQks6Ci0gICAgICAgICAgICBtdl9jdXN0X2xvb3BkZXRfcHJpbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgTVZfQ1VTVF9BUFBfVFlQRV9PQU06Ci0gICAgICAgICAgICBtdl9jdXN0X2VvYW1fcHJpbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1WX0NVU1RfQVBQX1RZUEVfT01DSToKLSAgICAgICAgICAgIG12X2N1c3Rfb21jaV9wcmludCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKG12X2N1c3RfcHJpbnQpOwotCi0KLXZvaWQgbXZfY3VzdF9yeF9mdW5jKGludCBwb3J0LCBpbnQgcnhxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCBpOwotCi0gICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICBwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLSAgICBpZiAoZGV2ID09IE5VTEwgfHwgc2tiID09IE5VTEwgfHwgcnhfZGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50aygiJXM6IE5VTEwgUG9pbnRlciBkZXYoJXApIHNrYiglcCkgcnhfZGVzYyglcClcbiIsCi0gICAgICAgICAgICAgICBfX2Z1bmNfXywgZGV2LCBza2IsIHJ4X2Rlc2MpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJ4X2Rlc2MtPnBuY0luZm8gJiBORVRBX1BOQ19SWF9TUEVDSUFMKQotICAgIHsKLSAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT01DSV0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgaWYgKG12X2N1c3Rfb21jaV9yeChwb3J0LCBkZXYsIHNrYiwgcnhfZGVzYykpIHsKLSAgICAgICAgICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMgb21jaV9wYWNrZXRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIGlmIChnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgICAgIGlmIChtdl9jdXN0X2Vwb25fb2FtX3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBlb2FtX3BhY2tldFxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9JR01QX0hBTkRMRQotICAgICAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5lbmFibGUgPT0gTVZfQ1VTVF9BUFBfRU5BQkxFKSB7Ci0gICAgICAgICAgICBpZiAobXZfY3VzdF9pZ21wX3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBpZ21wX3BhY2tldFxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9NTERfSEFORExFCi0gICAgICAgIGlmIChnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgaWYgKG12X2N1c3RfbWxkX3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBtbGRfcGFja2V0XG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0xQQktfREVURUNUX0hBTkRMRQotICAgICAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5lbmFibGUgPT0gTVZfQ1VTVF9BUFBfRU5BQkxFKSB7Ci0gICAgICAgICAgICBpZiAobXZfY3VzdF9sb29wZGV0X3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBsb29wX2RldF9wYWNrZXRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIC8vTVZDVVNUX0VSUl9QUklOVCgiU3BlY2lhbCBwa3QgYXJyaXZlZCBmcm9tIHBvcnQoJWQpLCB3YXMgbm90IGhhbmRsZWQuIFxuIiwgcG9ydCk7Ci0gICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0gICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkgewotICAgICAgICAgICAgcHJpbnRrKCJJbnB1dCBQYWNrZXQgZmlyc3QgYnl0ZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoaT0wO2k8MjQ7aSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGklOD09IDApCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGsgKCIlMDJ4ICIsICooc2tiLT5kYXRhICsgaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICBpZiAobXZfY3VzdF9mbG93X21hcCkgewotICAgICAgICAgICAgaWYgKG12X2N1c3RfZmxvd19tYXBfcngocG9ydCwgZGV2LCBza2IsIHJ4X2Rlc2MpKSB7Ci0gICAgICAgICAgICAgICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzIGZsb3cgbWFwXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0KLWludCBtdl9jdXN0X3R4X2Z1bmMoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgaWYgKG12X2N1c3Rfb21jaV90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmIChtdl9jdXN0X2VvYW1fdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfSUdNUF9IQU5ETEUKLSAgICBpZiAobXZfY3VzdF9pZ21wX3R4KHBvcnQsIGRldiwgc2tiLCB0eF9zcGVjX291dCkpCi0gICAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9NTERfSEFORExFCi0gICAgaWYgKG12X2N1c3RfbWxkX3R4KHBvcnQsIGRldiwgc2tiLCB0eF9zcGVjX291dCkpCi0gICAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEUKLSAgICBpZiAobXZfY3VzdF9sb29wZGV0X3R4KHBvcnQsIGRldiwgc2tiLCB0eF9zcGVjX291dCkpCi0gICAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLSAgICBpZiAobXZfY3VzdF9mbG93X21hcF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLSAgICAvKiBTaW1wbGUgZXhhbXBsZSBmb3IgVURQIFNvdXJjZSBQb3J0IG9yIERlc3QgUG9ydCBQYXJzaW5nICovCi0gICAgLyogUGVyIFVEUCBzb3VyY2Ugb3IgZGVzdCBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBpZiAobXZfY3VzdF91ZHBfcG9ydF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IG12Y3VzdF9uZXRkZXZfaW5pdCh2b2lkKQotewotICAgIHVpbnQzMl90IHBvcnRfaTsKLQotICAgIC8qIFJldHJpZXZlIG51bV9wb3J0cywgYXMgaW4gbXZfZXRoX2luaXRfbW9kdWxlKi8KLSAgICBtdl9ldGhfcG9ydHNfbnVtID0gbXZDdHJsRXRoTWF4UG9ydEdldCgpOwotCi0gICAgaWYgKG12X2V0aF9wb3J0c19udW0gPiBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSkKLSAgICAgICAgbXZfZXRoX3BvcnRzX251bSA9IENPTkZJR19NVl9FVEhfUE9SVFNfTlVNOwotCi0gICAgbXZfY3VzdF9lb2FtX2luaXQoKTsKLSAgICAKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotICAgIG12X2N1c3RfdWRwX3RhYmxlX2RlbCgpOwotI2VuZGlmCi0KLS8qIEluaXRpYWxpemUgZmxvdyBtYXBwaW5nIGRhdGEgc3RydWN0dXJlICovCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgbXZfY3VzdF9mbG93X21hcF9pbml0KCk7Ci0jZW5kaWYKLQotICAgIC8qIFJlZ2lzdGVyIHNwZWNpYWwgcmVjZWl2ZSBjaGVjayBmdW5jdGlvbiAqLwotI2lmZGVmIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTAotICAgIGZvciAocG9ydF9pPTA7cG9ydF9pPCBtdl9ldGhfcG9ydHNfbnVtO3BvcnRfaSsrKSB7Ci0gICAgICAgIG12X2V0aF9yeF9zcGVjaWFsX3Byb2NfZnVuYyhwb3J0X2ksIG12X2N1c3RfcnhfZnVuYyk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTCAqLwotCi0KLSAgICAvKiBSZWdpc3RlciBzcGVjaWFsIHRyYW5zbWl0IGNoZWNrIGZ1bmN0aW9uICovCi0jaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCi0gICAgZm9yIChwb3J0X2k9MDtwb3J0X2k8IG12X2V0aF9wb3J0c19udW07cG9ydF9pKyspIHsKLSAgICAgICAgbXZfZXRoX3R4X3NwZWNpYWxfY2hlY2tfZnVuYyhwb3J0X2ksIG12X2N1c3RfdHhfZnVuYyk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTCAqLwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDc5NjMxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKgotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfbmV0ZGV2LmgKLSoKLSogREVTQ1JJUFRJT046Ci0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX212X2N1c3RfbmV0ZGV2X2hfXwotI2RlZmluZSBfX212X2N1c3RfbmV0ZGV2X2hfXwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLQotI2luY2x1ZGUgPG12Q29tbW9uLmg+Ci0jaW5jbHVkZSA8bXZPcy5oPgotI2luY2x1ZGUgPG12X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaD4KLQotCi0jZGVmaW5lIE1WX0NVU1RfTUFTX1VEUF9TUkNfUE9SVCAgICAgICAgICA4Ci0jZGVmaW5lIE1WX0NVU1RfTUFTX1VEUF9EU1RfUE9SVCAgICAgICAgICA4Ci0jZGVmaW5lIE1WX0NVU1RfTlVNX0xMSUQgICAgICAgICAgICAgICAgICA4Ci0KLQotc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgewotICAgIF9fYmUxNiAgICB1ZHBfcG9ydDsKLSAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgdHhfc3BlYzsKLX07Ci0KLXN0cnVjdCBtdl9wb3J0X3R4X3NwZWMgewotICAgIHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjIHVkcF9zcmNbTVZfQ1VTVF9NQVNfVURQX1NSQ19QT1JUXTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyB1ZHBfZHN0W01WX0NVU1RfTUFTX1VEUF9EU1RfUE9SVF07Ci19OwotCi0KLXN0cnVjdCBtdl9lb2FtX2xsaWRfc3BlYyB7Ci0gICAgdWludDhfdCBsbGlkX21hY19hZGRyZXNzWzZdOwotICAgIHN0cnVjdCAgbXZfZXRoX3R4X3NwZWMgdHhfc3BlYzsKLX07Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE1WX0NVU1RfQVBQX1RZUEVfSUdNUCA9IDAsIC8qIEZvciBJR01QIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgKi8KLSAgICBNVl9DVVNUX0FQUF9UWVBFX01MRCwgICAgICAvKiBGb3IgTUxEIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICovCi0gICAgTVZfQ1VTVF9BUFBfVFlQRV9MUEJLLCAgICAgLyogRm9yIGxvb3BiYWNrIGRldGVjdGlvbiBhcHBsaWNhdGlvbiAqLwotICAgIE1WX0NVU1RfQVBQX1RZUEVfT0FNLCAgICAgIC8qIEZvciBlT0FNIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgKi8KLSAgICBNVl9DVVNUX0FQUF9UWVBFX09NQ0ksICAgICAvKiBGb3IgT01DSSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICovCi0gICAgTVZfQ1VTVF9BUFBfVFlQRV9NQVggICAgICAgLyogTWF4IG51bWJlciBvZiBhcHBsaWNhdGlvbiAgICAgICAgICAqLyAKLX0gbXZfY3VzdF9hcHBfdHlwZV9lOwotCi0vKiAgRW51bTogZW5hYmxlIG9yIGRpc2FibGUgYXBwbGljYXRpb24qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTVZfQ1VTVF9BUFBfRElTQUJMRSAgPSAwLAotICAgIE1WX0NVU1RfQVBQX0VOQUJMRSAgID0gMSwKLX0gbXZfY3VzdF9hcHBfZmxhZ19lOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZTsgLyogQXBwbGljYXRpb24gdHlwZSwgc3VjaCBhcyBJR01QLCBNTEQgICAgICAgICAgICAgICAgKi8KLSAgICB1aW50MTZfdCAgICAgICAgICAgZW5hYmxlOyAgIC8qIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIGFwcGxpY2F0aW9uIFJ4L1R4ICovICAgICAgICAgCi0gICAgdWludDE2X3QgICAgICAgICAgIGV0aF90eXBlOyAvKiBBcHBsaWNhdGlvbiBFdGhlcm5ldCB0eXBlIHVzZWQgZm9yIHNvY2tldC9za2IgICAgICAqLwotICAgIGNoYXIgICAgICAgICAgICAgICpuYW1lOyAgICAgLyogVGhlIHJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgKi8KLX0gbXZfY3VzdF9hcHBfY29uZmlnX3Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gcHJvdG90eXBlcyAtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgICAgICAgIG12X2N1c3Rfb21jaV9od19jbWRfc2V0KHVuc2lnbmVkIGludCBod19jbWQpOwotaW50ICAgICAgICAgbXZfY3VzdF9vbWNpX3R4X3NldChpbnQgdGNvbnQsIGludCB0eHEpOwotCi0jaWZkZWYgIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi1NVl9TVEFUVVMgICBtdl9jdXN0X3VkcF9zcmNfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9zcmNfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKTsKLU1WX1NUQVRVUyAgIG12X2N1c3RfdWRwX2Rlc3Rfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9kZXN0X3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCk7Ci0jZW5kaWYKLQotdm9pZCAgICAgICAgbXZfY3VzdF9vYW1fcnhfZ2hfc2V0KGludCB2YWwpOwotaW50ICAgICAgICAgbXZfY3VzdF9vbWNpX3NldChpbnQgdGNvbnQsIGludCB0eHEsIGludCBnZW1wb3J0LCBpbnQga2VlcF9yeF9taCk7Ci1pbnQgICAgICAgICBtdl9jdXN0X2VvYW1fbGxpZF9zZXQoaW50IGxsaWQsIHVpbnQ4X3QgKmxsaWRfbWFjLCBpbnQgdHhxKTsKLQotdm9pZCAgICAgICAgbXZfY3VzdF9hcHBfZmxhZ19zZXQobXZfY3VzdF9hcHBfdHlwZV9lIGFwcF90eXBlLCB1aW50MTZfdCBlbmFibGUpOwotdm9pZCAgICAgICAgbXZfY3VzdF9hcHBfZXR5cGVfc2V0KG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZSwgdWludDE2X3QgZXRoX3R5cGUpOwotdm9pZCAgICAgICAgbXZfY3VzdF9wcmludChpbnQgdHlwZSk7Ci0KLQotI2VuZGlmIC8qIF9fbXZfY3VzdF9uZXRkZXZfaF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9zeXNmcy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3Rfc3lzZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M1MGM4OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9zeXNmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKgotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3Rfc3lzZnMuYwotKgotKiBERVNDUklQVElPTjoKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxnYmUvbXZOZXRhLmg+Ci0jaW5jbHVkZSA8cG5jL212UG5jLmg+Ci0KLSNpbmNsdWRlICJtdl9jdXN0X2Rldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfbmV0ZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9mbG93X21hcC5oIgotI2luY2x1ZGUgIm12X2N1c3RfbW5nX2lmLmgiCi0KLXN0YXRpYyBpbnQgICAgICBlb2FtX3R4cSA9IDA7Ci1zdGF0aWMgdWludDhfdCAgZW9hbV9tYWNbNl0gPSB7MH07Ci0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2NfaGVscChjaGFyICpidWYpCi17Ci0gICAgaW50IG9mZiA9IDA7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgaGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyB0aGlzIGhlbHBcbiIpOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHVkcF9wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgc3BlY2lhbCB1ZHAgc291cmNlIGFuZCBkZXN0LiBwb3J0IGNvbmZpZ3VyYXRpb25cbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgZmxvd19tYXAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyBmbG93IG1hcHBpbmcgY29uZmlndXJhdGlvblxuIik7ICAgICAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBmbG93X21hcF9zaG93ICAgICAgICAgICAgICAgICAgICAgLSBzaG93IGZsb3cgbWFwcGluZyBydWxlcyBcbiIpOyAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBmbG93X21hcF9jbGVhciAgICAgICAgICAgICAgICAgICAgLSBjbGVhciBhbGwgZmxvdyBtYXBwaW5nIHJ1bGVzXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBkc2NwX21hcF9kZWwgICAgICAgICAgICAgICAgICAgICAgLSBkZWxldGUgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlc1xuIik7ICAgIAotI2VuZGlmCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgdGNvbnRfc2hvdyAgICAgICAgICAgICAgICAgICAgICAgIC0gU2hvdyBhbGwgVC1DT05UIHN0YXRlXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyB0Y29udCBzdGF0ZSAgICAgICAgPiB0Y29udF9zZXQgICAgLSBTZXQgVC1DT05UIHRhdHVzLCB0Y29udCgwfjcpLCBzdGF0ZSgxOmVuYWJsZSwgMDpkaXNhYmxlKSBcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGhleCAgICAgICAgICAgICAgICA+IGRlYnVnICAgICAgICAtIFNldCBDdXN0b21pemVkIG1vZHVsZSBkZWJ1ZyBpbmZvcm1hdGlvbiBcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGFwcF90eXBlICAgICAgICAgICA+IGFwcF9zaG93ICAgICAtIFNob3cgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi4gMDppZ21wLCAxOm1sZCwgMjpscGJrLCAzOmVvYW0sIDQ6b21jaVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gYXBwX3R5cGUgZW5hYmxlICAgID4gYXBwX2ZsYWdfc2V0IC0gRW5hYmxlL2Rpc2FibGUgYXBwbGljYXRpb24uIDA6aWdtcCwgMTptbGQsIDI6bHBiaywgMzplb2FtLCA0Om9tY2ksIDE6ZW5hYmxlLCAwOmRpc2FibGVcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGFwcF90eXBlIGhleCAgICAgICA+IGFwcF9ldHlwZV9zZXQtIFNldCBhcHBsaWNhdGlvbiBFdGggdHlwZS4gMDppZ21wLCAxOm1sZCwgMjpscGJrLCAzOmVvYW0sIDQ6b21jaVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdGMgdHhxIGdlbSBrZWVwX21oID4gb21jaV9zZXQgICAgIC0gc2V0IHVkcCBzb3VyY2UgcG9ydCBzcGVjaWFsIFR4IGJlaGF2aW9yXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBrZWVwX21oICAgICAgICAgICAgPiBlb2FtX2doX2tlZXAgLSBLZWVwIG9yIG5vdCBrZWVwIEdIIGZvciBlT0FNIHBhY2tldHMsIDE6a2VlcCwgMDpkbyBub3Qga2VlcFxuIik7ICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHR4cSAgICAgICAgICAgICAgICA+IGVvYW1fdHhxICAgICAtIHNldCBUWCBxdWV1ZSBpbnRvIHN3X2J1ZmZlciBmb3IgRU9BTSBsbGlkIGNvbW1hbmRcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG1hY1swXS1tYWNbNV0gICAgICA+IGVvYW1fbWFjICAgICAtIHNldCBMTElEIG1hYyBpbnRvIHN3X2J1ZmZlciBmb3IgRU9BTSBsbGlkIGNvbW1hbmRcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGxsaWQgICAgICAgICAgICAgICA+IGVvYW1fd3JpdGUgICAtIFdyaXRlIEVPQU0gdHhxIGFuZCBtYWMgYWRkcmVzcyBmcm9tIHN3X2J1ZmZlciBpbnRvIExMSURcbiIpOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHAgdWRwX3NyYyhkZWMpIHR4cCB0eHEgZmxhZ3MgaHdfY21kICA+IHVkcF9zcmMgLSBzZXQgdWRwIHNvdXJjZSBwb3J0IHNwZWNpYWwgVHggYmVoYXZpb3JcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHAgdWRwX2RzdChkZWMpIHR4cCB0eHEgZmxhZ3MgaHdfY21kICA+IHVkcF9kc3QgLSBzZXQgdWRwIGRlc3QuICBwb3J0IHNwZWNpYWwgVHggYmVoYXZpb3JcbiIpOwotI2VuZGlmICAgIAotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGhleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IGZsb3dfbWFwX2RlYnVnICAtIFNldCBmbG93IG1hcHBpbmcgZGVidWcgZmxhZywgMTplbmFibGUsIDA6ZGlzYWJsZSBcbiIpOyAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyB2aWQgcGJpdHMgbW9kX3ZpZCBtb2RfcGJpdHMgdHJnX3BvcnQgdHJnX3F1ZXVlIHRyZ19od2ZfcXVldWUgZ2VtX3BvcnQgID4gZmxvd19tYXBfdXNfc2V0IC0gc2V0IFUvUyBmbG93IG1hcHBpbmcgcnVsZVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdmlkIHBiaXRzIG1vZF92aWQgbW9kX3BiaXRzICAgICAgICAgID4gZmxvd19tYXBfZHNfc2V0IC0gc2V0IEQvUyBmbG93IG1hcHBpbmcgcnVsZVxuIik7ICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHBiaXRzMCBwYml0czEgLi4uIHBiaXRzNjIgcGJpdHM2MyAgICA+IGRzY3BfbWFwX3NldCAgICAtIHNldCBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzXG4iKTsgICAgCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdmxhbiBwYml0cyBkaXIoMDpVL1MsIDE6RC9TKSAgICAgICAgID4gZmxvd19tYXBfZGVsICAgIC0gZGVsZXRlIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyB2bGFuIHBiaXRzIGRpcigwOlUvUywgMTpEL1MpICAgICAgICAgPiB0YWdfZmxvd19nZXQgICAgLSBnZXQgdGFnZ2VkIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBkc2NwIGRpcigwOlUvUywgMTpEL1MpICAgICAgICAgICAgICAgPiB1bnRhZ19mbG93X2dldCAgLSBnZXQgdW50YWdnZWQgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOwotI2VuZGlmICAgICAgICAKLQotICAgIHJldHVybiBvZmY7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0gICAgaW50IG9mZiAgID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGJvb2wgc3RhdGU7Ci0gICAgY29uc3QgY2hhciogbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLQotICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJoZWxwIikgKSB7Ci0gICAgICAgIG9mZiA9IG12X2N1c3Rfc3BlY19wcm9jX2hlbHAoYnVmKTsKLSAgICB9Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUgICAgICAgCi0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidWRwX3BvcnRzIikpIHsKLSAgICAgICAgbXZfY3VzdF91ZHBfc3BlY19wcmludF9hbGwoKTsKLSAgICB9Ci0jZW5kaWYgICAgCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFICAgICAgIAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZsb3dfbWFwIikpIHsgCi0gICAgICAgIG12X2N1c3RfZmxvd19tYXBfcHJpbnQoKTsKLSAgICB9ICAgICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9zaG93IikpIHsKLSAgICAgICAgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQoKTsKLSAgICB9IAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZsb3dfbWFwX2NsZWFyIikpIHsKLSAgICAgICAgbXZfY3VzdF9tYXBfcnVsZV9jbGVhcigpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRzY3BfbWFwX2RlbCIpKSB7Ci0gICAgICAgIG12X2N1c3RfZHNjcF9tYXBfZGVsKCk7Ci0gICAgfSAgICAgCi0jZW5kaWYKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ0Y29udF9zaG93IikpIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1VTVCBULUNPTlQgc3RhdGUgdGFibGVcbiIpOwotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJEZWZhdWx0IGludmFsaWQgVHhxOiVkIFxuIiwgQ1BIX0lOVkFMSURfVFJHVF9RVUVVRSk7Ci0gICAgICAgIHByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQ1BIX01BWF9UQ09OVF9OVU07IGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlID0gbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUoaW5kZXgpOwotICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiVC1DT05UJTEuMWQ6ICVzXG4iLCBpbmRleCwgKHN0YXRlPT10cnVlKT8iZW5hYmxlZCI6ImRpc2FibGVkIik7Ci0gICAgICAgIH0KLSAgICB9IAotICAgIGVsc2UKLSAgICAgICAgb2ZmID0gbXZfY3VzdF9zcGVjX3Byb2NfaGVscChidWYpOwotCi0gICAgcmV0dXJuIG9mZjsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgdjsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgdiA9IDA7Ci0KLSAgICBzc2NhbmYoYnVmLCAiJXgiLCAmdik7Ci0gICAgCi0gICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJkZWJ1ZyIpKSB7Ci0gICAgICAgIG12X2N1c3RfZGVidWdfaW5mb19zZXQodik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFwcF9zaG93IikpIHsKLSAgICAgICAgbXZfY3VzdF9wcmludCh2KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZW9hbV9naF9rZWVwIikpIHsKLSAgICAgICAgbXZfY3VzdF9vYW1fcnhfZ2hfc2V0KHYpOwotICAgIH0gICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJlb2FtX3R4cSIpKSB7Ci0gICAgICAgIGVvYW1fdHhxID0gdjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZW9hbV93cml0ZSIpKSB7Ci0gICAgICAgIG12X2N1c3RfZW9hbV9sbGlkX3NldCgoaW50KXYsICZlb2FtX21hY1swXSwgZW9hbV90eHEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKLQotICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IG12X2N1c3Rfc3BlY19wcm9jXzJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIqICAgICBuYW1lID0gYXR0ci0+YXR0ci5uYW1lOwotICAgIHVuc2lnbmVkIGludCAgICBwLCB2OwotICAgIHVuc2lnbmVkIGxvbmcgICBmbGFnczsKLQotICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgIC8qIFJlYWQgaW5wdXQgKi8KLSAgICBwID0gMDsKLSAgICB2ID0gMDsKLSAgICBzc2NhbmYoYnVmLCAiJWQgJXgiLCAmcCwgJnYpOwotCi0gICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJhcHBfZmxhZ19zZXQiKSkgewotICAgICAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChwLCB2KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYXBwX2V0eXBlX3NldCIpKSB7Ci0gICAgICAgIG12X2N1c3RfYXBwX2V0eXBlX3NldChwLCB2KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidGNvbnRfc2V0IikpIHsKLSAgICAgICAgaWYgKHYpCi0gICAgICAgICAgICBtdl9jdXN0X3NldF90Y29udF9zdGF0ZShwLCB0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUocCwgZmFsc2UpOwotICAgIH0gICAgCi0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY182X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgcCwgdjE9MCwgdjI9MCwgdjM9MCwgdjQ9MCwgdjU9MDsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgc3NjYW5mKGJ1ZiwgIiVkICVkICV4ICV4ICV4ICV4IiwgJnAsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1KTsKLQotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAidWRwX3NyYyIpKSB7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLSAgICAgICAgbXZfY3VzdF91ZHBfc3JjX3NwZWNfc2V0KHAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7Ci0jZWxzZQotICAgICAgICBwcmludGsoIm12X2N1c3QgbW9kdWxlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBVRFAgU0FNUExFIENvbmZpZyBTdXBwb3J0XG4iKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ1ZHBfZHN0IikpIHsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotICAgICAgICBtdl9jdXN0X3VkcF9kZXN0X3NwZWNfc2V0KHAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7Ci0jZWxzZQotICAgICAgICBwcmludGsoIm12X2N1c3QgbW9kdWxlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBVRFAgU0FNUExFIENvbmZpZyBTdXBwb3J0XG4iKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJvbWNpX3NldCIpKSB7Ci0gICAgICAgIG12X2N1c3Rfb21jaV9zZXQocCwgdjEsIHYyLCB2Myk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOwotCi0gICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIqICAgICAgICBuYW1lID0gYXR0ci0+YXR0ci5uYW1lOwotICAgIHVuc2lnbmVkIGludCAgICAgICB2MT0wLCB2Mj0wLCB2Mz0wLCB2ND0wLCB2NT0wLCB2Nj0wLCB2Nz0wLCB2OD0wOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICBmbGFnczsKLSAgICBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgY3VzdF9mbG93OwotCi0gICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotCi0gICAgLyogUmVhZCBpbnB1dCAqLwotICAgIHNzY2FuZihidWYsICIlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCIsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1LCAmdjYsICZ2NywgJnY4KTsKLQotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUgICAKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9kZWJ1ZyIpKSB7Ci0gICAgICAgIG12X2N1c3Rfc2V0X3RyYWNlX2ZsYWcoKHVpbnQzMl90KXYxKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZmxvd19tYXBfdXNfc2V0IikpIHsKLSAgICAgICAgbWVtc2V0KCZjdXN0X2Zsb3csIDAsIHNpemVvZihjdXN0X2Zsb3cpKTsKLSAgICAgICAgY3VzdF9mbG93LmRpciAgICAgICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7Ci0gICAgICAgIGN1c3RfZmxvdy52aWQgICAgICAgPSB2MTsKLSAgICAgICAgY3VzdF9mbG93LnBiaXRzICAgICA9IHYyOwotICAgICAgICBjdXN0X2Zsb3cubW9kX3ZpZCAgID0gdjM7Ci0gICAgICAgIGN1c3RfZmxvdy5tb2RfcGJpdHMgPSB2NDsKLSAgICAgICAgCi0gICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLnRyZ19wb3J0ICAgICAgPSAobXZfY3VzdF90cmdfcG9ydF90eXBlX3QpdjU7Ci0gICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUgICAgID0gKHVpbnQzMl90KXY2OwotICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSA9ICh1aW50MzJfdCl2NzsgICAgICAgIAotICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgICAgICA9IChtdl9jdXN0X2dlbV9wb3J0X2tleV90KXY4OwotICAgICAgICAKLSAgICAgICAgbXZfY3VzdF9tYXBfcnVsZV9zZXQoJmN1c3RfZmxvdyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZsb3dfbWFwX2RzX3NldCIpKSB7Ci0gICAgICAgIG1lbXNldCgmY3VzdF9mbG93LCAwLCBzaXplb2YoY3VzdF9mbG93KSk7Ci0gICAgICAgIGN1c3RfZmxvdy5kaXIgICAgICAgPSBNVl9DVVNUX0ZMT1dfRElSX0RTOwotICAgICAgICBjdXN0X2Zsb3cudmlkICAgICAgID0gdjE7Ci0gICAgICAgIGN1c3RfZmxvdy5wYml0cyAgICAgPSB2MjsKLSAgICAgICAgY3VzdF9mbG93Lm1vZF92aWQgICA9IHYzOwotICAgICAgICBjdXN0X2Zsb3cubW9kX3BiaXRzID0gdjQ7Ci0gICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC5pbl91c2UgICAgPSAxOwotICAgICAgICAKLSAgICAgICAgbXZfY3VzdF9tYXBfcnVsZV9zZXQoJmN1c3RfZmxvdyk7Ci0gICAgfSAgICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9kZWwiKSkgewotICAgICAgICBtdl9jdXN0X21hcF9ydWxlX2RlbCgodWludDE2X3QpdjEsICh1aW50OF90KXYyLCAobXZfY3VzdF9mbG93X2Rpcl9lKXYzKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidGFnX2Zsb3dfZ2V0IikpIHsKLSAgICAgICAgbWVtc2V0KCZjdXN0X2Zsb3csIDAsIHNpemVvZihjdXN0X2Zsb3cpKTsKLSAgICAgICAgY3VzdF9mbG93LnZpZCAgID0gdjE7Ci0gICAgICAgIGN1c3RfZmxvdy5wYml0cyA9IHYyOyAgIAotICAgICAgICBjdXN0X2Zsb3cuZGlyICAgPSAobXZfY3VzdF9mbG93X2Rpcl9lKXYzOyAgICAgICAgCi0gICAgICAgIG12X2N1c3RfdGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsKLSAgICAgICAgcHJpbnRrKCJpbl91c2VbJWRdLCBtb2RfdmlkWyVkXSBtb2RfcGJpdHNbJWRdIHRyZ19wb3J0WyVkXSwgdHJnX3F1ZXVlWyVkXSwgZ2VtX3BvcnRbJWRdXHJcbiIsCi0gICAgICAgICAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLmluX3VzZSwgY3VzdF9mbG93Lm1vZF92aWQsIAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5tb2RfcGJpdHMsIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydCwgCi0gICAgICAgICAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLnRyZ19xdWV1ZSwgY3VzdF9mbG93LnBrdF9mcndkLmdlbV9wb3J0KTsKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVudGFnX2Zsb3dfZ2V0IikpIHsKLSAgICAgICAgbWVtc2V0KCZjdXN0X2Zsb3csIDAsIHNpemVvZihjdXN0X2Zsb3cpKTsKLSAgICAgICAgY3VzdF9mbG93LmRzY3AgID0gIHYxOwotICAgICAgICBjdXN0X2Zsb3cuZGlyICAgPSAobXZfY3VzdF9mbG93X2Rpcl9lKXYyOyAgICAgICAgCi0gICAgICAgIG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOyAgICAKLSAgICAgICAgcHJpbnRrKCJpbl91c2VbJWRdLCBtb2RfdmlkWyVkXSBtb2RfcGJpdHNbJWRdIHRyZ19wb3J0WyVkXSwgdHJnX3F1ZXVlWyVkXSwgZ2VtX3BvcnRbJWRdXHJcbiIsIAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC5pbl91c2UsIGN1c3RfZmxvdy5tb2RfdmlkLCAKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cubW9kX3BiaXRzLCBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQsIAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUsIGN1c3RfZmxvdy5wa3RfZnJ3ZC5nZW1fcG9ydCk7ICAgICAgICAKLSAgICB9ICAgICAgCi0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0jZW5kaWYKLQotICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY182aF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgdjE9MCwgdjI9MCwgdjM9MCwgdjQ9MCwgdjU9MCwgdjY9MDsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgc3NjYW5mKGJ1ZiwgIiV4ICV4ICV4ICV4ICV4ICV4IiwgJnYxLCAmdjIsICZ2MywgJnY0LCAmdjUsICZ2Nik7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0gICAgaWYgKCFzdHJjbXAobmFtZSwgImVvYW1fbWFjIikpIHsKLSAgICAgICAgZW9hbV9tYWNbMF0gPSAodWludDhfdCl2MTsKLSAgICAgICAgZW9hbV9tYWNbMV0gPSAodWludDhfdCl2MjsKLSAgICAgICAgZW9hbV9tYWNbMl0gPSAodWludDhfdCl2MzsKLSAgICAgICAgZW9hbV9tYWNbM10gPSAodWludDhfdCl2NDsKLSAgICAgICAgZW9hbV9tYWNbNF0gPSAodWludDhfdCl2NTsKLSAgICAgICAgZW9hbV9tYWNbNV0gPSAodWludDhfdCl2NjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2NfNjRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3QgY2hhciogICAgICAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICB2WzY0XTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICBpbmRleCA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgZmxhZ3M7Ci0gICAgbXZfY3VzdF9kc2NwX3BiaXRzX3QgZHNjcF9tYXA7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgZm9yIChpbmRleD0wOyBpbmRleDw2NDsgaW5kZXgrKykgewotICAgICAgICBzc2NhbmYoYnVmLCAiJWQiLCAmdltpbmRleF0pOwotICAgICAgICBkc2NwX21hcC5wYml0c1tpbmRleF0gPSAodWludDhfdCl2W2luZGV4XTsKLSAgICB9Ci0gICAgZHNjcF9tYXAuaW5fdXNlID0gMTsKLQotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiZHNjcF9tYXBfc2V0IikpIHsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUgICAgICAgCi0gICAgICAgIG12X2N1c3RfZHNjcF9tYXBfc2V0KCZkc2NwX21hcCk7Ci0jZW5kaWYgICAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKLQotICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoaGVscCwgICAgICAgICAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGRlYnVnLCAgICAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKG9tY2lfc2V0LCAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY182X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihlb2FtX2doX2tlZXAsICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfMV9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZW9hbV90eHEsICAgICAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzFfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGVvYW1fbWFjLCAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY182aF9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZW9hbV93cml0ZSwgICAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzFfc3RvcmUpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIodGNvbnRfc2hvdywgICAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKHRjb250X3NldCwgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18yX3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKGFwcF9zaG93LCAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhcHBfZmxhZ19zZXQsICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfMl9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYXBwX2V0eXBlX3NldCwgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzJfc3RvcmUpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIodWRwX3BvcnRzLCAgICAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKHVkcF9zcmMsICAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY182X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih1ZHBfZHN0LCAgICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfNl9zdG9yZSk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihmbG93X21hcCwgICAgICAgU19JUlVTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXBfc2hvdywgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGZsb3dfbWFwX2NsZWFyLCBTX0lSVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkc2NwX21hcF9kZWwsICAgU19JUlVTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXBfZGVidWcsIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGZsb3dfbWFwX3VzX3NldCxTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY19mbG93X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmbG93X21hcF9kc19zZXQsU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXBfZGVsLCAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKHRhZ19mbG93X2dldCwgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY19mbG93X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih1bnRhZ19mbG93X2dldCwgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZHNjcF9tYXBfc2V0LCAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzY0X3N0b3JlKTsKLQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbXZfY3VzdF9zcGVjX3Byb2NfYXR0cnNbXSA9IHsKLSAgICAmZGV2X2F0dHJfaGVscC5hdHRyLCAgICAKLSAgICAmZGV2X2F0dHJfZGVidWcuYXR0ciwKLSAgICAmZGV2X2F0dHJfb21jaV9zZXQuYXR0ciwKLSAgICAmZGV2X2F0dHJfZW9hbV9naF9rZWVwLmF0dHIsCi0gICAgJmRldl9hdHRyX2VvYW1fdHhxLmF0dHIsCi0gICAgJmRldl9hdHRyX2VvYW1fbWFjLmF0dHIsCi0gICAgJmRldl9hdHRyX2VvYW1fd3JpdGUuYXR0ciwKLSAgICAmZGV2X2F0dHJfdGNvbnRfc2hvdy5hdHRyLAotICAgICZkZXZfYXR0cl90Y29udF9zZXQuYXR0ciwgICAgCi0gICAgJmRldl9hdHRyX2FwcF9zaG93LmF0dHIsCi0gICAgJmRldl9hdHRyX2FwcF9mbGFnX3NldC5hdHRyLAotICAgICZkZXZfYXR0cl9hcHBfZXR5cGVfc2V0LmF0dHIsICAgCi0gICAgJmRldl9hdHRyX3VkcF9wb3J0cy5hdHRyLCAgICAKLSAgICAmZGV2X2F0dHJfdWRwX3NyYy5hdHRyLAotICAgICZkZXZfYXR0cl91ZHBfZHN0LmF0dHIsCi0gICAgJmRldl9hdHRyX2Zsb3dfbWFwX2RlYnVnLmF0dHIsCi0gICAgJmRldl9hdHRyX2Zsb3dfbWFwX3VzX3NldC5hdHRyLAotICAgICZkZXZfYXR0cl9mbG93X21hcF9kc19zZXQuYXR0ciwgICAgCi0gICAgJmRldl9hdHRyX2RzY3BfbWFwX3NldC5hdHRyLAotICAgICZkZXZfYXR0cl9mbG93X21hcF9kZWwuYXR0ciwKLSAgICAmZGV2X2F0dHJfdGFnX2Zsb3dfZ2V0LmF0dHIsCi0gICAgJmRldl9hdHRyX3VudGFnX2Zsb3dfZ2V0LmF0dHIsCi0gICAgJmRldl9hdHRyX2Zsb3dfbWFwLmF0dHIsICAgIAotICAgICZkZXZfYXR0cl9mbG93X21hcF9zaG93LmF0dHIsICAgICAKLSAgICAmZGV2X2F0dHJfZmxvd19tYXBfY2xlYXIuYXR0ciwgICAKLSAgICAmZGV2X2F0dHJfZHNjcF9tYXBfZGVsLmF0dHIsICAgICAgIAotCi0gICAgTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbXZfY3VzdF9zcGVjX3Byb2NfZ3JvdXAgPSB7Ci0gICAgLm5hbWUgPSAicHJvdG8iLAotICAgIC5hdHRycyA9IG12X2N1c3Rfc3BlY19wcm9jX2F0dHJzLAotfTsKLQotaW50IG12Y3VzdF9zeXNmc19pbml0KHZvaWQpCi17Ci0gICAgaW50IGVycjsKLSAgICBzdHJ1Y3QgZGV2aWNlICpwZDsKLQotICAgIHBkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCAiY3VzdCIpOwotICAgIGlmICghcGQpIHsKLSAgICAgICAgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiY3VzdCIsIC0xLCBOVUxMLCAwKTsKLSAgICAgICAgcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJjdXN0Iik7Ci0gICAgfQotCi0gICAgaWYgKCFwZCkgewotICAgICAgICBwcmludGsoS0VSTl9FUlIiJXM6IGNhbm5vdCBmaW5kIGN1c3QgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwZCA9ICZwbGF0Zm9ybV9idXM7Ci0gICAgfQotCi0gICAgZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZC0+a29iaiwgJm12X2N1c3Rfc3BlY19wcm9jX2dyb3VwKTsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIHByaW50ayhLRVJOX0lORk8gInN5c2ZzIGdyb3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiPSBDVVNUIE1vZHVsZSBTWVMgRlMgSW5pdCBlbmRlZCBzdWNjZXNzZnVsbHkgPVxuIik7Ci0gICAgb3V0OgotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgbXZjdXN0X3N5c2ZzX2RlbGV0ZSh2b2lkKQotewotICAgIHN0cnVjdCBkZXZpY2UgKnBkOwotCi0gICAgcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJjdXN0Iik7Ci0gICAgaWYgKCFwZCkKLSAgICB7Ci0gICAgICAgIHByaW50ayhLRVJOX0VSUiIlczogY2Fubm90IGZpbmQgQ1VTVCBkZXZpY2VcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzeXNmc19yZW1vdmVfZ3JvdXAoJnBkLT5rb2JqLCAmbXZfY3VzdF9zcGVjX3Byb2NfZ3JvdXApOwotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiPSBDVVNUIE1vZHVsZSBTWVMgRlMgUmVtb3ZlIGVuZGVkIHN1Y2Nlc3NmdWxseSA9XG4iKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfZXp4bWwvZXp4bWxfcmVhZG1lLnR4dCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfZXp4bWwvZXp4bWxfcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTcyYWZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9lenhtbC9lenhtbF9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTkgQEAKK2V6eG1sLmMNCisxLglPcmlnaW5hbCBmaWxlIGxpbmUgMjUsIHJlbW92ZWQgkyNpbmNsdWRlIDxzdGRsaWIuaD6ULCBpdCBpcyBmb3IgdXNlciBzcGFjZQ0KKzIuCU9yaWdpbmFsIGZpbGUgbGluZSAzMiwgcmVtb3ZlZCCTI2lmbmRlZiBFWlhNTF9OT01NQVCUIGJsb2NrLCBhbmQgYWRkIGxpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZXMNCiszLglPcmlnaW5hbCBmaWxlIGxpbmUgMzgsIGFkZGVkIGZ1bmN0aW9uIGV6eG1sX3JlYWxsb2MvbWFsbG9jL3JlYWxsb2MvZnJlZS9zdGF0IGRlZmluaXRpb25zDQorNC4JT3JpZ2luYWwgZmlsZSBsaW5lIDU5LCBhZGRlZCBmdW5jdGlvbiBzdHJkdXANCis1LglPcmlnaW5hbCBmaWxlIGxpbmUgNjA0LCByZW1vdmUgZnVuY3Rpb24gZXp4bWxfcGFyc2VfZnANCis2LglPcmlnaW5hbCBmaWxlIGxpbmUgNjI2LCBjaGFuZ2VkIGV6eG1sX3BhcnNlX2ZkIGltcGxlbWVudGF0aW9uIHRvIGtlcm5lbCBzdHlsZQ0KKzcuCU9yaWdpbmFsIGZpbGUgbGluZSA2NTYsIGNoYW5nZWQgZXp4bWxfcGFyc2VfZmlsZSBpbXBsZW1lbnRhdGlvbiB0byBrZXJuZWwgc3R5bGUNCis4LglPcmlnaW5hbCBmaWxlIGxpbmUgODE0LCByZW1vdmVkIJMjaWZuZGVmIEVaWE1MX05PTU1BUJQgYmxvY2ssIG5vdCB1c2VkIGNvZGUgDQorOS4JT3JpZ2luYWwgZmlsZSBsaW5lIDk5OSwgcmVtb3ZlZCCTI2lmZGVmIEVaWE1MX1RFU1SUIGJsb2NrLCBub3QgdXNlZCBjb2RlIA0KKzEwLglPcmlnaW5hbCBmaWxlIGxpbmUgOTk5LCBhZGRlZCBmdW5jdGlvbiBlenhtbF9yZWFsbG9jIGltcGxlbWVudGF0aW9uDQorIA0KK2V6eG1sLmgNCisxLglPcmlnaW5hbCBmaWxlIGxpbmUgMjgsIHJlbW92ZWQgdXNlciBzcGFjZSBoZWFkZXIgZmlsZXMNCisyLglPcmlnaW5hbCBmaWxlIGxpbmUgNDIsIGFkZGVkIEZJTEUgZGVmaW5pdGlvbg0KKzMuCU9yaWdpbmFsIGZpbGUgbGluZSA2MiwgYWRkZWQgZnVuY3Rpb24gZXp4bWxfdCBlenhtbF9wYXJzZV9maWxlKCBjaGFyICpmaWxlKSBkZWNsYXJhdGlvbg0KKzQuCU9yaWdpbmFsIGZpbGUgbGluZSA2MiwgYWRkZWQgkyNpZmRlZiBFWlhNTF9URVNUlCANCis1LglPcmlnaW5hbCBmaWxlIGxpbmUgNjgsIHJlbW92ZWQgZnVuY3Rpb24gZXp4bWxfdCBlenhtbF9wYXJzZV9maWxlKCBjaGFyICpmaWxlKSBkZWNsYXJhdGlvbg0KKzYuCU9yaWdpbmFsIGZpbGUgbGluZSAxMjIsIDEzMCwgMTM3LCAxNDUsIGNoYW5nZWQgc3RyZHVwIHRvIE1NUF9PU19TVFJEVVANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L01ha2VmaWxlCmluZGV4IDg2NjAyOWEuLjYyNzQ3MWMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L01ha2VmaWxlCkBAIC0xNiwxMiArMTYsMTQgQEAKIAogaWZlcSAoJChDT05GSUdfTVZfRVRIX05GUF9MSUIpLHkpCiAJb2JqLSQoQ09ORklHX01WX0VUSEVSTkVUKSArPSBtdl9uZXRkZXYubyBtdl9ldGhlcm5ldC5vIG12X2V0aF9zeXNmcy5vCisJb2JqLSQoQ09ORklHX01WX0VUSEVSTkVUKSArPSBnb29nX2V0aF9zeXNmcy5vCiAJb2JqLSQoQ09ORklHX01WX1BPTikgICAgICArPSBtdl9wb25fc3lzZnMubwogCW9iai0kKENPTkZJR19NVl9FVEhfU1dJVENIKSArPSAgbXZfZXRoX3N3aXRjaC5vCiAJb2JqLSQoQ09ORklHX01WX0VUSF9UT09MKSArPSBtdl9ldGhfdG9vbC5vCiAJb2JqLXkgKz0gLi4vbmZwbGliLmEKIGVsc2UKIAlvYmotJChDT05GSUdfTVZfRVRIRVJORVQpICs9IG12X25ldGRldi5vIG12X2V0aGVybmV0Lm8gbXZfZXRoX3N5c2ZzLm8KKwlvYmotJChDT05GSUdfTVZfRVRIRVJORVQpICs9IGdvb2dfZXRoX3N5c2ZzLm8KIAlvYmotJChDT05GSUdfTVZfUE9OKSAgICAgICs9IG12X3Bvbl9zeXNmcy5vCiAJb2JqLSQoQ09ORklHX01WX0VUSF9TV0lUQ0gpICs9ICBtdl9ldGhfc3dpdGNoLm8KIAlvYmotJChDT05GSUdfTVZfRVRIX1RPT0wpICs9IG12X2V0aF90b29sLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L2dvb2dfZXRoX3N5c2ZzLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9nb29nX2V0aF9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzNTlhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9nb29nX2V0aF9zeXNmcy5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEdvb2dsZSwgMjAxMworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlICJnYmUvbXZOZXRhLmgiCisjaW5jbHVkZSAibXZfbmV0ZGV2LmgiCisKK3N0cnVjdCBnb29nX25ldF9hdHRyaWJ1dGUgeworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOworCXVpbnQ2NF90IHZhbDsKKwl1aW50MzJfdCBtaWI7CisJdWludDMyX3QgcG9ydDsKK307CisKKyNkZWZpbmUgR09PR19BVFRSKF9uYW1lLCBfcG9ydG5hbWUsIF9zaG93LCBfbWliLCBfcG9ydCkgICAgICAgICAgICAgICAgIFwKKwkJc3RydWN0IGdvb2dfbmV0X2F0dHJpYnV0ZSBnb29nX2F0dHJfIyNfbmFtZSMjXyMjX3BvcnRuYW1lID0geyAgICAgIFwKKwkJCS5kZXZfYXR0ciA9IF9fQVRUUihfbmFtZSwgU19JUlVTUiwgX3Nob3csIE5VTEwpLCBcCisJCQkubWliPSBfbWliLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJLnBvcnQgPSBfcG9ydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfQorCitzdGF0aWMgc3NpemVfdCBnb29nX2dldF9zdGF0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlNVl9VMzIgcmVnX2xvdywgcmVnX2hpZ2ggPSAwOworCXVpbnQ2NF90IHJlZ192YWw7CisJc3RydWN0IGdvb2dfbmV0X2F0dHJpYnV0ZSAqZ29vZ19hdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBnb29nX25ldF9hdHRyaWJ1dGUsIGRldl9hdHRyKTsKKyAgICAgICAgLy8gVGhlc2UgbWliIHJlZ2lzdGVycyBhcmUgY2xlYXIgb24gcmVhZC4KKwlyZWdfbG93ID0gbXZOZXRhTWliQ291bnRlclJlYWQoZ29vZ19hdHRyLT5wb3J0LCAwLCBnb29nX2F0dHItPm1pYiwgJnJlZ19oaWdoKTsKKwlyZWdfdmFsID0gKCh1aW50NjRfdClyZWdfaGlnaCkgPDwgMzIgfCAodWludDY0X3QpcmVnX2xvdzsKKwlnb29nX2F0dHItPnZhbCArPSByZWdfdmFsOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIGdvb2dfYXR0ci0+dmFsKTsKK30KKworLy8gU3RhdHMgZm9yIHRoZSBVTkkgcG9ydC4KK3N0YXRpYyBHT09HX0FUVFIocnhfZ29vZF9wYWNrZXRzLCB1bmksIGdvb2dfZ2V0X3N0YXQsIEVUSF9NSUJfR09PRF9GUkFNRVNfUkVDRUlWRUQsIDApOworc3RhdGljIEdPT0dfQVRUUihyeF9iYWRfcGFja2V0cywgdW5pLCBnb29nX2dldF9zdGF0LCBFVEhfTUlCX0JBRF9GUkFNRVNfUkVDRUlWRUQsIDApOworc3RhdGljIEdPT0dfQVRUUihyeF9icm9hZGNhc3RfcGFja2V0cywgdW5pLCBnb29nX2dldF9zdGF0LCBFVEhfTUlCX0JST0FEQ0FTVF9GUkFNRVNfUkVDRUlWRUQsIDApOworc3RhdGljIEdPT0dfQVRUUihyeF9tdWx0aWNhc3RfcGFja2V0cywgdW5pLCBnb29nX2dldF9zdGF0LCBFVEhfTUlCX01VTFRJQ0FTVF9GUkFNRVNfUkVDRUlWRUQsIDApOworc3RhdGljIEdPT0dfQVRUUih0eF9nb29kX3BhY2tldHMsIHVuaSwgZ29vZ19nZXRfc3RhdCwgRVRIX01JQl9HT09EX0ZSQU1FU19TRU5ULCAwKTsKK3N0YXRpYyBHT09HX0FUVFIodHhfYnJvYWRjYXN0X3BhY2tldHMsIHVuaSwgZ29vZ19nZXRfc3RhdCwgRVRIX01JQl9CUk9BRENBU1RfRlJBTUVTX1NFTlQsIDApOworc3RhdGljIEdPT0dfQVRUUih0eF9tdWx0aWNhc3RfcGFja2V0cywgdW5pLCBnb29nX2dldF9zdGF0LCBFVEhfTUlCX01VTFRJQ0FTVF9GUkFNRVNfU0VOVCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpnb29nX3VuaV9hdHRyc1tdID0geworCSZnb29nX2F0dHJfcnhfZ29vZF9wYWNrZXRzX3VuaS5kZXZfYXR0ci5hdHRyLAorCSZnb29nX2F0dHJfcnhfYmFkX3BhY2tldHNfdW5pLmRldl9hdHRyLmF0dHIsCisJJmdvb2dfYXR0cl9yeF9tdWx0aWNhc3RfcGFja2V0c191bmkuZGV2X2F0dHIuYXR0ciwKKwkmZ29vZ19hdHRyX3J4X2Jyb2FkY2FzdF9wYWNrZXRzX3VuaS5kZXZfYXR0ci5hdHRyLAorCSZnb29nX2F0dHJfdHhfZ29vZF9wYWNrZXRzX3VuaS5kZXZfYXR0ci5hdHRyLAorCSZnb29nX2F0dHJfdHhfYnJvYWRjYXN0X3BhY2tldHNfdW5pLmRldl9hdHRyLmF0dHIsCisJJmdvb2dfYXR0cl90eF9tdWx0aWNhc3RfcGFja2V0c191bmkuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGdvb2dfdW5pX3N0YXRzID0geworCS5uYW1lID0gInVuaXN0YXRzIiwKKwkuYXR0cnMgPSBnb29nX3VuaV9hdHRycywKK307CisKKworLy8gU3RhdHMgZm9yIHRoZSBBTkkgcG9ydC4KK3N0YXRpYyBHT09HX0FUVFIocnhfZ29vZF9wYWNrZXRzLCBhbmksIGdvb2dfZ2V0X3N0YXQsIEVUSF9NSUJfR09PRF9GUkFNRVNfUkVDRUlWRUQsIE1WX1BPTl9QT1JUX0lEKTsKK3N0YXRpYyBHT09HX0FUVFIocnhfYmFkX3BhY2tldHMsIGFuaSwgZ29vZ19nZXRfc3RhdCwgRVRIX01JQl9CQURfRlJBTUVTX1JFQ0VJVkVELCBNVl9QT05fUE9SVF9JRCk7CitzdGF0aWMgR09PR19BVFRSKHJ4X2Jyb2FkY2FzdF9wYWNrZXRzLCBhbmksIGdvb2dfZ2V0X3N0YXQsIEVUSF9NSUJfQlJPQURDQVNUX0ZSQU1FU19SRUNFSVZFRCwgTVZfUE9OX1BPUlRfSUQpOworc3RhdGljIEdPT0dfQVRUUihyeF9tdWx0aWNhc3RfcGFja2V0cywgYW5pLCBnb29nX2dldF9zdGF0LCBFVEhfTUlCX01VTFRJQ0FTVF9GUkFNRVNfUkVDRUlWRUQsIE1WX1BPTl9QT1JUX0lEKTsKK3N0YXRpYyBHT09HX0FUVFIodHhfZ29vZF9wYWNrZXRzLCBhbmksIGdvb2dfZ2V0X3N0YXQsIEVUSF9NSUJfR09PRF9GUkFNRVNfU0VOVCwgTVZfUE9OX1BPUlRfSUQpOworc3RhdGljIEdPT0dfQVRUUih0eF9icm9hZGNhc3RfcGFja2V0cywgYW5pLCBnb29nX2dldF9zdGF0LCBFVEhfTUlCX0JST0FEQ0FTVF9GUkFNRVNfU0VOVCwgTVZfUE9OX1BPUlRfSUQpOworc3RhdGljIEdPT0dfQVRUUih0eF9tdWx0aWNhc3RfcGFja2V0cywgYW5pLCBnb29nX2dldF9zdGF0LCBFVEhfTUlCX01VTFRJQ0FTVF9GUkFNRVNfU0VOVCwgTVZfUE9OX1BPUlRfSUQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ29vZ19hbmlfYXR0cnNbXSA9IHsKKwkmZ29vZ19hdHRyX3J4X2dvb2RfcGFja2V0c19hbmkuZGV2X2F0dHIuYXR0ciwKKwkmZ29vZ19hdHRyX3J4X2JhZF9wYWNrZXRzX2FuaS5kZXZfYXR0ci5hdHRyLAorCSZnb29nX2F0dHJfcnhfbXVsdGljYXN0X3BhY2tldHNfYW5pLmRldl9hdHRyLmF0dHIsCisJJmdvb2dfYXR0cl9yeF9icm9hZGNhc3RfcGFja2V0c19hbmkuZGV2X2F0dHIuYXR0ciwKKwkmZ29vZ19hdHRyX3R4X2dvb2RfcGFja2V0c19hbmkuZGV2X2F0dHIuYXR0ciwKKwkmZ29vZ19hdHRyX3R4X2Jyb2FkY2FzdF9wYWNrZXRzX2FuaS5kZXZfYXR0ci5hdHRyLAorCSZnb29nX2F0dHJfdHhfbXVsdGljYXN0X3BhY2tldHNfYW5pLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZ29vZ19hbmlfc3RhdHMgPSB7CisJLm5hbWUgPSAiYW5pc3RhdHMiLAorCS5hdHRycyA9IGdvb2dfYW5pX2F0dHJzLAorfTsKKworaW50IF9fZGV2aW5pdCBnb29nX2V0aF9zeXNmc19pbml0KHZvaWQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGRldmljZSAqcGQgPSBOVUxMOworCisJcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJuZXRhIik7CisJaWYgKCFwZCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJuZXRhIiwgLTEsIE5VTEwsIDApOworCQlwZCA9IGJ1c19maW5kX2RldmljZV9ieV9uYW1lKCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgIm5ldGEiKTsKKwl9CisKKwlpZiAoIXBkKSB7CisJCXByaW50ayhLRVJOX0VSUiIlczogY2Fubm90IGZpbmQgbmV0YSBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcGQgPSAmcGxhdGZvcm1fYnVzOworCX0KKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGQtPmtvYmosICZnb29nX3VuaV9zdGF0cyk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJzeXNmcyBncm91cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGQtPmtvYmosICZnb29nX2FuaV9zdGF0cyk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJzeXNmcyBncm91cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCisKKworbW9kdWxlX2luaXQoZ29vZ19ldGhfc3lzZnNfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoImpuZXdsaW5AZ29vZ2xlLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFkYWJsZSBuZXRzdGF0cyBmb3IgTWFydmVsbCA2NjAxLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuYwppbmRleCA4NmQ4NDk0Li40ZDU0MDI5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuYwpAQCAtNjYzLDkgKzY2Myw2IEBACiAJaWYgKHBwID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHBwID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCiAJdHhxX2N0cmwgPSAmcHAtPnR4cV9jdHJsW3R4cCAqIENPTkZJR19NVl9FVEhfVFhRICsgdHhxXTsKIAlpZiAodHhxX2N0cmwtPmNwdV9vd25lcikgewogCQltb2RlID0gTVZfRVRIX1RYUV9DUFU7CkBAIC04MjYsNyArODIzLDcgQEAKICNpZmRlZiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwKIC8qIFJlZ2lzdGVyIHNwZWNpYWwgdHJhbnNtaXQgY2hlY2sgZnVuY3Rpb24gKi8KIHZvaWQgbXZfZXRoX3J4X3NwZWNpYWxfcHJvY19mdW5jKGludCBwb3J0LCB2b2lkICgqZnVuYykoaW50IHBvcnQsIGludCByeHEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykpCisJCQkJCQkJc3RydWN0IGV0aF9wYnVmICpwa3QsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpKQogewogCXN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZChwb3J0KTsKIApAQCAtMTYyMCwxMyArMTYxNywxMyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTVZfRVRIX1BOQykgJiYgZGVmaW5lZChDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwpCiAJCS8qIFNwZWNpYWwgUlggcHJvY2Vzc2luZyAqLwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCiAJCWlmICgoTVZfUE9OX1BPUlRfSUQgPT0gcHAtPnBvcnQpIHx8IChyeF9kZXNjLT5wbmNJbmZvICYgTkVUQV9QTkNfUlhfU1BFQ0lBTCkpIHsKICNlbHNlCiAJCWlmIChyeF9kZXNjLT5wbmNJbmZvICYgTkVUQV9QTkNfUlhfU1BFQ0lBTCkgewogI2VuZGlmCiAJCQlpZiAocHAtPnJ4X3NwZWNpYWxfcHJvYykgewotCQkJCXBwLT5yeF9zcGVjaWFsX3Byb2MocHAtPnBvcnQsIHJ4cSwgZGV2LCAoc3RydWN0IHNrX2J1ZmYgKikocGt0LT5vc0luZm8pLCByeF9kZXNjKTsKKwkJCQlwcC0+cnhfc3BlY2lhbF9wcm9jKHBwLT5wb3J0LCByeHEsIGRldiwgcGt0LCByeF9kZXNjKTsKIAkJCQlTVEFUX0lORk8ocHAtPnN0YXRzLnJ4X3NwZWNpYWwrKyk7CiAKICAgICAgICAgICAgICAgICBpZiAocnhfZGVzYy0+cG5jSW5mbyAmIE5FVEFfUE5DX1JYX1NQRUNJQUwpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L212X25ldGRldi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmgKaW5kZXggNjA3YTRiYy4uNGI0ZDJiZCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmgKQEAgLTMzMyw3ICszMzMsNyBAQAogI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfUlhfQ1NVTV9PRkZMT0FEICovCiAjaWZkZWYgQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMCiAJdm9pZCAgICAoKnJ4X3NwZWNpYWxfcHJvYykoaW50IHBvcnQsIGludCByeHEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpOworCQkJCQlzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYyk7CiAjZW5kaWYgLyogQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMICovCiAjaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCiAJaW50ICAgICAoKnR4X3NwZWNpYWxfY2hlY2spKGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNzIzLDcgKzcyMyw3IEBACiAKICNpZmRlZiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwKIHZvaWQgICAgICAgIG12X2V0aF9yeF9zcGVjaWFsX3Byb2NfZnVuYyhpbnQgcG9ydCwgdm9pZCAoKmZ1bmMpKGludCBwb3J0LCBpbnQgcnhxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpKTsKKwkJCQkJCQlzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykpOwogI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTCAqLwogCiAjaWZkZWYgQ09ORklHX01WX01BQ19MRUFSTgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251QXBpLmMKaW5kZXggOWVhN2Q1OS4uZWI5Njk3OSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5jCkBAIC04MDYsOSArODA2LDIzIEBACiAJfQ0KIH0NCiANCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG12RXBvbkFwaTJrU3VwcG9ydGVkU2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgMksgYnl0ZSBwYWNrZXRzIHN1cHBvcnRlZCBvbiBNQyBib2FyZA0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBwa3Qya1N1cHBvcnRlZCAtIDJLIGJ5dGUgZW5hYmxlIG9yIGRpc2FibGUNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KIE1WX1NUQVRVUyBtdkVwb25BcGkya1N1cHBvcnRlZFNldChNVl9VMzIgcGt0MmtTdXBwb3J0ZWQpDQogew0KLSAgICBNVl9TVEFUVVMgc3RhdHVzID0gMDsNCisgICAgTVZfU1RBVFVTIHN0YXR1czsNCiAgICAgTVZfVTMyICAgIGRldklkOw0KIA0KICAgICBkZXZJZCA9IG12Q3RybE1vZGVsR2V0KCk7DQpAQCAtODM1LDQgKzg0OSwyOTIgQEAKICAgICByZXR1cm4gKHN0YXR1cyk7DQogfQ0KIA0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpTG9zVGltZUNvbmZpZw0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRpbWUgZHVyYXRpb24gdG8gZXhwaXJlIGZvciBlbnRlcmluZyBob2xkb3Zlcg0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBvcHRpY2FsTG9zVGltZSAtIHRpbWUgZHVyYXRpb24gd2hlbiBubyBvcHRpY2FsIHNpZ25hbCBkZXRlY3RlZA0KKyoqICAgICAgICAgICAgICAgbWFjTG9zVGltZSAgICAgLSB0aW1lIGR1cmF0aW9uIHdoZW4gbm8gR0FURSBNUENQRFUgcmVjZWl2ZWQNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBtdkVwb25BcGlMb3NUaW1lQ29uZmlnKE1WX1UxNiBvcHRpY2FsTG9zVGltZSwgTVZfVTE2IG1hY0xvc1RpbWUpDQorew0KKyAgICBNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7DQorICAgIA0KKyAgICBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZVNldChvcHRpY2FsTG9zVGltZSk7DQorICAgIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQobWFjTG9zVGltZSk7DQorDQorICAgIC8qIElmIHRoZSBob2xkb3ZlciB0aW1lciBpcyBub3QgYWN0aXZlLCB3ZSBhZGQgdGhlIE9wdGljYWxMb3NUaW1lciB0byB0aGUgaG9sZG92ZXIgdGltZSBhbmQgc2F2ZSAqLw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVQb25Ib2xkb3ZlclRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9OT1RfQUNUSVZFKQ0KKyAgICB7DQorICAgICAgICAvKiBBZGQgdGhlIGNvbmZpZ3VyZWQgT3B0TG9zVGltZSB0byBob2xkb3ZlciB0aW1lIGFuZCBzYXZlIGZvciBuZXh0IGhvbGRvdmVyICovDQorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251UG9uSG9sZG92ZXJUaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVHZXQoKSArIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lR2V0KCksIDApOw0KKyAgICB9DQorDQorICAgIHJldHVybiBzdGF0dXM7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpVHhQb3dlckN0cmxDb25maWcNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29udHJvbHMgdGhlIFRYIHBvd2VyIG9uIGFuZCBvZmYNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgYWN0aW9uIC0gdHVybiBvbiBhbmQgdHVybiBvZmYgdGhlIFRYIHBvd2VyLCBvciB0dXJuIG9mZiBhZnRlciANCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gdGltZSBkdXJhdGlvbi4NCisqKiAgICAgICAgICAgICAgIHRpbWUgICAtIHRpbWUgZHVyYXRpb24gdG8gYmUgZXhwaXJlZCBiZWZvcmUgdHVybmluZyBvZmYgVFgNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBtdkVwb25BcGlUeFBvd2VyQ3RybENvbmZpZyhNVl9VMTYgYWN0aW9uLCBNVl9VMTYgdGltZSkNCit7DQorICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsNCisgICAgDQorICAgIGlmIChhY3Rpb24gPT0gRV9FUE9OX0lPQ1RMX0VOQUJMRV9UWCkNCisgICAgew0KKyAgICAgICAgb251UG9uVHhQb3dlck9uKE1WX1RSVUUpOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0VQT05fSU9DVExfRElTQUJMRV9UWCkNCisgICAgew0KKyAgICAgICAgb251UG9uVHhQb3dlck9uKE1WX0ZBTFNFKTsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9FUE9OX0lPQ1RMX0RJU0FCTEVfVFhfREVMQVkpDQorICAgIHsgICAgICAgIA0KKyAgICAgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25UeENvbnRyb2xUaW1lcklkKSwgMCwgdGltZSwgMSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlQb3dlclNhdmluZ0NvbmZpZw0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBlYXJseVdha2V1cCAtIHNldCB0aGUgYWJpbGl0eSBvZiBzdXBwb3J0aW5nIGVhcmx5IHdha2UgdXANCisqKiAgICAgICAgICAgICAgIG1heFNsZWVwRHVyYXRpb24gLSB0aW1lIHBlcmlvZCBmb3Iga2VlcGluZyBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkxBU0UNCisqKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG12RXBvbkFwaVBvd2VyU2F2aW5nQ29uZmlnKE1WX1U4IGVhcmx5V2FrZXVwLCBNVl9VNjQgbWF4U2xlZXBEdXJhdGlvbikNCit7DQorICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsNCisgICAgDQorICAgIGlmICgob251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpICsgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKSkNCisgICAgICAgID49IG1heFNsZWVwRHVyYXRpb24pDQorICAgIHsNCisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0lORk8sIFBPTl9BUElfTU9EVUxFLA0KKwkJCSAgICAgICAiRVJST1I6IFdyb25nIHBhcmFtZXRlcnMsIHNsZWVwKCVkKSArIHdha2V1cCglZCkgPj0gbWF4U2xlZXBEdXJhdGlvbiglZClcclxuIiwgDQorCQkJICAgICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSwgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKSwgDQorCQkJICAgICAgIG1heFNsZWVwRHVyYXRpb24pOw0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gTVZfQkFEX1BBUkFNOw0KKyAgICB9DQorDQorICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwU2V0KGVhcmx5V2FrZXVwKTsNCisgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uU2V0KG1heFNsZWVwRHVyYXRpb24pOw0KKw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfQUNUSVZFKQ0KKyAgICB7DQorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZCksIDAsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2xlZXBEdXJhdGlvbiwgMSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsDQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbnRyb2xzIHNsZWVwIG1vZGUNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgZW5hYmxlIC0gdHVybiBvZmYgYW5kIHR1cm4gb24gdGhlIFRYIG9yIFJYDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKiogIFJlZjogICAgICAgICBDYWxsZWQgYnkgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlLCBtdkVwb25BcGlTbGVlcEN0cmxEaXNhYmxlLCANCisqKiAgICAgICAgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybENmZywgb251RXBvbk1heFNsZWVwVGltZXJIbmRsLCANCisqKiAgICAgICAgICAgICAgIG9udUVwb25TbGVlcFdha2VEdXJhdGlvblRpbWVySG5kbA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfVTMyIGVuYWJsZSkNCit7DQorICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsNCisgICAgDQorICAgIGlmIChvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQoKSA9PSBFX0VQT05fU0xFRVBfTU9ERV9DVFJMX1RYKQ0KKyAgICB7DQorICAgICAgICBpZiAoZW5hYmxlID09IE1WX1RSVUUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9GQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9UUlVFKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlIGlmIChvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQoKSA9PSBFX0VQT05fU0xFRVBfTU9ERV9DVFJMX1RYX1JYKQ0KKyAgICB7DQorICAgICAgICBpZiAoZW5hYmxlID09IE1WX1RSVUUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9GQUxTRSk7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG12T251RXBvbk1hY1NlcmRlc1B1UnhXcml0ZShNVl9GQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9UUlVFKTsNCisgICAgICAgICAgICBzdGF0dXMgfD0gbXZPbnVFcG9uTWFjU2VyZGVzUHVSeFdyaXRlKE1WX1RSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiBzdGF0dXM7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZQ0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIE9OVSB0byBsZWF2ZSB0aGUgcG93ZXIgc2F2aW5nIG1vZGUNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZSgpDQoreyAgIA0KKyAgICAvKiBTdG9wIG1heCBzbGVlcCB0aW1lciAqLw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfQUNUSVZFKQ0KKyAgICB7DQorICAgICAgICBvbnVQb25UaW1lckRpc2FibGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQpKTsNCisgICAgfQ0KKw0KKyAgICAvKiBTdG9wIHNsZWVwL3dha2V1cCBkdXJhdGlvbiB0aW1lciAqLw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9BQ1RJVkUpDQorICAgIHsNCisgICAgICAgIG9udVBvblRpbWVyRGlzYWJsZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSk7DQorICAgIH0NCisNCisgICAgLyogRW5hYmxlIFRYL1JYIHBvd2VyICovDQorICAgIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfRkFMU0UpOw0KKw0KKyAgICAvKiBMZWF2ZSB0aGUgcG93ZXIgc2F2aW5nIHN0YXR1cyAqLw0KKyAgICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChFX0VQT05fTk9UX1BPV0VSX1NBVklOR19TVEFUVVMpOw0KKw0KKyAgICByZXR1cm4oTVZfT0spOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG12RXBvbkFwaVNsZWVwQ3RybEVuYWJsZQ0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIE9OVSB0byBlbnRlciB0aGUgcG93ZXIgc2F2aW5nIG1vZGUNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlKCkNCit7DQorICAgIC8qIHJlZnJlc2ggbWF4IHNsZWVwIHRpbWVyLCBubyBtYXR0ZXIgaXQncyBhY3RpdmUgb3Igbm90ICovDQorICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvbkdldCgpLCAxKTsNCisNCisgICAgLyogcmVmcmVzaCBzbGVlcC93YWtldXAgZHVyYXRpb24gdGltZXIsIG5vIG1hdHRlciBpdCdzIGFjdGl2ZSBvciBub3QgKi8NCisgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZCksIDAsIA0KKyAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCksIDEpOw0KKw0KKyAgICAvKiBpZiB0aGUgY3VycmVudCBzdGF0dXMgaXMgbm90IHNsZWVwLCB0aGVuIGdvIHRvIHNsZWVwIHN0YXR1cyAqLw0KKyAgICBpZiAob251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNHZXQoKSAhPSBFX0VQT05fUE9XRVJfU0FWSU5HX1NMRUVQX1NUQVRVUykNCisgICAgew0KKyAgICAgICAgLyogRGlzYWJsZSBUWC9SWCBwb3dlciAqLw0KKyAgICAgICAgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9UUlVFKTsNCisNCisgICAgICAgIC8qIHVwZGF0ZSBzdGF0dXMgdG8gc2xlZXAgc3RhdHVzICovDQorICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChFX0VQT05fUE9XRVJfU0FWSU5HX1NMRUVQX1NUQVRVUyk7DQorICAgIH0NCisNCisgICAgcmV0dXJuKE1WX09LKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlTbGVlcEN0cmxDZmcNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGFyYW1ldGVycyB1c2VkIGluIHRoZSBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBtb2RlIC0gMDogZG8gbm90aGluZywgMTogdHVybiBvZmYgVHgsIDI6IHR1cm4gb2ZmIFR4IGFuZCBSeA0KKyoqICAgICAgICAgICAgICAgc2xlZXBEdXJhdGlvbiAtIHRpbWUgZHVyYXRpb24gZm9yIGtlZXBpbmcgc2xlZXANCisqKiAgICAgICAgICAgICAgIHdha2V1cER1cmF0aW9uIC0gdGltZSBkdXJhdGlvbiBmb3IgYmVpbmcgd2FrZXVwDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsQ2ZnKE1WX1U4IG1vZGUsIE1WX1UzMiBzbGVlcER1cmF0aW9uLCBNVl9VMzIgd2FrZXVwRHVyYXRpb24pDQorew0KKyAgICBpZiAoKHNsZWVwRHVyYXRpb24gKyB3YWtldXBEdXJhdGlvbikgPj0gb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCkpDQorICAgIHsNCisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwNCisJCQkgICAgICAgIkVSUk9SOiBXcm9uZyBwYXJhbWV0ZXJzLCBzbGVlcCglZCkgKyB3YWtldXAoJWQpID49IG1heFNsZWVwRHVyYXRpb24oJWQpXHJcbiIsIA0KKwkJCSAgICAgICBzbGVlcER1cmF0aW9uLCBzbGVlcER1cmF0aW9uLCANCisJCQkgICAgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCkpOw0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gTVZfQkFEX1BBUkFNOw0KKyAgICB9DQorDQorICAgIC8qIHNhdmUgcGFyYXRlcnMgaW50byBEQiAqLw0KKyAgICBvbnVFcG9uRGJPbnVTbGVlcE1vZGVTZXQobW9kZSk7DQorICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25TZXQoc2xlZXBEdXJhdGlvbik7DQorICAgIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uU2V0KHdha2V1cER1cmF0aW9uKTsNCisNCisgICAgLyogcmVmcmVzaCBtYXggc2xlZXAgdGltZXIsIG5vIG1hdHRlciBpdCdzIGFjdGl2ZSBvciBub3QgKi8NCisgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQpLCAwLCANCisgICAgICAgICAgICAgICAgICAgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCksIDEpOw0KKw0KKyAgICAvKiByZWZyZXNoIHNsZWVwL3dha2V1cCBkdXJhdGlvbiB0aW1lciwgbm8gbWF0dGVyIGl0J3MgYWN0aXZlIG9yIG5vdCAqLw0KKyAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSwgMSk7DQorDQorICAgIC8qIGlmIHRoZSBjdXJyZW50IHN0YXR1cyBpcyBub3Qgc2xlZXAsIHRoZW4gZ28gdG8gc2xlZXAgc3RhdHVzICovDQorICAgIGlmIChvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c0dldCgpICE9IEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTKQ0KKyAgICB7DQorICAgICAgICAvKiBEaXNhYmxlIFRYL1JYIHBvd2VyICovDQorICAgICAgICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX1RSVUUpOw0KKw0KKyAgICAgICAgLyogdXBkYXRlIHN0YXR1cyB0byBzbGVlcCBzdGF0dXMgKi8NCisgICAgICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4oTVZfT0spOw0KK30NCisNCiANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuaAppbmRleCA5ZTIzOTg0Li43NTkwZGFmIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251QXBpLmgKQEAgLTgzLDYgKzgzLDcgQEAKIA0KIC8qIEluY2x1ZGUgRmlsZXMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyNpbmNsdWRlICJlcG9uT251RGIuaCINCiAgDQogLyogRGVmaW5pdGlvbnMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyANCkBAIC0xNDUsNiArMTQ2LDE0IEBACiAvKiBDb25maWcgQVBJICovDQogTVZfU1RBVFVTIG12RXBvbkFwaTJrU3VwcG9ydGVkU2V0KE1WX1UzMiBwa3Qya1N1cHBvcnRlZCk7DQogDQorTVZfU1RBVFVTIG12RXBvbkFwaUxvc1RpbWVDb25maWcoTVZfVTE2IG9wdGljYWxMb3NUaW1lLCBNVl9VMTYgbWFjTG9zVGltZSk7DQorTVZfU1RBVFVTIG12RXBvbkFwaVR4UG93ZXJDdHJsQ29uZmlnKE1WX1UxNiBhY3Rpb24sIE1WX1UxNiB0aW1lKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpUG93ZXJTYXZpbmdDb25maWcoTVZfVTggZWFybHlXYWtldXAsIE1WX1U2NCBtYXhTbGVlcER1cmF0aW9uKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9VMzIgZW5hYmxlKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZSh2b2lkKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlKHZvaWQpOw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcEN0cmxDZmcoTVZfVTggbW9kZSwgTVZfVTMyIHNsZWVwRHVyYXRpb24sIE1WX1UzMiB3YWtldXBEdXJhdGlvbik7DQorDQogLyogTWFjcm9zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgDQogDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5jCmluZGV4IGM1YmNmM2IuLjNiZjZiNTcgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251RGIuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmMKQEAgLTI4MiwxMSArMjgyLDE5IEBACiANCiAJLyogc2V0IGhvbGRvdmVyICovDQogCW9udUVwb25EYk9udUhvbGRvdmVyU3RhdGVTZXQoT05VX0hPTERPVkVSX05PVF9BQ1RJVkUpOw0KKyAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVTZXQoT05VX1BPTl9USU1FUl9IT0xET1ZFUl9JTlRFUlZBTCk7DQorICAgIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lU2V0KDApOw0KKw0KKyAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25TZXQoT05VX1BPTl9USU1FUl9NQVhfU0xFRVBfSU5URVJWQUwpOw0KKyAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldCgwKTsNCisgICAgb251RXBvbkRiT251U2xlZXBNb2RlU2V0KEVfRVBPTl9TTEVFUF9NT0RFX0NUUkxfVFgpOw0KKyAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uU2V0KE9OVV9QT05fVElNRVJfU0xFRVBfRFVSQVRJT04pOw0KKyAgICBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvblNldChPTlVfUE9OX1RJTUVSX1dBS0VVUF9EVVJBVElPTik7DQorICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9OT1RfUE9XRVJfU0FWSU5HX1NUQVRVUyk7DQogDQogCS8qIHNldCBzaWxlbmNlICovDQogCW9udUVwb25EYk9udVNpbGVuY2VTdGF0ZVNldChPTlVfU0lMRU5DRV9OT1RfQUNUSVZFKTsNCiANCi0NCiAJLyogU1cgREJBIHBhcmFtcyAqLw0KIAlvbnVFcG9uRGJPbnVTd1JwcnRUaW1lclR5cGVTZXQoT05VX0VQT05fU1dfREJBX1JQUlRfVElNRVIpOw0KIAlvbnVFcG9uRGJPbnVTd1JwcnRNYWNUaW1lckludGVydmFsU2V0KDYyNTAwKTsgLyogMSBtc2VjIGluIDE2bmFubyB1bml0cyAqLw0KQEAgLTE0NTMsNiArMTQ2MSwzMzIgQEAKIH0NCiANCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVTZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGltZSBkdXJhdGlvbiB2YWx1ZSBpbiBkYXRhYmFzZSANCisgKiogICAgICAgICAgICAgICB3aGVuIG5vIG9wdGljYWwgc2lnbmFsIGlzIGRldGVjdGVkDQorICoqICAgICAgICAgICAgICAgDQorICoqICBQQVJBTUVURVJTOiAgbG9zVGltZSAtIHRpbWUgZHVyYXRpb24NCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZVNldChNVl9VMTYgbG9zVGltZSkNCit7DQorICAgIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uT3B0aWNhbExvc1RpbWUgPSBsb3NUaW1lOw0KKyAgICANCisgICAgcmV0dXJuIE1WX09LOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lR2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKiANCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRpbWUgZHVyYXRpb24gdG8gYmUgdXNlZCANCisqKiAgICAgICAgICAgICAgIHdoZW4gbm8gb3B0aWNhbCBzaWduYWwgaXMgZGV0ZWN0ZWQNCisqKiAgICAgICAgICAgICAgIA0KKyoqICBQQVJBTUVURVJTOiAgTm9uZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIHRpbWUgZHVyYXRpb24gdmFsdWUNCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZUdldCgpDQorew0KKyAgICByZXR1cm4gb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25PcHRpY2FsTG9zVGltZTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKioNCisgKiogIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGltZSBkdXJhdGlvbiB2YWx1ZSBpbiBkYXRhYmFzZSANCisgKiogICAgICAgICAgICAgICB3aGVuIG5vIEdBVEUgTVBDUERVIGlzIHJlY2VpdmVkDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgbG9zVGltZSAtIHRpbWUgZHVyYXRpb24NCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lU2V0KE1WX1UxNiBsb3NUaW1lKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25NYWNMb3NUaW1lID0gbG9zVGltZTsNCisgICAgDQorICAgIHJldHVybiBNVl9PSzsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lR2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKiANCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRpbWUgZHVyYXRpb24gdG8gYmUgdXNlZCANCisqKiAgICAgICAgICAgICAgIHdoZW4gbm8gR0FURSBNUENQRFUgaXMgcmVjZWl2ZWQNCisqKiAgICAgICAgICAgICAgIA0KKyoqICBQQVJBTUVURVJTOiAgTm9uZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIHRpbWUgZHVyYXRpb24gdmFsdWUNCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvbk1hY0xvc1RpbWU7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoqDQorICoqICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgc3VwcG9ydCBmb3IgZWFybHkgd2FrZXVwIA0KKyAqKiAgICAgICAgICAgICAgIGluIHBvd2VyIHNhdmluZyBtb2RlDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgd2FrZVVwRW5hYmxlIC0gRW5hYmxlIG9yIGRpc2FibGUgdGhlIGVhcmx5IHdha2V1cCBzdXBwb3J0DQorICoqDQorICoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyAqKg0KKyAqKiAgUkVUVVJOUzogICAgIA0KKyAqKiAgICAgICAgICAgICAgICAgICANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgb251RXBvbkRiT251UG93ZXJTYXZpbmdXYWtldXBTZXQoTVZfVTggd2FrZVVwRW5hYmxlKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25Qb3dlclNhdmluZ1dha2V1cCA9IHdha2VVcEVuYWJsZTsNCisNCisgICAgcmV0dXJuIChNVl9PSyk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251UG93ZXJTYXZpbmdXYWtldXBHZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN1cHBvcnQgZm9yIGVhcmx5IHdha2V1cA0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgZW5hYmxlIG9yIGRpc2FibGUNCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cEdldCgpDQorew0KKyAgICByZXR1cm4gb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25Qb3dlclNhdmluZ1dha2V1cDsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKioNCisgKiogIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvblNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgbWF4IHNsZWVwIGR1cmF0aW9uIA0KKyAqKiAgICAgICAgICAgICAgIGluIHBvd2VyIHNhdmluZyBtb2RlDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgbWF4U2xlZXBEdXJhdGlvbiAtIG1heCBzbGVlcCBkdXJhdGlvbg0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvblNldChNVl9VNjQgbWF4U2xlZXBEdXJhdGlvbikNCit7DQorICAgIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uUG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uPSBtYXhTbGVlcER1cmF0aW9uOw0KKw0KKyAgICByZXR1cm4gKE1WX09LKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25HZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heCBzbGVlcCBkdXJhdGlvbiBpbiBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgbWF4IHNsZWVwIGR1cmF0aW9uDQorKiogICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9VMzIgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvbjsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKioNCisgKiogIG9udUVwb25EYk9udVNsZWVwTW9kZVNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBjb250cm9sIG1vZGUgZm9yIHBvd2VyIHNhdmluZw0KKyAqKg0KKyAqKiAgUEFSQU1FVEVSUzogIG1vZGUgLSB0dXJuIG9mZiB0eCBvciB0eC9yeA0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udVNsZWVwTW9kZVNldChNVl9VOCBtb2RlKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25TbGVlcE1vZGUgPSBtb2RlOw0KKw0KKyAgICByZXR1cm4gTVZfT0s7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251U2xlZXBNb2RlR2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKiANCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzbGVlcCBtb2RlIGZvciBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgc2xlZXAgbW9kZQ0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorRV9FcG9uU2xlZXBDdHJsTW9kZSBvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQoKQ0KK3sNCisgICAgcmV0dXJuIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uU2xlZXBNb2RlOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251U2xlZXBEdXJhdGlvblNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGVyaW9kaWNhbCBzbGVlcCBkdXJhdGlvbiANCisgKiogICAgICAgICAgICAgICBmb3IgcG93ZXIgc2F2aW5nDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgc2xlZXBEdXJhdGlvbiAtIHBlcmlvZGljYWwgc2xlZXAgZHVyYXRpb24NCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uU2V0KE1WX1UzMiBzbGVlcER1cmF0aW9uKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uID0gc2xlZXBEdXJhdGlvbjsNCisNCisgICAgcmV0dXJuIE1WX09LOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBlcmlvZGljYWwgc2xlZXAgZHVyYXRpb24gZm9yIHBvd2VyIHNhdmluZw0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgbWF4IHNsZWVwIGR1cmF0aW9uDQorKiogICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9VMzIgb251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpDQorew0KKyAgICByZXR1cm4gb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25TZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBlcmlvZGljYWwgd2FrZXVwIGR1cmF0aW9uIA0KKyAqKiAgICAgICAgICAgICAgIGZvciBwb3dlciBzYXZpbmcNCisgKioNCisgKiogIFBBUkFNRVRFUlM6ICB3YWtldXBEdXJhdGlvbiAtIHBlcmlvZGljYWwgd2FrZXVwIGR1cmF0aW9uDQorICoqDQorICoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyAqKg0KKyAqKiAgUkVUVVJOUzogICAgIA0KKyAqKiAgICAgICAgICAgICAgICAgICANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25TZXQoTVZfVTMyIHdha2V1cER1cmF0aW9uKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25XYWtldXBEdXJhdGlvbiA9IHdha2V1cER1cmF0aW9uOw0KKw0KKyAgICByZXR1cm4gTVZfT0s7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBlcmlvZGljYWwgd2FrZXVwIGR1cmF0aW9uIGZvciBwb3dlciBzYXZpbmcNCisqKiAgICAgICAgICAgICAgIA0KKyoqICBQQVJBTUVURVJTOiAgTm9uZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIG1heCBzbGVlcCBkdXJhdGlvbg0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfVTMyIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvbldha2V1cER1cmF0aW9uOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgcG93ZXIgc2F2aW5nIHN0YXR1cw0KKyAqKg0KKyAqKiAgUEFSQU1FVEVSUzogIHN0YXR1cyAtIG5vIHBvd2VyIHNhdmluZy9zbGVlcC93YWtldXANCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChNVl9VMzIgc3RhdHVzKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25Qb3dlclNhdmluZ1N0YXR1cyA9IHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c0dldA0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKiogDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcG93ZXIgc2F2aW5nIHN0YXR1cw0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgcG93ZXIgc2F2aW5nIHN0YXR1cw0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfVTMyIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblBvd2VyU2F2aW5nU3RhdHVzOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICoqDQogKiogIG9udUVwb25EYk9udVNpbGVuY2VTdGF0ZVNldA0KICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5oCmluZGV4IGRmMjAwM2UuLmIyZjI4NWQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251RGIuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmgKQEAgLTgzLDYgKzgzLDcgQEAKIA0KIC8qIEluY2x1ZGUgRmlsZXMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyNpbmNsdWRlICJlcG9uT251TG54S3NNSS5oIg0KICANCiAvKiBEZWZpbml0aW9ucw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIA0KQEAgLTMzMCw2ICszMzEsMjAgQEAKICAgTVZfVTMyIHNoYWRvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiB9U19PbnVFcG9uRGJhU2hhZG93UmVnTWFwOw0KIA0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRV9FUE9OX1NMRUVQX01PREVfQ1RSTF9OT1RISU5HID0gMCwNCisgICAgRV9FUE9OX1NMRUVQX01PREVfQ1RSTF9UWCAgICAgID0gMSwNCisgICAgRV9FUE9OX1NMRUVQX01PREVfQ1RSTF9UWF9SWCAgID0gMiwgDQorfSBFX0Vwb25TbGVlcEN0cmxNb2RlOw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRV9FUE9OX05PVF9QT1dFUl9TQVZJTkdfU1RBVFVTICAgID0gMCwgDQorICAgIEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTICA9IDEsIA0KKyAgICBFX0VQT05fUE9XRVJfU0FWSU5HX1dBS0VVUF9TVEFUVVMgPSAyLCANCit9IEVfRXBvblBvd2VyU2F2aW5nU3RhdHVzOw0KKw0KIHR5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICBNVl9VMzIgICAgICAgICAgIG9udUVwb25WYWxpZFtFUE9OX01BWF9NQUNfTlVNXTsgICAgICAvKiBPTlUgVmFsaWQgZm9yIHN5bmMgKi8gIA0KQEAgLTM1OCw3ICszNzMsMTYgQEAKICAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uT3ZlckhlYWQ7ICAgICAgICAgICAgIA0KICAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uUGh5T3V0cHV0OyAgICAgICAgICAgICANCiAgIE1WX1UzMiAgICAgICAgICAgb251RXBvblh2ckJ1cnN0RW5Qb2xhcml0eTsNCi19U19PbnVFcG9uR2VuVGJsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIE1WX1UzMiAgICAgICAgICAgb251RXBvbk9wdGljYWxMb3NUaW1lOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uTWFjTG9zVGltZTsNCisgIE1WX1UzMiAgICAgICAgICAgb251RXBvblBvd2VyU2F2aW5nV2FrZXVwOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uUG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uU2xlZXBBY3Rpb247DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25TbGVlcE1vZGU7DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25TbGVlcER1cmF0aW9uOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uV2FrZXVwRHVyYXRpb247DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25Qb3dlclNhdmluZ1N0YXR1czsNCit9U19PbnVFcG9uR2VuVGJsOw0KIA0KIC8qIE9OVSBFUE9OIERhdGEgUGF0aCB0YWJsZXMgKi8NCiB0eXBlZGVmIHN0cnVjdA0KQEAgLTQ2NCw2ICs0ODgsMjQgQEAKIE1WX1UzMiAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVHZXQodm9pZCk7DQogTVZfU1RBVFVTIG9udUVwb25EYk9udUhvbGRvdmVyRXhlY1NldChNVl9VMzIgc3RhdGUpOw0KIE1WX1UzMiAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlckV4ZWNHZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lU2V0KE1WX1UxNiBsb3NUaW1lKTsNCitNVl9VMzIgICAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVHZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQoTVZfVTE2IGxvc1RpbWUpOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldChNVl9VOCB3YWtlVXBFbmFibGUpOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cEdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uU2V0KE1WX1U2NCBtYXhTbGVlcER1cmF0aW9uKTsNCitNVl9VMzIgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcEFjdGlvblNldChNVl9VOCBhY3Rpb24pOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVTbGVlcEFjdGlvbkdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251U2xlZXBNb2RlU2V0KE1WX1U4IG1vZGUpOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25TZXQoTVZfVTMyIHNsZWVwRHVyYXRpb24pOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvblNldChNVl9VMzIgd2FrZXVwRHVyYXRpb24pOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvbkdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQoTVZfVTMyIHN0YXR1cyk7DQorTVZfVTMyICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0KHZvaWQpOw0KIE1WX1NUQVRVUyBvbnVFcG9uRGJPbnVTaWxlbmNlU3RhdGVTZXQoTVZfVTMyIHN0YXRlKTsNCiBNVl9VMzIgICAgb251RXBvbkRiT251U2lsZW5jZVN0YXRlR2V0KHZvaWQpOw0KIE1WX1NUQVRVUyBvbnVFcG9uRGJPbnVTd1JwcnRUaW1lclR5cGVTZXQoTVZfVTMyIHRpbWVyVHlwZSk7DQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVJc3IuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251SXNyLmMKaW5kZXggMTU3Nzk0MC4uZWU2MDNmYyAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVJc3IuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUlzci5jCkBAIC0xMDk2LDg0ICsxMDk2LDg3IEBACiAJCXJldHVybihNVl9FUlJPUik7CiAJICB9CiAJfQotCS8qIEtXMiBBU0lDIFJldiBaMiAqLwotCS8qID09PT09PT09PT09PT09PSAqLwotCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikKLQl7Ci0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIG91dHB1dCBzdGF0dXMqLwotCSAgUE9OX0dQSU9fR0VUKEJPQVJEX0dQUF9QT05fWFZSX1RYLCBncGlvR3JvdXAsIGdwaW9NYXNrKTsKLQkgIGlmIChncGlvTWFzayAhPSBQT05fR1BJT19OT1RfVVNFRCkKLQkgIHsKLQkgIAlzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgfmdwaW9NYXNrLypvdXRwdXQqLyk7Ci0JICAJaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIAl7Ci0JICAJICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JICAJCQkgICAiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgIAkgIHJldHVybihNVl9FUlJPUik7Ci0JICAJfQorICAgZWxzZQorICAgeworCSAgIC8qIEtXMiBBU0lDIFJldiBaMiAqLworCSAgIC8qID09PT09PT09PT09PT09PSAqLworCSAgIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfWjIpCisJICAgeworCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIG91dHB1dCBzdGF0dXMqLworCQlQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOworCQlpZiAoZ3Bpb01hc2sgIT0gUE9OX0dQSU9fTk9UX1VTRUQpCisJCXsKKwkJICAgICBzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgfmdwaW9NYXNrLypvdXRwdXQqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSJFUlJPUjogKCVzOiVkKSBtdkdwcFR5cGVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJICAgICB9CiAKLQkgIAlzdGF0dXMgPSBtdkdwcFZhbHVlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIGdwaW9NYXNrIC8qZW5hYmxlKi8pOwotCSAgCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JICAJewotCSAgCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkJICAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAJICByZXR1cm4oTVZfRVJST1IpOwotCSAgCX0KLQkgIH0KKwkJICAgICBzdGF0dXMgPSBtdkdwcFZhbHVlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIGdwaW9NYXNrIC8qZW5hYmxlKi8pOworCQkgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisJCSAgICAgeworCQkgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJICAgICAgIHJldHVybihNVl9FUlJPUik7CisJCSAgICAgfQorCQl9CiAKLQkgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX0lOUFVULCAwKTsKLQkgIGlmIChzdGF0dXMgIT0gTVZfT0spCi0JICB7Ci0JICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgICByZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCX0KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfSU5QVVQsIDApOworCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQl7CisJCSBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgcmV0dXJuKE1WX0VSUk9SKTsKKwkJfQorCSAgIH0KIAotCS8qIEtXMiBBU0lDIFJldiBBMCAqLwotCS8qID09PT09PT09PT09PT09PSAqLwotCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkKLQl7Ci0gICAgICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgICByZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSAqLwotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDEsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIHsKLQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCSAgIC8qIEtXMiBBU0lDIFJldiBBMCAqLworCSAgIC8qID09PT09PT09PT09PT09PSAqLworCSAgIGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkKKwkgICB7CisJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX09VVFBVVCwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCiAJCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCQlyZXR1cm4oTVZfRVJST1IpOwotCSAgfQorCQkgIHJldHVybihNVl9FUlJPUik7CisJCX0KIAotICAgICAgcG9sYXJpdHkgPSBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQoKTsKKwkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDEsIDApOworCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQl7CisJCSAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkgICAgICJFUlJPUjogKCVzOiVkKSBhc2ljT250TWlzY1JlZ1dyaXRlXG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJfQogCi0JICAvKiBYVlIgcG9sYXJpdHkgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgdHJhbnNtaXQgMSB0byB0aGUgbGluZSAgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQlwb2xhcml0eSA9IG9udVAyUERiWHZyQnVyc3RFbmFibGVQb2xhcml0eUdldCgpOwogCi0JICAvKiBQMlAgbW9kZSAqLwotCSAgLyogRm9yY2UgVmFsdWUgPT0gMCwgdHJhbnNtaXQgMCB0byB0aGUgbGluZSAgKi8KLQkgIC8qIEZvcmNlIFZhbHVlID09IDEsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCisJCS8qIFhWUiBwb2xhcml0eSAqLworCQkvKiBYVlIgcG9sYXJpdHkgPT0gMCwgQWN0aXZlIEhpZ2gsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCisJCS8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLwogCi0JICAvKiBTZXR0aW5nIFAyUCBzaG91bGQgYmUgcmV2ZXJzZWQgZnJvbSBYVlIgcG9sYXJpdHkgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgd3JpdGUgMSBmb3IgRm9yY2UgVmFsdWUgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB3cml0ZSAwIGZvciBGb3JjZSBWYWx1ZSAqLworCQkvKiBQMlAgbW9kZSAqLworCQkvKiBGb3JjZSBWYWx1ZSA9PSAwLCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQkvKiBGb3JjZSBWYWx1ZSA9PSAxLCB0cmFuc21pdCAxIHRvIHRoZSBsaW5lICAqLwogCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSB2YWx1ZSAtIGFjY29yZGluZyB0byBwb2xhcml0eSAqLwotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fVkFMLCBwb2xhcml0eSwgMCk7Ci0JICBpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgewotCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCQlyZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCX0KKwkJLyogU2V0dGluZyBQMlAgc2hvdWxkIGJlIHJldmVyc2VkIGZyb20gWFZSIHBvbGFyaXR5ICovCisJCS8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgd3JpdGUgMSBmb3IgRm9yY2UgVmFsdWUgKi8KKwkJLyogWFZSIHBvbGFyaXR5ID09IDEsIEFjdGl2ZSBMb3csIHdyaXRlIDAgZm9yIEZvcmNlIFZhbHVlICovCisKKwkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgdmFsdWUgLSBhY2NvcmRpbmcgdG8gcG9sYXJpdHkgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fVkFMLCBwb2xhcml0eSwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICByZXR1cm4oTVZfRVJST1IpOworCQl9CisJICAgfQorICAgfQogCiAJLyogUmVhZCBjdXJyZW50IEZFQyBjb25maWd1cmF0aW9uICovCiAgICAgc3RhdHVzID0gbXZPbnVFcG9uTWFjUnhwRW5jQ29uZmlnR2V0KCZpc3JQMnBQcmV2aW91c0ZlY1N0YXRlKTsKQEAgLTEzMjQsNjkgKzEzMjcsNzMgQEAKIAkJIHJldHVybihNVl9FUlJPUik7CiAJICAgfQogICAgfQotCS8qIEtXMiBBU0lDIFJldiBaMiAqLwotCS8qID09PT09PT09PT09PT09PSAqLwotCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikKLQl7Ci0JICBQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOwotCSAgaWYgKGdwaW9NYXNrICE9IFBPTl9HUElPX05PVF9VU0VEKQotCSAgewotCSAgCXN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB+Z3Bpb01hc2svKm91dHB1dCovKTsKLQkgIAlpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgCXsKLQkgIAkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAJICByZXR1cm4oTVZfRVJST1IpOwotCSAgCX0KKyAgIGVsc2UKKyAgIHsKKwkgICAvKiBLVzIgQVNJQyBSZXYgWjIgKi8KKwkgICAvKiA9PT09PT09PT09PT09PT0gKi8KKwkgICBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX1oyKQorCSAgIHsKKwkJUE9OX0dQSU9fR0VUKEJPQVJEX0dQUF9QT05fWFZSX1RYLCBncGlvR3JvdXAsIGdwaW9NYXNrKTsKKwkJaWYgKGdwaW9NYXNrICE9IFBPTl9HUElPX05PVF9VU0VEKQorCQl7CisJCSAgICAgc3RhdHVzID0gbXZHcHBUeXBlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIH5ncGlvTWFzay8qb3V0cHV0Ki8pOworCQkgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisJCSAgICAgeworCQkgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICJFUlJPUjogKCVzOiVkKSBtdkdwcFR5cGVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJICAgICB9CiAKLQkgIAlzdGF0dXMgPSBtdkdwcFZhbHVlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIH5ncGlvTWFzay8qZGlzYWJsZSovKTsKLQkgIAlpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgCXsKLQkgIAkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVmFsdWVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgCSAgcmV0dXJuKE1WX0VSUk9SKTsKLQkgIAl9CisJCSAgICAgc3RhdHVzID0gbXZHcHBWYWx1ZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB+Z3Bpb01hc2svKmRpc2FibGUqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVmFsdWVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJICAgICB9CiAKLQkgIAlzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgZ3Bpb01hc2svKmlucHV0Ki8pOwotCSAgCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JICAJewotCSAgCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkJICAgICAiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgIAkgIHJldHVybihNVl9FUlJPUik7Ci0JICAJfQotCSAgfQorCQkgICAgIHN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCBncGlvTWFzay8qaW5wdXQqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOworCQkgICAgIH0KKwkJfQogCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIG91dHB1dCBzdGF0dXMgc2V0ICovCi0JICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLSAgICAgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgICByZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCX0KLQkvKiBLVzIgQVNJQyBSZXYgQTAgKi8KLQkvKiA9PT09PT09PT09PT09PT0gKi8KLQllbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApCi0JewotCSAgLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBvdXRwdXQgc3RhdHVzIHNldCAqLwotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKLQkgIGlmIChzdGF0dXMgIT0gTVZfT0spCi0JICB7Ci0JICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJICAgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAgIHJldHVybihNVl9FUlJPUik7Ci0JICB9CisJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyBzZXQgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkJIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAgICJFUlJPUjogKCVzOiVkKSBhc2ljT250TWlzY1JlZ1dyaXRlXG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJCSByZXR1cm4oTVZfRVJST1IpOworCQl9CisJICAgfQogCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGRpc2FibGUgKi8KLQkgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfRk9SQ0VfQkVOX0lPX0VOLCAwLCAwKTsKLQkgIGlmIChzdGF0dXMgIT0gTVZfT0spCi0JICB7Ci0JCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCSAgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybihNVl9FUlJPUik7Ci0JICB9Ci0JfQorCSAgIC8qIEtXMiBBU0lDIFJldiBBMCAqLworCSAgIC8qID09PT09PT09PT09PT09PSAqLworCSAgIGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkKKwkgICB7CisJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyBzZXQgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJfQorCisJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZGlzYWJsZSAqLworCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMCwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICByZXR1cm4oTVZfRVJST1IpOworCQl9CisJICAgfQorICAgfQogCiAJCWlmIChvbnVFcG9uRGJQMlBGb3JjZU1vZGVHZXQoKSkKIAkJewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5jCmluZGV4IDIyYzM0ZDguLjU0NDJmYWMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251QWxsb2MuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmMKQEAgLTE2MiwxMCArMTYyLDEwIEBACiAqKgogKiogIE9VVFBVVFM6ICAgICBNVl9VMzIgKmVudHJ5CiAqKgotKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBNVl9FUlJPUgorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZBTFNFCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICplbnRyeSwgTVZfVTMyICp0Y29udCkKK01WX0JPT0wgb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiAqZW50cnksIE1WX1UzMiAqdGNvbnQpCiB7CiAJTVZfVTMyICBpRW50cnk7CiAJTVZfVTMyICBtYWNBbGxvY0lkOwpAQCAtMTc4LDUwICsxNzgsMTUgQEAKIAkJaWYgKChzdGF0dXMgPT0gTVZfT0spICYmIChtYWNBbGxvY0lkID09IGFsbG9jSWQpICYmICh2YWxpZCA9PSBNVl9UUlVFKSkgewogCQkJKmVudHJ5ID0gaUVudHJ5OwogCQkJKnRjb250ID0gdGNvbnROdW07Ci0JCQlyZXR1cm4gKE1WX09LKTsKKwkJCXJldHVybiAoTVZfVFJVRSk7CiAJCX0KIAl9CiAKLQlyZXR1cm4gKE1WX0VSUk9SKTsKKwlyZXR1cm4gKE1WX0ZBTFNFKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCi0qKiAgb251R3BvbkFsbG9jSWRNYWNBbGxvY0NoZWNrCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBCVyBNYXAgZW50cnkgaXMgdmFsaWQgYW5kIHJldHVybiBULUNvbnQKLSoqICAgICAgICAgICAgICAgYW5kIEFsbG9jIE51bWJlcgotKioKLSoqICBQQVJBTUVURVJTOiAgbm9uZQotKioKLSoqICBPVVRQVVRTOiAgICAgTVZfVTMyICphbGxvY0lkCi0qKiAgICAgIAkgTVZfVTMyICp0Y29udAotKioKLSoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgTVZfRVJST1IKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjQWxsb2NDaGVjayhNVl9VMzIgaW5kZXgsIE1WX1UzMiAqYWxsb2NJZCwgTVZfVTMyICp0Y29udCkKLXsKLQlNVl9VMzIgIG1hY0FsbG9jSWQ7Ci0JTVZfVTMyICB0Y29udE51bTsKLQlNVl9CT09MIHZhbGlkOwotCU1WX1NUQVRVUyBzdGF0dXM7Ci0KLSAgICAgICBzdGF0dXMgPSBtdk9udUdwb25NYWNSeEJ3TWFwR2V0KGluZGV4LCAmbWFjQWxsb2NJZCwgJnZhbGlkLCAmdGNvbnROdW0pOwotICAgICAgIGlmICgoc3RhdHVzID09IE1WX09LKSAmJiAodmFsaWQgPT0gTVZfVFJVRSkpCi0gICAgICAgewotCSAgICAgICAqYWxsb2NJZCA9IG1hY0FsbG9jSWQ7Ci0JICAgICAgICp0Y29udCAgID0gdGNvbnROdW07Ci0JICAgICAgIHJldHVybiAoTVZfT0spOwotICAgICAgIH0KLQotICAgICAgIHJldHVybiAoTVZfRVJST1IpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgogKiogIG9udUdwb25BbGxvY0lkTWFjQWxsb2NGcmVlRW50cnlHZXQKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqKgpAQCAtMjMxLDEwICsxOTYsMTAgQEAKICoqCiAqKiAgT1VUUFVUUzogICAgIE1WX1UzMiAqZW50cnkKICoqCi0qKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIE1WX0VSUk9SCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkFMU0UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjQWxsb2NGcmVlRW50cnlHZXQoTVZfVTMyICplbnRyeSkKK01WX0JPT0wgb251R3BvbkFsbG9jSWRNYWNBbGxvY0ZyZWVFbnRyeUdldChNVl9VMzIgKmVudHJ5KQogewogCU1WX1UzMiAgaUVudHJ5OwogCU1WX1UzMiAgbWFjQWxsb2NJZDsKQEAgLTI0NiwxMSArMjExLDExIEBACiAJCXN0YXR1cyA9IG12T251R3Bvbk1hY1J4QndNYXBHZXQoaUVudHJ5LCAmbWFjQWxsb2NJZCwgJnZhbGlkLCAmdGNvbnROdW0pOwogCQlpZiAoKHN0YXR1cyA9PSBNVl9PSykgJiYgKHZhbGlkID09IE1WX0ZBTFNFKSkgewogCQkJKmVudHJ5ID0gaUVudHJ5OwotCQkJcmV0dXJuIChNVl9PSyk7CisJCQlyZXR1cm4gKE1WX1RSVUUpOwogCQl9CiAJfQogCi0JcmV0dXJuIChNVl9FUlJPUik7CisJcmV0dXJuIChNVl9GQUxTRSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNzIsOSArMjM3LDEwIEBACiB7CiAJTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOwogCU1WX1UzMiAgICBlbnRyeTsKKwlNVl9CT09MICAgZXhpc3Q7CiAKLQlzdGF0dXMgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRnJlZUVudHJ5R2V0KCZlbnRyeSk7Ci0JaWYgKHN0YXR1cyAhPSBNVl9PSykKKwlleGlzdCA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NGcmVlRW50cnlHZXQoJmVudHJ5KTsKKwlpZiAoZXhpc3QgPT0gTVZfRkFMU0UpCiAJCXJldHVybiAoTVZfRVJST1IpOwogCiAJc3RhdHVzID0gbXZPbnVHcG9uTWFjUnhCd01hcFNldChlbnRyeSwgYWxsb2NJZCwgdGNvbnRJZCwgTVZfVFJVRSk7CkBAIC0zMDcsNiArMjczLDcgQEAKIE1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZE1hY0Nvbm5lY3QoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiB0Y29udE51bSkKIHsKIAlNVl9TVEFUVVMgc3RhdHVzOworCU1WX0JPT0wgICBleGlzdDsKIAlNVl9VMzIgICAgZW50cnk7CiAJTVZfVTMyICAgIHRjb250OwogCU1WX1UzMiAgICBuZXdJZGxlVGNvbnRFbnRyeTsKQEAgLTMyMSw4ICsyODgsOCBAQAogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAogCS8qIHZhbGlkYXRlIHRoYXQgcmVxdWVzdGVkIGFsbG9jLUlkIGlzIGNvbmZpZ3VyZWQgaW4gSFcgYW5kIGlzIHZhbGlkICovCi0Jc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOwotCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKKwlleGlzdCA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKGFsbG9jSWQsICZlbnRyeSwgJnRjb250KTsKKwlpZiAoZXhpc3QgIT0gTVZfVFJVRSkgewogCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FMTE9DX01PRFVMRSwKIAkJCQkJIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjQ29ubmVjdCwgYWxsb2MgSWQoJWQpIGVudHJ5KCVkKVxuIiwKIAkJCQkJX19GSUxFX0RFU0NfXywgX19MSU5FX18sIGFsbG9jSWQsIGVudHJ5KTsKQEAgLTMzNCw4ICszMDEsOCBAQAogCQkqKiBzaG91bGQgYmUgY2hhbmdlZCB0byBhbm90aGVyIElkbGUgVC1Db250ICovCiAKIAkJLyogQ2hlY2sgZm9yIGEgZnJlZSAoaWRsZSkgZW50cnkgaW4gdGhlIFRjb250IERCIHRhYmxlICovCi0JCXN0YXR1cyA9IG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KGFsbG9jSWQsICZmcmVlVGNvbnRFbnRyeSk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKKwkJZXhpc3QgPSBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChhbGxvY0lkLCAmZnJlZVRjb250RW50cnkpOworCQlpZiAoZXhpc3QgIT0gTVZfVFJVRSkgewogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKIAkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAogCQkJCQkJIkRFQlVHOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjQ29ubmVjdCwgYWxsb2MgSWQoJWQpIGZyZWVUY29udEVudHJ5KCVkKVxuIiwKQEAgLTM1MSw4ICszMTgsOCBAQAogCQkJCW9udUdwb25EYkJ3SWRsZUFsbG9jR2V0KG5ld0lkbGVUY29udEVudHJ5LCAmZW50cnlBbGxvY0lkKTsKIAkJCQlpZiAoZW50cnlBbGxvY0lkICE9IFBPTl9PTlVfQUxMT0NfTk9UX0VYSVNUKSB7CiAJCQkJCS8qIENoZWNrIGlmIHRoaXMgaWRsZSBBbGxvYyBJRCBleGlzdHMgaW4gdGhlIEhXIHRhYmxlICovCi0JCQkJCXN0YXR1cyA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKGVudHJ5QWxsb2NJZCwgJmJ3TWFwRW50cnksICZ0Y29udCk7Ci0JCQkJCWlmIChzdGF0dXMgPT0gTVZfT0spIHsKKwkJCQkJZXhpc3QgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhlbnRyeUFsbG9jSWQsICZid01hcEVudHJ5LCAmdGNvbnQpOworCQkJCQlpZiAoZXhpc3QgPT0gTVZfVFJVRSkgewogCQkJCQkJLyogcmUtYXNzaWduIHRoaXMgQWxsb2MgSUQgdG8gdGhlIG5ldyBpZGxlIFRjb250IGluIEhXICovCiAJCQkJCQlzdGF0dXMgPSBtdk9udUdwb25NYWNSeEJ3TWFwU2V0KGJ3TWFwRW50cnksIGVudHJ5QWxsb2NJZCwgb251SWRsZUFsbG9jVGNvbnQsIE1WX1RSVUUpOwogCQkJCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgewpAQCAtMzc4LDExICszNDUsMTkgQEAKIAogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKIAltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwKLQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgYWN0aXZlLCBDb25uZWN0XG4iLAotCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnROdW0pOworICAgICAgICAgICAgICAiREVCVUc6ICglczolZCkgQWxsb2NJZE1hY0Nvbm5lY3QsIHRwbV9hY3RpdmVfdGNvbnQsIFRjb250KCVkKVxuIiwKKyAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250TnVtKTsKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKLQlvbnVHcG9uV3FUY29udEFjdGl2YXRlKHRjb250TnVtKTsKKwlwcmludGsoIlRDT05UICglZCkgYWN0aXZlLCBDb25uZWN0XG4iLCB0Y29udE51bSk7CisJc3RhdHVzID0gb251R3BvbldxVGNvbnRBY3RpdmF0ZSh0Y29udE51bSk7CisJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwl7CisJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAorCQkJICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjQWRkLCBmYWlsZWQgdG8gc2NoZWR1bGUgVC1Db250KCVkKSBhY3RpdmF0ZSBpbiBXUVxuIiwKKwkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udE51bSk7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CkBAIC00MDQsNiArMzc5LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgb251R3BvbkFsbG9jSWRNYWNSZWNvbm5lY3QoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiB0Y29udE51bSkKIHsKKwlNVl9CT09MICAgZXhpc3Q7CiAJTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOwogCU1WX1UzMiAgICBlbnRyeTsKIAlNVl9VMzIgICAgb251SWQ7CkBAIC00MTcsMTIgKzM5MywxMiBAQAogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAogCS8qIEdldCBmcmVlIGVudHJ5ICovCi0Jc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOwotCWlmIChzdGF0dXMgPT0gTVZfT0spCi0JCXJldHVybihzdGF0dXMpOworCWV4aXN0ID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOworCWlmIChleGlzdCAhPSBNVl9UUlVFKQorCQlyZXR1cm4gKE1WX0VSUk9SKTsKIAotCXN0YXR1cyA9IG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KGFsbG9jSWQsICZ0Y29udEZyZWVOdW0pOwotCWlmIChzdGF0dXMgIT0gTVZfT0spCisJZXhpc3QgPSBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChhbGxvY0lkLCAmdGNvbnRGcmVlTnVtKTsKKwlpZiAoZXhpc3QgIT0gTVZfVFJVRSkKIAkJb251SWRsZUFsbG9jVGNvbnQgPSB0Y29udEZyZWVOdW07CiAKIAkvKiBDaGVjayBpZiBkZWZhdWx0IEFsbG9jIElkICovCkBAIC00MzUsNiArNDExLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250TnVtKTsKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKKwkgICAgICAgLy8gcHJpbnRrKCJUQ09OVCAoJWQpIGZsdXNoLCBSZWNvbm5lY3RcbiIsIHRjb250TnVtKTsKKwkgICAgICAgLy8gc3RhdHVzID0gb251R3BvbldxVGNvbnRGbHVzaCh0Y29udE51bSk7CisJICAgICAgIC8vIGlmIChzdGF0dXMgIT0gTVZfT0spCisJICAgICAgIC8veworCSAgICAgICAvLyAJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BTExPQ19NT0RVTEUsCisJICAgICAgIC8vIAkJICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjUmVjb25uZWN0LCBmYWlsZWQgdG8gc2NoZWR1bGUgVC1Db250KCVkKSBmbHVzaCBpbiBXUVxuIiwKKwkgICAgICAgLy8gCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnROdW0pOworCSAgICAgICAvL30KKwogCQkvKiBTZXQgQWxsb2MgSWQgdG8gVC1Db250IGluIHRoZSBHTUFDIGhhcmR3YXJlICovCiAJCXN0YXR1cyA9IG12T251R3Bvbk1hY1J4QndNYXBTZXQoZW50cnksIGFsbG9jSWQsIG9udUlkbGVBbGxvY1Rjb250LCBNVl9UUlVFKTsKIAl9CkBAIC00NDIsNTEgKzQyNyw2IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG9udUdwb25BbGxvY0lkTWFjUmVBY3RpdmF0ZQotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZWFjdGl2YXRlIG9udSB0Y29udCBpbmNhc2UgdGhlIHRjb250IGlzIG5vdAotKiogICAgICAgICAgICAgICBjbGVhciBhbmQgc2V0IGJ5IG1uZwotKioKLSoqICBQQVJBTUVURVJTOiAgTm9uZQotKioKLSoqICBPVVRQVVRTOiAgICAgTm9uZQotKioKLSoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjUmVBY3RpdmF0ZSh2b2lkKQotewotCU1WX1NUQVRVUyBzdGF0dXM7Ci0JTVZfVTMyICAgIGVudHJ5OwotCU1WX1UzMgkgIGFsbG9jSWQ7Ci0JTVZfVTMyICAgIHRjb250OwotCi0jaWZkZWYgTVZfR1BPTl9ERUJVR19QUklOVAotCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAotICAgICAgICAgICAgICAiREVCVUc6ICglczolZCkgb251R3BvbkFsbG9jSWRNYWNSZUFjdGl2YXRlXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0jZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwotCi0JZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgT05VX0dQT05fTUFYX05VTV9PRl9UX0NPTlRTOyBlbnRyeSsrKQotCXsKLQkJc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0NoZWNrKGVudHJ5LCAmYWxsb2NJZCwgJnRjb250KTsKLQkJaWYgKHN0YXR1cyA9PSBNVl9PSykKLQkJewotCQkJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCi0JCQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgYWN0aXZlLCBDb25uZWN0XG4iLAotCQkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7Ci0KLQkJCW9udUdwb25XcVRjb250QWN0aXZhdGUodGNvbnQpOwotCQl9Ci0JfQotCi0KLQlyZXR1cm4gKE1WX09LKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiAgb251R3BvbkFsbG9jSWRNYWNEaXNjb25uZWN0CkBAIC01MDYsNiArNDQ2LDcgQEAKIAlNVl9VMzIgIG9udUlkOwogCU1WX1UzMiAgZW50cnk7CiAJTVZfVTMyICB0Y29udDsKKwlNVl9CT09MIGV4aXN0OwogCU1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsKIAogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKQEAgLTUxNSwyMSArNDU2LDI4IEBACiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCiAJLyogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdCAqLwotCXN0YXR1cyA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKGFsbG9jSWQsICZlbnRyeSwgJnRjb250KTsKLQlpZiAoc3RhdHVzICE9IE1WX09LKQotCQlyZXR1cm4oTVZfRVJST1IpOworCWV4aXN0ID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOworCWlmIChleGlzdCA9PSBNVl9GQUxTRSkKKwkJcmV0dXJuIChNVl9FUlJPUik7CiAKIAkvKiBDaGVjayBpZiBkZWZhdWx0IEFsbG9jIElkICovCiAJb251SWQgPSBvbnVHcG9uRGJPbnVJZEdldCgpOwogCWlmIChhbGxvY0lkICE9IG9udUlkKQogCXsKICNpZmRlZiBNVl9HUE9OX0RFQlVHX1BSSU5UCi0JCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAotCQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgZmx1c2gsIERpc2Nvbm5lY3RcbiIsCi0JCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnQpOworCSAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAgIkRFQlVHOiAoJXM6JWQpIHRwbV9kZWFjdGl2ZV90Y29udCwgVGNvbnQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7CiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCi0JCW9udUdwb25XcVRjb250Rmx1c2godGNvbnQpOworCQlwcmludGsoIlRDT05UICglZCkgZmx1c2gsIERpc2Nvbm5lY3RcbiIsIHRjb250KTsKKwkJc3RhdHVzID0gb251R3BvbldxVGNvbnRGbHVzaCh0Y29udCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAorCQkJCSAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZE1hY0Rpc2Nvbm5lY3QsIGZhaWxlZCB0byBzY2hlZHVsZSBULUNvbnQoJWQpIGZsdXNoIGluIFdRXG4iLAorCQkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7CisJCX0KIAogCQlzdGF0dXMgPSBtdk9udUdwb25NYWNSeEJ3TWFwU2V0KGVudHJ5LCAwLCAwLCBNVl9GQUxTRSk7CiAJCWlmIChzdGF0dXMgIT0gTVZfT0spCkBAIC02MTIsNyArNTYwLDcgQEAKIAkvKiBjaGVjayBpZiBBbGxvYy1JZCBleGlzdCBpbiB0aGUgYWxsb2MgSWQgREIgdGFibGUgKi8KIAlhbGxvY0lkRXhpc3QgPSBvbnVHcG9uRGJCd0FsbG9jRXhpc3QoYWxsb2NJZCk7CiAJaWYgKGFsbG9jSWRFeGlzdCA9PSBNVl9UUlVFKQotCQlyZXR1cm4gKE1WX05PX0NIQU5HRS8qTVZfT0sqLyk7CisJCXJldHVybiAoTVZfT0spOwogCiAJLyogc2V0IHRoZSBBbGxvYy1JZCBleGlzdCB0byB0aGUgZGF0YWJhc2UgKi8KIAlzdGF0dXMgPSBvbnVHcG9uRGJCd0FsbG9jSW5zZXJ0KGFsbG9jSWQsICZlbnRyeSk7CkBAIC03NjYsMTUgKzcxNCwyMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZEZyZWVBbGxCdWZmZXJzKHZvaWQpCiB7Ci0gICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOworICAgIE1WX1NUQVRVUyBzdGF0dXM7CiAgICAgTVZfVTMyICAgIHRjb250TnVtID0gMHhGRjsKLQogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwKLQkgICAgICAgIkRFQlVHOiAoJXM6JWQpIEZyZWVBbGxCdWZmZXJzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAiREVCVUc6ICglczolZCkgcmVsZWFzZSBBbGwgVC1Db250cyBidWZmZXJzLCB0cG1fZGVhY3RpdmVfdGNvbnRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKLSAgICBvbnVHcG9uV3FUY29udEZsdXNoKHRjb250TnVtKTsKKyAgICBwcmludGsoIlRDT05UIGZsdXNoLCBGcmVlQWxsQnVmZmVyc1xuIik7CisgICAgc3RhdHVzID0gb251R3BvbldxVGNvbnRGbHVzaCh0Y29udE51bSk7CisgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKyAgICB7CisgICAgICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FMTE9DX01PRFVMRSwKKyAgICAgICAgCSAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRGcmVlQWxsQnVmZmVycywgZmFpbGVkIHRvIHNjaGVkdWxlIEFsbCBULUNvbnQgZmx1c2ggaW4gV1FcbiIsCisgICAgICAgIAkgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250TnVtKTsKKyAgICB9CiAKICAgICByZXR1cm4oc3RhdHVzKTsKIH0KQEAgLTEwMDcsMTQgKzk2MSwxNCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZFRjb250Q2xlYXJBbGwodm9pZCkKIHsKLQlNVl9VMzIgICAgaUVudHJ5OwotCU1WX0JPT0wgICBleGlzdDsKLQlNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CisJTVZfVTMyICBpRW50cnk7CisJTVZfQk9PTCBleGlzdDsKKwlNVl9TVEFUVVMgc3RhdHVzOwogCU1WX1UzMiAgICB0Y29udE51bSA9IDB4RkY7CiAKICNpZmRlZiBNVl9HUE9OX0RFQlVHX1BSSU5UCiAJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCi0JCSAgICJERUJVRzogKCVzOiVkKSBUQ09OVCBmbHVzaCwgQ2xlYXIgQWxsXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCQkJIkRFQlVHOiAoJXM6JWQpIENsZWFyIEFsbCBBbGxvYy1JZHMgZnJvbSBULVRDT05Uc1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAogCWZvciAoaUVudHJ5ID0gMCA7IGlFbnRyeSA8IE9OVV9HUE9OX01BWF9OVU1fT0ZfVF9DT05UUyA7IGlFbnRyeSsrKSB7CkBAIC0xMDI0LDcgKzk3OCwxNSBAQAogCQkJb251R3BvbkFsbG9jSWRUY29udENsZWFyKGlFbnRyeSk7CiAJfQogCi0Jb251R3BvbldxVGNvbnRGbHVzaCh0Y29udE51bSk7CisJcHJpbnRrKCJUQ09OVCBmbHVzaCwgQ2xlYXIgQWxsXG4iKTsKKwlzdGF0dXMgPSBvbnVHcG9uV3FUY29udEZsdXNoKHRjb250TnVtKTsKKwlpZiAoc3RhdHVzICE9IE1WX09LKQorCXsKKwkgCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAorCSAJCSAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZFRjb250Q2xlYXJBbGwsIGZhaWxlZCB0byBzY2hlZHVsZSBBbGwgVC1Db250IGZsdXNoIGluIFdRXG4iLAorCSAJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwl9CisKIAogCXJldHVybiAoTVZfT0spOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5oCmluZGV4IDVjYTJkYjUuLjE0ZDJmNWMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251QWxsb2MuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmgKQEAgLTEwNSw3ICsxMDUsNiBAQAogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkRGVBc3NpZ25BbGwodm9pZCk7DQogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkRnJlZUFsbEJ1ZmZlcnModm9pZCk7DQogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkVGNvbnRDbGVhckFsbCh2b2lkKTsNCi1NVl9TVEFUVVMgb251R3BvbkFsbG9jSWRNYWNSZUFjdGl2YXRlKHZvaWQpOw0KIE1WX1UzMiAgICBvbnVHcG9uSWRsZUFsbG9jSWRUY29udEdldCh2b2lkKTsNCiANCiAvKiBNYWNyb3MNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFwaS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBcGkuYwppbmRleCA3ZjU0YmJjLi40MTIyMTYxIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFwaS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251QXBpLmMKQEAgLTcxNCw2ICs3MTQsOCBAQAogICAgIHJldHVybihyY29kZSk7CiAgIH0KIAorICBvbnVHcG9uRGJHZW1Qb3J0VmFsaWRTZXQoZ2VtUG9ydGlkLCB2YWxpZCk7CisKICNpZmRlZiBNVl9HUE9OX1NUQVRJQ19HRU1fUE9SVAogICBpZiAoc3RhdGljR2VtUG9ydENvbmZpZ0ZsYWcgIT0gMCkKICAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5jCmluZGV4IDUyYzZkZGMuLjM5MWJjMzUgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmMKQEAgLTMyNTQsMTAgKzMyNTQsMTAgQEAKICoqCiAqKiAgT1VUUFVUUzogICAgIE5vbmUKICoqCi0qKiAgUkVUVVJOUzogICAgIE1WX09LIGlmIHRoZXJlIGlzIGEgZnJlZSBlbnRyeSwgTVZfRVJST1Igb3RoZXJ3aXNlCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgaWYgdGhlcmUgaXMgYSBmcmVlIGVudHJ5LCBNVl9GQUxTRSBvdGhlcndpc2UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KE1WX1UzMiBhbGxvY0lkLCBNVl9VMzIgKnRjb250TnVtKQorTVZfQk9PTCBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICp0Y29udE51bSkKIHsKIAlNVl9CT09MIGV4aXN0OwogCU1WX1UzMiAgZGJBbGxvY0lkOwpAQCAtMzI3MCw3ICszMjcwLDcgQEAKIAkJb251R3BvbkRiQndUY29udEdldChpVGNvbnQsICZleGlzdCwgJmRiQWxsb2NJZCwgJmRiVmFsaWQpOwogCQlpZiAoKGV4aXN0ID09IE1WX1RSVUUpICYmIChkYlZhbGlkID09IE1WX0ZBTFNFKSkgewogCQkJKnRjb250TnVtID0gaVRjb250OwotCQkJcmV0dXJuKE1WX09LKTsKKwkJCXJldHVybihNVl9UUlVFKTsKIAkJfQogCiAJCWlmIChkYkFsbG9jSWQgPT0gYWxsb2NJZCkKQEAgLTMyNzksNyArMzI3OSw3IEBACiAKIAkqdGNvbnROdW0gPSB0ZW1wVGNvbnQ7CiAKLQlyZXR1cm4oTVZfRVJST1IpOworCXJldHVybihNVl9GQUxTRSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmgKaW5kZXggNTlkZWI3Mi4uNTM1YjZlYSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuaApAQCAtMzkyLDcgKzM5Miw3IEBACiBNVl9TVEFUVVMgb251R3BvbkRiQndUY29udENsZWFyKE1WX1UzMiB0Y29udE51bSk7CiBNVl9TVEFUVVMgb251R3BvbkRiQndUY29udEFsbG9jKE1WX1UzMiB0Y29udE51bSwgTVZfVTMyIGFsbG9jSWQpOwogTVZfU1RBVFVTIG9udUdwb25EYkJ3VGNvbnRDb25uZWN0Q2hlY2soTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiAqdGNvbnROdW0sIE1WX0JPT0wgKnZhbGlkKTsKLU1WX1NUQVRVUyBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICp0Y29udE51bSk7CitNVl9CT09MICAgb251R3BvbkRiQndUY29udEZyZWVHZXQoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiAqdGNvbnROdW0pOwogCiBNVl9TVEFUVVMgb251R3BvbkRiQndNYXBDbnREdW1wU2V0KE1WX1UzMiBlbmFibGUpOwogTVZfQk9PTCAgIG9udUdwb25EYkJ3TWFwQ250RHVtcEdldCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251SXNyLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUlzci5oCmluZGV4IDQ5ZjVjOTIuLjExZWU5NmIgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251SXNyLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVJc3IuaApAQCAtMTEzLDcgKzExMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICNkZWZpbmUgT05fR1BPTl9NQVhfQUxBUk1TICAgICAgICAgICAgICAgICAgICAgICgzKQ0KIA0KLSNkZWZpbmUgT05VX0dQT05fSU5UX0FMQVJNUyAgICAgICAgICAgICAgICAgICAgIChPTlVfR1BPTl9MT0ZfQUxBUk1fTUFTSykNCisjZGVmaW5lIE9OVV9HUE9OX0lOVF9BTEFSTVMgICAgICAgICAgICAgICAgICAgICAoT05VX0dQT05fTE9GX0FMQVJNX01BU0sgfFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05VX0dQT05fTENER19BTEFSTV9NQVNLKQ0KIA0KICNkZWZpbmUgT05VX0dQT05fUEFSSVRZX0VSUk9SICAgICAgICAgICAgICAgICAgIChPTlVfR1BPTl9SQU1fVEVTVF9HUlhfUEFSSVRZX0VSUl9NQVNLICB8XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTlVfR1BPTl9SQU1fVEVTVF9HRU1fUEFSSVRZX0VSUl9NQVNLICB8XA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nci5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyLmMKaW5kZXggZWMxOTU3Yy4uMTM5ZTk2NCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyLmMKQEAgLTM2NCw3ICszNjQsNyBAQAogICBNVl9VMzIgICAgICAgICAgb251U3RhdGU7DQogICBHUE9ORlVOQ1BUUiAgICAgcHRyRnVuYzsNCiAgIFNfT251R3BvbkdlblRibCAqb251R3BvbkdlblRibF9wID0gJihvbnVHcG9uRGJfcy5vbnVHcG9uR2VuVGJsX3MpOw0KLSAgTVZfVTMyICAgICAgICAgICptc2dEYXRhX3AgPSAoTVZfVTMyKiltc2dEYXRhOw0KKyAgTVZfVTMyICAgICAgICAgICptc2dEYXRhX3AgPSBtc2dEYXRhOw0KIA0KICAgLyogZ2V0IG9udSBJZCAqLw0KICAgYXBwT251SWQgPSBvbnVHcG9uRGJPbnVJZEdldCgpOw0KQEAgLTM4OCwxMSArMzg4LDExIEBACiAgICAgICB9DQogICAgICAgZWxzZQ0KICAgICAgIHsNCi0Jb251R3BvblN5bmNMb2coT05VX0dQT05fTE9HX01TRywgb251SWQsIG1zZ0lkLCAwKTsNCi0Jb251R3BvblN5bmNMb2coT05VX0dQT05fTE9HX01TR19DT05URU5ULCAqKG1zZ0RhdGFfcCksICoobXNnRGF0YV9wICsgMSksICoobXNnRGF0YV9wICsgMikpOw0KICAgICAgICAgKCpwdHJGdW5jKShvbnVJZCwgbXNnSWQsIG1zZ0RhdGEpOw0KICAgICAgIH0gICAgICAgICAgIA0KIA0KKyAgICAgIG9udUdwb25TeW5jTG9nKE9OVV9HUE9OX0xPR19NU0csIG9udUlkLCBtc2dJZCwgMCk7DQorICAgICAgb251R3BvblN5bmNMb2coT05VX0dQT05fTE9HX01TR19DT05URU5ULCAqKG1zZ0RhdGFfcCksICoobXNnRGF0YV9wICsgMSksICoobXNnRGF0YV9wICsgMikpOw0KICAgICB9DQogICAgIC8qIGhhbmRsZSBpbnZhbGlkIG1lc3NhZ2VzICovDQogICAgIGVsc2UNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3JTdGF0ZU1hY2hpbmUuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nclN0YXRlTWFjaGluZS5jCmluZGV4IDI2ODY4MjYuLmY2NDViMzQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nclN0YXRlTWFjaGluZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nclN0YXRlTWFjaGluZS5jCkBAIC04NCwxMiArODQsNiBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgX19GSUxFX0RFU0NfXyAibXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3RhdGVNYWNoaW5lLmMiCiAKLSNkZWZpbmUgSU5ESUNBVElPTl9CSVRfTUFQX05PTkUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQotI2RlZmluZSBJTkRJQ0FUSU9OX0JJVF9NQVBfRklCRVJfRVZFTlQgICAgICAgICAgKDB4MDAwMDAwMDEpCi0jZGVmaW5lIElORElDQVRJT05fQklUX01BUF9GT1JDRV9UQ09OVF9DTEVBUiAgICAoMHgwMDAwMDAwMikKLSNkZWZpbmUgSU5ESUNBVElPTl9CSVRfTUFQX0ZPUkNFX1RDT05UX1JFQ09ORklHICgweDAwMDAwMDA0KQotI2RlZmluZSBJTkRJQ0FUSU9OX0JJVF9NQVBfUkVTRVJWRUQgICAgICAgICAgICAgKDB4MDAwMDAwMDgpCi0KIC8qIEdsb2JhbCBWYXJpYWJsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBleHRlcm4gc3BpbmxvY2tfdCBvbnVQb25JcnFMb2NrOwpAQCAtMTA3LDkgKzEwMSw5IEBACiAvKiBMb2NhbCBGdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBNVl9TVEFUVVMgb251R3BvblBvbk1uZ3JVcGRhdGVTdGF0ZShNVl9VMzIgbmV3U3RhdGUpOwotTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oTVZfVTMyIGluZGljYXRpb25CaXRNYXApOwotTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250cyhNVl9VMzIgaW5kaWNhdGlvbkJpdE1hcCk7Ci1NVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVycyhNVl9VMzIgaW5kaWNhdGlvbkJpdE1hcCk7CitNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyh2b2lkKTsKK01WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzKHZvaWQpOworTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250cyh2b2lkKTsKIE1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVQb3J0cyh2b2lkKTsKIE1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJZCh2b2lkKTsKIE1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVEZWxheSh2b2lkKTsKQEAgLTI1Myw5ICsyNDcsOSBAQAogKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBlcnJvcgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVycyhNVl9VMzIgaW5kaWNhdGlvbkJpdE1hcCkKK01WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzKHZvaWQpCiB7Ci0gICBNVl9TVEFUVVMgcmNvZGUgPSBNVl9PSzsKKyAgIE1WX1NUQVRVUyByY29kZTsKIAogICAgcmNvZGUgPSBvbnVHcG9uQWxsb2NJZEZyZWVBbGxCdWZmZXJzKCk7CiAgICBpZiAocmNvZGUgIT0gTVZfT0spCkBAIC0yNjQsMTkgKzI1OCw2IEBACiAgICAJICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVyc1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwogICAgfQogCi0KLSAgIGlmICgob251R3BvbkRiVGNvbnRSZXNldEdldCgpICE9IE1WX1RSVUUpICYmCi0gICAgICAgKGluZGljYXRpb25CaXRNYXAgJiBJTkRJQ0FUSU9OX0JJVF9NQVBfRklCRVJfRVZFTlQpKQotICAgewotCSByY29kZSA9IG9udUdwb25BbGxvY0lkTWFjUmVBY3RpdmF0ZSgpOwotCSBpZiAocmNvZGUgIT0gTVZfT0spCi0JIHsKLQkgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKLQkJICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250c1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgIHJldHVybihyY29kZSk7Ci0JIH0KLSAgIH0KLQogICAgcmV0dXJuKE1WX09LKTsKIH0KIApAQCAtMjk1LDcgKzI3Niw3IEBACiAqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKE1WX1UzMiBpbmRpY2F0aW9uQml0TWFwKQorTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUluZm8odm9pZCkKIHsKICAgTVZfU1RBVFVTIHJjb2RlOwogCkBAIC0zMDMsMzIgKzI4NCwyOSBAQAogICBpZiAocmNvZGUgIT0gTVZfT0spCiAgIHsKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKLSAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVQb3J0c1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotICAgIHJldHVybihyY29kZSk7CisgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251UG9ydHNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsgICAgcmV0dXJuKHJjb2RlKTsKICAgfQogCi0gIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzKGluZGljYXRpb25CaXRNYXApOworICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udVRjb250cygpOwogICBpZiAocmNvZGUgIT0gTVZfT0spCiAgIHsKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKLSAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4ocmNvZGUpOworICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250c1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOyAgICByZXR1cm4ocmNvZGUpOwogICB9CiAKLSAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzKGluZGljYXRpb25CaXRNYXApOworICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnMoKTsKICAgaWYgKHJjb2RlICE9IE1WX09LKQogICB7CiAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCiAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVyc1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotICAgIHJldHVybihyY29kZSk7CisgICAgcmV0dXJuOwogICB9CiAKICAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJZCgpOwogICBpZiAocmNvZGUgIT0gTVZfT0spCiAgIHsKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKLSAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJZFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotICAgIHJldHVybihyY29kZSk7CisgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251SWRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsgICAgcmV0dXJuKHJjb2RlKTsKICAgfQogCiAgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251RGVsYXkoKTsKQEAgLTQwOSwyMCArMzg3LDE4IEBACiAqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHMoTVZfVTMyIGluZGljYXRpb25CaXRNYXApCitNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzKHZvaWQpCiB7CiAgIE1WX1NUQVRVUyByY29kZSA9IE1WX09LOwogCi0gIGlmICgob251R3BvbkRiVGNvbnRSZXNldEdldCgpID09IE1WX1RSVUUpIHx8Ci0gICAgICAoaW5kaWNhdGlvbkJpdE1hcCAmIElORElDQVRJT05fQklUX01BUF9GT1JDRV9UQ09OVF9DTEVBUikpCi0gIHsKLQlyY29kZSA9IG9udUdwb25BbGxvY0lkRGVBc3NpZ25BbGwoKTsKLQlpZiAocmNvZGUgIT0gTVZfT0spCi0JewotCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCi0JCSAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250c1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgcmV0dXJuKHJjb2RlKTsKLQl9CisgIGlmIChvbnVHcG9uRGJUY29udFJlc2V0R2V0KCk9PU1WX1RSVUUpIHsKKyAgICAgIHJjb2RlID0gb251R3BvbkFsbG9jSWREZUFzc2lnbkFsbCgpOworICAgICAgaWYgKHJjb2RlICE9IE1WX09LKQorICAgICAgeworICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWREZUFzc2lnbkFsbFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworICAgICAgICByZXR1cm4ocmNvZGUpOworICAgICAgfQogICB9CiAKICAgcmV0dXJuKE1WX09LKTsKQEAgLTEwMTIsMjEgKzk4OCwxNCBAQAogCiAgICAgLyogc2V0IERlZmF1bHQgYWxsb2NJZCBhY2NvcmRpbmcgdG8gdGhlIG9udUlkICovCiAgICAgcmNvZGUgPSBvbnVHcG9uQWxsb2NJZEFzc2lnbihtc2dPbnVJZCwgMCk7Ci0gICAgaWYgKChyY29kZSAhPSBNVl9PSykgJiYgKHJjb2RlICE9IE1WX05PX0NIQU5HRSkpCisgICAgaWYgKHJjb2RlICE9IE1WX09LKQogICAgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCi0JCSAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRBc3NpZ25cbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkJICAgICAgIHJldHVybjsKKyAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAorICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRBc3NpZ25cbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZWxzZSBpZiAoKHJjb2RlICE9IE1WX09LKSAmJiAocmNvZGUgPT0gTVZfTk9fQ0hBTkdFKSkKLSAgICB7Ci0JICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAotCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkQXNzaWduLCBBbGxvYyBJZCBleGlzdFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotICAgIH0KLSAgICBlbHNlIC8qIE1WX09LICovCi0gICAgewotCSAgICBvbnVHcG9uQWxsb2NJZE1hY0FkZChtc2dPbnVJZCwgUE9OX09OVV9ERUZBVUxUX0FMTE9DX1RDT05UKTsKLSAgICB9CisKKyAgICBvbnVHcG9uQWxsb2NJZE1hY0FkZChtc2dPbnVJZCwgUE9OX09OVV9ERUZBVUxUX0FMTE9DX1RDT05UKTsKIAogICAgIC8qIFNldCBkZWxheSByZWNlaXZlZCBmcm9tIE9MVCAqLwogICAgIGVxdWFsaXphdGlvbkRlbGF5VGVtcCA9IG9udUdwb25EYkVxdWFsaXphdGlvbkRlbGF5R2V0KCk7CkBAIC0xMjk0LDEyICsxMjYzLDEyIEBACiAJCSBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgY3VyckZpbmFsRGVsYXkpOwogCiAgICAgICAvKiBDaGVjayBpZiBjYW4gY2hhbmdlIHRoZSBUWCBGaW5hbCBEZWxheSBvbmx5ICovCi0gICAgICBpZiAoY2hhbmdlRGVsYXkgKyBjdXJyRmluYWxEZWxheSA8PSBHUE9OX1RYX0ZJTkFMX0RFTEFZX01BWCkKKyAgICAgIGlmIChjaGFuZ2VEZWxheSArIGN1cnJGaW5hbERlbGF5ID4gR1BPTl9UWF9GSU5BTF9ERUxBWV9NQVgpCiAgICAgICB7CiAgICAgICAgIGZpbmFsRGVsYXkgPSBjdXJyRmluYWxEZWxheSArIGNoYW5nZURlbGF5OwogCiAJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9TTV9TVEFURV9NT0RVTEUsCi0JCSAgICJSYW5nZSBEZWJ1ZyBJbmZvOiAoJXM6JWQpLCBTdGF0ZSBPNSwgQ2hhbmdlIGRlbGF5ICsgY3VycmVudCBGaW5hbCBkZWxheSA8PSBNQVggRmluYWwgZGVsYXkoMHgzRiksIHVwZGF0ZWQgZmluYWwgZGVsYXksIGZpbmFsRGVsYXkgPSBjdXJyRmluYWxEZWxheSArIGNoYW5nZURlbGF5LCAoMHgleClcbiIsCisJCSAgICJSYW5nZSBEZWJ1ZyBJbmZvOiAoJXM6JWQpLCBTdGF0ZSBPNSwgQ2hhbmdlIGRlbGF5ICsgY3VycmVudCBGaW5hbCBkZWxheSA+IE1BWCBGaW5hbCBkZWxheSgweDNGKSwgdXBkYXRlZCBmaW5hbCBkZWxheSwgZmluYWxEZWxheSA9IGN1cnJGaW5hbERlbGF5ICsgY2hhbmdlRGVsYXksICgweCV4KVxuIiwKIAkJICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIGZpbmFsRGVsYXkpOwogICAgICAgfQogICAgICAgZWxzZQpAQCAtMTMxMCw3ICsxMjc5LDcgQEAKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKIAltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX1NNX1NUQVRFX01PRFVMRSwKLQkJICAgIlJhbmdlIERlYnVnIEluZm86ICglczolZCksIFN0YXRlIE81LCBDaGFuZ2UgZGVsYXkgKyBGaW5hbCBkZWxheSA+IE1BWCBGaW5hbCBkZWxheSA9IDB4M0YsIHVwZGF0ZWQgZXF1YWxpemF0aW9uIGRlbGF5XG4iLAorCQkgICAiUmFuZ2UgRGVidWcgSW5mbzogKCVzOiVkKSwgU3RhdGUgTzUsIENoYW5nZSBkZWxheSArIEZpbmFsIGRlbGF5IDwgTUFYIEZpbmFsIGRlbGF5ID0gMHgzRiwgdXBkYXRlZCBlcXVhbGl6YXRpb24gZGVsYXlcbiIsCiAJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKIAogICAgICAgICAvKiBjYWxjIGRlbGF5ICovCkBAIC0xNDAzLDcgKzEzNzIsNyBAQAogCiAgIC8qIGNsZWFyIG9udSBpbmZvcm1hdGlvbiAqLwogICAvKiA9PT09PT09PT09PT09PT09PT09PT0gKi8KLSAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKElORElDQVRJT05fQklUX01BUF9GT1JDRV9UQ09OVF9DTEVBUik7CisgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbygpOwogICBpZiAocmNvZGUgIT0gTVZfT0spCiAgIHsKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKQEAgLTE0OTksNyArMTQ2OCw3IEBACiAKIAkJLyogY2xlYXIgb251IGluZm9ybWF0aW9uICovCiAJCS8qID09PT09PT09PT09PT09PT09PT09PSAqLwotCQlyY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oSU5ESUNBVElPTl9CSVRfTUFQX0ZPUkNFX1RDT05UX0NMRUFSKTsKKwkJcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKCk7CiAJCWlmIChyY29kZSAhPSBNVl9PSykgewogCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCiAJCQkJCSAgICJFUlJPUjogKCVzOiVkKSBESVNBQkxFOiBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CkBAIC0xODcxLDcgKzE4NDAsNyBAQAogICAgIGlmIChuZXdBbGxvY1N0YXR1cyA9PSBNVl9UUlVFKQogICAgIHsKICAgICAgIHN0YXR1cyA9IG9udUdwb25BbGxvY0lkQXNzaWduKGFsbG9jSWQsIDEpOwotICAgICAgaWYgKChzdGF0dXMgIT0gTVZfT0spICYmIChzdGF0dXMgIT0gTVZfTk9fQ0hBTkdFKSkKKyAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCiAgICAgICB7CiAgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAogICAgICAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZEFzc2lnbiBvbnVJZCglZCksIGFsbG9jSWQoJWQpXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgb251SWQsIGFsbG9jSWQpOwpAQCAtMjY2Miw3ICsyNjMxLDcgQEAKIAogICAvKiBjbGVhciBvbnUgaW5mb3JtYXRpb24gKi8KICAgLyogPT09PT09PT09PT09PT09PT09PT09ICovCi0gIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyhJTkRJQ0FUSU9OX0JJVF9NQVBfRklCRVJfRVZFTlQpOworICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oKTsKICAgaWYgKHJjb2RlICE9IE1WX09LKQogICB7CiAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCkBAIC0yNzM1LDcgKzI3MDQsNyBAQAogCiAgIC8qIGNsZWFyIG9udSBpbmZvcm1hdGlvbiAqLwogICAvKiA9PT09PT09PT09PT09PT09PT09PT0gKi8KLSAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKElORElDQVRJT05fQklUX01BUF9GSUJFUl9FVkVOVCk7CisgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbygpOwogICBpZiAocmNvZGUgIT0gTVZfT0spCiAgIHsKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKQEAgLTI5MTksNyArMjg4OCw3IEBACiAKICAgICAvKiBjbGVhciBvbnUgaW5mb3JtYXRpb24gKi8KICAgICAvKiA9PT09PT09PT09PT09PT09PT09PT0gKi8KLSAgICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oSU5ESUNBVElPTl9CSVRfTUFQX0ZJQkVSX0VWRU5UKTsKKyAgICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oKTsKICAgICBpZiAocmNvZGUgIT0gTVZfT0spCiAgICAgewogICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5jCmluZGV4IDViM2M0NTQuLjA0NGY1ODkgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5jCkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogICAgICAgICAgICAgYnJlYWs7DQogDQogICAgICAgICBjYXNlIE9OVV9HUE9OX0xPR19NU0dfQ09OVEVOVDoNCi0gICAgICAgICAgICBwcmludGsoIlslMDNkXSBQTE9BTSBtZXNzYWdlLCBkYXRhPTB4JTA4eCUwOHglMDh4IFswMzAyMDEwMDA3MDYwNTA0MTExMDA5MDhdXG4iLCBwcmludEVudHJ5LA0KKyAgICAgICAgICAgIHByaW50aygiWyUwM2RdIFBMT0FNIG1lc3NhZ2UsIGRhdGE9MHglMDh4JTA4eCUwOHhcbiIsIHByaW50RW50cnksDQogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uZGF0YVZhbDEsDQogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uZGF0YVZhbDIsDQogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uZGF0YVZhbDMpOw0KQEAgLTEyMzIsNyArMTIzMiw2IEBACiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5zdGF0ZSwNCiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS50aW1lLA0KICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLmRhdGFWYWwxKTsNCi0gICAgICAgICAgICBwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOw0KICAgICAgICAgICAgIGJyZWFrOw0KIA0KICAgICAgICAgY2FzZSBPTlVfR1BPTl9MT0dfSU5URVJSVVBUX1hWUl9TRDoNCkBAIC0xMjU2LDcgKzEyNTUsNyBAQAogICAgICAgICAgICAgYnJlYWs7DQogDQogICAgICAgICBjYXNlIE9OVV9HUE9OX0xPR19JTlRFUlJVUFRfU0VSREVTX1NUT1A6DQotICAgICAgICAgICAgcHJpbnRrKCJbJTAzZF0gU0VSREVTIFN0b3AsIHN0YXRlPSVkLCB0aW1lPSUwOHhcbiIsIHByaW50RW50cnksDQorICAgICAgICAgICAgcHJpbnRrKCJbJTAzZF0gSW50ZXJydXB0LCBzdGF0ZT0lZCwgdGltZT0lMDh4XG4iLCBwcmludEVudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLnN0YXRlLA0KICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLnRpbWUpOw0KICAgICAgICAgICAgIGJyZWFrOw0KQEAgLTEyNjcsMTQgKzEyNjYsNiBAQAogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0udGltZSk7DQogICAgICAgICAgICAgYnJlYWs7DQogDQotICAgICAgICBjYXNlIE9OVV9HUE9OX0xPR19GUkVFX1RFWFQ6DQotICAgICAgICAgICAgcHJpbnRrKCJbJTAzZF0gRnJlZSwgdGltZT0lMDh4ICVkICVkICVkXG4iLCBwcmludEVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0udGltZSwNCi0JCSAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5kYXRhVmFsMSwNCi0JCSAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5kYXRhVmFsMiwNCi0JCSAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5kYXRhVmFsMyk7DQotICAgICAgICAgICAgYnJlYWs7DQotDQogICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgIHByaW50aygiWyUwM2RdIE90aGVyXHJcbiIsIHByaW50RW50cnkpOw0KICAgICAgICAgICAgIGJyZWFrOw0KQEAgLTEzMTAsMTAgKzEzMDEsMTUgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogTVZfU1RBVFVTIG9udUdwb25XcVRjb250Rmx1c2goTVZfVTMyIHRjb250KQ0KIHsNCisgICAgTVZfU1RBVFVTIHJjb2RlOw0KKw0KICAgICBpZiAodGNvbnQgIT0gMHhGRikNCi0JcXVldWVfd29yayhncG9uVGNvbnRGbHVzaFdxLnBvbldxLCAoc3RydWN0IHdvcmtfc3RydWN0ICopJmdwb25UY29udENsZWFuV29ya1t0Y29udF0pOw0KKwlyY29kZSA9IHF1ZXVlX3dvcmsoZ3BvblRjb250Rmx1c2hXcS5wb25XcSwgKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSZncG9uVGNvbnRDbGVhbldvcmtbdGNvbnRdKTsNCiAgICAgZWxzZQ0KLSAgICAgICAgcXVldWVfd29yayhncG9uVGNvbnRGbHVzaFdxLnBvbldxLCAoc3RydWN0IHdvcmtfc3RydWN0ICopJmdwb25UY29udENsZWFuQWxsV29yayk7DQorICAgICAgICByY29kZSA9IHF1ZXVlX3dvcmsoZ3BvblRjb250Rmx1c2hXcS5wb25XcSwgKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSZncG9uVGNvbnRDbGVhbkFsbFdvcmspOw0KKw0KKyAgICBpZihyY29kZSA9PSAwKQ0KKwlyZXR1cm4oTVZfRVJST1IpOw0KIA0KICAgICByZXR1cm4oTVZfT0spOw0KIH0NCkBAIC0xMzM1LDcgKzEzMzEsMTEgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogTVZfU1RBVFVTIG9udUdwb25XcVRjb250QWN0aXZhdGUoTVZfVTMyIHRjb250KQ0KIHsNCi0gICAgcXVldWVfd29yayhncG9uVGNvbnRGbHVzaFdxLnBvbldxLCAoc3RydWN0IHdvcmtfc3RydWN0ICopJmdwb25UY29udEFjdGl2ZVdvcmtbdGNvbnRdKTsNCisgICAgTVZfU1RBVFVTIHJjb2RlOw0KKw0KKyAgICByY29kZSA9IHF1ZXVlX3dvcmsoZ3BvblRjb250Rmx1c2hXcS5wb25XcSwgKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSZncG9uVGNvbnRBY3RpdmVXb3JrW3Rjb250XSk7DQorICAgIGlmKHJjb2RlID09IDApDQorICAgICAgICByZXR1cm4oTVZfRVJST1IpOw0KIA0KICAgICByZXR1cm4oTVZfT0spOw0KIH0NCkBAIC0xMzcxLDE3ICsxMzcxLDE0IEBACiAgICAgew0KIAlpZiAob251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPT0gVENPTlRfRkxVU0hfUlVOTklOR19TVEFURSkNCiAJew0KLQkJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsDQotCQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgQ0xFQU5fRVZFTlRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7DQotCQlvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX0JMT0NLSU5HX1NUQVRFOw0KLQkJdHBtX2RlYWN0aXZlX3Rjb250KHRjb250KTsNCi0JCW9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfUkVBRFlfU1RBVEU7DQorCSAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfQkxPQ0tJTkdfU1RBVEU7DQorCSAgIHRwbV9kZWFjdGl2ZV90Y29udCh0Y29udCk7DQorCSAgIHByaW50aygiVENPTlQgKCVkKSBDTEVBTl9FVkVOVFxuIiwgdGNvbnQpOw0KKwkgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX1JFQURZX1NUQVRFOw0KIAl9DQogCWVsc2UNCiAJew0KLQkJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsDQotCQkJICAgIkRFQlVHOiAoJXM6JWQpIFJlY2VpdmVkIFRDT05UX0NMRUFOX0VWRU5UIHdoaWxlIGluIFQtQ09OVCglZCkgc3RhdGUoJXMpXG4iLA0KLQkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCwgc3RhdGVUZXh0W29udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdXSk7DQorCSAgIHByaW50aygiUmVjZWl2ZWQgVENPTlRfQ0xFQU5fRVZFTlQgd2hpbGUgaW4gVC1DT05UKCVkKSBzdGF0ZSglcylcbiIsIHRjb250LCBzdGF0ZVRleHRbb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF1dKTsNCiAJfQ0KICAgICB9DQogDQpAQCAtMTM5MywxNyArMTM5MCwxNCBAQAogCXsNCiAJICAgIGlmIChvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9PSBUQ09OVF9GTFVTSF9SVU5OSU5HX1NUQVRFKQ0KIAkgICAgew0KLQkJICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLA0KLQkJCSAgICAgICAiREVCVUc6ICglczolZCkgVENPTlQgKCVkKSBDTEVBTl9FVkVOVFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250KTsNCi0JCSAgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX0JMT0NLSU5HX1NUQVRFOw0KLQkJICAgIHRwbV9kZWFjdGl2ZV90Y29udCh0Y29udCk7DQotCQkgICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9SRUFEWV9TVEFURTsNCisJICAgICAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfQkxPQ0tJTkdfU1RBVEU7DQorCSAgICAgICB0cG1fZGVhY3RpdmVfdGNvbnQodGNvbnQpOw0KKwkgICAgICAgcHJpbnRrKCJUQ09OVCAoJWQpIENMRUFOX0VWRU5UXG4iLCB0Y29udCk7DQorCSAgICAgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX1JFQURZX1NUQVRFOw0KIAkgICAgfQ0KIAkgICAgZWxzZQ0KIAkgICAgew0KLQkJICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLA0KLQkJCSAgICAgICAiREVCVUc6ICglczolZCkgUmVjZWl2ZWQgVENPTlRfQ0xFQU5fRVZFTlQgd2hpbGUgaW4gVC1DT05UKCVkKSBzdGF0ZSglcylcbiIsDQotCQkJICAgICAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCwgc3RhdGVUZXh0W29udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdXSk7DQorCSAgICAgICBwcmludGsoIlJlY2VpdmVkIFRDT05UX0NMRUFOX0VWRU5UIHdoaWxlIGluIFQtQ09OVCglZCkgc3RhdGUoJXMpXG4iLCB0Y29udCwgc3RhdGVUZXh0W29udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdXSk7DQogCSAgICB9DQogCX0NCiAgICAgfQ0KQEAgLTE0MTQsMTYgKzE0MDgsMTMgQEAKICAgICB7DQogICAgICAgIGlmIChvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9PSBUQ09OVF9GTFVTSF9SRUFEWV9TVEFURSkNCiAgICAgICAgew0KLQkgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsDQotCSAgICAgICAgICAgICJERUJVRzogKCVzOiVkKSBUQ09OVCAoJWQpIEFDVElWRV9FVkVOVFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250KTsNCi0JICAgICAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfUlVOTklOR19TVEFURTsNCi0JICAgICAgIHRwbV9hY3RpdmVfdGNvbnQodGNvbnQpOw0KKyAgICAgICAgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX1JVTk5JTkdfU1RBVEU7DQorICAgICAgICAgIHRwbV9hY3RpdmVfdGNvbnQodGNvbnQpOw0KKyAgICAgICAgICBwcmludGsoIlRDT05UICglZCkgQUNUSVZFX0VWRU5UXG4iLCB0Y29udCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQotCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwNCi0JCQkgICJERUJVRzogKCVzOiVkKSBSZWNlaXZlZCBUQ09OVF9BQ1RJVkVfRVZFTlQgd2hpbGUgaW4gVC1DT05UIHN0YXRlKCVzKVxuIiwNCi0JCQkgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCBzdGF0ZVRleHRbb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF1dKTsNCisgICAgICAgICAgIHByaW50aygiUmVjZWl2ZWQgVENPTlRfQUNUSVZFX0VWRU5UIHdoaWxlIGluIFQtQ09OVCBzdGF0ZSglcylcbiIsIHN0YXRlVGV4dFtvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XV0pOw0KICAgICAgICB9DQogICAgIH0NCiANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5oCmluZGV4IDVkODRiMTMuLmVkMDhiMmQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5oCkBAIC04OSw3ICs4OSw2IEBACiAjZGVmaW5lIE9OVV9HUE9OX0xPR19TVEFURQkJCSg2KQ0KICNkZWZpbmUgT05VX0dQT05fTE9HX01TRwkJCSg3KQ0KICNkZWZpbmUgT05VX0dQT05fTE9HX01TR19DT05URU5UCQkoOCkNCi0jZGVmaW5lIE9OVV9HUE9OX0xPR19GUkVFX1RFWFQJCQkoOSkNCiANCiAjZGVmaW5lIE9OVV9HUE9OX0xPR19TSVpFICAgICAgICAgICAgICAgICAgICAgICAoNTEyKQ0KIA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmMKaW5kZXggY2I1MjdlMC4uZjE4NWZkNCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmMKQEAgLTg5LDggKzg5LDYgQEAKIAogLyogTG9jYWwgVmFyaWFibGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljICAgU19FcG9uSW9jdGxUZG1RdWV1ZSBpb2N0bFRkbVF1ZXVlOwotc3RhdGljICAgU19FcG9uSW9jdGxEYmEgICAgICBpb2N0bERiYTsKIAogLyogRXhwb3J0IEZ1bmN0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTQ3Nyw3ICs0NzUsOSBAQAogICBvbnVFcG9uRGJPbnVIb2xkb3ZlclN0YXRlU2V0KGlvY3RsSG9sZG92ZXItPmhvbGRvdmVyU3RhdGUpOwogICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVTZXQoaW9jdGxIb2xkb3Zlci0+aG9sZG92ZXJUaW1lKTsKIAotICBvbnVFcG9uSXNyVGltZXJIb2xkb3ZlckludGVydmFsU2V0KGlvY3RsSG9sZG92ZXItPmhvbGRvdmVyVGltZSwgMCk7CisgIC8qIEFkZCB0aGUgbmV3bHkgY29uZmlndXJlZCBob2xkb3ZlciB0aW1lIHdpdGggT3B0aWNhbExvc1RpbWUgKi8KKyAgb251RXBvbklzclRpbWVySG9sZG92ZXJJbnRlcnZhbFNldChvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVHZXQoKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lR2V0KCksIDApOwogCiAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0lORk8sIFBPTl9BUElfTU9EVUxFLAogCQkJICJERUJVRzogSG9sZG92ZXIgY29uZmlnLCBzdGF0ZSglZCksIHRpbWUoJWQpKVxuIiwKQEAgLTUxMiw2ICs1MTIsMTMyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgorKiogIG9udUVwb25NaUxvc1RpbWVDb25maWcKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgdGltZSBkZWxheSBmb3IgZW50ZXJpbmcgaG9sZG92ZXIgc3RhdHVzCisqKgorKiogIFBBUkFNRVRFUlM6ICAqaW9jdGxMb3NUaW1lIC0gdGltZSBkZWxheSB2YWx1ZQorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTm9uZQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgb251RXBvbk1pTG9zVGltZUNvbmZpZyhTX0Vwb25Jb2N0bExvc1RpbWUgKmlvY3RsTG9zVGltZSkKK3sKKyAgICBNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CisKKyAgICBNVl9VMTYgb3B0aWNhbExvc1RpbWU7CisgICAgTVZfVTE2IG1hY0xvc1RpbWU7CisKKyAgICBvcHRpY2FsTG9zVGltZSA9IGlvY3RsTG9zVGltZS0+b3B0aWNhbF9sb3NfdGltZTsKKyAgICBtYWNMb3NUaW1lICAgICA9IGlvY3RsTG9zVGltZS0+bWFjX2xvc190aW1lOworCisgICAgc3RhdHVzID0gbXZFcG9uQXBpTG9zVGltZUNvbmZpZyhvcHRpY2FsTG9zVGltZSwgbWFjTG9zVGltZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uTWlUeFBvd2VyQ29udHJvbENvbmZpZworKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb250cm9scyB0aGUgVFggcG93ZXIgb24gYW5kIG9mZgorKioKKyoqICBQQVJBTUVURVJTOiAgaW9jdGxUeENvbnRyb2wgLSBvbiwgb2ZmIGFuZCB0aW1lIGRlbGF5IGJlZm9yZSBvZmYKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE5vbmUKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG9udUVwb25NaVR4UG93ZXJDb250cm9sQ29uZmlnKFNfRXBvbklvY3RsVHhDb250cm9sICppb2N0bFR4Q29udHJvbCkKK3sKKyAgICBNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CisgICAgTVZfVTE2IGFjdGlvbjsKKyAgICBNVl9VMTYgdGltZTsKKyAgICAgICAgCisgICAgYWN0aW9uID0gaW9jdGxUeENvbnRyb2wtPmFjdGlvbjsKKyAgICB0aW1lICAgPSBpb2N0bFR4Q29udHJvbC0+dGltZSAqIDEwMDA7ICAgLyogVGhlIHRpbWUgZnJvbSB1c2VyIHNwYWNlIGlzIGV4cHJlc3NlZCBpbiBzZWNvbmQgKi8KKworICAgIHN0YXR1cyA9IG12RXBvbkFwaVR4UG93ZXJDdHJsQ29uZmlnKGFjdGlvbiwgdGltZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uTWlQb3dlclNhdmluZ0NvbmZpZworKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIG1heFNsZWVwRHVyYXRpb24gZm9yIHBvd2VyIHNhdmluZyBtb2RlCisqKgorKiogIFBBUkFNRVRFUlM6ICAqaW9jdGxQb3dlclNhdmluZyAtIHBvd2VyIHNhdmluZyBtb2RlIGR1cmF0aW9uCisqKgorKiogIE9VVFBVVFM6ICAgICBOb25lCisqKgorKiogIFJFVFVSTlM6ICAgICBOb25lCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBvbnVFcG9uTWlQb3dlclNhdmluZ0NvbmZpZyhTX0Vwb25Jb2N0bFBvd2VyU2F2aW5nICppb2N0bFBvd2VyU2F2aW5nKQoreworICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsKKworICAgIE1WX1U4ICBlYXJseVdha2V1cDsKKyAgICBNVl9VNjQgbWF4U2xlZXBEdXJhdGlvbjsKKworICAgIGVhcmx5V2FrZXVwICAgICAgPSBpb2N0bFBvd2VyU2F2aW5nLT5lYXJseVdha2VVcDsKKyAgICBtYXhTbGVlcER1cmF0aW9uID0gaW9jdGxQb3dlclNhdmluZy0+bWF4U2xlZXBEdXJhdGlvbjsKKworICAgIHN0YXR1cyA9IG12RXBvbkFwaVBvd2VyU2F2aW5nQ29uZmlnKGVhcmx5V2FrZXVwLCBtYXhTbGVlcER1cmF0aW9uKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25NaUNvbnRyb2xTbGVlcENvbmZpZworKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiB0cmlnZ2VycyB0aGUgYWN0aW9uIG9mIHBvd2VyIG1vZGUgdHJhbnNmb3JtYXRpb24KKyoqCisqKiAgUEFSQU1FVEVSUzogICppb2N0bENvbnRyb2xTbGVlcCAtIHBvd2VyIGNvbnRyb2wgYW5kIHNsZWVwL3dha2V1cCBkdXJhdGlvbgorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTm9uZQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgb251RXBvbk1pQ29udHJvbFNsZWVwQ29uZmlnKFNfRXBvbklvY3RsQ29udHJvbFNsZWVwICppb2N0bENvbnRyb2xTbGVlcCkKK3sKKyAgICBNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CisKKyAgICB1aW50OF90IGFjdGlvbjsKKworICAgIGFjdGlvbiA9IGlvY3RsQ29udHJvbFNsZWVwLT5hY3Rpb247CisKKyAgICBpZiAoYWN0aW9uID09IEVfR1BPTl9TTEVFUF9BQ1RJT05fRElTQUJMRSkKKyAgICB7CisgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybERpc2FibGUoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYWN0aW9uID09IEVfR1BPTl9TTEVFUF9BQ1RJT05fRU5BQkxFKQorICAgIHsKKyAgICAgICAgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0dQT05fU0xFRVBfQUNUSU9OX0NPTkZJRykKKyAgICB7CisgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybENmZyhpb2N0bENvbnRyb2xTbGVlcC0+c2xlZXBNb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvY3RsQ29udHJvbFNsZWVwLT5zbGVlcER1cmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvY3RsQ29udHJvbFNsZWVwLT53YWl0RHVyYXRpb24pOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgogKiogIG9udUVwb25NaVNpbGVuY2VDb25maWcKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqKgpAQCAtNjUwLDExICs3NzYsMTcgQEAKICAgU19FcG9uSW9jdGxGZWMgICAgICBpb2N0bEZlYzsKICAgU19FcG9uSW9jdGxFbmMgICAgICBpb2N0bEVuYzsKICAgU19FcG9uSW9jdGxPYW1UeCAgICBpb2N0bFR4T2FtOworICBTX0Vwb25Jb2N0bERiYSAgICAgIGlvY3RsRGJhOwogICBTX0Vwb25Jb2N0bEhvbGRPdmVyIGlvY3RsSG9sZG92ZXI7CiAgIFNfRXBvbklvY3RsU2lsZW5jZSAgaW9jdGxTaWxlbmNlOworICBTX0Vwb25Jb2N0bFRkbVF1ZXVlIGlvY3RsVGRtUXVldWU7CiAgIE1WX1UzMiAgICAgICAgICAgICAgaW9jdGxTdGF0ZTsKICAgTVZfVTMyICAgICAgICAgICAgICBpb2N0bEFsYXJtOwogICBTX0Vwb25Jb2N0bFJvZ3VlT251IGlvY3RsUm9ndWVPbnU7CisgIFNfRXBvbklvY3RsTG9zVGltZSAgICAgIGlvY3RsTG9zVGltZTsKKyAgU19FcG9uSW9jdGxUeENvbnRyb2wgICAgaW9jdGxUeENvbnRyb2w7CisgIFNfRXBvbklvY3RsUG93ZXJTYXZpbmcgIGlvY3RsUG93ZXJTYXZpbmc7CisgIFNfRXBvbklvY3RsQ29udHJvbFNsZWVwIGlvY3RsQ29udHJvbFNsZWVwOwogICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOwogICBpbnQgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CiAKQEAgLTg3MCw2ICsxMDAyLDkwIEBACiAgICAgICByZXQgPSAwOwogICAgICAgYnJlYWs7CiAKKyAgICAvKiA9PT09PT0gTVZFUE9OX0lPQ1RMX0xPU19USU1FID09PT09PT09PT09PT09PT09PT09ICovCisgICAgY2FzZSBNVkVQT05fSU9DVExfTE9TX1RJTUU6CisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmaW9jdGxMb3NUaW1lLCAoU19FcG9uSW9jdGxMb3NUaW1lKilhcmcsIHNpemVvZihTX0Vwb25Jb2N0bExvc1RpbWUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLAorICAgICAgCQkgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBzdGF0dXMgPSBvbnVFcG9uTWlMb3NUaW1lQ29uZmlnKCYoaW9jdGxMb3NUaW1lKSk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIAorICAgICAgICBicmVhazsKKworICAgIC8qID09PT09PSBNVkVQT05fSU9DVExfVFhfQ09OVFJPTCA9PT09PT09PT09PT09PT09PT09PSAqLworICAgIGNhc2UgTVZFUE9OX0lPQ1RMX1RYX0NPTlRST0w6CisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmaW9jdGxUeENvbnRyb2wsIChTX0Vwb25Jb2N0bFR4Q29udHJvbCopYXJnLCBzaXplb2YoU19FcG9uSW9jdGxUeENvbnRyb2wpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLAorICAgICAgCQkgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBzdGF0dXMgPSBvbnVFcG9uTWlUeFBvd2VyQ29udHJvbENvbmZpZygmKGlvY3RsVHhDb250cm9sKSk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIAorICAgICAgICBicmVhazsKKworICAgIC8qID09PT09PSBNVkVQT05fSU9DVExfUE9XRVJfU0FWSU5HID09PT09PT09PT09PT09PT09PT09ICovCisgICAgY2FzZSBNVkVQT05fSU9DVExfUE9XRVJfU0FWSU5HOgorICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmlvY3RsUG93ZXJTYXZpbmcsIChTX0Vwb25Jb2N0bFBvd2VyU2F2aW5nKilhcmcsIHNpemVvZihTX0Vwb25Jb2N0bFBvd2VyU2F2aW5nKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwKKyAgICAgIAkJICAgICAgICAgICAiRVJST1I6ICglczolZCkgY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgc3RhdHVzID0gb251RXBvbk1pUG93ZXJTYXZpbmdDb25maWcoJihpb2N0bFBvd2VyU2F2aW5nKSk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IDA7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAvKiA9PT09PT0gTVZFUE9OX0lPQ1RMX0NPTlRST0xfU0xFRVAgPT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICBjYXNlIE1WRVBPTl9JT0NUTF9DT05UUk9MX1NMRUVQOgorICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmlvY3RsQ29udHJvbFNsZWVwLCAoU19FcG9uSW9jdGxDb250cm9sU2xlZXAqKWFyZywgc2l6ZW9mKFNfRXBvbklvY3RsQ29udHJvbFNsZWVwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwKKyAgICAgIAkJICAgICAgICAgICAiRVJST1I6ICglczolZCkgY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgc3RhdHVzID0gb251RXBvbk1pQ29udHJvbFNsZWVwQ29uZmlnKCYoaW9jdGxDb250cm9sU2xlZXApKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgCisgICAgICAgIGJyZWFrOworCiAgICAgLyogPT09PT09IE1WRVBPTl9JT0NUTF9TSUxFTkNFID09PT09PT09PT09PT09PT09PT09ICovCiAgICAgY2FzZSBNVkVQT05fSU9DVExfU0lMRU5DRToKICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZpb2N0bFNpbGVuY2UsIChTX0Vwb25Jb2N0bFNpbGVuY2UqKWFyZywgc2l6ZW9mKFNfRXBvbklvY3RsU2lsZW5jZSkpKQpAQCAtOTI1LDcgKzExNDEsNyBAQAogCiAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CiAgICAgICAgIAotICAgICAgICBzdGF0dXMgPSBvbnVFcG9uRGJQMlBGb3JjZU1vZGVTZXQoaW9jdGxTdGF0ZSk7CisgICAgICAgIG9udUVwb25EYlAyUEZvcmNlTW9kZVNldChpb2N0bFN0YXRlKTsKICAgICAgICAgCiAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuaAppbmRleCBkNzNiNGUzLi5mZTRhYTM5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuaApAQCAtOTgsNiArOTgsMTAgQEAKICNkZWZpbmUgTVZFUE9OX0lPQ1RMX1RETV9RVUVfQ0ZHICAgX0lPVyhNVlBPTl9JT0NUTF9NQUdJQywgMTQsIHVuc2lnbmVkIGludCkNCiAjZGVmaW5lIE1WRVBPTl9JT0NUTF9BTEFSTV9HRVQgICAgIF9JT1IoTVZQT05fSU9DVExfTUFHSUMsIDE1LCB1bnNpZ25lZCBpbnQpDQogI2RlZmluZSBNVkVQT05fSU9DVExfUk9HVUVfT05VX1NFVCBfSU9XKE1WUE9OX0lPQ1RMX01BR0lDLCAxNiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBNVkVQT05fSU9DVExfTE9TX1RJTUUgICAgICBfSU9XKE1WUE9OX0lPQ1RMX01BR0lDLCAxNywgdW5zaWduZWQgaW50KQ0KKyNkZWZpbmUgTVZFUE9OX0lPQ1RMX1RYX0NPTlRST0wgICAgX0lPVyhNVlBPTl9JT0NUTF9NQUdJQywgMTgsIHVuc2lnbmVkIGludCkNCisjZGVmaW5lIE1WRVBPTl9JT0NUTF9QT1dFUl9TQVZJTkcgIF9JT1coTVZQT05fSU9DVExfTUFHSUMsIDE5LCB1bnNpZ25lZCBpbnQpDQorI2RlZmluZSBNVkVQT05fSU9DVExfQ09OVFJPTF9TTEVFUCBfSU9XKE1WUE9OX0lPQ1RMX01BR0lDLCAyMCwgdW5zaWduZWQgaW50KQ0KIA0KICNkZWZpbmUgRVBPTl9NQVhfTlVNX09GX01BQyAgICAgICAgICAoOCkNCiAjZGVmaW5lIEVQT05fTUFYX05VTV9PRl9RVUVVRSAgICAgICAgKDgpDQpAQCAtMTQyLDkgKzE0NiwzMCBAQAogew0KICAgRV9FUE9OX0lPQ1RMX1NURF9NT0RFLA0KICAgRV9FUE9OX0lPQ1RMX1AyUF9NT0RFLA0KLSAgRV9FUE9OX0lPQ1RMX01BWF9NT0RFX05VTQ0KKyAgRV9FUE9OX0lPQ1RMX01BWF9NT0RFX05VTSwNCiB9RV9FcG9uSW9jdGxNb2RlOw0KIA0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRV9FUE9OX0lPQ1RMX0VOQUJMRV9UWCAgICAgICAgPSAwLCANCisgICAgRV9FUE9OX0lPQ1RMX0RJU0FCTEVfVFggICAgICAgPSAxLCANCisgICAgRV9FUE9OX0lPQ1RMX0RJU0FCTEVfVFhfREVMQVkgPSAyLCANCit9IEVfRXBvbklvY3RsVHhDb250cm9sOw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRV9HUE9OX1NMRUVQX0FDVElPTl9ESVNBQkxFID0gMCwgDQorICAgIEVfR1BPTl9TTEVFUF9BQ1RJT05fRU5BQkxFICA9IDEsIA0KKyAgICBFX0dQT05fU0xFRVBfQUNUSU9OX0NPTkZJRyAgPSAyLCANCit9IEVfR3BvblNsZWVwQWN0aW9uOw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRV9HUE9OX1NMRUVQX01PREVfRE9fTk9USElORyA9IDAsIA0KKyAgICBFX0dQT05fU0xFRVBfTU9ERV9UWCAgICAgICAgID0gMSwgDQorICAgIEVfR1BPTl9TTEVFUF9NT0RFX1RYX1JYICAgICAgPSAyLCANCit9IEVfR3BvblNsZWVwTW9kZTsNCisNCiAvKiBUeXBlZGVmcw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogLyogVFggQ291bnRlcnMgKi8NCkBAIC0yOTIsNiArMzE3LDMyIEBACiAgIE1WX1UzMiBob2xkb3ZlclRpbWU7DQogfVNfRXBvbklvY3RsSG9sZE92ZXI7DQogDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVpbnQxNl90IG9wdGljYWxfbG9zX3RpbWU7DQorICAgIHVpbnQxNl90IG1hY19sb3NfdGltZTsNCit9IFNfRXBvbklvY3RsTG9zVGltZTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgdWludDE2X3QgYWN0aW9uOw0KKyAgICB1aW50MTZfdCB0aW1lOw0KK30gU19FcG9uSW9jdGxUeENvbnRyb2w7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVpbnQ4X3QgIGVhcmx5V2FrZVVwOw0KKyAgICB1aW50NjRfdCBtYXhTbGVlcER1cmF0aW9uOw0KK30gU19FcG9uSW9jdGxQb3dlclNhdmluZzsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgdWludDhfdCAgYWN0aW9uOw0KKyAgICB1aW50OF90ICBzbGVlcE1vZGU7DQorICAgIHVpbnQzMl90IHNsZWVwRHVyYXRpb247DQorICAgIHVpbnQzMl90IHdhaXREdXJhdGlvbjsNCit9IFNfRXBvbklvY3RsQ29udHJvbFNsZWVwOw0KKw0KIC8qIFNpbGVuY2UgKi8NCiB0eXBlZGVmIHN0cnVjdA0KIHsNCkBAIC0zMzUsNiArMzg2LDExIEBACiBNVl9TVEFUVVMgb251RXBvbk1uZ0ludGVyZmFjZVJlbGVhc2Uodm9pZCk7DQogdm9pZCAgICAgIG9udUVwb25NaU5vdGlmeUNhbGxiYWNrKE1WX1UzMiBvbnVTdGF0ZSk7DQogDQorTVZfU1RBVFVTIG9udUVwb25NaUxvc1RpbWVDb25maWcoU19FcG9uSW9jdGxMb3NUaW1lICppb2N0bExvc1RpbWUpOw0KK01WX1NUQVRVUyBvbnVFcG9uTWlUeFBvd2VyQ29udHJvbENvbmZpZyhTX0Vwb25Jb2N0bFR4Q29udHJvbCAqaW9jdGxUeENvbnRyb2wpOw0KK01WX1NUQVRVUyBvbnVFcG9uTWlQb3dlclNhdmluZ0NvbmZpZyhTX0Vwb25Jb2N0bFBvd2VyU2F2aW5nICppb2N0bFBvd2VyU2F2aW5nKTsNCitNVl9TVEFUVVMgb251RXBvbk1pQ29udHJvbFNsZWVwQ29uZmlnKFNfRXBvbklvY3RsQ29udHJvbFNsZWVwICppb2N0bENvbnRyb2xTbGVlcCk7DQorDQogTVZfU1RBVFVTIG12UDJQU3RhcnQodm9pZCk7DQogTVZfU1RBVFVTIG12UDJQU3RvcCh2b2lkKTsNCiAvKiBNYWNyb3MNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5jCmluZGV4IGE0OWQ4MzEuLjY2ZGJiYjAgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5jCkBAIC0xMDEsNyArMTAxLDYgQEAKIC8qIExvY2FsIFZhcmlhYmxlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIE1WX0JPT0wgaW5mb0Vwb25DbnRSZWFkQ2xlYXJJbmQgPSBNVl9UUlVFOwotc3RhdGljIFNfRXBvbklvY3RsRGJhIGlvY3RsRGJhOwogCiAvKiBFeHBvcnQgRnVuY3Rpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtODgyLDE0ICs4ODEsMTUgQEAKIAkJCQkJCQkJCQkiSW50ZXJydXB0XG4iKTsKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFsjUXVldWVdW1RocmVzaF0+IGRnQ2ZnICAgICAgICAgICAgLSBjb25maWd1cmUgRHlpbmcgR2FzcCBEQkEgcmVwb3J0XG4iKTsKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFttb2R1bGVdW0xldmVsXVtPcHRpb25zXSA+IHByaW50TWFzayAtIGNoYW5nZSBwcmludGluZyBvcHRpb25zXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtlbmFibGVdW3BhdHRlcm5dW2J1cnN0XVtkdXJhdGlvbl1cbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgW3BlcmlvZF0gICAgICAgID4gcGF0dGVybiAgICAgICAgICAtIHN0YXJ0IGVuYWJsZVsxXSBvciBzdG9wWzBdIHRyYW5zbWlzc2lvbiIKLQkJCQkJCQkJCQkiIG9mIHBhdHRlcm46IDB4MS0xVCwgMHgyLTJULCAweDgwLVJQQlMiCi0JCQkJCQkJCQkJIi05LCAweDgyLVJQQlMtMTUsIDB4ODMtUlBCUy0yMyBpbiAiCi0JCQkJCQkJCQkJImJ1cnN0OiAwLXN0YXRpYywgMS0gcGVyaW9kaWMgZm9yICIKLQkJCQkJCQkJCQkiZHVyYXRpb246IHBlYWMgdGltZSBpbnRlcnZhbCIKLQkJCQkJCQkJCQkiW21pY3JvIHNlY29uZHNdIGluIHBlcmlvZCAtIGZ1bGwgY2ljbGUiCi0JCQkJCQkJCQkJIiB0aW1lIGludGVydmFsW21pY3JvIHNlY29uZHNdXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFthY3Rpb25dW3RpbWVdICA+IHR4UG93ZXJDb250cm9sICAgLSBhY3Rpb24oMDplbmFibGUsMTpkaXNhYmxlLDI6c2h1dCBkb3duIHRoZW4gZW5hYmxlKVxuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbZW5hYmxlXVt0aW1lXSAgPiBwb3dlclNhdmluZyAgICAgIC0gY29uZmlndXJlIGVhcmx5IHdha2V1cCBhbmQgbWF4IHNsZWVwIGR1cmF0aW9uXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFthY3Rpb25dW21vZGVdW3RpbWVdW3RpbWVdID4gc2xlZXBDb250cm9sIC0gY29uZmlndXJlIHNsZWVwL3dha2V1cCBwYXJhbWV0ZXJzXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtwYXR0ZXJuTVNCXVtwYXR0ZXJuXVtwYXR0ZXJuTFNCXVxuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgPiBwcmJzVXNlckRlZmluZWRQYXR0ZXJuIC0gODBiaXQgdXNlciBkYXRhOiAxNmJpdCBwYXR0ZXJuTUxTQiArIDMyYml0IHBhdHRlcm4gKyAzMmJpdCBwYXR0ZXJuTFNCXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtlbmFibGVdW3BhdHRlcm5dW2J1cnN0XVtkdXJhdGlvbl1bcGVyaW9kXSBcbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgID4gcHJic1ByZURlZmluZWRQYXR0ZXJuIC0gc3RhcnQgZW5hYmxlWzFdIG9yIHN0b3AgWzBdIHRyYW5zbWlzc2lvbiBvZlxuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogMHgxLTFULCAweDItMlQsIDB4NS1Vc2VyLCAweDgwLVBSQlMtNywgMHg4MS1QUkJTLTksIDB4ODItUFJCUy0xNSwgMHg4My1QUkJTLTIzXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXJzdDogMC1zdGF0aWMsIDEtcGVyaW9kaWNcbiIpOwogCWlmIChkZXZJZCA9PSBNVl82NjAxX0RFVl9JRCkgewogCQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtsYXRlbmN5XVtzaXplXSA+IHBjc0ZyYW1lTGltaXRzICAgLSBDb25maWd1cmUgUENTIEZyYW1lIFNpemUgIgogCQkJCQkJCQkJCQkibGltaXRzXG4iKTsKQEAgLTkwNCw2ICs5MDQsNyBAQAogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgY2F0IHByaW50TWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZHVtcCBwcmludGluZyBvcHRpb25zXG4iKTsKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBjYXQgZGJhU3dDZmdQcmludCAgICAgICAgICAgICAgICAgICAgICAgLSBkdW1wIERCQSBjZmdcbiIpOworICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgY2F0IHByYnNVc2VyUGF0dGVybiAgICAgICAgICAgICAgICAgICAgIC0gZHVtcCBQUkJTIHVzZXIgZGVmaW5lZCBwYXR0ZXJuXG4iKTsKIAlpZiAoZGV2SWQgPT0gTVZfNjYwMV9ERVZfSUQpIHsKIAkJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgY2F0IHBjc0ZyYW1lTGltaXRzICAgICAgICAgICAgICAgICAgICAgLSBkdW1wIFBDUyBGcmFtZSBTaXplIExpbWl0c1xuIik7CiAJCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGNhdCByeERhdGFGaWZvVGhyZXNoICAgICAgICAgICAgICAgICAgIC0gZHVtcCBSWCBQYXJzZXIgRGF0YSBGSUZPICIKQEAgLTEwODksNiArMTA5MCw3IEBACiAgIE1WX1UzMiAgICAgICAgIGlkeDsKICAgTVZfVTMyICAgICAgICAgcXNldGlkeDsKICAgTVZfVTMyICAgICAgICAgbnVtT2ZRdWV1ZXMgPSAwOworICBTX0Vwb25Jb2N0bERiYSBpb2N0bERiYTsKIAogICBtZW1zZXQgKCZpb2N0bERiYSwgMCwgc2l6ZW9mKFNfRXBvbklvY3RsRGJhKSk7CiAKQEAgLTEyODMsNyArMTI4NSwzMiBAQAogICByZXR1cm4ob2ZmKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvblVpQ2ZnUHJic1VzZXJQYXR0ZXJuCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHByaW50IFBSQlMgdXNlciBkZWZpbmVkIHBhdHRlcm4KKyoqCisqKiAgUEFSQU1FVEVSUzogIGNoYXIqIGJ1ZgorKioKKyoqICBPVVRQVVRTOiAgICAgY2hhciogYnVmCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBvbnVFcG9uVWlDZmdQcmJzVXNlclBhdHRlcm4oY2hhciogYnVmKQoreworICBNVl9VMzIgdXNlclBhdHRlcm5bM107CisgIGludCBvZmYgPSAwOwogCisgIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVybkdldCh1c2VyUGF0dGVybik7CisKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJQUkJTIFVzZXIgUGF0dGVybiAweCU0eCU4eCU4eFxuIiwKKwkJICAgICB1c2VyUGF0dGVyblsyXSwgdXNlclBhdHRlcm5bMV0sIHVzZXJQYXR0ZXJuWzBdKTsKKworICByZXR1cm4ob2ZmKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCkBAIC0xMzkwLDEwICsxNDE3LDExIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgotKiogIG9udUVwb25VaUNmZ1NldFBhdHRlcm5CdXJzdAorKiogIG9udUVwb25VaUNmZ1NldFVzZXJQYXR0ZXJuQnVyc3QKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqKgotKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29uZmlnIHN0YXJ0L3N0b3Agb251IHRyYW5zbWlzc2lvbiBvZiBwYXR0ZXJuIGJ1cnN0CisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb25maWcgc3RhcnQvc3RvcCBvbnUgdHJhbnNtaXNzaW9uIG9mIHVzZXIgZGVmaW5lZAorKiogICAgICAgICAgICAgICBwYXR0ZXJuIGJ1cnN0CiAqKgogKiogIFBBUkFNRVRFUlM6ICBjaGFyKiBidWYKICoqCkBAIC0xNDAyLDcgKzE0MzAsMzMgQEAKICoqICBSRVRVUk5TOiAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG9udUVwb25VaUNmZ1NldFBhdHRlcm5CdXJzdChNVl9VMzIgZW5hYmxlLCBNVl9VMzIgcGF0dGVybiwgTVZfVTMyIGJ1cnN0LCBNVl9VMzIgZHVyYXRpb24sIE1WX1UzMiBwZXJpb2QpCit2b2lkIG9udUVwb25VaUNmZ1NldFVzZXJQYXR0ZXJuQnVyc3QoTVZfVTMyIHBhdHRlcm5NU0IsIE1WX1UzMiBwYXR0ZXJuLCBNVl9VMzIgcGF0dGVybkxTQikKK3sKKyAgTVZfVTMyIHVzZXJQYXR0ZXJuWzNdOworCisgIHVzZXJQYXR0ZXJuWzBdID0gcGF0dGVybkxTQjsKKyAgdXNlclBhdHRlcm5bMV0gPSBwYXR0ZXJuOworICB1c2VyUGF0dGVyblsyXSA9IHBhdHRlcm5NU0I7CisKKyAgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuU2V0KHVzZXJQYXR0ZXJuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvblVpQ2ZnU2V0RGVmaW5lZFBhdHRlcm5CdXJzdAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb25maWcgc3RhcnQvc3RvcCBvbnUgdHJhbnNtaXNzaW9uIG9mIHByZS1kZWZpbmVkCisqKiAgICAgICAgICAgICAgIHBhdHRlcm4gYnVyc3QKKyoqCisqKiAgUEFSQU1FVEVSUzogIGNoYXIqIGJ1ZgorKioKKyoqICBPVVRQVVRTOiAgICAgY2hhciogYnVmCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvblVpQ2ZnU2V0RGVmaW5lZFBhdHRlcm5CdXJzdChNVl9VMzIgZW5hYmxlLCBNVl9VMzIgcGF0dGVybiwgTVZfVTMyIGJ1cnN0LCBNVl9VMzIgZHVyYXRpb24sIE1WX1UzMiBwZXJpb2QpCiB7CiAgIGlmIChlbmFibGUgPT0gMCkKICAgewpAQCAtMTQxNyw2ICsxNDcxLDEzOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKKyoqICBvbnVFcG9uVWlDZmdMb3NUaW1lCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHRpbWUgZHVyYXRpb24gdG8gYmUgdXNlZCAKKyoqICAgICAgICAgICAgICAgd2hlbiBubyBvcHRpY2FsIGRldGVjdGVkIGFuZCBubyBHQVRFIE1QQ1BEVSByZWNlaXZlZAorKioKKyoqICBQQVJBTUVURVJTOiAgb3B0aWNhbExvc1RpbWUgLSB0aW1lIGR1cmF0aW9uIHRvIGJlIHVzZWQgd2hlbiBubyBvcHRpY2FsIGRldGVjdGVkCisqKiAgICAgICAgICAgICAgIG1hY0xvc1RpbWUgICAgIC0gdGltZSBkdXJhdGlvbiB0byBiZSB1c2VkIHdoZW4gbm8gR0FURSBNUENQRFUgcmVjZWl2ZWQKKyoqICBPVVRQVVRTOiAgICAgdm9pZAorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25VaUNmZ0xvc1RpbWUoTVZfVTMyIG9wdGljYWxMb3NUaW1lLCBNVl9VMzIgbWFjTG9zVGltZSkKK3sKKyAgICBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZVNldChvcHRpY2FsTG9zVGltZSk7CisgICAgb251RXBvbkRiT251TWFjTG9zVGltZVNldChtYWNMb3NUaW1lKTsKKworICAgIC8qIElmIHRoZSBob2xkb3ZlciB0aW1lciBpcyBub3QgYWN0aXZlLCB3ZSBhZGQgdGhlIE9wdGljYWxMb3NUaW1lciB0byB0aGUgaG9sZG92ZXIgdGltZSBhbmQgc2F2ZSAqLworICAgIGlmIChvbnVQb25SZXNvdXJjZVRibF9zLm9udVBvbkhvbGRvdmVyVGltZXJJZC5vbnVQb25UaW1lckFjdGl2ZSA9PSBPTlVfUE9OX1RJTUVSX05PVF9BQ1RJVkUpCisgICAgeworICAgICAgICAvKiBBZGQgdGhlIGNvbmZpZ3VyZWQgT3B0TG9zVGltZSB0byBob2xkb3ZlciB0aW1lIGFuZCBzYXZlIGZvciBuZXh0IGhvbGRvdmVyICovCisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVQb25Ib2xkb3ZlclRpbWVySWQpLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb251RXBvbkRiT251SG9sZG92ZXJUaW1lR2V0KCkgKyBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZUdldCgpLCAwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25VaUNmZ1R4UG93ZXJDb250cm9sCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbnRyb2xzIHRoZSBUWCBwb3dlciBvbiBhbmQgb2ZmCisqKgorKiogIFBBUkFNRVRFUlM6ICBhY3Rpb24gLSB0dXJuIG9uIGFuZCB0dXJuIG9mZiB0aGUgVFggcG93ZXIsIG9yIHR1cm4gb2ZmIGFmdGVyIAorKiogICAgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHRpbWUgZHVyYXRpb24uCisqKiAgICAgICAgICAgICAgIHRpbWUgICAtIHRpbWUgZHVyYXRpb24gdG8gYmUgZXhwaXJlZCBiZWZvcmUgdHVybmluZyBvZmYgVFgKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkxBU0UKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uVWlDZmdUeFBvd2VyQ29udHJvbChNVl9VMzIgYWN0aW9uLCBNVl9VMzIgdGltZSkKK3sKKyAgICBpZiAoYWN0aW9uID09IEVfRVBPTl9JT0NUTF9FTkFCTEVfVFgpCisgICAgeworICAgICAgICBvbnVQb25UaW1lckRpc2FibGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25UeENvbnRyb2xUaW1lcklkKSk7CisgICAgICAgIG9udVBvblR4UG93ZXJPbihNVl9UUlVFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYWN0aW9uID09IEVfRVBPTl9JT0NUTF9ESVNBQkxFX1RYKQorICAgIHsKKyAgICAgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uVHhDb250cm9sVGltZXJJZCkpOworICAgICAgICBvbnVQb25UeFBvd2VyT24oTVZfRkFMU0UpOworICAgIH0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9FUE9OX0lPQ1RMX0RJU0FCTEVfVFhfREVMQVkpCisgICAgeyAgICAgICAgCisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uVHhDb250cm9sVGltZXJJZCksIDAsIHRpbWUsIDEpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvblVpQ2ZnUG93ZXJTYXZpbmcKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGFyYW1ldGVycyBmb3IgcG93ZXIgc2F2aW5nIG1vZGUKKyoqCisqKiAgUEFSQU1FVEVSUzogIGVhcmx5V2FrZXVwIC0gc2V0IHRoZSBhYmlsaXR5IG9mIHN1cHBvcnRpbmcgZWFybHkgd2FrZSB1cAorKiogICAgICAgICAgICAgICBtYXhTbGVlcER1cmF0aW9uIC0gdGltZSBwZXJpb2QgZm9yIGtlZXBpbmcgcG93ZXIgc2F2aW5nIG1vZGUKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkxBU0UKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uVWlDZmdQb3dlclNhdmluZyhNVl9VMzIgZWFybHlXYWtldXAsIE1WX1UzMiBtYXhTbGVlcER1cmF0aW9uKQoreyAgICAKKyAgICBpZiAoKG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSArIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uR2V0KCkpID49IG1heFNsZWVwRHVyYXRpb24pCisgICAgeworICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsCisgICAgICAgIAkgICAgICAgIkVSUk9SOiBXcm9uZyBwYXJhbWV0ZXJzLCBzbGVlcCglZCkgKyB3YWtldXAoJWQpID49IG1heFNsZWVwRHVyYXRpb24oJWQpXHJcbiIsIAorICAgICAgICAJICAgICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSwgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKSwgCisgICAgICAgIAkgICAgICAgbWF4U2xlZXBEdXJhdGlvbik7CisKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9QQVJBTTsKKyAgICB9CisKKyAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldChlYXJseVdha2V1cCk7CisgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uU2V0KG1heFNsZWVwRHVyYXRpb24pOworCisgICAgaWYgKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZC5vbnVQb25UaW1lckFjdGl2ZSA9PSBPTlVfUE9OX1RJTUVSX0FDVElWRSkKKyAgICB7CisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkKSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNsZWVwRHVyYXRpb24sIDEpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvblVpQ2ZnQ29udHJvbFNsZWVwCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHRyaWdnZXJzIHRoZSBhY3Rpb24gb2YgcG93ZXIgbW9kZSB0cmFuc2Zvcm1hdGlvbgorKioKKyoqICBQQVJBTUVURVJTOiAgYWN0aW9uICAgICAgICAgLSBlbmFibGUsIGRpc2FibGUgb3IgY29uZmlndXJlCisqKiAgICAgICAgICAgICAgIHNsZWVwTW9kZSAgICAgIC0gdHVybiBvZmYgdHggb3IgdHgvcngKKyoqICAgICAgICAgICAgICAgc2xlZXBEdXJhdGlvbiAgLSBwZXJpb2RpY2FsIHRpbWUgZHVyYXRpb24gZm9yIHNsZWVwCisqKiAgICAgICAgICAgICAgIHdha2V1cER1cmF0aW9uIC0gcGVyaW9kaWNhbCB0aW1lIGR1cmF0aW9uIGZvciB3YWtldXAKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE5vbmUKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uVWlDZmdDb250cm9sU2xlZXAoTVZfVTMyIGFjdGlvbiwgTVZfVTMyIHNsZWVwTW9kZSwgTVZfVTMyIHNsZWVwRHVyYXRpb24sIE1WX1UzMiB3YWtldXBEdXJhdGlvbikKK3sKKyAgICBpZiAoYWN0aW9uID09IEVfR1BPTl9TTEVFUF9BQ1RJT05fRElTQUJMRSkKKyAgICB7CisgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybERpc2FibGUoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYWN0aW9uID09IEVfR1BPTl9TTEVFUF9BQ1RJT05fRU5BQkxFKQorICAgIHsKKyAgICAgICAgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0dQT05fU0xFRVBfQUNUSU9OX0NPTkZJRykKKyAgICB7CisgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybENmZyhzbGVlcE1vZGUsIHNsZWVwRHVyYXRpb24sIHdha2V1cER1cmF0aW9uKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgogKiogIG9udUVwb25VaUNmZ1NldFBjc0ZyYW1lTGltaXRzCiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKioKQEAgLTE1NzMsOSArMTc2MCw5IEBACiAJCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiRmFpbGVkIHRvIG9idGFpbiAySyBwYWNrZXQgc3VwcG9ydCByZWxhdGVkIHJlZ2lzdGVyIHZhbHVlIVxyXG4iKTsKIAllbHNlIHsKIAkJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJcclxuIik7Ci0JCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiUGNzRnJhbWVTaXplTGltaXRTaXplICAgID0gJSNkXHJcbiIsIGZyYW1lU2l6ZUxpbWl0U2l6ZSk7Ci0gICAgICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiUGNzRnJhbWVTaXplTGltaXRMYXRlbmN5ID0gJSNkXHJcbiIsIGZyYW1lU2l6ZUxpbWl0TGF0ZW5jeSk7Ci0gICAgICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiRGF0YUZpZm9UaHJlc2hvbGQgICAgICAgID0gJSNkXHJcbiIsIGRhdGFGaWZvVGhyZXNob2xkKTsKKwkJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJQY3NGcmFtZVNpemVMaW1pdFNpemUgICAgPSAlZFxyXG4iLCBmcmFtZVNpemVMaW1pdFNpemUpOworICAgICAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIlBjc0ZyYW1lU2l6ZUxpbWl0TGF0ZW5jeSA9ICVkXHJcbiIsIGZyYW1lU2l6ZUxpbWl0TGF0ZW5jeSk7CisgICAgICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiRGF0YUZpZm9UaHJlc2hvbGQgICAgICAgID0gJWRcclxuIiwgZGF0YUZpZm9UaHJlc2hvbGQpOwogCX0KIAogCXJldHVybihvZmYpOwpAQCAtMTg0OCw2ICsyMDM1LDggQEAKIAkJcmV0dXJuKG9udUVwb25VaUNmZ0RiYUNmZ1ByaW50KGJ1ZikpOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRiYVN0YXRpY0NmZ1ByaW50IikpCiAJCXJldHVybihvbnVFcG9uVWlDZmdEYmFTdGF0aWNDZmdQcmludChidWYpKTsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmJzVXNlclBhdHRlcm4iKSkKKyAgICAgICAgcmV0dXJuIChvbnVFcG9uVWlDZmdQcmJzVXNlclBhdHRlcm4oYnVmKSk7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiaGVscENmZyIpKQogCQlyZXR1cm4ob251RXBvblVpQ2ZnSGVscFNob3coYnVmKSk7CiAJZWxzZSBpZiAoZGV2SWQgPT0gTVZfNjYwMV9ERVZfSUQpIHsKQEAgLTE5MjAsOCArMjEwOSwyMiBAQAogCQlvbnVFcG9uVWlDZmdEZ0NmZygoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIpOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByaW50TWFzayIpKQkJCQkJLyogbW9kdWxlLCBwcmludCBsZXZlbCwgb3B0aW9ucyAqLwogCQlwb25PbnVDaGFuZ2VQcmludFN0YXR1cygoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zKTsKLQllbHNlIGlmICghc3RyY21wKG5hbWUsICJwYXR0ZXJuIikpCi0JCW9udUVwb25VaUNmZ1NldFBhdHRlcm5CdXJzdCgoTVZfVTMyKXBhcmFtMSwoTVZfVTMyKXBhcmFtMiwoTVZfVTMyKXBhcmFtMywoTVZfVTMyKXBhcmFtNCwoTVZfVTMyKXBhcmFtNSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidHhQb3dlckNvbnRyb2wiKSkKKyAgICB7CisgICAgICAgIG9udUVwb25VaUNmZ1R4UG93ZXJDb250cm9sKChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMik7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInBvd2VyU2F2aW5nIikpCisgICAgeworICAgICAgICBvbnVFcG9uVWlDZmdQb3dlclNhdmluZygoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzbGVlcENvbnRyb2wiKSkKKyAgICB7CisgICAgICAgIG9udUVwb25VaUNmZ0NvbnRyb2xTbGVlcCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zLCAoTVZfVTMyKXBhcmFtNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByYnNVc2VyRGVmaW5lZFBhdHRlcm4iKSkKKyAgICAgICAgb251RXBvblVpQ2ZnU2V0VXNlclBhdHRlcm5CdXJzdCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zKTsgLyogODBiaXQgdXNlciBkYXRhOiAxNmJpdCBwYXR0ZXJuTUxTQiArIDMyYml0IHBhdHRlcm4gKyAzMmJpdCBwYXR0ZXJuTFNCXG4iICovCisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJic1ByZURlZmluZWRQYXR0ZXJuIikpCisgICAgICAgIG9udUVwb25VaUNmZ1NldERlZmluZWRQYXR0ZXJuQnVyc3QoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMyAsIChNVl9VMzIpcGFyYW00ICwgKE1WX1UzMilwYXJhbTUpOyAgLyogcGF0dGVybiB0eXBlLCBidXJzdCB0eXBlLCBkdXJhdGlvbiwgcGVyaW9kICovCiAJZWxzZSBpZiAoZGV2SWQgPT0gTVZfNjYwMV9ERVZfSUQpIHsKIAkJaWYgKCFzdHJjbXAobmFtZSwgInBjc0ZyYW1lTGltaXRzIikpCiAJCQlvbnVFcG9uVWlDZmdTZXRQY3NGcmFtZUxpbWl0cygoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIpOwpAQCAtMTk2NCwxMiArMjE2NywxNyBAQAogc3RhdGljIERFVklDRV9BVFRSKHNpbGVuY2VTaW0sICAgICAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihkZ0RlYnVnLCAgICAgICAgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZGdDZmcsICAgICAgICAgICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKHBhdHRlcm4sICAgICAgICAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmJzVXNlclBhdHRlcm4sICAgICAgICAgU19JUlVTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJic1VzZXJEZWZpbmVkUGF0dGVybiwgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHByYnNQcmVEZWZpbmVkUGF0dGVybiwgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihwcmludE1hc2ssICAgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHBjc0ZyYW1lTGltaXRzLCAgICAgICAgICBTX0lXVVNSIHwgU19JUlVTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIocnhEYXRhRmlmb1RocmVzaCwgICAgICAgIFNfSVdVU1IgfCBTX0lSVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihkZG1UeFBvbGFyaXR5LCAgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIocGt0MmtFbiwgICAgICAgICAgICAgICAgIFNfSVdVU1IgfCBTX0lSVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0eFBvd2VyQ29udHJvbCwgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocG93ZXJTYXZpbmcsICAgICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHNsZWVwQ29udHJvbCwgICAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihoZWxwQ2ZnLCAgICAgICAgICAgICAgICAgU19JUlVTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiAgCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2ZnX2F0dHJzW10gPSB7CkBAIC0xOTkwLDEyICsyMTk4LDE3IEBACiAJJmRldl9hdHRyX3NpbGVuY2VTaW0uYXR0ciwKIAkmZGV2X2F0dHJfZGdEZWJ1Zy5hdHRyLAogCSZkZXZfYXR0cl9kZ0NmZy5hdHRyLAotCSZkZXZfYXR0cl9wYXR0ZXJuLmF0dHIsCisJJmRldl9hdHRyX3ByYnNVc2VyUGF0dGVybi5hdHRyLAorCSZkZXZfYXR0cl9wcmJzVXNlckRlZmluZWRQYXR0ZXJuLmF0dHIsCisJJmRldl9hdHRyX3ByYnNQcmVEZWZpbmVkUGF0dGVybi5hdHRyLAogCSZkZXZfYXR0cl9wcmludE1hc2suYXR0ciwKIAkmZGV2X2F0dHJfcGNzRnJhbWVMaW1pdHMuYXR0ciwKIAkmZGV2X2F0dHJfcnhEYXRhRmlmb1RocmVzaC5hdHRyLCAKIAkmZGV2X2F0dHJfZGRtVHhQb2xhcml0eS5hdHRyLAogCSZkZXZfYXR0cl9wa3Qya0VuLmF0dHIsIAorCSZkZXZfYXR0cl90eFBvd2VyQ29udHJvbC5hdHRyLCAKKwkmZGV2X2F0dHJfcG93ZXJTYXZpbmcuYXR0ciwgCisJJmRldl9hdHRyX3NsZWVwQ29udHJvbC5hdHRyLCAKIAkmZGV2X2F0dHJfaGVscENmZy5hdHRyLAogCU5VTEwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5oCmluZGV4IGY4YzljZGUuLmE2ZTkyZjEgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5oCkBAIC05Niw2ICs5NiwxMiBAQAogTVZfU1RBVFVTIG9udUVwb25Vc3JJbnRlcmZhY2VDcmVhdGUodm9pZCk7DQogTVZfU1RBVFVTIG9udUVwb25Vc3JJbnRlcmZhY2VSZWxlYXNlKHZvaWQpOw0KIA0KK3ZvaWQgb251RXBvblVpQ2ZnTG9zVGltZShNVl9VMzIgb3B0aWNhbExvc1RpbWUsIE1WX1UzMiBtYWNMb3NUaW1lKTsNCit2b2lkIG9udUVwb25VaUNmZ1R4UG93ZXJDb250cm9sKE1WX1UzMiBhY3Rpb24sIE1WX1UzMiB0aW1lKTsNCit2b2lkIG9udUVwb25VaUNmZ1Bvd2VyU2F2aW5nKE1WX1UzMiBlYXJseVdha2V1cCwgTVZfVTMyIG1heFNsZWVwRHVyYXRpb24pOw0KK3ZvaWQgb251RXBvblVpQ2ZnQ29udHJvbFNsZWVwKE1WX1UzMiBhY3Rpb24sIE1WX1UzMiBzbGVlcE1vZGUsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WX1UzMiBzbGVlcER1cmF0aW9uLCBNVl9VMzIgd2FrZXVwRHVyYXRpb24pOw0KKw0KIC8qIE1hY3Jvcw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgIA0KIA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZ3Bvbi9ncG9uT251TG54S3NVSS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9ncG9uL2dwb25PbnVMbnhLc1VJLmMKaW5kZXggZDNiZjVlZi4uY2Y0NTA3NSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9ncG9uL2dwb25PbnVMbnhLc1VJLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9ncG9uL2dwb25PbnVMbnhLc1VJLmMKQEAgLTI5NDYsMTAgKzI5NDYsMTEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKiogIG9udUdwb25VaUNmZ1NldFBhdHRlcm5CdXJzdAorKioqKiAgb251R3BvblVpQ2ZnU2V0VXNlclBhdHRlcm5CdXJzdAogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCi0qKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb25maWcgc3RhcnQgb251IHRyYW5zbWlzc2lvbiBvZiBwYXR0ZXJuIGJ1cnN0CisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb25maWcgc3RhcnQgb251IHRyYW5zbWlzc2lvbiBvZiB1c2VyLWRlZmluZWQKKyoqICAgICAgICAgICAgICAgcGF0dGVybiBidXJzdAogKioKICoqICBQQVJBTUVURVJTOiAgY2hhciogYnVmCiAqKgpAQCAtMjk1OCwxMSArMjk1OSwzNCBAQAogKiogIFJFVFVSTlM6ICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgb251R3BvblVpQ2ZnU2V0UGF0dGVybkJ1cnN0KE1WX1UzMiBlbmFibGUsTVZfVTMyIHBhdHRlcm4sIE1WX1UzMiBidXJzdCwgTVZfVTMyIGR1cmF0aW9uLCBNVl9VMzIgcGVyaW9kKQordm9pZCBvbnVHcG9uVWlDZmdTZXRVc2VyUGF0dGVybkJ1cnN0KE1WX1UzMiBwYXR0ZXJuTVNCLCBNVl9VMzIgcGF0dGVybiwgTVZfVTMyIHBhdHRlcm5MU0IpCit7CisgIE1WX1UzMiB1c2VyUGF0dGVyblszXTsKKworICB1c2VyUGF0dGVyblswXSA9IHBhdHRlcm5MU0I7CisgIHVzZXJQYXR0ZXJuWzFdID0gcGF0dGVybjsKKyAgdXNlclBhdHRlcm5bMl0gPSBwYXR0ZXJuTVNCOworCisgIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVyblNldCh1c2VyUGF0dGVybik7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKiAgb251R3BvblVpQ2ZnU2V0RGVmaW5lZFBhdHRlcm5CdXJzdAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb25maWcgc3RhcnQgb251IHRyYW5zbWlzc2lvbiBvZiBwcmUtZGVmaW5lZAorKiogICAgICAgICAgICAgICBwYXR0ZXJuIGJ1cnN0CisqKgorKiogIFBBUkFNRVRFUlM6ICBjaGFyKiBidWYKKyoqCisqKiAgT1VUUFVUUzogICAgIGNoYXIqIGJ1ZgorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUdwb25VaUNmZ1NldERlZmluZWRQYXR0ZXJuQnVyc3QoTVZfVTMyIGVuYWJsZSwgTVZfVTMyIHBhdHRlcm4sIE1WX1UzMiBidXJzdCwgTVZfVTMyIGR1cmF0aW9uLCBNVl9VMzIgcGVyaW9kKQogewogCi0gICAgaWYgKGVuYWJsZSA9PSAwKQotICAgIHsKKyAgICBpZiAoZW5hYmxlID09IDApIHsKICAgICAgIG9udVBvblBhdHRlcm5CdXJzdE9mZigpOwogICAgIH0KICAgICBlbHNlCkBAIC0zMTkwLDYgKzMyMTQsMzMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCisqKiAgb251R3BvblVpQ2ZnUHJic1VzZXJQYXR0ZXJuCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHByaW50IFBSQlMgdXNlciBkZWZpbmVkIHBhdHRlcm4KKyoqCisqKiAgUEFSQU1FVEVSUzogIGNoYXIqIGJ1ZgorKioKKyoqICBPVVRQVVRTOiAgICAgY2hhciogYnVmCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBvbnVHcG9uVWlDZmdQcmJzVXNlclBhdHRlcm4oY2hhciogYnVmKQoreworICBNVl9VMzIgdXNlclBhdHRlcm5bM107CisgIGludCBvZmYgPSAwOworCisgIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVybkdldCh1c2VyUGF0dGVybik7CisKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJQUkJTIFVzZXIgUGF0dGVybiAweCU0eCU4eCU4eFxuIiwKKwkJICAgICB1c2VyUGF0dGVyblsyXSwgdXNlclBhdHRlcm5bMV0sIHVzZXJQYXR0ZXJuWzBdKTsKKworICByZXR1cm4ob2ZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCiAqKiAgb251R3BvblVpU3luY0xvZ0VuYWJsZQogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCkBAIC0zMjY3LDE3ICszMzE4LDE1IEBACiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbbW9kdWxlXSBbTGV2ZWxdIFtPcHRpb25zXSA+IHByaW50TWFzayAgICAgICAtIGNoYW5nZSBwcmludGluZyBvcHRpb25zXG4iKTsKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtzdGF0ZV0gICAgICAgICAgICAgICAgICAgID4gYWRtaW5DZmcgICAgICAgIC0gIgogCQkJCQkJImNoYW5nZSBQT04gQkUgKFRYIEVOKSBzdGF0ZSAwPUVuYWJsZSwgMT1EaXNhYmxlXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtlbmFibGVdW3BhdHRlcm5dW2J1cnN0XVtkdXJhdGlvbl1bcGVyaW9kXSA+IHBhdHRlcm5cbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAiCi0JCQkJCQkic3RhcnQgZW5hYmxlWzFdIG9yIHN0b3AgWzBdIHRyYW5zbWlzc2lvbiBvZlxuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLQkJCQkJCSJwYXR0ZXJuOiAweDEtMVQsIDB4Mi0yVCwgMHg4MC1SUEJTLTksIDB4ODItUlBCUy0xNSwgMHg4My1SUEJTLTIzXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCQkJCQkJImJ1cnN0OiAwLXN0YXRpYywgMS1wZXJpb2RpY1xuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLQkJCQkJCSJkdXJhdGlvbjogcGVhayB0aW1lIGludGVydmFsW21pY3JvIHNlY29uZHNdXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCQkJCQkJInBlcmlvZCAtIGZ1bGwgY2ljbGUgdGltZSBpbnRlcnZhbFttaWNybyBzZWNvbmRzXVxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW3BhdHRlcm5NU0JdW3BhdHRlcm5dW3BhdHRlcm5MU0JdXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHByYnNVc2VyRGVmaW5lZFBhdHRlcm4gLSAvKiA4MGJpdCB1c2VyIGRhdGE6IDE2Yml0IHBhdHRlcm5NTFNCICsgMzJiaXQgcGF0dGVybiArIDMyYml0IHBhdHRlcm5MU0JcbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtlbmFibGVdW3BhdHRlcm5dW2J1cnN0XVtkdXJhdGlvbl1bcGVyaW9kXVxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBwcmJzUHJlRGVmaW5lZFBhdHRlcm5cbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RhcnQgZW5hYmxlWzFdIG9yIHN0b3AgWzBdIHRyYW5zbWlzc2lvbiBvZlxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiAweDEtMVQsIDB4Mi0yVCwgMHg1LVVzZXIsIDB4ODAtUFJCUy03LCAweDgxLVBSQlMtOSwgMHg4Mi1QUkJTLTE1XG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cnN0OiAwLXN0YXRpYywgMS1wZXJpb2RpY1xuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogcGVhayB0aW1lIGludGVydmFsW21pY3JvIHNlY29uZHNdXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCAtIGZ1bGwgY3ljbGUgdGltZSBpbnRlcnZhbFttaWNybyBzZWNvbmRzXVxuIik7CiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbVDAxIEludGVydmFsXSAgICAgICAgICAgICA+IHQwMUludGVydmFsQ2ZnICAtICIKIAkJCQkJCSJjb25maWcgVDAxIHRpbWVyIGludGVydmFsIGluIG1TXG4iKTsKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtUMDIgSW50ZXJ2YWxdICAgICAgICAgICAgID4gdDAySW50ZXJ2YWxDZmcgIC0gIgpAQCAtMzI5Niw3ICszMzQ1LDcgQEAKIGludCBvbnVHcG9uVWlTeW5jTG9nRW5hYmxlU2hvdygpCiB7CiAgICAgcHJpbnRrKCJUaGUgU3luYyBMb2cgaXMgIik7Ci0gICAgCisKICAgICBpZiAob251R3BvbkxvZ0VuYWJsZSA9PSBNVl9UUlVFKQogICAgIHsKICAgICAgICAgcHJpbnRrKCJlbmFibGVkXHJcbiIpOwpAQCAtMzMwNSw3ICszMzU0LDcgQEAKICAgICB7CiAgICAgICAgIHByaW50aygiZGlzYWJsZWRcclxuIik7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTMzNDIsNiArMzM5MSw4IEBACiAKIAlpZiAoIXN0cmNtcChuYW1lLCAicHJpbnRNYXNrIikpCiAJCXJldHVybiBwb25PbnVQcmludFN0YXR1cyhidWYpOworICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmJzVXNlclBhdHRlcm4iKSkKKyAgCXJldHVybiBvbnVHcG9uVWlDZmdQcmJzVXNlclBhdHRlcm4oYnVmKTsKIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJoZWxwTWlzYyIpKQogCQlyZXR1cm4gb251R3BvblVpTWlzY0hlbHBTaG93KGJ1Zik7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic3luY0xvZ0VuYWJsZSIpKQkvKiBzeW5jIGxvZyBlbmFibGUgb3IgZGlzYWJsZSAqLwpAQCAtMzM5OSw5ICszNDUwLDEwIEBACiAjZW5kaWYgLyogTVZfR1BPTl9QRVJGT1JNQU5DRV9DSEVDSyAqLwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByaW50TWFzayIpKQkJLyogbW9kdWxlLCBwcmludCBsZXZlbCwgb3B0aW9ucyAqLwogCQlwb25PbnVDaGFuZ2VQcmludFN0YXR1cygoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zKTsKLQllbHNlIGlmICghc3RyY21wKG5hbWUsICJwYXR0ZXJuIikpCQkvKiBwYXR0ZXJuIHR5cGUsIGJ1cnN0IHR5cGUsIGR1cmF0aW9uLCBwZXJpb2QgKi8KLQkJb251R3BvblVpQ2ZnU2V0UGF0dGVybkJ1cnN0KChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMgLAotCQkJCQkgICAgKE1WX1UzMilwYXJhbTQgLCAoTVZfVTMyKXBhcmFtNSk7CisgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByYnNVc2VyRGVmaW5lZFBhdHRlcm4iKSkKKyAgICBvbnVHcG9uVWlDZmdTZXRVc2VyUGF0dGVybkJ1cnN0KChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMpOyAvKiA4MGJpdCB1c2VyIGRhdGE6IDE2Yml0IHBhdHRlcm5NTFNCICsgMzJiaXQgcGF0dGVybiArIDMyYml0IHBhdHRlcm5MU0JcbiIgKi8KKyAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJic1ByZURlZmluZWRQYXR0ZXJuIikpCisgICAgb251R3BvblVpQ2ZnU2V0RGVmaW5lZFBhdHRlcm5CdXJzdCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zICwgKE1WX1UzMilwYXJhbTQgLCAoTVZfVTMyKXBhcmFtNSk7ICAvKiBwYXR0ZXJuIHR5cGUsIGJ1cnN0IHR5cGUsIGR1cmF0aW9uLCBwZXJpb2QgKi8KIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJhZG1pbkNmZyIpKQkJLyogYWRtaW4gMD1lbmFibGUgMSA9IGRpc2FibGUgKi8KIAkJb251R3BvblVpRGVidWdBZG1pbk1vZGUoKE1WX1UzMilwYXJhbTEpOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInQwMUludGVydmFsQ2ZnIikpCS8qIFQwMSBpbnRlcnZhbCBpbiBtUyAqLwpAQCAtMzQzNSwxMCArMzQ4NywxMiBAQAogc3RhdGljIERFVklDRV9BVFRSKHBtQ2hlY2ssICAgICAgICAgICAgICAgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihwbUNsZWFyLCAgICAgICAgICAgICAgIFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CiAjZW5kaWYgLyogTVZfR1BPTl9QRVJGT1JNQU5DRV9DSEVDSyAqLwotc3RhdGljIERFVklDRV9BVFRSKHByaW50TWFzaywgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGF0dGVybiwgICAgICAgICAgICAgICBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHByYnNVc2VyRGVmaW5lZFBhdHRlcm4sU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmJzUHJlRGVmaW5lZFBhdHRlcm4sIFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoYWRtaW5DZmcsICAgICAgICAgICAgICBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHByaW50TWFzaywgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoaGVscE1pc2MsICAgICAgICAgICAgICBTX0lSVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHByYnNVc2VyUGF0dGVybiwgICAgICAgU19JUlVTUiB8IFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodDAxSW50ZXJ2YWxDZmcsICAgICAgICBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHQwMkludGVydmFsQ2ZnLCAgICAgICAgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzeW5jTG9nRW5hYmxlLCAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwpAQCAtMzQ1OSwxMCArMzUxMywxMiBAQAogCSZkZXZfYXR0cl9wbUNoZWNrLmF0dHIsCiAJJmRldl9hdHRyX3BtQ2xlYXIuYXR0ciwKICNlbmRpZiAvKiBNVl9HUE9OX1BFUkZPUk1BTkNFX0NIRUNLICovCisJJmRldl9hdHRyX3ByYnNVc2VyRGVmaW5lZFBhdHRlcm4uYXR0ciwKKwkmZGV2X2F0dHJfcHJic1ByZURlZmluZWRQYXR0ZXJuLmF0dHIsCisJJmRldl9hdHRyX2FkbWluQ2ZnLmF0dHIsCiAJJmRldl9hdHRyX3ByaW50TWFzay5hdHRyLAogCSZkZXZfYXR0cl9oZWxwTWlzYy5hdHRyLAotCSZkZXZfYXR0cl9wYXR0ZXJuLmF0dHIsCi0JJmRldl9hdHRyX2FkbWluQ2ZnLmF0dHIsCisJJmRldl9hdHRyX3ByYnNVc2VyUGF0dGVybi5hdHRyLAogCSZkZXZfYXR0cl90MDFJbnRlcnZhbENmZy5hdHRyLAogCSZkZXZfYXR0cl90MDJJbnRlcnZhbENmZy5hdHRyLAogCSZkZXZfYXR0cl9zeW5jTG9nRW5hYmxlLmF0dHIsCkBAIC0zNTA1LDggKzM1NjEsOCBAQAogCWVsc2UgaWYgKGRldklkID09IE1WXzY2MDFfREVWX0lEKSB7CiAJCWlmICghc3RyY21wKG5hbWUsICJhY0NvdXBsaW5nIikpCiAJCQlyZXR1cm4gb251R3BvblVpRGVidWdNYW5hZ2VyQWNDb3VwbGluZ0dldChidWYpOwotCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJhY3RpdmVUeEJtIikpCi0JCQlyZXR1cm4gb251R3BvblVpRGVidWdNYW5hZ2VyQWN0aXZlVHhCaXRtYXBHZXQoYnVmKTsKKwkgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFjdGl2ZVR4Qm0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbnVHcG9uVWlEZWJ1Z01hbmFnZXJBY3RpdmVUeEJpdG1hcEdldChidWYpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM1NjQsNyArMzYyMCw3IEBACiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZmlmb1N1cHBvcnQiKSkJCS8qIGVuYWJsZS9kaXNhYmxlICovCiAJCW9udUdwb25VaURlYnVnTWFuYWdlckZpZm9TdXBwb3J0U2V0KChNVl9VMzIpcGFyYW0xKTsKIAllbHNlIGlmIChkZXZJZCA9PSBNVl82NjAxX0RFVl9JRCkgewotCQlpZiAoIXN0cmNtcChuYW1lLCAiYWNDb3VwbGluZyIpKQkKKwkJaWYgKCFzdHJjbXAobmFtZSwgImFjQ291cGxpbmciKSkKICAgICAgICAgICAgIC8qIG1vZGUsIHRpbWUsIHBhdHRlcm4xLCBwYXR0ZXJuMiAqLwogCQkJb251R3BvblVpRGVidWdNYW5hZ2VyQWNDb3VwbGluZ1NldCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zLCAoTVZfVTMyKXBhcmFtNCk7CiAJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFjdGl2ZVR4Qm0iKSkJCQkJLyogYml0bWFwLCB2YWxpZCAqLwpAQCAtMzYxOSw3ICszNjc1LDcgQEAKIAkmZGV2X2F0dHJfcGxvYW1CdXJzdENmZy5hdHRyLAogCSZkZXZfYXR0cl9jbGVhckZpZm9DbnRzLmF0dHIsCiAJJmRldl9hdHRyX2ZpZm9TdXBwb3J0LmF0dHIsCi0JJmRldl9hdHRyX2FjQ291cGxpbmcuYXR0ciwgCisJJmRldl9hdHRyX2FjQ291cGxpbmcuYXR0ciwKIAkmZGV2X2F0dHJfYWN0aXZlVHhCbS5hdHRyLAogCSZkZXZfYXR0cl9oZWxwUHJvdG8uYXR0ciwKIAlOVUxMCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL3Bvbk9udUxueEtzTUkuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvcG9uT251TG54S3NNSS5jCmluZGV4IDYwYTk2NTMuLmE5Y2I1ZmMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvcG9uT251TG54S3NNSS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvcG9uT251TG54S3NNSS5jCkBAIC0xOTIsMTUgKzE5MiwxOSBAQAogKiogIFJFVFVSTlM6ICAgICAoMCkKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworREVDTEFSRV9NVVRFWChpb2N0bF9sb2NrKTsKKwogaW50IG12UG9uQ2RldklvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQJCQkJcmV0ID0gLUVJTlZBTDsKIAlFX1BvbkRyaXZlck1vZGUgZHJ2TW9kZTsKIAogCisgICAgICAgIGRvd24oJmlvY3RsX2xvY2spOwogCXN3aXRjaCAoY21kKSB7CiAJLyogPT09PT09IE1WUE9OX0lPQ1RMX1NUQVJUID09PT09PT0gKi8KIAljYXNlIE1WUE9OX0lPQ1RMX1NUQVJUOgorCQlwcmludGsoS0VSTl9JTkZPICI9PT09IG12UG9uSW9jdGw6IE1WUE9OX0lPQ1RMX1NUQVJUIGNhbGxlZD09PT1cbiIpOwogCQlpZiAocG9uRGV2LmRydk1vZGUgPT0gRV9QT05fRFJJVkVSX1VOREVGX01PREUpIHsKIAkJCS8qIFRoZSBkcml2ZXIgb25seSBhbG93cyB0cmFuc2l0aW9uIGZyb20gVW5kZWZpbmVkIHRvIEVQT04gb3IgR1BPTiBtb2RlICovCiAJCQlyZXQgPSBnZXRfdXNlcihkcnZNb2RlLCAoRV9Qb25Ecml2ZXJNb2RlIF9fdXNlciAqKWFyZyk7CkBAIC0yOTEsNyArMjk1LDcgQEAKIAogCiBpb2N0bEVycjoKLQorICAgICAgICB1cCgmaW9jdGxfbG9jayk7CiAJcmV0dXJuKHJldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuYwppbmRleCA3ZDVjZDk3Li5jZmI2YjYzIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUJvYXJkLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5jCkBAIC03Nyw2ICs3Nyw3IEBACiAvKiBJbmNsdWRlIEZpbGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInBvbk9udUhlYWRlci5oIgorI2luY2x1ZGUgImVwb25PbnVEYi5oIgogCiAvKiBMb2NhbCBDb25zdGFudAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtOTIsNiArOTMsNyBAQAogCiAvKiBFeHBvcnQgRnVuY3Rpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIE1WX1NUQVRVUyBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX1UzMiBlbmFibGUpOwogCiAvKiBMb2NhbCBGdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC01MzgsNCArNTQwLDEyNiBAQAogICByZXR1cm4oTVZfT0spOwogfQogI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25UeENvbnRyb2xUaW1lckhuZGwKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gaXMgdGhlIHRpbWVyIGNhbGxiYWNrIHdoZW4gdGltZXIgZm9yIAorKiogICAgICAgICAgICAgICBzaHV0dGluZyB0aGUgVHggaXMgZXhwaXJlZAorKioKKyoqICBQQVJBTUVURVJTOiAgdm9pZAorKioKKyoqICBPVVRQVVRTOiAgICAgdm9pZAorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25UeENvbnRyb2xUaW1lckhuZGwodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgCisgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uVHhDb250cm9sVGltZXJJZCkpOworCisgICAgLyogVHVybiBvZmYgdGhlIHR4IHBvd2VyICovCisgICAgb251UG9uVHhQb3dlck9uKE1WX0ZBTFNFKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvbk1heFNsZWVwVGltZXJIbmRsCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGlzIHRoZSB0aW1lciBjYWxsYmFjayB3aGVuIHRpbWVyIGZvciAKKyoqICAgICAgICAgICAgICAga2VlcGluZyBwb3dlciBzYXZpbmcgbW9kZSBpcyBleHBpcmVkCisqKgorKiogIFBBUkFNRVRFUlM6ICB2b2lkCisqKgorKiogIE9VVFBVVFM6ICAgICB2b2lkCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvbk1heFNsZWVwVGltZXJIbmRsKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgIAorICAgIG9udVBvblRpbWVyRGlzYWJsZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZCkpOworCisgICAgaWYgKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfQUNUSVZFKQorICAgIHsKKyAgICAgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQpKTsKKyAgICB9CisKKyAgICAvKiBMZWF2ZSBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9OT1RfUE9XRVJfU0FWSU5HX1NUQVRVUyk7CisKKyAgICAvKiBFbmFibGUgVFgvUlggKi8KKyAgICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX0ZBTFNFKTsKKworICAgIC8qIFNlbmQgU2xlZXBTdGF0dXNVcGRhdGUgYWxhcm0gdG8gT0xUICovCisgICAgLy8gdG9kbworICAgIAorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gaXMgdGhlIHRpbWVyIGNhbGxiYWNrIHdoZW4gcGVyaW9kaWNhbCB0aW1lciBmb3IKKyoqICAgICAgICAgICAgICAgc3dpdGNoaW5nIGJldHdlZW4gc2xlZXAgc3RhdHVzIGFuZCB3YWtldXAgc3RhdHVzIGlzIGV4cGlyZWQKKyoqCisqKiAgUEFSQU1FVEVSUzogIHZvaWQKKyoqCisqKiAgT1VUUFVUUzogICAgIHZvaWQKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgCisgICAgaWYgKG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0KCkgPT0gRV9FUE9OX1BPV0VSX1NBVklOR19TTEVFUF9TVEFUVVMpCisgICAgeworICAgICAgICAvKiBDaGFuZ2UgdGhlIHN0YXR1cyB0byB3YWtldXAgKi8KKyAgICAgICAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQoRV9FUE9OX1BPV0VSX1NBVklOR19XQUtFVVBfU1RBVFVTKTsKKyAgICAgICAgCisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uR2V0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICAvKiBFbmFibGUgVFgvUlggKi8KKyAgICAgICAgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9GQUxTRSk7CisgICAgfQorICAgIGVsc2UgaWYob251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNHZXQoKSA9PSBFX0VQT05fUE9XRVJfU0FWSU5HX1dBS0VVUF9TVEFUVVMpCisgICAgeworICAgICAgICAvKiBDaGFuZ2UgdGhlIHN0YXR1cyB0byBzbGVlcCAqLworICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChFX0VQT05fUE9XRVJfU0FWSU5HX1NMRUVQX1NUQVRVUyk7CisgICAgICAgIAorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICAvKiBEaXNhYmxlIFRYL1JYICovCisgICAgICAgIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfVFJVRSk7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworfQorCiAjZW5kaWYgLyogUE9OX0ZQR0EgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuaAppbmRleCA0NmQxNjljLi5mMGFhYTk5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUJvYXJkLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5oCkBAIC05Myw2ICs5Myw5IEBACiANCiAvKiBHbG9iYWwgZnVuY3Rpb25zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCit2b2lkIG9udUVwb25UeENvbnRyb2xUaW1lckhuZGwodm9pZCk7DQordm9pZCBvbnVFcG9uTWF4U2xlZXBUaW1lckhuZGwodm9pZCk7DQordm9pZCBvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwodm9pZCk7DQogDQogI2lmbmRlZiBQT05fRlBHQQ0KIE1WX1NUQVRVUyBvbnVFcG9uU2VyZGVzSW5pdCh2b2lkKTsNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUxueEtzT3MuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251TG54S3NPcy5jCmluZGV4IGFmM2QzZTUuLjkwNTY0NTUgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251TG54S3NPcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251TG54S3NPcy5jCkBAIC0yNTIsNiArMjUyLDUyIEBACiAgICAgcmV0dXJuKE1WX0VSUk9SKTsNCiAgIH0NCiANCisgICAgLyogT05VIEVQT04gdHhfcG93ZXIgc3VwcGx5IGNvbnRyb2wgdGltZXIgKi8NCisgICAgIHJldGNvZGUgPSBvbnVQb25UaW1lckNyZWF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblR4Q29udHJvbFRpbWVySWQpLCAgICAvKiB0aW1lciBJZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcG9uX1R4Q29udHJvbFRpbWVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGRlc2NyaXB0aW9uICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBUSU1FUl9GVU5DUFRSKW9udUVwb25UeENvbnRyb2xUaW1lckhuZGwsICAgICAgICAgLyogdGltZXIgZnVuY3Rpb24gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lciBmdW5jdGlvbiBwYXJhbSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OVV9QT05fVElNRVJfTk9UX0FDVElWRSAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgdmFsdWUgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJpb2RpYyB2YWx1ZSAqLw0KKyAgICBpZiAocmV0Y29kZSAhPSBNVl9PSykNCisgICAgew0KKyAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLA0KKyAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgRVBPTiBUeCBwb3dlciBjb250cm9sIHRpbWVyIGNyZWF0ZVxuXHIiLCANCisgICAgICAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOw0KKyAgICAgICAgcmV0dXJuIChNVl9FUlJPUik7DQorICAgIH0NCisNCisgICAgIC8qIE9OVSBFUE9OIHNsZWVwIG1vZGU6IG1heCBzbGVlcCB0aW1lciAqLw0KKyAgICAgcmV0Y29kZSA9IG9udVBvblRpbWVyQ3JlYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkKSwgICAgIC8qIHRpbWVyIElkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwb25fTWF4U2xlZXBUaW1lciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZGVzY3JpcHRpb24gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFRJTUVSX0ZVTkNQVFIpb251RXBvbk1heFNsZWVwVGltZXJIbmRsLCAgICAgICAgICAvKiB0aW1lciBmdW5jdGlvbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGZ1bmN0aW9uIHBhcmFtICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05VX1BPTl9USU1FUl9OT1RfQUNUSVZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCB2YWx1ZSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmlvZGljIHZhbHVlICovDQorICAgIGlmIChyZXRjb2RlICE9IE1WX09LKQ0KKyAgICB7DQorICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsDQorICAgICAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBFUE9OIHBvd2VyIHNhdmluZyBtb2RlOiBtYXggc2xlZXAgdGltZXIgY3JlYXRlXG5cciIsIA0KKyAgICAgICAgICAgICAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7DQorICAgICAgICByZXR1cm4gKE1WX0VSUk9SKTsNCisgICAgfQ0KKw0KKyAgICAvKiBPTlUgRVBPTiBzbGVlcCBtb2RlOiBzbGVlcCBkdXJhdGlvbiBhbmQgd2FpdCBkdXJhdGlvbiB0aW1lciAqLw0KKyAgICByZXRjb2RlID0gb251UG9uVGltZXJDcmVhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZCksIC8qIHRpbWVyIElkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBvbl9TbGVlcFdha2VEdXJhdGlvblRpbWVyIiwgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZGVzY3JpcHRpb24gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVElNRVJfRlVOQ1BUUilvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwsICAvKiB0aW1lciBmdW5jdGlvbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGZ1bmN0aW9uIHBhcmFtICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTlVfUE9OX1RJTUVSX05PVF9BQ1RJVkUgLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCB2YWx1ZSAqLyANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJpb2RpYyB2YWx1ZSAqLyANCisgICAgaWYgKHJldGNvZGUgIT0gTVZfT0spDQorICAgIHsNCisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwNCisgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIEVQT04gcG93ZXIgc2F2aW5nIG1vZGU6IHNsZWVwIGFuZCB3YWl0IGR1cmF0aW9uIHRpbWVyIGNyZWF0ZVxuXHIiLCANCisgICAgICAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOw0KKyAgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsNCisgICAgfQ0KKyAgDQorDQogICAvKiBvbnUgZXBvbiBzaWxlbmNlIHRpbWVyICovDQogICBmb3IgKGlkeCA9IDA7IGlkeCA8IEVQT05fTUFYX01BQ19OVU07IGlkeCsrKSANCiAgIHsNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2dwb24vZ3Bvbk9udUxueEtzT3MuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZ3Bvbi9ncG9uT251TG54S3NPcy5jCmluZGV4IGFjZDY1OWUuLjg2YjkyMWMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZ3Bvbi9ncG9uT251TG54S3NPcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZ3Bvbi9ncG9uT251TG54S3NPcy5jCkBAIC0xNTQsNiArMTU0LDggQEAKICAgICBJTklUX1dPUksoKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSAmZ3BvblRjb250Q2xlYW5BbGxXb3JrLCBvbnVHcG9uV3FUY29udEZ1bmMpOw0KICAgICBncG9uVGNvbnRDbGVhbkFsbFdvcmsuYWN0aW9uID0gVENPTlRfQ0xFQU5fQUxMX0VWRU5UOw0KIA0KKyAgICBwcmludGsoIlNUQVJUSU5HIFBPTiBXT1JLIFFVRVVFISEhISFcbiIpOw0KKw0KICAgICByZXR1cm4oTVZfT0spOw0KICAgfQ0KIA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuYwppbmRleCAzNzhlZGJmLi5jNDMyNjBhIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUJvYXJkLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5jCkBAIC04OCw2ICs4OCw5IEBACiAKIC8qIEdsb2JhbCBmdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitNVl9VMzIgcHJic1VzZXJEZWZpbmVkUGF0dGVyblszXSA9IHsweEE1QTVBNUE1LCAvKiBbMzE6MDBdICovCisJCQkJICAgIDB4QTVBNUE1QTUsIC8qIFs2MzozMl0gKi8KKwkJCQkgICAgMHhBNUE1fTsgICAgLyogWzc5OjY0XSAqLwogCiAvKiBMb2NhbCBWYXJpYWJsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zMDAsNiArMzAzLDQ4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgorKiogIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVyblNldAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBpbml0IFVzZXIgZGVmaW5lZCBQUkJTIHBhdHRlcm4KKyoqCisqKiAgUEFSQU1FVEVSUzogIE5vbmUKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuU2V0KE1WX1UzMiAqcHJic1VzZXJQYXR0ZXJuKQoreworICBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzBdID0gcHJic1VzZXJQYXR0ZXJuWzBdOworICBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzFdID0gcHJic1VzZXJQYXR0ZXJuWzFdOworICBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzJdID0gcHJic1VzZXJQYXR0ZXJuWzJdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5HZXQKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJuIFVzZXIgZGVmaW5lZCBQUkJTIHBhdHRlcm4KKyoqCisqKiAgUEFSQU1FVEVSUzogIE5vbmUKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuR2V0KE1WX1UzMiAqcHJic1VzZXJQYXR0ZXJuKQoreworICBwcmJzVXNlclBhdHRlcm5bMF0gPSBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzBdOworICBwcmJzVXNlclBhdHRlcm5bMV0gPSBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzFdOworICBwcmJzVXNlclBhdHRlcm5bMl0gPSBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzJdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKICoqICBtdk9udVBvbk1hY0J1cnN0RW5hYmxlSW5pdAogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCkBAIC0zNDIsNyArMzg3LDEwIEBACiAJCQkgICAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgU1cgY3RybCBub3QgZm9yY2VcblxyIik7CiAJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOwogCSAgICAgICB9Ci0JfSBlbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfWjIpIHsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikgewogCiAJCS8qIEtXMiBBU0lDIFJldiBaMiAqLwogCQkvKiA9PT09PT09PT09PT09PT0gKi8KQEAgLTM2MCwyNCArNDA4LDI2IEBACiAJCWlmIChzdGF0dXMgPT0gTVZfT0spCiAJCQlzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgZ3Bpb01hc2sgLyogMC1pbnB1dCBOT1QgYWxsb3cgdHJhbnNzbWl0Ki8pOwogCi0JfSBlbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApIHsKKwkJfQorCQllbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApIHsKIAogCQkvKiBLVzIgQVNJQyBSZXYgQTAgKi8KIAkJLyogPT09PT09PT09PT09PT09ICovCiAJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyBzZXQgKi8KLQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKLQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgewotCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCQkJCSAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgY3RybCBlbmFibGUgLSBvdXRwdXRcblxyIik7Ci0JCQlyZXR1cm4oTVZfRVJST1IpOwotCQl9CisJCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOworCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgeworCQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBjdHJsIGVuYWJsZSAtIG91dHB1dFxuXHIiKTsKKwkJCQlyZXR1cm4oTVZfRVJST1IpOworCQkJfQogCi0JCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZGlzYWJsZSAqLwotCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMCwgMCk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKLQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgbm90IGZvcmNlXG5cciIpOwotCQkJcmV0dXJuKE1WX0VSUk9SKTsKKwkJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZGlzYWJsZSAqLworCQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDAsIDApOworCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgeworCQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBjdHJsIG5vdCBmb3JjZVxuXHIiKTsKKwkJCQlyZXR1cm4oTVZfRVJST1IpOworCQkJfQogCQl9CiAJfQogCkBAIC00NjMsMTAgKzUxMywxMCBAQAogCQlpZiAoc3RhdHVzICE9IE1WX09LKQogCQkJcmV0dXJuKE1WX0VSUk9SKTsKIAotCX0gZWxzZSBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKSB7CisJfSBlbHNlIGlmICgobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKSB8fCAoTVZfNjYwMV9ERVZfSUQgPT0gbXZDdHJsTW9kZWxHZXQoKSkpIHsKIAotCQkvKiBBU0lDIFJldiBBMCAqLwotCQkvKiA9PT09PT09PT09PSAqLworCQkvKiBBU0lDIFJldiBBMCBhbmQgTUMgKi8KKwkJLyogPT09PT09PT09PT09PT09PT09ICovCiAJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX09VVFBVVCwgMCk7CiAJCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKIAkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKQEAgLTUxOSw1MyArNTY5LDU3IEBACiAJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOwogCSAgICAgICB9CiAKLQl9IGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikgeworCX0KKwllbHNlCisJeworCQlpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX1oyKSB7CiAKLQkgICAgCS8qIEFTSUMgUmV2IFoyICovCi0JICAgIAkvKiA9PT09PT09PT09PSAqLwotCQlQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOwotCQlpZiAoZ3Bpb01hc2sgPT0gUE9OX0dQSU9fTk9UX1VTRUQpCi0JCQlyZXR1cm4gTVZfRVJST1I7CisJCQkvKiBBU0lDIFJldiBaMiAqLworCQkJLyogPT09PT09PT09PT0gKi8KKwkJCVBPTl9HUElPX0dFVChCT0FSRF9HUFBfUE9OX1hWUl9UWCwgZ3Bpb0dyb3VwLCBncGlvTWFzayk7CisJCQlpZiAoZ3Bpb01hc2sgPT0gUE9OX0dQSU9fTk9UX1VTRUQpCisJCQkJcmV0dXJuIE1WX0VSUk9SOwogCi0JCXRyYW5zX3ZhbHVlID0gKChvbiA9PSBNVl9UUlVFKSA/IChncGlvTWFzay8qMSovKSA6ICh+Z3Bpb01hc2svKjAqLykpOworCQkJdHJhbnNfdmFsdWUgPSAoKG9uID09IE1WX1RSVUUpID8gKGdwaW9NYXNrLyoxKi8pIDogKH5ncGlvTWFzay8qMCovKSk7CiAKLQkJc3RhdHVzID0gbXZHcHBWYWx1ZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB0cmFuc192YWx1ZSk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JCQlyZXR1cm4oTVZfRVJST1IpOwotCi0JfSBlbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApIHsKLQotCQkvKiBBU0lDIFJldiBBMCAqLwotCQkvKiA9PT09PT09PT09PSAqLwotCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSAqLwotCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMSwgMCk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKLQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgZm9yY2VcblxyIik7Ci0JCQlyZXR1cm4oTVZfRVJST1IpOworCQkJc3RhdHVzID0gbXZHcHBWYWx1ZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB0cmFuc192YWx1ZSk7CisJCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQkJCXJldHVybihNVl9FUlJPUik7CiAJCX0KKwkJZWxzZSBpZgkobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKSB7CiAKLSAgICAgICAgcG9sYXJpdHkgPSBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQoKTsKKwkJCS8qIEFTSUMgUmV2IEEwICovCisJCQkvKiA9PT09PT09PT09PSAqLworCQkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgKi8KKwkJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfRk9SQ0VfQkVOX0lPX0VOLCAxLCAwKTsKKwkJCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKKwkJCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgY3RybCBmb3JjZVxuXHIiKTsKKwkJCQlyZXR1cm4oTVZfRVJST1IpOworCQkJfQogCi0JCS8qIFhWUiBwb2xhcml0eSAqLwotCQkvKiBYVlIgcG9sYXJpdHkgPT0gMCwgQWN0aXZlIEhpZ2gsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCi0JCS8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQkJcG9sYXJpdHkgPSBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQoKTsKIAotCQkvKiBQMlAgbW9kZSAqLwotCQkvKiBGb3JjZSBWYWx1ZSA9PSAwLCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLwotCQkvKiBGb3JjZSBWYWx1ZSA9PSAxLCB0cmFuc21pdCAxIHRvIHRoZSBsaW5lICAqLworCQkJLyogWFZSIHBvbGFyaXR5ICovCisJCQkvKiBYVlIgcG9sYXJpdHkgPT0gMCwgQWN0aXZlIEhpZ2gsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCisJCQkvKiBYVlIgcG9sYXJpdHkgPT0gMSwgQWN0aXZlIExvdywgdHJhbnNtaXQgMCB0byB0aGUgbGluZSAgKi8KIAotCQkvKiBTZXR0aW5nIFAyUCBzaG91bGQgYmUgcmV2ZXJzZWQgZnJvbSBYVlIgcG9sYXJpdHkgKi8KLQkJLyogWFZSIHBvbGFyaXR5ID09IDAsIEFjdGl2ZSBIaWdoLCB3cml0ZSAxIGZvciBGb3JjZSBWYWx1ZSAqLwotCQkvKiBYVlIgcG9sYXJpdHkgPT0gMSwgQWN0aXZlIExvdywgd3JpdGUgMCBmb3IgRm9yY2UgVmFsdWUgKi8KKwkJCS8qIFAyUCBtb2RlICovCisJCQkvKiBGb3JjZSBWYWx1ZSA9PSAwLCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQkJLyogRm9yY2UgVmFsdWUgPT0gMSwgdHJhbnNtaXQgMSB0byB0aGUgbGluZSAgKi8KIAotCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSB2YWx1ZSAtIGFjY29yZGluZyB0byBwb2xhcml0eSAqLwotCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19WQUwsIHBvbGFyaXR5LCAwKTsKLQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgewotCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCQkJCSAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgY3RybCBmb3JjZSB2YWx1ZSAlZFxuXHIiLAotCQkJCSAgIHRyYW5zX3ZhbHVlKTsKLQkJCXJldHVybihNVl9FUlJPUik7CisJCQkvKiBTZXR0aW5nIFAyUCBzaG91bGQgYmUgcmV2ZXJzZWQgZnJvbSBYVlIgcG9sYXJpdHkgKi8KKwkJCS8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgd3JpdGUgMSBmb3IgRm9yY2UgVmFsdWUgKi8KKwkJCS8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB3cml0ZSAwIGZvciBGb3JjZSBWYWx1ZSAqLworCisJCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSB2YWx1ZSAtIGFjY29yZGluZyB0byBwb2xhcml0eSAqLworCQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fVkFMLCBwb2xhcml0eSwgMCk7CisJCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7CisJCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgZm9yY2UgdmFsdWUgJWRcblxyIiwKKwkJCQkJICAgdHJhbnNfdmFsdWUpOworCQkJCXJldHVybihNVl9FUlJPUik7CisJCQkJfQogCQl9CiAJfQogCkBAIC02MDUsNiArNjU5LDggQEAKIAkvKnBhdHRlcm4gdmFsaWRhdGlvbiovCiAJaWYgKCEoKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVDEpIHx8CiAJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVDIpIHx8CisJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVVNFUikgfHwKKyAgICAgICAgICAocGF0dGVybiA9PSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzcpIHx8CiAJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU185KSB8fAogCSAgICAgIChwYXR0ZXJuID09IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfMTUpIHx8CiAJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU18yMykpKSB7CkBAIC02MzUsMTAgKzY5MSwxMCBAQAogCQlpZiAoc3RhdHVzICE9IE1WX09LKQogCQkJcmV0dXJuKHN0YXR1cyk7CiAKLQl9IGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkgeworCX0gZWxzZSBpZiAoKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkgfHwgKE1WXzY2MDFfREVWX0lEID09IG12Q3RybE1vZGVsR2V0KCkpKSB7CiAKLQkJLyogQVNJQyBSZXYgQTAgKi8KLQkJLyogPT09PT09PT09PT0gKi8KKwkJLyogQVNJQyBSZXYgQTAgYW5kIE1DICovCisJCS8qID09PT09PT09PT09PT09PT09PSAqLwogCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOwogCQlpZiAoc3RhdHVzICE9IE1WX09LKQogCQkJcmV0dXJuKHN0YXR1cyk7CkBAIC02NjMsMTAgKzcxOSwzMiBAQAogCWlmIChzdGF0dXMgIT0gTVZfT0spCiAJCXJldHVybihzdGF0dXMpOwogCi0JLypzZXQgcGF0dGVybiB0eXBlKi8KLQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBLCBwYXR0ZXJuLCAwKTsKLQlpZiAoc3RhdHVzICE9IE1WX09LKQotCQlyZXR1cm4oc3RhdHVzKTsKKyAgICAvKnNldCBwYXR0ZXJuIHR5cGUqLworICAgIGlmIChwYXR0ZXJuICE9IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1VTRVIpCisgICAgeworICAgICAgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX0RBVEEsIHBhdHRlcm4sIDApOworICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgICByZXR1cm4oc3RhdHVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAvKgorICAgICAgICoqICAweEYxMEEyRTZDIDwtIFBIWSBUZXN0IERhdGFbMTU6MF07ICBbVXNlckRhdGFbODowXSwgVHlwZSA9IDV9CisgICAgICAgKiogIDB4RjEwQTJFNjggPC0gUEhZIFRlc3QgRGF0YVszMToxNl07IFtVc2VyRGF0YVsyMzo5XX0KKyAgICAgICAqKiAgMHhGMTBBMkU2NCA8LSBQSFkgVGVzdCBEYXRhWzQ3OjMyXTsgW1VzZXJEYXRhWzM5OjI0XX0KKyAgICAgICAqKiAgMHhGMTBBMkU2MCA8LSBQSFkgVGVzdCBEYXRhWzYzOjQ4XTsgW1VzZXJEYXRhWzU1OjQwXX0KKyAgICAgICAqKiAgMHhGMTBBMkU1QyA8LSBQSFkgVGVzdCBEYXRhWzc5OjY0XTsgW1VzZXJEYXRhWzcxOjU2XX0KKyAgICAgICAqKiAgMHhGMTBBMkU1OCA8LSBQSFkgVGVzdCBEYXRhWzk2OjgwXTsgW1VzZXJEYXRhWzc5OjcyXX0KKyAgICAgICAqLworICAgICAgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX0RBVEEsICAgICAgICAgKCgocHJic1VzZXJEZWZpbmVkUGF0dGVyblswXSAmICAweEZGKSA8PCA4KSAgIHwgKHBhdHRlcm4gJiAweEZGKSksIDApOworICAgICAgIHN0YXR1cyB8PSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMSwgICgocHJic1VzZXJEZWZpbmVkUGF0dGVyblswXSA+PiA4KSAgJiAweEZGRkYpLCAwKTsKKyAgICAgICBzdGF0dXMgfD0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDIsICgoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMF0gPj4gMjQpICYgMHhGRikgICB8ICgocHJic1VzZXJEZWZpbmVkUGF0dGVyblsxXSAmIDB4RkYpIDw8IDgpKSwgMCk7CisgICAgICAgc3RhdHVzIHw9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAzLCAgKChwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzFdID4+IDgpICAmIDB4RkZGRiksIDApOworICAgICAgIHN0YXR1cyB8PSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wNCwgKCgocHJic1VzZXJEZWZpbmVkUGF0dGVyblsxXSA+PiAyNCkgJiAweEZGKSAgIHwgKChwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzJdICYgMHhGRikgPDwgOCkpLCAwKTsKKyAgICAgICBzdGF0dXMgfD0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDUsICAoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMl0gPj4gOCkgICYgMHhGRiksIDApOworICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgICByZXR1cm4oc3RhdHVzKTsKKyAgICB9CiAKIAkvKnR1cm4gb24gc2VsZWN0ZWQgcGF0dGVybiovCiAJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BUX1BBVFRFUk5fRU5BQkxFRCwgMHgxLCAwKTsKQEAgLTk0MywxNSArMTAyMSwxNSBAQAogKioKICoqICBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlTZXQKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKiAKKyoqCiAqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIEVQT04gWFZSIHBvbGFyaXR5IHJlZ2lzdGVyIHZhbHVlIGluIHRoZSBkYXRhYmFzZQotKiogICAgICAgICAgICAgICAKKyoqCiAqKiAgUEFSQU1FVEVSUzogIE1WX1UzMiB2YWwKICoqCiAqKiAgT1VUUFVUUzogICAgIE5vbmUKICoqCiAqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCi0qKiAgICAgICAgICAgICAgICAgICAKKyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG9udVAyUERiWHZyQnVyc3RFbmFibGVQb2xhcml0eVNldChNVl9VMzIgdmFsKQogewpAQCAtOTY0LDE1ICsxMDQyLDE1IEBACiAqKgogKiogIG9udVAyUERiWHZyQnVyc3RFbmFibGVQb2xhcml0eUdldAogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqIAorKioKICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgRVBPTiBYVlIgcG9sYXJpdHkgcmVnaXN0ZXIgdmFsdWUKLSoqICAgICAgICAgICAgICAgCisqKgogKiogIFBBUkFNRVRFUlM6ICBOb25lCiAqKgogKiogIE9VVFBVVFM6ICAgICBOb25lCiAqKgogKiogIFJFVFVSTlM6ICAgICBNVl9VMzIgbW9kZQotKiogICAgICAgICAgICAgICAgICAgCisqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuaAppbmRleCA2ZWZlNGU1Li5mZjQ4ZjA1IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUJvYXJkLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5oCkBAIC05Myw3ICs5Myw5IEBACiAKICNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVDEgICAgICAgICgweDEpCiAjZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1QyICAgICAgICAoMHgyKQotI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzkgICAgKDB4ODApCisjZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1VTRVIgICAgICAoMHg1KQorI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzcgICAgKDB4ODApCisjZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfOSAgICAoMHg4MSkKICNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU18xNSAgICgweDgyKQogI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzIzICAgKDB4ODMpCiAKQEAgLTE1NSw2ICsxNTcsOCBAQAogTVZfU1RBVFVTIG9udVBvbkxlZEhhbmRsZXIoTVZfVTMyIGxlZCwgTVZfVTMyIGFjdGlvbik7CiBNVl9TVEFUVVMgb251UG9uRHlpbmdHYXNwUHJvY2Vzcyh2b2lkKTsKIE1WX1NUQVRVUyBvbnVQb25EeWluZ0dhc3BFeGl0KHZvaWQpOwordm9pZCAgICAgIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVyblNldChNVl9VMzIgKnByYnNVc2VyUGF0dGVybik7Cit2b2lkICAgICAgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuR2V0KE1WX1UzMiAqcHJic1VzZXJQYXR0ZXJuKTsKIE1WX1NUQVRVUyBtdk9udVBvbk1hY0J1cnN0RW5hYmxlSW5pdCh2b2lkKTsKIE1WX1NUQVRVUyBtdk9udVBvbk1hY0J1cnN0RW5hYmxlUG9sYXJpdHlJbml0KE1WX1UzMiBwb2xhcml0eSk7CiBNVl9TVEFUVVMgb251UG9uUGF0dGVybkJ1cnN0T24oTVZfVTMyIHBhdHRlcm4sIE1WX0JPT0wgaXNQZXJpb2RpYywgTVZfVTMyIHBlcmlvZCwgTVZfVTMyIGR1cmF0aW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251TG54S3NPcy5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVMbnhLc09zLmgKaW5kZXggNTIwNWUxYy4uYzNiMWI2NCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVMbnhLc09zLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVMbnhLc09zLmgKQEAgLTE4NCwxMCArMTg0LDEzIEBACiAjZGVmaW5lIE9OVV9QT05fVElNRVJfSFdfUlBSVF9UMF9JTlRFUlZBTCAgICAoMikgICAgIC8qIDIgbXNlYyAqLw0KICNkZWZpbmUgT05VX1BPTl9USU1FUl9IV19SUFJUX1QxX0lOVEVSVkFMICAgICgxNTApICAgLyogMTUwIG1zZWMgKi8NCiAjZGVmaW5lIE9OVV9QT05fVElNRVJfSE9MRE9WRVJfSU5URVJWQUwgICAgICAoMjAwKSAgIC8qIDIwMCBtc2VjICovDQorI2RlZmluZSBPTlVfUE9OX1RJTUVSX01BWF9TTEVFUF9JTlRFUlZBTCAgICAgKDYwMDAwKSAvKiA2MCBzZWMgKi8NCisjZGVmaW5lIE9OVV9QT05fVElNRVJfU0xFRVBfRFVSQVRJT04gICAgICAgICAoNTAwKSAgICAvKiAwLjUgc2VjICovDQorI2RlZmluZSBPTlVfUE9OX1RJTUVSX1dBS0VVUF9EVVJBVElPTiAgICAgICAgKDUwMCkgICAgLyogMC41IHNlYyAqLw0KICNkZWZpbmUgT05VX1BPTl9USU1FUl9TSUxFTkNFX0lOVEVSVkFMICAgICAgICg2MDAwMCkgLyogNjAgc2VjICovDQogI2RlZmluZSBPTlVfUE9OX1RJTUVSX1RYX01PRF9JTlRFUlZBTCAgICAgICAgKDEpICAgLyogMSBtc2VjICovDQogI2RlZmluZSBPTlVfUE9OX1RJTUVSX0VWRU5UX01JU1NfSU5URVJWQUwgICAgKDEwKSAgIC8qIDEwIG1zZWMgKi8NCi0jZGVmaW5lIE9OVV9QT05fVElNRVJfVFhfUFdSX0lOVEVSVkFMICAgICAgICAoNjAwMCkgIC8qIDEgICBzZWMgICovDQorI2RlZmluZSBPTlVfUE9OX1RJTUVSX1RYX1BXUl9JTlRFUlZBTCAgICAgICAgKDEwMDApICAvKiAxIHNlYyAqLw0KIA0KICNkZWZpbmUgT05VX1BPTl9USU1FUl9BQ1RJVkUgICAgICAgICAgICAgICAgICgxKQ0KICNkZWZpbmUgT05VX1BPTl9USU1FUl9OT1RfQUNUSVZFICAgICAgICAgICAgICgwKQ0KQEAgLTI1Niw2ICsyNTksMTEgQEAKICAgU19PbnVQb25UaW1lciBvbnVQb25UeFB3clRpbWVySWQ7ICAgICAgICAgLyogT05VIFBPTiBUWCBQb3dlciB0aW1lciAqLw0KICAgU19PbnVQb25UaW1lciBvbnVQb25QbVRpbWVySWQ7ICAgICAgICAgICAgLyogT05VIFBPTiBQTSB0aW1lciAqLw0KICAgU19PbnVQb25UaW1lciBvbnVQb25QYXR0ZXJuQnVyc3RUaW1lcklkOyAgLyogT05VIFBPTiBQYXR0ZXJuIEJ1cnN0IHRpbWVyICovDQorDQorICAgIFNfT251UG9uVGltZXIgb251RXBvblR4Q29udHJvbFRpbWVySWQ7ICAgICAgLyogRVBPTiB0eF9jb250cm9sIGRlbGF5IHRpbWVyICovDQorICAgIFNfT251UG9uVGltZXIgb251RXBvbk1heFNsZWVwVGltZXJJZDsgICAgICAgLyogRVBPTiBwb3dlcl9zYXZpbmcgbW9kZTogbWF4IHNsZWVwIGR1cmF0aW9uIHRpbWVyICovDQorICAgIFNfT251UG9uVGltZXIgb251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkOyAgLyogRVBPTiBwb3dlcl9zYXZpbmcgbW9kZTogc2xlZXAgZHVyYXRpb24gYW5kIHdhaXQgZHVyYXRpb24gdGltZXIgKi8NCisgIA0KICNpZm5kZWYgUE9OX0ZQR0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICBTX09udVBvblRpbWVyIG9udVBvbklzclh2clJzdFRpbWVySWQ7ICAgICAvKiBPTlUgUE9OIFhWUiBSZXNldCB0aW1lciAqLw0KICNlbmRpZiAvKiBQT05fRlBHQSAqLyAgICAgICAgICAgICAgICAgICAgICAgDQpAQCAtMjc1LDYgKzI4Myw3IEBACiAvKiBHbG9iYWwgdmFyaWFibGVzDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiBleHRlcm4gU19PbnVQb25SZXNvdXJjZVRibCBvbnVQb25SZXNvdXJjZVRibF9zOw0KK2V4dGVybiBzcGlubG9ja190IG9udVBvbklycUxvY2s7DQogDQogLyogR2xvYmFsIGZ1bmN0aW9ucw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpAQCAtMzE1LDYgKzMyNCw4IEBACiBleHRlcm4gTVZfU1RBVFVTIHBvbk9udUdldFByaW50U3RhdHVzKE1WX1UzMiBtb2R1bGUsIE1WX1UzMiAqcHJpbnRMZXZlbCwgTVZfVTMyICptb2R1bGVPcHRpb25zKTsNCiBleHRlcm4gaW50ICAgICAgIHBvbk9udVByaW50U3RhdHVzKGNoYXIqIGJ1Zik7DQogDQorZXh0ZXJuIGludCAJIG9udUdwb25VaUNmZ1ByYnNVc2VyUGF0dGVybihjaGFyKiBidWYpOw0KKw0KIC8qIE1hY3Jvcw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgIA0KIA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2FwaS5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fYXBpLmgKaW5kZXggMTFmZGQyZC4uNjJmOGJmMSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fYXBpLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fYXBpLmgKQEAgLTQxODEsNiArNDE4MSwzNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHRwbV9lcnJvcl9jb2RlX3QgdHBtX2RlYWN0aXZlX3Rjb250KHVpbnQzMl90IHRjb250X251bSk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHRwbV9zd19zZXRfc3RhdGljX211bHRpY2FzdF9tYWMKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBvciBkZXN0b3J5IGEgc3RhdGljIE1BQyBlbnRyeSBpbiB0aGUgTUFDIGFkZHJlc3MgdGFibGUgZm9yIHRhZ2V0CisqICAgICAgIFVOSSBwb3J0IGJpdG1hcCBpbiB0aGUgaW50ZWdyYXRlZCBzd2l0Y2gKKyoKKyogSU5QVVRTOgorKiAgICAgICBvd25lcl9pZCAgICAJLSBBUFAgb3duZXIgaWQsIHNob3VsZCBiZSB1c2VkIGZvciBhbGwgQVBJIGNhbGxzLgorKiAgICAgICB0cG1fdHJnX3BvcnQgICAgLSB0YXJnZXQgcG9ydCBibSBpbiBVTkkgcG9ydCBpbmRleCwgVFBNX1RSR19VTklfMCB8IFRQTV9UUkdfVU5JXzEgfCAuLi4KKyogICAgICAgc3RhdGljX21hYyAgCS0gNiBieXRlIG5ldHdvcmsgb3JkZXIgTUFDIHNvdXJjZSBhZGRyZXNzLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzIC0gVFBNX1JDX09LLgorKiAgICAgICBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZSAtIHNlZSB0cG1fZXJyb3JfY29kZV90LgorKgorKiBDT01NRU5UUzoKKyogICAgICAgTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0cG1fZXJyb3JfY29kZV90IHRwbV9zd19zZXRfc3RhdGljX211bHRpY2FzdF9tYWMKKygKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG93bmVyX2lkLAorICAgIHRwbV90cmdfcG9ydF90eXBlX3QgdHBtX3RyZ19wb3J0LAorICAgIHVpbnQ4X3QgICAgICAgICAgICAgc3RhdGljX21hY1s2XQorKTsKKworCiAvKiBPTEQgQVBJIGZ1bmN0aW9ucyAqLwogI2RlZmluZSB0cG1fYWRkX2wyX3ByaW1fYWNsX3J1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBtX2FkZF9sMl9ydWxlCiAjZGVmaW5lIHRwbV9hZGRfbDNfdHlwZV9hY2xfcnVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cG1fYWRkX2wzX3R5cGVfcnVsZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fZGIuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2RiLmMKaW5kZXggNDI2NTI4YS4uMTAyNTgwOSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fZGIuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9kYi5jCkBAIC01NjU4LDYgKzU2NTgsMzIgQEAKIAltZW1zZXQoJih0cG1fZGIuaXB2Nl9tY19zdHJlYW1bc3RyZWFtX251bV0pLCAwLCBzaXplb2YodHBtX2RiX2lwdjZfbWNfc3RyZWFtX2VudHJ5X3QpKTsKIH0KIAoraW50MzJfdCB0cG1fZGJfZ2V0X21jX21hY19wb3J0X2JtKHVpbnQ4X3QgKm1hY19hZGRyLCB1aW50MzJfdCAqdW5pX3BvcnRfYm0pCit7CisJdWludDMyX3QgZW50cnlfaWQ7CisJdWludDMyX3QgcG9ydF9ucjsKKworCSp1bmlfcG9ydF9ibSA9IDA7CisKKwlmb3IgKGVudHJ5X2lkID0gMDsgZW50cnlfaWQgPCBUUE1fTUNfTUFYX01BQ19OVU07IGVudHJ5X2lkKyspIHsKKwkJaWYgKHRwbV9kYl9tY19tYWNfdGFibGVbZW50cnlfaWRdICE9IE5VTEwpCisJCQlpZiAoIW1lbWNtcCh0cG1fZGJfbWNfbWFjX3RhYmxlW2VudHJ5X2lkXS0+bWFjX2FkZHIsIG1hY19hZGRyLCA2ICogc2l6ZW9mKHVpbnQ4X3QpKSkKKwkJCQlicmVhazsKKwl9CisKKwlpZiAoZW50cnlfaWQgPT0gVFBNX01DX01BWF9NQUNfTlVNKSB7CisJCS8qIG5vIGVudHJ5IGZvciB0aGlzIE1BQyAqLworCQkqdW5pX3BvcnRfYm0gPSAwOworCQlyZXR1cm4gVFBNX0RCX09LOworCX0KKworCWZvciAocG9ydF9uciA9IFRQTV9TUkNfUE9SVF9VTklfMDsgcG9ydF9uciA8PSBUUE1fU1JDX1BPUlRfVU5JX1ZJUlQ7IHBvcnRfbnIrKykKKwkJaWYgKHRwbV9kYl9tY19tYWNfdGFibGVbZW50cnlfaWRdLT51c2VyX251bVtwb3J0X25yXSkKKwkJCSp1bmlfcG9ydF9ibSB8PSAoVFBNX1RSR19VTklfMCA8PCBwb3J0X25yKTsKKworCXJldHVybiBUUE1fREJfT0s7Cit9CisKIGludDMyX3QgdHBtX2RiX2luY3JlYXNlX21jX21hY19wb3J0X3VzZXJfbnVtKHVpbnQ4X3QgKm1hY19hZGRyLCB1aW50MzJfdCB1bmlfcG9ydCkKIHsKIAl1aW50MzJfdCBlbnRyeV9pZCwgZmlyc3RfZnJlZSA9IFRQTV9NQ19NQVhfTUFDX05VTTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2RiLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9kYi5oCmluZGV4IGE1MjZjZmQuLjZhOWUxMDQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2RiLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fZGIuaApAQCAtMTI0MSw2ICsxMjQxLDcgQEAKIGludDMyX3QgdHBtX2RiX3NldF9pcHY2X21jX3N0cmVhbV9lbnRyeSh1aW50MzJfdCBzdHJlYW1fbnVtLCB0cG1fZGJfaXB2Nl9tY19zdHJlYW1fZW50cnlfdCAqbWNfc3RyZWFtKTsKIGludDMyX3QgdHBtX2RiX2dldF9pcHY2X21jX3N0cmVhbV9lbnRyeSh1aW50MzJfdCBzdHJlYW1fbnVtLCB0cG1fZGJfaXB2Nl9tY19zdHJlYW1fZW50cnlfdCAqbWNfc3RyZWFtKTsKIHZvaWQgdHBtX2RiX3Jlc2V0X2lwdjZfbWNfc3RyZWFtX2VudHJ5KHVpbnQzMl90IHN0cmVhbV9udW0pOworaW50MzJfdCB0cG1fZGJfZ2V0X21jX21hY19wb3J0X2JtKHVpbnQ4X3QgKm1hY19hZGRyLCB1aW50MzJfdCAqdW5pX3BvcnRfYm0pOwogaW50MzJfdCB0cG1fZGJfaW5jcmVhc2VfbWNfbWFjX3BvcnRfdXNlcl9udW0odWludDhfdCAqbWFjX2FkZHIsIHVpbnQzMl90IHVuaV9wb3J0KTsKIGludDMyX3QgdHBtX2RiX2RlY3JlYXNlX21jX21hY19wb3J0X3VzZXJfbnVtKHVpbnQ4X3QgKm1hY19hZGRyLCB1aW50MzJfdCB1bmlfcG9ydCk7CiB1aW50OF90IHRwbV9kYl9nZXRfbWNfbWFjX3BvcnRfdXNlcl9udW0odWludDhfdCAqbWFjX2FkZHIsIHVpbnQzMl90IHVuaV9wb3J0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2luaXQuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2luaXQuYwppbmRleCAwMDZkZDczLi5iNDdkMmFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9pbml0LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1faW5pdC5jCkBAIC0zMTUyLDYgKzMxNTIsNyBAQAogCXVpbnQzMl90IGk7CiAJdWludDMyX3Qgc3dfcG9ydF9ibXAgPSAwOwogCXVuc2lnbmVkIGNoYXIgZ3FfZGFbNl0gPSB7IDB4MDEsIDB4MDAsIDB4NWUsIDB4MDAsIDB4MDAsIDB4MDEgfTsKKwl1bnNpZ25lZCBjaGFyIGdxX21sZF9kYVs2XSA9IHsgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9OwogCXRwbV9nbWFjc19lbnVtX3QgZ21hY19pOwogCWludDMyX3Qgc3dpdGNoX3BvcnQ7CiAKQEAgLTMzMjIsNyArMzMyMyw5IEBACiAJfQogCWlmIChtdl9zd2l0Y2hfbWFjX2FkZHJfc2V0KGdxX2RhLCAwLCBzd19wb3J0X2JtcCwgMSkpCiAJCVRQTV9PU19XQVJOKFRQTV9JTklUX01PRCwgIm12X3N3aXRjaF9tYWNfYWRkcl9zZXQgZXJyLiBzd19wb3J0X2JtcCAwWCV4XG4iLCBzd19wb3J0X2JtcCk7Ci0KKwlpZiAobXZfc3dpdGNoX21hY19hZGRyX3NldChncV9tbGRfZGEsIDAsIHN3X3BvcnRfYm1wLCAxKSkKKwkJVFBNX09TX1dBUk4oVFBNX0lOSVRfTU9ELCAibXZfc3dpdGNoX21hY19hZGRyX3NldCBlcnIuZm9yIG1sZCBnZW5lcmFsIHF1ZXJ5IHN3X3BvcnRfYm1wIDBYJXhcbiIsIHN3X3BvcnRfYm1wKTsKKyAgICAKIAkvKiBJZiBTd2l0Y2ggcG9ydCBNQUMgbm8gY29ubmVjdGVkIHRvIFBIWSwgZGlzYWJsZSBHTUFDIFBIWSBwb2xsaW5nICovCiAJZm9yIChnbWFjX2kgPSBUUE1fRU5VTV9HTUFDXzA7IGdtYWNfaSA8IFRQTV9NQVhfTlVNX0dNQUNTOyBnbWFjX2krKykgewogCQlpZiAoVFBNX0ZBTFNFID09IHRwbV9pbml0LmdtYWNfcG9ydF9jb25mW2dtYWNfaV0udmFsaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9wa3RfcHJvY19sb2dpYy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fcGt0X3Byb2NfbG9naWMuYwppbmRleCBmZDBhODI3Li5jM2Y1ZjE5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9wa3RfcHJvY19sb2dpYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX3BrdF9wcm9jX2xvZ2ljLmMKQEAgLTg0LDkgKzg0LDcgQEAKICNpbmNsdWRlICJ0cG1fY29tbW9uLmgiCiAjaW5jbHVkZSAidHBtX2hlYWRlci5oIgogCi0vKiBMb2NhbCBkZWZpbml0aW9ucyAqLwotZXh0ZXJuIE1WX1NUQVRVUyBtdl9jdXN0X3NldF90Y29udF9zdGF0ZSh1aW50MzJfdCB0Y29udCwgYm9vbCBzdGF0ZSk7Ci0KK2V4dGVybiBpbnQgY3BoX3NldF90Y29udF9zdGF0ZSh1bnNpZ25lZCBpbnQgdGNvbnQsIGJvb2wgc3RhdGUpOwogdHlwZWRlZiB0cG1fZXJyb3JfY29kZV90ICgqdHBtX3Byb2NfY29tbW9uX2ludF9kZWxfZnVuY190KSAodWludDMyX3QsIHVpbnQzMl90KTsKIAogaW50MzJfdCB0cG1fcHJvY192aXJ0X3VuaV90cmdfcG9ydF92YWxpZGF0aW9uKHRwbV90cmdfcG9ydF90eXBlX3QgdHJnX3BvcnQpOwpAQCAtODM1NCw3ICs4MzUyLDcgQEAKIAltY19zdHJlYW0uZGVzdF9wb3J0X2JtID0gZGVzdF9wb3J0X2JtOwogCW1jX3N0cmVhbS51NF9lbnRyeSA9IHJ1bGVfbnVtOwogCW1lbWNweShtY19zdHJlYW0uZ3JvdXBfYWRkciwgaXB2NF9kc3RfYWRkLCA0ICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQlpZiAoaWdub3JlX2lwdjRfc3JjKQorCWlmICghaWdub3JlX2lwdjRfc3JjKQogCQltZW1jcHkobWNfc3RyZWFtLnNyY19hZGRyLCBpcHY0X3NyY19hZGQsIDQgKiBzaXplb2YodWludDhfdCkpOwogCiAJcmV0X2NvZGUgPSB0cG1fZGJfc2V0X21jX3N0cmVhbV9lbnRyeShzdHJlYW1fbnVtLCAmbWNfc3RyZWFtKTsKQEAgLTg0MTQsMTUgKzg0MTIsMTggQEAKIAkJcG9ydCA9IHBvcnQgPDwgMTsKIAl9CiAKLQlpZiAobmV3X3RhcmdldCAhPSAwKQotCQluZXdfdGFyZ2V0IHw9IFRQTV9UUkdfUE9SVF9DUFU7CS8qIGlnbXAgcmVwb3J0IHRvIENQVSAqLworCXJldF9jb2RlID0gdHBtX2RiX2dldF9tY19tYWNfcG9ydF9ibShtY19tYWMsICZ0cmdfcG9ydF9ibSk7CisJSUZfRVJST1IocmV0X2NvZGUpOworCisJaWYgKHRyZ19wb3J0X2JtICE9IDApCisJCXRyZ19wb3J0X2JtIHw9IFRQTV9UUkdfUE9SVF9DUFU7CS8qIGlnbXAgcmVwb3J0IHRvIENQVSAqLwogCiAJc3dpdGNoIChmaWx0ZXJfbW9kZSkgewogCWNhc2UgVFBNX01DX0NPTUJJTkVEX0lQX01BQ19GSUxURVI6Ci0JCWlmICh0cG1fZGJfZ2V0X21jX3Blcl91bmlfdmxhbl94bGF0ZSgpICE9IDAgJiYgbmV3X3RhcmdldCAhPSAwKQotCQkJbmV3X3RhcmdldCB8PSBUUE1fVFJHX1VOSV9WSVJUOwkvKiBsb29wYmFjayBHMSAqLworCQlpZiAodHBtX2RiX2dldF9tY19wZXJfdW5pX3ZsYW5feGxhdGUoKSAhPSAwICYmIHRyZ19wb3J0X2JtICE9IDApCisJCQl0cmdfcG9ydF9ibSB8PSBUUE1fVFJHX1VOSV9WSVJUOwkvKiBsb29wYmFjayBHMSAqLwogCWNhc2UgVFBNX01DX01BQ19PTkxZX0ZJTFRFUjoKLQkJdHJnX3BvcnRfYm0gPSB0cG1fZGJfdHJnX3BvcnRfc3dpdGNoX3BvcnRfZ2V0KG5ld190YXJnZXQpOworCQl0cmdfcG9ydF9ibSA9IHRwbV9kYl90cmdfcG9ydF9zd2l0Y2hfcG9ydF9nZXQodHJnX3BvcnRfYm0pOwogCQlicmVhazsKIAljYXNlIFRQTV9NQ19JUF9PTkxZX0ZJTFRFUjoKIAkJdHJnX3BvcnRfYm0gPSAweDNGOwkvKiBhbGwgdW5pIHBvcnRzICsgQ1BVICsgRzEvd2lmaSAqLwpAQCAtODQzMSw3ICs4NDMyLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKG5ld190YXJnZXQgPT0gMCkgeworCWlmICh0cmdfcG9ydF9ibSA9PSAwKSB7CiAJCXJldF9jb2RlID0gdHBtX3N3X2RlbF9zdGF0aWNfbWFjKFRQTV9NT0RfT1dORVJfVFBNLCBtY19tYWMpOwogCQlJRl9FUlJPUihyZXRfY29kZSk7CiAJCXRwbV9kYl9yZXNldF9tY19tYWNfZW50cnkobWNfbWFjKTsKQEAgLTE0MjUwLDcgKzE0MjUxLDcgQEAKIAkJcmV0X2NvZGUgPSB0cG1fZGJfYXBpX2VudHJ5X2ludmFsaWRhdGUoYXBpX3NlY3Rpb24sIHN0cmVhbV9udW0pOwogCQlJRl9FUlJPUihyZXRfY29kZSk7CiAKLQkJCisKIAkJaWYgKFRQTV9JUF9WRVJfNiA9PSBpcF92ZXJzaW9uKSB7CiAJCQkvKiByZW1vdmUgU0lQIFBOQyBlbnRyeSAqLwogCQkJcmV0X2NvZGUgPSB0cG1fZGJfZ2V0X2lwdjZfbWNfc3RyZWFtX2VudHJ5KHN0cmVhbV9udW0sICZtY19zdHJlYW0pOwpAQCAtMTc4MjUsNyArMTc4MjYsNyBAQAogCiAJLy9UUE1fT1NfSU5GTyhUUE1fUE5DTF9NT0QsICJwb3J0ID0gJWQgdHhwID0gJWQgZW5hYmxlID0gJWRcbiIsIHBvcnQsIHR4cCwgZW5hYmxlKTsKIAotICAgIHByaW50ayhLRVJOX0RFQlVHICJUUE0gVC1Db250IEFQSSwgcG9ydCglZCksIHR4cCglZCkgZW5hYmxlKCVkKVxuIiwgcG9ydCwgdHhwLCBlbmFibGUpOworCXByaW50aygiVFBNIFQtQ29udCBBUEksIHBvcnQoJWQpLCB0eHAoJWQpIGVuYWJsZSglZClcbiIsIHBvcnQsIHR4cCwgZW5hYmxlKTsKIAogCXR4X21vZCA9IHBvcnQgKyB0eHA7CiAKQEAgLTE3ODU1LDcgKzE3ODU2LDcgQEAKIAogCQkJLyogZW5hYmxlL2Rpc2FibGUgaHdmICovCiAJCQlpZiAoZW5hYmxlID09IHRydWUpCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkhXRiBULUNvbnQgYWN0aXZlLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CisJCQkJcHJpbnRrKCJIV0YgVC1Db250IGFjdGl2ZSwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOwogCiAJCQltdk5ldGFId2ZUeHFFbmFibGUoKHF1ZXVlX293bmVyIC0gMSksIHBvcnQsIHR4cCwgcV9udW0sIGVuYWJsZSk7CiAKQEAgLTE3ODY0LDcgKzE3ODY1LDcgQEAKIAkJCWlmICgoIWVuYWJsZSkgJiYgKGN1cnJfc3RhdGUpKQogCQkJewogCQkJCS8vVFBNX09TX0lORk8oVFBNX1BOQ0xfTU9ELCAiQ2FsbCBtdl9ldGhfdHhxX2NsZWFuIC0gY3VycmVudCBzdGF0ZTogJWQsIGVuYWJsZSAlZFxuIiwgY3Vycl9zdGF0ZSwgZW5hYmxlKTsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiSFdGIFQtQ29udCBzdG9wL2NsZWFuLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CisJCQkJcHJpbnRrKCJIV0YgVC1Db250IHN0b3AvY2xlYW4sIHBvcnQoJWQpLCB0eHAoJWQpLCBxdWUoJWQpXG4iLCBwb3J0LCB0eHAsIHFfbnVtKTsKIAkJCQltdl9ldGhfdHhxX2NsZWFuKHBvcnQsIHR4cCwgcV9udW0pOwogCQkJfQogCQl9CkBAIC0xNzg3NCwxNCArMTc4NzUsMTQgQEAKIAkJewogCQkJaWYgKCFlbmFibGUpCiAJCQl7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlNXRiBULUNvbnQgc3RvcC9jbGVhbiwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOwotCQkJCW12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKHR4cCwgZmFsc2UpOworCQkJCXByaW50aygiU1dGIFQtQ29udCBzdG9wL2NsZWFuLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CisJCQkJY3BoX3NldF90Y29udF9zdGF0ZSh0eHAsIGZhbHNlKTsKIAkJCQltdl9ldGhfdHhxX2NsZWFuKHBvcnQsIHR4cCwgcV9udW0pOwogCQkJfQogCQkJZWxzZQogCQkJewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJTV0YgVC1Db250IGFjdGl2ZSwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOwotCQkJCW12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKHR4cCwgdHJ1ZSk7CisJCQkJcHJpbnRrKCJTV0YgVC1Db250IGFjdGl2ZSwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOworCQkJCWNwaF9zZXRfdGNvbnRfc3RhdGUodHhwLCB0cnVlKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BlcmYvdHBtX21uZ19pZi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmMKaW5kZXggNmE0NjdiZS4uMGI5ZTcyOCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmMKQEAgLTE2OTUsNiArMTY5NSwxNiBAQAogICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgIC8qID09PT09PSBNVl9UUE1fSU9DVExfU1dfU0VUX1NUQVRJQ19NVUxUSUNBU1RfTUFDID09PT09PT09PSAqLworICAgICAgICAgICAgICBjYXNlIE1WX1RQTV9JT0NUTF9TV19TRVRfU1RBVElDX01VTFRJQ0FTVF9NQUM6CisgICAgICAgICAgICAgICAgICByY29kZSA9IHRwbV9zd19zZXRfc3RhdGljX211bHRpY2FzdF9tYWMoICB0cG1fc3dfbWFjX3NlY3VyaXR5LT5vd25lcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBtX3N3X21hY19zZWN1cml0eS0+cG9ydF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHRwbV9zd19tYWNfc2VjdXJpdHktPnN0YXRpY19tYWNbMF0pKTsKKyAgICAgICAgICAgICAgICAgIGlmKHJjb2RlICE9IFRQTV9PSykKKyAgICAgICAgICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CiAgICAgICAgICAgfQpAQCAtMzgwMCw2ICszODEwLDcgQEAKIEVYUE9SVF9TWU1CT0wodHBtX3N3X2dldF9wb3J0X21pcnJvcik7CiBFWFBPUlRfU1lNQk9MKHRwbV9zd19zZXRfaXNvbGF0ZV9ldGhfcG9ydF92ZWN0b3IpOwogRVhQT1JUX1NZTUJPTCh0cG1fc3dfZ2V0X2lzb2xhdGVfZXRoX3BvcnRfdmVjdG9yKTsKK0VYUE9SVF9TWU1CT0wodHBtX3N3X3NldF9zdGF0aWNfbXVsdGljYXN0X21hYyk7CiBFWFBPUlRfU1lNQk9MKHRwbV9zd19zZXRfcG9ydF90YWdnZWQpOwogRVhQT1JUX1NZTUJPTCh0cG1fc3dfc2V0X3BvcnRfdW50YWdnZWQpOwogRVhQT1JUX1NZTUJPTCh0cG1fc3dfc2V0X3BvcnRfZGVmX3ZsYW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuaAppbmRleCA5Y2VmZmM2Li42MWIwZGY4IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuaApAQCAtMzE5LDYgKzMxOSw3IEBACiAgICAgTVZfVFBNX0lPQ1RMX0FERF9JUHY0X01DX1NUUkVBTV9TRVRfUVVFVUUsCiAgICAgTVZfVFBNX0lPQ1RMX0FERF9JUHY2X01DX1NUUkVBTV9TRVRfUVVFVUUsCiAgICAgTVZfVFBNX0lPQ1RMX1NXX1BPUlRfQUREX1ZJRF9TRVRfRUdSRVNTX01PREUsCisgICAgTVZfVFBNX0lPQ1RMX1NXX1NFVF9TVEFUSUNfTVVMVElDQVNUX01BQywKIAogfSB0cG1faW9jdGxfY21kX3R5cGVfdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGxhdC90cG1fc3dpdGNoX21nci5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGxhdC90cG1fc3dpdGNoX21nci5jCmluZGV4IGU2MmJjZTQuLjBiYTk0NzIgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BsYXQvdHBtX3N3aXRjaF9tZ3IuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wbGF0L3RwbV9zd2l0Y2hfbWdyLmMKQEAgLTIzNCw2ICsyMzQsMTEzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHRwbV9zd19zZXRfZ21hY19zcGVlZF9kdXBsZXhfZmMKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgR01BQyBQb3J0IEF1dG8tTmVnb3RpYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlciBpZiBQSFkgaXMKKyogICAgICAgIGNvbm5lY3RlZCB0byBHTUFDIGRpcmVjdGx5LiBNYWlseSBmb3IgTWVkaWEgQ29udmVydC4KKyoKKyogSU5QVVRTOgorKiAgICAgICBzcmNfcG9ydCAgICAgICAgIC0gU291cmNlIHBvcnQgaW4gVU5JIHBvcnQgaW5kZXgsIFVOSTAsIFVOSTEuLi5VTkk0LgorKiAgICAgICBhdXRvX25lZ29fZW4gLSBBdXRvLW5lZ290aWF0aW9uIGVuYWJsZSBzdGF0dXMKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcyAtIFRQTV9SQ19PSy4KKyogICAgICAgT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UgLSBzZWUgdHBtX2Vycm9yX2NvZGVfdC4KKyoKKyogQ09NTUVOVFM6CisqICAgICAgICBOT05FLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB0cG1fZXJyb3JfY29kZV90IHRwbV9zd19zZXRfZ21hY19zcGVlZF9kdXBsZXhfZmModWludDMyX3Qgb3duZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbV9zcmNfcG9ydF90eXBlX3Qgc3JjX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b19uZWdvX2VuKQoreworICAgIHRwbV9lcnJvcl9jb2RlX3QgcmV0VmFsID0gVFBNX1JDX09LOworICAgIHRwbV9waHlfY3RybF90ICAgcGh5X2FjY2Vzc193YXk7CisgICAgdWludDMyX3Qgc3dpdGNoX2luaXQ7CisgICAgdHBtX2dtYWNzX2VudW1fdCBnbWFjX3BvcnQ7CisgICAgdWludDMyX3QgcGh5X2RpcmVjdF9hZGRyOworICAgIHRwbV9waHlfc3BlZWRfdCBjZmdfc3BlZWQ7CisgICAgYm9vbCAgY2ZnX2R1cGxleCwgY2ZnX2ZjOworCisgICAgcmV0VmFsID0gdHBtX3BoeV9hY2Nlc3NfY2hlY2soc3JjX3BvcnQsICZwaHlfYWNjZXNzX3dheSwgJnBoeV9kaXJlY3RfYWRkcik7CisgICAgaWYgKHJldFZhbCAhPSBUUE1fUkNfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSCisgICAgICAgICAgICAgICAiUG9ydCVkIFBIWSBhY2Nlc3Mgd2F5IGNoZWNrIGZhaWxlZFxuIiwgc3JjX3BvcnQpOworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKyAgICAvKiBjaGVjayBzd2ljdGggaW5pdCBvciBub3QgKi8KKyAgICBpZiAodHBtX2RiX3N3aXRjaF9pbml0X2dldCgmc3dpdGNoX2luaXQpICE9IFRQTV9EQl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIHRwbV9kYl9zd2l0Y2hfaW5pdF9nZXQgRmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorICAgIC8qIFRoZSByb3V0aW5lIG9ubHkgYXBwbHkgUEhZIGNvbm5lY3RlZCB0byBHTUFDICovCisgICAgaWYgKChQSFlfU01JX01BU1RFUl9DUFUgPT0gcGh5X2FjY2Vzc193YXkpICYmCisgICAgICAgICAoIXN3aXRjaF9pbml0KSkgeworICAgICAgICBmb3IgKGdtYWNfcG9ydCA9IFRQTV9FTlVNX0dNQUNfMDsgZ21hY19wb3J0IDwgVFBNX01BWF9OVU1fR01BQ1M7IGdtYWNfcG9ydCsrKSB7CisgICAgICAgICAgICBpZiAocGh5X2RpcmVjdF9hZGRyID09IG12Qm9hcmRQaHlBZGRyR2V0KGdtYWNfcG9ydCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ21hY19wb3J0ID09IFRQTV9NQVhfTlVNX0dNQUNTKSB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIENhbiBub3QgZmluZCBnbWFjIHBvcnRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1dG9fbmVnb19lbikgey8qIGF1dG8tbmVnbyBlbmFibGUgKi8KKyAgICAgICAgICAgIGlmIChtdk5ldGFTcGVlZER1cGxleFNldCgoaW50KWdtYWNfcG9ydCwgTVZfRVRIX1NQRUVEX0FOLCBNVl9FVEhfRFVQTEVYX0FOKSAhPSBNVl9PSykgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgbXZOZXRhU3BlZWREdXBsZXhTZXQgRmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBFUlJfR0VORVJBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG12TmV0YUZsb3dDdHJsU2V0KChpbnQpZ21hY19wb3J0LCBNVl9FVEhfRkNfQU5fTk8pICAhPSBNVl9PSyl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBtdk5ldGFGbG93Q3RybFNldCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9HRU5FUkFMOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7LyogYXV0by1uZWdvIGRpc2FibGUgKi8KKyAgICAgICAgICAgIHJldFZhbCA9IHRwbV9waHlfZ2V0X3BvcnRfc3BlZWQob3duZXJfaWQsIHNyY19wb3J0LCAmY2ZnX3NwZWVkKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIFBIWSBzcGVlZCBjb25maWcgZ2V0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldFZhbCA9IHRwbV9waHlfZ2V0X3BvcnRfZHVwbGV4X21vZGUob3duZXJfaWQsIHNyY19wb3J0LCAmY2ZnX2R1cGxleCk7CisgICAgICAgICAgICBpZiAocmV0VmFsKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBQSFkgZHVwbGV4IGNvbmZpZyBnZXQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0VmFsID0gdHBtX3BoeV9nZXRfcG9ydF9mbG93X2NvbnRyb2xfc3VwcG9ydChvd25lcl9pZCwgc3JjX3BvcnQsICZjZmdfZmMpOworICAgICAgICAgICAgaWYgKHJldFZhbCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgUEhZIGZsb3cgY29udHJvbCBjb25maWcgZ2V0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtdk5ldGFTcGVlZER1cGxleFNldCgoaW50KWdtYWNfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ZnX3NwZWVkICsgTVZfRVRIX1NQRUVEXzEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ZnX2R1cGxleCA/IE1WX0VUSF9EVVBMRVhfRlVMTCA6IE1WX0VUSF9EVVBMRVhfSEFMRikpICE9IE1WX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBtdk5ldGFTcGVlZER1cGxleFNldCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9HRU5FUkFMOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXZOZXRhRmxvd0N0cmxTZXQoKGludClnbWFjX3BvcnQsIChjZmdfZmMgPyBNVl9FVEhfRkNfRU5BQkxFIDogTVZfRVRIX0ZDX0RJU0FCTEUpKSAhPSBNVl9PSykgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgbXZOZXRhRmxvd0N0cmxTZXQgRmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBFUlJfR0VORVJBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJQSFkgbm90IGNvbm5lY3RlZCB0byBHTUFDXG4iKTsKKyAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogdHBtX3N3X3NldF9kZWJ1Z190cmFjZV9mbGFnCiAqCiAqIERFU0NSSVBUSU9OOgpAQCAtNDk4MSw2ICs1MDg4LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0VmFsID0gRVJSX1BIWV9TUkNfUE9SVF9DT05OX0lOVkFMSUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLyogVXBkYXRlIEdNQUMgc3BlZWQsIGR1cGxleCBhbmQgZmxvdyBjb250cm9sICovCisgICAgICAgIHJldFZhbCA9IHRwbV9zd19zZXRfZ21hY19zcGVlZF9kdXBsZXhfZmMob3duZXJfaWQsIHNyY19wb3J0LCAoc3RhdGUgPyB0cnVlIDogZmFsc2UpKTsKKyAgICAgICAgaWYgKHJldFZhbCAhPSBUUE1fUkNfT0spIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHVwZGF0ZSBHTUFDIGNvbmZpZyB3aXRoIHBvcnQlZFxuIiwgc3JjX3BvcnQpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KICAgICAgICAgbFBvcnQgPSB0cG1fZGJfZXRoX3BvcnRfc3dpdGNoX3BvcnRfZ2V0KHNyY19wb3J0KTsKQEAgLTY0NDQsNiArNjU1NywxMyBAQAogICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSCiAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIFBIWSBMU1AgQVBJIGNhbGwgZmFpbGVkIG9uIHBvcnQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzcmNfcG9ydCk7CiAgICAgICAgICAgICByZXRWYWwgPSBFUlJfUEhZX1NSQ19QT1JUX0NPTk5fSU5WQUxJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBHTUFDIHNwZWVkLCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCAqLworICAgICAgICAgICAgcmV0VmFsID0gdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyhvd25lcl9pZCwgc3JjX3BvcnQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gVFBNX1JDX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gdXBkYXRlIEdNQUMgY29uZmlnIHdpdGggcG9ydCVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KQEAgLTY2MTksNiArNjczOSwxMyBAQAogICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSCiAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIFBIWSBMU1AgQVBJIGNhbGwgZmFpbGVkIG9uIHBvcnQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzcmNfcG9ydCk7CiAgICAgICAgICAgICByZXRWYWwgPSBFUlJfUEhZX1NSQ19QT1JUX0NPTk5fSU5WQUxJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBHTUFDIHNwZWVkLCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCAqLworICAgICAgICAgICAgcmV0VmFsID0gdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyhvd25lcl9pZCwgc3JjX3BvcnQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gVFBNX1JDX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gdXBkYXRlIEdNQUMgY29uZmlnIHdpdGggcG9ydCVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KQEAgLTc4ODMsNiArODAxMCwxMyBAQAogICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSCiAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIFBIWSBMU1AgQVBJIGNhbGwgZmFpbGVkIG9uIHBvcnQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzcmNfcG9ydCk7CiAgICAgICAgICAgICByZXRWYWwgPSBFUlJfUEhZX1NSQ19QT1JUX0NPTk5fSU5WQUxJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBHTUFDIHNwZWVkLCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCAqLworICAgICAgICAgICAgcmV0VmFsID0gdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyhvd25lcl9pZCwgc3JjX3BvcnQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gVFBNX1JDX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gdXBkYXRlIEdNQUMgY29uZmlnIHdpdGggcG9ydCVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KQEAgLTgwMzYsMyArODE3MCw3MCBAQAogICAgICAgICAgICAgICAgICI9PUVYSVQ9PSAlc1xuXHIiLF9fRlVOQ1RJT05fXyk7CiAgICAgfQogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB0cG1fc3dfc2V0X3N0YXRpY19tdWx0aWNhc3RfbWFjCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgb3IgZGVzdG9yeSBhIHN0YXRpYyBNQUMgZW50cnkgaW4gdGhlIE1BQyBhZGRyZXNzIHRhYmxlIGZvciB0YWdldAorKiAgICAgICBVTkkgcG9ydCBiaXRtYXAgaW4gdGhlIGludGVncmF0ZWQgc3dpdGNoCisqCisqIElOUFVUUzoKKyogICAgICAgb3duZXJfaWQgICAgCS0gQVBQIG93bmVyIGlkLCBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIEFQSSBjYWxscy4KKyogICAgICAgdHBtX3RyZ19wb3J0ICAgIC0gdGFyZ2V0IHBvcnQgYm0gaW4gVU5JIHBvcnQgaW5kZXgsIFRQTV9UUkdfVU5JXzAgfCBUUE1fVFJHX1VOSV8xIHwgLi4uCisqICAgICAgIHN0YXRpY19tYWMgIAktIDYgYnl0ZSBuZXR3b3JrIG9yZGVyIE1BQyBzb3VyY2UgYWRkcmVzcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcyAtIFRQTV9SQ19PSy4KKyogICAgICAgT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UgLSBzZWUgdHBtX2Vycm9yX2NvZGVfdC4KKyoKKyogQ09NTUVOVFM6CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHBtX2Vycm9yX2NvZGVfdCB0cG1fc3dfc2V0X3N0YXRpY19tdWx0aWNhc3RfbWFjCisoCisgICAgdWludDMyX3QgICAgICAgICAgICBvd25lcl9pZCwKKyAgICB0cG1fdHJnX3BvcnRfdHlwZV90IHRwbV90cmdfcG9ydCwKKyAgICB1aW50OF90ICAgICAgICAgICAgIHN0YXRpY19tYWNbNl0KKykKK3sKKyAgICBpbnQzMl90IHJldF9jb2RlOworICAgIHVpbnQzMl90IHRyZ19wb3J0X2JtID0gMDsKKworICAgIFNXSVRDSF9JTklUX0NIRUNLKCk7CisKKyAgICBpZiAodHJhY2Vfc3dfZGJnX2ZsYWcpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAiPT1FTlRFUj09JXM6IG93bmVyX2lkWyVkXSx0cG1fdHJnX3BvcnRbMHgleF0sc3RhdGljX21hYyBbMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhdXG4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLG93bmVyX2lkLHRwbV90cmdfcG9ydCxzdGF0aWNfbWFjWzBdLHN0YXRpY19tYWNbMV0sIHN0YXRpY19tYWNbMl0sCisgICAgICAgICAgICAgICBzdGF0aWNfbWFjWzNdLHN0YXRpY19tYWNbNF0sIHN0YXRpY19tYWNbNV0pOworICAgIH0KKworCWlmKChzdGF0aWNfbWFjWzBdICE9IDB4MDEpICYmIChzdGF0aWNfbWFjWzBdICE9IDB4MzMgfHwgc3RhdGljX21hY1sxXSAhPSAweDMzKSkKKyAgICB7CisgICAgCXByaW50ayhLRVJOX0VSUgorICAgICAgICAgICAiJXM6JWQ6IGZ1bmN0aW9uIGZhaWxlZCwgMHgleDoleDoleDoleDoleDoleCBpcyBub3QgbXVsdGljYXN0IGFkZHJlc3MgXHJcbiIsIAorICAgICAgICAgICBfX0ZVTkNUSU9OX18sX19MSU5FX18sIHN0YXRpY19tYWNbMF0sIHN0YXRpY19tYWNbMV0sIHN0YXRpY19tYWNbMl0sIHN0YXRpY19tYWNbM10sIAorICAgICAgICAgICBzdGF0aWNfbWFjWzRdLCBzdGF0aWNfbWFjWzVdKTsKKyAgICAJSUZfRVJST1IoRVJSX1NXX01BQ19JTlZBTElEKTsKKyAgICB9CisgICAgCisgICAgdHJnX3BvcnRfYm0gPSB0cG1fZGJfdHJnX3BvcnRfc3dpdGNoX3BvcnRfZ2V0KHRwbV90cmdfcG9ydCk7CisKKyAgICBpZiAodHBtX3RyZ19wb3J0ID09IDApIHsKKyAgICAgICAgcmV0X2NvZGUgPSB0cG1fc3dfZGVsX3N0YXRpY19tYWMoVFBNX01PRF9PV05FUl9UUE0sIHN0YXRpY19tYWMpOworICAgICAgICBJRl9FUlJPUihyZXRfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0X2NvZGUgPSB0cG1fc3dfc2V0X3N0YXRpY19tYWNfd19wb3J0c19tYXNrKFRQTV9NT0RfT1dORVJfVFBNLCB0cmdfcG9ydF9ibSwgc3RhdGljX21hYyk7CisgICAgICAgIElGX0VSUk9SKHJldF9jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4oVFBNX1JDX09LKTsKK30KKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5jCmluZGV4IDNkNGQyZDAuLmZiYjU3NWYgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5jCkBAIC04MTk3LDYgKzgxOTcsMzAgQEAKICAgcmV0dXJuKHN0YXR1cyk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG12T251RXBvbk1hY1NlcmRlc1B1UnhXcml0ZQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiB3cml0ZSB0byBzZXJkZXMgcG93ZXIgdXAgcmVjZWl2ZXIgCisqKgorKiogIFBBUkFNRVRFUlM6ICBlbmFibGUgLSAwOiBwb3dlciBkb3duLCAxOiAgcG93ZXIgdXAKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIE1WX0VSUk9SCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdk9udUVwb25NYWNTZXJkZXNQdVJ4V3JpdGUoTVZfVTMyIGVuYWJsZSkKK3sKKyAgICBNVl9TVEFUVVMgc3RhdHVzOworCisgICAgc3RhdHVzID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8wX1BVX1JYLCBlbmFibGUsIDApOworCisgICAgcmV0dXJuKHN0YXR1cyk7Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251TWFjLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuaAppbmRleCA0MWM2MmI4Li5iMTE1YzFhIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuaApAQCAtNzM2LDYgKzczNiwxMSBAQAogTVZfU1RBVFVTIG12T251RXBvbk1hY0NwcVR4Q3RybFF1ZXVlRnJlZShNVl9VMzIgKmZyZWVDb3VudCwgTVZfVTMyIG1hY0lkKTsKIE1WX1NUQVRVUyBtdk9udUVwb25NYWNDcHFUeEN0cmxRdWV1ZVdyaXRlKE1WX1UzMiBkYXRhLCBNVl9VMzIgbWFjSWQpOwogCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICBTRVJERVMgRnVuY3Rpb25zIFNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitNVl9TVEFUVVMgbXZPbnVFcG9uTWFjU2VyZGVzUHVSeFdyaXRlKE1WX1UzMiBlbmFibGUpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmMKaW5kZXggOGNlODNmMC4uYWYzOWY0MiAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251UmVncy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuYwpAQCAtNzExLDcgKzcxMSwxMiBAQAogICBbbXZBc2ljUmVnX1BPTl9ER19USFJFU0hPTERdICAgICAgICAgICAgICAgICAgICAgID0ge212QXNpY1JlZ19QT05fREdfVEhSRVNIT0xELCAgICAgICAgICAgICAgICAgICAgICAweDE4Mjc0LCAgICAgICAgICAgICAgICAgICAgICAgICAweDE4Mjc0LCAgYXNpY1JXLCAgICAgMHgwMDAwMDAwMCwgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICJPTlUgRHlpbmcgR2FzcCB0aHJlc2hvbGQifSwKICAgW212QXNpY1JlZ19QVF9QQVRURVJOX1NFTEVDVF0gICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9TRUxFQ1QsICAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgIGFzaWNSVywgICAgIDB4MDAwMDAwMDcsICAgICA1LCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgcGF0dGVybiBzZWxlY3QifSwKICAgW212QXNpY1JlZ19QVF9QQVRURVJOX0VOQUJMRURdICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9FTkFCTEVELCAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgIGFzaWNSVywgICAgIDB4MDAwMDAwMDEsICAgICAxNSwgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgcGF0dGVybiBlbmFibGVkIn0sCi0gIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBXSAgICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fREFUQSwgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNkMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNkMsICBhc2ljUlcsICAgICAweDAwMDAwMEZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHBhdHRlcm4gZGF0YSJ9LAorICBbbXZBc2ljUmVnX1BUX1BBVFRFUk5fREFUQV0gICAgICAgICAgICAgICAgICAgICAgID0ge212QXNpY1JlZ19QVF9QQVRURVJOX0RBVEEsICAgICAgICAgICAgICAgICAgICAgICAweEEyRTZDLCAgICAgICAgICAgICAgICAgICAgICAgICAweEEyRTZDLCAgYXNpY1JXLCAgICAgMHgwMDAwMDBGRiwgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICJQSFkgdGVzdCBwYXR0ZXJuIGRhdGEgLyB1c2VyIHBhdHRlcm4gWzE1OjBdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDFdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAxLCAgICAgICAgICAgICAgIDB4QTJFNjgsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNjgsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbMzE6MTZdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDJdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAyLCAgICAgICAgICAgICAgIDB4QTJFNjQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNjQsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbNDc6MzJdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDNdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAzLCAgICAgICAgICAgICAgIDB4QTJFNjAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNjAsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbNjM6NDhdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDRdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA0LCAgICAgICAgICAgICAgIDB4QTJFNUMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNUMsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbNzk6NjRdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDVdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA1LCAgICAgICAgICAgICAgIDB4QTJFNTgsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNTgsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbOTY6ODBdIn0sCiAgIFttdkFzaWNSZWdfR1VOSVRfVFhfMF9RVUVVRVNdICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX0dVTklUX1RYXzBfUVVFVUVTLCAgICAgICAgICAgICAgICAgICAgIDB4QTU5MDAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTU5MDAsICBhc2ljUlcsICAgICAweEZGRkZGRkZGLCAgICAgMCwgICAgICA4LCAgICAgMSwgICAgICAwLCAgICAgIkdQT04gR1VOSVQgUXVldWVzIGZvciBUWCAwIn0sCiAgIFttdkFzaWNSZWdfR1VOSVRfVFhfMV9RVUVVRVNdICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX0dVTklUX1RYXzFfUVVFVUVTLCAgICAgICAgICAgICAgICAgICAgIDB4QTVEMDAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTVEMDAsICBhc2ljUlcsICAgICAweEZGRkZGRkZGLCAgICAgMCwgICAgICA4LCAgICAgMSwgICAgICAwLCAgICAgIkdQT04gR1VOSVQgUXVldWVzIGZvciBUWCAxIn0sCiAgIFttdkFzaWNSZWdfR1VOSVRfVFhfMl9RVUVVRVNdICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX0dVTklUX1RYXzJfUVVFVUVTLCAgICAgICAgICAgICAgICAgICAgIDB4QTc5MDAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTc5MDAsICBhc2ljUlcsICAgICAweEZGRkZGRkZGLCAgICAgMCwgICAgICA4LCAgICAgMSwgICAgICAwLCAgICAgIkdQT04gR1VOSVQgUXVldWVzIGZvciBUWCAyIn0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmgKaW5kZXggOTZhNmJhMy4uY2RlMTQxOCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251UmVncy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuaApAQCAtNjA3LDMzICs2MDcsMzggQEAKICAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICAgPSA0NTcsCiAgIG12QXNpY1JlZ19QVF9QQVRURVJOX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgID0gNDU4LAogICBtdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1OSwKKyAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAxICAgICAgICAgICAgICAgICAgPSA0NjAsCisgIG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMiAgICAgICAgICAgICAgICAgID0gNDYxLAorICBtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDMgICAgICAgICAgICAgICAgICA9IDQ2MiwKKyAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA0ICAgICAgICAgICAgICAgICAgPSA0NjMsCisgIG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wNSAgICAgICAgICAgICAgICAgID0gNDY0LAogCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8wX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDYwLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMV9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2MSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzJfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjIsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8zX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDYzLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNF9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NCwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzVfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjUsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF82X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDY2LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfN19RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzAsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8xX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDcxLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3MiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzMsCisgIG12QXNpY1JlZ19HVU5JVF9UWF80X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDc0LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3NSwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzYsCisgIG12QXNpY1JlZ19HVU5JVF9UWF83X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDc3LAogCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8wX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDcwLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMV9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3MSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzJfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0NzIsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8zX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDczLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNF9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3NCwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzVfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0NzUsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF82X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDc2LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfN19QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3NywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODAsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8xX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDgxLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ4MiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODMsCisgIG12QXNpY1JlZ19HVU5JVF9UWF80X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDg0LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ4NSwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODYsCisgIG12QXNpY1JlZ19HVU5JVF9UWF83X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDg3LAogCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8wX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDgwLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMV9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4MSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzJfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0ODIsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8zX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDgzLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNF9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4NCwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzVfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0ODUsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF82X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDg2LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfN19QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4NywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTAsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8xX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDkxLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ5MiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTMsCisgIG12QXNpY1JlZ19HVU5JVF9UWF80X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDk0LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ5NSwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTYsCisgIG12QXNpY1JlZ19HVU5JVF9UWF83X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDk3LAogCiAjZW5kaWYgLyogUE9OX0ZQR0EgKi8KICAgbXZBc2ljUmVnX01BWF9OVU1fT0ZfUkVHUwo=