ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGZhMmY2ZjguLmEzMDc3MTkgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMjUsNiArMjUsNyBAQAogCSAgICAgIGxpYmxvZyBcCiAJICAgICAgbGlibmV0dXRpbHMgXAogCSAgICAgIGxpYnBpeGVsZmxpbmdlciBcCisJICAgICAgbGlidXNiaG9zdCBcCiAJICAgICAgbGliemlwZmlsZSBcCiAJICAgKSkKIGVuZGlmCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKaW5kZXggYjg0ZTFiNjUuLjg2MTFkM2IgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTQ3LDMgKzQ3LDYgQEAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvcm9vdC9pbml0LnJjKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvcm9vdC9pbml0LnJjKQpkaWZmIC0tZ2l0IGEvYWRiL0FuZHJvaWQubWsgYi9hZGIvQW5kcm9pZC5tawppbmRleCA3ZmFjYTliLi5lODkzY2E5IDEwMDY0NAotLS0gYS9hZGIvQW5kcm9pZC5taworKysgYi9hZGIvQW5kcm9pZC5tawpAQCAtODMsNyArODMsNyBAQAogCiBpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQogCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWQsJChMT0NBTF9CVUlMVF9NT0RVTEUpKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRpc3RfZmlsZXMsJChMT0NBTF9CVUlMVF9NT0RVTEUpKQogCiBpZmVxICgkKEhPU1RfT1MpLHdpbmRvd3MpCiAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiBcCkBAIC0xMTMsNiArMTEzLDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAlhZGIuYyBcCisJYmFja3VwX3NlcnZpY2UuYyBcCiAJZmRldmVudC5jIFwKIAl0cmFuc3BvcnQuYyBcCiAJdHJhbnNwb3J0X2xvY2FsLmMgXApAQCAtMTUyLDMgKzE1Myw0OCBAQAogZW5kaWYKIAogZW5kaWYKKworCisjIGFkYiBob3N0IHRvb2wgZm9yIGRldmljZS1hcy1ob3N0CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKK2lmbmVxICgkKFNES19PTkxZKSx0cnVlKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0xETElCUyA6PSAtbHJ0IC1sbmN1cnNlcyAtbHB0aHJlYWQKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlhZGIuYyBcCisJYmFja3VwX3NlcnZpY2UuYyBcCisJY29uc29sZS5jIFwKKwl0cmFuc3BvcnQuYyBcCisJdHJhbnNwb3J0X2xvY2FsLmMgXAorCXRyYW5zcG9ydF91c2IuYyBcCisJY29tbWFuZGxpbmUuYyBcCisJYWRiX2NsaWVudC5jIFwKKwlzb2NrZXRzLmMgXAorCXNlcnZpY2VzLmMgXAorCWZpbGVfc3luY19jbGllbnQuYyBcCisJZ2V0X215X3BhdGhfbGludXguYyBcCisJdXNiX2xpbnV4LmMgXAorCXV0aWxzLmMgXAorCXVzYl92ZW5kb3JzLmMgXAorCWZkZXZlbnQuYworCitMT0NBTF9DRkxBR1MgOj0gXAorCS1PMiBcCisJLWcgXAorCS1EQURCX0hPU1Q9MSBcCisJLURBREJfSE9TVF9PTl9UQVJHRVQ9MSBcCisJLVdhbGwgXAorCS1Xbm8tdW51c2VkLXBhcmFtZXRlciBcCisJLURfWE9QRU5fU09VUkNFIFwKKwktRF9HTlVfU09VUkNFCisKK0xPQ0FMX01PRFVMRSA6PSBhZGIKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ6aXBmaWxlIGxpYnVueiBsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCitlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2FkYi9hZGIuYyBiL2FkYi9hZGIuYwppbmRleCBkOWY5NmRmLi5iMGE3MGRjIDEwMDY0NAotLS0gYS9hZGIvYWRiLmMKKysrIGIvYWRiL2FkYi5jCkBAIC0zNiw2ICszNiw5IEBACiAjaW5jbHVkZSAidXNiX3ZlbmRvcnMuaCIKICNlbmRpZgogCisjaWYgQURCX1RSQUNFCitBREJfTVVURVhfREVGSU5FKCBEX2xvY2sgKTsKKyNlbmRpZgogCiBpbnQgSE9TVCA9IDA7CiAKQEAgLTkwLDYgKzkzLDcgQEAKICAgICAgICAgeyAic3lzZGVwcyIsIFRSQUNFX1NZU0RFUFMgfSwKICAgICAgICAgeyAidHJhbnNwb3J0IiwgVFJBQ0VfVFJBTlNQT1JUIH0sCiAgICAgICAgIHsgImpkd3AiLCBUUkFDRV9KRFdQIH0sCisgICAgICAgIHsgInNlcnZpY2VzIiwgVFJBQ0VfU0VSVklDRVMgfSwKICAgICAgICAgeyBOVUxMLCAwIH0KICAgICB9OwogCkBAIC0zMDIsOCArMzA2LDEwIEBACiB7CiAgICAgYXNvY2tldCAqczsKIAotICAgIEQoImhhbmRsZV9wYWNrZXQoKSAlZFxuIiwgcC0+bXNnLmNvbW1hbmQpOwotCisgICAgRCgiaGFuZGxlX3BhY2tldCgpICVjJWMlYyVjXG4iLCAoKGNoYXIqKSAoJihwLT5tc2cuY29tbWFuZCkpKVswXSwKKyAgICAgICAgICAgICgoY2hhciopICgmKHAtPm1zZy5jb21tYW5kKSkpWzFdLAorICAgICAgICAgICAgKChjaGFyKikgKCYocC0+bXNnLmNvbW1hbmQpKSlbMl0sCisgICAgICAgICAgICAoKGNoYXIqKSAoJihwLT5tc2cuY29tbWFuZCkpKVszXSk7CiAgICAgcHJpbnRfcGFja2V0KCJyZWN2IiwgcCk7CiAKICAgICBzd2l0Y2gocC0+bXNnLmNvbW1hbmQpewpAQCAtNTg5LDE0ICs1OTUsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0jaWZkZWYgSEFWRV9GT1JLRVhFQwotc3RhdGljIHZvaWQgc2lnY2hsZF9oYW5kbGVyKGludCBuKQotewotICAgIGludCBzdGF0dXM7Ci0gICAgd2hpbGUod2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORykgPiAwKSA7Ci19Ci0jZW5kaWYKLQogI2lmZGVmIEhBVkVfV0lOMzJfUFJPQwogc3RhdGljIEJPT0wgV0lOQVBJIGN0cmxjX2hhbmRsZXIoRFdPUkQgdHlwZSkKIHsKQEAgLTYzOSw2ICs2MzcsNyBAQAogCiAgICAgZmQgPSB1bml4X29wZW4oIi9kZXYvbnVsbCIsIE9fUkRPTkxZKTsKICAgICBkdXAyKGZkLCAwKTsKKyAgICBhZGJfY2xvc2UoZmQpOwogCiAgICAgZmQgPSB1bml4X29wZW4oIi90bXAvYWRiLmxvZyIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5ELCAwNjQwKTsKICAgICBpZihmZCA8IDApIHsKQEAgLTY0Niw2ICs2NDUsNyBAQAogICAgIH0KICAgICBkdXAyKGZkLCAxKTsKICAgICBkdXAyKGZkLCAyKTsKKyAgICBhZGJfY2xvc2UoZmQpOwogICAgIGZwcmludGYoc3RkZXJyLCItLS0gYWRiIHN0YXJ0aW5nIChwaWQgJWQpIC0tLVxuIiwgZ2V0cGlkKCkpOwogI2VuZGlmCiB9CkBAIC02ODAsOSArNjgwLDExIEBACiAgICAgZHVwMihmZCwgMSk7CiAgICAgZHVwMihmZCwgMik7CiAgICAgZnByaW50ZihzdGRlcnIsIi0tLSBhZGIgc3RhcnRpbmcgKHBpZCAlZCkgLS0tXG4iLCBnZXRwaWQoKSk7CisgICAgYWRiX2Nsb3NlKGZkKTsKIAogICAgIGZkID0gdW5peF9vcGVuKCIvZGV2L251bGwiLCBPX1JET05MWSk7CiAgICAgZHVwMihmZCwgMCk7CisgICAgYWRiX2Nsb3NlKGZkKTsKIH0KICNlbmRpZgogCkBAIC04MDMsOSArODA1LDEwIEBACiAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSAiT0tcbiIgbWVzc2FnZQogICAgICAgICBhZGJfY2xvc2UoZmRbMV0pOwogICAgICAgICBpbnQgcmV0ID0gYWRiX3JlYWQoZmRbMF0sIHRlbXAsIDMpOworICAgICAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKICAgICAgICAgYWRiX2Nsb3NlKGZkWzBdKTsKICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHJlYWQgb2sgZnJvbSBBREIgU2VydmVyLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCByZWFkIG9rIGZyb20gQURCIFNlcnZlciwgZXJybm8gPSAlZFxuIiwgc2F2ZWRfZXJybm8pOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZXQgIT0gMyB8fCB0ZW1wWzBdICE9ICdPJyB8fCB0ZW1wWzFdICE9ICdLJyB8fCB0ZW1wWzJdICE9ICdcbicpIHsKQEAgLTg0NCw3ICs4NDcsNyBAQAogI2lmZGVmIEhBVkVfV0lOMzJfUFJPQwogICAgIFNldENvbnNvbGVDdHJsSGFuZGxlciggY3RybGNfaGFuZGxlciwgVFJVRSApOwogI2VsaWYgZGVmaW5lZChIQVZFX0ZPUktFWEVDKQotICAgIHNpZ25hbChTSUdDSExELCBzaWdjaGxkX2hhbmRsZXIpOworICAgIC8vIE5vIFNJR0NITEQuIExldCB0aGUgc2VydmljZSBzdWJwcm9jIGhhbmRsZSBpdHMgY2hpbGRyZW4uCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogI2VuZGlmCiAKQEAgLTg3Myw3ICs4NzYsNyBAQAogICAgICAgICAgICAgLy8gZG9uJ3QgcnVuIGFzIHJvb3QgaWYgcm8uc2VjdXJlIGlzIHNldC4uLgogICAgICAgICAgICAgc2VjdXJlID0gMTsKIAotICAgICAgICAgICAgLy8gLi4uIGV4Y2VwdCB3ZSBhbGxvdyBydW5uaW5nIGFzIHJvb3QgaW4gdXNlcmRlYnVnIGJ1aWxkcyBpZiB0aGUgCisgICAgICAgICAgICAvLyAuLi4gZXhjZXB0IHdlIGFsbG93IHJ1bm5pbmcgYXMgcm9vdCBpbiB1c2VyZGVidWcgYnVpbGRzIGlmIHRoZQogICAgICAgICAgICAgLy8gc2VydmljZS5hZGIucm9vdCBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgYnkgdGhlICJhZGIgcm9vdCIgY29tbWFuZAogICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5kZWJ1Z2dhYmxlIiwgdmFsdWUsICIiKTsKICAgICAgICAgICAgIGlmIChzdHJjbXAodmFsdWUsICIxIikgPT0gMCkgewpAQCAtOTUzLDcgKzk1Niw5IEBACiAgICAgICAgIC8vIGxpc3RlbiBvbiBkZWZhdWx0IHBvcnQKICAgICAgICAgbG9jYWxfaW5pdChERUZBVUxUX0FEQl9MT0NBTF9UUkFOU1BPUlRfUE9SVCk7CiAgICAgfQorICAgIEQoImFkYl9tYWluKCk6IHByZSBpbml0X2pkd3AoKVxuIik7CiAgICAgaW5pdF9qZHdwKCk7CisgICAgRCgiYWRiX21haW4oKTogcG9zdCBpbml0X2pkd3AoKVxuIik7CiAjZW5kaWYKIAogICAgIGlmIChpc19kYWVtb24pCkBAIC05NjcsNiArOTcyLDcgQEAKICNlbmRpZgogICAgICAgICBzdGFydF9sb2dnaW5nKCk7CiAgICAgfQorICAgIEQoIkV2ZW50IGxvb3Agc3RhcnRpbmdcbiIpOwogCiAgICAgZmRldmVudF9sb29wKCk7CiAKQEAgLTEyNjQsOSArMTI3MCwxMCBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0gICAgYWRiX3RyYWNlX2luaXQoKTsKICNpZiBBREJfSE9TVAogICAgIGFkYl9zeXNkZXBzX2luaXQoKTsKKyAgICBhZGJfdHJhY2VfaW5pdCgpOworICAgIEQoIkhhbmRsaW5nIGNvbW1hbmRsaW5lKClcbiIpOwogICAgIHJldHVybiBhZGJfY29tbWFuZGxpbmUoYXJnYyAtIDEsIGFyZ3YgKyAxKTsKICNlbHNlCiAgICAgaWYoKGFyZ2MgPiAxKSAmJiAoIXN0cmNtcChhcmd2WzFdLCJyZWNvdmVyeSIpKSkgewpAQCAtMTI3NSw2ICsxMjgyLDcgQEAKICAgICB9CiAKICAgICBzdGFydF9kZXZpY2VfbG9nKCk7CisgICAgRCgiSGFuZGxpbmcgbWFpbigpXG4iKTsKICAgICByZXR1cm4gYWRiX21haW4oMCwgREVGQVVMVF9BREJfUE9SVCk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FkYi9hZGIuaCBiL2FkYi9hZGIuaAppbmRleCAzZDJhNzdiLi4zMThhMmQ4IDEwMDY0NAotLS0gYS9hZGIvYWRiLmgKKysrIGIvYWRiL2FkYi5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2luY2x1ZGUgInRyYW5zcG9ydC5oIiAgLyogcmVhZHgoKSwgd3JpdGV4KCkgKi8KKwogI2RlZmluZSBNQVhfUEFZTE9BRCA0MDk2CiAKICNkZWZpbmUgQV9TWU5DIDB4NDM0ZTU5NTMKQEAgLTMzLDcgKzM1LDcgQEAKICNkZWZpbmUgQURCX1ZFUlNJT05fTUFKT1IgMSAgICAgICAgIC8vIFVzZWQgZm9yIGhlbHAvdmVyc2lvbiBpbmZvcm1hdGlvbgogI2RlZmluZSBBREJfVkVSU0lPTl9NSU5PUiAwICAgICAgICAgLy8gVXNlZCBmb3IgaGVscC92ZXJzaW9uIGluZm9ybWF0aW9uCiAKLSNkZWZpbmUgQURCX1NFUlZFUl9WRVJTSU9OICAgIDI2ICAgIC8vIEluY3JlbWVudCB0aGlzIHdoZW4gd2Ugd2FudCB0byBmb3JjZSB1c2VycyB0byBzdGFydCBhIG5ldyBhZGIgc2VydmVyCisjZGVmaW5lIEFEQl9TRVJWRVJfVkVSU0lPTiAgICAyNyAgICAvLyBJbmNyZW1lbnQgdGhpcyB3aGVuIHdlIHdhbnQgdG8gZm9yY2UgdXNlcnMgdG8gc3RhcnQgYSBuZXcgYWRiIHNlcnZlcgogCiB0eXBlZGVmIHN0cnVjdCBhbWVzc2FnZSBhbWVzc2FnZTsKIHR5cGVkZWYgc3RydWN0IGFwYWNrZXQgYXBhY2tldDsKQEAgLTMwMiw2ICszMDQsNyBAQAogI2VuZGlmCiAKICNpZiAhQURCX0hPU1QKK2ludCBiYWNrdXBfc2VydmljZShjaGFyKiBhcmdzKTsKIHZvaWQgZnJhbWVidWZmZXJfc2VydmljZShpbnQgZmQsIHZvaWQgKmNvb2tpZSk7CiB2b2lkIGxvZ19zZXJ2aWNlKGludCBmZCwgdm9pZCAqY29va2llKTsKIHZvaWQgcmVtb3VudF9zZXJ2aWNlKGludCBmZCwgdm9pZCAqY29va2llKTsKQEAgLTMxNSwxMyArMzE4LDYgQEAKIGludCBjaGVja19oZWFkZXIoYXBhY2tldCAqcCk7CiBpbnQgY2hlY2tfZGF0YShhcGFja2V0ICpwKTsKIAotLyogY29udmVuaWVuY2Ugd3JhcHBlcnMgYXJvdW5kIHJlYWQvd3JpdGUgdGhhdCB3aWxsIHJldHJ5IG9uCi0qKiBFSU5UUiBhbmQvb3Igc2hvcnQgcmVhZC93cml0ZS4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMQotKiogb24gZXJyb3Igb3IgRU9GLgotKi8KLWludCByZWFkeChpbnQgZmQsIHZvaWQgKnB0ciwgc2l6ZV90IGxlbik7Ci1pbnQgd3JpdGV4KGludCBmZCwgY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgbGVuKTsKLQogLyogZGVmaW5lIEFEQl9UUkFDRSB0byAxIHRvIGVuYWJsZSB0cmFjaW5nIHN1cHBvcnQsIG9yIDAgdG8gZGlzYWJsZSBpdCAqLwogCiAjZGVmaW5lICBBREJfVFJBQ0UgICAgMQpAQCAtMzMxLDMzICszMjcsNTYgQEAKICAqIHRoZSBhZGJfdHJhY2VfaW5pdCgpIGZ1bmN0aW9uIGltcGxlbWVudGVkIGluIGFkYi5jCiAgKi8KIHR5cGVkZWYgZW51bSB7Ci0gICAgVFJBQ0VfQURCID0gMCwKKyAgICBUUkFDRV9BREIgPSAwLCAgIC8qIDB4MDAxICovCiAgICAgVFJBQ0VfU09DS0VUUywKICAgICBUUkFDRV9QQUNLRVRTLAogICAgIFRSQUNFX1RSQU5TUE9SVCwKLSAgICBUUkFDRV9SV1gsCisgICAgVFJBQ0VfUldYLCAgICAgICAvKiAweDAxMCAqLwogICAgIFRSQUNFX1VTQiwKICAgICBUUkFDRV9TWU5DLAogICAgIFRSQUNFX1NZU0RFUFMsCi0gICAgVFJBQ0VfSkRXUCwKKyAgICBUUkFDRV9KRFdQLCAgICAgIC8qIDB4MTAwICovCisgICAgVFJBQ0VfU0VSVklDRVMsCiB9IEFkYlRyYWNlOwogCiAjaWYgQURCX1RSQUNFCiAKLSAgaW50ICAgICBhZGJfdHJhY2VfbWFzazsKLQorICBleHRlcm4gaW50ICAgICBhZGJfdHJhY2VfbWFzazsKKyAgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgICAgYWRiX3RyYWNlX291dHB1dF9jb3VudDsKICAgdm9pZCAgICBhZGJfdHJhY2VfaW5pdCh2b2lkKTsKIAogIyAgZGVmaW5lIEFEQl9UUkFDSU5HICAoKGFkYl90cmFjZV9tYXNrICYgKDEgPDwgVFJBQ0VfVEFHKSkgIT0gMCkKIAogICAvKiB5b3UgbXVzdCBkZWZpbmUgVFJBQ0VfVEFHIGJlZm9yZSB1c2luZyB0aGlzIG1hY3JvICovCi0gICNkZWZpbmUgIEQoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIyAgZGVmaW5lICBEKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoQURCX1RSQUNJTkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKEFEQl9UUkFDSU5HKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYWRiX211dGV4X2xvY2soJkRfbG9jayk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6OiVzKCk6IiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOyAgICAgICBcCisgICAgICAgICAgICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyApOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYWRiX211dGV4X3VubG9jaygmRF9sb2NrKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVycm5vID0gc2F2ZV9lcnJubzsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKDApCisjICBkZWZpbmUgIERSKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChBREJfVFJBQ0lORykgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFkYl9tdXRleF9sb2NrKCZEX2xvY2spOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlcnJubyA9IHNhdmVfZXJybm87ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fICk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhZGJfbXV0ZXhfdW5sb2NrKCZEX2xvY2spOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSB3aGlsZSAoMCkKICNlbHNlCiAjICBkZWZpbmUgIEQoLi4uKSAgICAgICAgICAoKHZvaWQpMCkKKyMgIGRlZmluZSAgRFIoLi4uKSAgICAgICAgICgodm9pZCkwKQogIyAgZGVmaW5lICBBREJfVFJBQ0lORyAgICAgMAogI2VuZGlmCiAKQEAgLTM2Niw3ICszODUsMTUgQEAKICNkZWZpbmUgcHJpbnRfcGFja2V0KHRhZyxwKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi0jZGVmaW5lIERFRkFVTFRfQURCX1BPUlQgNTAzNworI2lmIEFEQl9IT1NUX09OX1RBUkdFVAorLyogYWRiIGFuZCBhZGJkIGFyZSBjb2V4aXN0aW5nIG9uIHRoZSB0YXJnZXQsIHNvIHVzZSA1MDM4IGZvciBhZGIKKyAqIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggYWRiZCdzIHVzYWdlIG9mIDUwMzcKKyAqLworIyAgZGVmaW5lIERFRkFVTFRfQURCX1BPUlQgNTAzOAorI2Vsc2UKKyMgIGRlZmluZSBERUZBVUxUX0FEQl9QT1JUIDUwMzcKKyNlbmRpZgorCiAjZGVmaW5lIERFRkFVTFRfQURCX0xPQ0FMX1RSQU5TUE9SVF9QT1JUIDU1NTUKIAogI2RlZmluZSBBREJfQ0xBU1MgICAgICAgICAgICAgIDB4ZmYKQEAgLTQwNSw2ICs0MzIsNyBAQAogI2RlZmluZSBDU19OT1BFUk0gICAgIDUgLyogSW5zdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRldmljZSAqLwogCiBleHRlcm4gaW50IEhPU1Q7CitleHRlcm4gaW50IFNIRUxMX0VYSVRfTk9USUZZX0ZEOwogCiAjZGVmaW5lIENIVU5LX1NJWkUgKDY0KjEwMjQpCiAKZGlmZiAtLWdpdCBhL2FkYi9hZGJfY2xpZW50LmMgYi9hZGIvYWRiX2NsaWVudC5jCmluZGV4IDg4MjgxMGEuLjlhODEyZjAgMTAwNjQ0Ci0tLSBhL2FkYi9hZGJfY2xpZW50LmMKKysrIGIvYWRiL2FkYl9jbGllbnQuYwpAQCAtMjAyLDYgKzIwMiw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICBEKCJfYWRiX2Nvbm5lY3Q6IHJldHVybiBmZCAlZFxuIiwgZmQpOwogICAgIHJldHVybiBmZDsKIH0KIApAQCAtMjEwLDYgKzIxMSw3IEBACiAgICAgLy8gZmlyc3QgcXVlcnkgdGhlIGFkYiBzZXJ2ZXIncyB2ZXJzaW9uCiAgICAgaW50IGZkID0gX2FkYl9jb25uZWN0KCJob3N0OnZlcnNpb24iKTsKIAorICAgIEQoImFkYl9jb25uZWN0OiBzZXJ2aWNlICVzXG4iLCBzZXJ2aWNlKTsKICAgICBpZihmZCA9PSAtMikgewogICAgICAgICBmcHJpbnRmKHN0ZG91dCwiKiBkYWVtb24gbm90IHJ1bm5pbmcuIHN0YXJ0aW5nIGl0IG5vdyBvbiBwb3J0ICVkICpcbiIsCiAgICAgICAgICAgICAgICAgX19hZGJfc2VydmVyX3BvcnQpOwpAQCAtMjY2LDYgKzI2OCw3IEBACiAgICAgaWYoZmQgPT0gLTIpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsIioqIGRhZW1vbiBzdGlsbCBub3QgcnVubmluZyIpOwogICAgIH0KKyAgICBEKCJhZGJfY29ubmVjdDogcmV0dXJuIGZkICVkXG4iLCBmZCk7CiAKICAgICByZXR1cm4gZmQ7CiBlcnJvcjoKZGlmZiAtLWdpdCBhL2FkYi9iYWNrdXBfc2VydmljZS5jIGIvYWRiL2JhY2t1cF9zZXJ2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1NWVmYwotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9iYWNrdXBfc2VydmljZS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInN5c2RlcHMuaCIKKworI2RlZmluZSBUUkFDRV9UQUcgIFRSQUNFX0FEQgorI2luY2x1ZGUgImFkYi5oIgorCisvKiByZXR1cm5zIHRoZSBkYXRhIHNvY2tldCBwYXNzaW5nIHRoZSBiYWNrdXAgZGF0YSBoZXJlIGZvciBmb3J3YXJkaW5nICovCitpbnQgYmFja3VwX3NlcnZpY2UoY2hhciogYXJncykgeworICAgIHBpZF90IHBpZDsKKyAgICBpbnQgc1syXTsKKworICAgIEQoImJhY2t1cF9zZXJ2aWNlKCVzKVxuIiwgYXJncyk7CisKKyAgICAvLyBzZXQgdXAgdGhlIHBpcGUgZnJvbSB0aGUgc3VicHJvY2VzcyB0byBoZXJlCisgICAgLy8gcGFyZW50IHdpbGwgcmVhZCBzWzBdOyBjaGlsZCB3aWxsIHdyaXRlIHNbMV0KKyAgICBpZiAoYWRiX3NvY2tldHBhaXIocykpIHsKKyAgICAgICAgRCgiY2FuJ3QgY3JlYXRlIGJhY2t1cCBzb2NrZXRwYWlyXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY3JlYXRlIGJhY2t1cCBzb2NrZXRwYWlyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIHNwaW4gb2ZmIHRoZSBjaGlsZCBwcm9jZXNzIHRvIHJ1biB0aGUgYmFja3VwIGNvbW1hbmQKKyAgICBwaWQgPSBmb3JrKCk7CisgICAgaWYgKHBpZCA8IDApIHsKKyAgICAgICAgLy8gZmFpbHVyZQorICAgICAgICBEKCJjYW4ndCBmb3JrIGZvciBiYWNrdXBcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBmb3JrIGZvciBiYWNrdXBcbiIpOworICAgICAgICBhZGJfY2xvc2Uoc1swXSk7CisgICAgICAgIGFkYl9jbG9zZShzWzFdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIEdyZWF0LCB3ZSdyZSBvZmYgYW5kIHJ1bm5pbmcuCisgICAgaWYgKHBpZCA9PSAwKSB7CisgICAgICAgIGNoYXIqIHA7CisgICAgICAgIGludCBhcmdjOworICAgICAgICBjaGFyKiogYmFja3VwX2FyZ3M7CisKKyAgICAgICAgLy8gY2hpbGQgLS0gYWN0dWFsbHkgcnVuIHRoZSBiYWNrdXAgaGVyZQorICAgICAgICBhcmdjID0gMjsgLy8gcm9vbSBmb3IgdGhlIGJhc2ljICdidScgYXJndlswXSBhbmQgJ2JhY2t1cCcgYXJndlsxXQorICAgICAgICBmb3IgKHAgPSAoY2hhciopYXJnczsgcCAmJiAqcDsgKSB7CisgICAgICAgICAgICBhcmdjKys7CisgICAgICAgICAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJzonKSBwKys7CisgICAgICAgICAgICBpZiAoKnAgPT0gJzonKSBwKys7CisgICAgICAgIH0KKworICAgICAgICBiYWNrdXBfYXJncyA9IChjaGFyKiopIGFsbG9jYShhcmdjKnNpemVvZihjaGFyKikgKyAxKTsKKyAgICAgICAgYmFja3VwX2FyZ3NbMF0gPSAiYnUiOworICAgICAgICBiYWNrdXBfYXJnc1sxXSA9ICJiYWNrdXAiOworICAgICAgICBhcmdjID0gMjsgICAvLyBydW4gdGhyb3VnaCBhZ2FpbiB0byBidWlsZCB0aGUgYXJndiBhcnJheQorICAgICAgICBmb3IgKHAgPSAoY2hhciopYXJnczsgKnA7ICkgeworICAgICAgICAgICAgYmFja3VwX2FyZ3NbYXJnYysrXSA9IHA7CisgICAgICAgICAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJzonKSBwKys7CisgICAgICAgICAgICBpZiAoKnAgPT0gJzonKSB7CisgICAgICAgICAgICAgICAgKnAgPSAwOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiYWNrdXBfYXJnc1thcmdjXSA9IE5VTEw7CisKKyAgICAgICAgLy8gQ2xvc2UgdGhlIGhhbGYgb2YgdGhlIHNvY2tldCB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQsIHJvdXRlICdidSdzIGNvbnNvbGUKKyAgICAgICAgLy8gdG8gdGhlIG91dHB1dCBzb2NrZXQsIGFuZCBvZmYgd2UgZ28KKyAgICAgICAgYWRiX2Nsb3NlKHNbMF0pOworICAgICAgICBkdXAyKHNbMV0sIFNURE9VVF9GSUxFTk8pOworCisgICAgICAgIC8vIG9mZiB3ZSBnbworICAgICAgICBleGVjdnAoIi9zeXN0ZW0vYmluL2J1IiwgKGNoYXIgKiBjb25zdCAqKWJhY2t1cF9hcmdzKTsKKyAgICAgICAgLy8gb29wcyBlcnJvciAtIGNsb3NlIHVwIHNob3AgYW5kIGdvIGhvbWUKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZXhlYyAnYnUnLCBiYWlsaW5nXG4iKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcGFyZW50LCBpLmUuIGFkYmQgLS0gY2xvc2UgdGhlIHNlbmRpbmcgaGFsZiBvZiB0aGUgc29ja2V0CisgICAgICAgIGFkYl9jbG9zZShzWzFdKTsKKyAgICB9CisKKyAgICAvLyB3ZSdsbCBiZSByZWFkaW5nIGZyb20gc1swXSBhcyB0aGUgZGF0YSBpcyBzZW50IGJ5IHRoZSBjaGlsZCBwcm9jZXNzCisgICAgcmV0dXJuIHNbMF07Cit9CmRpZmYgLS1naXQgYS9hZGIvY29tbWFuZGxpbmUuYyBiL2FkYi9jb21tYW5kbGluZS5jCmluZGV4IGRjYmE4M2IuLjczM2NiZmYgMTAwNjQ0Ci0tLSBhL2FkYi9jb21tYW5kbGluZS5jCisrKyBiL2FkYi9jb21tYW5kbGluZS5jCkBAIC0zNywxMiArMzcsNiBAQAogI2luY2x1ZGUgImFkYl9jbGllbnQuaCIKICNpbmNsdWRlICJmaWxlX3N5bmNfc2VydmljZS5oIgogCi1lbnVtIHsKLSAgICBJR05PUkVfREFUQSwKLSAgICBXSVBFX0RBVEEsCi0gICAgRkxBU0hfREFUQQotfTsKLQogc3RhdGljIGludCBkb19jbWQodHJhbnNwb3J0X3R5cGUgdHR5cGUsIGNoYXIqIHNlcmlhbCwgY2hhciAqY21kLCAuLi4pOwogCiB2b2lkIGdldF9teV9wYXRoKGNoYXIgKnMsIHNpemVfdCBtYXhMZW4pOwpAQCAtMTA0LDcgKzk4LDcgQEAKICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgNTU1NSBpcyB1c2VkIGJ5IGRlZmF1bHQgaWYgbm8gcG9ydCBudW1iZXIgaXMgc3BlY2lmaWVkLlxuIgogICAgICAgICAiIGRpc2Nvbm5lY3QgWzxob3N0Pls6PHBvcnQ+XV0gIC0gZGlzY29ubmVjdCBmcm9tIGEgVENQL0lQIGRldmljZS5cbiIKICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgNTU1NSBpcyB1c2VkIGJ5IGRlZmF1bHQgaWYgbm8gcG9ydCBudW1iZXIgaXMgc3BlY2lmaWVkLlxuIgotICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgdGhpcyBvY21tYW5kIHdpdGggbm8gYWRkaXRpb25hbCBhcmd1bWVudHNcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoaXMgY29tbWFuZCB3aXRoIG5vIGFkZGl0aW9uYWwgYXJndW1lbnRzXG4iCiAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGRpc2Nvbm5lY3QgZnJvbSBhbGwgY29ubmVjdGVkIFRDUC9JUCBkZXZpY2VzLlxuIgogICAgICAgICAiXG4iCiAgICAgICAgICJkZXZpY2UgY29tbWFuZHM6XG4iCkBAIC0xMzUsMTQgKzEyOSwyMiBAQAogICAgICAgICAiICBhZGIgYnVncmVwb3J0ICAgICAgICAgICAgICAgIC0gcmV0dXJuIGFsbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZXZpY2VcbiIKICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgYnVnIHJlcG9ydC5cbiIKICAgICAgICAgIlxuIgorICAgICAgICAiICBhZGIgYmFja3VwIFstZiA8ZmlsZT5dIFstYXBrfC1ub2Fwa10gWy1zaGFyZWR8LW5vc2hhcmVkXSBbLWFsbF0gWzxwYWNrYWdlcy4uLj5dXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBXcml0ZSBhIHRhcmZpbGUgYmFja3VwIG9mIHRoZSBkZXZpY2UncyBkYXRhIHRvIDxmaWxlPi5cbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAtZiBvcHRpb24gbXVzdCBjb21lIGZpcnN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIGRhdGFcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gXCJiYWNrdXAudGFyXCIgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1hcGt8LW5vYXBrIGVuYWJsZS9kaXNhYmxlIGJhY2t1cCBvZiB0aGUgLmFwa3MgdGhlbXNlbHZlc1xuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHRhcmZpbGU7IHRoZSBkZWZhdWx0IGlzIG5vYXBrLilcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtc2hhcmVkfC1ub3NoYXJlZCBlbmFibGUvZGlzYWJsZSBiYWNrdXAgb2YgdGhlIGRldmljZSdzXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQgc3RvcmFnZSAvIFNEIGNhcmQgY29udGVudHM7IHRoZSBkZWZhdWx0IGlzIG5vc2hhcmVkLilcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtYWxsIG1lYW5zIHRvIGJhY2sgdXAgYWxsIGluc3RhbGxlZCBhcHBsaWNhdGlvbnMpXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHBhY2thZ2VzLi4uPiBpcyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbnMgdG8gYmUgYmFja2VkIHVwLiAgSWZcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAtYWxsIG9yIC1zaGFyZWQgZmxhZ3MgYXJlIHBhc3NlZCwgdGhlbiB0aGUgcGFja2FnZVxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBpcyBvcHRpb25hbC4pXG4iCisgICAgICAgICJcbiIKICAgICAgICAgIiAgYWRiIGhlbHAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2VcbiIKICAgICAgICAgIiAgYWRiIHZlcnNpb24gICAgICAgICAgICAgICAgICAtIHNob3cgdmVyc2lvbiBudW1cbiIKICAgICAgICAgIlxuIgotICAgICAgICAiREFUQU9QVFM6XG4iCi0gICAgICAgICIgKG5vIG9wdGlvbikgICAgICAgICAgICAgICAgICAgLSBkb24ndCB0b3VjaCB0aGUgZGF0YSBwYXJ0aXRpb25cbiIKLSAgICAgICAgIiAgLXcgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHdpcGUgdGhlIGRhdGEgcGFydGl0aW9uXG4iCi0gICAgICAgICIgIC1kICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBmbGFzaCB0aGUgZGF0YSBwYXJ0aXRpb25cbiIKLSAgICAgICAgIlxuIgogICAgICAgICAic2NyaXB0aW5nOlxuIgogICAgICAgICAiICBhZGIgd2FpdC1mb3ItZGV2aWNlICAgICAgICAgIC0gYmxvY2sgdW50aWwgZGV2aWNlIGlzIG9ubGluZVxuIgogICAgICAgICAiICBhZGIgc3RhcnQtc2VydmVyICAgICAgICAgICAgIC0gZW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBzZXJ2ZXIgcnVubmluZ1xuIgpAQCAtMjE4LDcgKzIyMCw5IEBACiAgICAgaW50IGxlbjsKIAogICAgIHdoaWxlKGZkID49IDApIHsKKyAgICAgICAgRCgicmVhZF9hbmRfZHVtcCgpOiBwcmUgYWRiX3JlYWQoZmQ9JWQpXG4iLCBmZCk7CiAgICAgICAgIGxlbiA9IGFkYl9yZWFkKGZkLCBidWYsIDQwOTYpOworICAgICAgICBEKCJyZWFkX2FuZF9kdW1wKCk6IHBvc3QgYWRiX3JlYWQoZmQ9JWQpOiBsZW49JWRcbiIsIGZkLCBsZW4pOwogICAgICAgICBpZihsZW4gPT0gMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIzMiw2ICsyMzYsMjUgQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIGNvcHlfdG9fZmlsZShpbnQgaW5GZCwgaW50IG91dEZkKSB7CisgICAgY2hhciBidWZbNDA5Nl07CisgICAgaW50IGxlbjsKKworICAgIEQoImNvcHlfdG9fZmlsZSglZCAtPiAlZClcbiIsIGluRmQsIG91dEZkKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxlbiA9IGFkYl9yZWFkKGluRmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIGNvbnRpbnVlOworICAgICAgICAgICAgRCgiY29weV90b19maWxlKCkgOiBlcnJvciAlZFxuIiwgZXJybm8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYWRiX3dyaXRlKG91dEZkLCBidWYsIGxlbik7CisgICAgfQorfQorCiBzdGF0aWMgdm9pZCAqc3RkaW5fcmVhZF90aHJlYWQodm9pZCAqeCkKIHsKICAgICBpbnQgZmQsIGZkaTsKQEAgLTI0Niw3ICsyNjksOSBAQAogCiAgICAgZm9yKDs7KSB7CiAgICAgICAgIC8qIGZkaSBpcyByZWFsbHkgdGhlIGNsaWVudCdzIHN0ZGluLCBzbyB1c2UgcmVhZCwgbm90IGFkYl9yZWFkIGhlcmUgKi8KKyAgICAgICAgRCgic3RkaW5fcmVhZF90aHJlYWQoKTogcHJlIHVuaXhfcmVhZChmZGk9JWQsLi4uKVxuIiwgZmRpKTsKICAgICAgICAgciA9IHVuaXhfcmVhZChmZGksIGJ1ZiwgMTAyNCk7CisgICAgICAgIEQoInN0ZGluX3JlYWRfdGhyZWFkKCk6IHBvc3QgdW5peF9yZWFkKGZkaT0lZCwuLi4pXG4iLCBmZGkpOwogICAgICAgICBpZihyID09IDApIGJyZWFrOwogICAgICAgICBpZihyIDwgMCkgewogICAgICAgICAgICAgaWYoZXJybm8gPT0gRUlOVFIpIGNvbnRpbnVlOwpAQCAtNTM3LDYgKzU2Miw0NSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGJhY2t1cChpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSA9ICIuL2JhY2t1cC50YXIiOworICAgIGludCBmZCwgb3V0RmQ7CisKKyAgICBpZiAoIXN0cmNtcCgiLWYiLCBhcmd2WzFdKSkgeworICAgICAgICBpZiAoYXJnYyA8IDMpIHJldHVybiB1c2FnZSgpOworICAgICAgICBmaWxlbmFtZSA9IGFyZ3ZbMl07CisgICAgICAgIGFyZ2MgLT0gMjsKKyAgICAgICAgYXJndiArPSAyOworICAgIH0KKworICAgIG91dEZkID0gYWRiX29wZW5fbW9kZShmaWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0MCk7CisgICAgaWYgKG91dEZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFkYjogdW5hYmxlIHRvIG9wZW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImJhY2t1cCIpOworICAgIGZvciAoYXJnYy0tLCBhcmd2Kys7IGFyZ2M7IGFyZ2MtLSwgYXJndisrKSB7CisgICAgICAgIHN0cm5jYXQoYnVmLCAiOiIsIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZikgLSAxKTsKKyAgICAgICAgc3RybmNhdChidWYsIGFyZ3ZbMF0sIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZikgLSAxKTsKKyAgICB9CisKKyAgICBEKCJiYWNrdXAuIGZpbGVuYW1lPSVzIGJ1Zj0lc1xuIiwgZmlsZW5hbWUsIGJ1Zik7CisgICAgZmQgPSBhZGJfY29ubmVjdChidWYpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGI6IHVuYWJsZSB0byBjb25uZWN0IGZvciBiYWNrdXBcbiIpOworICAgICAgICBhZGJfY2xvc2Uob3V0RmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY29weV90b19maWxlKGZkLCBvdXRGZCk7CisKKyAgICBhZGJfY2xvc2UoZmQpOworICAgIGFkYl9jbG9zZShvdXRGZCk7CisgICAgcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgU0VOVElORUxfRklMRSAiY29uZmlnIiBPU19QQVRIX1NFUEFSQVRPUl9TVFIgImVudnNldHVwLm1ha2UiCiBzdGF0aWMgaW50IHRvcF93b3Jrcyhjb25zdCBjaGFyICp0b3ApCiB7CkBAIC02ODMsNiArNzQ3LDcgQEAKICAgICBjaGFyIGJ1Zls0MDk2XTsKICAgICBpbnQgbm9fZGFlbW9uID0gMDsKICAgICBpbnQgaXNfZGFlbW9uID0gMDsKKyAgICBpbnQgaXNfc2VydmVyID0gMDsKICAgICBpbnQgcGVyc2lzdCA9IDA7CiAgICAgaW50IHI7CiAgICAgaW50IHF1b3RlOwpAQCAtNzE5LDcgKzc4NCw5IEBACiAKICAgICAvKiBtb2RpZmllcnMgYW5kIGZsYWdzICovCiAgICAgd2hpbGUoYXJnYyA+IDApIHsKLSAgICAgICAgaWYoIXN0cmNtcChhcmd2WzBdLCJub2RhZW1vbiIpKSB7CisgICAgICAgIGlmKCFzdHJjbXAoYXJndlswXSwic2VydmVyIikpIHsKKyAgICAgICAgICAgIGlzX3NlcnZlciA9IDE7CisgICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbMF0sIm5vZGFlbW9uIikpIHsKICAgICAgICAgICAgIG5vX2RhZW1vbiA9IDE7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAiZm9yay1zZXJ2ZXIiKSkgewogICAgICAgICAgICAgLyogdGhpcyBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgd2hlbiB0aGUgQURCIGNsaWVudCBsYXVuY2hlcyB0aGUgQURCIFNlcnZlciAqLwpAQCAtNzY2LDcgKzgzMyw3IEBACiAgICAgYWRiX3NldF90cmFuc3BvcnQodHR5cGUsIHNlcmlhbCk7CiAgICAgYWRiX3NldF90Y3Bfc3BlY2lmaWNzKHNlcnZlcl9wb3J0KTsKIAotICAgIGlmICgoYXJnYyA+IDApICYmICghc3RyY21wKGFyZ3ZbMF0sInNlcnZlciIpKSkgeworICAgIGlmIChpc19zZXJ2ZXIpIHsKICAgICAgICAgaWYgKG5vX2RhZW1vbiB8fCBpc19kYWVtb24pIHsKICAgICAgICAgICAgIHIgPSBhZGJfbWFpbihpc19kYWVtb24sIHNlcnZlcl9wb3J0KTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTgzOCwxMiArOTA1LDI1IEBACiAgICAgICAgIHJldHVybiBhZGJfc2VuZF9lbXVsYXRvcl9jb21tYW5kKGFyZ2MsIGFyZ3YpOwogICAgIH0KIAotICAgIGlmKCFzdHJjbXAoYXJndlswXSwgInNoZWxsIikpIHsKKyAgICBpZighc3RyY21wKGFyZ3ZbMF0sICJzaGVsbCIpIHx8ICFzdHJjbXAoYXJndlswXSwgImhlbGwiKSkgewogICAgICAgICBpbnQgcjsKICAgICAgICAgaW50IGZkOwogCisgICAgICAgIGNoYXIgaCA9IChhcmd2WzBdWzBdID09ICdoJyk7CisKKyAgICAgICAgaWYgKGgpIHsKKyAgICAgICAgICAgIHByaW50ZigiXHgxYls0MTszM20iKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICB9CisKICAgICAgICAgaWYoYXJnYyA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZV9zaGVsbCgpOworICAgICAgICAgICAgRCgic3RhcnRpbmcgaW50ZXJhY3RpdmUgc2hlbGxcbiIpOworICAgICAgICAgICAgciA9IGludGVyYWN0aXZlX3NoZWxsKCk7CisgICAgICAgICAgICBpZiAoaCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXHgxYlswbSIpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgIH0KIAogICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJzaGVsbDolcyIsIGFyZ3ZbMV0pOwpAQCAtODYyLDkgKzk0MiwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yKDs7KSB7CisgICAgICAgICAgICBEKCJpbnRlcmFjdGl2ZSBzaGVsbCBsb29wLiBidWZmPSVzXG4iLCBidWYpOwogICAgICAgICAgICAgZmQgPSBhZGJfY29ubmVjdChidWYpOwogICAgICAgICAgICAgaWYoZmQgPj0gMCkgeworICAgICAgICAgICAgICAgIEQoImFib3V0IHRvIHJlYWRfYW5kX2R1bXAoZmQ9JWQpXG4iLCBmZCk7CiAgICAgICAgICAgICAgICAgcmVhZF9hbmRfZHVtcChmZCk7CisgICAgICAgICAgICAgICAgRCgicmVhZF9hbmRfZHVtcCgpIGRvbmUuXG4iKTsKICAgICAgICAgICAgICAgICBhZGJfY2xvc2UoZmQpOwogICAgICAgICAgICAgICAgIHIgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTg3Nyw2ICs5NjAsMTEgQEAKICAgICAgICAgICAgICAgICBhZGJfc2xlZXBfbXMoMTAwMCk7CiAgICAgICAgICAgICAgICAgZG9fY21kKHR0eXBlLCBzZXJpYWwsICJ3YWl0LWZvci1kZXZpY2UiLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJceDFiWzBtIik7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEKCJpbnRlcmFjdGl2ZSBzaGVsbCBsb29wLiByZXR1cm4gcj0lZFxuIiwgcik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwNzIsNiArMTE2MCwxMCBAQAogICAgICAgICByZXR1cm4gYWRiX2Nvbm5lY3QoImhvc3Q6c3RhcnQtc2VydmVyIik7CiAgICAgfQogCisgICAgaWYgKCFzdHJjbXAoYXJndlswXSwgImJhY2t1cCIpKSB7CisgICAgICAgIHJldHVybiBiYWNrdXAoYXJnYywgYXJndik7CisgICAgfQorCiAgICAgaWYgKCFzdHJjbXAoYXJndlswXSwgImpkd3AiKSkgewogICAgICAgICBpbnQgIGZkID0gYWRiX2Nvbm5lY3QoImpkd3AiKTsKICAgICAgICAgaWYgKGZkID49IDApIHsKZGlmZiAtLWdpdCBhL2FkYi9mZGV2ZW50LmMgYi9hZGIvZmRldmVudC5jCmluZGV4IGMxNzliMjAuLjVjMzc0YTcgMTAwNjQ0Ci0tLSBhL2FkYi9mZGV2ZW50LmMKKysrIGIvYWRiL2ZkZXZlbnQuYwpAQCAtMTUsNiArMTUsOCBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMjcsMTAgKzI5LDIwIEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAKICNpbmNsdWRlICJmZGV2ZW50LmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3lzZGVwcy5oIgogCi0jZGVmaW5lIFRSQUNFKHguLi4pIGZwcmludGYoc3RkZXJyLHgpCiAKLSNkZWZpbmUgREVCVUcgMAorLyogISEhIERvIG5vdCBlbmFibGUgREVCVUcgZm9yIHRoZSBhZGIgdGhhdCB3aWxsIHJ1biBhcyB0aGUgc2VydmVyOgorKiogYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgdXNlZCB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZSBjbGllbnQKKyoqIGFuZCBzZXJ2ZXIuIEFueSBleHRyYSBvdXRwdXQgd2lsbCBjYXVzZSBmYWlsdXJlcy4KKyovCisjZGVmaW5lIERFQlVHIDAgICAvKiBub24tMCB3aWxsIGJyZWFrIGFkYiBzZXJ2ZXIgKi8KKworLy8gVGhpcyBzb2NrZXQgaXMgdXNlZCB3aGVuIGEgc3VicHJvYyBzaGVsbCBzZXJ2aWNlIGV4aXN0cy4KKy8vIEl0IHdha2VzIHVwIHRoZSBmZGV2ZW50X2xvb3AoKSBhbmQgY2F1c2UgdGhlIGNvcnJlY3QgaGFuZGxpbmcKKy8vIG9mIHRoZSBzaGVsbCdzIHBzZXVkby10dHkgbWFzdGVyLiBJLmUuIGZvcmNlIGNsb3NlIGl0LgoraW50IFNIRUxMX0VYSVRfTk9USUZZX0ZEID0gLTE7CiAKIHN0YXRpYyB2b2lkIGZhdGFsKGNvbnN0IGNoYXIgKmZuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKQEAgLTQ1LDE1ICs1NywyOCBAQAogI2RlZmluZSBGQVRBTCh4Li4uKSBmYXRhbChfX0ZVTkNUSU9OX18sIHgpCiAKICNpZiBERUJVRworI2RlZmluZSBEKC4uLikgXAorICAgIGRvIHsgXAorICAgICAgICBhZGJfbXV0ZXhfbG9jaygmRF9sb2NrKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczo6JXMoKToiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgIFwKKyAgICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOyAgICAgICAgICBcCisgICAgICAgIGFkYl9tdXRleF91bmxvY2soJkRfbG9jayk7ICAgICAgICAgICAgIFwKKyAgICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOyAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKIHN0YXRpYyB2b2lkIGR1bXBfZmRlKGZkZXZlbnQgKmZkZSwgY29uc3QgY2hhciAqaW5mbykKIHsKKyAgICBhZGJfbXV0ZXhfbG9jaygmRF9sb2NrKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiRkRFICMlMDNkICVjJWMlYyAlc1xuIiwgZmRlLT5mZCwKICAgICAgICAgICAgIGZkZS0+c3RhdGUgJiBGREVfUkVBRCA/ICdSJyA6ICcgJywKICAgICAgICAgICAgIGZkZS0+c3RhdGUgJiBGREVfV1JJVEUgPyAnVycgOiAnICcsCiAgICAgICAgICAgICBmZGUtPnN0YXRlICYgRkRFX0VSUk9SID8gJ0UnIDogJyAnLAogICAgICAgICAgICAgaW5mbyk7CisgICAgYWRiX211dGV4X3VubG9jaygmRF9sb2NrKTsKIH0KICNlbHNlCisjZGVmaW5lIEQoLi4uKSAoKHZvaWQpMCkKICNkZWZpbmUgZHVtcF9mZGUoZmRlLCBpbmZvKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCkBAIC02Nyw2ICs5Miw3IEBACiBzdGF0aWMgdm9pZCBmZGV2ZW50X3BsaXN0X2VucXVldWUoZmRldmVudCAqbm9kZSk7CiBzdGF0aWMgdm9pZCBmZGV2ZW50X3BsaXN0X3JlbW92ZShmZGV2ZW50ICpub2RlKTsKIHN0YXRpYyBmZGV2ZW50ICpmZGV2ZW50X3BsaXN0X2RlcXVldWUodm9pZCk7CitzdGF0aWMgdm9pZCBmZGV2ZW50X3N1YnByb2NfZXZlbnRfZnVuYyhpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cywgdm9pZCAqdXNlcmRhdGEpOwogCiBzdGF0aWMgZmRldmVudCBsaXN0X3BlbmRpbmcgPSB7CiAgICAgLm5leHQgPSAmbGlzdF9wZW5kaW5nLApAQCAtMjcwLDkgKzI5Niw3MiBAQAogICAgICAgICBGRF9DTFIoZmRlLT5mZCwgJmVycm9yX2Zkcyk7CiAgICAgfQogCi0gICAgZmRlLT5zdGF0ZSA9IChmZGUtPnN0YXRlICYgRkRFX1NUQVRFTUFTSykgfCBldmVudHM7ICAgIAorICAgIGZkZS0+c3RhdGUgPSAoZmRlLT5zdGF0ZSAmIEZERV9TVEFURU1BU0spIHwgZXZlbnRzOwogfQogCisvKiBMb29rcyBhdCBmZF90YWJsZVtdIGZvciBiYWQgRkRzIGFuZCBzZXRzIGJpdCBpbiBmZHMuCisqKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYmFkIEZEcy4KKyovCitzdGF0aWMgaW50IGZkZXZlbnRfZmRfY2hlY2soZmRfc2V0ICpmZHMpCit7CisgICAgaW50IGksIG4gPSAwOworICAgIGZkZXZlbnQgKmZkZTsKKworICAgIGZvcihpID0gMDsgaSA8IHNlbGVjdF9uOyBpKyspIHsKKyAgICAgICAgZmRlID0gZmRfdGFibGVbaV07CisgICAgICAgIGlmKGZkZSA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgaWYoZmNudGwoaSwgRl9HRVRGTCwgTlVMTCkgPCAwKSB7CisgICAgICAgICAgICBGRF9TRVQoaSwgZmRzKTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIC8vIGZkZS0+c3RhdGUgfD0gRkRFX0RPTlRfQ0xPU0U7CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbjsKK30KKworI2lmICFERUJVRworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfYWxsX2Zkcyhjb25zdCBjaGFyICpleHRyYV9tc2cpIHt9CisjZWxzZQorc3RhdGljIHZvaWQgZHVtcF9hbGxfZmRzKGNvbnN0IGNoYXIgKmV4dHJhX21zZykKK3sKK2ludCBpOworICAgIGZkZXZlbnQgKmZkZTsKKyAgICAvLyBwZXIgZmQ6IDQgZGlnaXRzIChidXQgcmVhbGx5OiBsb2cxMChGRF9TRVRTSVpFKSksIDEgc3RhdXMsIDEgYmxhbmsKKyAgICBjaGFyIG1zZ19idWZmW0ZEX1NFVFNJWkUqNiArIDFdLCAqcGI9bXNnX2J1ZmY7CisgICAgc2l6ZV90IG1heF9jaGFycyA9IEZEX1NFVFNJWkUgKiA2ICsgMTsKKyAgICBpbnQgcHJpbnRlZF9vdXQ7CisjZGVmaW5lIFNBRkVfU1BSSU5URiguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGVkX291dCA9IHNucHJpbnRmKHBiLCBtYXhfY2hhcnMsIF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChwcmludGVkX291dCA8PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEQoIi4uLiBzbnByaW50ZiBmYWlsZWQuXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1heF9jaGFycyA8ICh1bnNpZ25lZCBpbnQpcHJpbnRlZF9vdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRCgiLi4uIHNucHJpbnRmIG91dCBvZiBzcGFjZS5cbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwYiArPSBwcmludGVkX291dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1heF9jaGFycyAtPSBwcmludGVkX291dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyAgICBmb3IoaSA9IDA7IGkgPCBzZWxlY3RfbjsgaSsrKSB7CisgICAgICAgIGZkZSA9IGZkX3RhYmxlW2ldOworICAgICAgICBTQUZFX1NQUklOVEYoIiVkIiwgaSk7CisgICAgICAgIGlmKGZkZSA9PSAwKSB7CisgICAgICAgICAgICBTQUZFX1NQUklOVEYoIj8gIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihmY250bChpLCBGX0dFVEZMLCBOVUxMKSA8IDApIHsKKyAgICAgICAgICAgIFNBRkVfU1BSSU5URigiYiIpOworICAgICAgICB9CisgICAgICAgIFNBRkVfU1BSSU5URigiICIpOworICAgIH0KKyAgICBEKCIlcyBmZF90YWJsZVtdLT5mZCA9IHslc31cbiIsIGV4dHJhX21zZywgbXNnX2J1ZmYpOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIGZkZXZlbnRfcHJvY2VzcygpCiB7CiAgICAgaW50IGksIG47CkBAIC0yODQsMjggKzM3Myw0OSBAQAogICAgIG1lbWNweSgmd2ZkLCAmd3JpdGVfZmRzLCBzaXplb2YoZmRfc2V0KSk7CiAgICAgbWVtY3B5KCZlZmQsICZlcnJvcl9mZHMsIHNpemVvZihmZF9zZXQpKTsKIAotICAgIG4gPSBzZWxlY3Qoc2VsZWN0X24sICZyZmQsICZ3ZmQsICZlZmQsIDApOworICAgIGR1bXBfYWxsX2ZkcygicHJlIHNlbGVjdCgpIik7CisKKyAgICBuID0gc2VsZWN0KHNlbGVjdF9uLCAmcmZkLCAmd2ZkLCAmZWZkLCBOVUxMKTsKKyAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgICBEKCJzZWxlY3QoKSByZXR1cm5lZCBuPSVkLCBlcnJubz0lZFxuIiwgbiwgbjwwP3NhdmVkX2Vycm5vOjApOworCisgICAgZHVtcF9hbGxfZmRzKCJwb3N0IHNlbGVjdCgpIik7CiAKICAgICBpZihuIDwgMCkgewotICAgICAgICBpZihlcnJubyA9PSBFSU5UUikgcmV0dXJuOwotICAgICAgICBwZXJyb3IoInNlbGVjdCIpOwotICAgICAgICByZXR1cm47CisgICAgICAgIHN3aXRjaChzYXZlZF9lcnJubykgeworICAgICAgICBjYXNlIEVJTlRSOiByZXR1cm47CisgICAgICAgIGNhc2UgRUJBREY6CisgICAgICAgICAgICAvLyBDYW4ndCB0cnVzdCB0aGUgRkQgc2V0cyBhZnRlciBhbiBlcnJvci4KKyAgICAgICAgICAgIEZEX1pFUk8oJndmZCk7CisgICAgICAgICAgICBGRF9aRVJPKCZlZmQpOworICAgICAgICAgICAgRkRfWkVSTygmcmZkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRCgiVW5leHBlY3RlZCBzZWxlY3QoKSBlcnJvcj0lZFxuIiwgc2F2ZWRfZXJybm8pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmKG4gPD0gMCkgeworICAgICAgICAvLyBXZSBmYWtlIGEgcmVhZCwgYXMgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgYXNzdW1lcworICAgICAgICAvLyB0aGF0IGVycm9ycyB3aWxsIGJlIGRldGVjdGVkIGF0IHRoYXQgcG9pbnQuCisgICAgICAgIG4gPSBmZGV2ZW50X2ZkX2NoZWNrKCZyZmQpOwogICAgIH0KIAogICAgIGZvcihpID0gMDsgKGkgPCBzZWxlY3RfbikgJiYgKG4gPiAwKTsgaSsrKSB7CiAgICAgICAgIGV2ZW50cyA9IDA7Ci0gICAgICAgIGlmKEZEX0lTU0VUKGksICZyZmQpKSBldmVudHMgfD0gRkRFX1JFQUQ7Ci0gICAgICAgIGlmKEZEX0lTU0VUKGksICZ3ZmQpKSBldmVudHMgfD0gRkRFX1dSSVRFOwotICAgICAgICBpZihGRF9JU1NFVChpLCAmZWZkKSkgZXZlbnRzIHw9IEZERV9FUlJPUjsKKyAgICAgICAgaWYoRkRfSVNTRVQoaSwgJnJmZCkpIHsgZXZlbnRzIHw9IEZERV9SRUFEOyBuLS07IH0KKyAgICAgICAgaWYoRkRfSVNTRVQoaSwgJndmZCkpIHsgZXZlbnRzIHw9IEZERV9XUklURTsgbi0tOyB9CisgICAgICAgIGlmKEZEX0lTU0VUKGksICZlZmQpKSB7IGV2ZW50cyB8PSBGREVfRVJST1I7IG4tLTsgfQogCiAgICAgICAgIGlmKGV2ZW50cykgewotICAgICAgICAgICAgbi0tOwotCiAgICAgICAgICAgICBmZGUgPSBmZF90YWJsZVtpXTsKLSAgICAgICAgICAgIGlmKGZkZSA9PSAwKSBGQVRBTCgibWlzc2luZyBmZGUgZm9yIGZkICVkXG4iLCBpKTsKKyAgICAgICAgICAgIGlmKGZkZSA9PSAwKQorICAgICAgICAgICAgICBGQVRBTCgibWlzc2luZyBmZGUgZm9yIGZkICVkXG4iLCBpKTsKIAogICAgICAgICAgICAgZmRlLT5ldmVudHMgfD0gZXZlbnRzOwogCisgICAgICAgICAgICBEKCJnb3QgZXZlbnRzIGZkZS0+ZmQ9JWQgZXZlbnRzPSUwNHgsIHN0YXRlPSUwNHhcbiIsCisgICAgICAgICAgICAgICAgZmRlLT5mZCwgZmRlLT5ldmVudHMsIGZkZS0+c3RhdGUpOwogICAgICAgICAgICAgaWYoZmRlLT5zdGF0ZSAmIEZERV9QRU5ESU5HKSBjb250aW51ZTsKICAgICAgICAgICAgIGZkZS0+c3RhdGUgfD0gRkRFX1BFTkRJTkc7CiAgICAgICAgICAgICBmZGV2ZW50X3BsaXN0X2VucXVldWUoZmRlKTsKQEAgLTM1MCwxNCArNDYwLDE0IEBACiAgICAgfQogCiAgICAgaWYoZmRfdGFibGVbZmRlLT5mZF0gIT0gZmRlKSB7Ci0gICAgICAgIEZBVEFMKCJmZF90YWJsZSBvdXQgb2Ygc3luYyIpOworICAgICAgICBGQVRBTCgiZmRfdGFibGUgb3V0IG9mIHN5bmMgWyVkXVxuIiwgZmRlLT5mZCk7CiAgICAgfQogCiAgICAgZmRfdGFibGVbZmRlLT5mZF0gPSAwOwogCiAgICAgaWYoIShmZGUtPnN0YXRlICYgRkRFX0RPTlRfQ0xPU0UpKSB7CiAgICAgICAgIGR1bXBfZmRlKGZkZSwgImNsb3NlIik7Ci0gICAgICAgIGNsb3NlKGZkZS0+ZmQpOworICAgICAgICBhZGJfY2xvc2UoZmRlLT5mZCk7CiAgICAgfQogfQogCkBAIC0zOTQsNiArNTA0LDc0IEBACiAgICAgcmV0dXJuIG5vZGU7CiB9CiAKK3N0YXRpYyB2b2lkIGZkZXZlbnRfY2FsbF9mZGZ1bmMoZmRldmVudCogZmRlKQoreworICAgIHVuc2lnbmVkIGV2ZW50cyA9IGZkZS0+ZXZlbnRzOworICAgIGZkZS0+ZXZlbnRzID0gMDsKKyAgICBpZighKGZkZS0+c3RhdGUgJiBGREVfUEVORElORykpIHJldHVybjsKKyAgICBmZGUtPnN0YXRlICY9ICh+RkRFX1BFTkRJTkcpOworICAgIGR1bXBfZmRlKGZkZSwgImNhbGxiYWNrIik7CisgICAgZmRlLT5mdW5jKGZkZS0+ZmQsIGV2ZW50cywgZmRlLT5hcmcpOworfQorCitzdGF0aWMgdm9pZCBmZGV2ZW50X3N1YnByb2NfZXZlbnRfZnVuYyhpbnQgZmQsIHVuc2lnbmVkIGV2LCB2b2lkICp1c2VyZGF0YSkKK3sKKworICAgIEQoInN1YnByb2MgaGFuZGxpbmcgb24gZmQ9JWQgZXY9JTA0eFxuIiwgZmQsIGV2KTsKKworICAgIC8vIEhvb2sgb25lc2VsZiBiYWNrIGludG8gdGhlIGZkZSdzIHN1aXRhYmxlIGZvciBzZWxlY3QoKSBvbiByZWFkLgorICAgIGlmKChmZCA8IDApIHx8IChmZCA+PSBmZF90YWJsZV9tYXgpKSB7CisgICAgICAgIEZBVEFMKCJmZCAlZCBvdXQgb2YgcmFuZ2UgZm9yIGZkX3RhYmxlIFxuIiwgZmQpOworICAgIH0KKyAgICBmZGV2ZW50ICpmZGUgPSBmZF90YWJsZVtmZF07CisgICAgZmRldmVudF9hZGQoZmRlLCBGREVfUkVBRCk7CisKKyAgICBpZihldiAmIEZERV9SRUFEKXsKKyAgICAgIGludCBzdWJwcm9jX2ZkOworCisgICAgICBpZihyZWFkeChmZCwgJnN1YnByb2NfZmQsIHNpemVvZihzdWJwcm9jX2ZkKSkpIHsKKyAgICAgICAgICBGQVRBTCgiRmFpbGVkIHRvIHJlYWQgdGhlIHN1YnByb2MncyBmZCBmcm9tIGZkPSVkXG4iLCBmZCk7CisgICAgICB9CisgICAgICBpZigoc3VicHJvY19mZCA8IDApIHx8IChzdWJwcm9jX2ZkID49IGZkX3RhYmxlX21heCkpIHsKKyAgICAgICAgICBEKCJzdWJwcm9jX2ZkICVkIG91dCBvZiByYW5nZSAwLCBmZF90YWJsZV9tYXg9JWRcbiIsCisgICAgICAgICAgICBzdWJwcm9jX2ZkLCBmZF90YWJsZV9tYXgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZkZXZlbnQgKnN1YnByb2NfZmRlID0gZmRfdGFibGVbc3VicHJvY19mZF07CisgICAgICBpZighc3VicHJvY19mZGUpIHsKKyAgICAgICAgICBEKCJzdWJwcm9jX2ZkICVkIGNsZWFyZWQgZnJvbSBmZF90YWJsZVxuIiwgc3VicHJvY19mZCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYoc3VicHJvY19mZGUtPmZkICE9IHN1YnByb2NfZmQpIHsKKyAgICAgICAgICAvLyBBbHJlYWR5IHJlYWxsb2NhdGVkPworICAgICAgICAgIEQoInN1YnByb2NfZmQgJWQgIT0gZmRfdGFibGVbXS5mZCAlZFxuIiwgc3VicHJvY19mZCwgc3VicHJvY19mZGUtPmZkKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHN1YnByb2NfZmRlLT5mb3JjZV9lb2YgPSAxOworCisgICAgICBpbnQgcmNvdW50ID0gMDsKKyAgICAgIGlvY3RsKHN1YnByb2NfZmQsIEZJT05SRUFELCAmcmNvdW50KTsKKyAgICAgIEQoInN1YnByb2Mgd2l0aCBmZD0lZCAgaGFzIHJjb3VudD0lZCBlcnI9JWRcbiIsCisgICAgICAgIHN1YnByb2NfZmQsIHJjb3VudCwgZXJybm8pOworCisgICAgICBpZihyY291bnQpIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgZGF0YSBsZWZ0LCBpdCB3aWxsIHNob3cgdXAgaW4gdGhlIHNlbGVjdCgpLgorICAgICAgICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlcmUgaXMgbm8gb3RoZXIgdGhyZWFkIHJlYWRpbmcgdGhhdAorICAgICAgICAvLyBkYXRhIHdoZW4gaW4gdGhpcyBmZF9mdW5jKCkuCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgRCgic3VicHJvY19mZGUuc3RhdGU9JTA0eFxuIiwgc3VicHJvY19mZGUtPnN0YXRlKTsKKyAgICAgIHN1YnByb2NfZmRlLT5ldmVudHMgfD0gRkRFX1JFQUQ7CisgICAgICBpZihzdWJwcm9jX2ZkZS0+c3RhdGUgJiBGREVfUEVORElORykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBzdWJwcm9jX2ZkZS0+c3RhdGUgfD0gRkRFX1BFTkRJTkc7CisgICAgICBmZGV2ZW50X2NhbGxfZmRmdW5jKHN1YnByb2NfZmRlKTsKKyAgICB9Cit9CisKIGZkZXZlbnQgKmZkZXZlbnRfY3JlYXRlKGludCBmZCwgZmRfZnVuYyBmdW5jLCB2b2lkICphcmcpCiB7CiAgICAgZmRldmVudCAqZmRlID0gKGZkZXZlbnQqKSBtYWxsb2Moc2l6ZW9mKGZkZXZlbnQpKTsKQEAgLTQxMiwxMSArNTkwLDEyIEBACiAgICAgZmRldmVudF9yZW1vdmUoZmRlKTsKIH0KIAotdm9pZCBmZGV2ZW50X2luc3RhbGwoZmRldmVudCAqZmRlLCBpbnQgZmQsIGZkX2Z1bmMgZnVuYywgdm9pZCAqYXJnKSAKK3ZvaWQgZmRldmVudF9pbnN0YWxsKGZkZXZlbnQgKmZkZSwgaW50IGZkLCBmZF9mdW5jIGZ1bmMsIHZvaWQgKmFyZykKIHsKICAgICBtZW1zZXQoZmRlLCAwLCBzaXplb2YoZmRldmVudCkpOwogICAgIGZkZS0+c3RhdGUgPSBGREVfQUNUSVZFOwogICAgIGZkZS0+ZmQgPSBmZDsKKyAgICBmZGUtPmZvcmNlX2VvZiA9IDA7CiAgICAgZmRlLT5mdW5jID0gZnVuYzsKICAgICBmZGUtPmFyZyA9IGFyZzsKIApAQCAtNDM3LDcgKzYxNiw3IEBACiAKICAgICBpZihmZGUtPnN0YXRlICYgRkRFX0FDVElWRSkgewogICAgICAgICBmZGV2ZW50X2Rpc2Nvbm5lY3QoZmRlKTsKLSAgICAgICAgZHVtcF9mZGUoZmRlLCAiZGlzY29ubmVjdCIpOyAgICAKKyAgICAgICAgZHVtcF9mZGUoZmRlLCAiZGlzY29ubmVjdCIpOwogICAgICAgICBmZGV2ZW50X3VucmVnaXN0ZXIoZmRlKTsKICAgICB9CiAKQEAgLTQ4NCwyMyArNjYzLDMzIEBACiAgICAgICAgIGZkZSwgKGZkZS0+c3RhdGUgJiBGREVfRVZFTlRNQVNLKSAmICh+KGV2ZW50cyAmIEZERV9FVkVOVE1BU0spKSk7CiB9CiAKK3ZvaWQgZmRldmVudF9zdWJwcm9jX3NldHVwKCkKK3sKKyAgICBpbnQgc1syXTsKKworICAgIGlmKGFkYl9zb2NrZXRwYWlyKHMpKSB7CisgICAgICAgIEZBVEFMKCJjYW5ub3QgY3JlYXRlIHNoZWxsLWV4aXQgc29ja2V0LXBhaXJcbiIpOworICAgIH0KKyAgICBTSEVMTF9FWElUX05PVElGWV9GRCA9IHNbMF07CisgICAgZmRldmVudCAqZmRlOworICAgIGZkZSA9IGZkZXZlbnRfY3JlYXRlKHNbMV0sIGZkZXZlbnRfc3VicHJvY19ldmVudF9mdW5jLCBOVUxMKTsKKyAgICBpZighZmRlKQorICAgICAgRkFUQUwoImNhbm5vdCBjcmVhdGUgZmRldmVudCBmb3Igc2hlbGwtZXhpdCBoYW5kbGVyXG4iKTsKKyAgICBmZGV2ZW50X2FkZChmZGUsIEZERV9SRUFEKTsKK30KKwogdm9pZCBmZGV2ZW50X2xvb3AoKQogewogICAgIGZkZXZlbnQgKmZkZTsKKyAgICBmZGV2ZW50X3N1YnByb2Nfc2V0dXAoKTsKIAogICAgIGZvcig7OykgewotI2lmIERFQlVHCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCItLS0gLS0tLSB3YWl0aW5nIGZvciBldmVudHNcbiIpOwotI2VuZGlmCisgICAgICAgIEQoIi0tLSAtLS0tIHdhaXRpbmcgZm9yIGV2ZW50c1xuIik7CisKICAgICAgICAgZmRldmVudF9wcm9jZXNzKCk7CiAKICAgICAgICAgd2hpbGUoKGZkZSA9IGZkZXZlbnRfcGxpc3RfZGVxdWV1ZSgpKSkgewotICAgICAgICAgICAgdW5zaWduZWQgZXZlbnRzID0gZmRlLT5ldmVudHM7Ci0gICAgICAgICAgICBmZGUtPmV2ZW50cyA9IDA7Ci0gICAgICAgICAgICBmZGUtPnN0YXRlICY9ICh+RkRFX1BFTkRJTkcpOwotICAgICAgICAgICAgZHVtcF9mZGUoZmRlLCAiY2FsbGJhY2siKTsKLSAgICAgICAgICAgIGZkZS0+ZnVuYyhmZGUtPmZkLCBldmVudHMsIGZkZS0+YXJnKTsKKyAgICAgICAgICAgIGZkZXZlbnRfY2FsbF9mZGZ1bmMoZmRlKTsKICAgICAgICAgfQogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYWRiL2ZkZXZlbnQuaCBiL2FkYi9mZGV2ZW50LmgKaW5kZXggNmI3ZTdlYy4uYTBlYmUyYSAxMDA2NDQKLS0tIGEvYWRiL2ZkZXZlbnQuaAorKysgYi9hZGIvZmRldmVudC5oCkBAIC03MCw2ICs3MCw4IEBACiAgICAgZmRldmVudCAqcHJldjsKIAogICAgIGludCBmZDsKKyAgICBpbnQgZm9yY2VfZW9mOworCiAgICAgdW5zaWduZWQgc2hvcnQgc3RhdGU7CiAgICAgdW5zaWduZWQgc2hvcnQgZXZlbnRzOwogCmRpZmYgLS1naXQgYS9hZGIvZmlsZV9zeW5jX2NsaWVudC5jIGIvYWRiL2ZpbGVfc3luY19jbGllbnQuYwppbmRleCBkYTI1YWU4Li42NGUzOTNjIDEwMDY0NAotLS0gYS9hZGIvZmlsZV9zeW5jX2NsaWVudC5jCisrKyBiL2FkYi9maWxlX3N5bmNfY2xpZW50LmMKQEAgLTU3LDkgKzU3LDkgQEAKICAgICBpZiAodCA9PSAwKSAgLyogcHJldmVudCBkaXZpc2lvbiBieSAwIDotKSAqLwogICAgICAgICB0ID0gMTAwMDAwMDsKIAotICAgIGZwcmludGYoc3RkZXJyLCIlbGxkIEtCL3MgKCVkIGJ5dGVzIGluICVsbGQuJTAzbGxkcylcbiIsCisgICAgZnByaW50ZihzdGRlcnIsIiVsbGQgS0IvcyAoJWxsZCBieXRlcyBpbiAlbGxkLiUwM2xsZHMpXG4iLAogICAgICAgICAgICAgKCgoKGxvbmcgbG9uZykgdG90YWxfYnl0ZXMpICogMTAwMDAwMExMKSAvIHQpIC8gMTAyNExMLAotICAgICAgICAgICAgdG90YWxfYnl0ZXMsICh0IC8gMTAwMDAwMExMKSwgKHQgJSAxMDAwMDAwTEwpIC8gMTAwMExMKTsKKyAgICAgICAgICAgIChsb25nIGxvbmcpIHRvdGFsX2J5dGVzLCAodCAvIDEwMDAwMDBMTCksICh0ICUgMTAwMDAwMExMKSAvIDEwMDBMTCk7CiB9CiAKIHZvaWQgc3luY19xdWl0KGludCBmZCkKQEAgLTY0MSw4ICs2NDEsOSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2kgPSBta2NvcHlpbmZvKGxwYXRoLCBycGF0aCwgbmFtZSwgMCk7CiAgICAgICAgICAgICBpZihsc3RhdChjaS0+c3JjLCAmc3QpKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VkaXIoZCk7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsImNhbm5vdCBzdGF0ICclcyc6ICVzXG4iLCBjaS0+c3JjLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGNsb3NlZGlyKGQpOworCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYoIVNfSVNSRUcoc3Quc3RfbW9kZSkgJiYgIVNfSVNMTksoc3Quc3RfbW9kZSkpIHsKZGlmZiAtLWdpdCBhL2FkYi9maWxlX3N5bmNfc2VydmljZS5jIGIvYWRiL2ZpbGVfc3luY19zZXJ2aWNlLmMKaW5kZXggYTIzMWU5My4uZDNlODQxYiAxMDA2NDQKLS0tIGEvYWRiL2ZpbGVfc3luY19zZXJ2aWNlLmMKKysrIGIvYWRiL2ZpbGVfc3luY19zZXJ2aWNlLmMKQEAgLTE5Myw5ICsxOTMsMTEgQEAKICAgICAgICAgaWYoZmQgPCAwKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmKHdyaXRleChmZCwgYnVmZmVyLCBsZW4pKSB7CisgICAgICAgICAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKICAgICAgICAgICAgIGFkYl9jbG9zZShmZCk7CiAgICAgICAgICAgICBhZGJfdW5saW5rKHBhdGgpOwogICAgICAgICAgICAgZmQgPSAtMTsKKyAgICAgICAgICAgIGVycm5vID0gc2F2ZWRfZXJybm87CiAgICAgICAgICAgICBpZihmYWlsX2Vycm5vKHMpKSByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9hZGIvZmlsZV9zeW5jX3NlcnZpY2UuaCBiL2FkYi9maWxlX3N5bmNfc2VydmljZS5oCmluZGV4IDExZWEwNmIuLmU0MDJlMDYgMTAwNjQ0Ci0tLSBhL2FkYi9maWxlX3N5bmNfc2VydmljZS5oCisrKyBiL2FkYi9maWxlX3N5bmNfc2VydmljZS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIF9GSUxFX1NZTkNfU0VSVklDRV9IXwogI2RlZmluZSBfRklMRV9TWU5DX1NFUlZJQ0VfSF8KIAotI2lmZGVmIF9fcHBjX18KKyNpZmRlZiBIQVZFX0JJR19FTkRJQU4KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgX19zd2FwX3VpbnQzMih1bnNpZ25lZCB4KSAKIHsKICAgICByZXR1cm4gKCgoeCkgJiAweEZGMDAwMDAwKSA+PiAyNCkKZGlmZiAtLWdpdCBhL2FkYi9mcmFtZWJ1ZmZlcl9zZXJ2aWNlLmMgYi9hZGIvZnJhbWVidWZmZXJfc2VydmljZS5jCmluZGV4IDJmNDU2OTQuLjg2MmRkOTEgMTAwNjQ0Ci0tLSBhL2FkYi9mcmFtZWJ1ZmZlcl9zZXJ2aWNlLmMKKysrIGIvYWRiL2ZyYW1lYnVmZmVyX3NlcnZpY2UuYwpAQCAtNTEsNTYgKzUxLDEyNSBAQAogCiB2b2lkIGZyYW1lYnVmZmVyX3NlcnZpY2UoaW50IGZkLCB2b2lkICpjb29raWUpCiB7Ci0gICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpbmZvOwotICAgIGludCBmYiwgb2Zmc2V0OwotICAgIGNoYXIgeFsyNTZdOwotCiAgICAgc3RydWN0IGZiaW5mbyBmYmluZm87Ci0gICAgdW5zaWduZWQgaSwgYnl0ZXNwcDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBjaGFyIGJ1Zls2NDBdOworICAgIGludCBmZF9zY3JlZW5jYXA7CisgICAgaW50IHcsIGgsIGY7CisgICAgaW50IGZkc1syXTsKIAotICAgIGZiID0gb3BlbigiL2Rldi9ncmFwaGljcy9mYjAiLCBPX1JET05MWSk7Ci0gICAgaWYoZmIgPCAwKSBnb3RvIGRvbmU7CisgICAgaWYgKHBpcGUoZmRzKSA8IDApIGdvdG8gZG9uZTsKIAotICAgIGlmKGlvY3RsKGZiLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmdmluZm8pIDwgMCkgZ290byBkb25lOwotICAgIGZjbnRsKGZiLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgICBwaWRfdCBwaWQgPSBmb3JrKCk7CisgICAgaWYgKHBpZCA8IDApIGdvdG8gZG9uZTsKIAotICAgIGJ5dGVzcHAgPSB2aW5mby5iaXRzX3Blcl9waXhlbCAvIDg7Ci0KLSAgICBmYmluZm8udmVyc2lvbiA9IERETVNfUkFXSU1BR0VfVkVSU0lPTjsKLSAgICBmYmluZm8uYnBwID0gdmluZm8uYml0c19wZXJfcGl4ZWw7Ci0gICAgZmJpbmZvLnNpemUgPSB2aW5mby54cmVzICogdmluZm8ueXJlcyAqIGJ5dGVzcHA7Ci0gICAgZmJpbmZvLndpZHRoID0gdmluZm8ueHJlczsKLSAgICBmYmluZm8uaGVpZ2h0ID0gdmluZm8ueXJlczsKLSAgICBmYmluZm8ucmVkX29mZnNldCA9IHZpbmZvLnJlZC5vZmZzZXQ7Ci0gICAgZmJpbmZvLnJlZF9sZW5ndGggPSB2aW5mby5yZWQubGVuZ3RoOwotICAgIGZiaW5mby5ncmVlbl9vZmZzZXQgPSB2aW5mby5ncmVlbi5vZmZzZXQ7Ci0gICAgZmJpbmZvLmdyZWVuX2xlbmd0aCA9IHZpbmZvLmdyZWVuLmxlbmd0aDsKLSAgICBmYmluZm8uYmx1ZV9vZmZzZXQgPSB2aW5mby5ibHVlLm9mZnNldDsKLSAgICBmYmluZm8uYmx1ZV9sZW5ndGggPSB2aW5mby5ibHVlLmxlbmd0aDsKLSAgICBmYmluZm8uYWxwaGFfb2Zmc2V0ID0gdmluZm8udHJhbnNwLm9mZnNldDsKLSAgICBmYmluZm8uYWxwaGFfbGVuZ3RoID0gdmluZm8udHJhbnNwLmxlbmd0aDsKLQotICAgIC8qIEhBQ0s6IGZvciBzZXZlcmFsIG9mIG91ciAzZCBjb3JlcyBhIHNwZWNpZmljIGFsaWdubWVudAotICAgICAqIGlzIHJlcXVpcmVkIHNvIHRoZSBzdGFydCBvZiB0aGUgZmIgbWF5IG5vdCBiZSBhbiBpbnRlZ2VyIG51bWJlciBvZiBsaW5lcwotICAgICAqIGZyb20gdGhlIGJhc2UuICBBcyBhIHJlc3VsdCB3ZSBhcmUgc3RvcmluZyB0aGUgYWRkaXRpb25hbCBvZmZzZXQgaW4KLSAgICAgKiB4b2Zmc2V0LiBUaGlzIGlzIG5vdCB0aGUgY29ycmVjdCB1c2FnZSBmb3IgeG9mZnNldCwgaXQgc2hvdWxkIGJlIGFkZGVkCi0gICAgICogdG8gZWFjaCBsaW5lLCBub3QganVzdCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgKi8KLSAgICBvZmZzZXQgPSB2aW5mby54b2Zmc2V0ICogYnl0ZXNwcDsKLQotICAgIG9mZnNldCArPSB2aW5mby54cmVzICogdmluZm8ueW9mZnNldCAqIGJ5dGVzcHA7Ci0KLSAgICBpZih3cml0ZXgoZmQsICZmYmluZm8sIHNpemVvZihmYmluZm8pKSkgZ290byBkb25lOwotCi0gICAgbHNlZWsoZmIsIG9mZnNldCwgU0VFS19TRVQpOwotICAgIGZvcihpID0gMDsgaSA8IGZiaW5mby5zaXplOyBpICs9IDI1NikgewotICAgICAgaWYocmVhZHgoZmIsICZ4LCAyNTYpKSBnb3RvIGRvbmU7Ci0gICAgICBpZih3cml0ZXgoZmQsICZ4LCAyNTYpKSBnb3RvIGRvbmU7CisgICAgaWYgKHBpZCA9PSAwKSB7CisgICAgICAgIGR1cDIoZmRzWzFdLCBTVERPVVRfRklMRU5PKTsKKyAgICAgICAgY2xvc2UoZmRzWzBdKTsKKyAgICAgICAgY2xvc2UoZmRzWzFdKTsKKyAgICAgICAgY29uc3QgY2hhciogY29tbWFuZCA9ICJzY3JlZW5jYXAiOworICAgICAgICBjb25zdCBjaGFyICphcmdzWzJdID0ge2NvbW1hbmQsIE5VTEx9OworICAgICAgICBleGVjdnAoY29tbWFuZCwgKGNoYXIqKilhcmdzKTsKKyAgICAgICAgZXhpdCgxKTsKICAgICB9CiAKLSAgICBpZihyZWFkeChmYiwgJngsIGZiaW5mby5zaXplICUgMjU2KSkgZ290byBkb25lOwotICAgIGlmKHdyaXRleChmZCwgJngsIGZiaW5mby5zaXplICUgMjU2KSkgZ290byBkb25lOworICAgIGZkX3NjcmVlbmNhcCA9IGZkc1swXTsKKworICAgIC8qIHJlYWQgdywgaCAmIGZvcm1hdCAqLworICAgIGlmKHJlYWR4KGZkX3NjcmVlbmNhcCwgJncsIDQpKSBnb3RvIGRvbmU7CisgICAgaWYocmVhZHgoZmRfc2NyZWVuY2FwLCAmaCwgNCkpIGdvdG8gZG9uZTsKKyAgICBpZihyZWFkeChmZF9zY3JlZW5jYXAsICZmLCA0KSkgZ290byBkb25lOworCisgICAgZmJpbmZvLnZlcnNpb24gPSBERE1TX1JBV0lNQUdFX1ZFUlNJT047CisgICAgLyogc2VlIGhhcmR3YXJlL2hhcmR3YXJlLmggKi8KKyAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgY2FzZSAxOiAvKiBSR0JBXzg4ODggKi8KKyAgICAgICAgICAgIGZiaW5mby5icHAgPSAzMjsKKyAgICAgICAgICAgIGZiaW5mby5zaXplID0gdyAqIGggKiA0OworICAgICAgICAgICAgZmJpbmZvLndpZHRoID0gdzsKKyAgICAgICAgICAgIGZiaW5mby5oZWlnaHQgPSBoOworICAgICAgICAgICAgZmJpbmZvLnJlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgZmJpbmZvLnJlZF9sZW5ndGggPSA4OworICAgICAgICAgICAgZmJpbmZvLmdyZWVuX29mZnNldCA9IDg7CisgICAgICAgICAgICBmYmluZm8uZ3JlZW5fbGVuZ3RoID0gODsKKyAgICAgICAgICAgIGZiaW5mby5ibHVlX29mZnNldCA9IDE2OworICAgICAgICAgICAgZmJpbmZvLmJsdWVfbGVuZ3RoID0gODsKKyAgICAgICAgICAgIGZiaW5mby5hbHBoYV9vZmZzZXQgPSAyNDsKKyAgICAgICAgICAgIGZiaW5mby5hbHBoYV9sZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogUkdCWF84ODg4ICovCisgICAgICAgICAgICBmYmluZm8uYnBwID0gMzI7CisgICAgICAgICAgICBmYmluZm8uc2l6ZSA9IHcgKiBoICogNDsKKyAgICAgICAgICAgIGZiaW5mby53aWR0aCA9IHc7CisgICAgICAgICAgICBmYmluZm8uaGVpZ2h0ID0gaDsKKyAgICAgICAgICAgIGZiaW5mby5yZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGZiaW5mby5yZWRfbGVuZ3RoID0gODsKKyAgICAgICAgICAgIGZiaW5mby5ncmVlbl9vZmZzZXQgPSA4OworICAgICAgICAgICAgZmJpbmZvLmdyZWVuX2xlbmd0aCA9IDg7CisgICAgICAgICAgICBmYmluZm8uYmx1ZV9vZmZzZXQgPSAxNjsKKyAgICAgICAgICAgIGZiaW5mby5ibHVlX2xlbmd0aCA9IDg7CisgICAgICAgICAgICBmYmluZm8uYWxwaGFfb2Zmc2V0ID0gMjQ7CisgICAgICAgICAgICBmYmluZm8uYWxwaGFfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8qIFJHQl84ODggKi8KKyAgICAgICAgICAgIGZiaW5mby5icHAgPSAyNDsKKyAgICAgICAgICAgIGZiaW5mby5zaXplID0gdyAqIGggKiAzOworICAgICAgICAgICAgZmJpbmZvLndpZHRoID0gdzsKKyAgICAgICAgICAgIGZiaW5mby5oZWlnaHQgPSBoOworICAgICAgICAgICAgZmJpbmZvLnJlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgZmJpbmZvLnJlZF9sZW5ndGggPSA4OworICAgICAgICAgICAgZmJpbmZvLmdyZWVuX29mZnNldCA9IDg7CisgICAgICAgICAgICBmYmluZm8uZ3JlZW5fbGVuZ3RoID0gODsKKyAgICAgICAgICAgIGZiaW5mby5ibHVlX29mZnNldCA9IDE2OworICAgICAgICAgICAgZmJpbmZvLmJsdWVfbGVuZ3RoID0gODsKKyAgICAgICAgICAgIGZiaW5mby5hbHBoYV9vZmZzZXQgPSAyNDsKKyAgICAgICAgICAgIGZiaW5mby5hbHBoYV9sZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogLyogUkdCXzU2NSAqLworICAgICAgICAgICAgZmJpbmZvLmJwcCA9IDE2OworICAgICAgICAgICAgZmJpbmZvLnNpemUgPSB3ICogaCAqIDI7CisgICAgICAgICAgICBmYmluZm8ud2lkdGggPSB3OworICAgICAgICAgICAgZmJpbmZvLmhlaWdodCA9IGg7CisgICAgICAgICAgICBmYmluZm8ucmVkX29mZnNldCA9IDExOworICAgICAgICAgICAgZmJpbmZvLnJlZF9sZW5ndGggPSA1OworICAgICAgICAgICAgZmJpbmZvLmdyZWVuX29mZnNldCA9IDU7CisgICAgICAgICAgICBmYmluZm8uZ3JlZW5fbGVuZ3RoID0gNjsKKyAgICAgICAgICAgIGZiaW5mby5ibHVlX29mZnNldCA9IDA7CisgICAgICAgICAgICBmYmluZm8uYmx1ZV9sZW5ndGggPSA1OworICAgICAgICAgICAgZmJpbmZvLmFscGhhX29mZnNldCA9IDA7CisgICAgICAgICAgICBmYmluZm8uYWxwaGFfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6IC8qIEJHUkFfODg4OCAqLworICAgICAgICAgICAgZmJpbmZvLmJwcCA9IDMyOworICAgICAgICAgICAgZmJpbmZvLnNpemUgPSB3ICogaCAqIDQ7CisgICAgICAgICAgICBmYmluZm8ud2lkdGggPSB3OworICAgICAgICAgICAgZmJpbmZvLmhlaWdodCA9IGg7CisgICAgICAgICAgICBmYmluZm8ucmVkX29mZnNldCA9IDE2OworICAgICAgICAgICAgZmJpbmZvLnJlZF9sZW5ndGggPSA4OworICAgICAgICAgICAgZmJpbmZvLmdyZWVuX29mZnNldCA9IDg7CisgICAgICAgICAgICBmYmluZm8uZ3JlZW5fbGVuZ3RoID0gODsKKyAgICAgICAgICAgIGZiaW5mby5ibHVlX29mZnNldCA9IDA7CisgICAgICAgICAgICBmYmluZm8uYmx1ZV9sZW5ndGggPSA4OworICAgICAgICAgICAgZmJpbmZvLmFscGhhX29mZnNldCA9IDI0OworICAgICAgICAgICAgZmJpbmZvLmFscGhhX2xlbmd0aCA9IDg7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qIHdyaXRlIGhlYWRlciAqLworICAgIGlmKHdyaXRleChmZCwgJmZiaW5mbywgc2l6ZW9mKGZiaW5mbykpKSBnb3RvIGRvbmU7CisKKyAgICAvKiB3cml0ZSBkYXRhICovCisgICAgZm9yKGkgPSAwOyBpIDwgZmJpbmZvLnNpemU7IGkgKz0gc2l6ZW9mKGJ1ZikpIHsKKyAgICAgIGlmKHJlYWR4KGZkX3NjcmVlbmNhcCwgYnVmLCBzaXplb2YoYnVmKSkpIGdvdG8gZG9uZTsKKyAgICAgIGlmKHdyaXRleChmZCwgYnVmLCBzaXplb2YoYnVmKSkpIGdvdG8gZG9uZTsKKyAgICB9CisgICAgaWYocmVhZHgoZmRfc2NyZWVuY2FwLCBidWYsIGZiaW5mby5zaXplICUgc2l6ZW9mKGJ1ZikpKSBnb3RvIGRvbmU7CisgICAgaWYod3JpdGV4KGZkLCBidWYsIGZiaW5mby5zaXplICUgc2l6ZW9mKGJ1ZikpKSBnb3RvIGRvbmU7CiAKIGRvbmU6Ci0gICAgaWYoZmIgPj0gMCkgY2xvc2UoZmIpOworICAgIGNsb3NlKGZkc1swXSk7CisgICAgY2xvc2UoZmRzWzFdKTsKICAgICBjbG9zZShmZCk7CiB9CmRpZmYgLS1naXQgYS9hZGIvamR3cF9zZXJ2aWNlLmMgYi9hZGIvamR3cF9zZXJ2aWNlLmMKaW5kZXggMGMyNmY3Yi4uY2Q2MmI1NSAxMDA2NDQKLS0tIGEvYWRiL2pkd3Bfc2VydmljZS5jCisrKyBiL2FkYi9qZHdwX3NlcnZpY2UuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIC8qIGhlcmUncyBob3cgdGhlc2UgdGhpbmdzIHdvcmsuCiAKQEAgLTMyMCw2ICszMjEsNyBAQAogICAgICAgICAgICAgc3RydWN0IGlvdmVjICAgICBpb3Y7CiAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgIGR1bW15ID0gJyEnOwogICAgICAgICAgICAgY2hhciAgICAgICAgICAgICBidWZmZXJbc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSArIHNpemVvZihpbnQpXTsKKyAgICAgICAgICAgIGludCBmbGFnczsKIAogICAgICAgICAgICAgaW92Lmlvdl9iYXNlICAgICAgID0gJmR1bW15OwogICAgICAgICAgICAgaW92Lmlvdl9sZW4gICAgICAgID0gMTsKQEAgLTMzNywxMCArMzM5LDI3IEBACiAgICAgICAgICAgICBjbXNnLT5jbXNnX3R5cGUgID0gU0NNX1JJR0hUUzsKICAgICAgICAgICAgICgoaW50KilDTVNHX0RBVEEoY21zZykpWzBdID0gZmQ7CiAKKyAgICAgICAgICAgIGZsYWdzID0gZmNudGwocHJvYy0+c29ja2V0LEZfR0VURkwsMCk7CisKKyAgICAgICAgICAgIGlmIChmbGFncyA9PSAtMSkgeworICAgICAgICAgICAgICAgIEQoImZhaWxlZCB0byBnZXQgY250bCBmbGFncyBmb3Igc29ja2V0ICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHByb2MtPnBpZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBnb3RvIENsb3NlUHJvY2VzczsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmNudGwocHJvYy0+c29ja2V0LCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIEQoImZhaWxlZCB0byByZW1vdmUgT19OT05CTE9DSyBmbGFnIGZvciBzb2NrZXQgJWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgcHJvYy0+cGlkLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGdvdG8gQ2xvc2VQcm9jZXNzOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gc2VuZG1zZyhwcm9jLT5zb2NrZXQsICZtc2csIDApOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRiX2Nsb3NlKGZkKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgRCgic2VuZGluZyBuZXcgZmlsZSBkZXNjcmlwdG9yIHRvIEpEV1AgJWQgZmFpbGVkOiAlc1xuIiwKQEAgLTM1NCw2ICszNzMsMTIgQEAKICAgICAgICAgICAgIGZvciAobiA9IDE7IG4gPCBwcm9jLT5vdXRfY291bnQ7IG4rKykKICAgICAgICAgICAgICAgICBwcm9jLT5vdXRfZmRzW24tMV0gPSBwcm9jLT5vdXRfZmRzW25dOwogCisgICAgICAgICAgICBpZiAoZmNudGwocHJvYy0+c29ja2V0LCBGX1NFVEZMLCBmbGFncykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBEKCJmYWlsZWQgdG8gc2V0IE9fTk9OQkxPQ0sgZmxhZyBmb3Igc29ja2V0ICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHByb2MtPnBpZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBnb3RvIENsb3NlUHJvY2VzczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKC0tcHJvYy0+b3V0X2NvdW50ID09IDApCiAgICAgICAgICAgICAgICAgZmRldmVudF9kZWwoIHByb2MtPmZkZSwgRkRFX1dSSVRFICk7CiAgICAgICAgIH0KQEAgLTQ3NCw2ICs0OTksNyBAQAogCiAgICAgLyogb25seSB3YWl0IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyAqLwogICAgIGZkZXZlbnRfYWRkKGNvbnRyb2wtPmZkZSwgRkRFX1JFQUQpOworICAgIGNsb3NlX29uX2V4ZWMocyk7CiAKICAgICBEKCJqZHdwIGNvbnRyb2wgc29ja2V0IHN0YXJ0ZWQgKCVkKVxuIiwgY29udHJvbC0+bGlzdGVuX3NvY2tldCk7CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hZGIvbXV0ZXhfbGlzdC5oIGIvYWRiL211dGV4X2xpc3QuaAppbmRleCBlZWJlMGRmLi42NTJkZDczIDEwMDY0NAotLS0gYS9hZGIvbXV0ZXhfbGlzdC5oCisrKyBiL2FkYi9tdXRleF9saXN0LmgKQEAgLTEsOCArMSwxMSBAQAotLyogdGhlIGxpc3Qgb2YgbXV0ZXhlcyB1c2VkIGJ5IGFkZGIgKi8KKy8qIHRoZSBsaXN0IG9mIG11dGV4ZXMgdXNlZCBieSBhZGIgKi8KKy8qICNpZm5kZWYgX19NVVRFWF9MSVNUX0gKKyAqIERvIG5vdCB1c2UgYW4gaW5jbHVkZS1ndWFyZC4gVGhpcyBmaWxlIGlzIGluY2x1ZGVkIG9uY2UgdG8gZGVjbGFyZSB0aGUgbG9ja3MKKyAqIGFuZCBvbmNlIGluIHdpbjMyIHRvIGFjdHVhbGx5IGRvIHRoZSBydW50aW1lIGluaXRpYWxpemF0aW9uLgorICovCiAjaWZuZGVmIEFEQl9NVVRFWAogI2Vycm9yIEFEQl9NVVRFWCBub3QgZGVmaW5lZCB3aGVuIGluY2x1ZGluZyB0aGlzIGZpbGUKICNlbmRpZgotCiBBREJfTVVURVgoZG5zX2xvY2spCiBBREJfTVVURVgoc29ja2V0X2xpc3RfbG9jaykKIEFEQl9NVVRFWCh0cmFuc3BvcnRfbG9jaykKQEAgLTExLDQgKzE0LDEzIEBACiAjZW5kaWYKIEFEQl9NVVRFWCh1c2JfbG9jaykKIAorLy8gU2FkbHkgbG9nZ2luZyB0byAvZGF0YS9hZGIvYWRiLS4uLiBpcyBub3QgdGhyZWFkIHNhZmUuCisvLyAgQWZ0ZXIgbW9kaWZ5aW5nIGFkYi5oOjpEKCkgdG8gY291bnQgaW52b2NhdGlvbnM6CisvLyAgIERFQlVHKGpwYSk6MDpIYW5kbGluZyBtYWluKCkKKy8vICAgREVCVUcoanBhKToxOlsgdXNiX2luaXQgLSBzdGFydGluZyB0aHJlYWQgXQorLy8gKE9vcHNpZXMsIG5vIDoyOiwgYW5kIG1hdGNoaW5nIG1lc3NhZ2UgaXMgYWxzbyBnb25lLikKKy8vICAgREVCVUcoanBhKTozOlsgdXNiX3RocmVhZCAtIG9wZW5pbmcgZGV2aWNlIF0KKy8vICAgREVCVUcoanBhKTo0Ompkd3AgY29udHJvbCBzb2NrZXQgc3RhcnRlZCAoMTApCitBREJfTVVURVgoRF9sb2NrKQorCiAjdW5kZWYgQURCX01VVEVYCmRpZmYgLS1naXQgYS9hZGIvc2VydmljZXMuYyBiL2FkYi9zZXJ2aWNlcy5jCmluZGV4IDQ4N2M3ZDMuLmVjMGIwYmEgMTAwNjQ0Ci0tLSBhL2FkYi9zZXJ2aWNlcy5jCisrKyBiL2FkYi9zZXJ2aWNlcy5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlICJzeXNkZXBzLmgiCiAKLSNkZWZpbmUgIFRSQUNFX1RBRyAgVFJBQ0VfQURCCisjZGVmaW5lICBUUkFDRV9UQUcgIFRSQUNFX1NFUlZJQ0VTCiAjaW5jbHVkZSAiYWRiLmgiCiAjaW5jbHVkZSAiZmlsZV9zeW5jX3NlcnZpY2UuaCIKIApAQCAtMzAsOSArMzAsMTAgQEAKICMgIGlmbmRlZiBIQVZFX1dJTlNPQ0sKICMgICAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogIyAgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgICBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICMgIGVuZGlmCiAjZWxzZQotIyAgaW5jbHVkZSA8c3lzL3JlYm9vdC5oPgorIyAgaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3Qgc3RpbmZvIHN0aW5mbzsKQEAgLTE5Myw4ICsxOTQsNyBAQAogICAgICAgICB3YWl0cGlkKHBpZCwgJnJldCwgMCk7CiAgICAgfQogCi0gICAgcmV0ID0gX19yZWJvb3QoTElOVVhfUkVCT09UX01BR0lDMSwgTElOVVhfUkVCT09UX01BR0lDMiwKLSAgICAgICAgICAgICAgICAgICAgTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUMiwgKGNoYXIgKilhcmcpOworICAgIHJldCA9IGFuZHJvaWRfcmVib290KEFORFJPSURfUkJfUkVTVEFSVDIsIDAsIChjaGFyICopIGFyZyk7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInJlYm9vdCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICB3cml0ZXgoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOwpAQCAtMjY4LDE1ICsyNjgsMTYgQEAKICAgICByZXR1cm4gc1swXTsKIH0KIAotc3RhdGljIGludCBjcmVhdGVfc3VicHJvY2Vzcyhjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZzAsIGNvbnN0IGNoYXIgKmFyZzEpCisjaWYgIUFEQl9IT1NUCitzdGF0aWMgaW50IGNyZWF0ZV9zdWJwcm9jZXNzKGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqYXJnMCwgY29uc3QgY2hhciAqYXJnMSwgcGlkX3QgKnBpZCkKIHsKICNpZmRlZiBIQVZFX1dJTjMyX1BST0MKLQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBjcmVhdGVfc3VicHJvY2VzcyBub3QgaW1wbGVtZW50ZWQgb24gV2luMzIgKCVzICVzICVzKVxuIiwgY21kLCBhcmcwLCBhcmcxKTsKLQlyZXR1cm4gLTE7CisgICAgRCgiY3JlYXRlX3N1YnByb2Nlc3MoY21kPSVzLCBhcmcwPSVzLCBhcmcxPSVzKVxuIiwgY21kLCBhcmcwLCBhcmcxKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBjcmVhdGVfc3VicHJvY2VzcyBub3QgaW1wbGVtZW50ZWQgb24gV2luMzIgKCVzICVzICVzKVxuIiwgY21kLCBhcmcwLCBhcmcxKTsKKyAgICByZXR1cm4gLTE7CiAjZWxzZSAvKiAhSEFWRV9XSU4zMl9QUk9DICovCiAgICAgY2hhciAqZGV2bmFtZTsKICAgICBpbnQgcHRtOwotICAgIHBpZF90IHBpZDsKIAogICAgIHB0bSA9IHVuaXhfb3BlbigiL2Rldi9wdG14IiwgT19SRFdSKTsgLy8gfCBPX05PQ1RUWSk7CiAgICAgaWYocHRtIDwgMCl7CkBAIC0yODgsMzggKzI4OSwzOCBAQAogICAgIGlmKGdyYW50cHQocHRtKSB8fCB1bmxvY2twdChwdG0pIHx8CiAgICAgICAgKChkZXZuYW1lID0gKGNoYXIqKSBwdHNuYW1lKHB0bSkpID09IDApKXsKICAgICAgICAgcHJpbnRmKCJbIHRyb3VibGUgd2l0aCAvZGV2L3B0bXggLSAlcyBdXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBhZGJfY2xvc2UocHRtKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHBpZCA9IGZvcmsoKTsKLSAgICBpZihwaWQgPCAwKSB7CisgICAgKnBpZCA9IGZvcmsoKTsKKyAgICBpZigqcGlkIDwgMCkgewogICAgICAgICBwcmludGYoIi0gZm9yayBmYWlsZWQ6ICVzIC1cbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGFkYl9jbG9zZShwdG0pOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYocGlkID09IDApeworICAgIGlmKCpwaWQgPT0gMCl7CiAgICAgICAgIGludCBwdHM7CiAKICAgICAgICAgc2V0c2lkKCk7CiAKICAgICAgICAgcHRzID0gdW5peF9vcGVuKGRldm5hbWUsIE9fUkRXUik7Ci0gICAgICAgIGlmKHB0cyA8IDApIGV4aXQoLTEpOworICAgICAgICBpZihwdHMgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNoaWxkIGZhaWxlZCB0byBvcGVuIHBzZXVkby10ZXJtIHNsYXZlOiAlc1xuIiwgZGV2bmFtZSk7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQogCiAgICAgICAgIGR1cDIocHRzLCAwKTsKICAgICAgICAgZHVwMihwdHMsIDEpOwogICAgICAgICBkdXAyKHB0cywgMik7CiAKKyAgICAgICAgYWRiX2Nsb3NlKHB0cyk7CiAgICAgICAgIGFkYl9jbG9zZShwdG0pOwogCi0gICAgICAgIGV4ZWNsKGNtZCwgY21kLCBhcmcwLCBhcmcxLCBOVUxMKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICItIGV4ZWMgJyVzJyBmYWlsZWQ6ICVzICglZCkgLVxuIiwKLSAgICAgICAgICAgICAgICBjbWQsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotICAgICAgICBleGl0KC0xKTsKLSAgICB9IGVsc2UgewotI2lmICFBREJfSE9TVAotICAgICAgICAvLyBzZXQgY2hpbGQncyBPT00gYWRqdXN0bWVudCB0byB6ZXJvCisgICAgICAgIC8vIHNldCBPT00gYWRqdXN0bWVudCB0byB6ZXJvCiAgICAgICAgIGNoYXIgdGV4dFs2NF07Ci0gICAgICAgIHNucHJpbnRmKHRleHQsIHNpemVvZiB0ZXh0LCAiL3Byb2MvJWQvb29tX2FkaiIsIHBpZCk7CisgICAgICAgIHNucHJpbnRmKHRleHQsIHNpemVvZiB0ZXh0LCAiL3Byb2MvJWQvb29tX2FkaiIsIGdldHBpZCgpKTsKICAgICAgICAgaW50IGZkID0gYWRiX29wZW4odGV4dCwgT19XUk9OTFkpOwogICAgICAgICBpZiAoZmQgPj0gMCkgewogICAgICAgICAgICAgYWRiX3dyaXRlKGZkLCAiMCIsIDEpOwpAQCAtMzI3LDExICszMjgsMjAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRCgiYWRiOiB1bmFibGUgdG8gb3BlbiAlc1xuIiwgdGV4dCk7CiAgICAgICAgIH0KLSNlbmRpZgorICAgICAgICBleGVjbChjbWQsIGNtZCwgYXJnMCwgYXJnMSwgTlVMTCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLSBleGVjICclcycgZmFpbGVkOiAlcyAoJWQpIC1cbiIsCisgICAgICAgICAgICAgICAgY21kLCBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRG9uJ3Qgc2V0IGNoaWxkJ3MgT09NIGFkanVzdG1lbnQgdG8gemVyby4KKyAgICAgICAgLy8gTGV0IHRoZSBjaGlsZCBkbyBpdCBpdHNlbGYsIGFzIHNvbWV0aW1lcyB0aGUgcGFyZW50IHN0YXJ0cworICAgICAgICAvLyBydW5uaW5nIGJlZm9yZSB0aGUgY2hpbGQgaGFzIGEgL3Byb2MvcGlkL29vbV9hZGouCisgICAgICAgIC8vICIiImFkYjogdW5hYmxlIHRvIG9wZW4gL3Byb2MvNjQ0L29vbV9hZGoiIiIgc2VlbiBpbiBzb21lIGxvZ3MuCiAgICAgICAgIHJldHVybiBwdG07CiAgICAgfQogI2VuZGlmIC8qICFIQVZFX1dJTjMyX1BST0MgKi8KIH0KKyNlbmRpZiAgLyogIUFCRF9IT1NUICovCiAKICNpZiBBREJfSE9TVAogI2RlZmluZSBTSEVMTF9DT01NQU5EICIvYmluL3NoIgpAQCAtMzM5LDYgKzM0OSw3MCBAQAogI2RlZmluZSBTSEVMTF9DT01NQU5EICIvc3lzdGVtL2Jpbi9zaCIKICNlbmRpZgogCisjaWYgIUFEQl9IT1NUCitzdGF0aWMgdm9pZCBzdWJwcm9jX3dhaXRlcl9zZXJ2aWNlKGludCBmZCwgdm9pZCAqY29va2llKQoreworICAgIHBpZF90IHBpZCA9IChwaWRfdCljb29raWU7CisKKyAgICBEKCJlbnRlcmVkLiBmZD0lZCBvZiBwaWQ9JWRcbiIsIGZkLCBwaWQpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgcGlkX3QgcCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKKyAgICAgICAgaWYgKHAgPT0gcGlkKSB7CisgICAgICAgICAgICBEKCJmZD0lZCwgcG9zdCB3YWl0cGlkKHBpZD0lZCkgc3RhdHVzPSUwNHhcbiIsIGZkLCBwLCBzdGF0dXMpOworICAgICAgICAgICAgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBEKCIqKiogS2lsbGVkIGJ5IHNpZ25hbCAlZFxuIiwgV1RFUk1TSUcoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIEQoIioqKiBEaWRuJ3QgZXhpdCEhLiBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgPj0gMCkgeworICAgICAgICAgICAgICAgIEQoIioqKiBFeGl0IGNvZGUgJWRcbiIsIFdFWElUU1RBVFVTKHN0YXR1cykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICB1c2xlZXAoMTAwMDAwKTsgIC8vIHBvbGwgZXZlcnkgMC4xIHNlYworICAgIH0KKyAgICBEKCJzaGVsbCBleGl0ZWQgZmQ9JWQgb2YgcGlkPSVkIGVycj0lZFxuIiwgZmQsIHBpZCwgZXJybm8pOworICAgIGlmIChTSEVMTF9FWElUX05PVElGWV9GRCA+PTApIHsKKyAgICAgIGludCByZXM7CisgICAgICByZXMgPSB3cml0ZXgoU0hFTExfRVhJVF9OT1RJRllfRkQsICZmZCwgc2l6ZW9mKGZkKSk7CisgICAgICBEKCJub3RpZmllZCBzaGVsbCBleGl0IHZpYSBmZD0lZCBmb3IgcGlkPSVkIHJlcz0lZCBlcnJubz0lZFxuIiwKKyAgICAgICAgU0hFTExfRVhJVF9OT1RJRllfRkQsIHBpZCwgcmVzLCBlcnJubyk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNyZWF0ZV9zdWJwcm9jX3RocmVhZChjb25zdCBjaGFyICpuYW1lKQoreworICAgIHN0aW5mbyAqc3RpOworICAgIGFkYl90aHJlYWRfdCB0OworICAgIGludCByZXRfZmQ7CisgICAgcGlkX3QgcGlkOworICAgIGlmKG5hbWUpIHsKKyAgICAgICAgcmV0X2ZkID0gY3JlYXRlX3N1YnByb2Nlc3MoU0hFTExfQ09NTUFORCwgIi1jIiwgbmFtZSwgJnBpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0X2ZkID0gY3JlYXRlX3N1YnByb2Nlc3MoU0hFTExfQ09NTUFORCwgIi0iLCAwLCAmcGlkKTsKKyAgICB9CisgICAgRCgiY3JlYXRlX3N1YnByb2Nlc3MoKSByZXRfZmQ9JWQgcGlkPSVkXG4iLCByZXRfZmQsIHBpZCk7CisKKyAgICBzdGkgPSBtYWxsb2Moc2l6ZW9mKHN0aW5mbykpOworICAgIGlmKHN0aSA9PSAwKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHN0aW5mbyIpOworICAgIHN0aS0+ZnVuYyA9IHN1YnByb2Nfd2FpdGVyX3NlcnZpY2U7CisgICAgc3RpLT5jb29raWUgPSAodm9pZCopcGlkOworICAgIHN0aS0+ZmQgPSByZXRfZmQ7CisKKyAgICBpZihhZGJfdGhyZWFkX2NyZWF0ZSggJnQsIHNlcnZpY2VfYm9vdHN0cmFwX2Z1bmMsIHN0aSkpeworICAgICAgICBmcmVlKHN0aSk7CisgICAgICAgIGFkYl9jbG9zZShyZXRfZmQpOworICAgICAgICBwcmludGYoImNhbm5vdCBjcmVhdGUgc2VydmljZSB0aHJlYWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgRCgic2VydmljZSB0aHJlYWQgc3RhcnRlZCwgZmQ9JWQgcGlkPSVkXG4iLHJldF9mZCwgcGlkKTsKKyAgICByZXR1cm4gcmV0X2ZkOworfQorI2VuZGlmCisKIGludCBzZXJ2aWNlX3RvX2ZkKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgaW50IHJldCA9IC0xOwpAQCAtMzg5LDE0ICs0NjMsMTIgQEAKICAgICAgICAgcmV0ID0gY3JlYXRlX2pkd3BfY29ubmVjdGlvbl9mZChhdG9pKG5hbWUrNSkpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobmFtZSwgImxvZzoiLCA0KSkgewogICAgICAgICByZXQgPSBjcmVhdGVfc2VydmljZV90aHJlYWQobG9nX3NlcnZpY2UsIGdldF9sb2dfZmlsZV9wYXRoKG5hbWUgKyA0KSk7Ci0jZW5kaWYKICAgICB9IGVsc2UgaWYoIUhPU1QgJiYgIXN0cm5jbXAobmFtZSwgInNoZWxsOiIsIDYpKSB7CiAgICAgICAgIGlmKG5hbWVbNl0pIHsKLSAgICAgICAgICAgIHJldCA9IGNyZWF0ZV9zdWJwcm9jZXNzKFNIRUxMX0NPTU1BTkQsICItYyIsIG5hbWUgKyA2KTsKKyAgICAgICAgICAgIHJldCA9IGNyZWF0ZV9zdWJwcm9jX3RocmVhZChuYW1lICsgNik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBjcmVhdGVfc3VicHJvY2VzcyhTSEVMTF9DT01NQU5ELCAiLSIsIDApOworICAgICAgICAgICAgcmV0ID0gY3JlYXRlX3N1YnByb2NfdGhyZWFkKDApOwogICAgICAgICB9Ci0jaWYgIUFEQl9IT1NUCiAgICAgfSBlbHNlIGlmKCFzdHJuY21wKG5hbWUsICJzeW5jOiIsIDUpKSB7CiAgICAgICAgIHJldCA9IGNyZWF0ZV9zZXJ2aWNlX3RocmVhZChmaWxlX3N5bmNfc2VydmljZSwgTlVMTCk7CiAgICAgfSBlbHNlIGlmKCFzdHJuY21wKG5hbWUsICJyZW1vdW50OiIsIDgpKSB7CkBAIC00MDcsNiArNDc5LDEwIEBACiAgICAgICAgIHJldCA9IGNyZWF0ZV9zZXJ2aWNlX3RocmVhZChyZWJvb3Rfc2VydmljZSwgYXJnKTsKICAgICB9IGVsc2UgaWYoIXN0cm5jbXAobmFtZSwgInJvb3Q6IiwgNSkpIHsKICAgICAgICAgcmV0ID0gY3JlYXRlX3NlcnZpY2VfdGhyZWFkKHJlc3RhcnRfcm9vdF9zZXJ2aWNlLCBOVUxMKTsKKyAgICB9IGVsc2UgaWYoIXN0cm5jbXAobmFtZSwgImJhY2t1cDoiLCA3KSkgeworICAgICAgICBjaGFyKiBhcmcgPSBzdHJkdXAobmFtZSs3KTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgICAgIHJldCA9IGJhY2t1cF9zZXJ2aWNlKGFyZyk7CiAgICAgfSBlbHNlIGlmKCFzdHJuY21wKG5hbWUsICJ0Y3BpcDoiLCA2KSkgewogICAgICAgICBpbnQgcG9ydDsKICAgICAgICAgaWYgKHNzY2FuZihuYW1lICsgNiwgIiVkIiwgJnBvcnQpID09IDApIHsKZGlmZiAtLWdpdCBhL2FkYi9zb2NrZXRzLmMgYi9hZGIvc29ja2V0cy5jCmluZGV4IDlmMWI1OTguLjQ1ZDkzNWMgMTAwNjQ0Ci0tLSBhL2FkYi9zb2NrZXRzLmMKKysrIGIvYWRiL3NvY2tldHMuYwpAQCAtNjUsOCArNjUsMTEgQEAKICAgICBhc29ja2V0ICpyZXN1bHQgPSBOVUxMOwogCiAgICAgYWRiX211dGV4X2xvY2soJnNvY2tldF9saXN0X2xvY2spOwotICAgIGZvcihzID0gbG9jYWxfc29ja2V0X2xpc3QubmV4dDsgcyAhPSAmbG9jYWxfc29ja2V0X2xpc3QgJiYgIXJlc3VsdDsgcyA9IHMtPm5leHQpIHsKLSAgICAgICAgaWYocy0+aWQgPT0gaWQpIHJlc3VsdCA9IHM7CisgICAgZm9yIChzID0gbG9jYWxfc29ja2V0X2xpc3QubmV4dDsgcyAhPSAmbG9jYWxfc29ja2V0X2xpc3Q7IHMgPSBzLT5uZXh0KSB7CisgICAgICAgIGlmIChzLT5pZCA9PSBpZCkgeworICAgICAgICAgICAgcmVzdWx0ID0gczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogICAgIGFkYl9tdXRleF91bmxvY2soJnNvY2tldF9saXN0X2xvY2spOwogCkBAIC0xOTYsNiArMTk5LDcgQEAKIHN0YXRpYyB2b2lkIGxvY2FsX3NvY2tldF9kZXN0cm95KGFzb2NrZXQgICpzKQogewogICAgIGFwYWNrZXQgKnAsICpuOworICAgIEQoIkxTKCVkKTogZGVzdHJveWluZyBmZGUuZmQ9JWRcbiIsIHMtPmlkLCBzLT5mZGUuZmQpOwogCiAgICAgICAgIC8qIElNUE9SVEFOVDogdGhlIHJlbW92ZSBjbG9zZXMgdGhlIGZkCiAgICAgICAgICoqIHRoYXQgYmVsb25ncyB0byB0aGlzIHNvY2tldApAQCAtMjE1LDcgKzIxOSwxMCBAQAogCiBzdGF0aWMgdm9pZCBsb2NhbF9zb2NrZXRfY2xvc2VfbG9ja2VkKGFzb2NrZXQgKnMpCiB7CisgICAgRCgiZW50ZXJlZC4gTFMoJWQpIGZkPSVkXG4iLCBzLT5pZCwgcy0+ZmQpOwogICAgIGlmKHMtPnBlZXIpIHsKKyAgICAgICAgRCgiTFMoJWQpOiBjbG9zaW5nIHBlZXIuIHBlZXItPmlkPSVkIHBlZXItPmZkPSVkXG4iLAorICAgICAgICAgIHMtPmlkLCBzLT5wZWVyLT5pZCwgcy0+cGVlci0+ZmQpOwogICAgICAgICBzLT5wZWVyLT5wZWVyID0gMDsKICAgICAgICAgLy8gdHdlYWsgdG8gYXZvaWQgZGVhZGxvY2sKICAgICAgICAgaWYgKHMtPnBlZXItPmNsb3NlID09IGxvY2FsX3NvY2tldF9jbG9zZSkKQEAgLTI0MCw2ICsyNDcsNyBAQAogICAgIHMtPmNsb3NpbmcgPSAxOwogICAgIGZkZXZlbnRfZGVsKCZzLT5mZGUsIEZERV9SRUFEKTsKICAgICByZW1vdmVfc29ja2V0KHMpOworICAgIEQoIkxTKCVkKTogcHV0IG9uIHNvY2tldF9jbG9zaW5nX2xpc3QgZmQ9JWRcbiIsIHMtPmlkLCBzLT5mZCk7CiAgICAgaW5zZXJ0X2xvY2FsX3NvY2tldChzLCAmbG9jYWxfc29ja2V0X2Nsb3NpbmdfbGlzdCk7CiB9CiAKQEAgLTI0Nyw2ICsyNTUsOCBAQAogewogICAgIGFzb2NrZXQgKnMgPSBfczsKIAorICAgIEQoIkxTKCVkKTogZXZlbnRfZnVuYyhmZD0lZCg9PSVkKSwgZXY9JTA0eClcbiIsIHMtPmlkLCBzLT5mZCwgZmQsIGV2KTsKKwogICAgIC8qIHB1dCB0aGUgRkRFX1dSSVRFIHByb2Nlc3NpbmcgYmVmb3JlIHRoZSBGREVfUkVBRAogICAgICoqIGluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLgogICAgICovCkBAIC0zMDUsNiArMzE1LDcgQEAKIAogICAgICAgICB3aGlsZShhdmFpbCA+IDApIHsKICAgICAgICAgICAgIHIgPSBhZGJfcmVhZChmZCwgeCwgYXZhaWwpOworICAgICAgICAgICAgRCgiTFMoJWQpOiBwb3N0IGFkYl9yZWFkKGZkPSVkLC4uLikgcj0lZCAoZXJybm89JWQpIGF2YWlsPSVkXG4iLCBzLT5pZCwgcy0+ZmQsIHIsIHI8MD9lcnJubzowLCBhdmFpbCk7CiAgICAgICAgICAgICBpZihyID4gMCkgewogICAgICAgICAgICAgICAgIGF2YWlsIC09IHI7CiAgICAgICAgICAgICAgICAgeCArPSByOwpAQCAtMzE5LDEzICszMzAsMTUgQEAKICAgICAgICAgICAgIGlzX2VvZiA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCisgICAgICAgIEQoIkxTKCVkKTogZmQ9JWQgcG9zdCBhdmFpbCBsb29wLiByPSVkIGlzX2VvZj0lZCBmb3JjZWRfZW9mPSVkXG4iLAorICAgICAgICAgIHMtPmlkLCBzLT5mZCwgciwgaXNfZW9mLCBzLT5mZGUuZm9yY2VfZW9mKTsKICAgICAgICAgaWYoKGF2YWlsID09IE1BWF9QQVlMT0FEKSB8fCAocy0+cGVlciA9PSAwKSkgewogICAgICAgICAgICAgcHV0X2FwYWNrZXQocCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwLT5sZW4gPSBNQVhfUEFZTE9BRCAtIGF2YWlsOwogCiAgICAgICAgICAgICByID0gcy0+cGVlci0+ZW5xdWV1ZShzLT5wZWVyLCBwKTsKKyAgICAgICAgICAgIEQoIkxTKCVkKTogZmQ9JWQgcG9zdCBwZWVyLT5lbnF1ZXVlKCkuIHI9JWRcbiIsIHMtPmlkLCBzLT5mZCwgcik7CiAKICAgICAgICAgICAgIGlmKHIgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIHJldHVybiBtZWFucyB0aGV5IGNsb3NlZCB1cyBhcyBhIHNpZGUtZWZmZWN0CkBAIC0zNDcsOCArMzYwLDggQEAKICAgICAgICAgICAgICAgICBmZGV2ZW50X2RlbCgmcy0+ZmRlLCBGREVfUkVBRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZihpc19lb2YpIHsKKyAgICAgICAgLyogRG9uJ3QgYWxsb3cgYSBmb3JjZWQgZW9mIGlmIGRhdGEgaXMgc3RpbGwgdGhlcmUgKi8KKyAgICAgICAgaWYoKHMtPmZkZS5mb3JjZV9lb2YgJiYgIXIpIHx8IGlzX2VvZikgewogICAgICAgICAgICAgcy0+Y2xvc2Uocyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNTksNiArMzcyLDggQEAKICAgICAgICAgICAgICoqIGJ5dGVzIG9mIHJlYWRhYmxlIGRhdGEuCiAgICAgICAgICAgICAqLwogLy8gICAgICAgIHMtPmNsb3NlKHMpOworICAgICAgICBEKCJMUyglZCk6IEZERV9FUlJPUiAoZmQ9JWQpXG4iLCBzLT5pZCwgcy0+ZmQpOworCiAgICAgICAgIHJldHVybjsKICAgICB9CiB9CkBAIC0zNjYsMTIgKzM4MSwxMiBAQAogYXNvY2tldCAqY3JlYXRlX2xvY2FsX3NvY2tldChpbnQgZmQpCiB7CiAgICAgYXNvY2tldCAqcyA9IGNhbGxvYygxLCBzaXplb2YoYXNvY2tldCkpOwotICAgIGlmKHMgPT0gMCkgZmF0YWwoImNhbm5vdCBhbGxvY2F0ZSBzb2NrZXQiKTsKLSAgICBpbnN0YWxsX2xvY2FsX3NvY2tldChzKTsKKyAgICBpZiAocyA9PSBOVUxMKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHNvY2tldCIpOwogICAgIHMtPmZkID0gZmQ7CiAgICAgcy0+ZW5xdWV1ZSA9IGxvY2FsX3NvY2tldF9lbnF1ZXVlOwogICAgIHMtPnJlYWR5ID0gbG9jYWxfc29ja2V0X3JlYWR5OwogICAgIHMtPmNsb3NlID0gbG9jYWxfc29ja2V0X2Nsb3NlOworICAgIGluc3RhbGxfbG9jYWxfc29ja2V0KHMpOwogCiAgICAgZmRldmVudF9pbnN0YWxsKCZzLT5mZGUsIGZkLCBsb2NhbF9zb2NrZXRfZXZlbnRfZnVuYywgcyk7CiAvKiAgICBmZGV2ZW50X2FkZCgmcy0+ZmRlLCBGREVfRVJST1IpOyAqLwpAQCAtMzk3LDcgKzQxMiw3IEBACiAgICAgaWYoZmQgPCAwKSByZXR1cm4gMDsKIAogICAgIHMgPSBjcmVhdGVfbG9jYWxfc29ja2V0KGZkKTsKLSAgICBEKCJMUyglZCk6IGJvdW5kIHRvICclcydcbiIsIHMtPmlkLCBuYW1lKTsKKyAgICBEKCJMUyglZCk6IGJvdW5kIHRvICclcycgdmlhICVkXG4iLCBzLT5pZCwgbmFtZSwgZmQpOwogICAgIHJldHVybiBzOwogfQogCkBAIC00MjcsNyArNDQyLDggQEAKIAogc3RhdGljIGludCByZW1vdGVfc29ja2V0X2VucXVldWUoYXNvY2tldCAqcywgYXBhY2tldCAqcCkKIHsKLSAgICBEKCJDYWxsaW5nIHJlbW90ZV9zb2NrZXRfZW5xdWV1ZVxuIik7CisgICAgRCgiZW50ZXJlZCByZW1vdGVfc29ja2V0X2VucXVldWUgUlMoJWQpIFdSSVRFIGZkPSVkIHBlZXIuZmQ9JWRcbiIsCisgICAgICBzLT5pZCwgcy0+ZmQsIHMtPnBlZXItPmZkKTsKICAgICBwLT5tc2cuY29tbWFuZCA9IEFfV1JURTsKICAgICBwLT5tc2cuYXJnMCA9IHMtPnBlZXItPmlkOwogICAgIHAtPm1zZy5hcmcxID0gcy0+aWQ7CkBAIC00MzgsNyArNDU0LDggQEAKIAogc3RhdGljIHZvaWQgcmVtb3RlX3NvY2tldF9yZWFkeShhc29ja2V0ICpzKQogewotICAgIEQoIkNhbGxpbmcgcmVtb3RlX3NvY2tldF9yZWFkeVxuIik7CisgICAgRCgiZW50ZXJlZCByZW1vdGVfc29ja2V0X3JlYWR5IFJTKCVkKSBPS0FZIGZkPSVkIHBlZXIuZmQ9JWRcbiIsCisgICAgICBzLT5pZCwgcy0+ZmQsIHMtPnBlZXItPmZkKTsKICAgICBhcGFja2V0ICpwID0gZ2V0X2FwYWNrZXQoKTsKICAgICBwLT5tc2cuY29tbWFuZCA9IEFfT0tBWTsKICAgICBwLT5tc2cuYXJnMCA9IHMtPnBlZXItPmlkOwpAQCAtNDQ4LDEyICs0NjUsMTUgQEAKIAogc3RhdGljIHZvaWQgcmVtb3RlX3NvY2tldF9jbG9zZShhc29ja2V0ICpzKQogewotICAgIEQoIkNhbGxpbmcgcmVtb3RlX3NvY2tldF9jbG9zZVxuIik7CisgICAgRCgiZW50ZXJlZCByZW1vdGVfc29ja2V0X2Nsb3NlIFJTKCVkKSBDTE9TRSBmZD0lZCBwZWVyLT5mZD0lZFxuIiwKKyAgICAgIHMtPmlkLCBzLT5mZCwgcy0+cGVlcj9zLT5wZWVyLT5mZDotMSk7CiAgICAgYXBhY2tldCAqcCA9IGdldF9hcGFja2V0KCk7CiAgICAgcC0+bXNnLmNvbW1hbmQgPSBBX0NMU0U7CiAgICAgaWYocy0+cGVlcikgewogICAgICAgICBwLT5tc2cuYXJnMCA9IHMtPnBlZXItPmlkOwogICAgICAgICBzLT5wZWVyLT5wZWVyID0gMDsKKyAgICAgICAgRCgiUlMoJWQpIHBlZXItPmNsb3NlKClpbmcgcGVlci0+aWQ9JWQgcGVlci0+ZmQ9JWRcbiIsCisgICAgICAgICAgcy0+aWQsIHMtPnBlZXItPmlkLCBzLT5wZWVyLT5mZCk7CiAgICAgICAgIHMtPnBlZXItPmNsb3NlKHMtPnBlZXIpOwogICAgIH0KICAgICBwLT5tc2cuYXJnMSA9IHMtPmlkOwpAQCAtNDgyLDcgKzUwMiw3IEBACiAgICAgYXNvY2tldCAqcyA9IGNhbGxvYygxLCBzaXplb2YoYXJlbW90ZXNvY2tldCkpOwogICAgIGFkaXNjb25uZWN0KiAgZGlzID0gJigoYXJlbW90ZXNvY2tldCopcyktPmRpc2Nvbm5lY3Q7CiAKLSAgICBpZihzID09IDApIGZhdGFsKCJjYW5ub3QgYWxsb2NhdGUgc29ja2V0Iik7CisgICAgaWYgKHMgPT0gTlVMTCkgZmF0YWwoImNhbm5vdCBhbGxvY2F0ZSBzb2NrZXQiKTsKICAgICBzLT5pZCA9IGlkOwogICAgIHMtPmVucXVldWUgPSByZW1vdGVfc29ja2V0X2VucXVldWU7CiAgICAgcy0+cmVhZHkgPSByZW1vdGVfc29ja2V0X3JlYWR5OwpAQCAtNDk4LDcgKzUxOCw3IEBACiAKIHZvaWQgY29ubmVjdF90b19yZW1vdGUoYXNvY2tldCAqcywgY29uc3QgY2hhciAqZGVzdGluYXRpb24pCiB7Ci0gICAgRCgiQ29ubmVjdF90b19yZW1vdGUgY2FsbCBcbiIpOworICAgIEQoIkNvbm5lY3RfdG9fcmVtb3RlIGNhbGwgUlMoJWQpIGZkPSVkXG4iLCBzLT5pZCwgcy0+ZmQpOwogICAgIGFwYWNrZXQgKnAgPSBnZXRfYXBhY2tldCgpOwogICAgIGludCBsZW4gPSBzdHJsZW4oZGVzdGluYXRpb24pICsgMTsKIApAQCAtNTY2LDYgKzU4NiwzMiBAQAogICAgIHJldHVybiBuOwogfQogCisvKiBza2lwX2hvc3Rfc2VyaWFsIHJldHVybiB0aGUgcG9zaXRpb24gaW4gYSBzdHJpbmcKKyAgIHNraXBwaW5nIG92ZXIgdGhlICdzZXJpYWwnIHBhcmFtZXRlciBpbiB0aGUgQURCIHByb3RvY29sLAorICAgd2hlcmUgcGFyYW1ldGVyIHN0cmluZyBtYXkgYmUgYSBob3N0OnBvcnQgc3RyaW5nIGNvbnRhaW5pbmcKKyAgIHRoZSBwcm90b2NvbCBkZWxpbWl0ZXIgKGNvbG9uKS4gKi8KK2NoYXIgKnNraXBfaG9zdF9zZXJpYWwoY2hhciAqc2VydmljZSkgeworICAgIGNoYXIgKmZpcnN0X2NvbG9uLCAqc2VyaWFsX2VuZDsKKworICAgIGZpcnN0X2NvbG9uID0gc3RyY2hyKHNlcnZpY2UsICc6Jyk7CisgICAgaWYgKCFmaXJzdF9jb2xvbikgeworICAgICAgICAvKiBObyBjb2xvbiBpbiBzZXJ2aWNlIHN0cmluZy4gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlcmlhbF9lbmQgPSBmaXJzdF9jb2xvbjsKKyAgICBpZiAoaXNkaWdpdChzZXJpYWxfZW5kWzFdKSkgeworICAgICAgICBzZXJpYWxfZW5kKys7CisgICAgICAgIHdoaWxlICgoKnNlcmlhbF9lbmQpICYmIGlzZGlnaXQoKnNlcmlhbF9lbmQpKSB7CisgICAgICAgICAgICBzZXJpYWxfZW5kKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgqc2VyaWFsX2VuZCkgIT0gJzonKSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgb3RoZXIgdGhhbiBudW1iZXJzIHdhcyBmb3VuZCwgcmVzZXQgdGhlIGVuZC4KKyAgICAgICAgICAgIHNlcmlhbF9lbmQgPSBmaXJzdF9jb2xvbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VyaWFsX2VuZDsKK30KKwogc3RhdGljIGludCBzbWFydF9zb2NrZXRfZW5xdWV1ZShhc29ja2V0ICpzLCBhcGFja2V0ICpwKQogewogICAgIHVuc2lnbmVkIGxlbjsKQEAgLTYyMSw4ICs2NjcsOCBAQAogICAgICAgICBjaGFyKiBzZXJpYWxfZW5kOwogICAgICAgICBzZXJ2aWNlICs9IHN0cmxlbigiaG9zdC1zZXJpYWw6Iik7CiAKLSAgICAgICAgLy8gc2VyaWFsIG51bWJlciBzaG91bGQgZm9sbG93ICJob3N0OiIKLSAgICAgICAgc2VyaWFsX2VuZCA9IHN0cmNocihzZXJ2aWNlLCAnOicpOworICAgICAgICAvLyBzZXJpYWwgbnVtYmVyIHNob3VsZCBmb2xsb3cgImhvc3Q6IiBhbmQgY291bGQgYmUgYSBob3N0OnBvcnQgc3RyaW5nLgorICAgICAgICBzZXJpYWxfZW5kID0gc2tpcF9ob3N0X3NlcmlhbChzZXJ2aWNlKTsKICAgICAgICAgaWYgKHNlcmlhbF9lbmQpIHsKICAgICAgICAgICAgICpzZXJpYWxfZW5kID0gMDsgLy8gdGVybWluYXRlIHN0cmluZwogICAgICAgICAgICAgc2VyaWFsID0gc2VydmljZTsKQEAgLTc2MSw4ICs4MDcsNyBAQAogewogICAgIEQoIkNyZWF0aW5nIHNtYXJ0IHNvY2tldCBcbiIpOwogICAgIGFzb2NrZXQgKnMgPSBjYWxsb2MoMSwgc2l6ZW9mKGFzb2NrZXQpKTsKLSAgICBpZihzID09IDApIGZhdGFsKCJjYW5ub3QgYWxsb2NhdGUgc29ja2V0Iik7Ci0gICAgcy0+aWQgPSAwOworICAgIGlmIChzID09IE5VTEwpIGZhdGFsKCJjYW5ub3QgYWxsb2NhdGUgc29ja2V0Iik7CiAgICAgcy0+ZW5xdWV1ZSA9IHNtYXJ0X3NvY2tldF9lbnF1ZXVlOwogICAgIHMtPnJlYWR5ID0gc21hcnRfc29ja2V0X3JlYWR5OwogICAgIHMtPmNsb3NlID0gc21hcnRfc29ja2V0X2Nsb3NlOwpkaWZmIC0tZ2l0IGEvYWRiL3N5c2RlcHMuaCBiL2FkYi9zeXNkZXBzLmgKaW5kZXggNjM3MjY0OS4uYjUxODA3NiAxMDA2NDQKLS0tIGEvYWRiL3N5c2RlcHMuaAorKysgYi9hZGIvc3lzZGVwcy5oCkBAIC00NCw2ICs0NCw3IEBACiAjZGVmaW5lICBBREJfTVVURVhfREVGSU5FKHgpICAgICBhZGJfbXV0ZXhfdCAgIHgKIAogLyogZGVjbGFyZSBhbGwgbXV0ZXhlcyAqLworLyogRm9yIHdpbjMyLCBhZGJfc3lzZGVwc19pbml0KCkgd2lsbCBkbyB0aGUgbXV0ZXggcnVudGltZSBpbml0aWFsaXphdGlvbi4gKi8KICNkZWZpbmUgIEFEQl9NVVRFWCh4KSAgIGV4dGVybiBhZGJfbXV0ZXhfdCAgeDsKICNpbmNsdWRlICJtdXRleF9saXN0LmgiCiAKQEAgLTE5NSw2ICsxOTYsOCBAQAogICAgIGZkZXZlbnQgKnByZXY7CiAKICAgICBpbnQgZmQ7CisgICAgaW50IGZvcmNlX2VvZjsKKwogICAgIHVuc2lnbmVkIHNob3J0IHN0YXRlOwogICAgIHVuc2lnbmVkIHNob3J0IGV2ZW50czsKIApAQCAtMjc0LDEzICsyNzcsMTQgQEAKICNkZWZpbmUgT1NfUEFUSF9TRVBBUkFUT1JfU1RSICIvIgogCiB0eXBlZGVmICBwdGhyZWFkX211dGV4X3QgICAgICAgICAgYWRiX211dGV4X3Q7CisKICNkZWZpbmUgIEFEQl9NVVRFWF9JTklUSUFMSVpFUiAgICBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCiAjZGVmaW5lICBhZGJfbXV0ZXhfaW5pdCAgICAgICAgICAgcHRocmVhZF9tdXRleF9pbml0CiAjZGVmaW5lICBhZGJfbXV0ZXhfbG9jayAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrCiAjZGVmaW5lICBhZGJfbXV0ZXhfdW5sb2NrICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2sKICNkZWZpbmUgIGFkYl9tdXRleF9kZXN0cm95ICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3kKIAotI2RlZmluZSAgQURCX01VVEVYX0RFRklORShtKSAgICAgIHN0YXRpYyBhZGJfbXV0ZXhfdCAgIG0gPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisjZGVmaW5lICBBREJfTVVURVhfREVGSU5FKG0pICAgICAgYWRiX211dGV4X3QgICBtID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgogCiAjZGVmaW5lICBhZGJfY29uZF90ICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3QKICNkZWZpbmUgIGFkYl9jb25kX2luaXQgICAgICAgICAgICBwdGhyZWFkX2NvbmRfaW5pdApAQCAtMjg5LDYgKzI5MywxMCBAQAogI2RlZmluZSAgYWRiX2NvbmRfc2lnbmFsICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwKICNkZWZpbmUgIGFkYl9jb25kX2Rlc3Ryb3kgICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveQogCisvKiBkZWNsYXJlIGFsbCBtdXRleGVzICovCisjZGVmaW5lICBBREJfTVVURVgoeCkgICBleHRlcm4gYWRiX211dGV4X3QgIHg7CisjaW5jbHVkZSAibXV0ZXhfbGlzdC5oIgorCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkICBjbG9zZV9vbl9leGVjKGludCAgZmQpCiB7CiAgICAgZmNudGwoIGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDICk7CkBAIC0zODcsNyArMzk1LDEzIEBACiAKIHN0YXRpYyBfX2lubGluZV9fIGludCAgYWRiX3NvY2tldF9hY2NlcHQoaW50ICBzZXJ2ZXJmZCwgc3RydWN0IHNvY2thZGRyKiAgYWRkciwgc29ja2xlbl90ICAqYWRkcmxlbikKIHsKLSAgICByZXR1cm4gIGFjY2VwdCggc2VydmVyZmQsIGFkZHIsIGFkZHJsZW4gKTsKKyAgICBpbnQgZmQ7CisKKyAgICBmZCA9IGFjY2VwdChzZXJ2ZXJmZCwgYWRkciwgYWRkcmxlbik7CisgICAgaWYgKGZkID49IDApCisgICAgICAgIGNsb3NlX29uX2V4ZWMoZmQpOworCisgICAgcmV0dXJuIGZkOwogfQogCiAjdW5kZWYgICBhY2NlcHQKZGlmZiAtLWdpdCBhL2FkYi90cmFuc3BvcnQuYyBiL2FkYi90cmFuc3BvcnQuYwppbmRleCA2MmJkZmRiLi44M2EzNDlhIDEwMDY0NAotLS0gYS9hZGIvdHJhbnNwb3J0LmMKKysrIGIvYWRiL3RyYW5zcG9ydC5jCkBAIC0zNSwyNCArMzUsMzAgQEAKIEFEQl9NVVRFWF9ERUZJTkUoIHRyYW5zcG9ydF9sb2NrICk7CiAKICNpZiBBREJfVFJBQ0UKKyNkZWZpbmUgTUFYX0RVTVBfSEVYX0xFTiAxNgogc3RhdGljIHZvaWQgIGR1bXBfaGV4KCBjb25zdCB1bnNpZ25lZCBjaGFyKiAgcHRyLCBzaXplX3QgIGxlbiApCiB7CiAgICAgaW50ICBubiwgbGVuMiA9IGxlbjsKKyAgICAvLyBCdWlsZCBhIHN0cmluZyBpbnN0ZWFkIG9mIGxvZ2dpbmcgZWFjaCBjaGFyYWN0ZXIuCisgICAgLy8gTUFYIGNoYXJzIGluIDIgZGlnaXQgaGV4LCBvbmUgc3BhY2UsIE1BWCBjaGFycywgb25lICdcMCcuCisgICAgY2hhciBidWZmZXJbTUFYX0RVTVBfSEVYX0xFTiAqMiArIDEgKyBNQVhfRFVNUF9IRVhfTEVOICsgMSBdLCAqcGIgPSBidWZmZXI7CiAKLSAgICBpZiAobGVuMiA+IDE2KSBsZW4yID0gMTY7CisgICAgaWYgKGxlbjIgPiBNQVhfRFVNUF9IRVhfTEVOKSBsZW4yID0gTUFYX0RVTVBfSEVYX0xFTjsKIAotICAgIGZvciAobm4gPSAwOyBubiA8IGxlbjI7IG5uKyspCi0gICAgICAgIEQoIiUwMngiLCBwdHJbbm5dKTsKLSAgICBEKCIgICIpOworICAgIGZvciAobm4gPSAwOyBubiA8IGxlbjI7IG5uKyspIHsKKyAgICAgICAgc3ByaW50ZihwYiwgIiUwMngiLCBwdHJbbm5dKTsKKyAgICAgICAgcGIgKz0gMjsKKyAgICB9CisgICAgc3ByaW50ZihwYisrLCAiICIpOwogCiAgICAgZm9yIChubiA9IDA7IG5uIDwgbGVuMjsgbm4rKykgewogICAgICAgICBpbnQgIGMgPSBwdHJbbm5dOwogICAgICAgICBpZiAoYyA8IDMyIHx8IGMgPiAxMjcpCiAgICAgICAgICAgICBjID0gJy4nOwotICAgICAgICBEKCIlYyIsIGMpOworICAgICAgICAqcGIrKyA9ICBjOwogICAgIH0KLSAgICBEKCJcbiIpOwotICAgIGZmbHVzaChzdGRvdXQpOworICAgICpwYisrID0gJ1wwJzsKKyAgICBEUigiJXNcbiIsIGJ1ZmZlcik7CiB9CiAjZW5kaWYKIApAQCAtNzksNyArODUsNyBAQAogewogICAgIGFkaXNjb25uZWN0KiAgZGlzID0gdC0+ZGlzY29ubmVjdHMubmV4dDsKIAotICAgIEQoInJ1bl90cmFuc3BvcnRfZGlzY29ubmVjdHM6ICVwICglcylcbiIsIHQsIHQtPnNlcmlhbCA/IHQtPnNlcmlhbCA6ICJ1bmtub3duIiApOworICAgIEQoIiVzOiBydW5fdHJhbnNwb3J0X2Rpc2Nvbm5lY3RzXG4iLCB0LT5zZXJpYWwpOwogICAgIHdoaWxlIChkaXMgIT0gJnQtPmRpc2Nvbm5lY3RzKSB7CiAgICAgICAgIGFkaXNjb25uZWN0KiAgbmV4dCA9IGRpcy0+bmV4dDsKICAgICAgICAgZGlzLT5mdW5jKCBkaXMtPm9wYXF1ZSwgdCApOwpAQCAtODcsNzUgKzkzLDkxIEBACiAgICAgfQogfQogCisjaWYgQURCX1RSQUNFCitzdGF0aWMgdm9pZAorZHVtcF9wYWNrZXQoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZnVuYywgYXBhY2tldCogcCkKK3sKKyAgICB1bnNpZ25lZCAgY29tbWFuZCA9IHAtPm1zZy5jb21tYW5kOworICAgIGludCAgICAgICBsZW4gICAgID0gcC0+bXNnLmRhdGFfbGVuZ3RoOworICAgIGNoYXIgICAgICBjbWRbOV07CisgICAgY2hhciAgICAgIGFyZzBbMTJdLCBhcmcxWzEyXTsKKyAgICBpbnQgICAgICAgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKKyAgICAgICAgaW50ICBiID0gKGNvbW1hbmQgPj4gKG4qOCkpICYgMjU1OworICAgICAgICBpZiAoYiA8IDMyIHx8IGIgPj0gMTI3KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNtZFtuXSA9IChjaGFyKWI7CisgICAgfQorICAgIGlmIChuID09IDQpIHsKKyAgICAgICAgY21kWzRdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGVyZSBpcyBzb21lIG5vbi1BU0NJSSBuYW1lIGluIHRoZSBjb21tYW5kLCBzbyBkdW1wCisgICAgICAgICAgICAqIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZSBpbnN0ZWFkICovCisgICAgICAgIHNucHJpbnRmKGNtZCwgc2l6ZW9mIGNtZCwgIiUwOHgiLCBjb21tYW5kKTsKKyAgICB9CisKKyAgICBpZiAocC0+bXNnLmFyZzAgPCAyNTZVKQorICAgICAgICBzbnByaW50ZihhcmcwLCBzaXplb2YgYXJnMCwgIiVkIiwgcC0+bXNnLmFyZzApOworICAgIGVsc2UKKyAgICAgICAgc25wcmludGYoYXJnMCwgc2l6ZW9mIGFyZzAsICIweCV4IiwgcC0+bXNnLmFyZzApOworCisgICAgaWYgKHAtPm1zZy5hcmcxIDwgMjU2VSkKKyAgICAgICAgc25wcmludGYoYXJnMSwgc2l6ZW9mIGFyZzEsICIlZCIsIHAtPm1zZy5hcmcxKTsKKyAgICBlbHNlCisgICAgICAgIHNucHJpbnRmKGFyZzEsIHNpemVvZiBhcmcxLCAiMHgleCIsIHAtPm1zZy5hcmcxKTsKKworICAgIEQoIiVzOiAlczogWyVzXSBhcmcwPSVzIGFyZzE9JXMgKGxlbj0lZCkgIiwKKyAgICAgICAgbmFtZSwgZnVuYywgY21kLCBhcmcwLCBhcmcxLCBsZW4pOworICAgIGR1bXBfaGV4KHAtPmRhdGEsIGxlbik7Cit9CisjZW5kaWYgLyogQURCX1RSQUNFICovCisKIHN0YXRpYyBpbnQKLXJlYWRfcGFja2V0KGludCAgZmQsIGFwYWNrZXQqKiBwcGFja2V0KQorcmVhZF9wYWNrZXQoaW50ICBmZCwgY29uc3QgY2hhciogbmFtZSwgYXBhY2tldCoqIHBwYWNrZXQpCiB7CiAgICAgY2hhciAqcCA9IChjaGFyKilwcGFja2V0OyAgLyogcmVhbGx5IHJlYWQgYSBwYWNrZXQgYWRkcmVzcyAqLwogICAgIGludCAgIHI7CiAgICAgaW50ICAgbGVuID0gc2l6ZW9mKCpwcGFja2V0KTsKKyAgICBjaGFyICBidWZmWzhdOworICAgIGlmICghbmFtZSkgeworICAgICAgICBzbnByaW50ZihidWZmLCBzaXplb2YgYnVmZiwgImZkPSVkIiwgZmQpOworICAgICAgICBuYW1lID0gYnVmZjsKKyAgICB9CiAgICAgd2hpbGUobGVuID4gMCkgewogICAgICAgICByID0gYWRiX3JlYWQoZmQsIHAsIGxlbik7CiAgICAgICAgIGlmKHIgPiAwKSB7CiAgICAgICAgICAgICBsZW4gLT0gcjsKICAgICAgICAgICAgIHAgICArPSByOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRCgicmVhZF9wYWNrZXQ6ICVkIGVycm9yICVkICVkXG4iLCBmZCwgciwgZXJybm8pOworICAgICAgICAgICAgRCgiJXM6IHJlYWRfcGFja2V0IChmZD0lZCksIGVycm9yIHJldD0lZCBlcnJubz0lZDogJXNcbiIsIG5hbWUsIGZkLCByLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIGlmKChyIDwgMCkgJiYgKGVycm5vID09IEVJTlRSKSkgY29udGludWU7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAKICNpZiBBREJfVFJBQ0UKLSAgICBpZiAoQURCX1RSQUNJTkcpCi0gICAgewotICAgICAgICB1bnNpZ25lZCAgY29tbWFuZCA9ICgqcHBhY2tldCktPm1zZy5jb21tYW5kOwotICAgICAgICBpbnQgICAgICAgbGVuICAgICA9ICgqcHBhY2tldCktPm1zZy5kYXRhX2xlbmd0aDsKLSAgICAgICAgY2hhciAgICAgIGNtZFs1XTsKLSAgICAgICAgaW50ICAgICAgIG47Ci0KLSAgICAgICAgZm9yIChuID0gMDsgbiA8IDQ7IG4rKykgewotICAgICAgICAgICAgaW50ICBiID0gKGNvbW1hbmQgPj4gKG4qOCkpICYgMjU1OwotICAgICAgICAgICAgaWYgKGIgPj0gMzIgJiYgYiA8IDEyNykKLSAgICAgICAgICAgICAgICBjbWRbbl0gPSAoY2hhciliOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNtZFtuXSA9ICcuJzsKLSAgICAgICAgfQotICAgICAgICBjbWRbNF0gPSAwOwotCi0gICAgICAgIEQoInJlYWRfcGFja2V0OiAlZCBvazogWyUwOHggJXNdICUwOHggJTA4eCAoJWQpICIsCi0gICAgICAgICAgZmQsIGNvbW1hbmQsIGNtZCwgKCpwcGFja2V0KS0+bXNnLmFyZzAsICgqcHBhY2tldCktPm1zZy5hcmcxLCBsZW4pOwotICAgICAgICBkdW1wX2hleCgoKnBwYWNrZXQpLT5kYXRhLCBsZW4pOworICAgIGlmIChBREJfVFJBQ0lORykgeworICAgICAgICBkdW1wX3BhY2tldChuYW1lLCAiZnJvbSByZW1vdGUiLCAqcHBhY2tldCk7CiAgICAgfQogI2VuZGlmCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXdyaXRlX3BhY2tldChpbnQgIGZkLCBhcGFja2V0KiogcHBhY2tldCkKK3dyaXRlX3BhY2tldChpbnQgIGZkLCBjb25zdCBjaGFyKiBuYW1lLCBhcGFja2V0KiogcHBhY2tldCkKIHsKICAgICBjaGFyICpwID0gKGNoYXIqKSBwcGFja2V0OyAgLyogd2UgcmVhbGx5IHdyaXRlIHRoZSBwYWNrZXQgYWRkcmVzcyAqLwogICAgIGludCByLCBsZW4gPSBzaXplb2YocHBhY2tldCk7CisgICAgY2hhciBidWZmWzhdOworICAgIGlmICghbmFtZSkgeworICAgICAgICBzbnByaW50ZihidWZmLCBzaXplb2YgYnVmZiwgImZkPSVkIiwgZmQpOworICAgICAgICBuYW1lID0gYnVmZjsKKyAgICB9CiAKICNpZiBBREJfVFJBQ0UKLSAgICBpZiAoQURCX1RSQUNJTkcpCi0gICAgewotICAgICAgICB1bnNpZ25lZCAgY29tbWFuZCA9ICgqcHBhY2tldCktPm1zZy5jb21tYW5kOwotICAgICAgICBpbnQgICAgICAgbGVuICAgICA9ICgqcHBhY2tldCktPm1zZy5kYXRhX2xlbmd0aDsKLSAgICAgICAgY2hhciAgICAgIGNtZFs1XTsKLSAgICAgICAgaW50ICAgICAgIG47Ci0KLSAgICAgICAgZm9yIChuID0gMDsgbiA8IDQ7IG4rKykgewotICAgICAgICAgICAgaW50ICBiID0gKGNvbW1hbmQgPj4gKG4qOCkpICYgMjU1OwotICAgICAgICAgICAgaWYgKGIgPj0gMzIgJiYgYiA8IDEyNykKLSAgICAgICAgICAgICAgICBjbWRbbl0gPSAoY2hhciliOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNtZFtuXSA9ICcuJzsKLSAgICAgICAgfQotICAgICAgICBjbWRbNF0gPSAwOwotCi0gICAgICAgIEQoIndyaXRlX3BhY2tldDogJWQgWyUwOHggJXNdICUwOHggJTA4eCAoJWQpICIsCi0gICAgICAgICAgZmQsIGNvbW1hbmQsIGNtZCwgKCpwcGFja2V0KS0+bXNnLmFyZzAsICgqcHBhY2tldCktPm1zZy5hcmcxLCBsZW4pOwotICAgICAgICBkdW1wX2hleCgoKnBwYWNrZXQpLT5kYXRhLCBsZW4pOworICAgIGlmIChBREJfVFJBQ0lORykgeworICAgICAgICBkdW1wX3BhY2tldChuYW1lLCAidG8gcmVtb3RlIiwgKnBwYWNrZXQpOwogICAgIH0KICNlbmRpZgogICAgIGxlbiA9IHNpemVvZihwcGFja2V0KTsKQEAgLTE2NSw3ICsxODcsNyBAQAogICAgICAgICAgICAgbGVuIC09IHI7CiAgICAgICAgICAgICBwICs9IHI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEKCJ3cml0ZV9wYWNrZXQ6ICVkIGVycm9yICVkICVkXG4iLCBmZCwgciwgZXJybm8pOworICAgICAgICAgICAgRCgiJXM6IHdyaXRlX3BhY2tldCAoZmQ9JWQpIGVycm9yIHJldD0lZCBlcnJubz0lZDogJXNcbiIsIG5hbWUsIGZkLCByLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIGlmKChyIDwgMCkgJiYgKGVycm5vID09IEVJTlRSKSkgY29udGludWU7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTE3NSwxMCArMTk3LDEyIEBACiAKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9zb2NrZXRfZXZlbnRzKGludCBmZCwgdW5zaWduZWQgZXZlbnRzLCB2b2lkICpfdCkKIHsKKyAgICBhdHJhbnNwb3J0ICp0ID0gX3Q7CisgICAgRCgidHJhbnNwb3J0X3NvY2tldF9ldmVudHMoZmQ9JWQsIGV2ZW50cz0lMDR4LC4uLilcbiIsIGZkLCBldmVudHMpOwogICAgIGlmKGV2ZW50cyAmIEZERV9SRUFEKXsKICAgICAgICAgYXBhY2tldCAqcCA9IDA7Ci0gICAgICAgIGlmKHJlYWRfcGFja2V0KGZkLCAmcCkpewotICAgICAgICAgICAgRCgiZmFpbGVkIHRvIHJlYWQgcGFja2V0IGZyb20gdHJhbnNwb3J0IHNvY2tldCBvbiBmZCAlZFxuIiwgZmQpOworICAgICAgICBpZihyZWFkX3BhY2tldChmZCwgdC0+c2VyaWFsLCAmcCkpeworICAgICAgICAgICAgRCgiJXM6IGZhaWxlZCB0byByZWFkIHBhY2tldCBmcm9tIHRyYW5zcG9ydCBzb2NrZXQgb24gZmQgJWRcbiIsIHQtPnNlcmlhbCwgZmQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaGFuZGxlX3BhY2tldChwLCAoYXRyYW5zcG9ydCAqKSBfdCk7CiAgICAgICAgIH0KQEAgLTIwNCwxMSArMjI4LDEzIEBACiAgICAgcHJpbnRfcGFja2V0KCJzZW5kIiwgcCk7CiAKICAgICBpZiAodCA9PSBOVUxMKSB7Ci0gICAgICAgIGZhdGFsX2Vycm5vKCJUcmFuc3BvcnQgaXMgbnVsbCIpOwogICAgICAgICBEKCJUcmFuc3BvcnQgaXMgbnVsbCBcbiIpOworICAgICAgICAvLyBaYXAgZXJybm8gYmVjYXVzZSBwcmludF9wYWNrZXQoKSBhbmQgb3RoZXIgc3R1ZmYgaGF2ZSBlcnJubyBlZmZlY3QuCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgZmF0YWxfZXJybm8oIlRyYW5zcG9ydCBpcyBudWxsIik7CiAgICAgfQogCi0gICAgaWYod3JpdGVfcGFja2V0KHQtPnRyYW5zcG9ydF9zb2NrZXQsICZwKSl7CisgICAgaWYod3JpdGVfcGFja2V0KHQtPnRyYW5zcG9ydF9zb2NrZXQsIHQtPnNlcmlhbCwgJnApKXsKICAgICAgICAgZmF0YWxfZXJybm8oImNhbm5vdCBlbnF1ZXVlIHBhY2tldCBvbiB0cmFuc3BvcnQgc29ja2V0Iik7CiAgICAgfQogfQpAQCAtMjMxLDUyICsyNTcsNTEgQEAKICAgICBhdHJhbnNwb3J0ICp0ID0gX3Q7CiAgICAgYXBhY2tldCAqcDsKIAotICAgIEQoImZyb21fcmVtb3RlOiBzdGFydGluZyB0aHJlYWQgZm9yIHRyYW5zcG9ydCAlcCwgb24gZmQgJWRcbiIsIHQsIHQtPmZkICk7Ci0KLSAgICBEKCJmcm9tX3JlbW90ZTogdHJhbnNwb3J0ICVwIFNZTkMgb25saW5lICglZClcbiIsIHQsIHQtPnN5bmNfdG9rZW4gKyAxKTsKKyAgICBEKCIlczogc3RhcnRpbmcgdHJhbnNwb3J0IG91dHB1dCB0aHJlYWQgb24gZmQgJWQsIFNZTkMgb25saW5lICglZClcbiIsCisgICAgICAgdC0+c2VyaWFsLCB0LT5mZCwgdC0+c3luY190b2tlbiArIDEpOwogICAgIHAgPSBnZXRfYXBhY2tldCgpOwogICAgIHAtPm1zZy5jb21tYW5kID0gQV9TWU5DOwogICAgIHAtPm1zZy5hcmcwID0gMTsKICAgICBwLT5tc2cuYXJnMSA9ICsrKHQtPnN5bmNfdG9rZW4pOwogICAgIHAtPm1zZy5tYWdpYyA9IEFfU1lOQyBeIDB4ZmZmZmZmZmY7Ci0gICAgaWYod3JpdGVfcGFja2V0KHQtPmZkLCAmcCkpIHsKKyAgICBpZih3cml0ZV9wYWNrZXQodC0+ZmQsIHQtPnNlcmlhbCwgJnApKSB7CiAgICAgICAgIHB1dF9hcGFja2V0KHApOwotICAgICAgICBEKCJmcm9tX3JlbW90ZTogZmFpbGVkIHRvIHdyaXRlIFNZTkMgYXBhY2tldCB0byB0cmFuc3BvcnQgJXAiLCB0KTsKKyAgICAgICAgRCgiJXM6IGZhaWxlZCB0byB3cml0ZSBTWU5DIHBhY2tldFxuIiwgdC0+c2VyaWFsKTsKICAgICAgICAgZ290byBvb3BzOwogICAgIH0KIAotICAgIEQoImZyb21fcmVtb3RlOiBkYXRhIHB1bXAgIGZvciB0cmFuc3BvcnQgJXBcbiIsIHQpOworICAgIEQoIiVzOiBkYXRhIHB1bXAgc3RhcnRlZFxuIiwgdC0+c2VyaWFsKTsKICAgICBmb3IoOzspIHsKICAgICAgICAgcCA9IGdldF9hcGFja2V0KCk7CiAKICAgICAgICAgaWYodC0+cmVhZF9mcm9tX3JlbW90ZShwLCB0KSA9PSAwKXsKLSAgICAgICAgICAgIEQoImZyb21fcmVtb3RlOiByZWNlaXZlZCByZW1vdGUgcGFja2V0LCBzZW5kaW5nIHRvIHRyYW5zcG9ydCAlcFxuIiwKLSAgICAgICAgICAgICAgdCk7Ci0gICAgICAgICAgICBpZih3cml0ZV9wYWNrZXQodC0+ZmQsICZwKSl7CisgICAgICAgICAgICBEKCIlczogcmVjZWl2ZWQgcmVtb3RlIHBhY2tldCwgc2VuZGluZyB0byB0cmFuc3BvcnRcbiIsCisgICAgICAgICAgICAgIHQtPnNlcmlhbCk7CisgICAgICAgICAgICBpZih3cml0ZV9wYWNrZXQodC0+ZmQsIHQtPnNlcmlhbCwgJnApKXsKICAgICAgICAgICAgICAgICBwdXRfYXBhY2tldChwKTsKLSAgICAgICAgICAgICAgICBEKCJmcm9tX3JlbW90ZTogZmFpbGVkIHRvIHdyaXRlIGFwYWNrZXQgdG8gdHJhbnNwb3J0ICVwIiwgdCk7CisgICAgICAgICAgICAgICAgRCgiJXM6IGZhaWxlZCB0byB3cml0ZSBhcGFja2V0IHRvIHRyYW5zcG9ydFxuIiwgdC0+c2VyaWFsKTsKICAgICAgICAgICAgICAgICBnb3RvIG9vcHM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEKCJmcm9tX3JlbW90ZTogcmVtb3RlIHJlYWQgZmFpbGVkIGZvciB0cmFuc3BvcnQgJXBcbiIsIHApOworICAgICAgICAgICAgRCgiJXM6IHJlbW90ZSByZWFkIGZhaWxlZCBmb3IgdHJhbnNwb3J0XG4iLCB0LT5zZXJpYWwpOwogICAgICAgICAgICAgcHV0X2FwYWNrZXQocCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIEQoImZyb21fcmVtb3RlOiBTWU5DIG9mZmxpbmUgZm9yIHRyYW5zcG9ydCAlcFxuIiwgdCk7CisgICAgRCgiJXM6IFNZTkMgb2ZmbGluZSBmb3IgdHJhbnNwb3J0XG4iLCB0LT5zZXJpYWwpOwogICAgIHAgPSBnZXRfYXBhY2tldCgpOwogICAgIHAtPm1zZy5jb21tYW5kID0gQV9TWU5DOwogICAgIHAtPm1zZy5hcmcwID0gMDsKICAgICBwLT5tc2cuYXJnMSA9IDA7CiAgICAgcC0+bXNnLm1hZ2ljID0gQV9TWU5DIF4gMHhmZmZmZmZmZjsKLSAgICBpZih3cml0ZV9wYWNrZXQodC0+ZmQsICZwKSkgeworICAgIGlmKHdyaXRlX3BhY2tldCh0LT5mZCwgdC0+c2VyaWFsLCAmcCkpIHsKICAgICAgICAgcHV0X2FwYWNrZXQocCk7Ci0gICAgICAgIEQoImZyb21fcmVtb3RlOiBmYWlsZWQgdG8gd3JpdGUgU1lOQyBhcGFja2V0IHRvIHRyYW5zcG9ydCAlcCIsIHQpOworICAgICAgICBEKCIlczogZmFpbGVkIHRvIHdyaXRlIFNZTkMgYXBhY2tldCB0byB0cmFuc3BvcnQiLCB0LT5zZXJpYWwpOwogICAgIH0KIAogb29wczoKLSAgICBEKCJmcm9tX3JlbW90ZTogdGhyZWFkIGlzIGV4aXRpbmcgZm9yIHRyYW5zcG9ydCAlcFxuIiwgdCk7CisgICAgRCgiJXM6IHRyYW5zcG9ydCBvdXRwdXQgdGhyZWFkIGlzIGV4aXRpbmdcbiIsIHQtPnNlcmlhbCk7CiAgICAga2lja190cmFuc3BvcnQodCk7CiAgICAgdHJhbnNwb3J0X3VucmVmKHQpOwogICAgIHJldHVybiAwOwpAQCAtMjg4LDM1ICszMTMsMzUgQEAKICAgICBhcGFja2V0ICpwOwogICAgIGludCBhY3RpdmUgPSAwOwogCi0gICAgRCgidG9fcmVtb3RlOiBzdGFydGluZyBpbnB1dF90aHJlYWQgZm9yICVwLCByZWFkaW5nIGZyb20gZmQgJWRcbiIsCi0gICAgICAgdCwgdC0+ZmQpOworICAgIEQoIiVzOiBzdGFydGluZyB0cmFuc3BvcnQgaW5wdXQgdGhyZWFkLCByZWFkaW5nIGZyb20gZmQgJWRcbiIsCisgICAgICAgdC0+c2VyaWFsLCB0LT5mZCk7CiAKICAgICBmb3IoOzspewotICAgICAgICBpZihyZWFkX3BhY2tldCh0LT5mZCwgJnApKSB7Ci0gICAgICAgICAgICBEKCJ0b19yZW1vdGU6IGZhaWxlZCB0byByZWFkIGFwYWNrZXQgZnJvbSB0cmFuc3BvcnQgJXAgb24gZmQgJWRcbiIsIAotICAgICAgICAgICAgICAgdCwgdC0+ZmQgKTsKKyAgICAgICAgaWYocmVhZF9wYWNrZXQodC0+ZmQsIHQtPnNlcmlhbCwgJnApKSB7CisgICAgICAgICAgICBEKCIlczogZmFpbGVkIHRvIHJlYWQgYXBhY2tldCBmcm9tIHRyYW5zcG9ydCBvbiBmZCAlZFxuIiwKKyAgICAgICAgICAgICAgIHQtPnNlcmlhbCwgdC0+ZmQgKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmKHAtPm1zZy5jb21tYW5kID09IEFfU1lOQyl7CiAgICAgICAgICAgICBpZihwLT5tc2cuYXJnMCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgRCgidG9fcmVtb3RlOiB0cmFuc3BvcnQgJXAgU1lOQyBvZmZsaW5lXG4iLCB0KTsKKyAgICAgICAgICAgICAgICBEKCIlczogdHJhbnNwb3J0IFNZTkMgb2ZmbGluZVxuIiwgdC0+c2VyaWFsKTsKICAgICAgICAgICAgICAgICBwdXRfYXBhY2tldChwKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYocC0+bXNnLmFyZzEgPT0gdC0+c3luY190b2tlbikgewotICAgICAgICAgICAgICAgICAgICBEKCJ0b19yZW1vdGU6IHRyYW5zcG9ydCAlcCBTWU5DIG9ubGluZVxuIiwgdCk7CisgICAgICAgICAgICAgICAgICAgIEQoIiVzOiB0cmFuc3BvcnQgU1lOQyBvbmxpbmVcbiIsIHQtPnNlcmlhbCk7CiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRCgidG9fcmVtb3RlOiB0cmFuZHBvcnQgJXAgaWdub3JpbmcgU1lOQyAlZCAhPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICB0LCBwLT5tc2cuYXJnMSwgdC0+c3luY190b2tlbik7CisgICAgICAgICAgICAgICAgICAgIEQoIiVzOiB0cmFuc3BvcnQgaWdub3JpbmcgU1lOQyAlZCAhPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICB0LT5zZXJpYWwsIHAtPm1zZy5hcmcxLCB0LT5zeW5jX3Rva2VuKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZihhY3RpdmUpIHsKLSAgICAgICAgICAgICAgICBEKCJ0b19yZW1vdGU6IHRyYW5zcG9ydCAlcCBnb3QgcGFja2V0LCBzZW5kaW5nIHRvIHJlbW90ZVxuIiwgdCk7CisgICAgICAgICAgICAgICAgRCgiJXM6IHRyYW5zcG9ydCBnb3QgcGFja2V0LCBzZW5kaW5nIHRvIHJlbW90ZVxuIiwgdC0+c2VyaWFsKTsKICAgICAgICAgICAgICAgICB0LT53cml0ZV90b19yZW1vdGUocCwgdCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEQoInRvX3JlbW90ZTogdHJhbnNwb3J0ICVwIGlnbm9yaW5nIHBhY2tldCB3aGlsZSBvZmZsaW5lXG4iLCB0KTsKKyAgICAgICAgICAgICAgICBEKCIlczogdHJhbnNwb3J0IGlnbm9yaW5nIHBhY2tldCB3aGlsZSBvZmZsaW5lXG4iLCB0LT5zZXJpYWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMyNyw3ICszNTIsNyBAQAogICAgIC8vIHdoaWxlIGEgY2xpZW50IHNvY2tldCBpcyBzdGlsbCBhY3RpdmUuCiAgICAgY2xvc2VfYWxsX3NvY2tldHModCk7CiAKLSAgICBEKCJ0b19yZW1vdGU6IHRocmVhZCBpcyBleGl0aW5nIGZvciB0cmFuc3BvcnQgJXAsIGZkICVkXG4iLCB0LCB0LT5mZCk7CisgICAgRCgiJXM6IHRyYW5zcG9ydCBpbnB1dCB0aHJlYWQgaXMgZXhpdGluZywgZmQgJWRcbiIsIHQtPnNlcmlhbCwgdC0+ZmQpOwogICAgIGtpY2tfdHJhbnNwb3J0KHQpOwogICAgIHRyYW5zcG9ydF91bnJlZih0KTsKICAgICByZXR1cm4gMDsKQEAgLTUwOCw3ICs1MzMsNyBAQAogICAgICAgICAgICAgcCAgICs9IHI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZigociA8IDApICYmIChlcnJubyA9PSBFSU5UUikpIGNvbnRpbnVlOwotICAgICAgICAgICAgRCgidHJhbnNwb3J0X3JlYWRfYWN0aW9uOiBvbiBmZCAlZCwgZXJyb3IgJWQ6ICVzXG4iLCAKKyAgICAgICAgICAgIEQoInRyYW5zcG9ydF9yZWFkX2FjdGlvbjogb24gZmQgJWQsIGVycm9yICVkOiAlc1xuIiwKICAgICAgICAgICAgICAgZmQsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC01MzAsNyArNTU1LDcgQEAKICAgICAgICAgICAgIHAgICArPSByOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYoKHIgPCAwKSAmJiAoZXJybm8gPT0gRUlOVFIpKSBjb250aW51ZTsKLSAgICAgICAgICAgIEQoInRyYW5zcG9ydF93cml0ZV9hY3Rpb246IG9uIGZkICVkLCBlcnJvciAlZDogJXNcbiIsIAorICAgICAgICAgICAgRCgidHJhbnNwb3J0X3dyaXRlX2FjdGlvbjogb24gZmQgJWQsIGVycm9yICVkOiAlc1xuIiwKICAgICAgICAgICAgICAgZmQsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC01NTcsNyArNTgyLDcgQEAKICAgICB0ID0gbS50cmFuc3BvcnQ7CiAKICAgICBpZihtLmFjdGlvbiA9PSAwKXsKLSAgICAgICAgRCgidHJhbnNwb3J0OiAlcCByZW1vdmluZyBhbmQgZnJlZSdpbmcgJWRcbiIsIHQsIHQtPnRyYW5zcG9ydF9zb2NrZXQpOworICAgICAgICBEKCJ0cmFuc3BvcnQ6ICVzIHJlbW92aW5nIGFuZCBmcmVlJ2luZyAlZFxuIiwgdC0+c2VyaWFsLCB0LT50cmFuc3BvcnRfc29ja2V0KTsKIAogICAgICAgICAgICAgLyogSU1QT1JUQU5UOiB0aGUgcmVtb3ZlIGNsb3NlcyBvbmUgaGFsZiBvZiB0aGUKICAgICAgICAgICAgICoqIHNvY2tldCBwYWlyLiAgVGhlIGNsb3NlIGNsb3NlcyB0aGUgb3RoZXIgaGFsZi4KQEAgLTU5MywxMiArNjE4LDExIEBACiAgICAgICAgICAgICBmYXRhbF9lcnJubygiY2Fubm90IG9wZW4gdHJhbnNwb3J0IHNvY2tldHBhaXIiKTsKICAgICAgICAgfQogCi0gICAgICAgIEQoInRyYW5zcG9ydDogJXAgKCVkLCVkKSBzdGFydGluZ1xuIiwgdCwgc1swXSwgc1sxXSk7CisgICAgICAgIEQoInRyYW5zcG9ydDogJXMgKCVkLCVkKSBzdGFydGluZ1xuIiwgdC0+c2VyaWFsLCBzWzBdLCBzWzFdKTsKIAogICAgICAgICB0LT50cmFuc3BvcnRfc29ja2V0ID0gc1swXTsKICAgICAgICAgdC0+ZmQgPSBzWzFdOwogCi0gICAgICAgIEQoInRyYW5zcG9ydDogJXAgaW5zdGFsbCAlZFxuIiwgdCwgdC0+dHJhbnNwb3J0X3NvY2tldCApOwogICAgICAgICBmZGV2ZW50X2luc3RhbGwoJih0LT50cmFuc3BvcnRfZmRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnRyYW5zcG9ydF9zb2NrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfc29ja2V0X2V2ZW50cywKQEAgLTY1Myw3ICs2NzcsNyBAQAogICAgIHRtc2cgbTsKICAgICBtLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKICAgICBtLmFjdGlvbiA9IDE7Ci0gICAgRCgidHJhbnNwb3J0OiAlcCByZWdpc3RlcmVkXG4iLCB0cmFuc3BvcnQpOworICAgIEQoInRyYW5zcG9ydDogJXMgcmVnaXN0ZXJlZFxuIiwgdHJhbnNwb3J0LT5zZXJpYWwpOwogICAgIGlmKHRyYW5zcG9ydF93cml0ZV9hY3Rpb24odHJhbnNwb3J0X3JlZ2lzdHJhdGlvbl9zZW5kLCAmbSkpIHsKICAgICAgICAgZmF0YWxfZXJybm8oImNhbm5vdCB3cml0ZSB0cmFuc3BvcnQgcmVnaXN0cmF0aW9uIHNvY2tldFxuIik7CiAgICAgfQpAQCAtNjY0LDcgKzY4OCw3IEBACiAgICAgdG1zZyBtOwogICAgIG0udHJhbnNwb3J0ID0gdHJhbnNwb3J0OwogICAgIG0uYWN0aW9uID0gMDsKLSAgICBEKCJ0cmFuc3BvcnQ6ICVwIHJlbW92ZWRcbiIsIHRyYW5zcG9ydCk7CisgICAgRCgidHJhbnNwb3J0OiAlcyByZW1vdmVkXG4iLCB0cmFuc3BvcnQtPnNlcmlhbCk7CiAgICAgaWYodHJhbnNwb3J0X3dyaXRlX2FjdGlvbih0cmFuc3BvcnRfcmVnaXN0cmF0aW9uX3NlbmQsICZtKSkgewogICAgICAgICBmYXRhbF9lcnJubygiY2Fubm90IHdyaXRlIHRyYW5zcG9ydCByZWdpc3RyYXRpb24gc29ja2V0XG4iKTsKICAgICB9CkBAIC02NzQsMTUgKzY5OCwxNiBAQAogc3RhdGljIHZvaWQgdHJhbnNwb3J0X3VucmVmX2xvY2tlZChhdHJhbnNwb3J0ICp0KQogewogICAgIHQtPnJlZl9jb3VudC0tOwotICAgIEQoInRyYW5zcG9ydDogJXAgUi0gKHJlZj0lZClcbiIsIHQsIHQtPnJlZl9jb3VudCk7CiAgICAgaWYgKHQtPnJlZl9jb3VudCA9PSAwKSB7Ci0gICAgICAgIEQoInRyYW5zcG9ydDogJXAga2lja2luZyBhbmQgY2xvc2luZ1xuIiwgdCk7CisgICAgICAgIEQoInRyYW5zcG9ydDogJXMgdW5yZWYgKGtpY2tpbmcgYW5kIGNsb3NpbmcpXG4iLCB0LT5zZXJpYWwpOwogICAgICAgICBpZiAoIXQtPmtpY2tlZCkgewogICAgICAgICAgICAgdC0+a2lja2VkID0gMTsKICAgICAgICAgICAgIHQtPmtpY2sodCk7CiAgICAgICAgIH0KICAgICAgICAgdC0+Y2xvc2UodCk7CiAgICAgICAgIHJlbW92ZV90cmFuc3BvcnQodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRCgidHJhbnNwb3J0OiAlcyB1bnJlZiAoY291bnQ9JWQpXG4iLCB0LT5zZXJpYWwsIHQtPnJlZl9jb3VudCk7CiAgICAgfQogfQogCkBAIC04NTcsNyArODgyLDEzIEBACiB2b2lkIHJlZ2lzdGVyX3NvY2tldF90cmFuc3BvcnQoaW50IHMsIGNvbnN0IGNoYXIgKnNlcmlhbCwgaW50IHBvcnQsIGludCBsb2NhbCkKIHsKICAgICBhdHJhbnNwb3J0ICp0ID0gY2FsbG9jKDEsIHNpemVvZihhdHJhbnNwb3J0KSk7Ci0gICAgRCgidHJhbnNwb3J0OiAlcCBpbml0J2luZyBmb3Igc29ja2V0ICVkLCBvbiBwb3J0ICVkXG4iLCB0LCBzLCBwb3J0KTsKKyAgICBjaGFyIGJ1ZmZbMzJdOworCisgICAgaWYgKCFzZXJpYWwpIHsKKyAgICAgICAgc25wcmludGYoYnVmZiwgc2l6ZW9mIGJ1ZmYsICJULSVwIiwgdCk7CisgICAgICAgIHNlcmlhbCA9IGJ1ZmY7CisgICAgfQorICAgIEQoInRyYW5zcG9ydDogJXMgaW5pdCdpbmcgZm9yIHNvY2tldCAlZCwgb24gcG9ydCAlZFxuIiwgc2VyaWFsLCBzLCBwb3J0KTsKICAgICBpZiAoIGluaXRfc29ja2V0X3RyYW5zcG9ydCh0LCBzLCBwb3J0LCBsb2NhbCkgPCAwICkgewogICAgICAgICBhZGJfY2xvc2Uocyk7CiAgICAgICAgIGZyZWUodCk7CkBAIC05NjEsMjEgKzk5MiwyNiBAQAogI2lmIEFEQl9UUkFDRQogICAgIGludCAgbGVuMCA9IGxlbjsKICNlbmRpZgotICAgIEQoInJlYWR4OiAlZCAlcCAlZFxuIiwgZmQsIHB0ciwgKGludClsZW4pOworICAgIEQoInJlYWR4OiBmZD0lZCB3YW50ZWQ9JWRcbiIsIGZkLCAoaW50KWxlbik7CiAgICAgd2hpbGUobGVuID4gMCkgewogICAgICAgICByID0gYWRiX3JlYWQoZmQsIHAsIGxlbik7CiAgICAgICAgIGlmKHIgPiAwKSB7CiAgICAgICAgICAgICBsZW4gLT0gcjsKICAgICAgICAgICAgIHAgKz0gcjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEQoInJlYWR4OiAlZCAlZCAlc1xuIiwgZmQsIHIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBpZigociA8IDApICYmIChlcnJubyA9PSBFSU5UUikpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHIgPCAwKSB7CisgICAgICAgICAgICAgICAgRCgicmVhZHg6IGZkPSVkIGVycm9yICVkOiAlc1xuIiwgZmQsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEQoInJlYWR4OiBmZD0lZCBkaXNjb25uZWN0ZWRcbiIsIGZkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KIAogI2lmIEFEQl9UUkFDRQotICAgIEQoInJlYWR4OiAlZCBvazogIiwgZmQpOworICAgIEQoInJlYWR4OiBmZD0lZCB3YW50ZWQ9JWQgZ290PSVkXG4iLCBmZCwgbGVuMCwgbGVuMCAtIGxlbik7CiAgICAgZHVtcF9oZXgoIHB0ciwgbGVuMCApOwogI2VuZGlmCiAgICAgcmV0dXJuIDA7CkBAIC05ODcsNyArMTAyMyw3IEBACiAgICAgaW50IHI7CiAKICNpZiBBREJfVFJBQ0UKLSAgICBEKCJ3cml0ZXg6ICVkICVwICVkOiAiLCBmZCwgcHRyLCAoaW50KWxlbik7CisgICAgRCgid3JpdGV4OiBmZD0lZCBsZW49JWQ6ICIsIGZkLCAoaW50KWxlbik7CiAgICAgZHVtcF9oZXgoIHB0ciwgbGVuICk7CiAjZW5kaWYKICAgICB3aGlsZShsZW4gPiAwKSB7CkBAIC05OTYsMTMgKzEwMzIsMTYgQEAKICAgICAgICAgICAgIGxlbiAtPSByOwogICAgICAgICAgICAgcCArPSByOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRCgid3JpdGV4OiAlZCAlZCAlc1xuIiwgZmQsIHIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBpZigociA8IDApICYmIChlcnJubyA9PSBFSU5UUikpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHIgPCAwKSB7CisgICAgICAgICAgICAgICAgRCgid3JpdGV4OiBmZD0lZCBlcnJvciAlZDogJXNcbiIsIGZkLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBEKCJ3cml0ZXg6IGZkPSVkIGRpc2Nvbm5lY3RlZFxuIiwgZmQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQotCi0gICAgRCgid3JpdGV4OiAlZCBva1xuIiwgZmQpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xMDM5LDQgKzEwNzgsMyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2FkYi90cmFuc3BvcnQuaCBiL2FkYi90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJlMDUyCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fVFJBTlNQT1JUX0gKKyNkZWZpbmUgX19UUkFOU1BPUlRfSAorCisvKiBjb252ZW5pZW5jZSB3cmFwcGVycyBhcm91bmQgcmVhZC93cml0ZSB0aGF0IHdpbGwgcmV0cnkgb24KKyoqIEVJTlRSIGFuZC9vciBzaG9ydCByZWFkL3dyaXRlLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xCisqKiBvbiBlcnJvciBvciBFT0YuCisqLworaW50IHJlYWR4KGludCBmZCwgdm9pZCAqcHRyLCBzaXplX3QgbGVuKTsKK2ludCB3cml0ZXgoaW50IGZkLCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBsZW4pOworI2VuZGlmICAgLyogX19UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvYWRiL3RyYW5zcG9ydF9sb2NhbC5jIGIvYWRiL3RyYW5zcG9ydF9sb2NhbC5jCmluZGV4IDhkZmM5OGQuLjQ0MzFiYTcgMTAwNjQ0Ci0tLSBhL2FkYi90cmFuc3BvcnRfbG9jYWwuYworKysgYi9hZGIvdHJhbnNwb3J0X2xvY2FsLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgIFRSQUNFX1RBRyAgVFJBQ0VfVFJBTlNQT1JUCiAjaW5jbHVkZSAiYWRiLmgiCiAKLSNpZmRlZiBfX3BwY19fCisjaWZkZWYgSEFWRV9CSUdfRU5ESUFOCiAjZGVmaW5lIEg0KHgpCSgoKHgpICYgMHhGRjAwMDAwMCkgPj4gMjQpIHwgKCgoeCkgJiAweDAwRkYwMDAwKSA+PiA4KSB8ICgoKHgpICYgMHgwMDAwRkYwMCkgPDwgOCkgfCAoKCh4KSAmIDB4MDAwMDAwRkYpIDw8IDI0KQogc3RhdGljIGlubGluZSB2b2lkIGZpeF9lbmRpYW5zKGFwYWNrZXQgKnApCiB7CkBAIC02MSw3ICs2MSw3IEBACiAKICAgICBmaXhfZW5kaWFucyhwKTsKIAotI2lmIDAgJiYgZGVmaW5lZCBfX3BwY19fCisjaWYgMCAmJiBkZWZpbmVkIEhBVkVfQklHX0VORElBTgogICAgIEQoInJlYWQgcmVtb3RlIHBhY2tldDogJTA0eCBhcmcwPSUweCBhcmcxPSUweCBkYXRhX2xlbmd0aD0lMHggZGF0YV9jaGVjaz0lMHggbWFnaWM9JTB4XG4iLAogICAgICAgcC0+bXNnLmNvbW1hbmQsIHAtPm1zZy5hcmcwLCBwLT5tc2cuYXJnMSwgcC0+bXNnLmRhdGFfbGVuZ3RoLCBwLT5tc2cuZGF0YV9jaGVjaywgcC0+bXNnLm1hZ2ljKTsKICNlbmRpZgpAQCAtODksNyArODksNyBAQAogCiAgICAgZml4X2VuZGlhbnMocCk7CiAKLSNpZiAwICYmIGRlZmluZWQgX19wcGNfXworI2lmIDAgJiYgZGVmaW5lZCBIQVZFX0JJR19FTkRJQU4KICAgICBEKCJ3cml0ZSByZW1vdGUgcGFja2V0OiAlMDR4IGFyZzA9JTB4IGFyZzE9JTB4IGRhdGFfbGVuZ3RoPSUweCBkYXRhX2NoZWNrPSUweCBtYWdpYz0lMHhcbiIsCiAgICAgICBwLT5tc2cuY29tbWFuZCwgcC0+bXNnLmFyZzAsIHAtPm1zZy5hcmcxLCBwLT5tc2cuZGF0YV9sZW5ndGgsIHAtPm1zZy5kYXRhX2NoZWNrLCBwLT5tc2cubWFnaWMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hZGIvdHJhbnNwb3J0X3VzYi5jIGIvYWRiL3RyYW5zcG9ydF91c2IuYwppbmRleCAyNTg0MTYzLi5lZTZiNjM3IDEwMDY0NAotLS0gYS9hZGIvdHJhbnNwb3J0X3VzYi5jCisrKyBiL2FkYi90cmFuc3BvcnRfdXNiLmMKQEAgLTI3LDggKzI3LDcgQEAKICNpbmNsdWRlICJ1c2JfdmVuZG9ycy5oIgogI2VuZGlmCiAKLS8qIFhYWCBiZXR0ZXIgZGVmaW5lPyAqLwotI2lmZGVmIF9fcHBjX18KKyNpZmRlZiBIQVZFX0JJR19FTkRJQU4KICNkZWZpbmUgSDQoeCkJKCgoeCkgJiAweEZGMDAwMDAwKSA+PiAyNCkgfCAoKCh4KSAmIDB4MDBGRjAwMDApID4+IDgpIHwgKCgoeCkgJiAweDAwMDBGRjAwKSA8PCA4KSB8ICgoKHgpICYgMHgwMDAwMDBGRikgPDwgMjQpCiBzdGF0aWMgaW5saW5lIHZvaWQgZml4X2VuZGlhbnMoYXBhY2tldCAqcCkKIHsKZGlmZiAtLWdpdCBhL2FkYi91c2JfbGludXguYyBiL2FkYi91c2JfbGludXguYwppbmRleCBiYjg2ODEzLi40ZDU1Yjc0IDEwMDY0NAotLS0gYS9hZGIvdXNiX2xpbnV4LmMKKysrIGIvYWRiL3VzYl9saW51eC5jCkBAIC00NSw3ICs0NSw3IEBACiAvKiB1c2Igc2NhbiBkZWJ1Z2dpbmcgaXMgd2FhYWF5IHRvbyB2ZXJib3NlICovCiAjZGVmaW5lIERCR1goeC4uLikKIAotc3RhdGljIGFkYl9tdXRleF90IHVzYl9sb2NrID0gQURCX01VVEVYX0lOSVRJQUxJWkVSOworQURCX01VVEVYX0RFRklORSggdXNiX2xvY2sgKTsKIAogc3RydWN0IHVzYl9oYW5kbGUKIHsKQEAgLTE0OSw3ICsxNDksNyBAQAogCiAvLyAgICAgICAgREJHWCgiWyBzY2FubmluZyAlcyBdXG4iLCBidXNuYW1lKTsKICAgICAgICAgd2hpbGUoKGRlID0gcmVhZGRpcihkZXZkaXIpKSkgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciBkZXZkZXNjWzI1Nl07CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGRldmRlc2NbNDA5Nl07CiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZwdHIgPSBkZXZkZXNjOwogICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZW5kOwogICAgICAgICAgICAgc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciogZGV2aWNlOwpAQCAtMTkxLDkgKzE5MSw4IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHZpZCA9IF9fbGUxNl90b19jcHUoZGV2aWNlLT5pZFZlbmRvcik7Ci0gICAgICAgICAgICBwaWQgPSBfX2xlMTZfdG9fY3B1KGRldmljZS0+aWRQcm9kdWN0KTsKLSAgICAgICAgICAgIHBpZCA9IGRldmRlc2NbMTBdIHwgKGRldmRlc2NbMTFdIDw8IDgpOworICAgICAgICAgICAgdmlkID0gZGV2aWNlLT5pZFZlbmRvcjsKKyAgICAgICAgICAgIHBpZCA9IGRldmljZS0+aWRQcm9kdWN0OwogICAgICAgICAgICAgREJHWCgiWyAlcyBpcyBWOiUwNHggUDolMDR4IF1cbiIsIGRldm5hbWUsIHZpZCwgcGlkKTsKIAogICAgICAgICAgICAgICAgIC8vIHNob3VsZCBoYXZlIGNvbmZpZyBkZXNjcmlwdG9yIG5leHQKQEAgLTM3MCw2ICszNjksNyBAQAogICAgICAgICBoLT5yZWFwZXJfdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CiAgICAgICAgIGFkYl9tdXRleF91bmxvY2soJmgtPmxvY2spOwogICAgICAgICByZXMgPSBpb2N0bChoLT5kZXNjLCBVU0JERVZGU19SRUFQVVJCLCAmb3V0KTsKKyAgICAgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87CiAgICAgICAgIGFkYl9tdXRleF9sb2NrKCZoLT5sb2NrKTsKICAgICAgICAgaC0+cmVhcGVyX3RocmVhZCA9IDA7CiAgICAgICAgIGlmKGgtPmRlYWQpIHsKQEAgLTM3Nyw3ICszNzcsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYocmVzIDwgMCkgewotICAgICAgICAgICAgaWYoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgIGlmKHNhdmVkX2Vycm5vID09IEVJTlRSKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBEKCJbIHJlYXAgdXJiIC0gZXJyb3IgXVxuIik7CkBAIC02MDUsNiArNjA1LDcgQEAKICAgICAgICAgY3RybC53SW5kZXggPSAwOwogICAgICAgICBjdHJsLndMZW5ndGggPSBzaXplb2YobGFuZ3VhZ2VzKTsKICAgICAgICAgY3RybC5kYXRhID0gbGFuZ3VhZ2VzOworICAgICAgICBjdHJsLnRpbWVvdXQgPSAxMDAwOwogCiAgICAgICAgIHJlc3VsdCA9IGlvY3RsKHVzYi0+ZGVzYywgVVNCREVWRlNfQ09OVFJPTCwgJmN0cmwpOwogICAgICAgICBpZiAocmVzdWx0ID4gMCkKQEAgLTYxNyw5ICs2MTgsMTAgQEAKICAgICAgICAgICAgIGN0cmwuYlJlcXVlc3RUeXBlID0gVVNCX0RJUl9JTnxVU0JfVFlQRV9TVEFOREFSRHxVU0JfUkVDSVBfREVWSUNFOwogICAgICAgICAgICAgY3RybC5iUmVxdWVzdCA9IFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I7CiAgICAgICAgICAgICBjdHJsLndWYWx1ZSA9IChVU0JfRFRfU1RSSU5HIDw8IDgpIHwgc2VyaWFsX2luZGV4OwotICAgICAgICAgICAgY3RybC53SW5kZXggPSBsYW5ndWFnZXNbaV07CisgICAgICAgICAgICBjdHJsLndJbmRleCA9IF9fbGUxNl90b19jcHUobGFuZ3VhZ2VzW2ldKTsKICAgICAgICAgICAgIGN0cmwud0xlbmd0aCA9IHNpemVvZihidWZmZXIpOwogICAgICAgICAgICAgY3RybC5kYXRhID0gYnVmZmVyOworICAgICAgICAgICAgY3RybC50aW1lb3V0ID0gMTAwMDsKIAogICAgICAgICAgICAgcmVzdWx0ID0gaW9jdGwodXNiLT5kZXNjLCBVU0JERVZGU19DT05UUk9MLCAmY3RybCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID4gMCkgewpAQCAtNjI3LDcgKzYyOSw3IEBACiAgICAgICAgICAgICAgICAgLy8gc2tpcCBmaXJzdCB3b3JkLCBhbmQgY29weSB0aGUgcmVzdCB0byB0aGUgc2VyaWFsIHN0cmluZywgY2hhbmdpbmcgc2hvcnRzIHRvIGJ5dGVzLgogICAgICAgICAgICAgICAgIHJlc3VsdCAvPSAyOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByZXN1bHQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsW2kgLSAxXSA9IGJ1ZmZlcltpXTsKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsW2kgLSAxXSA9IF9fbGUxNl90b19jcHUoYnVmZmVyW2ldKTsKICAgICAgICAgICAgICAgICBzZXJpYWxbaSAtIDFdID0gMDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTY4Niw0ICs2ODgsMyBAQAogICAgICAgICBmYXRhbF9lcnJubygiY2Fubm90IGNyZWF0ZSBpbnB1dCB0aHJlYWQiKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2FkYi91c2JfbGludXhfY2xpZW50LmMgYi9hZGIvdXNiX2xpbnV4X2NsaWVudC5jCmluZGV4IDBhMjFjNmYuLjYzNWZhNGIgMTAwNjQ0Ci0tLSBhL2FkYi91c2JfbGludXhfY2xpZW50LmMKKysrIGIvYWRiL3VzYl9saW51eF9jbGllbnQuYwpAQCAtODMsMTQgKzgzLDE0IEBACiB7CiAgICAgaW50IG47CiAKLSAgICBEKCJbIHdyaXRlICVkIF1cbiIsIGxlbik7CisgICAgRCgiYWJvdXQgdG8gd3JpdGUgKGZkPSVkLCBsZW49JWQpXG4iLCBoLT5mZCwgbGVuKTsKICAgICBuID0gYWRiX3dyaXRlKGgtPmZkLCBkYXRhLCBsZW4pOwogICAgIGlmKG4gIT0gbGVuKSB7Ci0gICAgICAgIEQoIkVSUk9SOiBuID0gJWQsIGVycm5vID0gJWQgKCVzKVxuIiwKLSAgICAgICAgICAgIG4sIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBEKCJFUlJPUjogZmQgPSAlZCwgbiA9ICVkLCBlcnJubyA9ICVkICglcylcbiIsCisgICAgICAgICAgICBoLT5mZCwgbiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgRCgiWyBkb25lIF1cbiIpOworICAgIEQoIlsgZG9uZSBmZD0lZCBdXG4iLCBoLT5mZCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTk4LDEzICs5OCwxNCBAQAogewogICAgIGludCBuOwogCi0gICAgRCgiWyByZWFkICVkIF1cbiIsIGxlbik7CisgICAgRCgiYWJvdXQgdG8gcmVhZCAoZmQ9JWQsIGxlbj0lZClcbiIsIGgtPmZkLCBsZW4pOwogICAgIG4gPSBhZGJfcmVhZChoLT5mZCwgZGF0YSwgbGVuKTsKICAgICBpZihuICE9IGxlbikgewotICAgICAgICBEKCJFUlJPUjogbiA9ICVkLCBlcnJubyA9ICVkICglcylcbiIsCi0gICAgICAgICAgICBuLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgRCgiRVJST1I6IGZkID0gJWQsIG4gPSAlZCwgZXJybm8gPSAlZCAoJXMpXG4iLAorICAgICAgICAgICAgaC0+ZmQsIG4sIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIEQoIlsgZG9uZSBmZD0lZCBdXG4iLCBoLT5mZCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FkYi91c2JfdmVuZG9ycy5jIGIvYWRiL3VzYl92ZW5kb3JzLmMKaW5kZXggY2JjMjQ2NC4uYzA5ZmM3MSAxMDA2NDQKLS0tIGEvYWRiL3VzYl92ZW5kb3JzLmMKKysrIGIvYWRiL3VzYl92ZW5kb3JzLmMKQEAgLTY5LDYgKzY5LDggQEAKICNkZWZpbmUgVkVORE9SX0lEX1BBTlRFQ0ggICAgICAgMHgxMEE5CiAvLyBRdWFsY29tbSdzIFVTQiBWZW5kb3IgSUQKICNkZWZpbmUgVkVORE9SX0lEX1FVQUxDT01NICAgICAgMHgwNWM2CisvLyBPbi1UaGUtR28tVmlkZW8ncyBVU0IgVmVuZG9yIElECisjZGVmaW5lIFZFTkRPUl9JRF9PVEdWICAgICAgICAgIDB4MjI1NwogLy8gTkVDJ3MgVVNCIFZlbmRvciBJRAogI2RlZmluZSBWRU5ET1JfSURfTkVDICAgICAgICAgICAweDA0MDkKIC8vIFBhbmFzb25pYyBNb2JpbGUgQ29tbXVuaWNhdGlvbidzIFVTQiBWZW5kb3IgSUQKQEAgLTgzLDYgKzg1LDEwIEBACiAjZGVmaW5lIFZFTkRPUl9JRF9BU1VTICAgICAgICAgIDB4MGIwNQogLy8gUGhpbGlwcydzIFVTQiBWZW5kb3IgSUQKICNkZWZpbmUgVkVORE9SX0lEX1BISUxJUFMgICAgICAgMHgwNDcxCisvLyBUZXhhcyBJbnN0cnVtZW50cydzIFVTQiBWZW5kb3IgSUQKKyNkZWZpbmUgVkVORE9SX0lEX1RJICAgICAgICAgICAgMHgwNDUxCisvLyBGdW5haSdzIFVTQiBWZW5kb3IgSUQKKyNkZWZpbmUgVkVORE9SX0lEX0ZVTkFJICAgICAgICAgMHgwRjFDCiAKIAogLyoqIGJ1aWx0LWluIHZlbmRvciBsaXN0ICovCkBAIC0xMDQsNiArMTEwLDcgQEAKICAgICBWRU5ET1JfSURfS1lPQ0VSQSwKICAgICBWRU5ET1JfSURfUEFOVEVDSCwKICAgICBWRU5ET1JfSURfUVVBTENPTU0sCisgICAgVkVORE9SX0lEX09UR1YsCiAgICAgVkVORE9SX0lEX05FQywKICAgICBWRU5ET1JfSURfUE1DLAogICAgIFZFTkRPUl9JRF9UT1NISUJBLApAQCAtMTExLDYgKzExOCw4IEBACiAgICAgVkVORE9SX0lEX0tUX1RFQ0gsCiAgICAgVkVORE9SX0lEX0FTVVMsCiAgICAgVkVORE9SX0lEX1BISUxJUFMsCisgICAgVkVORE9SX0lEX1RJLAorICAgIFZFTkRPUl9JRF9GVU5BSSwKIH07CiAKICNkZWZpbmUgQlVJTFRfSU5fVkVORE9SX0NPVU5UICAgIChzaXplb2YoYnVpbHRJblZlbmRvcklkcykvc2l6ZW9mKGJ1aWx0SW5WZW5kb3JJZHNbMF0pKQpAQCAtMTcyLDcgKzE4MSw3IEBACiAvKiBidWlsZHMgdGhlIHBhdGggdG8gdGhlIGFkYiB2ZW5kb3IgaWQgZmlsZS4gcmV0dXJucyAwIGlmIHN1Y2Nlc3MgKi8KIGludCBidWlsZF9wYXRoKGNoYXIqIGJ1ZmYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIqIGZvcm1hdCwgY29uc3QgY2hhciogaG9tZSkKIHsKLSAgICBpZiAoc25wcmludGYoYnVmZiwgbGVuLCBmb3JtYXQsIGhvbWUsIEFORFJPSURfUEFUSCwgQU5EUk9JRF9BREJfSU5JKSA+PSBsZW4pIHsKKyAgICBpZiAoc25wcmludGYoYnVmZiwgbGVuLCBmb3JtYXQsIGhvbWUsIEFORFJPSURfUEFUSCwgQU5EUk9JRF9BREJfSU5JKSA+PSAoc2lnbmVkKWxlbikgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2FkYi91c2JfdmVuZG9ycy5oIGIvYWRiL3VzYl92ZW5kb3JzLmgKaW5kZXggNDM3OTBiOS4uY2VlMjNhMSAxMDA2NDQKLS0tIGEvYWRiL3VzYl92ZW5kb3JzLmgKKysrIGIvYWRiL3VzYl92ZW5kb3JzLmgKQEAgLTIyLDQgKzIyLDQgQEAKIAogdm9pZCB1c2JfdmVuZG9yc19pbml0KHZvaWQpOwogCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FkYi91c2Jfd2luZG93cy5jIGIvYWRiL3VzYl93aW5kb3dzLmMKaW5kZXggMzhjNGNmNC4uYjIxNjk5OSAxMDA2NDQKLS0tIGEvYWRiL3VzYl93aW5kb3dzLmMKKysrIGIvYWRiL3VzYl93aW5kb3dzLmMKQEAgLTI0NiwxMCArMjQ2LDEwIEBACiAgIH0KIAogICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZy4KLSAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKKyAgaW50IHNhdmVkX2Vycm5vID0gR2V0TGFzdEVycm9yKCk7CiAgIHVzYl9jbGVhbnVwX2hhbmRsZShyZXQpOwogICBmcmVlKHJldCk7Ci0gIFNldExhc3RFcnJvcihlcnJubyk7CisgIFNldExhc3RFcnJvcihzYXZlZF9lcnJubyk7CiAKICAgcmV0dXJuIE5VTEw7CiB9CkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9vdXQpOwotICAgIGVycm5vID0gR2V0TGFzdEVycm9yKCk7CisgICAgaW50IHNhdmVkX2Vycm5vID0gR2V0TGFzdEVycm9yKCk7CiAKICAgICBpZiAocmV0KSB7CiAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSd2ZSB3cml0dGVuIHdoYXQgd2Ugd2VyZSBhc2tlZCB0byB3cml0ZQpAQCAtMjg1LDkgKzI4NSwxMCBAQAogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAvLyBhc3N1bWUgRVJST1JfSU5WQUxJRF9IQU5ETEUgaW5kaWNhdGVzIHdlIGFyZSBkaXNjb25uZWN0ZWQKLSAgICAgIGlmIChlcnJubyA9PSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKKyAgICAgIGlmIChzYXZlZF9lcnJubyA9PSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKICAgICAgICAgdXNiX2tpY2soaGFuZGxlKTsKICAgICB9CisgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKICAgfSBlbHNlIHsKICAgICBEKCJ1c2Jfd3JpdGUgTlVMTCBoYW5kbGVcbiIpOwogICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX0hBTkRMRSk7CkBAIC0zMTMsMjAgKzMxNCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXhmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9vdXQpOwotICAgICAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgIEQoInVzYl93cml0ZSBnb3Q6ICVsZCwgZXhwZWN0ZWQ6ICVkLCBlcnJubzogJWRcbiIsIHJlYWQsIHhmZXIsIGVycm5vKTsKKyAgICAgIGludCBzYXZlZF9lcnJubyA9IEdldExhc3RFcnJvcigpOworICAgICAgRCgidXNiX3dyaXRlIGdvdDogJWxkLCBleHBlY3RlZDogJWQsIGVycm5vOiAlZFxuIiwgcmVhZCwgeGZlciwgc2F2ZWRfZXJybm8pOwogICAgICAgaWYgKHJldCkgewogICAgICAgICBkYXRhICs9IHJlYWQ7CiAgICAgICAgIGxlbiAtPSByZWFkOwogCiAgICAgICAgIGlmIChsZW4gPT0gMCkKICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0gZWxzZSBpZiAoZXJybm8gIT0gRVJST1JfU0VNX1RJTUVPVVQpIHsKKyAgICAgIH0gZWxzZSBpZiAoc2F2ZWRfZXJybm8gIT0gRVJST1JfU0VNX1RJTUVPVVQpIHsKICAgICAgICAgLy8gYXNzdW1lIEVSUk9SX0lOVkFMSURfSEFORExFIGluZGljYXRlcyB3ZSBhcmUgZGlzY29ubmVjdGVkCi0gICAgICAgIGlmIChlcnJubyA9PSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKKyAgICAgICAgaWYgKHNhdmVkX2Vycm5vID09IEVSUk9SX0lOVkFMSURfSEFORExFKQogICAgICAgICAgIHVzYl9raWNrKGhhbmRsZSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQorICAgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgRCgidXNiX3JlYWQgTlVMTCBoYW5kbGVcbiIpOwpkaWZmIC0tZ2l0IGEvY3Bpby9BbmRyb2lkLm1rIGIvY3Bpby9BbmRyb2lkLm1rCmluZGV4IDhkMDE4NTIuLjUxODQ0NjMgMTAwNjQ0Ci0tLSBhL2NwaW8vQW5kcm9pZC5taworKysgYi9jcGlvL0FuZHJvaWQubWsKQEAgLTEwLDQgKzEwLDQgQEAKIAogaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKIAotJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxkaXN0X2ZpbGVzLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9BbmRyb2lkLm1rIGIvZGVidWdnZXJkL0FuZHJvaWQubWsKaW5kZXggM2MxY2YwMi4uNmNmZTc5YiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL0FuZHJvaWQubWsKKysrIGIvZGVidWdnZXJkL0FuZHJvaWQubWsKQEAgLTEsMTEgKzEsMTUgQEAKICMgQ29weXJpZ2h0IDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCitpZm5lcSAoJChmaWx0ZXIgYXJtIHg4NiwkKFRBUkdFVF9BUkNIKSksKQogCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVM6PSBkZWJ1Z2dlcmQuYyBnZXRldmVudC5jIHVud2luZC1hcm0uYyBwci1zdXBwb3J0LmMgdXRpbGl0eS5jCitMT0NBTF9TUkNfRklMRVM6PSBkZWJ1Z2dlcmQuYyB1dGlsaXR5LmMgZ2V0ZXZlbnQuYyAkKFRBUkdFVF9BUkNIKS9tYWNoaW5lLmMgJChUQVJHRVRfQVJDSCkvdW53aW5kLmMgc3ltYm9sX3RhYmxlLmMKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFRBUkdFVF9BUkNIKS9wci1zdXBwb3J0LmMKK2VuZGlmCisKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbAogTE9DQUxfTU9EVUxFIDo9IGRlYnVnZ2VyZAogCkBAIC0yMiwxMCArMjYsMTAgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9TUkNfRklMRVMgOj0gY3Jhc2hlci5jCi1MT0NBTF9TUkNfRklMRVMgKz0gY3Jhc2hnbHVlLlMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFRBUkdFVF9BUkNIKS9jcmFzaGdsdWUuUwogTE9DQUxfTU9EVUxFIDo9IGNyYXNoZXIKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PUFRJT05BTF9FWEVDVVRBQkxFUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKICNMT0NBTF9GT1JDRV9TVEFUSUNfRVhFQ1VUQUJMRSA6PSB0cnVlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJjCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKQEAgLTQxLDkgKzQ1LDkgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSB2ZnAtY3Jhc2hlci5jIHZmcC5TCiBMT0NBTF9NT0RVTEUgOj0gdmZwLWNyYXNoZXIKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PUFRJT05BTF9FWEVDVVRBQkxFUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmMKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogZW5kaWYgIyBBUkNIX0FSTV9IQVZFX1ZGUCA9PSB0cnVlCiAKLWVuZGlmICMgVEFSR0VUX0FSQ0ggPT0gYXJtCitlbmRpZiAjIGFybSBvciB4ODYgaW4gVEFSR0VUX0FSQ0gKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaGdsdWUuUyBiL2RlYnVnZ2VyZC9hcm0vY3Jhc2hnbHVlLlMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gZGVidWdnZXJkL2NyYXNoZ2x1ZS5TCnJlbmFtZSB0byBkZWJ1Z2dlcmQvYXJtL2NyYXNoZ2x1ZS5TCmluZGV4IDBjMWZkOWIuLmViOWQwZTMgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaGdsdWUuUworKysgYi9kZWJ1Z2dlcmQvYXJtL2NyYXNoZ2x1ZS5TCkBAIC0yLDcgKzIsNyBAQAogLnR5cGUgY3Jhc2gxLCAlZnVuY3Rpb24KIC5nbG9ibCBjcmFzaG5vc3RhY2sKIC50eXBlIGNyYXNobm9zdGFjaywgJWZ1bmN0aW9uCi0JCQorCiBjcmFzaDE6CiAJbGRyIHIwLCA9MHhhNWE1MDAwMAogCWxkciByMSwgPTB4YTVhNTAwMDEKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9hcm0vbWFjaGluZS5jIGIvZGVidWdnZXJkL2FybS9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiZjA1NAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC9hcm0vbWFjaGluZS5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKiBzeXN0ZW0vZGVidWdnZXJkL2RlYnVnZ2VyZC5jCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvZXhlY19lbGYuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisKKyNpZmRlZiBXSVRIX1ZGUAorI2lmZGVmIFdJVEhfVkZQX0QzMgorI2RlZmluZSBOVU1fVkZQX1JFR1MgMzIKKyNlbHNlCisjZGVmaW5lIE5VTV9WRlBfUkVHUyAxNgorI2VuZGlmCisjZW5kaWYKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBnZXQgdGhlIGJhY2t0cmFjZSBmcm9tIHRoZSBjcmFzaGluZyBwcm9jZXNzICovCitleHRlcm4gaW50IHVud2luZF9iYWNrdHJhY2Vfd2l0aF9wdHJhY2UoaW50IHRmZCwgcGlkX3QgcGlkLCBtYXBpbmZvICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNwX2xpc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZyYW1lMF9wY19zYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXRfZmF1bHQpOworCit2b2lkIGR1bXBfc3RhY2tfYW5kX2NvZGUoaW50IHRmZCwgaW50IHBpZCwgbWFwaW5mbyAqbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bndpbmRfZGVwdGgsIHVuc2lnbmVkIGludCBzcF9saXN0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdF9mYXVsdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3AsIHBjLCBsciwgcCwgZW5kLCBkYXRhOworICAgIHN0cnVjdCBwdF9yZWdzIHI7CisgICAgaW50IHNwX2RlcHRoOworICAgIGJvb2wgb25seV9pbl90b21ic3RvbmUgPSAhYXRfZmF1bHQ7CisgICAgY2hhciBjb2RlX2J1ZmZlcls4MF07CisKKyAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSByZXR1cm47CisgICAgc3AgPSByLkFSTV9zcDsKKyAgICBwYyA9IHIuQVJNX3BjOworICAgIGxyID0gci5BUk1fbHI7CisKKyAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICJcbmNvZGUgYXJvdW5kIHBjOlxuIik7CisKKyAgICBwID0gcGMgJiB+MzsKKyAgICBwIC09IDMyOworICAgIGlmIChwID4gcGMpCisgICAgICAgIHAgPSAwOworICAgIGVuZCA9IHAgKyA4MDsKKyAgICAvKiAnZW5kIC0gcCcgaGFzIHRvIGJlIG11bHRpcGxlcyBvZiAxNiAqLworICAgIHdoaWxlIChlbmQgPCBwKQorICAgICAgICBlbmQgLT0gMTY7CisKKyAgICAvKiBEdW1wIHRoZSBjb2RlIGFyb3VuZCBQQyBhczoKKyAgICAgKiAgYWRkciAgICAgICBjb250ZW50cworICAgICAqICAwMDAwOGQzNCAgIGZmZmZmY2QwIDRjMGViNTMwIGIwOTM0YTBlIDFjMDU0NDdjCisgICAgICogIDAwMDA4ZDQ0ICAgZjdmZjE4YTAgNDkwY2VkOTQgNjgwMzU4NjAgZDAwMTJiMDAKKyAgICAgKi8KKyAgICB3aGlsZSAocCA8ICBlbmQpIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgc3ByaW50Zihjb2RlX2J1ZmZlciwgIiUwOHggIiwgcCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGRhdGEgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilwLCBOVUxMKTsKKyAgICAgICAgICAgIHNwcmludGYoY29kZV9idWZmZXIgKyBzdHJsZW4oY29kZV9idWZmZXIpLCAiJTA4eCAiLCBkYXRhKTsKKyAgICAgICAgICAgIHAgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIlc1xuIiwgY29kZV9idWZmZXIpOworICAgIH0KKworICAgIGlmIChsciAhPSBwYykgeworICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICJcbmNvZGUgYXJvdW5kIGxyOlxuIik7CisKKyAgICAgICAgcCA9IGxyICYgfjM7CisgICAgICAgIHAgLT0gMzI7CisgICAgICAgIGlmIChwID4gbHIpCisgICAgICAgICAgICBwID0gMDsKKyAgICAgICAgZW5kID0gcCArIDgwOworICAgICAgICAvKiAnZW5kIC0gcCcgaGFzIHRvIGJlIG11bHRpcGxlcyBvZiAxNiAqLworICAgICAgICB3aGlsZSAoZW5kIDwgcCkKKyAgICAgICAgICAgIGVuZCAtPSAxNjsKKworICAgICAgICAvKiBEdW1wIHRoZSBjb2RlIGFyb3VuZCBMUiBhczoKKyAgICAgICAgICogIGFkZHIgICAgICAgY29udGVudHMKKyAgICAgICAgICogIDAwMDA4ZDM0ICAgZmZmZmZjZDAgNGMwZWI1MzAgYjA5MzRhMGUgMWMwNTQ0N2MKKyAgICAgICAgICogIDAwMDA4ZDQ0ICAgZjdmZjE4YTAgNDkwY2VkOTQgNjgwMzU4NjAgZDAwMTJiMDAKKyAgICAgICAgICovCisgICAgICAgIHdoaWxlIChwIDwgZW5kKSB7CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgc3ByaW50Zihjb2RlX2J1ZmZlciwgIiUwOHggIiwgcCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKHZvaWQqKXAsIE5VTEwpOworICAgICAgICAgICAgICAgIHNwcmludGYoY29kZV9idWZmZXIgKyBzdHJsZW4oY29kZV9idWZmZXIpLCAiJTA4eCAiLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIlc1xuIiwgY29kZV9idWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcCA9IHNwIC0gNjQ7CisgICAgaWYgKHAgPiBzcCkKKyAgICAgICAgcCA9IDA7CisgICAgcCAmPSB+MzsKKyAgICBpZiAodW53aW5kX2RlcHRoICE9IDApIHsKKyAgICAgICAgaWYgKHVud2luZF9kZXB0aCA8IFNUQUNLX0NPTlRFTlRfREVQVEgpIHsKKyAgICAgICAgICAgIGVuZCA9IHNwX2xpc3RbdW53aW5kX2RlcHRoLTFdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZW5kID0gc3BfbGlzdFtTVEFDS19DT05URU5UX0RFUFRILTFdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlbmQgPSBwICsgMjU2OworICAgICAgICAvKiAnZW5kIC0gcCcgaGFzIHRvIGJlIG11bHRpcGxlcyBvZiA0ICovCisgICAgICAgIGlmIChlbmQgPCBwKQorICAgICAgICAgICAgZW5kID0gfjc7CisgICAgfQorCisgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiXG5zdGFjazpcbiIpOworCisgICAgLyogSWYgdGhlIGNyYXNoIGlzIGR1ZSB0byBQQyA9PSAwLCB0aGVyZSB3aWxsIGJlIHR3byBmcmFtZXMgdGhhdAorICAgICAqIGhhdmUgaWRlbnRpY2FsIFNQIHZhbHVlLgorICAgICAqLworICAgIGlmIChzcF9saXN0WzBdID09IHNwX2xpc3RbMV0pIHsKKyAgICAgICAgc3BfZGVwdGggPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3BfZGVwdGggPSAwOworICAgIH0KKworICAgIHdoaWxlIChwIDw9IGVuZCkgeworICAgICAgICAgY2hhciAqcHJvbXB0OworICAgICAgICAgY2hhciBsZXZlbFsxNl07CisgICAgICAgICBkYXRhID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCAodm9pZCopcCwgTlVMTCk7CisgICAgICAgICBpZiAocCA9PSBzcF9saXN0W3NwX2RlcHRoXSkgeworICAgICAgICAgICAgIHNwcmludGYobGV2ZWwsICIjJTAyZCIsIHNwX2RlcHRoKyspOworICAgICAgICAgICAgIHByb21wdCA9IGxldmVsOworICAgICAgICAgfQorICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgcHJvbXB0ID0gIiAgICI7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIFByaW50IHRoZSBzdGFjayBjb250ZW50IGluIHRoZSBsb2cgZm9yIHRoZSBmaXJzdCAzIGZyYW1lcy4gRm9yIHRoZQorICAgICAgICAgICogcmVzdCBvbmx5IHByaW50IHRoZW0gaW4gdGhlIHRvbWJzdG9uZSBmaWxlLgorICAgICAgICAgICovCisgICAgICAgICBfTE9HKHRmZCwgKHNwX2RlcHRoID4gMikgfHwgb25seV9pbl90b21ic3RvbmUsCisgICAgICAgICAgICAgICIlcyAlMDh4ICAlMDh4ICAlc1xuIiwgcHJvbXB0LCBwLCBkYXRhLAorICAgICAgICAgICAgICBtYXBfdG9fbmFtZShtYXAsIGRhdGEsICIiKSk7CisgICAgICAgICBwICs9IDQ7CisgICAgfQorICAgIC8qIHByaW50IGFub3RoZXIgNjQtYnl0ZSBvZiBzdGFjayBkYXRhIGFmdGVyIHRoZSBsYXN0IGZyYW1lICovCisKKyAgICBlbmQgPSBwKzY0OworICAgIC8qICdlbmQgLSBwJyBoYXMgdG8gYmUgbXVsdGlwbGVzIG9mIDQgKi8KKyAgICBpZiAoZW5kIDwgcCkKKyAgICAgICAgZW5kID0gfjc7CisKKyAgICB3aGlsZSAocCA8PSBlbmQpIHsKKyAgICAgICAgIGRhdGEgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilwLCBOVUxMKTsKKyAgICAgICAgIF9MT0codGZkLCAoc3BfZGVwdGggPiAyKSB8fCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICAgICAgIiAgICAlMDh4ICAlMDh4ICAlc1xuIiwgcCwgZGF0YSwKKyAgICAgICAgICAgICAgbWFwX3RvX25hbWUobWFwLCBkYXRhLCAiIikpOworICAgICAgICAgcCArPSA0OworICAgIH0KK30KKwordm9pZCBkdW1wX3BjX2FuZF9scihpbnQgdGZkLCBpbnQgcGlkLCBtYXBpbmZvICptYXAsIGludCB1bndvdW5kX2xldmVsLAorICAgICAgICAgICAgICAgICAgICBib29sIGF0X2ZhdWx0KQoreworICAgIHN0cnVjdCBwdF9yZWdzIHI7CisKKyAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSB7CisgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICJ0aWQgJWQgbm90IHJlc3BvbmRpbmchXG4iLCBwaWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVud291bmRfbGV2ZWwgPT0gMCkgeworICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgICAgICAgIyUwMmQgIHBjICUwOHggICVzXG4iLCAwLCByLkFSTV9wYywKKyAgICAgICAgICAgICBtYXBfdG9fbmFtZShtYXAsIHIuQVJNX3BjLCAiPHVua25vd24+IikpOworICAgIH0KKyAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgICAgICAgIyUwMmQgIGxyICUwOHggICVzXG4iLCAxLCByLkFSTV9sciwKKyAgICAgICAgICAgIG1hcF90b19uYW1lKG1hcCwgci5BUk1fbHIsICI8dW5rbm93bj4iKSk7Cit9CisKK3ZvaWQgZHVtcF9yZWdpc3RlcnMoaW50IHRmZCwgaW50IHBpZCwgYm9vbCBhdF9mYXVsdCkKK3sKKyAgICBzdHJ1Y3QgcHRfcmVncyByOworICAgIGJvb2wgb25seV9pbl90b21ic3RvbmUgPSAhYXRfZmF1bHQ7CisKKyAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSB7CisgICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICAgICAiY2Fubm90IGdldCByZWdpc3RlcnM6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIHIwICUwOHggIHIxICUwOHggIHIyICUwOHggIHIzICUwOHhcbiIsCisgICAgICAgICByLkFSTV9yMCwgci5BUk1fcjEsIHIuQVJNX3IyLCByLkFSTV9yMyk7CisgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIHI0ICUwOHggIHI1ICUwOHggIHI2ICUwOHggIHI3ICUwOHhcbiIsCisgICAgICAgICByLkFSTV9yNCwgci5BUk1fcjUsIHIuQVJNX3I2LCByLkFSTV9yNyk7CisgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIHI4ICUwOHggIHI5ICUwOHggIDEwICUwOHggIGZwICUwOHhcbiIsCisgICAgICAgICByLkFSTV9yOCwgci5BUk1fcjksIHIuQVJNX3IxMCwgci5BUk1fZnApOworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICIgaXAgJTA4eCAgc3AgJTA4eCAgbHIgJTA4eCAgcGMgJTA4eCAgY3BzciAlMDh4XG4iLAorICAgICAgICAgci5BUk1faXAsIHIuQVJNX3NwLCByLkFSTV9sciwgci5BUk1fcGMsIHIuQVJNX2Nwc3IpOworCisjaWZkZWYgV0lUSF9WRlAKKyAgICBzdHJ1Y3QgdXNlcl92ZnAgdmZwX3JlZ3M7CisgICAgaW50IGk7CisKKyAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFZGUFJFR1MsIHBpZCwgMCwgJnZmcF9yZWdzKSkgeworICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsCisgICAgICAgICAgICAgImNhbm5vdCBnZXQgcmVnaXN0ZXJzOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVkZQX1JFR1M7IGkgKz0gMikgeworICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsCisgICAgICAgICAgICAgIiBkJS0yZCAlMDE2bGx4ICBkJS0yZCAlMDE2bGx4XG4iLAorICAgICAgICAgICAgICBpLCB2ZnBfcmVncy5mcHJlZ3NbaV0sIGkrMSwgdmZwX3JlZ3MuZnByZWdzW2krMV0pOworICAgIH0KKyAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIgc2NyICUwOGx4XG5cbiIsIHZmcF9yZWdzLmZwc2NyKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3ByLXN1cHBvcnQuYyBiL2RlYnVnZ2VyZC9hcm0vcHItc3VwcG9ydC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkZWJ1Z2dlcmQvcHItc3VwcG9ydC5jCnJlbmFtZSB0byBkZWJ1Z2dlcmQvYXJtL3ByLXN1cHBvcnQuYwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Vud2luZC1hcm0uYyBiL2RlYnVnZ2VyZC9hcm0vdW53aW5kLmMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gZGVidWdnZXJkL3Vud2luZC1hcm0uYwpyZW5hbWUgdG8gZGVidWdnZXJkL2FybS91bndpbmQuYwppbmRleCA5NjQyZDJlLi5kOTYwMGI3IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvdW53aW5kLWFybS5jCisrKyBiL2RlYnVnZ2VyZC9hcm0vdW53aW5kLmMKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlIDx1bndpbmQuaD4KICNpbmNsdWRlICJ1dGlsaXR5LmgiCiAKKyNpbmNsdWRlICJzeW1ib2xfdGFibGUuaCIKKwogdHlwZWRlZiBzdHJ1Y3QgX1pTdDl0eXBlX2luZm8gdHlwZV9pbmZvOyAvKiBUaGlzIG5hbWVzIEMrKyB0eXBlX2luZm8gdHlwZSAqLwogCiB2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBfX2N4YV9jYWxsX3VuZXhwZWN0ZWQoX1Vud2luZF9Db250cm9sX0Jsb2NrICp1Y2JwKTsKQEAgLTM5Myw2ICszOTUsNyBAQAogICAgIHBoYXNlMl92cnMgKnZycyA9IChwaGFzZTJfdnJzKikgY29udGV4dDsKICAgICBjb25zdCBtYXBpbmZvICptaTsKICAgICBib29sIG9ubHlfaW5fdG9tYnN0b25lID0gIWF0X2ZhdWx0OworICAgIGNvbnN0IHN0cnVjdCBzeW1ib2wqIHN5bSA9IDA7CiAKICAgICBpZiAoc3RhY2tfbGV2ZWwgPCBTVEFDS19DT05URU5UX0RFUFRIKSB7CiAgICAgICAgIHNwX2xpc3Rbc3RhY2tfbGV2ZWxdID0gdnJzLT5jb3JlLnJbUl9TUF07CkBAIC00MjcsNyArNDMwLDcgQEAKICAgICAgICAgaWYgKHBjICYgMSkgewogICAgICAgICAgICAgX3V3IHByZXZfd29yZDsKICAgICAgICAgICAgIHBjID0gKHBjICYgfjEpOwotICAgICAgICAgICAgcHJldl93b3JkID0gZ2V0X3JlbW90ZV93b3JkKHBpZCwgKHZvaWQgKikgcGMtNCk7CisgICAgICAgICAgICBwcmV2X3dvcmQgPSBnZXRfcmVtb3RlX3dvcmQocGlkLCAoY2hhciAqKSBwYy00KTsKICAgICAgICAgICAgIC8vIExvbmcgb2Zmc2V0IAogICAgICAgICAgICAgaWYgKChwcmV2X3dvcmQgJiAweGYwMDAwMDAwKSA9PSAweGYwMDAwMDAwICYmIAogICAgICAgICAgICAgICAgIChwcmV2X3dvcmQgJiAweDAwMDBlMDAwKSA9PSAweDAwMDBlMDAwKSB7CkBAIC00NDgsMTIgKzQ1MSwyMiBAQAogICAgICAqIDFNQiBib3VuZGFyaWVzLCBhbmQgdGhlIGxpYnJhcnkgbWF5IGJlIGxhcmdlciB0aGFuIDFNQi4gU28gZm9yIC5zbyAKICAgICAgKiBhZGRyZXNzZXMgd2UgcHJpbnQgdGhlIHJlbGF0aXZlIG9mZnNldCBpbiBiYWNrIHRyYWNlLgogICAgICAqLwotICAgIHJlbF9wYyA9IHBjOwogICAgIG1pID0gcGNfdG9fbWFwaW5mbyhtYXAsIHBjLCAmcmVsX3BjKTsKIAotICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgCi0gICAgICAgICAiICAgICAgICAgIyUwMmQgIHBjICUwOHggICVzXG4iLCBzdGFja19sZXZlbCwgcmVsX3BjLCAKLSAgICAgICAgIG1pID8gbWktPm5hbWUgOiAiIik7CisgICAgLyogU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgd2hhdCBzeW1ib2wgdGhpcyBzdGFjayBmcmFtZSByZXNpZGVzIGluICovCisgICAgaWYgKG1pICE9IDAgJiYgbWktPnN5bWJvbHMgIT0gMCkgeworICAgICAgICBzeW0gPSBzeW1ib2xfdGFibGVfbG9va3VwKG1pLT5zeW1ib2xzLCByZWxfcGMpOworICAgIH0KKworICAgIGlmIChzeW0pIHsKKyAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAorICAgICAgICAgICAgIiAgICAgICAgICMlMDJkICBwYyAlMDh4ICAlcyAoJXMpXG4iLCBzdGFja19sZXZlbCwgcmVsX3BjLAorICAgICAgICAgICAgbWkgPyBtaS0+bmFtZSA6ICIiLCBzeW0tPm5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICAgICIgICAgICAgICAjJTAyZCAgcGMgJTA4eCAgJXNcbiIsIHN0YWNrX2xldmVsLCByZWxfcGMsCisgICAgICAgICAgICBtaSA/IG1pLT5uYW1lIDogIiIpOworICAgIH0KIAogICAgIHJldHVybiBfVVJDX05PX1JFQVNPTjsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaGVyLmMgYi9kZWJ1Z2dlcmQvY3Jhc2hlci5jCmluZGV4IGY0YTVhNjIuLjAwNjUyZTkgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaGVyLmMKKysrIGIvZGVidWdnZXJkL2NyYXNoZXIuYwpAQCAtMTksNiArMTksNyBAQAogCiB2b2lkIGNyYXNoMSh2b2lkKTsKIHZvaWQgY3Jhc2hub3N0YWNrKHZvaWQpOwordm9pZCBtYXliZWFib3J0KHZvaWQpOwogCiBzdGF0aWMgdm9pZCBkZWJ1Z2dlcmRfY29ubmVjdCgpCiB7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvZGVidWdnZXJkLmMgYi9kZWJ1Z2dlcmQvZGVidWdnZXJkLmMKaW5kZXggYjU1N2NlYS4uNjg1ZjE0NyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2RlYnVnZ2VyZC5jCisrKyBiL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuYwpAQCAtMTYsOCArMTYsNiBAQAogKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CkBAIC0zMywzNyArMzEsMjEgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2xvZ2QuaD4KLSNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKKyNpbmNsdWRlICJkZWJ1Z2dlcmQuaCIKICNpbmNsdWRlICJ1dGlsaXR5LmgiCiAKLSNpZmRlZiBXSVRIX1ZGUAotI2lmZGVmIFdJVEhfVkZQX0QzMgotI2RlZmluZSBOVU1fVkZQX1JFR1MgMzIKLSNlbHNlCi0jZGVmaW5lIE5VTV9WRlBfUkVHUyAxNgotI2VuZGlmCi0jZW5kaWYKLQotLyogTWFpbiBlbnRyeSBwb2ludCB0byBnZXQgdGhlIGJhY2t0cmFjZSBmcm9tIHRoZSBjcmFzaGluZyBwcm9jZXNzICovCi1leHRlcm4gaW50IHVud2luZF9iYWNrdHJhY2Vfd2l0aF9wdHJhY2UoaW50IHRmZCwgcGlkX3QgcGlkLCBtYXBpbmZvICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNwX2xpc3RbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZyYW1lMF9wY19zYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXRfZmF1bHQpOwotCi1zdGF0aWMgaW50IGxvZ3NvY2tldCA9IC0xOwotCiAjZGVmaW5lIEFORFJPSURfTE9HX0lORk8gNAogCiAvKiBMb2cgaW5mb3JtYXRpb24gb250byB0aGUgdG9tYnN0b25lICovCiB2b2lkIF9MT0coaW50IHRmZCwgYm9vbCBpbl90b21ic3RvbmVfb25seSwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gICAgY2hhciBidWZbMTI4XTsKKyAgICBjaGFyIGJ1Zls1MTJdOwogCiAgICAgdmFfbGlzdCBhcDsKICAgICB2YV9zdGFydChhcCwgZm10KTsKQEAgLTc5LDEzICs2MSw2IEBACiAgICAgICAgIF9fYW5kcm9pZF9sb2dfdnByaW50KEFORFJPSURfTE9HX0lORk8sICJERUJVRyIsIGZtdCwgYXApOwogfQogCi0jZGVmaW5lIExPRyhmbXQuLi4pIF9MT0coLTEsIDAsIGZtdCkKLSNpZiAwCi0jZGVmaW5lIFhMT0coZm10Li4uKSBfTE9HKC0xLCAwLCBmbXQpCi0jZWxzZQotI2RlZmluZSBYTE9HKGZtdC4uLikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotCiAvLyA2ZjAwMDAwMC02ZjAxZTAwMCByd3hwIDAwMDAwMDAwIDAwOjBjIDE2Mzg5NDE5ICAgL3N5c3RlbS9saWIvbGliY29tcG9zZXIuc28KIC8vIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQogLy8gMCAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1CkBAIC0xMDYsMTAgKzgxLDExIEBACiAKICAgICBtaS0+c3RhcnQgPSBzdHJ0b3VsKGxpbmUsIDAsIDE2KTsKICAgICBtaS0+ZW5kID0gc3RydG91bChsaW5lICsgOSwgMCwgMTYpOwotICAgIC8qIFRvIGJlIGZpbGxlZCBpbiBwYXJzZV9leGlkeF9pbmZvIGlmIHRoZSBtYXBwZWQgc2VjdGlvbiBzdGFydHMgd2l0aAorICAgIC8qIFRvIGJlIGZpbGxlZCBpbiBwYXJzZV9lbGZfaW5mbyBpZiB0aGUgbWFwcGVkIHNlY3Rpb24gc3RhcnRzIHdpdGgKICAgICAgKiBlbGZfaGVhZGVyCiAgICAgICovCiAgICAgbWktPmV4aWR4X3N0YXJ0ID0gbWktPmV4aWR4X2VuZCA9IDA7CisgICAgbWktPnN5bWJvbHMgPSAwOwogICAgIG1pLT5uZXh0ID0gMDsKICAgICBzdHJjcHkobWktPm5hbWUsIGxpbmUgKyA0OSk7CiAKQEAgLTEyNSwxODYgKzEwMSw2IEBACiAgICAgX0xPRyh0ZmQsIGZhbHNlLCAiQnVpbGQgZmluZ2VycHJpbnQ6ICclcydcbiIsIGZpbmdlcnByaW50KTsKIH0KIAotCi12b2lkIGR1bXBfc3RhY2tfYW5kX2NvZGUoaW50IHRmZCwgaW50IHBpZCwgbWFwaW5mbyAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bndpbmRfZGVwdGgsIHVuc2lnbmVkIGludCBzcF9saXN0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdF9mYXVsdCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgc3AsIHBjLCBwLCBlbmQsIGRhdGE7Ci0gICAgc3RydWN0IHB0X3JlZ3MgcjsKLSAgICBpbnQgc3BfZGVwdGg7Ci0gICAgYm9vbCBvbmx5X2luX3RvbWJzdG9uZSA9ICFhdF9mYXVsdDsKLSAgICBjaGFyIGNvZGVfYnVmZmVyWzgwXTsKLQotICAgIGlmKHB0cmFjZShQVFJBQ0VfR0VUUkVHUywgcGlkLCAwLCAmcikpIHJldHVybjsKLSAgICBzcCA9IHIuQVJNX3NwOwotICAgIHBjID0gci5BUk1fcGM7Ci0KLSAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICJcbmNvZGUgYXJvdW5kIHBjOlxuIik7Ci0KLSAgICBlbmQgPSBwID0gcGMgJiB+MzsKLSAgICBwIC09IDMyOwotICAgIGVuZCArPSAzMjsKLQotICAgIC8qIER1bXAgdGhlIGNvZGUgYXJvdW5kIFBDIGFzOgotICAgICAqICBhZGRyICAgICAgIGNvbnRlbnRzCi0gICAgICogIDAwMDA4ZDM0ICAgZmZmZmZjZDAgNGMwZWI1MzAgYjA5MzRhMGUgMWMwNTQ0N2MKLSAgICAgKiAgMDAwMDhkNDQgICBmN2ZmMThhMCA0OTBjZWQ5NCA2ODAzNTg2MCBkMDAxMmIwMAotICAgICAqLwotICAgIHdoaWxlIChwIDw9IGVuZCkgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBzcHJpbnRmKGNvZGVfYnVmZmVyLCAiJTA4eCAiLCBwKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgZGF0YSA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKHZvaWQqKXAsIE5VTEwpOwotICAgICAgICAgICAgc3ByaW50Zihjb2RlX2J1ZmZlciArIHN0cmxlbihjb2RlX2J1ZmZlciksICIlMDh4ICIsIGRhdGEpOwotICAgICAgICAgICAgcCArPSA0OwotICAgICAgICB9Ci0gICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiVzXG4iLCBjb2RlX2J1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKCh1bnNpZ25lZCkgci5BUk1fbHIgIT0gcGMpIHsKLSAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiXG5jb2RlIGFyb3VuZCBscjpcbiIpOwotCi0gICAgICAgIGVuZCA9IHAgPSByLkFSTV9sciAmIH4zOwotICAgICAgICBwIC09IDMyOwotICAgICAgICBlbmQgKz0gMzI7Ci0KLSAgICAgICAgLyogRHVtcCB0aGUgY29kZSBhcm91bmQgTFIgYXM6Ci0gICAgICAgICAqICBhZGRyICAgICAgIGNvbnRlbnRzCi0gICAgICAgICAqICAwMDAwOGQzNCAgIGZmZmZmY2QwIDRjMGViNTMwIGIwOTM0YTBlIDFjMDU0NDdjCi0gICAgICAgICAqICAwMDAwOGQ0NCAgIGY3ZmYxOGEwIDQ5MGNlZDk0IDY4MDM1ODYwIGQwMDEyYjAwCi0gICAgICAgICAqLwotICAgICAgICB3aGlsZSAocCA8PSBlbmQpIHsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBzcHJpbnRmKGNvZGVfYnVmZmVyLCAiJTA4eCAiLCBwKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCAodm9pZCopcCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgc3ByaW50Zihjb2RlX2J1ZmZlciArIHN0cmxlbihjb2RlX2J1ZmZlciksICIlMDh4ICIsIGRhdGEpOwotICAgICAgICAgICAgICAgIHAgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiVzXG4iLCBjb2RlX2J1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwID0gc3AgLSA2NDsKLSAgICBwICY9IH4zOwotICAgIGlmICh1bndpbmRfZGVwdGggIT0gMCkgewotICAgICAgICBpZiAodW53aW5kX2RlcHRoIDwgU1RBQ0tfQ09OVEVOVF9ERVBUSCkgewotICAgICAgICAgICAgZW5kID0gc3BfbGlzdFt1bndpbmRfZGVwdGgtMV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBlbmQgPSBzcF9saXN0W1NUQUNLX0NPTlRFTlRfREVQVEgtMV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGVuZCA9IHNwIHwgMHgwMDAwMDBmZjsKLSAgICAgICAgZW5kICs9IDB4ZmY7Ci0gICAgfQotCi0gICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiXG5zdGFjazpcbiIpOwotCi0gICAgLyogSWYgdGhlIGNyYXNoIGlzIGR1ZSB0byBQQyA9PSAwLCB0aGVyZSB3aWxsIGJlIHR3byBmcmFtZXMgdGhhdAotICAgICAqIGhhdmUgaWRlbnRpY2FsIFNQIHZhbHVlLgotICAgICAqLwotICAgIGlmIChzcF9saXN0WzBdID09IHNwX2xpc3RbMV0pIHsKLSAgICAgICAgc3BfZGVwdGggPSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3BfZGVwdGggPSAwOwotICAgIH0KLQotICAgIHdoaWxlIChwIDw9IGVuZCkgewotICAgICAgICAgY2hhciAqcHJvbXB0OwotICAgICAgICAgY2hhciBsZXZlbFsxNl07Ci0gICAgICAgICBkYXRhID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCAodm9pZCopcCwgTlVMTCk7Ci0gICAgICAgICBpZiAocCA9PSBzcF9saXN0W3NwX2RlcHRoXSkgewotICAgICAgICAgICAgIHNwcmludGYobGV2ZWwsICIjJTAyZCIsIHNwX2RlcHRoKyspOwotICAgICAgICAgICAgIHByb21wdCA9IGxldmVsOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgcHJvbXB0ID0gIiAgICI7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIFByaW50IHRoZSBzdGFjayBjb250ZW50IGluIHRoZSBsb2cgZm9yIHRoZSBmaXJzdCAzIGZyYW1lcy4gRm9yIHRoZQotICAgICAgICAgICogcmVzdCBvbmx5IHByaW50IHRoZW0gaW4gdGhlIHRvbWJzdG9uZSBmaWxlLgotICAgICAgICAgICovCi0gICAgICAgICBfTE9HKHRmZCwgKHNwX2RlcHRoID4gMikgfHwgb25seV9pbl90b21ic3RvbmUsCi0gICAgICAgICAgICAgICIlcyAlMDh4ICAlMDh4ICAlc1xuIiwgcHJvbXB0LCBwLCBkYXRhLAotICAgICAgICAgICAgICBtYXBfdG9fbmFtZShtYXAsIGRhdGEsICIiKSk7Ci0gICAgICAgICBwICs9IDQ7Ci0gICAgfQotICAgIC8qIHByaW50IGFub3RoZXIgNjQtYnl0ZSBvZiBzdGFjayBkYXRhIGFmdGVyIHRoZSBsYXN0IGZyYW1lICovCi0KLSAgICBlbmQgPSBwKzY0OwotICAgIHdoaWxlIChwIDw9IGVuZCkgewotICAgICAgICAgZGF0YSA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKHZvaWQqKXAsIE5VTEwpOwotICAgICAgICAgX0xPRyh0ZmQsIChzcF9kZXB0aCA+IDIpIHx8IG9ubHlfaW5fdG9tYnN0b25lLAotICAgICAgICAgICAgICAiICAgICUwOHggICUwOHggICVzXG4iLCBwLCBkYXRhLAotICAgICAgICAgICAgICBtYXBfdG9fbmFtZShtYXAsIGRhdGEsICIiKSk7Ci0gICAgICAgICBwICs9IDQ7Ci0gICAgfQotfQotCi12b2lkIGR1bXBfcGNfYW5kX2xyKGludCB0ZmQsIGludCBwaWQsIG1hcGluZm8gKm1hcCwgaW50IHVud291bmRfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYXRfZmF1bHQpCi17Ci0gICAgc3RydWN0IHB0X3JlZ3MgcjsKLQotICAgIGlmKHB0cmFjZShQVFJBQ0VfR0VUUkVHUywgcGlkLCAwLCAmcikpIHsKLSAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgInRpZCAlZCBub3QgcmVzcG9uZGluZyFcbiIsIHBpZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodW53b3VuZF9sZXZlbCA9PSAwKSB7Ci0gICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgICAgICAjJTAyZCAgcGMgJTA4eCAgJXNcbiIsIDAsIHIuQVJNX3BjLAotICAgICAgICAgICAgIG1hcF90b19uYW1lKG1hcCwgci5BUk1fcGMsICI8dW5rbm93bj4iKSk7Ci0gICAgfQotICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgICAgICAjJTAyZCAgbHIgJTA4eCAgJXNcbiIsIDEsIHIuQVJNX2xyLAotICAgICAgICAgICAgbWFwX3RvX25hbWUobWFwLCByLkFSTV9sciwgIjx1bmtub3duPiIpKTsKLX0KLQotdm9pZCBkdW1wX3JlZ2lzdGVycyhpbnQgdGZkLCBpbnQgcGlkLCBib29sIGF0X2ZhdWx0KQotewotICAgIHN0cnVjdCBwdF9yZWdzIHI7Ci0gICAgYm9vbCBvbmx5X2luX3RvbWJzdG9uZSA9ICFhdF9mYXVsdDsKLQotICAgIGlmKHB0cmFjZShQVFJBQ0VfR0VUUkVHUywgcGlkLCAwLCAmcikpIHsKLSAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAotICAgICAgICAgICAgICJjYW5ub3QgZ2V0IHJlZ2lzdGVyczogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIgcjAgJTA4eCAgcjEgJTA4eCAgcjIgJTA4eCAgcjMgJTA4eFxuIiwKLSAgICAgICAgIHIuQVJNX3IwLCByLkFSTV9yMSwgci5BUk1fcjIsIHIuQVJNX3IzKTsKLSAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIgcjQgJTA4eCAgcjUgJTA4eCAgcjYgJTA4eCAgcjcgJTA4eFxuIiwKLSAgICAgICAgIHIuQVJNX3I0LCByLkFSTV9yNSwgci5BUk1fcjYsIHIuQVJNX3I3KTsKLSAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIgcjggJTA4eCAgcjkgJTA4eCAgMTAgJTA4eCAgZnAgJTA4eFxuIiwKLSAgICAgICAgIHIuQVJNX3I4LCByLkFSTV9yOSwgci5BUk1fcjEwLCByLkFSTV9mcCk7Ci0gICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAotICAgICAgICAgIiBpcCAlMDh4ICBzcCAlMDh4ICBsciAlMDh4ICBwYyAlMDh4ICBjcHNyICUwOHhcbiIsCi0gICAgICAgICByLkFSTV9pcCwgci5BUk1fc3AsIHIuQVJNX2xyLCByLkFSTV9wYywgci5BUk1fY3Bzcik7Ci0KLSNpZmRlZiBXSVRIX1ZGUAotICAgIHN0cnVjdCB1c2VyX3ZmcCB2ZnBfcmVnczsKLSAgICBpbnQgaTsKLQotICAgIGlmKHB0cmFjZShQVFJBQ0VfR0VUVkZQUkVHUywgcGlkLCAwLCAmdmZwX3JlZ3MpKSB7Ci0gICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKLSAgICAgICAgICAgICAiY2Fubm90IGdldCByZWdpc3RlcnM6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE5VTV9WRlBfUkVHUzsgaSArPSAyKSB7Ci0gICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKLSAgICAgICAgICAgICAiIGQlLTJkICUwMTZsbHggIGQlLTJkICUwMTZsbHhcbiIsCi0gICAgICAgICAgICAgIGksIHZmcF9yZWdzLmZwcmVnc1tpXSwgaSsxLCB2ZnBfcmVncy5mcHJlZ3NbaSsxXSk7Ci0gICAgfQotICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiBzY3IgJTA4bHhcblxuIiwgdmZwX3JlZ3MuZnBzY3IpOwotI2VuZGlmCi19Ci0KIGNvbnN0IGNoYXIgKmdldF9zaWduYW1lKGludCBzaWcpCiB7CiAgICAgc3dpdGNoKHNpZykgewpAQCAtMzk5LDcgKzE5NSw3IEBACiAgICAgaWYoc2lnKSBkdW1wX2ZhdWx0X2FkZHIodGZkLCB0aWQsIHNpZyk7CiB9CiAKLXN0YXRpYyB2b2lkIHBhcnNlX2V4aWR4X2luZm8obWFwaW5mbyAqbWlsaXN0LCBwaWRfdCBwaWQpCitzdGF0aWMgdm9pZCBwYXJzZV9lbGZfaW5mbyhtYXBpbmZvICptaWxpc3QsIHBpZF90IHBpZCkKIHsKICAgICBtYXBpbmZvICptaTsKICAgICBmb3IgKG1pID0gbWlsaXN0OyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KSB7CkBAIC00MjIsMTMgKzIxOCwxOCBAQAogICAgICAgICAgICAgICAgIC8qIFBhcnNlIHRoZSBwcm9ncmFtIGhlYWRlciAqLwogICAgICAgICAgICAgICAgIGdldF9yZW1vdGVfc3RydWN0KHBpZCwgKGNoYXIgKikgKHB0citpKSwgJnBoZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVsZjMyX1BoZHIpKTsKKyNpZmRlZiBfX2FybV9fCiAgICAgICAgICAgICAgICAgLyogRm91bmQgYSBFWElEWCBzZWdtZW50PyAqLwogICAgICAgICAgICAgICAgIGlmIChwaGRyLnBfdHlwZSA9PSBQVF9BUk1fRVhJRFgpIHsKICAgICAgICAgICAgICAgICAgICAgbWktPmV4aWR4X3N0YXJ0ID0gbWktPnN0YXJ0ICsgcGhkci5wX29mZnNldDsKICAgICAgICAgICAgICAgICAgICAgbWktPmV4aWR4X2VuZCA9IG1pLT5leGlkeF9zdGFydCArIHBoZHIucF9maWxlc3o7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBUcnkgdG8gbG9hZCBzeW1ib2xzIGZyb20gdGhpcyBmaWxlICovCisgICAgICAgICAgICBtaS0+c3ltYm9scyA9IHN5bWJvbF90YWJsZV9jcmVhdGUobWktPm5hbWUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNDQwLDcgKzI0MSw5IEBACiAgICAgbWFwaW5mbyAqbWlsaXN0ID0gMDsKICAgICB1bnNpZ25lZCBpbnQgc3BfbGlzdFtTVEFDS19DT05URU5UX0RFUFRIXTsKICAgICBpbnQgc3RhY2tfZGVwdGg7CisjaWZkZWYgX19hcm1fXwogICAgIGludCBmcmFtZTBfcGNfc2FuZSA9IDE7CisjZW5kaWYKIAogICAgIGlmICghYXRfZmF1bHQpIHsKICAgICAgICAgX0xPRyh0ZmQsIHRydWUsCkBAIC00NjYsOCArMjY5LDkgQEAKICAgICAgICAgZmNsb3NlKGZwKTsKICAgICB9CiAKLSAgICBwYXJzZV9leGlkeF9pbmZvKG1pbGlzdCwgdGlkKTsKKyAgICBwYXJzZV9lbGZfaW5mbyhtaWxpc3QsIHRpZCk7CiAKKyNpZiBfX2FybV9fCiAgICAgLyogSWYgc3RhY2sgdW53aW5kZXIgZmFpbHMsIHVzZSB0aGUgZGVmYXVsdCBzb2x1dGlvbiB0byBkdW1wIHRoZSBzdGFjawogICAgICAqIGNvbnRlbnQuCiAgICAgICovCkBAIC00ODIsOSArMjg2LDE4IEBACiAgICAgfQogCiAgICAgZHVtcF9zdGFja19hbmRfY29kZSh0ZmQsIHRpZCwgbWlsaXN0LCBzdGFja19kZXB0aCwgc3BfbGlzdCwgYXRfZmF1bHQpOworI2VsaWYgX19pMzg2X18KKyAgICAvKiBJZiBzdGFjayB1bndpbmRlciBmYWlscywgdXNlIHRoZSBkZWZhdWx0IHNvbHV0aW9uIHRvIGR1bXAgdGhlIHN0YWNrCisgICAgKiBjb250ZW50LgorICAgICovCisgICAgc3RhY2tfZGVwdGggPSB1bndpbmRfYmFja3RyYWNlX3dpdGhfcHRyYWNlX3g4Nih0ZmQsIHRpZCwgbWlsaXN0LGF0X2ZhdWx0KTsKKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKKyNlbmRpZgogCiAgICAgd2hpbGUobWlsaXN0KSB7CiAgICAgICAgIG1hcGluZm8gKm5leHQgPSBtaWxpc3QtPm5leHQ7CisgICAgICAgIHN5bWJvbF90YWJsZV9mcmVlKG1pbGlzdC0+c3ltYm9scyk7CiAgICAgICAgIGZyZWUobWlsaXN0KTsKICAgICAgICAgbWlsaXN0ID0gbmV4dDsKICAgICB9CkBAIC03NjAsNyArNTczLDcgQEAKICAgICAgICAgZ290byBkb25lOwogICAgIH0KIAotICAgIHNwcmludGYoYnVmLCIvcHJvYy8lZC90YXNrLyVkIiwgY3IucGlkLCB0aWQpOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIi9wcm9jLyVkL3Rhc2svJWQiLCBjci5waWQsIHRpZCk7CiAgICAgaWYoc3RhdChidWYsICZzKSkgewogICAgICAgICBMT0coInRpZCAlZCBkb2VzIG5vdCBleGlzdCBpbiBwaWQgJWQuIGlnbm9yaW5nIGRlYnVnIHJlcXVlc3RcbiIsCiAgICAgICAgICAgICB0aWQsIGNyLnBpZCk7CkBAIC03NzAsNyArNTgzLDE5IEBACiAKICAgICBYTE9HKCJCT09NOiBwaWQ9JWQgdWlkPSVkIGdpZD0lZCB0aWQ9JWRcbiIsIGNyLnBpZCwgY3IudWlkLCBjci5naWQsIHRpZCk7CiAKKyAgICAvKiBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCwgdGhlIHRhcmdldCB0aHJlYWQncyBzaWduYWwgaGFuZGxlcgorICAgICAqIGlzIGJsb2NrZWQgaW4gYSByZWFkKCkgY2FsbC4gVGhpcyBnaXZlcyB1cyB0aGUgdGltZSB0byBQVFJBQ0VfQVRUQUNICisgICAgICogdG8gaXQgYmVmb3JlIGl0IGhhcyBhIGNoYW5jZSB0byByZWFsbHkgZmF1bHQuCisgICAgICoKKyAgICAgKiBBZnRlciB0aGUgYXR0YWNoLCB0aGUgdGhyZWFkIGlzIHN0b3BwZWQsIGFuZCB3ZSB3cml0ZSB0byB0aGUgZmlsZQorICAgICAqIGRlc2NyaXB0b3IgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBydW4gYXMgc29vbiBhcyB3ZSBjYWxsIFBUUkFDRV9DT05UCisgICAgICogYmVsb3cuIFNlZSBkZXRhaWxzIGluIGJpb25pYy9saWJjL2xpbmtlci9kZWJ1Z2dlci5jLCBpbiBmdW5jdGlvbgorICAgICAqIGRlYnVnZ2VyX3NpZ25hbF9oYW5kbGVyKCkuCisgICAgICovCiAgICAgdGlkX2F0dGFjaF9zdGF0dXMgPSBwdHJhY2UoUFRSQUNFX0FUVEFDSCwgdGlkLCAwLCAwKTsKKworICAgIFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShmZCwgJnRpZCwgMSkpOworCiAgICAgaWYodGlkX2F0dGFjaF9zdGF0dXMgPCAwKSB7CiAgICAgICAgIExPRygicHRyYWNlIGF0dGFjaCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICBnb3RvIGRvbmU7CkBAIC04NjMsMTAgKzY4OCwxMiBAQAogICAgIGlmKGZkICE9IC0xKSBjbG9zZShmZCk7CiB9CiAKKwogaW50IG1haW4oKQogewogICAgIGludCBzOwogICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworICAgIGludCBsb2dzb2NrZXQgPSAtMTsKIAogICAgIGxvZ3NvY2tldCA9IHNvY2tldF9sb2NhbF9jbGllbnQoImxvZ2QiLAogICAgICAgICAgICAgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX0FCU1RSQUNULCBTT0NLX0RHUkFNKTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuaCBiL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2NkYzdjCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXJkL2RlYnVnZ2VyZC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIHN5c3RlbS9kZWJ1Z2dlcmQvZGVidWdnZXJkLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPGN1dGlscy9sb2dkLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPHVud2luZC5oPgorI2luY2x1ZGUgInV0aWxpdHkuaCIKKyNpbmNsdWRlICJzeW1ib2xfdGFibGUuaCIKKworCisvKiBNYWluIGVudHJ5IHBvaW50IHRvIGdldCB0aGUgYmFja3RyYWNlIGZyb20gdGhlIGNyYXNoaW5nIHByb2Nlc3MgKi8KK2V4dGVybiBpbnQgdW53aW5kX2JhY2t0cmFjZV93aXRoX3B0cmFjZShpbnQgdGZkLCBwaWRfdCBwaWQsIG1hcGluZm8gKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3BfbGlzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZnJhbWUwX3BjX3NhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdF9mYXVsdCk7CisKK2V4dGVybiB2b2lkIGR1bXBfcmVnaXN0ZXJzKGludCB0ZmQsIGludCBwaWQsIGJvb2wgYXRfZmF1bHQpOworCitleHRlcm4gaW50IHVud2luZF9iYWNrdHJhY2Vfd2l0aF9wdHJhY2VfeDg2KGludCB0ZmQsIHBpZF90IHBpZCwgbWFwaW5mbyAqbWFwLCBib29sIGF0X2ZhdWx0KTsKKwordm9pZCBkdW1wX3BjX2FuZF9scihpbnQgdGZkLCBpbnQgcGlkLCBtYXBpbmZvICptYXAsIGludCB1bndvdW5kX2xldmVsLCBib29sIGF0X2ZhdWx0KTsKKwordm9pZCBkdW1wX3N0YWNrX2FuZF9jb2RlKGludCB0ZmQsIGludCBwaWQsIG1hcGluZm8gKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW53aW5kX2RlcHRoLCB1bnNpZ25lZCBpbnQgc3BfbGlzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXRfZmF1bHQpOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5jIGIvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTcyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvc3ltYm9sX3RhYmxlLmMKQEAgLTAsMCArMSwyNDAgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgInN5bWJvbF90YWJsZS5oIgorI2luY2x1ZGUgInV0aWxpdHkuaCIKKworI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorCisvLyBDb21wYXJlIGZ1bmMgZm9yIHFzb3J0CitzdGF0aWMgaW50IHFjb21wYXIoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICByZXR1cm4gKChzdHJ1Y3Qgc3ltYm9sKilhKS0+YWRkciAtICgoc3RydWN0IHN5bWJvbCopYiktPmFkZHI7Cit9CisKKy8vIENvbXBhcmUgZnVuYyBmb3IgYnNlYXJjaAorc3RhdGljIGludCBiY29tcGFyKGNvbnN0IHZvaWQgKmFkZHIsIGNvbnN0IHZvaWQgKmVsZW1lbnQpCit7CisgICAgc3RydWN0IHN5bWJvbCAqc3ltYm9sID0gKHN0cnVjdCBzeW1ib2wqKWVsZW1lbnQ7CisKKyAgICBpZigodW5zaWduZWQgaW50KWFkZHIgPCBzeW1ib2wtPmFkZHIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmKCh1bnNpZ25lZCBpbnQpYWRkciAtIHN5bWJvbC0+YWRkciA+PSBzeW1ib2wtPnNpemUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgQ3JlYXRlIGEgc3ltYm9sIHRhYmxlIGZyb20gYSBnaXZlbiBmaWxlCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGZpbGVuYW1lIC0gRmlsZW5hbWUgdG8gcHJvY2VzcworICoKKyAqICBSZXR1cm5zOgorICogICAgICBBIG5ld2x5LWFsbG9jYXRlZCBTeW1ib2xUYWJsZSBzdHJ1Y3R1cmUsIG9yIE5VTEwgaWYgZXJyb3IuCisgKiAgICAgIEZyZWUgc3ltYm9sIHRhYmxlIHdpdGggc3ltYm9sX3RhYmxlX2ZyZWUoKQorICovCitzdHJ1Y3Qgc3ltYm9sX3RhYmxlICpzeW1ib2xfdGFibGVfY3JlYXRlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHN0cnVjdCBzeW1ib2xfdGFibGUgKnRhYmxlID0gTlVMTDsKKworICAgIC8vIE9wZW4gdGhlIGZpbGUsIGFuZCBtYXAgaXQgaW50byBtZW1vcnkKKyAgICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgICBpbnQgbGVuZ3RoOworICAgIGNoYXIgKmJhc2U7CisKKyAgICBYTE9HMigiQ3JlYXRpbmcgc3ltYm9sIHRhYmxlIGZvciAlc1xuIiwgZmlsZW5hbWUpOworICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKworICAgIGlmKGZkIDwgMCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBmc3RhdChmZCwgJnNiKTsKKyAgICBsZW5ndGggPSBzYi5zdF9zaXplOworCisgICAgYmFzZSA9IG1tYXAoTlVMTCwgbGVuZ3RoLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisKKyAgICBpZighYmFzZSkgeworICAgICAgICBnb3RvIG91dF9jbG9zZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSB0aGUgZmlsZSBoZWFkZXIKKyAgICBFbGYzMl9FaGRyICpoZHIgPSAoRWxmMzJfRWhkciopYmFzZTsKKyAgICBFbGYzMl9TaGRyICpzaGRyID0gKEVsZjMyX1NoZHIqKShiYXNlICsgaGRyLT5lX3Nob2ZmKTsKKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGR5bmFtaWMgc3ltYm9scyBzZWN0aW9uCisgICAgaW50IHN5bV9pZHggPSAtMTsKKyAgICBpbnQgZHluc3ltX2lkeCA9IC0xOworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKKyAgICAgICAgaWYoc2hkcltpXS5zaF90eXBlID09IFNIVF9TWU1UQUIgKSB7CisgICAgICAgICAgICBzeW1faWR4ID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZihzaGRyW2ldLnNoX3R5cGUgPT0gU0hUX0RZTlNZTSApIHsKKyAgICAgICAgICAgIGR5bnN5bV9pZHggPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoZHluc3ltX2lkeCA9PSAtMSkgJiYgKHN5bV9pZHggPT0gLTEpKSB7CisgICAgICAgIGdvdG8gb3V0X3VubWFwOworICAgIH0KKworICAgIHRhYmxlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ltYm9sX3RhYmxlKSk7CisgICAgaWYoIXRhYmxlKSB7CisgICAgICAgIGdvdG8gb3V0X3VubWFwOworICAgIH0KKyAgICB0YWJsZS0+bmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CisgICAgdGFibGUtPm51bV9zeW1ib2xzID0gMDsKKworICAgIEVsZjMyX1N5bSAqZHluc3ltcyA9IE5VTEw7CisgICAgRWxmMzJfU3ltICpzeW1zID0gTlVMTDsKKyAgICBpbnQgZHlubnVtc3ltcyA9IDA7CisgICAgaW50IG51bXN5bXMgPSAwOworICAgIGNoYXIgKmR5bnN0ciA9IE5VTEw7CisgICAgY2hhciAqc3RyID0gTlVMTDsKKworICAgIGlmIChkeW5zeW1faWR4ICE9IC0xKSB7CisgICAgICAgIGR5bnN5bXMgPSAoRWxmMzJfU3ltKikoYmFzZSArIHNoZHJbZHluc3ltX2lkeF0uc2hfb2Zmc2V0KTsKKyAgICAgICAgZHlubnVtc3ltcyA9IHNoZHJbZHluc3ltX2lkeF0uc2hfc2l6ZSAvIHNoZHJbZHluc3ltX2lkeF0uc2hfZW50c2l6ZTsKKyAgICAgICAgaW50IGR5bnN0cl9pZHggPSBzaGRyW2R5bnN5bV9pZHhdLnNoX2xpbms7CisgICAgICAgIGR5bnN0ciA9IGJhc2UgKyBzaGRyW2R5bnN0cl9pZHhdLnNoX29mZnNldDsKKyAgICB9CisKKyAgICBpZiAoc3ltX2lkeCAhPSAtMSkgeworICAgICAgICBzeW1zID0gKEVsZjMyX1N5bSopKGJhc2UgKyBzaGRyW3N5bV9pZHhdLnNoX29mZnNldCk7CisgICAgICAgIG51bXN5bXMgPSBzaGRyW3N5bV9pZHhdLnNoX3NpemUgLyBzaGRyW3N5bV9pZHhdLnNoX2VudHNpemU7CisgICAgICAgIGludCBzdHJfaWR4ID0gc2hkcltzeW1faWR4XS5zaF9saW5rOworICAgICAgICBzdHIgPSBiYXNlICsgc2hkcltzdHJfaWR4XS5zaF9vZmZzZXQ7CisgICAgfQorCisgICAgaW50IHN5bWJvbF9jb3VudCA9IDA7CisgICAgaW50IGR5bnN5bWJvbF9jb3VudCA9IDA7CisKKyAgICBpZiAoZHluc3ltX2lkeCAhPSAtMSkgeworICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBhbmQgY291bnQgaG93IG1hbnkgc3ltYm9scworICAgICAgICAvLyBhcmUgYWN0dWFsbHkgZGVmaW5lZAorICAgICAgICBmb3IoaSA9IDA7IGkgPCBkeW5udW1zeW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmKGR5bnN5bXNbaV0uc3Rfc2huZHggIT0gU0hOX1VOREVGKSB7CisgICAgICAgICAgICAgICAgZHluc3ltYm9sX2NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWExPRzIoIkR5bmFtaWMgU3ltYm9sIGNvdW50OiAlZFxuIiwgZHluc3ltYm9sX2NvdW50KTsKKyAgICB9CisKKyAgICBpZiAoc3ltX2lkeCAhPSAtMSkgeworICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSwgYW5kIGNvdW50IGhvdyBtYW55IHN5bWJvbHMKKyAgICAgICAgLy8gYXJlIGFjdHVhbGx5IGRlZmluZWQKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgbnVtc3ltczsgaSsrKSB7CisgICAgICAgICAgICBpZigoc3ltc1tpXS5zdF9zaG5keCAhPSBTSE5fVU5ERUYpICYmCisgICAgICAgICAgICAgICAgKHN0cmxlbihzdHIrc3ltc1tpXS5zdF9uYW1lKSkgJiYKKyAgICAgICAgICAgICAgICAoc3ltc1tpXS5zdF92YWx1ZSAhPSAwKSAmJiAoc3ltc1tpXS5zdF9zaXplICE9IDApKSB7CisgICAgICAgICAgICAgICAgc3ltYm9sX2NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWExPRzIoIlN5bWJvbCBjb3VudDogJWRcbiIsIHN5bWJvbF9jb3VudCk7CisgICAgfQorCisgICAgLy8gTm93LCBjcmVhdGUgYW4gZW50cnkgaW4gb3VyIHN5bWJvbCB0YWJsZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggc3ltYm9sLi4uCisgICAgdGFibGUtPm51bV9zeW1ib2xzICs9IHN5bWJvbF9jb3VudCArIGR5bnN5bWJvbF9jb3VudDsKKyAgICB0YWJsZS0+c3ltYm9scyA9IG1hbGxvYyh0YWJsZS0+bnVtX3N5bWJvbHMgKiBzaXplb2Yoc3RydWN0IHN5bWJvbCkpOworICAgIGlmKCF0YWJsZS0+c3ltYm9scykgeworICAgICAgICBmcmVlKHRhYmxlKTsKKyAgICAgICAgdGFibGUgPSBOVUxMOworICAgICAgICBnb3RvIG91dF91bm1hcDsKKyAgICB9CisKKworICAgIGludCBqID0gMDsKKyAgICBpZiAoZHluc3ltX2lkeCAhPSAtMSkgeworICAgICAgICAvLyAuLi5hbmQgcG9wdWxhdGUgdGhlbQorICAgICAgICBmb3IoaSA9IDA7IGkgPCBkeW5udW1zeW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmKGR5bnN5bXNbaV0uc3Rfc2huZHggIT0gU0hOX1VOREVGKSB7CisgICAgICAgICAgICAgICAgdGFibGUtPnN5bWJvbHNbal0ubmFtZSA9IHN0cmR1cChkeW5zdHIgKyBkeW5zeW1zW2ldLnN0X25hbWUpOworICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLmFkZHIgPSBkeW5zeW1zW2ldLnN0X3ZhbHVlOworICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLnNpemUgPSBkeW5zeW1zW2ldLnN0X3NpemU7CisgICAgICAgICAgICAgICAgWExPRzIoIm5hbWU6ICVzLCBhZGRyOiAleCwgc2l6ZTogJXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLm5hbWUsIHRhYmxlLT5zeW1ib2xzW2pdLmFkZHIsIHRhYmxlLT5zeW1ib2xzW2pdLnNpemUpOworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzeW1faWR4ICE9IC0xKSB7CisgICAgICAgIC8vIC4uLmFuZCBwb3B1bGF0ZSB0aGVtCisgICAgICAgIGZvcihpID0gMDsgaSA8IG51bXN5bXM7IGkrKykgeworICAgICAgICAgICAgaWYoKHN5bXNbaV0uc3Rfc2huZHggIT0gU0hOX1VOREVGKSAmJgorICAgICAgICAgICAgICAgIChzdHJsZW4oc3RyK3N5bXNbaV0uc3RfbmFtZSkpICYmCisgICAgICAgICAgICAgICAgKHN5bXNbaV0uc3RfdmFsdWUgIT0gMCkgJiYgKHN5bXNbaV0uc3Rfc2l6ZSAhPSAwKSkgeworICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLm5hbWUgPSBzdHJkdXAoc3RyICsgc3ltc1tpXS5zdF9uYW1lKTsKKyAgICAgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5hZGRyID0gc3ltc1tpXS5zdF92YWx1ZTsKKyAgICAgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5zaXplID0gc3ltc1tpXS5zdF9zaXplOworICAgICAgICAgICAgICAgIFhMT0cyKCJuYW1lOiAlcywgYWRkcjogJXgsIHNpemU6ICV4XG4iLAorICAgICAgICAgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5uYW1lLCB0YWJsZS0+c3ltYm9sc1tqXS5hZGRyLCB0YWJsZS0+c3ltYm9sc1tqXS5zaXplKTsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTb3J0IHRoZSBzeW1ib2wgdGFibGUgZW50cmllcywgc28gdGhleSBjYW4gYmUgYnNlYXJjaGVkIGxhdGVyCisgICAgcXNvcnQodGFibGUtPnN5bWJvbHMsIHRhYmxlLT5udW1fc3ltYm9scywgc2l6ZW9mKHN0cnVjdCBzeW1ib2wpLCBxY29tcGFyKTsKKworb3V0X3VubWFwOgorICAgIG11bm1hcChiYXNlLCBsZW5ndGgpOworCitvdXRfY2xvc2U6CisgICAgY2xvc2UoZmQpOworCitvdXQ6CisgICAgcmV0dXJuIHRhYmxlOworfQorCisvKgorICogRnJlZSBhIHN5bWJvbCB0YWJsZQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgdGFibGUgLSBUYWJsZSB0byBmcmVlCisgKi8KK3ZvaWQgc3ltYm9sX3RhYmxlX2ZyZWUoc3RydWN0IHN5bWJvbF90YWJsZSAqdGFibGUpCit7CisgICAgaW50IGk7CisKKyAgICBpZighdGFibGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcihpPTA7IGk8dGFibGUtPm51bV9zeW1ib2xzOyBpKyspIHsKKyAgICAgICAgZnJlZSh0YWJsZS0+c3ltYm9sc1tpXS5uYW1lKTsKKyAgICB9CisKKyAgICBmcmVlKHRhYmxlLT5zeW1ib2xzKTsKKyAgICBmcmVlKHRhYmxlKTsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgYW4gYWRkcmVzcyBpbiB0aGUgc3ltYm9sIHRhYmxlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgdGFibGUgLSBUYWJsZSB0byBzZWFyY2ggaW4KKyAqICAgICAgYWRkciAtIEFkZHJlc3MgdG8gc2VhcmNoIGZvci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICBBIHBvaW50ZXIgdG8gdGhlIFN5bWJvbCBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqICAgICAgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIHRoaXMgYWRkcmVzcywgb3IgTlVMTCBpZiBubyBzeW1ib2wKKyAqICAgICAgY29udGFpbnMgaXQuCisgKi8KK2NvbnN0IHN0cnVjdCBzeW1ib2wgKnN5bWJvbF90YWJsZV9sb29rdXAoc3RydWN0IHN5bWJvbF90YWJsZSAqdGFibGUsIHVuc2lnbmVkIGludCBhZGRyKQoreworICAgIGlmKCF0YWJsZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYnNlYXJjaCgodm9pZCopYWRkciwgdGFibGUtPnN5bWJvbHMsIHRhYmxlLT5udW1fc3ltYm9scywgc2l6ZW9mKHN0cnVjdCBzeW1ib2wpLCBiY29tcGFyKTsKK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9zeW1ib2xfdGFibGUuaCBiL2RlYnVnZ2VyZC9zeW1ib2xfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQxZjkxCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgU1lNQk9MX1RBQkxFX0gKKyNkZWZpbmUgU1lNQk9MX1RBQkxFX0gKKworc3RydWN0IHN5bWJvbCB7CisgICAgdW5zaWduZWQgaW50IGFkZHI7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBzeW1ib2xfdGFibGUgeworICAgIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHM7CisgICAgaW50IG51bV9zeW1ib2xzOworICAgIGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3Qgc3ltYm9sX3RhYmxlICpzeW1ib2xfdGFibGVfY3JlYXRlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3ZvaWQgc3ltYm9sX3RhYmxlX2ZyZWUoc3RydWN0IHN5bWJvbF90YWJsZSAqdGFibGUpOworY29uc3Qgc3RydWN0IHN5bWJvbCAqc3ltYm9sX3RhYmxlX2xvb2t1cChzdHJ1Y3Qgc3ltYm9sX3RhYmxlICp0YWJsZSwgdW5zaWduZWQgaW50IGFkZHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC91dGlsaXR5LmMgYi9kZWJ1Z2dlcmQvdXRpbGl0eS5jCmluZGV4IDhmMzkzMWMuLjJhZmRiNDYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC91dGlsaXR5LmMKKysrIGIvZGVidWdnZXJkL3V0aWxpdHkuYwpAQCAtMzgsMTQgKzM4LDE0IEBACiAgICAgdW5zaWduZWQgaW50IGk7CiAKICAgICBmb3IgKGkgPSAwOyBpKzQgPD0gc2l6ZTsgaSs9NCkgewotICAgICAgICAqKGludCAqKShkc3QraSkgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsIHNyYytpLCBOVUxMKTsKKyAgICAgICAgKihpbnQgKikoKGNoYXIgKilkc3QraSkgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsIChjaGFyICopc3JjK2ksIE5VTEwpOwogICAgIH0KIAogICAgIGlmIChpIDwgc2l6ZSkgewogICAgICAgICBpbnQgdmFsOwogCiAgICAgICAgIGFzc2VydCgoc2l6ZSAtIGkpIDwgNCk7Ci0gICAgICAgIHZhbCA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgc3JjK2ksIE5VTEwpOworICAgICAgICB2YWwgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsIChjaGFyICopc3JjK2ksIE5VTEwpOwogICAgICAgICB3aGlsZSAoaSA8IHNpemUpIHsKICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciAqKWRzdClbaV0gPSB2YWwgJiAweGZmOwogICAgICAgICAgICAgaSsrOwpAQCAtNjksMTEgKzY5LDEyIEBACiAvKiBGaW5kIHRoZSBjb250YWluaW5nIG1hcCBpbmZvIGZvciB0aGUgcGMgKi8KIGNvbnN0IG1hcGluZm8gKnBjX3RvX21hcGluZm8obWFwaW5mbyAqbWksIHVuc2lnbmVkIHBjLCB1bnNpZ25lZCAqcmVsX3BjKQogeworICAgICpyZWxfcGMgPSBwYzsKICAgICB3aGlsZShtaSkgewogICAgICAgICBpZigocGMgPj0gbWktPnN0YXJ0KSAmJiAocGMgPCBtaS0+ZW5kKSl7CiAgICAgICAgICAgICAvLyBPbmx5IGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgb2Zmc2V0IGZvciBzaGFyZWQgbGlicmFyaWVzCiAgICAgICAgICAgICBpZiAoc3Ryc3RyKG1pLT5uYW1lLCAiLnNvIikpIHsKLSAgICAgICAgICAgICAgICAqcmVsX3BjID0gcGMgLSBtaS0+c3RhcnQ7CisgICAgICAgICAgICAgICAgKnJlbF9wYyAtPSBtaS0+c3RhcnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbWk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC91dGlsaXR5LmggYi9kZWJ1Z2dlcmQvdXRpbGl0eS5oCmluZGV4IDQ5ZjU5NTEuLjQ1ZTIwNjcgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC91dGlsaXR5LmgKKysrIGIvZGVidWdnZXJkL3V0aWxpdHkuaApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAorI2luY2x1ZGUgInN5bWJvbF90YWJsZS5oIgorCiAjaWZuZGVmIFBUX0FSTV9FWElEWAogI2RlZmluZSBQVF9BUk1fRVhJRFggICAgMHg3MDAwMDAwMSAgICAgIC8qIC5BUk0uZXhpZHggc2VnbWVudCAqLwogI2VuZGlmCkBAIC0zMyw2ICszNSw3IEBACiAgICAgdW5zaWduZWQgZW5kOwogICAgIHVuc2lnbmVkIGV4aWR4X3N0YXJ0OwogICAgIHVuc2lnbmVkIGV4aWR4X2VuZDsKKyAgICBzdHJ1Y3Qgc3ltYm9sX3RhYmxlICpzeW1ib2xzOwogICAgIGNoYXIgbmFtZVtdOwogfSBtYXBpbmZvOwogCkBAIC01Myw0ICs1NiwyMCBAQAogLyogTG9nIGluZm9ybWF0aW9uIG9udG8gdGhlIHRvbWJzdG9uZSAqLwogZXh0ZXJuIHZvaWQgX0xPRyhpbnQgdGZkLCBib29sIGluX3RvbWJzdG9uZV9vbmx5LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKKyNkZWZpbmUgTE9HKGZtdC4uLikgX0xPRygtMSwgMCwgZm10KQorCisvKiBTZXQgdG8gMSBmb3Igbm9ybWFsIGRlYnVnIHRyYWNlcyAqLworI2lmIDAKKyNkZWZpbmUgWExPRyhmbXQuLi4pIF9MT0coLTEsIDAsIGZtdCkKKyNlbHNlCisjZGVmaW5lIFhMT0coZm10Li4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIFNldCB0byAxIGZvciBjaGF0dHkgZGVidWcgdHJhY2VzLiBJbmNsdWRlcyBhbGwgcmVzb2x2ZWQgZHluYW1pYyBzeW1ib2xzICovCisjaWYgMAorI2RlZmluZSBYTE9HMihmbXQuLi4pIF9MT0coLTEsIDAsIGZtdCkKKyNlbHNlCisjZGVmaW5lIFhMT0cyKGZtdC4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC94ODYvY3Jhc2hnbHVlLlMgYi9kZWJ1Z2dlcmQveDg2L2NyYXNoZ2x1ZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGY0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQveDg2L2NyYXNoZ2x1ZS5TCkBAIC0wLDAgKzEsMTUgQEAKKy5nbG9ibCBjcmFzaDEKKy5nbG9ibCBjcmFzaG5vc3RhY2sKKworY3Jhc2gxOgorCW1vdmwgJDB4YTVhNTAwMDAsICVlYXgKKwltb3ZsICQweGE1YTUwMDAxLCAlZWJ4CisJbW92bCAkMHhhNWE1MDAwMiwgJWVjeAorCisJbW92bCAkMCwgJWVkeAorCWptcCAqJWVkeAorCisKK2NyYXNobm9zdGFjazoKKwltb3ZsICQwLCAlZWJwCisJam1wIColZWJwCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQveDg2L21hY2hpbmUuYyBiL2RlYnVnZ2VyZC94ODYvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDE4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQveDg2L21hY2hpbmUuYwpAQCAtMCwwICsxLDYxIEBACisvKiBzeXN0ZW0vZGVidWdnZXJkL2RlYnVnZ2VyZC5jCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvZXhlY19lbGYuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgIi4uL3V0aWxpdHkuaCIKKyNpbmNsdWRlICJ4ODZfdXRpbGl0eS5oIgorCit2b2lkIGR1bXBfcmVnaXN0ZXJzKGludCB0ZmQsIGludCBwaWQsIGJvb2wgYXRfZmF1bHQpCit7CisgICAgc3RydWN0IHB0X3JlZ3NfeDg2IHI7CisgICAgYm9vbCBvbmx5X2luX3RvbWJzdG9uZSA9ICFhdF9mYXVsdDsKKworICAgIGlmKHB0cmFjZShQVFJBQ0VfR0VUUkVHUywgcGlkLCAwLCAmcikpIHsKKyAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAorICAgICAgICAgICAgICJjYW5ub3QgZ2V0IHJlZ2lzdGVyczogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisvL2lmIHRoZXJlIGlzIG5vIHN0YWNrLCBubyBwcmludCBqdXN0IGxpa2UgYXJtCisgICAgaWYoIXIuZWJwKQorICAgICAgICByZXR1cm47CisgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIGVheCAlMDh4ICBlYnggJTA4eCAgZWN4ICUwOHggIGVkeCAlMDh4XG4iLAorICAgICAgICAgci5lYXgsIHIuZWJ4LCByLmVjeCwgci5lZHgpOworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiBlc2kgJTA4eCAgZWRpICUwOHhcbiIsCisgICAgICAgICByLmVzaSwgci5lZGkpOworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiB4Y3MgJTA4eCAgeGRzICUwOHggIHhlcyAlMDh4ICB4ZnMgJTA4eCB4c3MgJTA4eFxuIiwKKyAgICAgICAgIHIueGNzLCByLnhkcywgci54ZXMsIHIueGZzLCByLnhzcyk7CisgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAorICAgICAgICAgIiBlaXAgJTA4eCAgZWJwICUwOHggIGVzcCAlMDh4ICBmbGFncyAlMDh4XG4iLAorICAgICAgICAgci5laXAsIHIuZWJwLCByLmVzcCwgci5lZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3g4Ni91bndpbmQuYyBiL2RlYnVnZ2VyZC94ODYvdW53aW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4NGUwMQotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC94ODYvdW53aW5kLmMKQEAgLTAsMCArMSw4NSBAQAorI2luY2x1ZGUgPGN1dGlscy9sb2dkLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgIi4uL3V0aWxpdHkuaCIKKyNpbmNsdWRlICJ4ODZfdXRpbGl0eS5oIgorCisKK2ludCB1bndpbmRfYmFja3RyYWNlX3dpdGhfcHRyYWNlX3g4NihpbnQgdGZkLCBwaWRfdCBwaWQsIG1hcGluZm8gKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXRfZmF1bHQpCit7CisgICAgc3RydWN0IHB0X3JlZ3NfeDg2IHI7CisgICAgdW5zaWduZWQgaW50IHN0YWNrX2xldmVsID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc3RhY2tfZGVwdGggPSAwOworICAgIHVuc2lnbmVkIGludCByZWxfcGM7CisgICAgdW5zaWduZWQgaW50IHN0YWNrX3B0cjsKKyAgICB1bnNpZ25lZCBpbnQgc3RhY2tfY29udGVudDsKKworICAgIGlmKHB0cmFjZShQVFJBQ0VfR0VUUkVHUywgcGlkLCAwLCAmcikpIHJldHVybiAwOworICAgIHVuc2lnbmVkIGludCBlaXAgPSAodW5zaWduZWQgaW50KXIuZWlwOworICAgIHVuc2lnbmVkIGludCBlYnAgPSAodW5zaWduZWQgaW50KXIuZWJwOworICAgIHVuc2lnbmVkIGludCBjdXJfc3AgPSAodW5zaWduZWQgaW50KXIuZXNwOworICAgIGNvbnN0IG1hcGluZm8gKm1pOworICAgIGNvbnN0IHN0cnVjdCBzeW1ib2wqIHN5bSA9IDA7CisKKworLy9lYnA9PTAsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBzdGFjayBpcyBwb3BlZCB0byB0aGUgYm90dG9tIG9yIHRoZXJlIGlzIG5vIHN0YWNrIGF0IGFsbC4KKyAgICB3aGlsZSAoZWJwKSB7CisgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIjMCVkICIsc3RhY2tfbGV2ZWwpOworICAgICAgICBtaSA9IHBjX3RvX21hcGluZm8obWFwLCBlaXAsICZyZWxfcGMpOworCisgICAgICAgIC8qIFNlZSBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHdoYXQgc3ltYm9sIHRoaXMgc3RhY2sgZnJhbWUgcmVzaWRlcyBpbiAqLworICAgICAgICBpZiAobWkgIT0gMCAmJiBtaS0+c3ltYm9scyAhPSAwKSB7CisgICAgICAgICAgICBzeW0gPSBzeW1ib2xfdGFibGVfbG9va3VwKG1pLT5zeW1ib2xzLCByZWxfcGMpOworICAgICAgICB9CisgICAgICAgIGlmIChzeW0pIHsKKyAgICAgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgZWlwOiAlMDh4ICAlcyAoJXMpXG4iLCBlaXAsIG1pID8gbWktPm5hbWUgOiAiIiwgc3ltLT5uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgZWlwOiAlMDh4ICAlc1xuIiwgZWlwLCBtaSA/IG1pLT5uYW1lIDogIiIpOworICAgICAgICB9CisKKyAgICAgICAgc3RhY2tfbGV2ZWwrKzsKKyAgICAgICAgaWYgKHN0YWNrX2xldmVsID49IFNUQUNLX0RFUFRIIHx8IGVpcCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVpcCA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKHZvaWQqKShlYnAgKyA0KSwgTlVMTCk7CisgICAgICAgIGVicCA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKHZvaWQqKWVicCwgTlVMTCk7CisgICAgfQorICAgIGVicCA9ICh1bnNpZ25lZCBpbnQpci5lYnA7CisgICAgc3RhY2tfZGVwdGggPSBzdGFja19sZXZlbDsKKyAgICBzdGFja19sZXZlbCA9IDA7CisgICAgaWYgKGVicCkKKyAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgInN0YWNrOiBcbiIpOworICAgIHdoaWxlIChlYnApIHsKKyAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiMwJWQgXG4iLHN0YWNrX2xldmVsKTsKKyAgICAgICAgc3RhY2tfcHRyID0gY3VyX3NwOworICAgICAgICB3aGlsZSgoaW50KShlYnAgLSBzdGFja19wdHIpID49IDApIHsKKyAgICAgICAgICAgIHN0YWNrX2NvbnRlbnQgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilzdGFja19wdHIsIE5VTEwpOworICAgICAgICAgICAgbWkgPSBwY190b19tYXBpbmZvKG1hcCwgc3RhY2tfY29udGVudCwgJnJlbF9wYyk7CisKKyAgICAgICAgICAgIC8qIFNlZSBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHdoYXQgc3ltYm9sIHRoaXMgc3RhY2sgZnJhbWUgcmVzaWRlcyBpbiAqLworICAgICAgICAgICAgaWYgKG1pICE9IDAgJiYgbWktPnN5bWJvbHMgIT0gMCkgeworICAgICAgICAgICAgICAgIHN5bSA9IHN5bWJvbF90YWJsZV9sb29rdXAobWktPnN5bWJvbHMsIHJlbF9wYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3ltKSB7CisgICAgICAgICAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiAgICAlMDh4ICAlMDh4ICAlcyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICBzdGFja19wdHIsIHN0YWNrX2NvbnRlbnQsIG1pID8gbWktPm5hbWUgOiAiIiwgc3ltLT5uYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiAgICAlMDh4ICAlMDh4ICAlc1xuIiwgc3RhY2tfcHRyLCBzdGFja19jb250ZW50LCBtaSA/IG1pLT5uYW1lIDogIiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFja19wdHIgPSBzdGFja19wdHIgKyA0OworICAgICAgICAgICAgLy90aGUgc3RhY2sgZnJhbWUgbWF5IGJlIHZlcnkgZGVlcC4KKyAgICAgICAgICAgIGlmKChpbnQpKHN0YWNrX3B0ciAtIGN1cl9zcCkgPj0gU1RBQ0tfRlJBTUVfREVQVEgpIHsKKyAgICAgICAgICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgIC4uLi4uLiAgLi4uLi4uICBcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGN1cl9zcCA9IGVicCArIDQ7CisgICAgICAgIHN0YWNrX2xldmVsKys7CisgICAgICAgIGlmIChzdGFja19sZXZlbCA+PSBTVEFDS19ERVBUSCB8fCBzdGFja19sZXZlbCA+PSBzdGFja19kZXB0aCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlYnAgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKillYnAsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBzdGFja19kZXB0aDsKK30KKwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3g4Ni94ODZfdXRpbGl0eS5oIGIvZGVidWdnZXJkL3g4Ni94ODZfdXRpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNmE4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQveDg2L3g4Nl91dGlsaXR5LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBTVEFDS19ERVBUSCA4CisjZGVmaW5lIFNUQUNLX0ZSQU1FX0RFUFRIIDY0CisKK3R5cGVkZWYgc3RydWN0IHB0X3JlZ3NfeDg2IHsKKyAgICBsb25nIGVieDsKKyAgICBsb25nIGVjeDsKKyAgICBsb25nIGVkeDsKKyAgICBsb25nIGVzaTsKKyAgICBsb25nIGVkaTsKKyAgICBsb25nIGVicDsKKyAgICBsb25nIGVheDsKKyAgICBpbnQgIHhkczsKKyAgICBpbnQgIHhlczsKKyAgICBpbnQgIHhmczsKKyAgICBpbnQgIHhnczsKKyAgICBsb25nIG9yaWdfZWF4OworICAgIGxvbmcgZWlwOworICAgIGludCAgeGNzOworICAgIGxvbmcgZWZsYWdzOworICAgIGxvbmcgZXNwOworICAgIGludCAgeHNzOworfXB0X3JlZ3NfeDg2OworCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9BbmRyb2lkLm1rIGIvZmFzdGJvb3QvQW5kcm9pZC5tawppbmRleCAzNDM4MGVjLi4zYzU1MzhmIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9BbmRyb2lkLm1rCisrKyBiL2Zhc3Rib290L0FuZHJvaWQubWsKQEAgLTUwLDcgKzUwLDcgQEAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gJChFWFRSQV9TVEFUSUNfTElCUykgbGliemlwZmlsZSBsaWJ1bnoKIAogaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLSQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZCwkKExPQ0FMX0JVSUxUX01PRFVMRSkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsZGlzdF9maWxlcywkKExPQ0FMX0JVSUxUX01PRFVMRSkpCiAKIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2VuZ2luZS5jIGIvZmFzdGJvb3QvZW5naW5lLmMKaW5kZXggOGJhMjAyYy4uNmQ5NDAzNSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZW5naW5lLmMKKysrIGIvZmFzdGJvb3QvZW5naW5lLmMKQEAgLTY5LDYgKzY5LDcgQEAKICAgICBBY3Rpb24gKm5leHQ7CiAKICAgICBjaGFyIGNtZFs2NF07ICAgIAorICAgIGNvbnN0IGNoYXIgKnByb2Q7CiAgICAgdm9pZCAqZGF0YTsKICAgICB1bnNpZ25lZCBzaXplOwogCkBAIC05NywxNCArOTgsMjAgQEAKIHsKICAgICBBY3Rpb24gKmE7CiAgICAgdmFfbGlzdCBhcDsKKyAgICBzaXplX3QgY21kc2l6ZTsKIAogICAgIGEgPSBjYWxsb2MoMSwgc2l6ZW9mKEFjdGlvbikpOwogICAgIGlmIChhID09IDApIGRpZSgib3V0IG9mIG1lbW9yeSIpOwogCiAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgdnNwcmludGYoYS0+Y21kLCBmbXQsIGFwKTsKKyAgICBjbWRzaXplID0gdnNucHJpbnRmKGEtPmNtZCwgc2l6ZW9mKGEtPmNtZCksIGZtdCwgYXApOwogICAgIHZhX2VuZChhcCk7CiAKKyAgICBpZiAoY21kc2l6ZSA+PSBzaXplb2YoYS0+Y21kKSkgeworICAgICAgICBmcmVlKGEpOworICAgICAgICBkaWUoIkNvbW1hbmQgbGVuZ3RoICglZCkgZXhjZWVkcyBtYXhpbXVtIHNpemUgKCVkKSIsIGNtZHNpemUsIHNpemVvZihhLT5jbWQpKTsKKyAgICB9CisKICAgICBpZiAoYWN0aW9uX2xhc3QpIHsKICAgICAgICAgYWN0aW9uX2xhc3QtPm5leHQgPSBhOwogICAgIH0gZWxzZSB7CkBAIC0xNzcsNiArMTg0LDE2IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgaWYgKGEtPnByb2QpIHsKKyAgICAgICAgaWYgKHN0cmNtcChhLT5wcm9kLCBjdXJfcHJvZHVjdCkgIT0gMCkgeworICAgICAgICAgICAgZG91YmxlIHNwbGl0ID0gbm93KCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiSUdOT1JFLCBwcm9kdWN0IGlzICVzIHJlcXVpcmVkIG9ubHkgZm9yICVzIFslNy4zZnNdXG4iLAorICAgICAgICAgICAgICAgICAgICBjdXJfcHJvZHVjdCwgYS0+cHJvZCwgKHNwbGl0IC0gYS0+c3RhcnQpKTsKKyAgICAgICAgICAgIGEtPnN0YXJ0ID0gc3BsaXQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHllcyA9IG1hdGNoKHJlc3AsIHZhbHVlLCBjb3VudCk7CiAgICAgaWYgKGludmVydCkgeWVzID0gIXllczsKIApAQCAtMjA4LDEwICsyMjUsMTIgQEAKICAgICByZXR1cm4gY2JfY2hlY2soYSwgc3RhdHVzLCByZXNwLCAxKTsKIH0KIAotdm9pZCBmYl9xdWV1ZV9yZXF1aXJlKGNvbnN0IGNoYXIgKnZhciwgaW50IGludmVydCwgdW5zaWduZWQgbnZhbHVlcywgY29uc3QgY2hhciAqKnZhbHVlKQordm9pZCBmYl9xdWV1ZV9yZXF1aXJlKGNvbnN0IGNoYXIgKnByb2QsIGNvbnN0IGNoYXIgKnZhciwKKwkJaW50IGludmVydCwgdW5zaWduZWQgbnZhbHVlcywgY29uc3QgY2hhciAqKnZhbHVlKQogewogICAgIEFjdGlvbiAqYTsKICAgICBhID0gcXVldWVfYWN0aW9uKE9QX1FVRVJZLCAiZ2V0dmFyOiVzIiwgdmFyKTsKKyAgICBhLT5wcm9kID0gcHJvZDsKICAgICBhLT5kYXRhID0gdmFsdWU7CiAgICAgYS0+c2l6ZSA9IG52YWx1ZXM7CiAgICAgYS0+bXNnID0gbWttc2coImNoZWNraW5nICVzIiwgdmFyKTsKQEAgLTIzOCw2ICsyNTcsMjUgQEAKICAgICBhLT5mdW5jID0gY2JfZGlzcGxheTsKIH0KIAorc3RhdGljIGludCBjYl9zYXZlKEFjdGlvbiAqYSwgaW50IHN0YXR1cywgY2hhciAqcmVzcCkKK3sKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgRkFJTEVEICglcylcbiIsIGEtPmNtZCwgcmVzcCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0cm5jcHkoYS0+ZGF0YSwgcmVzcCwgYS0+c2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmJfcXVldWVfcXVlcnlfc2F2ZShjb25zdCBjaGFyICp2YXIsIGNoYXIgKmRlc3QsIHVuc2lnbmVkIGRlc3Rfc2l6ZSkKK3sKKyAgICBBY3Rpb24gKmE7CisgICAgYSA9IHF1ZXVlX2FjdGlvbihPUF9RVUVSWSwgImdldHZhcjolcyIsIHZhcik7CisgICAgYS0+ZGF0YSA9ICh2b2lkICopZGVzdDsKKyAgICBhLT5zaXplID0gZGVzdF9zaXplOworICAgIGEtPmZ1bmMgPSBjYl9zYXZlOworfQorCiBzdGF0aWMgaW50IGNiX2RvX25vdGhpbmcoQWN0aW9uICphLCBpbnQgc3RhdHVzLCBjaGFyICpyZXNwKQogewogICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwpAQCAtMjcxLDExICszMDksMTEgQEAKICAgICBhLT5kYXRhID0gKHZvaWQqKSBub3RpY2U7CiB9CiAKLXZvaWQgZmJfZXhlY3V0ZV9xdWV1ZSh1c2JfaGFuZGxlICp1c2IpCitpbnQgZmJfZXhlY3V0ZV9xdWV1ZSh1c2JfaGFuZGxlICp1c2IpCiB7CiAgICAgQWN0aW9uICphOwogICAgIGNoYXIgcmVzcFtGQl9SRVNQT05TRV9TWisxXTsKLSAgICBpbnQgc3RhdHVzOworICAgIGludCBzdGF0dXMgPSAwOwogCiAgICAgYSA9IGFjdGlvbl9saXN0OwogICAgIHJlc3BbRkJfUkVTUE9OU0VfU1pdID0gMDsKQEAgLTMwOCw1ICszNDYsNSBAQAogICAgIH0KIAogICAgIGZwcmludGYoc3RkZXJyLCJmaW5pc2hlZC4gdG90YWwgdGltZTogJS4zZnNcbiIsIChub3coKSAtIHN0YXJ0KSk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KLQpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZmFzdGJvb3QuYyBiL2Zhc3Rib290L2Zhc3Rib290LmMKaW5kZXggZjNiZmJlYmEuLjRhMmRlMjAgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Zhc3Rib290LmMKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3QuYwpAQCAtOSw3ICs5LDcgQEAKICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAgKiAgICBkaXN0cmlidXRpb24uCiAgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwpAQCAtMTksNyArMTksNyBAQAogICogQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAogICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKICAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwotICogT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIAorICogT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECiAgKiBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgpAQCAtNDIsNiArNDIsOCBAQAogCiAjaW5jbHVkZSAiZmFzdGJvb3QuaCIKIAorY2hhciBjdXJfcHJvZHVjdFtGQl9SRVNQT05TRV9TWiArIDFdOworCiB2b2lkIGJvb3RpbWdfc2V0X2NtZGxpbmUoYm9vdF9pbWdfaGRyICpoLCBjb25zdCBjaGFyICpjbWRsaW5lKTsKIAogYm9vdF9pbWdfaGRyICpta2Jvb3RpbWcodm9pZCAqa2VybmVsLCB1bnNpZ25lZCBrZXJuZWxfc2l6ZSwKQEAgLTY4LDcgKzcwLDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKICAgICB2YV9lbmQoYXApOwogICAgIGV4aXQoMSk7Ci19ICAgIAorfQogCiB2b2lkIGdldF9teV9wYXRoKGNoYXIgKnBhdGgpOwogCkBAIC05OSwxMyArMTAxLDEzIEBACiAgICAgICAgICAgICAgICAgIi4uLy4uLy4uL3RhcmdldC9wcm9kdWN0LyVzLyVzIiwgcHJvZHVjdCwgZm4pOwogICAgICAgICByZXR1cm4gc3RyZHVwKHBhdGgpOwogICAgIH0KLSAgICAgICAgCisKICAgICBkaXIgPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKICAgICBpZigoZGlyID09IDApIHx8IChkaXJbMF0gPT0gMCkpIHsKICAgICAgICAgZGllKCJuZWl0aGVyIC1wIHByb2R1Y3Qgc3BlY2lmaWVkIG5vciBBTkRST0lEX1BST0RVQ1RfT1VUIHNldCIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICBzcHJpbnRmKHBhdGgsICIlcy8lcyIsIGRpciwgZm4pOwogICAgIHJldHVybiBzdHJkdXAocGF0aCk7CiB9CkBAIC0xODksMTIgKzE5MSwxMiBAQAogICAgIGludCBhbm5vdW5jZSA9IDE7CiAKICAgICBpZih1c2IpIHJldHVybiB1c2I7Ci0gICAgCisKICAgICBmb3IoOzspIHsKICAgICAgICAgdXNiID0gdXNiX29wZW4obWF0Y2hfZmFzdGJvb3QpOwogICAgICAgICBpZih1c2IpIHJldHVybiB1c2I7CiAgICAgICAgIGlmKGFubm91bmNlKSB7Ci0gICAgICAgICAgICBhbm5vdW5jZSA9IDA7ICAgIAorICAgICAgICAgICAgYW5ub3VuY2UgPSAwOwogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIjwgd2FpdGluZyBmb3IgZGV2aWNlID5cbiIpOwogICAgICAgICB9CiAgICAgICAgIHNsZWVwKDEpOwpAQCAtMjIzLDggKzIyNSwxMCBAQAogICAgICAgICAgICAgIiAgYm9vdCA8a2VybmVsPiBbIDxyYW1kaXNrPiBdICAgICAgICAgICAgICBkb3dubG9hZCBhbmQgYm9vdCBrZXJuZWxcbiIKICAgICAgICAgICAgICIgIGZsYXNoOnJhdyBib290IDxrZXJuZWw+IFsgPHJhbWRpc2s+IF0gICAgY3JlYXRlIGJvb3RpbWFnZSBhbmQgZmxhc2ggaXRcbiIKICAgICAgICAgICAgICIgIGRldmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBhbGwgY29ubmVjdGVkIGRldmljZXNcbiIKKyAgICAgICAgICAgICIgIGNvbnRpbnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgd2l0aCBhdXRvYm9vdFxuIgogICAgICAgICAgICAgIiAgcmVib290ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJvb3QgZGV2aWNlIG5vcm1hbGx5XG4iCiAgICAgICAgICAgICAiICByZWJvb3QtYm9vdGxvYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHJlYm9vdCBkZXZpY2UgaW50byBib290bG9hZGVyXG4iCisgICAgICAgICAgICAiICBoZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2VcbiIKICAgICAgICAgICAgICJcbiIKICAgICAgICAgICAgICJvcHRpb25zOlxuIgogICAgICAgICAgICAgIiAgLXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZSB1c2VyZGF0YSBhbmQgY2FjaGVcbiIKQEAgLTIzNSw3ICsyMzksNiBAQAogICAgICAgICAgICAgIiAgLWIgPGJhc2VfYWRkcj4gICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGEgY3VzdG9tIGtlcm5lbCBiYXNlIGFkZHJlc3NcbiIKICAgICAgICAgICAgICIgIC1uIDxwYWdlIHNpemU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGUgbmFuZCBwYWdlIHNpemUuIGRlZmF1bHQ6IDIwNDhcbiIKICAgICAgICAgKTsKLSAgICBleGl0KDEpOwogfQogCiB2b2lkICpsb2FkX2Jvb3RhYmxlX2ltYWdlKHVuc2lnbmVkIHBhZ2Vfc2l6ZSwgY29uc3QgY2hhciAqa2VybmVsLCBjb25zdCBjaGFyICpyYW1kaXNrLApAQCAtMjU2LDE2ICsyNTksMTYgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYW5ub3QgbG9hZCAnJXMnXG4iLCBrZXJuZWwpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAgICAgLyogaXMgdGhpcyBhY3R1YWxseSBhIGJvb3QgaW1hZ2U/ICovCiAgICAgaWYoIW1lbWNtcChrZGF0YSwgQk9PVF9NQUdJQywgQk9PVF9NQUdJQ19TSVpFKSkgewogICAgICAgICBpZihjbWRsaW5lKSBib290aW1nX3NldF9jbWRsaW5lKChib290X2ltZ19oZHIqKSBrZGF0YSwgY21kbGluZSk7Ci0gICAgICAgIAorCiAgICAgICAgIGlmKHJhbWRpc2spIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Fubm90IGJvb3QgYSBib290LmltZyAqYW5kKiByYW1kaXNrXG4iKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgICpzeiA9IGtzaXplOwogICAgICAgICByZXR1cm4ga2RhdGE7CiAgICAgfQpAQCAtMjg3LDcgKzI5MCw3IEBACiAgICAgaWYoY21kbGluZSkgYm9vdGltZ19zZXRfY21kbGluZSgoYm9vdF9pbWdfaGRyKikgYmRhdGEsIGNtZGxpbmUpOwogICAgIGZwcmludGYoc3RkZXJyLCJjcmVhdGluZyBib290IGltYWdlIC0gJWQgYnl0ZXNcbiIsIGJzaXplKTsKICAgICAqc3ogPSBic2l6ZTsKLSAgICAKKwogICAgIHJldHVybiBiZGF0YTsKIH0KIApAQCAtMjk2LDcgKzI5OSw3IEBACiAgICAgdm9pZCAqZGF0YTsKICAgICB6aXBlbnRyeV90IGVudHJ5OwogICAgIHVuc2lnbmVkIGRhdGFzejsKLSAgICAKKwogICAgIGVudHJ5ID0gbG9va3VwX3ppcGVudHJ5KHppcCwgbmFtZSk7CiAgICAgaWYgKGVudHJ5ID09IE5VTEwpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhcmNoaXZlIGRvZXMgbm90IGNvbnRhaW4gJyVzJ1xuIiwgbmFtZSk7CkBAIC0zMzksMTYgKzM0MiwyNSBAQAogewogICAgIGNoYXIgKnZhbFtNQVhfT1BUSU9OU107CiAgICAgY29uc3QgY2hhciAqKm91dDsKKyAgICBjaGFyICpwcm9kID0gTlVMTDsKICAgICB1bnNpZ25lZCBuLCBjb3VudDsKICAgICBjaGFyICp4OwogICAgIGludCBpbnZlcnQgPSAwOwotICAgIAorCiAgICAgaWYgKCFzdHJuY21wKG5hbWUsICJyZWplY3QgIiwgNykpIHsKICAgICAgICAgbmFtZSArPSA3OwogICAgICAgICBpbnZlcnQgPSAxOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobmFtZSwgInJlcXVpcmUgIiwgOCkpIHsKICAgICAgICAgbmFtZSArPSA4OwogICAgICAgICBpbnZlcnQgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobmFtZSwgInJlcXVpcmUtZm9yLXByb2R1Y3Q6IiwgMjApKSB7CisgICAgICAgIC8vIEdldCB0aGUgcHJvZHVjdCBhbmQgcG9pbnQgbmFtZSBwYXN0IGl0CisgICAgICAgIHByb2QgPSBuYW1lICsgMjA7CisgICAgICAgIG5hbWUgPSBzdHJjaHIobmFtZSwgJyAnKTsKKyAgICAgICAgaWYgKCFuYW1lKSByZXR1cm4gLTE7CisgICAgICAgICpuYW1lID0gMDsKKyAgICAgICAgbmFtZSArPSAxOworICAgICAgICBpbnZlcnQgPSAwOwogICAgIH0KIAogICAgIHggPSBzdHJjaHIobmFtZSwgJz0nKTsKQEAgLTM2MiwxMCArMzc0LDEwIEBACiAgICAgICAgICp4ID0gMDsKICAgICAgICAgdmFsW2NvdW50XSA9IHggKyAxOwogICAgIH0KLSAgICAKKwogICAgIG5hbWUgPSBzdHJpcChuYW1lKTsKICAgICBmb3IobiA9IDA7IG4gPCBjb3VudDsgbisrKSB2YWxbbl0gPSBzdHJpcCh2YWxbbl0pOwotICAgIAorCiAgICAgbmFtZSA9IHN0cmlwKG5hbWUpOwogICAgIGlmIChuYW1lID09IDApIHJldHVybiAtMTsKIApAQCAtMzgwLDcgKzM5Miw3IEBACiAgICAgICAgIGlmIChvdXRbbl0gPT0gMCkgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGZiX3F1ZXVlX3JlcXVpcmUobmFtZSwgaW52ZXJ0LCBuLCBvdXQpOworICAgIGZiX3F1ZXVlX3JlcXVpcmUocHJvZCwgbmFtZSwgaW52ZXJ0LCBuLCBvdXQpOwogICAgIHJldHVybiAwOwogfQogCkBAIC00MzEsNiArNDQzLDggQEAKIAogICAgIHF1ZXVlX2luZm9fZHVtcCgpOwogCisgICAgZmJfcXVldWVfcXVlcnlfc2F2ZSgicHJvZHVjdCIsIGN1cl9wcm9kdWN0LCBzaXplb2YoY3VyX3Byb2R1Y3QpKTsKKwogICAgIHpkYXRhID0gbG9hZF9maWxlKGZuLCAmenNpemUpOwogICAgIGlmICh6ZGF0YSA9PSAwKSBkaWUoImZhaWxlZCB0byBsb2FkICclcyciLCBmbik7CiAKQEAgLTQ3NiwxMSArNDkwLDExIEBACiAgICAgdm9pZCAqZGF0YTsKICAgICB1bnNpZ25lZCBzejsKICAgICBjaGFyICp4dG47Ci0JCisKICAgICB4dG4gPSBzdHJyY2hyKGZuLCAnLicpOwogICAgIGlmICgheHRuKSByZXR1cm47CiAgICAgaWYgKHN0cmNtcCh4dG4sICIuaW1nIikpIHJldHVybjsKLQkKKwogICAgIHN0cmNweSh4dG4sIi5zaWciKTsKICAgICBkYXRhID0gbG9hZF9maWxlKGZuLCAmc3opOwogICAgIHN0cmNweSh4dG4sIi5pbWciKTsKQEAgLTQ5Nyw2ICs1MTEsOCBAQAogCiAgICAgcXVldWVfaW5mb19kdW1wKCk7CiAKKyAgICBmYl9xdWV1ZV9xdWVyeV9zYXZlKCJwcm9kdWN0IiwgY3VyX3Byb2R1Y3QsIHNpemVvZihjdXJfcHJvZHVjdCkpOworCiAgICAgZm5hbWUgPSBmaW5kX2l0ZW0oImluZm8iLCBwcm9kdWN0KTsKICAgICBpZiAoZm5hbWUgPT0gMCkgZGllKCJjYW5ub3QgZmluZCBhbmRyb2lkLWluZm8udHh0Iik7CiAgICAgZGF0YSA9IGxvYWRfZmlsZShmbmFtZSwgJnN6KTsKQEAgLTUyMCwxOCArNTM2LDE4IEBACiAgICAgZGF0YSA9IGxvYWRfZmlsZShmbmFtZSwgJnN6KTsKICAgICBpZiAoZGF0YSA9PSAwKSBkaWUoImNvdWxkIG5vdCBsb2FkIHN5c3RlbS5pbWciKTsKICAgICBkb19zZW5kX3NpZ25hdHVyZShmbmFtZSk7Ci0gICAgZmJfcXVldWVfZmxhc2goInN5c3RlbSIsIGRhdGEsIHN6KTsgICAKKyAgICBmYl9xdWV1ZV9mbGFzaCgic3lzdGVtIiwgZGF0YSwgc3opOwogfQogCiAjZGVmaW5lIHNraXAobikgZG8geyBhcmdjIC09IChuKTsgYXJndiArPSAobik7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHJlcXVpcmUobikgZG8geyBpZiAoYXJnYyA8IChuKSkgdXNhZ2UoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmVxdWlyZShuKSBkbyB7IGlmIChhcmdjIDwgKG4pKSB7dXNhZ2UoKTsgZXhpdCgxKTt9fSB3aGlsZSAoMCkKIAogaW50IGRvX29lbV9jb21tYW5kKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKICAgICBpbnQgaTsKICAgICBjaGFyIGNvbW1hbmRbMjU2XTsKICAgICBpZiAoYXJnYyA8PSAxKSByZXR1cm4gMDsKLSAgICAKKwogICAgIGNvbW1hbmRbMF0gPSAwOwogICAgIHdoaWxlKDEpIHsKICAgICAgICAgc3RyY2F0KGNvbW1hbmQsKmFyZ3YpOwpAQCAtNTQwLDcgKzU1Niw3IEBACiAgICAgICAgIHN0cmNhdChjb21tYW5kLCIgIik7CiAgICAgfQogCi0gICAgZmJfcXVldWVfY29tbWFuZChjb21tYW5kLCIiKTsgICAgCisgICAgZmJfcXVldWVfY29tbWFuZChjb21tYW5kLCIiKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNTUyLDExICs1NjgsMTIgQEAKICAgICB2b2lkICpkYXRhOwogICAgIHVuc2lnbmVkIHN6OwogICAgIHVuc2lnbmVkIHBhZ2Vfc2l6ZSA9IDIwNDg7CisgICAgaW50IHN0YXR1czsKIAogICAgIHNraXAoMSk7CiAgICAgaWYgKGFyZ2MgPT0gMCkgewogICAgICAgICB1c2FnZSgpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCiAgICAgaWYgKCFzdHJjbXAoKmFyZ3YsICJkZXZpY2VzIikpIHsKQEAgLTU2NCw2ICs1ODEsMTIgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgaWYgKCFzdHJjbXAoKmFyZ3YsICJoZWxwIikpIHsKKyAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisKICAgICBzZXJpYWwgPSBnZXRlbnYoIkFORFJPSURfU0VSSUFMIik7CiAKICAgICB3aGlsZSAoYXJnYyA+IDApIHsKQEAgLTY4OCw2ICs3MTEsNyBAQAogICAgICAgICAgICAgYXJnYyA9IGRvX29lbV9jb21tYW5kKGFyZ2MsIGFyZ3YpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MDMsNiArNzI3LDYgQEAKIAogICAgIHVzYiA9IG9wZW5fZGV2aWNlKCk7CiAKLSAgICBmYl9leGVjdXRlX3F1ZXVlKHVzYik7Ci0gICAgcmV0dXJuIDA7CisgICAgc3RhdHVzID0gZmJfZXhlY3V0ZV9xdWV1ZSh1c2IpOworICAgIHJldHVybiAoc3RhdHVzKSA/IDEgOiAwOwogfQpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZmFzdGJvb3QuaCBiL2Zhc3Rib290L2Zhc3Rib290LmgKaW5kZXggYTM2YzU2OS4uOWUwNDNmZSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZmFzdGJvb3QuaAorKysgYi9mYXN0Ym9vdC9mYXN0Ym9vdC5oCkBAIC00MywxNSArNDMsMjAgQEAKIC8qIGVuZ2luZS5jIC0gaGlnaCBsZXZlbCBjb21tYW5kIHF1ZXVlIGVuZ2luZSAqLwogdm9pZCBmYl9xdWV1ZV9mbGFzaChjb25zdCBjaGFyICpwdG4sIHZvaWQgKmRhdGEsIHVuc2lnbmVkIHN6KTs7CiB2b2lkIGZiX3F1ZXVlX2VyYXNlKGNvbnN0IGNoYXIgKnB0bik7Ci12b2lkIGZiX3F1ZXVlX3JlcXVpcmUoY29uc3QgY2hhciAqdmFyLCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBudmFsdWVzLCBjb25zdCBjaGFyICoqdmFsdWUpOwordm9pZCBmYl9xdWV1ZV9yZXF1aXJlKGNvbnN0IGNoYXIgKnByb2QsIGNvbnN0IGNoYXIgKnZhciwgaW50IGludmVydCwKKyAgICAgICAgdW5zaWduZWQgbnZhbHVlcywgY29uc3QgY2hhciAqKnZhbHVlKTsKIHZvaWQgZmJfcXVldWVfZGlzcGxheShjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnByZXR0eW5hbWUpOwordm9pZCBmYl9xdWV1ZV9xdWVyeV9zYXZlKGNvbnN0IGNoYXIgKnZhciwgY2hhciAqZGVzdCwgdW5zaWduZWQgZGVzdF9zaXplKTsKIHZvaWQgZmJfcXVldWVfcmVib290KHZvaWQpOwogdm9pZCBmYl9xdWV1ZV9jb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqbXNnKTsKIHZvaWQgZmJfcXVldWVfZG93bmxvYWQoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgc2l6ZSk7CiB2b2lkIGZiX3F1ZXVlX25vdGljZShjb25zdCBjaGFyICpub3RpY2UpOwotdm9pZCBmYl9leGVjdXRlX3F1ZXVlKHVzYl9oYW5kbGUgKnVzYik7CitpbnQgZmJfZXhlY3V0ZV9xdWV1ZSh1c2JfaGFuZGxlICp1c2IpOwogCiAvKiB1dGlsIHN0dWZmICovCiB2b2lkIGRpZShjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKKy8qIEN1cnJlbnQgcHJvZHVjdCAqLworZXh0ZXJuIGNoYXIgY3VyX3Byb2R1Y3RbRkJfUkVTUE9OU0VfU1ogKyAxXTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC91c2JfbGludXguYyBiL2Zhc3Rib290L3VzYl9saW51eC5jCmluZGV4IDc4YjdiOTguLjFiYTg3ZTYgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L3VzYl9saW51eC5jCisrKyBiL2Zhc3Rib290L3VzYl9saW51eC5jCkBAIC02MSw2ICs2MSwxMSBAQAogI2RlZmluZSBEQkcxKHguLi4pCiAjZW5kaWYKIAorLyogVGhlIG1heCBidWxrIHNpemUgZm9yIGxpbnV4IGlzIDE2Mzg0IHdoaWNoIGlzIGRlZmluZWQKKyAqIGluIGRyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYy4KKyAqLworI2RlZmluZSBNQVhfVVNCRlNfQlVMS19TSVpFICgxNiAqIDEwMjQpCisKIHN0cnVjdCB1c2JfaGFuZGxlIAogewogICAgIGNoYXIgZm5hbWVbNjRdOwpAQCAtMjg5LDcgKzI5NCw3IEBACiAgICAgCiAgICAgd2hpbGUobGVuID4gMCkgewogICAgICAgICBpbnQgeGZlcjsKLSAgICAgICAgeGZlciA9IChsZW4gPiA0MDk2KSA/IDQwOTYgOiBsZW47CisgICAgICAgIHhmZXIgPSAobGVuID4gTUFYX1VTQkZTX0JVTEtfU0laRSkgPyBNQVhfVVNCRlNfQlVMS19TSVpFIDogbGVuOwogICAgICAgICAKICAgICAgICAgYnVsay5lcCA9IGgtPmVwX291dDsKICAgICAgICAgYnVsay5sZW4gPSB4ZmVyOwpAQCAtMzIzLDcgKzMyOCw3IEBACiAgICAgfQogICAgIAogICAgIHdoaWxlKGxlbiA+IDApIHsKLSAgICAgICAgaW50IHhmZXIgPSAobGVuID4gNDA5NikgPyA0MDk2IDogbGVuOworICAgICAgICBpbnQgeGZlciA9IChsZW4gPiBNQVhfVVNCRlNfQlVMS19TSVpFKSA/IE1BWF9VU0JGU19CVUxLX1NJWkUgOiBsZW47CiAgICAgICAgIAogICAgICAgICBidWxrLmVwID0gaC0+ZXBfaW47CiAgICAgICAgIGJ1bGsubGVuID0geGZlcjsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3VzYl9vc3guYyBiL2Zhc3Rib290L3VzYl9vc3guYwppbmRleCA5NDg4Njg3Li41NzBhNDU2IDEwMDY0NAotLS0gYS9mYXN0Ym9vdC91c2Jfb3N4LmMKKysrIGIvZmFzdGJvb3QvdXNiX29zeC5jCkBAIC0yMzEsOCArMjMxLDcgQEAKICAgICAgICAgICAgICAgICBrciA9ICgqaW50ZXJmYWNlKS0+Q2xlYXJQaXBlU3RhbGxCb3RoRW5kcyhpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPmJ1bGtJbik7CiAgICAgICAgICAgICAgICAgaWYgKGtyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgRVJSKCJjb3VsZCBub3QgY2xlYXIgaW5wdXQgcGlwZTsgcmVzdWx0ICVkIiwga3IpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIEVSUigiY291bGQgbm90IGNsZWFyIGlucHV0IHBpcGU7IHJlc3VsdCAleCwgaWdub3JpbmcuLi5cbiIsIGtyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTI0MCw4ICsyMzksNyBAQAogICAgICAgICAgICAgICAgIGtyID0gKCppbnRlcmZhY2UpLT5DbGVhclBpcGVTdGFsbEJvdGhFbmRzKGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+YnVsa091dCk7CiAgICAgICAgICAgICAgICAgaWYgKGtyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgRVJSKCJjb3VsZCBub3QgY2xlYXIgb3V0cHV0IHBpcGU7IHJlc3VsdCAlZCIsIGtyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBFUlIoImNvdWxkIG5vdCBjbGVhciBvdXRwdXQgcGlwZTsgcmVzdWx0ICV4LCBpZ25vcmluZy4uLi5cbiIsIGtyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3VzYl93aW5kb3dzLmMgYi9mYXN0Ym9vdC91c2Jfd2luZG93cy5jCmluZGV4IDU0MDA4YTQuLjEwNTAyOTMgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L3VzYl93aW5kb3dzLmMKKysrIGIvZmFzdGJvb3QvdXNiX3dpbmRvd3MuYwpAQCAtNDIsNiArNDIsNyBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCisjZGVmaW5lIE1BWF9VU0JGU19CVUxLX1NJWkUgKDEwMjQgKiAxMDI0KQogCiAvKiogU3RydWN0dXJlIHVzYl9oYW5kbGUgZGVzY3JpYmVzIG91ciBjb25uZWN0aW9uIHRvIHRoZSB1c2IgZGV2aWNlIHZpYQogICBBZGJXaW5BcGkuZGxsLiBUaGlzIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBmcm9tIHVzYl9vcGVuKCkgcm91dGluZSBhbmQKQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewogICAgICAgICAvLyBQZXJmb3JtIHdyaXRlCiAgICAgICAgIHdoaWxlKGxlbiA+IDApIHsKLSAgICAgICAgICAgIGludCB4ZmVyID0gKGxlbiA+IDQwOTYpID8gNDA5NiA6IGxlbjsKKyAgICAgICAgICAgIGludCB4ZmVyID0gKGxlbiA+IE1BWF9VU0JGU19CVUxLX1NJWkUpID8gTUFYX1VTQkZTX0JVTEtfU0laRSA6IGxlbjsKICAgICAgICAgICAgIHJldCA9IEFkYldyaXRlRW5kcG9pbnRTeW5jKGhhbmRsZS0+YWRiX3dyaXRlX3BpcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl4ZmVyLApAQCAtMjAwLDcgKzIwMSw3IEBACiAgICAgREJHKCJ1c2JfcmVhZCAlZFxuIiwgbGVuKTsKICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGludCB4ZmVyID0gKGxlbiA+IDQwOTYpID8gNDA5NiA6IGxlbjsKKyAgICAgICAgICAgIGludCB4ZmVyID0gKGxlbiA+IE1BWF9VU0JGU19CVUxLX1NJWkUpID8gTUFYX1VTQkZTX0JVTEtfU0laRSA6IGxlbjsKIAogCSAgICAgICAgcmV0ID0gQWRiUmVhZEVuZHBvaW50U3luYyhoYW5kbGUtPmFkYl9yZWFkX3BpcGUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWRhdGEsCmRpZmYgLS1naXQgYS9ncHR0b29sL0FuZHJvaWQubWsgYi9ncHR0b29sL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmZmZlOQotLS0gL2Rldi9udWxsCisrKyBiL2dwdHRvb2wvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE0IEBACitpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gZ3B0dG9vbC5jCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnoKKworTE9DQUxfTU9EVUxFIDo9IGdwdHRvb2wKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworCitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZ3B0dG9vbC9ncHR0b29sLmMgYi9ncHR0b29sL2dwdHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ1MTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3B0dG9vbC9ncHR0b29sLmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qIHN5c3RlbS9jb3JlL2dwdHRvb2wvZ3B0dG9vbC5jCisqKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7CisKK2NvbnN0IHU4IHBhcnRpdGlvbl90eXBlX3V1aWRbMTZdID0geworCTB4YTIsIDB4YTAsIDB4ZDAsIDB4ZWIsIDB4ZTUsIDB4YjksIDB4MzMsIDB4NDQsCisJMHg4NywgMHhjMCwgMHg2OCwgMHhiNiwgMHhiNywgMHgyNiwgMHg5OSwgMHhjNywKK307CisKKworI2RlZmluZSBFRklfVkVSU0lPTiAweDAwMDEwMDAwCisjZGVmaW5lIEVGSV9NQUdJQyAiRUZJIFBBUlQiCisjZGVmaW5lIEVGSV9FTlRSSUVTIDEyOAorI2RlZmluZSBFRklfTkFNRUxFTiAzNgorCitzdHJ1Y3QgZWZpX2hlYWRlciB7CisJdTggbWFnaWNbOF07CisKKwl1MzIgdmVyc2lvbjsKKwl1MzIgaGVhZGVyX3N6OworCisJdTMyIGNyYzMyOworCXUzMiByZXNlcnZlZDsKKworCXU2NCBoZWFkZXJfbGJhOworCXU2NCBiYWNrdXBfbGJhOworCXU2NCBmaXJzdF9sYmE7CisJdTY0IGxhc3RfbGJhOworCisJdTggdm9sdW1lX3V1aWRbMTZdOworCisJdTY0IGVudHJpZXNfbGJhOworCisJdTMyIGVudHJpZXNfY291bnQ7CisJdTMyIGVudHJpZXNfc2l6ZTsKKwl1MzIgZW50cmllc19jcmMzMjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBlZmlfZW50cnkgeworCXU4IHR5cGVfdXVpZFsxNl07CisJdTggdW5pcV91dWlkWzE2XTsKKwl1NjQgZmlyc3RfbGJhOworCXU2NCBsYXN0X2xiYTsKKwl1NjQgYXR0cjsKKwl1MTYgbmFtZVtFRklfTkFNRUxFTl07Cit9OworCitzdHJ1Y3QgcHRhYmxlIHsKKwl1OCBtYnJbNTEyXTsKKwl1bmlvbiB7CisJCXN0cnVjdCBlZmlfaGVhZGVyIGhlYWRlcjsKKwkJdTggYmxvY2tbNTEyXTsKKwl9OworCXN0cnVjdCBlZmlfZW50cnkgZW50cnlbRUZJX0VOVFJJRVNdOwkKK307CisKK3ZvaWQgZ2V0X3V1aWQodTggKnV1aWQpCit7CisJaW50IGZkOworCWZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOworCXJlYWQoZmQsIHV1aWQsIDE2KTsKKwljbG9zZShmZCk7Cit9CisKK3ZvaWQgaW5pdF9tYnIodTggKm1iciwgdTMyIGJsb2NrcykKK3sKKwltYnJbMHgxYmVdID0gMHgwMDsgLy8gbm9uYm9vdGFibGUKKwltYnJbMHgxYmZdID0gMHhGRjsgLy8gYm9ndXMgQ0hTCisJbWJyWzB4MWMwXSA9IDB4RkY7CisJbWJyWzB4MWMxXSA9IDB4RkY7CisKKwltYnJbMHgxYzJdID0gMHhFRTsgLy8gR1BUIHBhcnRpdGlvbgorCW1iclsweDFjM10gPSAweEZGOyAvLyBib2d1cyBDSFMKKwltYnJbMHgxYzRdID0gMHhGRjsKKwltYnJbMHgxYzVdID0gMHhGRjsKKworCW1iclsweDFjNl0gPSAweDAxOyAvLyBzdGFydAorCW1iclsweDFjN10gPSAweDAwOworCW1iclsweDFjOF0gPSAweDAwOworCW1iclsweDFjOV0gPSAweDAwOworCisJbWVtY3B5KG1iciArIDB4MWNhLCAmYmxvY2tzLCBzaXplb2YodTMyKSk7CisKKwltYnJbMHgxZmVdID0gMHg1NTsKKwltYnJbMHgxZmZdID0gMHhhYTsKK30KKworaW50IGFkZF9wdG4oc3RydWN0IHB0YWJsZSAqcHRibCwgdTY0IGZpcnN0LCB1NjQgbGFzdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZWZpX2hlYWRlciAqaGRyID0gJnB0YmwtPmhlYWRlcjsKKwlzdHJ1Y3QgZWZpX2VudHJ5ICplbnRyeSA9IHB0YmwtPmVudHJ5OworCXVuc2lnbmVkIG47CisKKwlpZiAoZmlyc3QgPCAzNCkgeworCQlmcHJpbnRmKHN0ZGVyciwicGFydGl0aW9uICclcycgb3ZlcmxhcHMgcGFydGl0aW9uIHRhYmxlXG4iLCBuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChsYXN0ID4gaGRyLT5sYXN0X2xiYSkgeworCQlmcHJpbnRmKHN0ZGVyciwicGFydGl0aW9uICclcycgZG9lcyBub3QgZml0IG9uIGRpc2tcbiIsIG5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCWZvciAobiA9IDA7IG4gPCBFRklfRU5UUklFUzsgbisrLCBlbnRyeSsrKSB7CisJCWlmIChlbnRyeS0+dHlwZV91dWlkWzBdKQorCQkJY29udGludWU7CisJCW1lbWNweShlbnRyeS0+dHlwZV91dWlkLCBwYXJ0aXRpb25fdHlwZV91dWlkLCAxNik7CisJCWdldF91dWlkKGVudHJ5LT51bmlxX3V1aWQpOworCQllbnRyeS0+Zmlyc3RfbGJhID0gZmlyc3Q7CisJCWVudHJ5LT5sYXN0X2xiYSA9IGxhc3Q7CisJCWZvciAobiA9IDA7IChuIDwgRUZJX05BTUVMRU4pICYmICpuYW1lOyBuKyspCisJCQllbnRyeS0+bmFtZVtuXSA9ICpuYW1lKys7CisJCXJldHVybiAwOworCX0KKwlmcHJpbnRmKHN0ZGVyciwib3V0IG9mIHBhcnRpdGlvbiB0YWJsZSBlbnRyaWVzXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLAorCQkidXNhZ2U6IGdwdHRvb2wgd3JpdGUgPGRpc2s+IFsgPHBhcnRpdGlvbj4gXSpcbiIKKwkJIiAgICAgICBncHR0b29sIHJlYWQgPGRpc2s+XG4iCisJCSIgICAgICAgZ3B0dG9vbCB0ZXN0IFsgPHBhcnRpdGlvbj4gXSpcbiIKKwkJIlxuIgorCQkicGFydGl0aW9uOiAgWzxuYW1lPl06PHNpemU+W2ttZ10gfCBAPGZpbGUtb2YtcGFydGl0aW9ucz5cbiIKKwkJKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzaG93KHN0cnVjdCBwdGFibGUgKnB0YmwpCit7CisJc3RydWN0IGVmaV9lbnRyeSAqZW50cnkgPSBwdGJsLT5lbnRyeTsKKwl1bnNpZ25lZCBuLCBtOworCWNoYXIgbmFtZVtFRklfTkFNRUxFTl07CisKKwlmcHJpbnRmKHN0ZGVyciwicHRuICBzdGFydCBibG9jayAgIGVuZCBibG9jayAgICAgbmFtZVxuIik7CisJZnByaW50ZihzdGRlcnIsIi0tLS0gLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCWZvciAobiA9IDA7IG4gPCBFRklfRU5UUklFUzsgbisrLCBlbnRyeSsrKSB7CisJCWlmIChlbnRyeS0+dHlwZV91dWlkWzBdID09IDApCisJCQlicmVhazsKKwkJZm9yIChtID0gMDsgbSA8IEVGSV9OQU1FTEVOOyBtKyspIHsKKwkJCW5hbWVbbV0gPSBlbnRyeS0+bmFtZVttXSAmIDEyNzsKKwkJfQorCQluYW1lW21dID0gMDsKKwkJZnByaW50ZihzdGRlcnIsIiMlMDNkICUxM2xsZCAlMTNsbGQgJXNcbiIsCisJCQluICsgMSwgZW50cnktPmZpcnN0X2xiYSwgZW50cnktPmxhc3RfbGJhLCBuYW1lKTsKKwl9Cit9CisKK3U2NCBmaW5kX25leHRfbGJhKHN0cnVjdCBwdGFibGUgKnB0YmwpCit7CisJc3RydWN0IGVmaV9lbnRyeSAqZW50cnkgPSBwdGJsLT5lbnRyeTsKKwl1bnNpZ25lZCBuOworCXU2NCBhID0gMDsKKwlmb3IgKG4gPSAwOyBuIDwgRUZJX0VOVFJJRVM7IG4rKywgZW50cnkrKykgeworCQlpZiAoKGVudHJ5LT5sYXN0X2xiYSArIDEpID4gYSkKKwkJCWEgPSBlbnRyeS0+bGFzdF9sYmEgKyAxOworCX0KKwlyZXR1cm4gYTsKK30KKwordTY0IG5leHRfbGJhID0gMDsKKwordTY0IHBhcnNlX3NpemUoY2hhciAqc3opCit7CisJaW50IGwgPSBzdHJsZW4oc3opOworCXU2NCBuID0gc3RydG91bGwoc3osIDAsIDEwKTsKKwlpZiAobCkgeworCQlzd2l0Y2goc3pbbC0xXSl7CisJCWNhc2UgJ2snOgorCQljYXNlICdLJzoKKwkJCW4gKj0gMTAyNDsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJY2FzZSAnTSc6CisJCQluICo9ICgxMDI0ICogMTAyNCk7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCWNhc2UgJ0cnOgorCQkJbiAqPSAoMTAyNCAqIDEwMjQgKiAxMDI0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBuOworfQorCitpbnQgcGFyc2VfcHRuKHN0cnVjdCBwdGFibGUgKnB0YmwsIGNoYXIgKngpCit7CisJY2hhciAqeSA9IHN0cmNocih4LCAnOicpOworCXU2NCBzejsKKworCWlmICgheSkgeworCQlmcHJpbnRmKHN0ZGVyciwiaW52YWxpZCBwYXJ0aXRpb24gZW50cnk6ICVzXG4iLCB4KTsKKwkJcmV0dXJuIC0xOworCX0KKwkqeSsrID0gMDsKKworCWlmICgqeSA9PSAwKSB7CisJCXN6ID0gcHRibC0+aGVhZGVyLmxhc3RfbGJhIC0gbmV4dF9sYmE7CisJfSBlbHNlIHsKKwkJc3ogPSBwYXJzZV9zaXplKHkpOworCQlpZiAoc3ogJiA1MTEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCJwYXJ0aXRpb24gc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDUxMlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3ogLz0gNTEyOworCX0KKworCWlmIChzeiA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJ6ZXJvIHNpemUgcGFydGl0aW9ucyBub3QgYWxsb3dlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoeFswXSAmJiBhZGRfcHRuKHB0YmwsIG5leHRfbGJhLCBuZXh0X2xiYSArIHN6IC0gMSwgeCkpCisJCXJldHVybiAtMTsKKworCW5leHRfbGJhID0gbmV4dF9sYmEgKyBzejsKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBwdGFibGUgcHRibDsKKwlzdHJ1Y3QgZWZpX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZWZpX2hlYWRlciAqaGRyID0gJnB0YmwuaGVhZGVyOworCXN0cnVjdCBzdGF0IHM7CisJdTMyIG47CisJdTY0IHN6LCBibGs7CisJaW50IGZkOworCWNvbnN0IGNoYXIgKmRldmljZTsKKwlpbnQgcmVhbF9kaXNrID0gMDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIHVzYWdlKCk7CisKKwlpZiAoIXN0cmNtcChhcmd2WzFdLCAid3JpdGUiKSkgeworCQlpZiAoYXJnYyA8IDMpCisJCQlyZXR1cm4gdXNhZ2UoKTsKKwkJZGV2aWNlID0gYXJndlsyXTsKKwkJYXJnYyAtPSAyOworCQlhcmd2ICs9IDI7CisJCXJlYWxfZGlzayA9IDE7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0IikpIHsKKwkJYXJnYyAtPSAxOworCQlhcmd2ICs9IDE7CisJCXJlYWxfZGlzayA9IDA7CisJCXN6ID0gMjA5NzE1MiAqIDE2OworCQlmcHJpbnRmKHN0ZGVyciwiPCBzaW11bGF0aW5nIDE2R0IgZGlzayA+XG5cbiIpOworCX0gZWxzZSB7CisJCXJldHVybiB1c2FnZSgpOworCX0KKworCWlmIChyZWFsX2Rpc2spIHsKKwkJaWYgKCFzdHJjbXAoZGV2aWNlLCAiL2Rldi9zZGEiKSB8fCAKKwkJICAgICFzdHJjbXAoZGV2aWNlLCAiL2Rldi9zZGIiKSkgeworCQkJZnByaW50ZihzdGRlcnIsImVycm9yOiByZWZ1c2luZyB0byBwYXJ0aXRpb24gc2RhIG9yIHNkYlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJCisJCWZkID0gb3BlbihkZXZpY2UsIE9fUkRXUik7CisJCWlmIChmZCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCJlcnJvcjogY2Fubm90IG9wZW4gJyVzJ1xuIiwgZGV2aWNlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJnN6KSkgeworCQkJZnByaW50ZihzdGRlcnIsImVycm9yOiBjYW5ub3QgcXVlcnkgYmxvY2sgZGV2aWNlIHNpemVcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN6IC89IDUxMjsKKwkJZnByaW50ZihzdGRlcnIsImJsb2NrcyAlbGxkXG4iLCBzeik7CisJfQorCisJbWVtc2V0KCZwdGJsLCAwLCBzaXplb2YocHRibCkpOworCisJaW5pdF9tYnIocHRibC5tYnIsIHN6IC0gMSk7CisKKwltZW1jcHkoaGRyLT5tYWdpYywgRUZJX01BR0lDLCBzaXplb2YoaGRyLT5tYWdpYykpOworCWhkci0+dmVyc2lvbiA9IEVGSV9WRVJTSU9OOworCWhkci0+aGVhZGVyX3N6ID0gc2l6ZW9mKHN0cnVjdCBlZmlfaGVhZGVyKTsKKwloZHItPmhlYWRlcl9sYmEgPSAxOworCWhkci0+YmFja3VwX2xiYSA9IHN6IC0gMTsKKwloZHItPmZpcnN0X2xiYSA9IDM0OworCWhkci0+bGFzdF9sYmEgPSBzeiAtIDE7CisJZ2V0X3V1aWQoaGRyLT52b2x1bWVfdXVpZCk7CisJaGRyLT5lbnRyaWVzX2xiYSA9IDI7CisJaGRyLT5lbnRyaWVzX2NvdW50ID0gMTI4OworCWhkci0+ZW50cmllc19zaXplID0gc2l6ZW9mKHN0cnVjdCBlZmlfZW50cnkpOworCisJd2hpbGUgKGFyZ2MgPiAxKSB7CisJCWlmIChhcmd2WzFdWzBdID09ICdAJykgeworCQkJY2hhciBsaW5lWzI1Nl0sICpwOworCQkJRklMRSAqZjsKKwkJCWYgPSBmb3Blbihhcmd2WzFdICsgMSwgInIiKTsKKwkJCWlmICghZikgeworCQkJCWZwcmludGYoc3RkZXJyLCJjYW5ub3QgcmVhZCBwYXJ0aXRpb25zIGZyb20gJyVzXG4iLCBhcmd2WzFdKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkgeworCQkJCXAgPSBsaW5lICsgc3RybGVuKGxpbmUpOworCQkJCXdoaWxlIChwID4gbGluZSkgeworCQkJCQlwLS07CisJCQkJCWlmICgqcCA+ICcgJykKKwkJCQkJCWJyZWFrOworCQkJCQkqcCA9IDA7CisJCQkJfQorCQkJCXAgPSBsaW5lOworCQkJCXdoaWxlICgqcCAmJiAoKnAgPD0gJyAnKSkKKwkJCQkJcCsrOworCQkJCWlmICgqcCA9PSAnIycpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgqcCA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocGFyc2VfcHRuKCZwdGJsLCBwKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZmNsb3NlKGYpOworCQl9IGVsc2UgewkKKwkJCWlmIChwYXJzZV9wdG4oJnB0YmwsIGFyZ3ZbMV0pKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwluID0gY3JjMzIoMCwgWl9OVUxMLCAwKTsKKwluID0gY3JjMzIobiwgKHZvaWQqKSBwdGJsLmVudHJ5LCBzaXplb2YocHRibC5lbnRyeSkpOworCWhkci0+ZW50cmllc19jcmMzMiA9IG47CisKKwluID0gY3JjMzIoMCwgWl9OVUxMLCAwKTsKKwluID0gY3JjMzIobiwgKHZvaWQqKSAmcHRibC5oZWFkZXIsIHNpemVvZihwdGJsLmhlYWRlcikpOworCWhkci0+Y3JjMzIgPSBuOworCisJc2hvdygmcHRibCk7CisKKwlpZiAocmVhbF9kaXNrKSB7CisgIAkJd3JpdGUoZmQsICZwdGJsLCBzaXplb2YocHRibCkpOworCQlmc3luYyhmZCk7CisKKwkJaWYgKGlvY3RsKGZkLCBCTEtSUlBBUlQsIDApKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwiY291bGQgbm90IHJlLXJlYWQgcGFydGl0aW9uIHRhYmxlXG4iKTsKKwkJfQorCQljbG9zZShmZCk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY2MvYWNjLmggYi9pbmNsdWRlL2FjYy9hY2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MjM1NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FjYy9hY2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQUNDX0FDQ19ICi0jZGVmaW5lIEFORFJPSURfQUNDX0FDQ19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgQUNDY2hhcjsKLXR5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIEFDQ2ludDsKLXR5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIEFDQ3VpbnQ7Ci10eXBlZGVmIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICBBQ0NzaXplaTsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIEFDQ2VudW07Ci10eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBBQ0N2b2lkOwotdHlwZWRlZiBzdHJ1Y3QgQUNDc2NyaXB0ICAgICAgICAgICAgQUNDc2NyaXB0OwotCi0jZGVmaW5lIEFDQ19OT19FUlJPUiAgICAgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgQUNDX0lOVkFMSURfRU5VTSAgICAgICAgICAgIDB4MDUwMAotI2RlZmluZSBBQ0NfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgMHgwNTAyCi0jZGVmaW5lIEFDQ19JTlZBTElEX1ZBTFVFICAgICAgICAgICAweDA1MDEKLSNkZWZpbmUgQUNDX09VVF9PRl9NRU1PUlkgICAgICAgICAgIDB4MDUwNQotCi0jZGVmaW5lIEFDQ19DT01QSUxFX1NUQVRVUyAgICAgICAgICAweDhCODEKLSNkZWZpbmUgQUNDX0lORk9fTE9HX0xFTkdUSCAgICAgICAgIDB4OEI4NAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1BQ0NzY3JpcHQqIGFjY0NyZWF0ZVNjcmlwdCgpOwotCi12b2lkIGFjY0RlbGV0ZVNjcmlwdChBQ0NzY3JpcHQqIHNjcmlwdCk7Ci0KLXR5cGVkZWYgQUNDdm9pZCogKCpBQ0NTeW1ib2xMb29rdXBGbikoQUNDdm9pZCogcENvbnRleHQsIGNvbnN0IEFDQ2NoYXIgKiBuYW1lKTsKLQotdm9pZCBhY2NSZWdpc3RlclN5bWJvbENhbGxiYWNrKEFDQ3NjcmlwdCogc2NyaXB0LCBBQ0NTeW1ib2xMb29rdXBGbiBwRm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDdm9pZCogcENvbnRleHQpOwotCi1BQ0NlbnVtIGFjY0dldEVycm9yKCBBQ0NzY3JpcHQqIHNjcmlwdCApOwotCi12b2lkIGFjY1NjcmlwdFNvdXJjZShBQ0NzY3JpcHQqIHNjcmlwdCwKLSAgICBBQ0NzaXplaSBjb3VudCwKLSAgICBjb25zdCBBQ0NjaGFyKiogc3RyaW5nLAotICAgIGNvbnN0IEFDQ2ludCogbGVuZ3RoKTsKLQotdm9pZCBhY2NDb21waWxlU2NyaXB0KEFDQ3NjcmlwdCogc2NyaXB0KTsKLQotdm9pZCBhY2NHZXRTY3JpcHRpdihBQ0NzY3JpcHQqIHNjcmlwdCwKLSAgICBBQ0NlbnVtIHBuYW1lLAotICAgIEFDQ2ludCogcGFyYW1zKTsKLQotdm9pZCBhY2NHZXRTY3JpcHRJbmZvTG9nKEFDQ3NjcmlwdCogc2NyaXB0LAotICAgIEFDQ3NpemVpIG1heExlbmd0aCwKLSAgICBBQ0NzaXplaSogbGVuZ3RoLAotICAgIEFDQ2NoYXIqIGluZm9Mb2cpOwotCi12b2lkIGFjY0dldFNjcmlwdExhYmVsKEFDQ3NjcmlwdCogc2NyaXB0LCBjb25zdCBBQ0NjaGFyICogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQUNDdm9pZCoqIGFkZHJlc3MpOwotCi12b2lkIGFjY0dldFByYWdtYXMoQUNDc2NyaXB0KiBzY3JpcHQsIEFDQ3NpemVpKiBhY3R1YWxTdHJpbmdDb3VudCwKLSAgICAgICAgICAgICAgICAgICBBQ0NzaXplaSBtYXhTdHJpbmdDb3VudCwgQUNDY2hhcioqIHN0cmluZ3MpOwotCi0vKiBVc2VkIHRvIGltcGxlbWVudCBkaXNhc3NlbWJseSAqLwotCi12b2lkIGFjY0dldFByb2dyYW1CaW5hcnkoQUNDc2NyaXB0KiBzY3JpcHQsCi0gICAgQUNDdm9pZCoqIGJhc2UsCi0gICAgQUNDc2l6ZWkqIGxlbmd0aCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfTsKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL2Rhcndpbi14ODYvQW5kcm9pZENvbmZpZy5oIGIvaW5jbHVkZS9hcmNoL2Rhcndpbi14ODYvQW5kcm9pZENvbmZpZy5oCmluZGV4IDJiYjQ0YzYuLmM4Y2NjN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXJjaC9kYXJ3aW4teDg2L0FuZHJvaWRDb25maWcuaAorKysgYi9pbmNsdWRlL2FyY2gvZGFyd2luLXg4Ni9BbmRyb2lkQ29uZmlnLmgKQEAgLTE1OSw2ICsxNTksMTEgQEAKICNkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UgMQogCiAvKgorICogRGVmaW5lIGlmIHBsYXRmb3JtIGhhcyBvZmY2NF90IChhbmQgbHNlZWs2NCBhbmQgb3RoZXIgeHh4NjQgZnVuY3Rpb25zKQorICovCisvKiAjZGVmaW5lIEhBVkVfT0ZGNjRfVCAqLworCisvKgogICogRGVmaW5lZCBpZiB3ZSBoYXZlIHRoZSBiYWNrdHJhY2UoKSBjYWxsIGZvciByZXRyaWV2aW5nIGEgc3RhY2sgdHJhY2UuCiAgKiBOZWVkZWQgZm9yIENhbGxTdGFjayB0byBvcGVyYXRlOyBpZiBub3QgZGVmaW5lZCwgQ2FsbFN0YWNrIGlzCiAgKiBub24tZnVuY3Rpb25hbC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXJjaC9mcmVlYnNkLXg4Ni9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvZnJlZWJzZC14ODYvQW5kcm9pZENvbmZpZy5oCmluZGV4IDk5MmI2ODkuLmQ4MjhiZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXJjaC9mcmVlYnNkLXg4Ni9BbmRyb2lkQ29uZmlnLmgKKysrIGIvaW5jbHVkZS9hcmNoL2ZyZWVic2QteDg2L0FuZHJvaWRDb25maWcuaApAQCAtMTc1LDYgKzE3NSwxMSBAQAogI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxCiAKIC8qCisgKiBEZWZpbmUgaWYgcGxhdGZvcm0gaGFzIG9mZjY0X3QgKGFuZCBsc2VlazY0IGFuZCBvdGhlciB4eHg2NCBmdW5jdGlvbnMpCisgKi8KKy8qICNkZWZpbmUgSEFWRV9PRkY2NF9UICovCisKKy8qCiAgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGJhY2t0cmFjZSgpIGNhbGwgZm9yIHJldHJpZXZpbmcgYSBzdGFjayB0cmFjZS4KICAqIE5lZWRlZCBmb3IgQ2FsbFN0YWNrIHRvIG9wZXJhdGU7IGlmIG5vdCBkZWZpbmVkLCBDYWxsU3RhY2sgaXMKICAqIG5vbi1mdW5jdGlvbmFsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL2xpbnV4LWFybS9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaAppbmRleCA1YjdjY2VlLi44Mzg5MWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaAorKysgYi9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaApAQCAtMTc0LDYgKzE3NCwxMSBAQAogLyogI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxICovCiAKIC8qCisgKiBEZWZpbmUgaWYgcGxhdGZvcm0gaGFzIG9mZjY0X3QgKGFuZCBsc2VlazY0IGFuZCBvdGhlciB4eHg2NCBmdW5jdGlvbnMpCisgKi8KKyNkZWZpbmUgSEFWRV9PRkY2NF9UCisKKy8qCiAgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGJhY2t0cmFjZSgpIGNhbGwgZm9yIHJldHJpZXZpbmcgYSBzdGFjayB0cmFjZS4KICAqIE5lZWRlZCBmb3IgQ2FsbFN0YWNrIHRvIG9wZXJhdGU7IGlmIG5vdCBkZWZpbmVkLCBDYWxsU3RhY2sgaXMKICAqIG5vbi1mdW5jdGlvbmFsLgpAQCAtMjA2LDcgKzIxMSw5IEBACiAvKgogICogQWRkIGFueSBleHRyYSBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZpbmVzIGhlcmUuCiAgKi8KKyNpZm5kZWYgX19saW51eF9fCiAjZGVmaW5lIF9fbGludXhfXworI2VuZGlmCiAKIC8qCiAgKiBEZWZpbmUgaWYgd2UgaGF2ZSA8bWFsbG9jLmg+IGhlYWRlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL2xpbnV4LXBwYy9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvbGludXgtcHBjL0FuZHJvaWRDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDcwNmRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hcmNoL2xpbnV4LXBwYy9BbmRyb2lkQ29uZmlnLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQW5kcm9pZCBjb25maWcgLS0gIkxpbnV4Ii4gIFVzZWQgZm9yIGRlc2t0b3AgcHBjIExpbnV4LgorICovCisjaWZuZGVmIF9BTkRST0lEX0NPTkZJR19ICisjZGVmaW5lIF9BTkRST0lEX0NPTkZJR19ICisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEhIElNUE9SVEFOVCAhISEKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBBTEwgQy9DKysgc291cmNlIGZpbGVzLiAgRG9uJ3QgcHV0IGFueXRoaW5nIGluCisgKiBoZXJlIHVubGVzcyB5b3UgYXJlIGFic29sdXRlbHkgY2VydGFpbiBpdCBjYW4ndCBnbyBhbnl3aGVyZSBlbHNlLgorICoKKyAqIEFueSBDKysgc3R1ZmYgbXVzdCBiZSB3cmFwcGVkIHdpdGggIiNpZmRlZiBfX2NwbHVzcGx1cyIuICBEbyBub3QgdXNlICIvLyIKKyAqIGNvbW1lbnRzLgorICovCisKKy8qCisgKiBUaHJlYWRpbmcgbW9kZWwuICBDaG9vc2Ugb25lOgorICoKKyAqIEhBVkVfUFRIUkVBRFMgLSB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuCisgKiBIQVZFX1dJTjMyX1RIUkVBRFMgLSB1c2UgV2luMzIgdGhyZWFkIHByaW1pdGl2ZXMuCisgKiAgLS0gY29tYmluZSBIQVZFX0NSRUFURVRIUkVBRCwgSEFWRV9DUkVBVEVNVVRFWCwgYW5kIEhBVkVfX0JFR0lOVEhSRUFERVgKKyAqLworI2RlZmluZSBIQVZFX1BUSFJFQURTCisKKy8qCisgKiBEbyB3ZSBoYXZlIHRoZSBmdXRleCBzeXNjYWxsPworICovCisKKyNkZWZpbmUgSEFWRV9GVVRFWAorCisvKgorICogUHJvY2VzcyBjcmVhdGlvbiBtb2RlbC4gIENob29zZSBvbmU6CisgKgorICogSEFWRV9GT1JLRVhFQyAtIHVzZSBmb3JrKCkgYW5kIGV4ZWMoKQorICogSEFWRV9XSU4zMl9QUk9DIC0gdXNlIENyZWF0ZVByb2Nlc3MoKQorICovCisjZGVmaW5lIEhBVkVfRk9SS0VYRUMKKworLyoKKyAqIFByb2Nlc3Mgb3V0LW9mLW1lbW9yeSBhZGp1c3RtZW50LiAgU2V0IGlmIHJ1bm5pbmcgb24gTGludXgsCisgKiB3aGVyZSB3ZSBjYW4gd3JpdGUgdG8gL3Byb2MvPHBpZD4vb29tX2FkaiB0byBtb2RpZnkgdGhlIG91dC1vZi1tZW1vcnkKKyAqIGJhZG5lc3MgYWRqdXN0bWVudC4KKyAqLworI2RlZmluZSBIQVZFX09PTV9BREoKKworLyoKKyAqIElQQyBtb2RlbC4gIENob29zZSBvbmU6CisgKgorICogSEFWRV9TWVNWX0lQQyAtIHVzZSB0aGUgY2xhc3NpYyBTeXNWIElQQyBtZWNoYW5pc21zIChzZW1nZXQsIHNobWdldCkuCisgKiBIQVZFX01BQ09TWF9JUEMgLSB1c2UgTWFjaW50b3NoIElQQyBtZWNoYW5pc21zIChzZW1fb3BlbiwgbW1hcCkuCisgKiBIQVZFX1dJTjMyX0lQQyAtIHVzZSBXaW4zMiBJUEMgKENyZWF0ZVNlbWFwaG9yZSwgQ3JlYXRlRmlsZU1hcHBpbmcpLgorICogSEFWRV9BTkRST0lEX0lQQyAtIHVzZSBBbmRyb2lkIHZlcnNpb25zICg/LCBtbWFwKS4KKyAqLworI2RlZmluZSBIQVZFX1NZU1ZfSVBDCisKKy8qCisgKiBNZW1vcnktbWFwcGluZyBtb2RlbC4gQ2hvb3NlIG9uZToKKyAqCisgKiBIQVZFX1BPU0lYX0ZJTEVNQVAgLSB1c2UgdGhlIFBvc2l4IHN5cy9tbWFwLmgKKyAqIEhBVkVfV0lOMzJfRklMRU1BUCAtIHVzZSBXaW4zMiBmaWxlbWFwcworICovCisjZGVmaW5lICBIQVZFX1BPU0lYX0ZJTEVNQVAKKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIDx0ZXJtaW8uaD4KKyAqLworI2RlZmluZSAgSEFWRV9URVJNSU9fSAorCisvKgorICogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgPHN5cy9zZW5kZmlsZS5oPgorICovCisjZGVmaW5lICBIQVZFX1NZU19TRU5ERklMRV9IIDEKKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdSBidWlsZCBhZ2FpbnN0IE1TVkNSVC5ETEwKKyAqLworLyogI2RlZmluZSBIQVZFX01TX0NfUlVOVElNRSAqLworCisvKgorICogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgc3lzL3Vpby5oCisgKi8KKyNkZWZpbmUgIEhBVkVfU1lTX1VJT19ICisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHBsYXRmb3JtcyBpbXBsZW1lbnRzIHN5bWJvbGljIGxpbmtzCisgKiBpbiBpdHMgZmlsZXN5c3RlbXMKKyAqLworI2RlZmluZSBIQVZFX1NZTUxJTktTCisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB3ZSBoYXZlIGxvY2FsdGltZV9yKCkuCisgKi8KKyNkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBnZXRob3N0YnluYW1lX3IoKS4KKyAqLworI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUgorCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBpb2N0bCgpLgorICovCisjZGVmaW5lIEhBVkVfSU9DVEwKKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHdlIHdhbnQgdG8gdXNlIFdpblNvY2suCisgKi8KKy8qICNkZWZpbmUgSEFWRV9XSU5TT0NLICovCisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiBoYXZlIGNsb2NrX2dldHRpbWUoKSBhbmQgZnJpZW5kcworICoKKyAqIERlc2t0b3AgTGludXggaGFzIHRoaXMgaW4gbGlicnQsIGJ1dCBpdCdzIGJyb2tlbiBpbiBnb29idW50dSwgeWllbGRpbmcKKyAqIG1pbGRseSBvciB3aWxkbHkgaW5hY2N1cmF0ZSByZXN1bHRzLgorICovCisvKiNkZWZpbmUgSEFWRV9QT1NJWF9DTE9DS1MqLworCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0X21vbm90b25pYygpIGFuZAorICogY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpLgorICovCisvKiAjZGVmaW5lIEhBVkVfVElNRURXQUlUX01PTk9UT05JQyAqLworCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBsaW51eCBzdHlsZSBlcG9sbCgpCisgKi8KKyNkZWZpbmUgSEFWRV9FUE9MTAorCisvKgorICogRW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBDaG9vc2Ugb25lOgorICoKKyAqIEhBVkVfRU5ESUFOX0ggLS0gaGF2ZSBlbmRpYW4uaCBoZWFkZXIgd2UgY2FuIGluY2x1ZGUuCisgKiBIQVZFX0xJVFRMRV9FTkRJQU4gLS0gd2UgYXJlIGxpdHRsZSBlbmRpYW4uCisgKiBIQVZFX0JJR19FTkRJQU4gLS0gd2UgYXJlIGJpZyBlbmRpYW4uCisgKi8KKyNkZWZpbmUgSEFWRV9FTkRJQU5fSAorI2RlZmluZSBIQVZFX0JJR19FTkRJQU4KKworLyoKKyAqIFdlIG5lZWQgdG8gY2hvb3NlIGJldHdlZW4gMzItYml0IGFuZCA2NC1iaXQgb2ZmX3QuICBBbGwgb2Ygb3VyIGNvZGUgc2hvdWxkCisgKiBhZ3JlZSBvbiB0aGUgc2FtZSBzaXplLiAgRm9yIGRlc2t0b3Agc3lzdGVtcywgdXNlIDY0LWJpdCB2YWx1ZXMsCisgKiBiZWNhdXNlIHNvbWUgb2Ygb3VyIGxpYnJhcmllcyAoZS5nLiB3eFdpZGdldHMpIGV4cGVjdCB0byBiZSBidWlsdCB0aGF0IHdheS4KKyAqLworI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAorI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxCisKKy8qCisgKiBEZWZpbmUgaWYgcGxhdGZvcm0gaGFzIG9mZjY0X3QgKGFuZCBsc2VlazY0IGFuZCBvdGhlciB4eHg2NCBmdW5jdGlvbnMpCisgKi8KKyNkZWZpbmUgSEFWRV9PRkY2NF9UCisKKy8qCisgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGJhY2t0cmFjZSgpIGNhbGwgZm9yIHJldHJpZXZpbmcgYSBzdGFjayB0cmFjZS4KKyAqIE5lZWRlZCBmb3IgQ2FsbFN0YWNrIHRvIG9wZXJhdGU7IGlmIG5vdCBkZWZpbmVkLCBDYWxsU3RhY2sgaXMKKyAqIG5vbi1mdW5jdGlvbmFsLgorICovCisjZGVmaW5lIEhBVkVfQkFDS1RSQUNFIDEKKworLyoKKyAqIERlZmluZWQgaWYgd2UgaGF2ZSB0aGUgZGxhZGRyKCkgY2FsbCBmb3IgcmV0cmlldmluZyB0aGUgc3ltYm9sIGFzc29jaWF0ZWQKKyAqIHdpdGggYSBtZW1vcnkgYWRkcmVzcy4gIElmIG5vdCBkZWZpbmVkLCBzdGFjayBjcmF3bHMgd2lsbCBub3QgaGF2ZSBzeW1ib2xpYworICogaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgSEFWRV9ETEFERFIgMQorCisvKgorICogRGVmaW5lZCBpZiB3ZSBoYXZlIHRoZSBjeHhhYmkuaCBoZWFkZXIgZm9yIGRlbWFuZ2xpbmcgQysrIHN5bWJvbHMuICBJZgorICogbm90IGRlZmluZWQsIHN0YWNrIGNyYXdscyB3aWxsIGJlIGRpc3BsYXllZCB3aXRoIHJhdyBtYW5nbGVkIHN5bWJvbHMKKyAqLworI2RlZmluZSBIQVZFX0NYWEFCSSAwCisKKy8qCisgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGdldHRpZCgpIHN5c3RlbSBjYWxsLgorICovCisvKiAjZGVmaW5lIEhBVkVfR0VUVElEICovCisKKy8qCisgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIHNjaGVkX3NldHNjaGVkdWxlcigpIGNhbGwKKyAqLworI2RlZmluZSBIQVZFX1NDSEVEX1NFVFNDSEVEVUxFUgorCisvKgorICogQWRkIGFueSBleHRyYSBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZpbmVzIGhlcmUuCisgKi8KKworLyoKKyAqIERlZmluZSBpZiB3ZSBoYXZlIDxtYWxsb2MuaD4gaGVhZGVyCisgKi8KKyNkZWZpbmUgSEFWRV9NQUxMT0NfSAorCisvKgorICogRGVmaW5lIGlmIHdlIGhhdmUgTGludXgtc3R5bGUgbm9uLWZpbGVzeXN0ZW0gVW5peCBEb21haW4gU29ja2V0cworICovCisKKy8qCisgKiBXaGF0IENQVSBhcmNoaXRlY3R1cmUgZG9lcyB0aGlzIHBsYXRmb3JtIHVzZT8KKyAqLworI2RlZmluZSBBUkNIX1BQQworCisKKy8qCisgKiBEZWZpbmUgaWYgd2UgaGF2ZSBMaW51eCdzIGlub3RpZnkgaW4gPHN5cy9pbm90aWZ5Lmg+LgorICovCisvKiNkZWZpbmUgSEFWRV9JTk9USUZZIDEqLworCisvKgorICogRGVmaW5lIGlmIHdlIGhhdmUgbWFkdmlzZSgpIGluIDxzeXMvbW1hbi5oPgorICovCisjZGVmaW5lIEhBVkVfTUFEVklTRSAxCisKKy8qCisgKiBEZWZpbmUgaWYgdG0gc3RydWN0IGhhcyB0bV9nbXRvZmYgZmllbGQKKyAqLworI2RlZmluZSBIQVZFX1RNX0dNVE9GRiAxCisKKy8qCisgKiBEZWZpbmUgaWYgZGlyZW50IHN0cnVjdCBoYXMgZF90eXBlIGZpZWxkCisgKi8KKyNkZWZpbmUgSEFWRV9ESVJFTlRfRF9UWVBFIDEKKworLyoKKyAqIERlZmluZSBpZiBsaWJjIGluY2x1ZGVzIEFuZHJvaWQgc3lzdGVtIHByb3BlcnRpZXMgaW1wbGVtZW50YXRpb24uCisgKi8KKy8qICNkZWZpbmUgSEFWRV9MSUJDX1NZU1RFTV9QUk9QRVJUSUVTICovCisKKy8qCisgKiBEZWZpbmUgaWYgc3lzdGVtIHByb3ZpZGVzIGEgc3lzdGVtIHByb3BlcnR5IHNlcnZlciAoc2hvdWxkIGJlCisgKiBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBIQVZFX0xJQkNfU1lTVEVNX1BST1BFUlRJRVMpLgorICovCisjZGVmaW5lIEhBVkVfU1lTVEVNX1BST1BFUlRZX1NFUlZFUgorCisvKgorICogc3ByaW50ZigpIGZvcm1hdCBzdHJpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IG5hbWluZy4KKyAqLworI2RlZmluZSBPU19TSEFSRURfTElCX0ZPUk1BVF9TVFIgICAgImxpYiVzLnNvIgorCisvKgorICogdHlwZSBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIG1pbmNvcmUoKS4KKyAqLworI2RlZmluZSBNSU5DT1JFX1BPSU5URVJfVFlQRSB1bnNpZ25lZCBjaGFyICoKKworLyoKKyAqIERvIHdlIGhhdmUgdGhlIHNpZ2FjdGlvbiBmbGFnIFNBX05PQ0xEV0FJVD8KKyAqLworI2RlZmluZSBIQVZFX1NBX05PQ0xEV0FJVAorCisvKgorICogVGhlIGRlZmF1bHQgcGF0aCBzZXBhcmF0b3IgZm9yIHRoZSBwbGF0Zm9ybQorICovCisjZGVmaW5lIE9TX1BBVEhfU0VQQVJBVE9SICcvJworCisvKgorICogSXMgdGhlIGZpbGVzeXN0ZW0gY2FzZSBzZW5zaXRpdmU/CisgKi8KKyNkZWZpbmUgT1NfQ0FTRV9TRU5TSVRJVkUKKworLyoKKyAqIERlZmluZSBpZiA8c3lzL3NvY2tldC5oPiBleGlzdHMuCisgKi8KKyNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQorCisvKgorICogRGVmaW5lIGlmIHRoZSBzdHJsY3B5KCkgZnVuY3Rpb24gZXhpc3RzIG9uIHRoZSBzeXN0ZW0uCisgKi8KKy8qICNkZWZpbmUgSEFWRV9TVFJMQ1BZIDEgKi8KKworLyoKKyAqIERlZmluZSBpZiB0aGUgb3Blbl9tZW1zdHJlYW0oKSBmdW5jdGlvbiBleGlzdHMgb24gdGhlIHN5c3RlbS4KKyAqLworI2RlZmluZSBIQVZFX09QRU5fTUVNU1RSRUFNIDEKKworLyoKKyAqIERlZmluZSBpZiB0aGUgQlNEIGZ1bm9wZW4oKSBmdW5jdGlvbiBleGlzdHMgb24gdGhlIHN5c3RlbS4KKyAqLworLyogI2RlZmluZSBIQVZFX0ZVTk9QRU4gMSAqLworCisvKgorICogRGVmaW5lIGlmIHByY3RsKCkgZXhpc3RzCisgKi8KKyNkZWZpbmUgSEFWRV9QUkNUTCAxCisKKy8qCisgKiBEZWZpbmUgaWYgd3JpdGV2KCkgZXhpc3RzCisgKi8KKyNkZWZpbmUgSEFWRV9XUklURVYgMQorCisvKgorICogRGVmaW5lIGlmIDxzdGRpbnQuaD4gZXhpc3RzLgorICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKgorICogRGVmaW5lIGlmIDxzdGRib29sLmg+IGV4aXN0cy4KKyAqLworI2RlZmluZSBIQVZFX1NUREJPT0xfSCAxCisKKy8qCisgKiBEZWZpbmUgaWYgPHNjaGVkLmg+IGV4aXN0cy4KKyAqLworI2RlZmluZSBIQVZFX1NDSEVEX0ggMQorCisvKgorICogRGVmaW5lIGlmIHByZWFkKCkgZXhpc3RzCisgKi8KKyNkZWZpbmUgSEFWRV9QUkVBRCAxCisKKyNlbmRpZiAvKl9BTkRST0lEX0NPTkZJR19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXJjaC9saW51eC1zaC9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvbGludXgtc2gvQW5kcm9pZENvbmZpZy5oCmluZGV4IDBkZDdiM2IuLjU1NjJlYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXJjaC9saW51eC1zaC9BbmRyb2lkQ29uZmlnLmgKKysrIGIvaW5jbHVkZS9hcmNoL2xpbnV4LXNoL0FuZHJvaWRDb25maWcuaApAQCAtMTc0LDYgKzE3NCwxMSBAQAogLyogI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxICovCiAKIC8qCisgKiBEZWZpbmUgaWYgcGxhdGZvcm0gaGFzIG9mZjY0X3QgKGFuZCBsc2VlazY0IGFuZCBvdGhlciB4eHg2NCBmdW5jdGlvbnMpCisgKi8KKyNkZWZpbmUgSEFWRV9PRkY2NF9UCisKKy8qCiAgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGJhY2t0cmFjZSgpIGNhbGwgZm9yIHJldHJpZXZpbmcgYSBzdGFjayB0cmFjZS4KICAqIE5lZWRlZCBmb3IgQ2FsbFN0YWNrIHRvIG9wZXJhdGU7IGlmIG5vdCBkZWZpbmVkLCBDYWxsU3RhY2sgaXMKICAqIG5vbi1mdW5jdGlvbmFsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL2xpbnV4LXg4Ni9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvbGludXgteDg2L0FuZHJvaWRDb25maWcuaAppbmRleCAyNGY2Y2NjLi43ZGNhYTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FyY2gvbGludXgteDg2L0FuZHJvaWRDb25maWcuaAorKysgYi9pbmNsdWRlL2FyY2gvbGludXgteDg2L0FuZHJvaWRDb25maWcuaApAQCAtMTY0LDYgKzE2NCwxMSBAQAogI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxCiAKIC8qCisgKiBEZWZpbmUgaWYgcGxhdGZvcm0gaGFzIG9mZjY0X3QgKGFuZCBsc2VlazY0IGFuZCBvdGhlciB4eHg2NCBmdW5jdGlvbnMpCisgKi8KKyNkZWZpbmUgSEFWRV9PRkY2NF9UCisKKy8qCiAgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGJhY2t0cmFjZSgpIGNhbGwgZm9yIHJldHJpZXZpbmcgYSBzdGFjayB0cmFjZS4KICAqIE5lZWRlZCBmb3IgQ2FsbFN0YWNrIHRvIG9wZXJhdGU7IGlmIG5vdCBkZWZpbmVkLCBDYWxsU3RhY2sgaXMKICAqIG5vbi1mdW5jdGlvbmFsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL3RhcmdldF9saW51eC14ODYvQW5kcm9pZENvbmZpZy5oIGIvaW5jbHVkZS9hcmNoL3RhcmdldF9saW51eC14ODYvQW5kcm9pZENvbmZpZy5oCmluZGV4IDYxN2U3ZmEuLjA1ZGQyMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXJjaC90YXJnZXRfbGludXgteDg2L0FuZHJvaWRDb25maWcuaAorKysgYi9pbmNsdWRlL2FyY2gvdGFyZ2V0X2xpbnV4LXg4Ni9BbmRyb2lkQ29uZmlnLmgKQEAgLTE2Myw2ICsxNjMsMTEgQEAKICAqLwogCiAvKgorICogRGVmaW5lIGlmIHBsYXRmb3JtIGhhcyBvZmY2NF90IChhbmQgbHNlZWs2NCBhbmQgb3RoZXIgeHh4NjQgZnVuY3Rpb25zKQorICovCisjZGVmaW5lIEhBVkVfT0ZGNjRfVAorCisvKgogICogRGVmaW5lZCBpZiB3ZSBoYXZlIHRoZSBiYWNrdHJhY2UoKSBjYWxsIGZvciByZXRyaWV2aW5nIGEgc3RhY2sgdHJhY2UuCiAgKiBOZWVkZWQgZm9yIENhbGxTdGFjayB0byBvcGVyYXRlOyBpZiBub3QgZGVmaW5lZCwgQ2FsbFN0YWNrIGlzCiAgKiBub24tZnVuY3Rpb25hbC4KQEAgLTIyNyw3ICsyMzIsNyBAQAogLyoKICAqIERlZmluZSBpZiB3ZSBoYXZlIExpbnV4J3MgZGJ1cyAKICAqLwotI2RlZmluZSBIQVZFX0RCVVMgMQorLyogI2RlZmluZSBIQVZFX0RCVVMgMSAqLwogCiAvKgogICogRGVmaW5lIGlmIHRtIHN0cnVjdCBoYXMgdG1fZ210b2ZmIGZpZWxkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FyY2gvd2luZG93cy9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvd2luZG93cy9BbmRyb2lkQ29uZmlnLmgKaW5kZXggZjBiZjU2Zi4uYWQ4OTBiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hcmNoL3dpbmRvd3MvQW5kcm9pZENvbmZpZy5oCisrKyBiL2luY2x1ZGUvYXJjaC93aW5kb3dzL0FuZHJvaWRDb25maWcuaApAQCAtMTc3LDYgKzE3NywxMSBAQAogI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxCiAKIC8qCisgKiBEZWZpbmUgaWYgcGxhdGZvcm0gaGFzIG9mZjY0X3QgKGFuZCBsc2VlazY0IGFuZCBvdGhlciB4eHg2NCBmdW5jdGlvbnMpCisgKi8KKyNkZWZpbmUgSEFWRV9PRkY2NF9UCisKKy8qCiAgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGJhY2t0cmFjZSgpIGNhbGwgZm9yIHJldHJpZXZpbmcgYSBzdGFjayB0cmFjZS4KICAqIE5lZWRlZCBmb3IgQ2FsbFN0YWNrIHRvIG9wZXJhdGU7IGlmIG5vdCBkZWZpbmVkLCBDYWxsU3RhY2sgaXMKICAqIG5vbi1mdW5jdGlvbmFsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXRpbHMvYW5kcm9pZF9yZWJvb3QuaCBiL2luY2x1ZGUvY3V0aWxzL2FuZHJvaWRfcmVib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3OWJlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY3V0aWxzL2FuZHJvaWRfcmVib290LmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0NVVElMU19BTkRST0lEX1JFQk9PVF9IX18KKyNkZWZpbmUgX19DVVRJTFNfQU5EUk9JRF9SRUJPT1RfSF9fCisKK19fQkVHSU5fREVDTFMKKworLyogQ29tbWFuZHMgKi8KKyNkZWZpbmUgQU5EUk9JRF9SQl9SRVNUQVJUICAweERFQUQwMDAxCisjZGVmaW5lIEFORFJPSURfUkJfUE9XRVJPRkYgMHhERUFEMDAwMgorI2RlZmluZSBBTkRST0lEX1JCX1JFU1RBUlQyIDB4REVBRDAwMDMKKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgQU5EUk9JRF9SQl9GTEFHX05PX1NZTkMgICAgICAgMHgxCisjZGVmaW5lIEFORFJPSURfUkJfRkxBR19OT19SRU1PVU5UX1JPIDB4MgorCitpbnQgYW5kcm9pZF9yZWJvb3QoaW50IGNtZCwgaW50IGZsYWdzLCBjaGFyICphcmcpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX19DVVRJTFNfQU5EUk9JRF9SRUJPT1RfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1dGlscy9hdG9taWMtYXJtLmggYi9pbmNsdWRlL2N1dGlscy9hdG9taWMtYXJtLmgKaW5kZXggOTM2MzNjNC4uMTZmZTUxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jdXRpbHMvYXRvbWljLWFybS5oCisrKyBiL2luY2x1ZGUvY3V0aWxzL2F0b21pYy1hcm0uaApAQCAtMjgsMTggKzI4LDI5IEBACiAjaWYgQU5EUk9JRF9TTVAgPT0gMAogZXh0ZXJuIGlubGluZSB2b2lkIGFuZHJvaWRfbWVtb3J5X2JhcnJpZXIodm9pZCkKIHsKLSAgYW5kcm9pZF9jb21waWxlcl9iYXJyaWVyKCk7CisgICAgYW5kcm9pZF9jb21waWxlcl9iYXJyaWVyKCk7Cit9CitleHRlcm4gaW5saW5lIHZvaWQgYW5kcm9pZF9tZW1vcnlfc3RvcmVfYmFycmllcih2b2lkKQoreworICAgIGFuZHJvaWRfY29tcGlsZXJfYmFycmllcigpOwogfQogI2VsaWYgZGVmaW5lZChfX0FSTV9IQVZFX0RNQikKIGV4dGVybiBpbmxpbmUgdm9pZCBhbmRyb2lkX21lbW9yeV9iYXJyaWVyKHZvaWQpCiB7CiAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJkbWIiIDogOiA6ICJtZW1vcnkiKTsKIH0KK2V4dGVybiBpbmxpbmUgdm9pZCBhbmRyb2lkX21lbW9yeV9zdG9yZV9iYXJyaWVyKHZvaWQpCit7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJkbWIgc3QiIDogOiA6ICJtZW1vcnkiKTsKK30KICNlbGlmIGRlZmluZWQoX19BUk1fSEFWRV9MRFJFWF9TVFJFWCkKIGV4dGVybiBpbmxpbmUgdm9pZCBhbmRyb2lkX21lbW9yeV9iYXJyaWVyKHZvaWQpCiB7Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxMCwgNSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiA6ICJyIiAoMCkgOiAibWVtb3J5Iik7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxMCwgNSIgOiA6ICJyIiAoMCkgOiAibWVtb3J5Iik7Cit9CitleHRlcm4gaW5saW5lIHZvaWQgYW5kcm9pZF9tZW1vcnlfc3RvcmVfYmFycmllcih2b2lkKQoreworICAgIGFuZHJvaWRfbWVtb3J5X2JhcnJpZXIoKTsKIH0KICNlbHNlCiBleHRlcm4gaW5saW5lIHZvaWQgYW5kcm9pZF9tZW1vcnlfYmFycmllcih2b2lkKQpAQCAtNDcsNiArNTgsMTAgQEAKICAgICB0eXBlZGVmIHZvaWQgKGt1c2VyX21lbW9yeV9iYXJyaWVyKSh2b2lkKTsKICAgICAoKihrdXNlcl9tZW1vcnlfYmFycmllciAqKTB4ZmZmZjBmYTApKCk7CiB9CitleHRlcm4gaW5saW5lIHZvaWQgYW5kcm9pZF9tZW1vcnlfc3RvcmVfYmFycmllcih2b2lkKQoreworICAgIGFuZHJvaWRfbWVtb3J5X2JhcnJpZXIoKTsKK30KICNlbmRpZgogCiBleHRlcm4gaW5saW5lIGludDMyX3QgYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKHZvbGF0aWxlIGNvbnN0IGludDMyX3QgKnB0cikKQEAgLTEzMSwzOCArMTQ2LDYgQEAKIAogCiAjaWYgZGVmaW5lZChfX3RodW1iX18pCi1leHRlcm4gaW50MzJfdCBhbmRyb2lkX2F0b21pY19zd2FwKGludDMyX3QgbmV3X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICpwdHIpOwotI2VsaWYgZGVmaW5lZChfX0FSTV9IQVZFX0xEUkVYX1NUUkVYKQotZXh0ZXJuIGlubGluZSBpbnQzMl90IGFuZHJvaWRfYXRvbWljX3N3YXAoaW50MzJfdCBuZXdfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICpwdHIpCi17Ci0gICAgaW50MzJfdCBwcmV2LCBzdGF0dXM7Ci0gICAgZG8gewotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkcmV4ICUwLCBbJTNdXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZXggJTEsICU0LCBbJTNdIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAocHJldiksICI9JnIiIChzdGF0dXMpLCAiK20iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIgKHB0ciksICJyIiAobmV3X3ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiY2MiKTsKLSAgICB9IHdoaWxlIChfX2J1aWx0aW5fZXhwZWN0KHN0YXR1cyAhPSAwLCAwKSk7Ci0gICAgYW5kcm9pZF9tZW1vcnlfYmFycmllcigpOwotICAgIHJldHVybiBwcmV2OwotfQotI2Vsc2UKLWV4dGVybiBpbmxpbmUgaW50MzJfdCBhbmRyb2lkX2F0b21pY19zd2FwKGludDMyX3QgbmV3X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50MzJfdCAqcHRyKQotewotICAgIGludDMyX3QgcHJldjsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN3cCAlMCwgJTIsIFslM10iCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogIj0mciIgKHByZXYpLCAiK20iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAobmV3X3ZhbHVlKSwgInIiIChwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogImNjIik7Ci0gICAgYW5kcm9pZF9tZW1vcnlfYmFycmllcigpOwotICAgIHJldHVybiBwcmV2OwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fdGh1bWJfXykKIGV4dGVybiBpbnQzMl90IGFuZHJvaWRfYXRvbWljX2FkZChpbnQzMl90IGluY3JlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICpwdHIpOwogI2VsaWYgZGVmaW5lZChfX0FSTV9IQVZFX0xEUkVYX1NUUkVYKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXRpbHMvYXRvbWljLWlubGluZS5oIGIvaW5jbHVkZS9jdXRpbHMvYXRvbWljLWlubGluZS5oCmluZGV4IDcxNWUwYWEuLjQ5ZjNlNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3V0aWxzL2F0b21pYy1pbmxpbmUuaAorKysgYi9pbmNsdWRlL2N1dGlscy9hdG9taWMtaW5saW5lLmgKQEAgLTE3LDYgKzE3LDEwIEBACiAjaWZuZGVmIEFORFJPSURfQ1VUSUxTX0FUT01JQ19JTkxJTkVfSAogI2RlZmluZSBBTkRST0lEX0NVVElMU19BVE9NSUNfSU5MSU5FX0gKIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiAvKgogICogSW5saW5lIGRlY2xhcmF0aW9ucyBhbmQgbWFjcm9zIGZvciBzb21lIHNwZWNpYWwtcHVycG9zZSBhdG9taWMKICAqIG9wZXJhdGlvbnMuICBUaGVzZSBhcmUgaW50ZW5kZWQgZm9yIHJhcmUgY2lyY3Vtc3RhbmNlcyB3aGVyZSBhCkBAIC01NSw0ICs1OSwxNCBAQAogI2RlZmluZSBBTkRST0lEX01FTUJBUl9GVUxMIGFuZHJvaWRfbWVtb3J5X2JhcnJpZXIKICNlbmRpZgogCisjaWYgQU5EUk9JRF9TTVAgPT0gMAorI2RlZmluZSBBTkRST0lEX01FTUJBUl9TVE9SRSBhbmRyb2lkX2NvbXBpbGVyX2JhcnJpZXIKKyNlbHNlCisjZGVmaW5lIEFORFJPSURfTUVNQkFSX1NUT1JFIGFuZHJvaWRfbWVtb3J5X3N0b3JlX2JhcnJpZXIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCiAjZW5kaWYgLyogQU5EUk9JRF9DVVRJTFNfQVRPTUlDX0lOTElORV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1dGlscy9hdG9taWMteDg2LmggYi9pbmNsdWRlL2N1dGlscy9hdG9taWMteDg2LmgKaW5kZXggMTJhMTk4NS4uNDM4MDEyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jdXRpbHMvYXRvbWljLXg4Ni5oCisrKyBiL2luY2x1ZGUvY3V0aWxzL2F0b21pYy14ODYuaApAQCAtMjksMTEgKzI5LDE5IEBACiB7CiAgICAgYW5kcm9pZF9jb21waWxlcl9iYXJyaWVyKCk7CiB9CitleHRlcm4gaW5saW5lIHZvaWQgYW5kcm9pZF9tZW1vcnlfc3RvcmVfYmFycmllcih2b2lkKQoreworICAgIGFuZHJvaWRfY29tcGlsZXJfYmFycmllcigpOworfQogI2Vsc2UKIGV4dGVybiBpbmxpbmUgdm9pZCBhbmRyb2lkX21lbW9yeV9iYXJyaWVyKHZvaWQpCiB7CiAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKIH0KK2V4dGVybiBpbmxpbmUgdm9pZCBhbmRyb2lkX21lbW9yeV9zdG9yZV9iYXJyaWVyKHZvaWQpCit7CisgICAgYW5kcm9pZF9jb21waWxlcl9iYXJyaWVyKCk7Cit9CiAjZW5kaWYKIAogZXh0ZXJuIGlubGluZSBpbnQzMl90IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCh2b2xhdGlsZSBjb25zdCBpbnQzMl90ICpwdHIpCkBAIC05MCwxNyArOTgsNiBAQAogICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19jYXMob2xkX3ZhbHVlLCBuZXdfdmFsdWUsIHB0cik7CiB9CiAKLWV4dGVybiBpbmxpbmUgaW50MzJfdCBhbmRyb2lkX2F0b21pY19zd2FwKGludDMyX3QgbmV3X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50MzJfdCAqcHRyKQotewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgieGNoZ2wgJTEsICUwIgotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKG5ld192YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibSIgKCpwdHIpLCAiMCIgKG5ld192YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0gICAgLyogbmV3X3ZhbHVlIG5vdyBob2xkcyB0aGUgb2xkIHZhbHVlIG9mICpwdHIgKi8KLSAgICByZXR1cm4gbmV3X3ZhbHVlOwotfQotCiBleHRlcm4gaW5saW5lIGludDMyX3QgYW5kcm9pZF9hdG9taWNfYWRkKGludDMyX3QgaW5jcmVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICpwdHIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1dGlscy9hdG9taWMuaCBiL2luY2x1ZGUvY3V0aWxzL2F0b21pYy5oCmluZGV4IGE1MGJmMGYuLmFlNDJlYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3V0aWxzL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvY3V0aWxzL2F0b21pYy5oCkBAIC05MCwxMyArOTAsNiBAQAogdm9pZCBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKGludDMyX3QgdmFsdWUsIHZvbGF0aWxlIGludDMyX3QqIGFkZHIpOwogCiAvKgotICogVW5jb25kaXRpb25hbCBzd2FwIG9wZXJhdGlvbiB3aXRoIHJlbGVhc2Ugb3JkZXJpbmcuCi0gKgotICogU3RvcmVzIHRoZSBuZXcgdmFsdWUgYXQgKmFkZHIsIGFuZCByZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZS4KLSAqLwotaW50MzJfdCBhbmRyb2lkX2F0b21pY19zd2FwKGludDMyX3QgdmFsdWUsIHZvbGF0aWxlIGludDMyX3QqIGFkZHIpOwotCi0vKgogICogQ29tcGFyZS1hbmQtc2V0IG9wZXJhdGlvbiB3aXRoICJhY3F1aXJlIiBvciAicmVsZWFzZSIgb3JkZXJpbmcuCiAgKgogICogVGhpcyByZXR1cm5zIHplcm8gaWYgdGhlIG5ldyB2YWx1ZSB3YXMgc3VjY2Vzc2Z1bGx5IHN0b3JlZCwgd2hpY2ggd2lsbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jdXRpbHMvYml0b3BzLmggYi9pbmNsdWRlL2N1dGlscy9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNiNzYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jdXRpbHMvYml0b3BzLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19DVVRJTFNfQklUT1BTX0gKKyNkZWZpbmUgX19DVVRJTFNfQklUT1BTX0gKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3N0YXRpYyBpbmxpbmUgaW50IHBvcGNvdW50KHVuc2lnbmVkIGludCB4KQoreworICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQoeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBvcGNvdW50bCh1bnNpZ25lZCBsb25nIHgpCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGwoeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBvcGNvdW50bGwodW5zaWduZWQgbG9uZyBsb25nIHgpCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGxsKHgpOworfQorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX19DVVRJTFNfQklUT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3V0aWxzL2xvZy5oIGIvaW5jbHVkZS9jdXRpbHMvbG9nLmgKaW5kZXggZGQ0N2MzNS4uNDJkNzM4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jdXRpbHMvbG9nLmgKKysrIGIvaW5jbHVkZS9jdXRpbHMvbG9nLmgKQEAgLTI4OSwxMyArMjg5LDE3IEBACiAgKiBJdCBpcyBOT1Qgc3RyaXBwZWQgZnJvbSByZWxlYXNlIGJ1aWxkcy4gIE5vdGUgdGhhdCB0aGUgY29uZGl0aW9uIHRlc3QKICAqIGlzIC1pbnZlcnRlZC0gZnJvbSB0aGUgbm9ybWFsIGFzc2VydCgpIHNlbWFudGljcy4KICAqLworI2lmbmRlZiBMT0dfQUxXQVlTX0ZBVEFMX0lGCiAjZGVmaW5lIExPR19BTFdBWVNfRkFUQUxfSUYoY29uZCwgLi4uKSBcCiAgICAgKCAoQ09ORElUSU9OKGNvbmQpKSBcCi0gICAgPyAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydCgjY29uZCwgTE9HX1RBRywgX19WQV9BUkdTX18pKSBcCisgICAgPyAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydCgjY29uZCwgTE9HX1RBRywgIyMgX19WQV9BUkdTX18pKSBcCiAgICAgOiAodm9pZCkwICkKKyNlbmRpZgogCisjaWZuZGVmIExPR19BTFdBWVNfRkFUQUwKICNkZWZpbmUgTE9HX0FMV0FZU19GQVRBTCguLi4pIFwKLSAgICAoICgodm9pZClhbmRyb2lkX3ByaW50QXNzZXJ0KE5VTEwsIExPR19UQUcsIF9fVkFfQVJHU19fKSkgKQorICAgICggKCh2b2lkKWFuZHJvaWRfcHJpbnRBc3NlcnQoTlVMTCwgTE9HX1RBRywgIyMgX19WQV9BUkdTX18pKSApCisjZW5kaWYKIAogLyoKICAqIFZlcnNpb25zIG9mIExPR19BTFdBWVNfRkFUQUxfSUYgYW5kIExPR19BTFdBWVNfRkFUQUwgdGhhdApAQCAtMzAzLDEzICszMDcsMjEgQEAKICAqLwogI2lmIExPR19OREVCVUcKIAorI2lmbmRlZiBMT0dfRkFUQUxfSUYKICNkZWZpbmUgTE9HX0ZBVEFMX0lGKGNvbmQsIC4uLikgKCh2b2lkKTApCisjZW5kaWYKKyNpZm5kZWYgTE9HX0ZBVEFMCiAjZGVmaW5lIExPR19GQVRBTCguLi4pICgodm9pZCkwKQorI2VuZGlmCiAKICNlbHNlCiAKLSNkZWZpbmUgTE9HX0ZBVEFMX0lGKGNvbmQsIC4uLikgTE9HX0FMV0FZU19GQVRBTF9JRihjb25kLCBfX1ZBX0FSR1NfXykKKyNpZm5kZWYgTE9HX0ZBVEFMX0lGCisjZGVmaW5lIExPR19GQVRBTF9JRihjb25kLCAuLi4pIExPR19BTFdBWVNfRkFUQUxfSUYoY29uZCwgIyMgX19WQV9BUkdTX18pCisjZW5kaWYKKyNpZm5kZWYgTE9HX0ZBVEFMCiAjZGVmaW5lIExPR19GQVRBTCguLi4pIExPR19BTFdBWVNfRkFUQUwoX19WQV9BUkdTX18pCisjZW5kaWYKIAogI2VuZGlmCiAKQEAgLTMxNyw4ICszMjksMTAgQEAKICAqIEFzc2VydGlvbiB0aGF0IGdlbmVyYXRlcyBhIGxvZyBtZXNzYWdlIHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4KICAqIFN0cmlwcGVkIG91dCBvZiByZWxlYXNlIGJ1aWxkcy4gIFVzZXMgdGhlIGN1cnJlbnQgTE9HX1RBRy4KICAqLwotI2RlZmluZSBMT0dfQVNTRVJUKGNvbmQsIC4uLikgTE9HX0ZBVEFMX0lGKCEoY29uZCksIF9fVkFfQVJHU19fKQorI2lmbmRlZiBMT0dfQVNTRVJUCisjZGVmaW5lIExPR19BU1NFUlQoY29uZCwgLi4uKSBMT0dfRkFUQUxfSUYoIShjb25kKSwgIyMgX19WQV9BUkdTX18pCiAvLyNkZWZpbmUgTE9HX0FTU0VSVChjb25kKSBMT0dfRkFUQUxfSUYoIShjb25kKSwgIkFzc2VydGlvbiBmYWlsZWQ6ICIgI2NvbmQpCisjZW5kaWYKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM3NywxOCArMzkxLDI0IEBACiB9IEFuZHJvaWRFdmVudExvZ1R5cGU7CiAKIAorI2lmbmRlZiBMT0dfRVZFTlRfSU5UCiAjZGVmaW5lIExPR19FVkVOVF9JTlQoX3RhZywgX3ZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpbnQgaW50QnVmID0gX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKHZvaWQpIGFuZHJvaWRfYnRXcml0ZUxvZyhfdGFnLCBFVkVOVF9UWVBFX0lOVCwgJmludEJ1ZiwgICAgICAgICAgICBcCiAgICAgICAgICAgICBzaXplb2YoaW50QnVmKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KKyNlbmRpZgorI2lmbmRlZiBMT0dfRVZFTlRfTE9ORwogI2RlZmluZSBMT0dfRVZFTlRfTE9ORyhfdGFnLCBfdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbG9uZyBsb25nIGxvbmdCdWYgPSBfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICh2b2lkKSBhbmRyb2lkX2J0V3JpdGVMb2coX3RhZywgRVZFTlRfVFlQRV9MT05HLCAmbG9uZ0J1ZiwgICAgICAgICAgXAogICAgICAgICAgICAgc2l6ZW9mKGxvbmdCdWYpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CisjZW5kaWYKKyNpZm5kZWYgTE9HX0VWRU5UX1NUUklORwogI2RlZmluZSBMT0dfRVZFTlRfU1RSSU5HKF90YWcsIF92YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAoKHZvaWQpIDApICAvKiBub3QgaW1wbGVtZW50ZWQgLS0gbXVzdCBjb21iaW5lIGxlbiB3aXRoIHN0cmluZyAqLworI2VuZGlmCiAvKiBUT0RPOiBzb21ldGhpbmcgZm9yIExJU1QgKi8KIAogLyoKQEAgLTQwMyw4ICs0MjMsMjQgQEAKICNkZWZpbmUgYW5kcm9pZF92cHJpbnRMb2cocHJpbywgY29uZCwgdGFnLCBmbXQuLi4pIFwKICAgICBfX2FuZHJvaWRfbG9nX3ZwcmludChwcmlvLCB0YWcsIGZtdCkKIAorLyogWFhYIE1hY3JvcyB0byB3b3JrIGFyb3VuZCBzeW50YXggZXJyb3JzIGluIHBsYWNlcyB3aGVyZSBmb3JtYXQgc3RyaW5nCisgKiBhcmcgaXMgbm90IHBhc3NlZCB0byBMT0dfQVNTRVJULCBMT0dfQUxXQVlTX0ZBVEFMIG9yIExPR19BTFdBWVNfRkFUQUxfSUYKKyAqIChoYXBwZW5zIG9ubHkgaW4gZGVidWcgYnVpbGRzKS4KKyAqLworCisvKiBSZXR1cm5zIDJuZCBhcmcuICBVc2VkIHRvIHN1YnN0aXR1dGUgZGVmYXVsdCB2YWx1ZSBpZiBjYWxsZXIncyB2YXJhcmcgbGlzdAorICogaXMgZW1wdHkuCisgKi8KKyNkZWZpbmUgX19hbmRyb2lkX3NlY29uZChkdW1teSwgc2Vjb25kLCAuLi4pICAgICBzZWNvbmQKKworLyogSWYgcGFzc2VkIG11bHRpcGxlIGFyZ3MsIHJldHVybnMgJywnIGZvbGxvd2VkIGJ5IGFsbCBidXQgMXN0IGFyZywgb3RoZXJ3aXNlCisgKiByZXR1cm5zIG5vdGhpbmcuCisgKi8KKyNkZWZpbmUgX19hbmRyb2lkX3Jlc3QoZmlyc3QsIC4uLikgICAgICAgICAgICAgICAsICMjIF9fVkFfQVJHU19fCisKICNkZWZpbmUgYW5kcm9pZF9wcmludEFzc2VydChjb25kLCB0YWcsIGZtdC4uLikgXAotICAgIF9fYW5kcm9pZF9sb2dfYXNzZXJ0KGNvbmQsIHRhZywgZm10KQorICAgIF9fYW5kcm9pZF9sb2dfYXNzZXJ0KGNvbmQsIHRhZywgXAorICAgICAgICBfX2FuZHJvaWRfc2Vjb25kKDAsICMjIGZtdCwgTlVMTCkgX19hbmRyb2lkX3Jlc3QoZm10KSkKIAogI2RlZmluZSBhbmRyb2lkX3dyaXRlTG9nKHByaW8sIHRhZywgdGV4dCkgXAogICAgIF9fYW5kcm9pZF9sb2dfd3JpdGUocHJpbywgdGFnLCB0ZXh0KQpAQCAtNDEzLDcgKzQ0OSw3IEBACiAgICAgX19hbmRyb2lkX2xvZ19id3JpdGUodGFnLCBwYXlsb2FkLCBsZW4pCiAjZGVmaW5lIGFuZHJvaWRfYnRXcml0ZUxvZyh0YWcsIHR5cGUsIHBheWxvYWQsIGxlbikgXAogICAgIF9fYW5kcm9pZF9sb2dfYnR3cml0ZSh0YWcsIHR5cGUsIHBheWxvYWQsIGxlbikKLQkKKwogLy8gVE9ETzogcmVtb3ZlIHRoZXNlIHByb3RvdHlwZXMgYW5kIHRoZWlyIHVzZXJzCiAjZGVmaW5lIGFuZHJvaWRfdGVzdExvZyhwcmlvLCB0YWcpICgxKQogI2RlZmluZSBhbmRyb2lkX3dyaXRldkxvZyh2ZWMsbnVtKSBkb3t9d2hpbGUoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCBiL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaAppbmRleCA4OWQ2YjY1Li4yNjhjNWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgKKysrIGIvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oCkBAIC0yMSw3ICsyMSw3IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdAordHlwZWRlZiBzdHJ1Y3QgbmF0aXZlX2hhbmRsZQogewogICAgIGludCB2ZXJzaW9uOyAgICAgICAgLyogc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkgKi8KICAgICBpbnQgbnVtRmRzOyAgICAgICAgIC8qIG51bWJlciBvZiBmaWxlLWRlc2NyaXB0b3JzIGF0ICZkYXRhWzBdICovCkBAIC0yOSwxMCArMjksNiBAQAogICAgIGludCBkYXRhWzBdOyAgICAgICAgLyogbnVtRmRzICsgbnVtSW50cyBpbnRzICovCiB9IG5hdGl2ZV9oYW5kbGVfdDsKIAotCi0vKiBrZWVwIHRoZSBvbGQgZGVmaW5pdGlvbiBmb3IgYmFja3dhcmQgc291cmNlLWNvbXBhdGliaWxpdHkgKi8KLXR5cGVkZWYgbmF0aXZlX2hhbmRsZV90IG5hdGl2ZV9oYW5kbGU7Ci0KIC8qCiAgKiBuYXRpdmVfaGFuZGxlX2Nsb3NlCiAgKiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIGIvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3Yzk5NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQ1VUSUxTX1NUUl9QQVJNU19ICisjZGVmaW5lIF9fQ1VUSUxTX1NUUl9QQVJNU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IHN0cl9wYXJtczsKKworc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zX2NyZWF0ZSh2b2lkKTsKK3N0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtc19jcmVhdGVfc3RyKGNvbnN0IGNoYXIgKl9zdHJpbmcpOwordm9pZCBzdHJfcGFybXNfZGVzdHJveShzdHJ1Y3Qgc3RyX3Bhcm1zICpzdHJfcGFybXMpOworCit2b2lkIHN0cl9wYXJtc19kZWwoc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zLCBjb25zdCBjaGFyICprZXkpOworCitpbnQgc3RyX3Bhcm1zX2FkZF9zdHIoc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zLCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworaW50IHN0cl9wYXJtc19hZGRfaW50KHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcywgY29uc3QgY2hhciAqa2V5LCBpbnQgdmFsdWUpOworCitpbnQgc3RyX3Bhcm1zX2FkZF9mbG9hdChzdHJ1Y3Qgc3RyX3Bhcm1zICpzdHJfcGFybXMsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlKTsKKworaW50IHN0cl9wYXJtc19nZXRfc3RyKHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcywgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm91dF92YWwsIGludCBsZW4pOworaW50IHN0cl9wYXJtc19nZXRfaW50KHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcywgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X3ZhbCk7CitpbnQgc3RyX3Bhcm1zX2dldF9mbG9hdChzdHJ1Y3Qgc3RyX3Bhcm1zICpzdHJfcGFybXMsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRfdmFsKTsKKworY2hhciAqc3RyX3Bhcm1zX3RvX3N0cihzdHJ1Y3Qgc3RyX3Bhcm1zICpzdHJfcGFybXMpOworCisvKiBkZWJ1ZyAqLwordm9pZCBzdHJfcGFybXNfZHVtcChzdHJ1Y3Qgc3RyX3Bhcm1zICpzdHJfcGFybXMpOworCisjZW5kaWYgLyogX19DVVRJTFNfU1RSX1BBUk1TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIGIvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3MTQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQ1VUSUxTX1VFVkVOVF9ICisjZGVmaW5lIF9fQ1VUSUxTX1VFVkVOVF9ICisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3NpemVfdCB1ZXZlbnRfY2hlY2tlZF9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0NVVElMU19VRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXR1dGlscy9kaGNwLmggYi9pbmNsdWRlL25ldHV0aWxzL2RoY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE2MjQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXR1dGlscy9kaGNwLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9ORVRVVElMU19ESENQX0hfCisjZGVmaW5lIF9ORVRVVElMU19ESENQX0hfCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IGRvX2RoY3AoY2hhciAqaW5hbWUpOworZXh0ZXJuIGludCBkaGNwX2RvX3JlcXVlc3QoY29uc3QgY2hhciAqaWZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppcGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmdhdGV3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwcmVmaXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRuczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRuczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICpsZWFzZSk7CitleHRlcm4gaW50IGRoY3Bfc3RvcChjb25zdCBjaGFyICppZm5hbWUpOworZXh0ZXJuIGludCBkaGNwX3JlbGVhc2VfbGVhc2UoY29uc3QgY2hhciAqaWZuYW1lKTsKK2V4dGVybiBjaGFyICpkaGNwX2dldF9lcnJtc2coKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9ORVRVVElMU19ESENQX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldHV0aWxzL2lmYy5oIGIvaW5jbHVkZS9uZXR1dGlscy9pZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjgyN2VlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXR1dGlscy9pZmMuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05FVFVUSUxTX0lGQ19IXworI2RlZmluZSBfTkVUVVRJTFNfSUZDX0hfCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IGlmY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWZjX2Nsb3NlKHZvaWQpOworCitleHRlcm4gaW50IGlmY19nZXRfaWZpbmRleChjb25zdCBjaGFyICpuYW1lLCBpbnQgKmlmX2luZGV4cCk7CitleHRlcm4gaW50IGlmY19nZXRfaHdhZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnB0cik7CisKK2V4dGVybiBpbnQgaWZjX3VwKGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBpZmNfZG93bihjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIGludCBpZmNfZW5hYmxlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CitleHRlcm4gaW50IGlmY19kaXNhYmxlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CisKK2V4dGVybiBpbnQgaWZjX3Jlc2V0X2Nvbm5lY3Rpb25zKGNvbnN0IGNoYXIgKmlmbmFtZSk7CisKK2V4dGVybiBpbnQgaWZjX2dldF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCAqYWRkcik7CitleHRlcm4gaW50IGlmY19zZXRfYWRkcihjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcik7CitleHRlcm4gaW50IGlmY19nZXRfcHJlZml4TGVuZ3RoKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90ICpwcmVmaXhMZW5ndGgpOworZXh0ZXJuIGludCBpZmNfc2V0X3ByZWZpeExlbmd0aChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBwcmVmaXhMZW5ndGgpOworZXh0ZXJuIGludCBpZmNfc2V0X2h3YWRkcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpwdHIpOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBpZmNfYWRkX3JvdXRlIGluc3RlYWQuICovCitleHRlcm4gaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcik7CitleHRlcm4gaW50IGlmY19yZW1vdmVfaG9zdF9yb3V0ZXMoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gaW50IGlmY19nZXRfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUpOworLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgaWZjX2FkZF9yb3V0ZSBpbnN0ZWFkICovCitleHRlcm4gaW50IGlmY19zZXRfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIGluX2FkZHJfdCBnYXRld2F5KTsKKy8qIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIGlmY19hZGRfcm91dGUgaW5zdGVhZCAqLworZXh0ZXJuIGludCBpZmNfY3JlYXRlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90IGFkZHIpOworZXh0ZXJuIGludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2V4dGVybiBpbnQgaWZjX2FkZF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphZGRyLCBpbnQgcHJlZml4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpndyk7CisKK2V4dGVybiBpbnQgaWZjX2dldF9pbmZvKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCAqYWRkciwgaW5fYWRkcl90ICptYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpmbGFncyk7CisKK2V4dGVybiBpbnQgaWZjX2NvbmZpZ3VyZShjb25zdCBjaGFyICppZm5hbWUsIGluX2FkZHJfdCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZpeExlbmd0aCwgaW5fYWRkcl90IGdhdGV3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IGRuczEsIGluX2FkZHJfdCBkbnMyKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9ORVRVVElMU19JRkNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oIGIvaW5jbHVkZS9waXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmgKaW5kZXggZGNhMGI5MC4uOGEyYjQ0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9waXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9waXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmgKQEAgLTMxNSw3ICszMTUsNyBAQAogc3NpemVfdCBnZ2xJbml0KEdHTENvbnRleHQqKiBjb250ZXh0KTsKIHNzaXplX3QgZ2dsVW5pbml0KEdHTENvbnRleHQqIGNvbnRleHQpOwogCi1HR0xpbnQgZ2dsQml0Qmx0aSgKK0dHTGludCBnZ2xCaXRCbGl0KAogICAgICAgICBHR0xDb250ZXh0KiBjLAogICAgICAgICBpbnQgdG11LAogICAgICAgICBHR0xpbnQgY3JvcFs0XSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggYi9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCmluZGV4IDg0OGIxMDAuLjU1ZDkyMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaApAQCAtNTIsMTAgKzUyLDEyIEBACiAjZGVmaW5lIEFJRF9WUE4gICAgICAgICAgIDEwMTYgIC8qIHZwbiBzeXN0ZW0gKi8KICNkZWZpbmUgQUlEX0tFWVNUT1JFICAgICAgMTAxNyAgLyoga2V5c3RvcmUgc3Vic3lzdGVtICovCiAjZGVmaW5lIEFJRF9VU0IgICAgICAgICAgIDEwMTggIC8qIFVTQiBkZXZpY2VzICovCisjZGVmaW5lIEFJRF9EUk0gICAgICAgICAgIDEwMTkgIC8qIERSTSBzZXJ2ZXIgKi8KKyNkZWZpbmUgQUlEX0tFWUNIQUlOICAgICAgMTAyMCAgLyoga2V5Y2hhaW4gc2VydmljZSAqLwogI2RlZmluZSBBSURfR1BTICAgICAgICAgICAxMDIxICAvKiBHUFMgZGFlbW9uICovCiAjZGVmaW5lIEFJRF9VTlVTRUQxICAgICAgIDEwMjIgIC8qIGRlcHJlY2F0ZWQsIERPIE5PVCBVU0UgKi8KLSNkZWZpbmUgQUlEX1JGVTEgICAgICAgICAgMTAyMyAgLyogUkZVICovCi0jZGVmaW5lIEFJRF9SRlUyICAgICAgICAgIDEwMjQgIC8qIFJGVSAqLworI2RlZmluZSBBSURfTUVESUFfUlcgICAgICAxMDIzICAvKiBpbnRlcm5hbCBtZWRpYSBzdG9yYWdlIHdyaXRlIGFjY2VzcyAqLworI2RlZmluZSBBSURfTVRQICAgICAgICAgICAxMDI0ICAvKiBNVFAgVVNCIGRyaXZlciBhY2Nlc3MgKi8KICNkZWZpbmUgQUlEX05GQyAgICAgICAgICAgMTAyNSAgLyogbmZjIHN1YnN5c3RlbSAqLwogCiAjZGVmaW5lIEFJRF9TSEVMTCAgICAgICAgIDIwMDAgIC8qIGFkYiBhbmQgZGVidWcgc2hlbGwgdXNlciAqLwpAQCAtOTgsNiArMTAwLDggQEAKICAgICB7ICJhZGIiLCAgICAgICBBSURfQURCLCB9LAogICAgIHsgImluc3RhbGwiLCAgIEFJRF9JTlNUQUxMLCB9LAogICAgIHsgIm1lZGlhIiwgICAgIEFJRF9NRURJQSwgfSwKKyAgICB7ICJkcm0iLCAgICAgICBBSURfRFJNLCB9LAorICAgIHsgImtleWNoYWluIiwgIEFJRF9LRVlDSEFJTiwgfSwKICAgICB7ICJuZmMiLCAgICAgICBBSURfTkZDLCB9LAogICAgIHsgInNoZWxsIiwgICAgIEFJRF9TSEVMTCwgfSwKICAgICB7ICJjYWNoZSIsICAgICBBSURfQ0FDSEUsIH0sCkBAIC0xMDUsOSArMTA5LDExIEBACiAgICAgeyAibmV0X2J0X2FkbWluIiwgQUlEX05FVF9CVF9BRE1JTiwgfSwKICAgICB7ICJuZXRfYnQiLCAgICBBSURfTkVUX0JULCB9LAogICAgIHsgInNkY2FyZF9ydyIsIEFJRF9TRENBUkRfUlcsIH0sCisgICAgeyAibWVkaWFfcnciLCAgQUlEX01FRElBX1JXLCB9LAogICAgIHsgInZwbiIsICAgICAgIEFJRF9WUE4sIH0sCiAgICAgeyAia2V5c3RvcmUiLCAgQUlEX0tFWVNUT1JFLCB9LAogICAgIHsgInVzYiIsICAgICAgIEFJRF9VU0IsIH0sCisgICAgeyAibXRwIiwgICAgICAgQUlEX01UUCwgfSwKICAgICB7ICJncHMiLCAgICAgICBBSURfR1BTLCB9LAogICAgIHsgImluZXQiLCAgICAgIEFJRF9JTkVULCB9LAogICAgIHsgIm5ldF9yYXciLCAgIEFJRF9ORVRfUkFXLCB9LApAQCAtMTQyLDYgKzE0OCw4IEBACiAgICAgeyAwMDc3MSwgQUlEX1NIRUxMLCAgQUlEX1NIRUxMLCAgImRhdGEvbG9jYWwiIH0sCiAgICAgeyAwMTc3MSwgQUlEX1NZU1RFTSwgQUlEX01JU0MsICAgImRhdGEvbWlzYyIgfSwKICAgICB7IDAwNzcwLCBBSURfREhDUCwgICBBSURfREhDUCwgICAiZGF0YS9taXNjL2RoY3AiIH0sCisgICAgeyAwMDc3NSwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcsICJkYXRhL21lZGlhIiB9LAorICAgIHsgMDA3NzUsIEFJRF9NRURJQV9SVywgQUlEX01FRElBX1JXLCAiZGF0YS9tZWRpYS9NdXNpYyIgfSwKICAgICB7IDAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNLCAiZGF0YSIgfSwKICAgICB7IDAwNzUwLCBBSURfUk9PVCwgICBBSURfU0hFTEwsICAic2JpbiIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICBBSURfU0hFTEwsICAic3lzdGVtL2JpbiIgfSwKQEAgLTE2OSwxMSArMTc3LDE0IEBACiAgICAgeyAwMDQ0MCwgQUlEX0JMVUVUT09USCwgQUlEX0JMVUVUT09USCwgInN5c3RlbS9ldGMvYmx1ZXRvb3RoL21haW4uY29uZiIgfSwKICAgICB7IDAwNDQwLCBBSURfQkxVRVRPT1RILCBBSURfQkxVRVRPT1RILCAic3lzdGVtL2V0Yy9ibHVldG9vdGgvaW5wdXQuY29uZiIgfSwKICAgICB7IDAwNDQwLCBBSURfQkxVRVRPT1RILCBBSURfQkxVRVRPT1RILCAic3lzdGVtL2V0Yy9ibHVldG9vdGgvYXVkaW8uY29uZiIgfSwKKyAgICB7IDAwNDQwLCBBSURfQkxVRVRPT1RILCBBSURfQkxVRVRPT1RILCAic3lzdGVtL2V0Yy9ibHVldG9vdGgvbmV0d29yay5jb25mIiB9LAogICAgIHsgMDA0NDQsIEFJRF9ORVRfQlQsICAgIEFJRF9ORVRfQlQsICAgICJzeXN0ZW0vZXRjL2JsdWV0b290aC9ibGFja2xpc3QuY29uZiIgfSwKICAgICB7IDAwNjQwLCBBSURfU1lTVEVNLCAgICBBSURfU1lTVEVNLCAgICAic3lzdGVtL2V0Yy9ibHVldG9vdGgvYXV0b19wYWlyaW5nLmNvbmYiIH0sCiAgICAgeyAwMDQ0NCwgQUlEX1JBRElPLCAgICAgQUlEX0FVRElPLCAgICAgInN5c3RlbS9ldGMvQXVkaW9QYXJhNC5jc3YiIH0sCiAgICAgeyAwMDU1NSwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgInN5c3RlbS9ldGMvcHBwLyoiIH0sCisgICAgeyAwMDU1NSwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgInN5c3RlbS9ldGMvcmMuKiIgfSwKICAgICB7IDAwNjQ0LCBBSURfU1lTVEVNLCAgICBBSURfU1lTVEVNLCAgICAiZGF0YS9hcHAvKiIgfSwKKyAgICB7IDAwNjQ0LCBBSURfTUVESUFfUlcsICBBSURfTUVESUFfUlcsICAiZGF0YS9tZWRpYS8qIiB9LAogICAgIHsgMDA2NDQsIEFJRF9TWVNURU0sICAgIEFJRF9TWVNURU0sICAgICJkYXRhL2FwcC1wcml2YXRlLyoiIH0sCiAgICAgeyAwMDY0NCwgQUlEX0FQUCwgICAgICAgQUlEX0FQUCwgICAgICAgImRhdGEvZGF0YS8qIiB9LAogICAgICAgICAvKiB0aGUgZm9sbG93aW5nIHR3byBmaWxlcyBhcmUgSU5URU5USU9OQUxMWSBzZXQtZ2lkIGFuZCBub3Qgc2V0LXVpZC4KQEAgLTE5Miw2ICsyMDMsNyBAQAogCQkgKiBpbiB1c2VyIGJ1aWxkcy4gKi8KICAgICB7IDA2NzUwLCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAic3lzdGVtL2Jpbi9ydW4tYXMiIH0sCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1NIRUxMLCAgICAgInN5c3RlbS9iaW4vKiIgfSwKKyAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAic3lzdGVtL2xpYi92YWxncmluZC8qIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgICJzeXN0ZW0veGJpbi8qIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgICJzeXN0ZW0vdmVuZG9yL2Jpbi8qIiB9LAogICAgIHsgMDA3NTAsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgICJzYmluLyoiIH0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c3RlbS9hdWRpby5oIGIvaW5jbHVkZS9zeXN0ZW0vYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjJhYzBjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zeXN0ZW0vYXVkaW8uaApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0NPUkVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0NPUkVfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBlbnVtcyB3ZXJlIG1vdmVkIGhlcmUgbW9zdGx5IGZyb20KKyAqIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKyAqLworCit0eXBlZGVmIGludCBhdWRpb19pb19oYW5kbGVfdDsKKworLyogQXVkaW8gc3RyZWFtIHR5cGVzICovCit0eXBlZGVmIGVudW0geworICAgIEFVRElPX1NUUkVBTV9ERUZBVUxUICAgICAgICAgID0gLTEsCisgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgICAgICAgPSAwLAorICAgIEFVRElPX1NUUkVBTV9TWVNURU0gICAgICAgICAgID0gMSwKKyAgICBBVURJT19TVFJFQU1fUklORyAgICAgICAgICAgICA9IDIsCisgICAgQVVESU9fU1RSRUFNX01VU0lDICAgICAgICAgICAgPSAzLAorICAgIEFVRElPX1NUUkVBTV9BTEFSTSAgICAgICAgICAgID0gNCwKKyAgICBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OICAgICA9IDUsCisgICAgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gICAgPSA2LAorICAgIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFID0gNywgLyogU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QgYmUgcm91dGVkIHRvIHNwZWFrZXIgKi8KKyAgICBBVURJT19TVFJFQU1fRFRNRiAgICAgICAgICAgICA9IDgsCisgICAgQVVESU9fU1RSRUFNX1RUUyAgICAgICAgICAgICAgPSA5LAorCisgICAgQVVESU9fU1RSRUFNX0NOVCwKKyAgICBBVURJT19TVFJFQU1fTUFYICAgICAgICAgICAgICA9IEFVRElPX1NUUkVBTV9DTlQgLSAxLAorfSBhdWRpb19zdHJlYW1fdHlwZV90OworCisvKiBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0cworICogaW4gbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YSEKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBVURJT19TT1VSQ0VfREVGQVVMVCAgICAgICAgICAgICA9IDAsCisgICAgQVVESU9fU09VUkNFX01JQyAgICAgICAgICAgICAgICAgPSAxLAorICAgIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksgICAgICAgID0gMiwKKyAgICBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgICAgICA9IDMsCisgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwgICAgICAgICAgPSA0LAorICAgIEFVRElPX1NPVVJDRV9DQU1DT1JERVIgICAgICAgICAgID0gNSwKKyAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gICA9IDYsCisgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gPSA3LAorCisgICAgQVVESU9fU09VUkNFX0NOVCwKKyAgICBBVURJT19TT1VSQ0VfTUFYICAgICAgICAgICAgICAgICA9IEFVRElPX1NPVVJDRV9DTlQgLSAxLAorfSBhdWRpb19zb3VyY2VfdDsKKworLyogc3BlY2lhbCBhdWRpbyBzZXNzaW9uIHZhbHVlcworICogKFhYWDogc2hvdWxkIHRoaXMgYmUgbGl2aW5nIGluIHRoZSBhdWRpbyBlZmZlY3RzIGxhbmQ/KQorICovCit0eXBlZGVmIGVudW0geworICAgIC8qIHNlc3Npb24gZm9yIGVmZmVjdHMgYXR0YWNoZWQgdG8gYSBwYXJ0aWN1bGFyIG91dHB1dCBzdHJlYW0KKyAgICAgKiAodmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gMCkKKyAgICAgKi8KKyAgICBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSA9IC0xLAorCisgICAgLyogc2Vzc2lvbiBmb3IgZWZmZWN0cyBhcHBsaWVkIHRvIG91dHB1dCBtaXguIFRoZXNlIGVmZmVjdHMgY2FuCisgICAgICogYmUgbW92ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYW5vdGhlciBvdXRwdXQgc3RyZWFtCisgICAgICogKHZhbHVlIG11c3QgYmUgMCkKKyAgICAgKi8KKyAgICBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggPSAwLAorfSBhdWRpb19zZXNzaW9uX3Q7CisKKy8qIEF1ZGlvIHN1YiBmb3JtYXRzIChzZWUgZW51bSBhdWRpb19mb3JtYXQpLiAqLworCisvKiBQQ00gc3ViIGZvcm1hdHMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklUICAgICAgICAgID0gMHgxLCAvKiBETyBOT1QgQ0hBTkdFICovCisgICAgQVVESU9fRk9STUFUX1BDTV9TVUJfOF9CSVQgICAgICAgICAgID0gMHgyLCAvKiBETyBOT1QgQ0hBTkdFICovCit9IGF1ZGlvX2Zvcm1hdF9wY21fc3ViX2ZtdF90OworCisvKiBNUDMgc3ViIGZvcm1hdCBmaWVsZCBkZWZpbml0aW9uIDogY2FuIHVzZSAxMSBMU0JzIGluIHRoZSBzYW1lIHdheSBhcyBNUDMKKyAqIGZyYW1lIGhlYWRlciB0byBzcGVjaWZ5IGJpdCByYXRlLCBzdGVyZW8gbW9kZSwgdmVyc2lvbi4uLgorICovCit0eXBlZGVmIGVudW0geworICAgIEFVRElPX0ZPUk1BVF9NUDNfU1VCX05PTkUgICAgICAgICAgICA9IDB4MCwKK30gYXVkaW9fZm9ybWF0X21wM19zdWJfZm10X3Q7CisKKy8qIEFNUiBOQi9XQiBzdWIgZm9ybWF0IGZpZWxkIGRlZmluaXRpb246IHNwZWNpZnkgZnJhbWUgYmxvY2sgaW50ZXJsZWF2aW5nLAorICogYmFuZHdpZHRoIGVmZmljaWVudCBvciBvY3RldCBhbGlnbmVkLCBlbmNvZGluZyBtb2RlIGZvciByZWNvcmRpbmcuLi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBVURJT19GT1JNQVRfQU1SX1NVQl9OT05FICAgICAgICAgICAgPSAweDAsCit9IGF1ZGlvX2Zvcm1hdF9hbXJfc3ViX2ZtdF90OworCisvKiBBQUMgc3ViIGZvcm1hdCBmaWVsZCBkZWZpbml0aW9uOiBzcGVjaWZ5IHByb2ZpbGUgb3IgYml0cmF0ZSBmb3IgcmVjb3JkaW5nLi4uICovCit0eXBlZGVmIGVudW0geworICAgIEFVRElPX0ZPUk1BVF9BQUNfU1VCX05PTkUgICAgICAgICAgICA9IDB4MCwKK30gYXVkaW9fZm9ybWF0X2FhY19zdWJfZm10X3Q7CisKKy8qIFZPUkJJUyBzdWIgZm9ybWF0IGZpZWxkIGRlZmluaXRpb246IHNwZWNpZnkgcXVhbGl0eSBmb3IgcmVjb3JkaW5nLi4uICovCit0eXBlZGVmIGVudW0geworICAgIEFVRElPX0ZPUk1BVF9WT1JCSVNfU1VCX05PTkUgICAgICAgICA9IDB4MCwKK30gYXVkaW9fZm9ybWF0X3ZvcmJpc19zdWJfZm10X3Q7CisKKy8qIEF1ZGlvIGZvcm1hdCBjb25zaXN0cyBpbiBhIG1haW4gZm9ybWF0IGZpZWxkICh1cHBlciA4IGJpdHMpIGFuZCBhIHN1YiBmb3JtYXQKKyAqIGZpZWxkIChsb3dlciAyNCBiaXRzKS4KKyAqCisgKiBUaGUgbWFpbiBmb3JtYXQgaW5kaWNhdGVzIHRoZSBtYWluIGNvZGVjIHR5cGUuIFRoZSBzdWIgZm9ybWF0IGZpZWxkCisgKiBpbmRpY2F0ZXMgb3B0aW9ucyBhbmQgcGFyYW1ldGVycyBmb3IgZWFjaCBmb3JtYXQuIFRoZSBzdWIgZm9ybWF0IGlzIG1haW5seQorICogdXNlZCBmb3IgcmVjb3JkIHRvIGluZGljYXRlIGZvciBpbnN0YW5jZSB0aGUgcmVxdWVzdGVkIGJpdHJhdGUgb3IgcHJvZmlsZS4KKyAqIEl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIGNlcnRhaW4gZm9ybWF0cyB0byBnaXZlIGluZm9ybWF0aW9ucyBub3QgcHJlc2VudCBpbgorICogdGhlIGVuY29kZWQgYXVkaW8gc3RyZWFtIChlLmcuIG9jdGV0IGFsaWduZW1lbnQgZm9yIEFNUikuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQVVESU9fRk9STUFUX0lOVkFMSUQgICAgICAgICAgICAgPSAweEZGRkZGRkZGVUwsCisgICAgQVVESU9fRk9STUFUX0RFRkFVTFQgICAgICAgICAgICAgPSAwLAorICAgIEFVRElPX0ZPUk1BVF9QQ00gICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMFVMLCAvKiBETyBOT1QgQ0hBTkdFICovCisgICAgQVVESU9fRk9STUFUX01QMyAgICAgICAgICAgICAgICAgPSAweDAxMDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX0FNUl9OQiAgICAgICAgICAgICAgPSAweDAyMDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX0FNUl9XQiAgICAgICAgICAgICAgPSAweDAzMDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX0FBQyAgICAgICAgICAgICAgICAgPSAweDA0MDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX0hFX0FBQ19WMSAgICAgICAgICAgPSAweDA1MDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX0hFX0FBQ19WMiAgICAgICAgICAgPSAweDA2MDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX1ZPUkJJUyAgICAgICAgICAgICAgPSAweDA3MDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX01BSU5fTUFTSyAgICAgICAgICAgPSAweEZGMDAwMDAwVUwsCisgICAgQVVESU9fRk9STUFUX1NVQl9NQVNLICAgICAgICAgICAgPSAweDAwRkZGRkZGVUwsCisKKyAgICAvKiBBbGlhc2VzICovCisgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgICAgICAgICAgPSAoQVVESU9fRk9STUFUX1BDTSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV9TVUJfMTZfQklUKSwKKyAgICBBVURJT19GT1JNQVRfUENNXzhfQklUICAgICAgICAgICA9IChBVURJT19GT1JNQVRfUENNIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX1NVQl84X0JJVCksCit9IGF1ZGlvX2Zvcm1hdF90OworCisvKiBDaGFubmVsIG1hc2sgZGVmaW5pdGlvbnMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBKQVZBIHZhbHVlcyBpbgorICogZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhICovCit0eXBlZGVmIGVudW0geworICAgIC8qIG91dHB1dCBjaGFubmVscyAqLworICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgICAgICAgICAgICA9IDB4NCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCAgICAgICAgICAgPSAweDgsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSICAgICAgICAgID0gMHgxMCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZICAgICAgICAgPSAweDIwLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCAgICAgICAgICAgICA9IDB4NDAsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCAgICAgICAgICAgID0gMHg4MCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiAgPSAweDEwMCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDIwMCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUiAgICAgICAgICAgPSAweDQwMCwKKworICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8gICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gICA9IChBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCksCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCAgICAgPSAoQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCksCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQgPSAoQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgID0gKEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCksCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSAgPSAoQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSwKKyAgICBBVURJT19DSEFOTkVMX09VVF9BTEwgICAgICA9IChBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSwKKworICAgIC8qIGlucHV0IGNoYW5uZWxzICovCisgICAgQVVESU9fQ0hBTk5FTF9JTl9MRUZUICAgICAgICAgICAgPSAweDQsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVCAgICAgICAgICAgPSAweDgsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCAgICAgICAgICAgPSAweDEwLAorICAgIEFVRElPX0NIQU5ORUxfSU5fQkFDSyAgICAgICAgICAgID0gMHgyMCwKKyAgICBBVURJT19DSEFOTkVMX0lOX0xFRlRfUFJPQ0VTU0VEICA9IDB4NDAsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVF9QUk9DRVNTRUQgPSAweDgwLAorICAgIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfUFJPQ0VTU0VEID0gMHgxMDAsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1BST0NFU1NFRCAgPSAweDIwMCwKKyAgICBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFICAgICAgICA9IDB4NDAwLAorICAgIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTICAgICAgICAgID0gMHg4MDAsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMgICAgICAgICAgPSAweDEwMDAsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMgICAgICAgICAgPSAweDIwMDAsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgICAgPSAweDQwMDAsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTksgICAgPSAweDgwMDAsCisKKyAgICBBVURJT19DSEFOTkVMX0lOX01PTk8gICA9IEFVRElPX0NIQU5ORUxfSU5fRlJPTlQsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8gPSAoQVVESU9fQ0hBTk5FTF9JTl9MRUZUIHwgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVCksCisgICAgQVVESU9fQ0hBTk5FTF9JTl9BTEwgICAgPSAoQVVESU9fQ0hBTk5FTF9JTl9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX0ZST05UIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX0JBQ0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9MRUZUX1BST0NFU1NFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVF9QUk9DRVNTRUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfUFJPQ0VTU0VEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUFJPQ0VTU0VEfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fUFJFU1NVUkUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1lfQVhJUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSyksCit9IGF1ZGlvX2NoYW5uZWxzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQVVESU9fTU9ERV9JTlZBTElEICAgICAgICAgID0gLTIsCisgICAgQVVESU9fTU9ERV9DVVJSRU5UICAgICAgICAgID0gLTEsCisgICAgQVVESU9fTU9ERV9OT1JNQUwgICAgICAgICAgID0gMCwKKyAgICBBVURJT19NT0RFX1JJTkdUT05FICAgICAgICAgPSAxLAorICAgIEFVRElPX01PREVfSU5fQ0FMTCAgICAgICAgICA9IDIsCisgICAgQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OID0gMywKKworICAgIEFVRElPX01PREVfQ05ULAorICAgIEFVRElPX01PREVfTUFYICAgICAgICAgICAgICA9IEFVRElPX01PREVfQ05UIC0gMSwKK30gYXVkaW9fbW9kZV90OworCit0eXBlZGVmIGVudW0geworICAgIEFVRElPX0lOX0FDT1VTVElDU19BR0NfRU5BQkxFICAgID0gMHgwMDAxLAorICAgIEFVRElPX0lOX0FDT1VTVElDU19BR0NfRElTQUJMRSAgID0gMCwKKyAgICBBVURJT19JTl9BQ09VU1RJQ1NfTlNfRU5BQkxFICAgICA9IDB4MDAwMiwKKyAgICBBVURJT19JTl9BQ09VU1RJQ1NfTlNfRElTQUJMRSAgICA9IDAsCisgICAgQVVESU9fSU5fQUNPVVNUSUNTX1RYX0lJUl9FTkFCTEUgPSAweDAwMDQsCisgICAgQVVESU9fSU5fQUNPVVNUSUNTX1RYX0RJU0FCTEUgICAgPSAwLAorfSBhdWRpb19pbl9hY291c3RpY3NfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICAvKiBvdXRwdXQgZGV2aWNlcyAqLworICAgIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UgICAgICAgICAgICAgICAgICA9IDB4MSwKKyAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIgICAgICAgICAgICAgICAgICAgPSAweDIsCisgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUICAgICAgICAgICAgID0gMHg0LAorICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FICAgICAgICAgICA9IDB4OCwKKyAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gICAgICAgICAgICAgPSAweDEwLAorICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUICAgICA9IDB4MjAsCisgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCAgICAgID0gMHg0MCwKKyAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQICAgICAgICAgICAgPSAweDgwLAorICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyA9IDB4MTAwLAorICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiAgICA9IDB4MjAwLAorICAgIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwgICAgICAgICAgICAgICA9IDB4NDAwLAorICAgIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQgICAgICAgICA9IDB4ODAwLAorICAgIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQgICAgICAgICA9IDB4MTAwMCwKKyAgICBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgPSAweDgwMDAsCisgICAgQVVESU9fREVWSUNFX09VVF9BTEwgICAgICA9IChBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCksCisgICAgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCA9IChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpLAorICAgIEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTyAgPSAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpLAorCisgICAgLyogaW5wdXQgZGV2aWNlcyAqLworICAgIEFVRElPX0RFVklDRV9JTl9DT01NVU5JQ0FUSU9OICAgICAgICAgPSAweDEwMDAwLAorICAgIEFVRElPX0RFVklDRV9JTl9BTUJJRU5UICAgICAgICAgICAgICAgPSAweDIwMDAwLAorICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyAgICAgICAgICAgPSAweDQwMDAwLAorICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQgPSAweDgwMDAwLAorICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUICAgICAgICAgPSAweDEwMDAwMCwKKyAgICBBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwgICAgICAgICAgID0gMHgyMDAwMDAsCisgICAgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwgICAgICAgICAgICA9IDB4NDAwMDAwLAorICAgIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyAgICAgICAgICAgICAgPSAweDgwMDAwMCwKKyAgICBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCAgICAgICAgICAgICAgID0gMHg4MDAwMDAwMCwKKworICAgIEFVRElPX0RFVklDRV9JTl9BTEwgICAgID0gKEFVRElPX0RFVklDRV9JTl9DT01NVU5JQ0FUSU9OIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCisgICAgQVVESU9fREVWSUNFX0lOX0FMTF9TQ08gPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULAorfSBhdWRpb19kZXZpY2VzX3Q7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKChwb3Bjb3VudChkZXZpY2UpID09IDEpICYmICgoZGV2aWNlICYgfkFVRElPX0RFVklDRV9PVVRfQUxMKSA9PSAwKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBhdWRpb19pc19pbnB1dF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0lOX0FMTCkgPT0gMCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXVkaW9faXNfYTJkcF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGF1ZGlvX2lzX2JsdWV0b290aF9zY29fZGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKChwb3Bjb3VudChkZXZpY2UpID09IDEpICYmIChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9BTExfU0NPIHwKKyAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXVkaW9faXNfaW5wdXRfY2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQoreworICAgIGlmICgoY2hhbm5lbCAmIH5BVURJT19DSEFOTkVMX0lOX0FMTCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBhdWRpb19pc19vdXRwdXRfY2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQoreworICAgIGlmICgoY2hhbm5lbCAmIH5BVURJT19DSEFOTkVMX09VVF9BTEwpID09IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXVkaW9faXNfdmFsaWRfZm9ybWF0KHVpbnQzMl90IGZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ006CisgICAgY2FzZSBBVURJT19GT1JNQVRfTVAzOgorICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9OQjoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BTVJfV0I6CisgICAgY2FzZSBBVURJT19GT1JNQVRfQUFDOgorICAgIGNhc2UgQVVESU9fRk9STUFUX0hFX0FBQ19WMToKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9IRV9BQUNfVjI6CisgICAgY2FzZSBBVURJT19GT1JNQVRfVk9SQklTOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXVkaW9faXNfbGluZWFyX3BjbSh1aW50MzJfdCBmb3JtYXQpCit7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworCitfX0VORF9ERUNMUworCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fQ09SRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c3RlbS9jYW1lcmEuaCBiL2luY2x1ZGUvc3lzdGVtL2NhbWVyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTBjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3N5c3RlbS9jYW1lcmEuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1lTVEVNX0NPUkVfSU5DTFVERV9BTkRST0lEX0NBTUVSQV9ICisjZGVmaW5lIFNZU1RFTV9DT1JFX0lOQ0xVREVfQU5EUk9JRF9DQU1FUkFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworX19CRUdJTl9ERUNMUworCisvKioKKyAqIEEgc2V0IG9mIGJpdCBtYXNrcyBmb3Igc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmVkIHByZXZpZXcgZnJhbWVzIGFyZQorICogaGFuZGxlZCBiZWZvcmUgdGhlIHByZXZpZXdDYWxsYmFjaygpIGNhbGwuCisgKgorICogVGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZiBhbiAiaW50IiB2YWx1ZSBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlOgorICoKKyAqIC4uLi4uIDAgMCAwCisgKiAgICAgICBeIF4gXgorICogICAgICAgfCB8IHwtLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBlbmFibGVkIG9yIG5vdAorICogICAgICAgfCB8LS0tLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBvbmUtc2hvdCBvciBub3QKKyAqICAgICAgIHwtLS0tLS0tLS0tLS0tPiBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnJhbWUgaXMgY29waWVkIG91dCBvciBub3QKKyAqCisgKiBXQVJOSU5HOiBXaGVuIGEgZnJhbWUgaXMgc2VudCBkaXJlY3RseSB3aXRob3V0IGNvcHlpbmcsIGl0IGlzIHRoZSBmcmFtZQorICogcmVjZWl2ZXIncyByZXNwb25zaWJsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmcmFtZSBkYXRhIHdvbid0IGdldAorICogY29ycnVwdGVkIGJ5IHN1YnNlcXVlbnQgcHJldmlldyBmcmFtZXMgZmlsbGVkIGJ5IHRoZSBjYW1lcmEuIFRoaXMgZmxhZyBpcworICogcmVjb21tZW5kZWQgb25seSB3aGVuIGNvcHlpbmcgb3V0IGRhdGEgYnJpbmdzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHByaWNlCisgKiBhbmQgdGhlIGhhbmRsaW5nL3Byb2Nlc3Npbmcgb2YgdGhlIHJlY2VpdmVkIGZyYW1lIGRhdGEgaXMgYWx3YXlzIGZhc3RlciB0aGFuCisgKiB0aGUgcHJldmlldyBmcmFtZSByYXRlIHNvIHRoYXQgZGF0YSBjb3JydXB0aW9uIHdvbid0IG9jY3VyLgorICoKKyAqIEZvciBpbnN0YW5jZSwKKyAqIDEuIDB4MDAgZGlzYWJsZXMgdGhlIGNhbGxiYWNrLiBJbiB0aGlzIGNhc2UsIGNvcHkgb3V0IGFuZCBvbmUgc2hvdCBiaXRzCisgKiAgICBhcmUgaWdub3JlZC4KKyAqIDIuIDB4MDEgZW5hYmxlcyBhIGNhbGxiYWNrIHdpdGhvdXQgY29weWluZyBvdXQgdGhlIHJlY2VpdmVkIGZyYW1lcy4gQQorICogICAgdHlwaWNhbCB1c2UgY2FzZSBpcyB0aGUgQ2FtY29yZGVyIGFwcGxpY2F0aW9uIHRvIGF2b2lkIG1ha2luZyBjb3N0bHkKKyAqICAgIGZyYW1lIGNvcGllcy4KKyAqIDMuIDB4MDUgaXMgZW5hYmxpbmcgYSBjYWxsYmFjayB3aXRoIGZyYW1lIGNvcGllZCBvdXQgcmVwZWF0ZWRseS4gQSB0eXBpY2FsCisgKiAgICB1c2UgY2FzZSBpcyB0aGUgQ2FtZXJhIGFwcGxpY2F0aW9uLgorICogNC4gMHgwNyBpcyBlbmFibGluZyBhIGNhbGxiYWNrIHdpdGggZnJhbWUgY29waWVkIG91dCBvbmx5IG9uY2UuIEEgdHlwaWNhbAorICogICAgdXNlIGNhc2UgaXMgdGhlIEJhcmNvZGUgc2Nhbm5lciBhcHBsaWNhdGlvbi4KKyAqLworCitlbnVtIHsKKyAgICBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyA9IDB4MDEsCisgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfT05FX1NIT1RfTUFTSyA9IDB4MDIsCisgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyA9IDB4MDQsCisgICAgLyoqIFR5cGljYWwgdXNlIGNhc2VzICovCisgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUCA9IDB4MDAsCisgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ0FNQ09SREVSID0gMHgwMSwKKyAgICBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19DQU1FUkEgPSAweDA1LAorICAgIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0JBUkNPREVfU0NBTk5FUiA9IDB4MDcKK307CisKKy8qKiBtc2dUeXBlIGluIG5vdGlmeUNhbGxiYWNrIGFuZCBkYXRhQ2FsbGJhY2sgZnVuY3Rpb25zICovCitlbnVtIHsKKyAgICBDQU1FUkFfTVNHX0VSUk9SID0gMHgwMDAxLAorICAgIENBTUVSQV9NU0dfU0hVVFRFUiA9IDB4MDAwMiwKKyAgICBDQU1FUkFfTVNHX0ZPQ1VTID0gMHgwMDA0LAorICAgIENBTUVSQV9NU0dfWk9PTSA9IDB4MDAwOCwKKyAgICBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUgPSAweDAwMTAsCisgICAgQ0FNRVJBX01TR19WSURFT19GUkFNRSA9IDB4MDAyMCwKKyAgICBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FID0gMHgwMDQwLAorICAgIENBTUVSQV9NU0dfUkFXX0lNQUdFID0gMHgwMDgwLAorICAgIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSA9IDB4MDEwMCwKKyAgICBDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlkgPSAweDAyMDAsCisgICAgQ0FNRVJBX01TR19BTExfTVNHUyA9IDB4RkZGRgorfTsKKworLyoqIGNtZFR5cGUgaW4gc2VuZENvbW1hbmQgZnVuY3Rpb25zICovCitlbnVtIHsKKyAgICBDQU1FUkFfQ01EX1NUQVJUX1NNT09USF9aT09NID0gMSwKKyAgICBDQU1FUkFfQ01EX1NUT1BfU01PT1RIX1pPT00gPSAyLAorICAgIC8qKiBTZXQgdGhlIGNsb2Nrd2lzZSByb3RhdGlvbiBvZiBwcmV2aWV3IGRpc3BsYXkgKHNldFByZXZpZXdEaXNwbGF5KSBpbgorICAgICAqIGRlZ3JlZXMuIFRoaXMgYWZmZWN0cyB0aGUgcHJldmlldyBmcmFtZXMgYW5kIHRoZSBwaWN0dXJlIGRpc3BsYXllZCBhZnRlcgorICAgICAqIHNuYXBzaG90LiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHBvcnRyYWl0IG1vZGUgYXBwbGljYXRpb25zLiBOb3RlCisgICAgICogdGhhdCBwcmV2aWV3IGRpc3BsYXkgb2YgZnJvbnQtZmFjaW5nIGNhbWVyYXMgaXMgZmxpcHBlZCBob3Jpem9udGFsbHkKKyAgICAgKiBiZWZvcmUgdGhlIHJvdGF0aW9uLCB0aGF0IGlzLCB0aGUgaW1hZ2UgaXMgcmVmbGVjdGVkIGFsb25nIHRoZSBjZW50cmFsCisgICAgICogdmVydGljYWwgYXhpcyBvZiB0aGUgY2FtZXJhIHNlbnNvci4gU28gdGhlIHVzZXJzIGNhbiBzZWUgdGhlbXNlbHZlcyBhcworICAgICAqIGxvb2tpbmcgaW50byBhIG1pcnJvci4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBvcmRlciBvZiBieXRlIGFycmF5IG9mCisgICAgICogQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLCBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FLAorICAgICAqIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUsIENBTUVSQV9NU0dfUkFXX0lNQUdFLCBvcgorICAgICAqIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRS4gVGhpcyBpcyBub3QgYWxsb3dlZCB0byBiZSBzZXQgZHVyaW5nCisgICAgICogcHJldmlldworICAgICAqLworICAgIENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04gPSAzLAorCisgICAgLyoqIGNtZFR5cGUgdG8gZGlzYWJsZS9lbmFibGUgc2h1dHRlciBzb3VuZC4gSW4gc2VuZENvbW1hbmQgcGFzc2luZyBhcmcxID0KKyAgICAgKiAwIHdpbGwgZGlzYWJsZSwgd2hpbGUgcGFzc2luZyBhcmcxID0gMSB3aWxsIGVuYWJsZSB0aGUgc2h1dHRlciBzb3VuZC4KKyAgICAgKi8KKyAgICBDQU1FUkFfQ01EX0VOQUJMRV9TSFVUVEVSX1NPVU5EID0gNCwKKworICAgIC8qIGNtZFR5cGUgdG8gcGxheSByZWNvcmRpbmcgc291bmQgKi8KKyAgICBDQU1FUkFfQ01EX1BMQVlfUkVDT1JESU5HX1NPVU5EID0gNSwKK307CisKKy8qKiBjYW1lcmEgZmF0YWwgZXJyb3JzICovCitlbnVtIHsKKyAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiA9IDEsCisgICAgQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVEID0gMTAwCit9OworCitlbnVtIHsKKyAgICBDQU1FUkFfRkFDSU5HX0JBQ0sgPSAwLCAvKiogVGhlIGZhY2luZyBvZiB0aGUgY2FtZXJhIGlzIG9wcG9zaXRlIHRvIHRoYXQgb2YKKyAgICAgICAgICAgICAgICAgKiB0aGUgc2NyZWVuLiAqLworICAgIENBTUVSQV9GQUNJTkdfRlJPTlQgPSAxIC8qKiBUaGUgZmFjaW5nIG9mIHRoZSBjYW1lcmEgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZgorICAgICAgICAgICAgICAgICAqIHRoZSBzY3JlZW4uICovCit9OworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogU1lTVEVNX0NPUkVfSU5DTFVERV9BTkRST0lEX0NBTUVSQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIGIvaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzliZDRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1lTVEVNX0NPUkVfSU5DTFVERV9BTkRST0lEX0dSQVBISUNTX0gKKyNkZWZpbmUgU1lTVEVNX0NPUkVfSU5DTFVERV9BTkRST0lEX0dSQVBISUNTX0gKKworX19CRUdJTl9ERUNMUworCisvKioKKyAqIHBpeGVsIGZvcm1hdCBkZWZpbml0aW9ucworICovCisKK2VudW0geworICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICAgICAgICAgID0gMSwKKyAgICBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCAgICAgICAgICA9IDIsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4ICAgICAgICAgICAgPSAzLAorICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgICAgICAgID0gNCwKKyAgICBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCAgICAgICAgICA9IDUsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEgICAgICAgICAgPSA2LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0ICAgICAgICAgID0gNywKKworICAgIC8qIDB4OCAtIDB4RkYgcmFuZ2UgdW5hdmFpbGFibGUgKi8KKworICAgIC8qCisgICAgICogMHgxMDAgLSAweDFGRgorICAgICAqCisgICAgICogVGhpcyByYW5nZSBpcyByZXNlcnZlZCBmb3IgcGl4ZWwgZm9ybWF0cyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgSEFMCisgICAgICogaW1wbGVtZW50YXRpb24uICBJbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSBhbnkgdmFsdWUgaW4gdGhpcyByYW5nZSB0bworICAgICAqIGNvbW11bmljYXRlIHZpZGVvIHBpeGVsIGZvcm1hdHMgYmV0d2VlbiB0aGVpciBIQUwgbW9kdWxlcy4gIFRoZXNlIGZvcm1hdHMKKyAgICAgKiBtdXN0IG5vdCBoYXZlIGFuIGFscGhhIGNoYW5uZWwuICBBZGRpdGlvbmFsbHksIGFuIEVHTGltYWdlIGNyZWF0ZWQgZnJvbSBhCisgICAgICogZ3JhbGxvYyBidWZmZXIgb2Ygb25lIG9mIHRoZXNlIGZvcm1hdHMgbXVzdCBiZSBzdXBwb3J0ZWQgZm9yIHVzZSB3aXRoIHRoZQorICAgICAqIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgT3BlbkdMIEVTIGV4dGVuc2lvbi4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogQW5kcm9pZCBZVVYgZm9ybWF0OgorICAgICAqCisgICAgICogVGhpcyBmb3JtYXQgaXMgZXhwb3NlZCBvdXRzaWRlIG9mIHRoZSBIQUwgdG8gc29mdHdhcmUgZGVjb2RlcnMgYW5kCisgICAgICogYXBwbGljYXRpb25zLiAgRUdMSW1hZ2VLSFIgbXVzdCBzdXBwb3J0IGl0IGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisgICAgICogT0VTX0VHTF9pbWFnZV9leHRlcm5hbCBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBZVjEyIGlzIGEgNDoyOjAgWUNyQ2IgcGxhbmFyIGZvcm1hdCBjb21wcmlzZWQgb2YgYSBXeEggWSBwbGFuZSBmb2xsb3dlZAorICAgICAqIGJ5IChXLzIpIHggKEgvMikgQ3IgYW5kIENiIHBsYW5lcy4KKyAgICAgKgorICAgICAqIFRoaXMgZm9ybWF0IGFzc3VtZXMKKyAgICAgKiAtIGFuIGV2ZW4gd2lkdGgKKyAgICAgKiAtIGFuIGV2ZW4gaGVpZ2h0CisgICAgICogLSBhIGhvcml6b250YWwgc3RyaWRlIG11bHRpcGxlIG9mIDE2IHBpeGVscworICAgICAqIC0gYSB2ZXJ0aWNhbCBzdHJpZGUgZXF1YWwgdG8gdGhlIGhlaWdodAorICAgICAqCisgICAgICogICB5X3NpemUgPSBzdHJpZGUgKiBoZWlnaHQKKyAgICAgKiAgIGNfc2l6ZSA9IEFMSUdOKHN0cmlkZS8yLCAxNikgKiBoZWlnaHQvMgorICAgICAqICAgc2l6ZSA9IHlfc2l6ZSArIGNfc2l6ZSAqIDIKKyAgICAgKiAgIGNyX29mZnNldCA9IHlfc2l6ZQorICAgICAqICAgY2Jfb2Zmc2V0ID0geV9zaXplICsgY19zaXplCisgICAgICoKKyAgICAgKi8KKyAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIgICA9IDB4MzIzMTU2NTksIC8vIFlDckNiIDQ6MjowIFBsYW5hcgorCisKKworICAgIC8qIExlZ2FjeSBmb3JtYXRzIChkZXByZWNhdGVkKSwgdXNlZCBieSBJbWFnZUZvcm1hdC5qYXZhICovCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1AgICAgICAgPSAweDEwLCAvLyBOVjE2CisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgICAgICAgPSAweDExLCAvLyBOVjIxCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSSAgICAgICAgPSAweDE0LCAvLyBZVVkyCit9OworCisKKy8qKgorICogVHJhbnNmb3JtYXRpb24gZGVmaW5pdGlvbnMKKyAqCisgKiBJTVBPUlRBTlQgTk9URToKKyAqIEhBTF9UUkFOU0ZPUk1fUk9UXzkwIGlzIGFwcGxpZWQgQ0xPQ0tXSVNFIGFuZCBBRlRFUiBIQUxfVFJBTlNGT1JNX0ZMSVBfe0h8Vn0uCisgKgorICovCisKK2VudW0geworICAgIC8qIGZsaXAgc291cmNlIGltYWdlIGhvcml6b250YWxseSAoYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzKSAqLworICAgIEhBTF9UUkFOU0ZPUk1fRkxJUF9IICAgID0gMHgwMSwKKyAgICAvKiBmbGlwIHNvdXJjZSBpbWFnZSB2ZXJ0aWNhbGx5IChhcm91bmQgdGhlIGhvcml6b250YWwgYXhpcykqLworICAgIEhBTF9UUkFOU0ZPUk1fRkxJUF9WICAgID0gMHgwMiwKKyAgICAvKiByb3RhdGUgc291cmNlIGltYWdlIDkwIGRlZ3JlZXMgY2xvY2t3aXNlICovCisgICAgSEFMX1RSQU5TRk9STV9ST1RfOTAgICAgPSAweDA0LAorICAgIC8qIHJvdGF0ZSBzb3VyY2UgaW1hZ2UgMTgwIGRlZ3JlZXMgKi8KKyAgICBIQUxfVFJBTlNGT1JNX1JPVF8xODAgICA9IDB4MDMsCisgICAgLyogcm90YXRlIHNvdXJjZSBpbWFnZSAyNzAgZGVncmVlcyBjbG9ja3dpc2UgKi8KKyAgICBIQUxfVFJBTlNGT1JNX1JPVF8yNzAgICA9IDB4MDcsCit9OworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogU1lTVEVNX0NPUkVfSU5DTFVERV9BTkRST0lEX0dSQVBISUNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3lzdGVtL3dpbmRvdy5oIGIvaW5jbHVkZS9zeXN0ZW0vd2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwMzgxYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc3lzdGVtL3dpbmRvdy5oCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTWVNURU1fQ09SRV9JTkNMVURFX0FORFJPSURfV0lORE9XX0gKKyNkZWZpbmUgU1lTVEVNX0NPUkVfSU5DTFVERV9BTkRST0lEX1dJTkRPV19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBTkRST0lEX05BVElWRV9NQUtFX0NPTlNUQU5UKGEsYixjLGQpIFwKKyAgICAoKCh1bnNpZ25lZCkoYSk8PDI0KXwoKHVuc2lnbmVkKShiKTw8MTYpfCgodW5zaWduZWQpKGMpPDw4KXwodW5zaWduZWQpKGQpKQorCisjZGVmaW5lIEFORFJPSURfTkFUSVZFX1dJTkRPV19NQUdJQyBcCisgICAgQU5EUk9JRF9OQVRJVkVfTUFLRV9DT05TVEFOVCgnXycsJ3cnLCduJywnZCcpCisKKyNkZWZpbmUgQU5EUk9JRF9OQVRJVkVfQlVGRkVSX01BR0lDIFwKKyAgICBBTkRST0lEX05BVElWRV9NQUtFX0NPTlNUQU5UKCdfJywnYicsJ2YnLCdyJykKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBidWZmZXJfaGFuZGxlX3Q7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QKK3sKKyAgICBpbnQzMl90IGxlZnQ7CisgICAgaW50MzJfdCB0b3A7CisgICAgaW50MzJfdCByaWdodDsKKyAgICBpbnQzMl90IGJvdHRvbTsKK30gYW5kcm9pZF9uYXRpdmVfcmVjdF90OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgYW5kcm9pZF9uYXRpdmVfYmFzZV90Cit7CisgICAgLyogYSBtYWdpYyB2YWx1ZSBkZWZpbmVkIGJ5IHRoZSBhY3R1YWwgRUdMIG5hdGl2ZSB0eXBlICovCisgICAgaW50IG1hZ2ljOworCisgICAgLyogdGhlIHNpemVvZigpIG9mIHRoZSBhY3R1YWwgRUdMIG5hdGl2ZSB0eXBlICovCisgICAgaW50IHZlcnNpb247CisKKyAgICB2b2lkKiByZXNlcnZlZFs0XTsKKworICAgIC8qIHJlZmVyZW5jZS1jb3VudGluZyBpbnRlcmZhY2UgKi8KKyAgICB2b2lkICgqaW5jUmVmKShzdHJ1Y3QgYW5kcm9pZF9uYXRpdmVfYmFzZV90KiBiYXNlKTsKKyAgICB2b2lkICgqZGVjUmVmKShzdHJ1Y3QgYW5kcm9pZF9uYXRpdmVfYmFzZV90KiBiYXNlKTsKK30gYW5kcm9pZF9uYXRpdmVfYmFzZV90OworCit0eXBlZGVmIHN0cnVjdCBBTmF0aXZlV2luZG93QnVmZmVyCit7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyKCkgeworICAgICAgICBjb21tb24ubWFnaWMgPSBBTkRST0lEX05BVElWRV9CVUZGRVJfTUFHSUM7CisgICAgICAgIGNvbW1vbi52ZXJzaW9uID0gc2l6ZW9mKEFOYXRpdmVXaW5kb3dCdWZmZXIpOworICAgICAgICBtZW1zZXQoY29tbW9uLnJlc2VydmVkLCAwLCBzaXplb2YoY29tbW9uLnJlc2VydmVkKSk7CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgc3A8QU5hdGl2ZVdpbmRvd0J1ZmZlcj4gZXhwZWN0cyBzbyB0aGF0IGl0CisgICAgLy8gY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSByZWZjb3VudCBBTmF0aXZlV2luZG93QnVmZmVyJ3MuCisgICAgdm9pZCBpbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKKyAgICAgICAgY29tbW9uLmluY1JlZihjb25zdF9jYXN0PGFuZHJvaWRfbmF0aXZlX2Jhc2VfdCo+KCZjb21tb24pKTsKKyAgICB9CisgICAgdm9pZCBkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKKyAgICAgICAgY29tbW9uLmRlY1JlZihjb25zdF9jYXN0PGFuZHJvaWRfbmF0aXZlX2Jhc2VfdCo+KCZjb21tb24pKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0cnVjdCBhbmRyb2lkX25hdGl2ZV9iYXNlX3QgY29tbW9uOworCisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHN0cmlkZTsKKyAgICBpbnQgZm9ybWF0OworICAgIGludCB1c2FnZTsKKworICAgIHZvaWQqIHJlc2VydmVkWzJdOworCisgICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZTsKKworICAgIHZvaWQqIHJlc2VydmVkX3Byb2NbOF07Cit9IEFOYXRpdmVXaW5kb3dCdWZmZXJfdDsKKworLy8gT2xkIHR5cGVkZWYgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgordHlwZWRlZiBBTmF0aXZlV2luZG93QnVmZmVyX3QgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3Q7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiBhdHRyaWJ1dGVzIHF1ZXJpYWJsZSB3aXRoIHF1ZXJ5KCkgKi8KK2VudW0geworICAgIE5BVElWRV9XSU5ET1dfV0lEVEggICAgID0gMCwKKyAgICBOQVRJVkVfV0lORE9XX0hFSUdIVCwKKyAgICBOQVRJVkVfV0lORE9XX0ZPUk1BVCwKKworICAgIC8qIFRoZSBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHRoYXQgbXVzdCByZW1haW4gdW4tZGVxdWV1ZWQgYWZ0ZXIgYSBidWZmZXIKKyAgICAgKiBoYXMgYmVlbiBxdWV1ZWQuICBUaGlzIHZhbHVlIGFwcGxpZXMgb25seSBpZiBzZXRfYnVmZmVyX2NvdW50IHdhcyB1c2VkIHRvCisgICAgICogb3ZlcnJpZGUgdGhlIG51bWJlciBvZiBidWZmZXJzIGFuZCBpZiBhIGJ1ZmZlciBoYXMgc2luY2UgYmVlbiBxdWV1ZWQuCisgICAgICogVXNlcnMgb2YgdGhlIHNldF9idWZmZXJfY291bnQgQU5hdGl2ZVdpbmRvdyBtZXRob2Qgc2hvdWxkIHF1ZXJ5IHRoaXMKKyAgICAgKiB2YWx1ZSBiZWZvcmUgY2FsbGluZyBzZXRfYnVmZmVyX2NvdW50LiAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgTgorICAgICAqIGJ1ZmZlcnMgc2ltdWx0YW5lb3VzbHkgZGVxdWV1ZWQgYXMgcGFydCBvZiB0aGUgc3RlYWR5LXN0YXRlIG9wZXJhdGlvbiwKKyAgICAgKiBhbmQgdGhpcyBxdWVyeSByZXR1cm5zIE0gdGhlbiBOK00gYnVmZmVycyBzaG91bGQgYmUgcmVxdWVzdGVkIHZpYQorICAgICAqIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudC4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGRvZXMgTk9UIGFwcGx5IHVudGlsIGEgc2luZ2xlIGJ1ZmZlciBoYXMgYmVlbgorICAgICAqIHF1ZXVlZC4gIEluIHBhcnRpY3VsYXIgdGhpcyBtZWFucyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvOgorICAgICAqCisgICAgICogMS4gUXVlcnkgTSA9IG1pbiB1bmRlcXVldWVkIGJ1ZmZlcnMKKyAgICAgKiAyLiBTZXQgdGhlIGJ1ZmZlciBjb3VudCB0byBOICsgTQorICAgICAqIDMuIERlcXVldWUgYWxsIE4gKyBNIGJ1ZmZlcnMKKyAgICAgKiA0LiBDYW5jZWwgTSBidWZmZXJzCisgICAgICogNS4gUXVldWUsIGRlcXVldWUsIHF1ZXVlLCBkZXF1ZXVlLCBhZCBpbmZpbml0dW0KKyAgICAgKi8KKyAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHF1ZXVlQnVmZmVyIG9wZXJhdGlvbnMgb24gdGhlIEFOYXRpdmVXaW5kb3cgc2VuZCB0aGUgYnVmZmVyCisgICAgICogdG8gdGhlIHdpbmRvdyBjb21wb3NpdG9yLiAgVGhlIHF1ZXJ5IHNldHMgdGhlIHJldHVybmVkICd2YWx1ZScgYXJndW1lbnQKKyAgICAgKiB0byAxIGlmIHRoZSBBTmF0aXZlV2luZG93IERPRVMgc2VuZCBxdWV1ZWQgYnVmZmVycyBkaXJlY3RseSB0byB0aGUgd2luZG93CisgICAgICogY29tcG9zaXRvciBhbmQgMCBpZiB0aGUgYnVmZmVycyBkbyBub3QgZ28gZGlyZWN0bHkgdG8gdGhlIHdpbmRvdworICAgICAqIGNvbXBvc2l0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHByb3RlY3RlZCBidWZmZXIgY29udGVudCBzaG91bGQgYmUKKyAgICAgKiBzZW50IHRvIHRoZSBBTmF0aXZlV2luZG93LiAgTm90ZSwgaG93ZXZlciwgdGhhdCBhIHJlc3VsdCBvZiAxIGRvZXMgTk9UCisgICAgICogaW5kaWNhdGUgdGhhdCBxdWV1ZWQgYnVmZmVycyB3aWxsIGJlIHByb3RlY3RlZCBmcm9tIGFwcGxpY2F0aW9ucyBvciB1c2VycworICAgICAqIGNhcHR1cmluZyB0aGVpciBjb250ZW50cy4gIElmIHRoYXQgYmVoYXZpb3IgaXMgZGVzaXJlZCB0aGVuIHNvbWUgb3RoZXIKKyAgICAgKiBtZWNoYW5pc20gKGUuZy4gdGhlIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIGZsYWcpIHNob3VsZCBiZSB1c2VkIGluCisgICAgICogY29uanVuY3Rpb24gd2l0aCB0aGlzIHF1ZXJ5LgorICAgICAqLworICAgIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUiwKKworICAgIC8qIEdldCB0aGUgY29uY3JldGUgdHlwZSBvZiBhIEFOYXRpdmVXaW5kb3cuICBTZWUgYmVsb3cgZm9yIHRoZSBsaXN0IG9mCisgICAgICogcG9zc2libGUgcmV0dXJuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFRoaXMgcXVlcnkgc2hvdWxkIG5vdCBiZSB1c2VkIG91dHNpZGUgdGhlIEFuZHJvaWQgZnJhbWV3b3JrIGFuZCB3aWxsCisgICAgICogbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLgorICAgICAqLworICAgIE5BVElWRV9XSU5ET1dfQ09OQ1JFVEVfVFlQRSwKK307CisKKy8qIHZhbGlkIG9wZXJhdGlvbnMgZm9yIHRoZSAoKnBlcmZvcm0pKCkgaG9vayAqLworZW51bSB7CisgICAgTkFUSVZFX1dJTkRPV19TRVRfVVNBR0UgID0gMCwKKyAgICBOQVRJVkVfV0lORE9XX0NPTk5FQ1QsCisgICAgTkFUSVZFX1dJTkRPV19ESVNDT05ORUNULAorICAgIE5BVElWRV9XSU5ET1dfU0VUX0NST1AsCisgICAgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSX0NPVU5ULAorICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfR0VPTUVUUlksCisgICAgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19UUkFOU0ZPUk0sCisgICAgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19USU1FU1RBTVAsCit9OworCisvKiBwYXJhbWV0ZXIgZm9yIE5BVElWRV9XSU5ET1dfW0RJU11DT05ORUNUICovCitlbnVtIHsKKyAgICBOQVRJVkVfV0lORE9XX0FQSV9FR0wgPSAxCit9OworCisvKiBwYXJhbWV0ZXIgZm9yIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfVFJBTlNGT1JNICovCitlbnVtIHsKKyAgICAvKiBmbGlwIHNvdXJjZSBpbWFnZSBob3Jpem9udGFsbHkgKi8KKyAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggPSBIQUxfVFJBTlNGT1JNX0ZMSVBfSCAsCisgICAgLyogZmxpcCBzb3VyY2UgaW1hZ2UgdmVydGljYWxseSAqLworICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfViA9IEhBTF9UUkFOU0ZPUk1fRkxJUF9WLAorICAgIC8qIHJvdGF0ZSBzb3VyY2UgaW1hZ2UgOTAgZGVncmVlcyBjbG9jay13aXNlICovCisgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwID0gSEFMX1RSQU5TRk9STV9ST1RfOTAsCisgICAgLyogcm90YXRlIHNvdXJjZSBpbWFnZSAxODAgZGVncmVlcyAqLworICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8xODAgPSBIQUxfVFJBTlNGT1JNX1JPVF8xODAsCisgICAgLyogcm90YXRlIHNvdXJjZSBpbWFnZSAyNzAgZGVncmVlcyBjbG9jay13aXNlICovCisgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzI3MCA9IEhBTF9UUkFOU0ZPUk1fUk9UXzI3MCwKK307CisKKy8qIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFIHF1ZXJ5ICovCitlbnVtIHsKKyAgICBOQVRJVkVfV0lORE9XX0ZSQU1FQlVGRkVSLCAgICAgICAgICAgICAgICAgIC8vIEZyYW1lYnVmZmVyTmF0aXZlV2luZG93CisgICAgTkFUSVZFX1dJTkRPV19TVVJGQUNFLCAgICAgICAgICAgICAgICAgICAgICAvLyBTdXJmYWNlCisgICAgTkFUSVZFX1dJTkRPV19TVVJGQUNFX1RFWFRVUkVfQ0xJRU5ULCAgICAgICAvLyBTdXJmYWNlVGV4dHVyZUNsaWVudAorfTsKKworLyogcGFyYW1ldGVyIGZvciBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RJTUVTVEFNUAorICoKKyAqIFNwZWNpYWwgdGltZXN0YW1wIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgdGltZXN0YW1wcyBzaG91bGQgYmUgYXV0by1nZW5lcmF0ZWQKKyAqIGJ5IHRoZSBuYXRpdmUgd2luZG93IHdoZW4gcXVldWVCdWZmZXIgaXMgY2FsbGVkLiAgVGhpcyBpcyBlcXVhbCB0byBJTlQ2NF9NSU4sCisgKiBkZWZpbmVkIGRpcmVjdGx5IHRvIGF2b2lkIHByb2JsZW1zIHdpdGggQzk5L0MrKyBpbmNsdXNpb24gb2Ygc3RkaW50LmguCisgKi8KK3N0YXRpYyBjb25zdCBpbnQ2NF90IE5BVElWRV9XSU5ET1dfVElNRVNUQU1QX0FVVE8gPSAoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTC0xKTsKKworc3RydWN0IEFOYXRpdmVXaW5kb3cKK3sKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIEFOYXRpdmVXaW5kb3coKQorICAgICAgICA6IGZsYWdzKDApLCBtaW5Td2FwSW50ZXJ2YWwoMCksIG1heFN3YXBJbnRlcnZhbCgwKSwgeGRwaSgwKSwgeWRwaSgwKQorICAgIHsKKyAgICAgICAgY29tbW9uLm1hZ2ljID0gQU5EUk9JRF9OQVRJVkVfV0lORE9XX01BR0lDOworICAgICAgICBjb21tb24udmVyc2lvbiA9IHNpemVvZihBTmF0aXZlV2luZG93KTsKKyAgICAgICAgbWVtc2V0KGNvbW1vbi5yZXNlcnZlZCwgMCwgc2l6ZW9mKGNvbW1vbi5yZXNlcnZlZCkpOworICAgIH0KKworICAgIC8vIEltcGxlbWVudCB0aGUgbWV0aG9kcyB0aGF0IHNwPEFOYXRpdmVXaW5kb3c+IGV4cGVjdHMgc28gdGhhdCBpdAorICAgIC8vIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgcmVmY291bnQgQU5hdGl2ZVdpbmRvdydzLgorICAgIHZvaWQgaW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgICAgIGNvbW1vbi5pbmNSZWYoY29uc3RfY2FzdDxhbmRyb2lkX25hdGl2ZV9iYXNlX3QqPigmY29tbW9uKSk7CisgICAgfQorICAgIHZvaWQgZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgICAgIGNvbW1vbi5kZWNSZWYoY29uc3RfY2FzdDxhbmRyb2lkX25hdGl2ZV9iYXNlX3QqPigmY29tbW9uKSk7CisgICAgfQorI2VuZGlmCisKKyAgICBzdHJ1Y3QgYW5kcm9pZF9uYXRpdmVfYmFzZV90IGNvbW1vbjsKKworICAgIC8qIGZsYWdzIGRlc2NyaWJpbmcgc29tZSBhdHRyaWJ1dGVzIG9mIHRoaXMgc3VyZmFjZSBvciBpdHMgdXBkYXRlciAqLworICAgIGNvbnN0IHVpbnQzMl90IGZsYWdzOworCisgICAgLyogbWluIHN3YXAgaW50ZXJ2YWwgc3VwcG9ydGVkIGJ5IHRoaXMgdXBkYXRlZCAqLworICAgIGNvbnN0IGludCAgIG1pblN3YXBJbnRlcnZhbDsKKworICAgIC8qIG1heCBzd2FwIGludGVydmFsIHN1cHBvcnRlZCBieSB0aGlzIHVwZGF0ZWQgKi8KKyAgICBjb25zdCBpbnQgICBtYXhTd2FwSW50ZXJ2YWw7CisKKyAgICAvKiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIERQSSAqLworICAgIGNvbnN0IGZsb2F0IHhkcGk7CisgICAgY29uc3QgZmxvYXQgeWRwaTsKKworICAgIC8qIFNvbWUgc3RvcmFnZSByZXNlcnZlZCBmb3IgdGhlIE9FTSdzIGRyaXZlci4gKi8KKyAgICBpbnRwdHJfdCAgICBvZW1bNF07CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgc3dhcCBpbnRlcnZhbCBmb3IgdGhpcyBzdXJmYWNlLgorICAgICAqCisgICAgICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLWVycm5vIG9uIGVycm9yLgorICAgICAqLworICAgIGludCAgICAgKCpzZXRTd2FwSW50ZXJ2YWwpKHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csCisgICAgICAgICAgICAgICAgaW50IGludGVydmFsKTsKKworICAgIC8qCisgICAgICogaG9vayBjYWxsZWQgYnkgRUdMIHRvIGFjcXVpcmUgYSBidWZmZXIuIEFmdGVyIHRoaXMgY2FsbCwgdGhlIGJ1ZmZlcgorICAgICAqIGlzIG5vdCBsb2NrZWQsIHNvIGl0cyBjb250ZW50IGNhbm5vdCBiZSBtb2RpZmllZC4KKyAgICAgKiB0aGlzIGNhbGwgbWF5IGJsb2NrIGlmIG5vIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBpbnQgICAgICgqZGVxdWV1ZUJ1ZmZlcikoc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlcioqIGJ1ZmZlcik7CisKKyAgICAvKgorICAgICAqIGhvb2sgY2FsbGVkIGJ5IEVHTCB0byBsb2NrIGEgYnVmZmVyLiBUaGlzIE1VU1QgYmUgY2FsbGVkIGJlZm9yZSBtb2RpZnlpbmcKKyAgICAgKiB0aGUgY29udGVudCBvZiBhIGJ1ZmZlci4gVGhlIGJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBhY3F1aXJlZCB3aXRoCisgICAgICogZGVxdWV1ZUJ1ZmZlciBmaXJzdC4KKyAgICAgKgorICAgICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBpbnQgICAgICgqbG9ja0J1ZmZlcikoc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKKyAgIC8qCisgICAgKiBob29rIGNhbGxlZCBieSBFR0wgd2hlbiBtb2RpZmljYXRpb25zIHRvIHRoZSByZW5kZXIgYnVmZmVyIGFyZSBkb25lLgorICAgICogVGhpcyB1bmxvY2tzIGFuZCBwb3N0IHRoZSBidWZmZXIuCisgICAgKgorICAgICogQnVmZmVycyBNVVNUIGJlIHF1ZXVlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGFuIHRoZXkgd2VyZSBkZXF1ZXVlZC4KKyAgICAqCisgICAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgICAgKi8KKyAgICBpbnQgICAgICgqcXVldWVCdWZmZXIpKHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csCisgICAgICAgICAgICAgICAgc3RydWN0IEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAvKgorICAgICAqIGhvb2sgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmF0aXZlIHdpbmRvdy4KKyAgICAgKgorICAgICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBpbnQgICAgICgqcXVlcnkpKGNvbnN0IHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csCisgICAgICAgICAgICAgICAgaW50IHdoYXQsIGludCogdmFsdWUpOworCisgICAgLyoKKyAgICAgKiBob29rIHVzZWQgdG8gcGVyZm9ybSB2YXJpb3VzIG9wZXJhdGlvbnMgb24gdGhlIHN1cmZhY2UuCisgICAgICogKCpwZXJmb3JtKSgpIGlzIGEgZ2VuZXJpYyBtZWNoYW5pc20gdG8gYWRkIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBBTmF0aXZlV2luZG93IHdoaWxlIGtlZXBpbmcgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisgICAgICoKKyAgICAgKiBETyBOT1QgQ0FMTCBUSElTIEhPT0sgRElSRUNUTFkuICBJbnN0ZWFkLCB1c2UgdGhlIGhlbHBlciBmdW5jdGlvbnMKKyAgICAgKiBkZWZpbmVkIGJlbG93LgorICAgICAqCisgICAgICogICgqcGVyZm9ybSkoKSByZXR1cm5zIC1FTk9FTlQgaWYgdGhlICd3aGF0JyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICBieSB0aGUgc3VyZmFjZSdzIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogVGhlIHZhbGlkIG9wZXJhdGlvbnMgYXJlOgorICAgICAqICAgICBOQVRJVkVfV0lORE9XX1NFVF9VU0FHRQorICAgICAqICAgICBOQVRJVkVfV0lORE9XX0NPTk5FQ1QKKyAgICAgKiAgICAgTkFUSVZFX1dJTkRPV19ESVNDT05ORUNUCisgICAgICogICAgIE5BVElWRV9XSU5ET1dfU0VUX0NST1AKKyAgICAgKiAgICAgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSX0NPVU5UCisgICAgICogICAgIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfR0VPTUVUUlkKKyAgICAgKiAgICAgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19UUkFOU0ZPUk0KKyAgICAgKiAgICAgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19USU1FU1RBTVAKKyAgICAgKgorICAgICAqLworCisgICAgaW50ICAgICAoKnBlcmZvcm0pKHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csCisgICAgICAgICAgICAgICAgaW50IG9wZXJhdGlvbiwgLi4uICk7CisKKyAgICAvKgorICAgICAqIGhvb2sgdXNlZCB0byBjYW5jZWwgYSBidWZmZXIgdGhhdCBoYXMgYmVlbiBkZXF1ZXVlZC4KKyAgICAgKiBObyBzeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkIGJldHdlZW4gZGVxdWV1ZSgpIGFuZCBjYW5jZWwoKSwgc28KKyAgICAgKiBlaXRoZXIgZXh0ZXJuYWwgc3luY2hyb25pemF0aW9uIGlzIG5lZWRlZCwgb3IgdGhlc2UgZnVuY3Rpb25zIG11c3QgYmUKKyAgICAgKiBjYWxsZWQgZnJvbSB0aGUgc2FtZSB0aHJlYWQuCisgICAgICovCisgICAgaW50ICAgICAoKmNhbmNlbEJ1ZmZlcikoc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKKworCisgICAgdm9pZCogcmVzZXJ2ZWRfcHJvY1syXTsKK307CisKKyAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogdXNlIEFOYXRpdmVXaW5kb3cgKHN0cnVjdCBBTmF0aXZlV2luZG93IGluIEMpLgorICAqIGFuZHJvaWRfbmF0aXZlX3dpbmRvd190IGlzIGRlcHJlY2F0ZWQuCisgICovCit0eXBlZGVmIHN0cnVjdCBBTmF0aXZlV2luZG93IEFOYXRpdmVXaW5kb3c7Cit0eXBlZGVmIHN0cnVjdCBBTmF0aXZlV2luZG93IGFuZHJvaWRfbmF0aXZlX3dpbmRvd190OworCisvKgorICogIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKC4uLiwgdXNhZ2UpCisgKiAgU2V0cyB0aGUgaW50ZW5kZWQgdXNhZ2UgZmxhZ3MgZm9yIHRoZSBuZXh0IGJ1ZmZlcnMKKyAqICBhY3F1aXJlZCB3aXRoICgqbG9ja0J1ZmZlcikoKSBhbmQgb24uCisgKiAgQnkgZGVmYXVsdCAoaWYgdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQpLCBhIHVzYWdlIG9mCisgKiAgICAgIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFCisgKiAgaXMgYXNzdW1lZC4KKyAqICBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCB1c3VhbGx5IGNhdXNlIGZvbGxvd2luZyBidWZmZXJzIHRvIGJlCisgKiAgcmVhbGxvY2F0ZWQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCisgICAgICAgIHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCB1c2FnZSkKK3sKKyAgICByZXR1cm4gd2luZG93LT5wZXJmb3JtKHdpbmRvdywgTkFUSVZFX1dJTkRPV19TRVRfVVNBR0UsIHVzYWdlKTsKK30KKworLyoKKyAqIG5hdGl2ZV93aW5kb3dfY29ubmVjdCguLi4sIE5BVElWRV9XSU5ET1dfQVBJX0VHTCkKKyAqIE11c3QgYmUgY2FsbGVkIGJ5IEVHTCB3aGVuIHRoZSB3aW5kb3cgaXMgbWFkZSBjdXJyZW50LgorICogUmV0dXJucyAtRUlOVkFMIGlmIGZvciBzb21lIHJlYXNvbiB0aGUgd2luZG93IGNhbm5vdCBiZSBjb25uZWN0ZWQsIHdoaWNoCisgKiBjYW4gaGFwcGVuIGlmIGl0J3MgY29ubmVjdGVkIHRvIHNvbWUgb3RoZXIgQVBJLgorICovCitzdGF0aWMgaW5saW5lIGludCBuYXRpdmVfd2luZG93X2Nvbm5lY3QoCisgICAgICAgIHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCBhcGkpCit7CisgICAgcmV0dXJuIHdpbmRvdy0+cGVyZm9ybSh3aW5kb3csIE5BVElWRV9XSU5ET1dfQ09OTkVDVCwgYXBpKTsKK30KKworLyoKKyAqIG5hdGl2ZV93aW5kb3dfZGlzY29ubmVjdCguLi4sIE5BVElWRV9XSU5ET1dfQVBJX0VHTCkKKyAqIE11c3QgYmUgY2FsbGVkIGJ5IEVHTCB3aGVuIHRoZSB3aW5kb3cgaXMgbWFkZSBub3QgY3VycmVudC4KKyAqIEFuIGVycm9yIGlzIHJldHVybmVkIGlmIGZvciBpbnN0YW5jZSB0aGUgd2luZG93IHdhc24ndCBjb25uZWN0ZWQgaW4gdGhlCisgKiBmaXJzdCBwbGFjZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmF0aXZlX3dpbmRvd19kaXNjb25uZWN0KAorICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgYXBpKQoreworICAgIHJldHVybiB3aW5kb3ctPnBlcmZvcm0od2luZG93LCBOQVRJVkVfV0lORE9XX0RJU0NPTk5FQ1QsIGFwaSk7Cit9CisKKy8qCisgKiBuYXRpdmVfd2luZG93X3NldF9jcm9wKC4uLiwgY3JvcCkKKyAqIFNldHMgd2hpY2ggcmVnaW9uIG9mIHRoZSBuZXh0IHF1ZXVlZCBidWZmZXJzIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQuCisgKiBBIGJ1ZmZlcidzIGNyb3AgcmVnaW9uIGlzIHNjYWxlZCB0byBtYXRjaCB0aGUgc3VyZmFjZSdzIHNpemUuCisgKgorICogVGhlIHNwZWNpZmllZCBjcm9wIHJlZ2lvbiBhcHBsaWVzIHRvIGFsbCBidWZmZXJzIHF1ZXVlZCBhZnRlciBpdCBpcyBjYWxsZWQuCisgKgorICogaWYgJ2Nyb3AnIGlzIE5VTEwsIHN1YnNlcXVlbnRseSBxdWV1ZWQgYnVmZmVycyB3b24ndCBiZSBjcm9wcGVkLgorICoKKyAqIEFuIGVycm9yIGlzIHJldHVybmVkIGlmIGZvciBpbnN0YW5jZSB0aGUgY3JvcCByZWdpb24gaXMgaW52YWxpZCwKKyAqIG91dCBvZiB0aGUgYnVmZmVyJ3MgYm91bmQgb3IgaWYgdGhlIHdpbmRvdyBpcyBpbnZhbGlkLgorICovCitzdGF0aWMgaW5saW5lIGludCBuYXRpdmVfd2luZG93X3NldF9jcm9wKAorICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogd2luZG93LAorICAgICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY29uc3QgKiBjcm9wKQoreworICAgIHJldHVybiB3aW5kb3ctPnBlcmZvcm0od2luZG93LCBOQVRJVkVfV0lORE9XX1NFVF9DUk9QLCBjcm9wKTsKK30KKworLyoKKyAqIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCguLi4sIGNvdW50KQorICogU2V0cyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmF0aXZlIHdpbmRvdy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogd2luZG93LAorICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQpCit7CisgICAgcmV0dXJuIHdpbmRvdy0+cGVyZm9ybSh3aW5kb3csIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUl9DT1VOVCwgYnVmZmVyQ291bnQpOworfQorCisvKgorICogbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSguLi4sIGludCB3LCBpbnQgaCwgaW50IGZvcm1hdCkKKyAqIEFsbCBidWZmZXJzIGRlcXVldWVkIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGhhdmUgdGhlIGdlb21ldHJ5IHNwZWNpZmllZC4KKyAqIEluIHBhcnRpY3VsYXIsIGFsbCBidWZmZXJzIHdpbGwgaGF2ZSBhIGZpeGVkLXNpemUsIGluZGVwZW5kZW50IGZvcm0gdGhlCisgKiBuYXRpdmUtd2luZG93IHNpemUuIFRoZXkgd2lsbCBiZSBhcHByb3ByaWF0ZWx5IHNjYWxlZCB0byB0aGUgd2luZG93LXNpemUKKyAqIHVwb24gY29tcG9zaXRpb24uCisgKgorICogSWYgYWxsIHBhcmFtZXRlcnMgYXJlIDAsIHRoZSBub3JtYWwgYmVoYXZpb3IgaXMgcmVzdG9yZWQuIFRoYXQgaXMsCisgKiBkZXF1ZXVlZCBidWZmZXJzIGZvbGxvd2luZyB0aGlzIGNhbGwgd2lsbCBiZSBzaXplZCB0byB0aGUgd2luZG93J3Mgc2l6ZS4KKyAqCisgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgd2luZG93IGNyb3AgdG8gYSBOVUxMIHZhbHVlLCB3aGljaAorICogZGlzYWJsZXMgY3JvcHBpbmcgb2YgdGhlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgICAgIHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csCisgICAgICAgIGludCB3LCBpbnQgaCwgaW50IGZvcm1hdCkKK3sKKyAgICByZXR1cm4gd2luZG93LT5wZXJmb3JtKHdpbmRvdywgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19HRU9NRVRSWSwKKyAgICAgICAgICAgIHcsIGgsIGZvcm1hdCk7Cit9CisKKy8qCisgKiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSguLi4sIGludCB0cmFuc2Zvcm0pCisgKiBBbGwgYnVmZmVycyBxdWV1ZWQgYWZ0ZXIgdGhpcyBjYWxsIHdpbGwgYmUgZGlzcGxheWVkIHRyYW5zZm9ybWVkIGFjY29yZGluZworICogdG8gdGhlIHRyYW5zZm9ybSBwYXJhbWV0ZXIgc3BlY2lmaWVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSgKKyAgICAgICAgc3RydWN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgaW50IHRyYW5zZm9ybSkKK3sKKyAgICByZXR1cm4gd2luZG93LT5wZXJmb3JtKHdpbmRvdywgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19UUkFOU0ZPUk0sCisgICAgICAgICAgICB0cmFuc2Zvcm0pOworfQorCisvKgorICogbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAoLi4uLCBpbnQ2NF90IHRpbWVzdGFtcCkKKyAqIEFsbCBidWZmZXJzIHF1ZXVlZCBhZnRlciB0aGlzIGNhbGwgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVzdGFtcAorICogcGFyYW1ldGVyIHNwZWNpZmllZC4gSWYgdGhlIHRpbWVzdGFtcCBpcyBzZXQgdG8gTkFUSVZFX1dJTkRPV19USU1FU1RBTVBfQVVUTworICogKHRoZSBkZWZhdWx0KSwgdGltZXN0YW1wcyB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gcXVldWVCdWZmZXIgaXMKKyAqIGNhbGxlZC4gVGhlIHRpbWVzdGFtcCBpcyBtZWFzdXJlZCBpbiBuYW5vc2Vjb25kcywgYW5kIG11c3QgYmUgbW9ub3RvbmljYWxseQorICogaW5jcmVhc2luZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAoCisgICAgICAgIHN0cnVjdCBBTmF0aXZlV2luZG93KiB3aW5kb3csCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wKQoreworICAgIHJldHVybiB3aW5kb3ctPnBlcmZvcm0od2luZG93LCBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RJTUVTVEFNUCwKKyAgICAgICAgICAgIHRpbWVzdGFtcCk7Cit9CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiBTWVNURU1fQ09SRV9JTkNMVURFX0FORFJPSURfV0lORE9XX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3lzdXRpbHMvU29ja2V0Q2xpZW50LmggYi9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldENsaWVudC5oCmluZGV4IGU3ZmIxNzcuLmQ2YmI3ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3lzdXRpbHMvU29ja2V0Q2xpZW50LmgKKysrIGIvaW5jbHVkZS9zeXN1dGlscy9Tb2NrZXRDbGllbnQuaApAQCAtMTksNiArMTksMTAgQEAKICAgICAvKiBQZWVyIGdyb3VwIElEICovCiAgICAgZ2lkX3QgbUdpZDsKIAorICAgIC8qIFJlZmVyZW5jZSBjb3VudCAoc3RhcnRzIGF0IDEpICovCisgICAgcHRocmVhZF9tdXRleF90IG1SZWZDb3VudE11dGV4OworICAgIGludCBtUmVmQ291bnQ7CisKIHB1YmxpYzoKICAgICBTb2NrZXRDbGllbnQoaW50IHNvY2spOwogICAgIHZpcnR1YWwgflNvY2tldENsaWVudCgpIHt9CkBAIC0yOCw4ICszMiwxOSBAQAogICAgIHVpZF90IGdldFVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KICAgICBnaWRfdCBnZXRHaWQoKSBjb25zdCB7IHJldHVybiBtR2lkOyB9CiAKKyAgICAvLyBTZW5kIG51bGwtdGVybWluYXRlZCBDIHN0cmluZ3M6CiAgICAgaW50IHNlbmRNc2coaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgYm9vbCBhZGRFcnJubyk7CiAgICAgaW50IHNlbmRNc2coY29uc3QgY2hhciAqbXNnKTsKKworICAgIC8vIFNlbmRpbmcgYmluYXJ5IGRhdGE6CisgICAgaW50IHNlbmREYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOworCisgICAgLy8gT3B0aW9uYWwgcmVmZXJlbmNlIGNvdW50aW5nLiAgUmVmZXJlbmNlIGNvdW50IHN0YXJ0cyBhdCAxLiAgSWYKKyAgICAvLyBpdCdzIGRlY3JlbWVudGVkIHRvIDAsIGl0IGRlbGV0ZXMgaXRzZWxmLgorICAgIC8vIFNvY2tldExpc3RlbmVyIGNyZWF0ZXMgYSBTb2NrZXRDbGllbnQgKGF0IHJlZmNvdW50IDEpIGFuZCBjYWxscworICAgIC8vIGRlY1JlZigpIHdoZW4gaXQncyBkb25lIHdpdGggdGhlIGNsaWVudC4KKyAgICB2b2lkIGluY1JlZigpOworICAgIGJvb2wgZGVjUmVmKCk7IC8vIHJldHVybnMgdHJ1ZSBhdCAwIChidXQgbm90ZTogU29ja2V0Q2xpZW50IGFscmVhZHkgZGVsZXRlZCkKIH07CiAKIHR5cGVkZWYgYW5kcm9pZDo6TGlzdDxTb2NrZXRDbGllbnQgKj4gU29ja2V0Q2xpZW50Q29sbGVjdGlvbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3lzdXRpbHMvU29ja2V0TGlzdGVuZXIuaCBiL2luY2x1ZGUvc3lzdXRpbHMvU29ja2V0TGlzdGVuZXIuaAppbmRleCBjN2VkZmViLi42NTkyYjAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldExpc3RlbmVyLmgKKysrIGIvaW5jbHVkZS9zeXN1dGlscy9Tb2NrZXRMaXN0ZW5lci5oCkBAIC0zMCw3ICszMCw3IEBACiAgICAgcHRocmVhZF90ICAgICAgICAgICAgICAgbVRocmVhZDsKIAogcHVibGljOgotICAgIFNvY2tldExpc3RlbmVyKGNvbnN0IGNoYXIgKnNvY2tldE5hbWVzLCBib29sIGxpc3Rlbik7CisgICAgU29ja2V0TGlzdGVuZXIoY29uc3QgY2hhciAqc29ja2V0TmFtZSwgYm9vbCBsaXN0ZW4pOwogICAgIFNvY2tldExpc3RlbmVyKGludCBzb2NrZXRGZCwgYm9vbCBsaXN0ZW4pOwogCiAgICAgdmlydHVhbCB+U29ja2V0TGlzdGVuZXIoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNiaG9zdC91c2Job3N0LmggYi9pbmNsdWRlL3VzYmhvc3QvdXNiaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmI1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VzYmhvc3QvdXNiaG9zdC5oCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1VTQl9IT1NUX0gKKyNkZWZpbmUgX19VU0JfSE9TVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDIwKQorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgorI2VuZGlmCisKK3N0cnVjdCB1c2JfaG9zdF9jb250ZXh0Oworc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yOworCitzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciB7CisgICAgdW5zaWduZWQgY2hhciogIGNvbmZpZzsKKyAgICB1bnNpZ25lZCBjaGFyKiAgY29uZmlnX2VuZDsKKyAgICB1bnNpZ25lZCBjaGFyKiAgY3Vycl9kZXNjOworfTsKKworc3RydWN0IHVzYl9yZXF1ZXN0Cit7CisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKyAgICB2b2lkKiBidWZmZXI7CisgICAgaW50IGJ1ZmZlcl9sZW5ndGg7CisgICAgaW50IGFjdHVhbF9sZW5ndGg7CisgICAgaW50IG1heF9wYWNrZXRfc2l6ZTsKKyAgICB2b2lkICpwcml2YXRlX2RhdGE7IC8qIHN0cnVjdCB1c2JkZXZmc191cmIqICovCisgICAgaW50IGVuZHBvaW50OworICAgIHZvaWQgKmNsaWVudF9kYXRhOyAgLyogZnJlZSBmb3IgdXNlIGJ5IGNsaWVudCAqLworfTsKKworLyogQ2FsbGJhY2sgZm9yIG5vdGlmaWNhdGlvbiB3aGVuIG5ldyBVU0IgZGV2aWNlcyBhcmUgYXR0YWNoZWQuCisgKiBSZXR1cm4gdHJ1ZSB0byBleGl0IGZyb20gdXNiX2hvc3RfcnVuLgorICovCit0eXBlZGVmIGludCAoKiB1c2JfZGV2aWNlX2FkZGVkX2NiKShjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqY2xpZW50X2RhdGEpOworCisvKiBDYWxsYmFjayBmb3Igbm90aWZpY2F0aW9uIHdoZW4gVVNCIGRldmljZXMgYXJlIHJlbW92ZWQuCisgKiBSZXR1cm4gdHJ1ZSB0byBleGl0IGZyb20gdXNiX2hvc3RfcnVuLgorICovCit0eXBlZGVmIGludCAoKiB1c2JfZGV2aWNlX3JlbW92ZWRfY2IpKGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpjbGllbnRfZGF0YSk7CisKKy8qIENhbGxiYWNrIGluZGljYXRpbmcgdGhhdCBpbml0aWFsIGRldmljZSBkaXNjb3ZlcnkgaXMgZG9uZS4KKyAqIFJldHVybiB0cnVlIHRvIGV4aXQgZnJvbSB1c2JfaG9zdF9ydW4uCisgKi8KK3R5cGVkZWYgaW50ICgqIHVzYl9kaXNjb3ZlcnlfZG9uZV9jYikodm9pZCAqY2xpZW50X2RhdGEpOworCisvKiBDYWxsIHRoaXMgdG8gaW5pdGlhbGl6ZSB0aGUgVVNCIGhvc3QgbGlicmFyeS4gKi8KK3N0cnVjdCB1c2JfaG9zdF9jb250ZXh0ICp1c2JfaG9zdF9pbml0KHZvaWQpOworCisvKiBDYWxsIHRoaXMgdG8gY2xlYW51cCB0aGUgVVNCIGhvc3QgbGlicmFyeS4gKi8KK3ZvaWQgdXNiX2hvc3RfY2xlYW51cChzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCAqY29udGV4dCk7CisKKy8qIENhbGwgdGhpcyB0byBtb25pdG9yIHRoZSBVU0IgYnVzIGZvciBuZXcgYW5kIHJlbW92ZWQgZGV2aWNlcy4KKyAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gYSBkZWRpY2F0ZWQgdGhyZWFkLAorICogYXMgaXQgd2lsbCBub3QgcmV0dXJuIHVudGlsIG9uZSBvZiB0aGUgY2FsbGJhY2tzIHJldHVybnMgdHJ1ZS4KKyAqIGFkZGVkX2NiIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGZvciBlYWNoIGV4aXN0aW5nIFVTQiBkZXZpY2UsCisgKiBhbmQgc3Vic2VxdWVudGx5IGVhY2ggdGltZSBhIG5ldyBkZXZpY2UgaXMgYWRkZWQuCisgKiByZW1vdmVkX2NiIGlzIGNhbGxlZCB3aGVuIFVTQiBkZXZpY2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIGJ1cy4KKyAqIGRpc2NvdmVyeV9kb25lX2NiIGlzIGNhbGxlZCBhZnRlciB0aGUgaW5pdGlhbCBkaXNjb3Zlcnkgb2YgYWxyZWFkeQorICogY29ubmVjdGVkIGRldmljZXMgaXMgY29tcGxldGUuCisgKi8KK3ZvaWQgdXNiX2hvc3RfcnVuKHN0cnVjdCB1c2JfaG9zdF9jb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9hZGRlZF9jYiBhZGRlZF9jYiwKKyAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfcmVtb3ZlZF9jYiByZW1vdmVkX2NiLAorICAgICAgICAgICAgICAgICAgdXNiX2Rpc2NvdmVyeV9kb25lX2NiIGRpc2NvdmVyeV9kb25lX2NiLAorICAgICAgICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworCisvKiBDcmVhdGVzIGEgdXNiX2RldmljZSBvYmplY3QgZm9yIGEgVVNCIGRldmljZSAqLworc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXZpY2Vfb3Blbihjb25zdCBjaGFyICpkZXZfbmFtZSk7CisKKy8qIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVU0IgZGV2aWNlICovCit2b2lkIHVzYl9kZXZpY2VfY2xvc2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSk7CisKKy8qIENyZWF0ZXMgYSB1c2JfZGV2aWNlIG9iamVjdCBmb3IgYWxyZWFkeSBvcGVuIFVTQiBkZXZpY2UgKi8KK3N0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2aWNlX25ldyhjb25zdCBjaGFyICpkZXZfbmFtZSwgaW50IGZkKTsKKworLyogUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgdXNiX2RldmljZSAqLworaW50IHVzYl9kZXZpY2VfZ2V0X2ZkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UpOworCisvKiBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGUgVVNCIGRldmljZSwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKKyAqIHRoZSBkZXZfbmFtZSBwYXNzZWQgdG8gdXNiX2RldmljZV9vcGVuKCkKKyAqLworY29uc3QgY2hhciogdXNiX2RldmljZV9nZXRfbmFtZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlKTsKKworLyogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhlIGRldmljZS4KKyAqQ3VycmVudGx5IHRoaXMgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIGRldl9uYW1lIHBhdGguCisgKi8KK2ludCB1c2JfZGV2aWNlX2dldF91bmlxdWVfaWQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSk7CisKKy8qIFJldHVybnMgYSB1bmlxdWUgSUQgZm9yIHRoZSBkZXZpY2UgbmFtZS4KKyAqIEN1cnJlbnRseSB0aGlzIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBkZXZpY2UgcGF0aC4KKyAqLworaW50IHVzYl9kZXZpY2VfZ2V0X3VuaXF1ZV9pZF9mcm9tX25hbWUoY29uc3QgY2hhciogbmFtZSk7CisKKy8qIFJldHVybnMgdGhlIGRldmljZSBuYW1lIGZvciB0aGUgdW5pcXVlIElELgorICogQ2FsbCBmcmVlKCkgdG8gZGVhbGxvY2F0ZSB0aGUgcmV0dXJuZWQgc3RyaW5nICovCitjaGFyKiB1c2JfZGV2aWNlX2dldF9uYW1lX2Zyb21fdW5pcXVlX2lkKGludCBpZCk7CisKKy8qIFJldHVybnMgdGhlIFVTQiB2ZW5kb3IgSUQgZnJvbSB0aGUgZGV2aWNlIGRlc2NyaXB0b3IgZm9yIHRoZSBVU0IgZGV2aWNlICovCit1aW50MTZfdCB1c2JfZGV2aWNlX2dldF92ZW5kb3JfaWQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSk7CisKKy8qIFJldHVybnMgdGhlIFVTQiBwcm9kdWN0IElEIGZyb20gdGhlIGRldmljZSBkZXNjcmlwdG9yIGZvciB0aGUgVVNCIGRldmljZSAqLwordWludDE2X3QgdXNiX2RldmljZV9nZXRfcHJvZHVjdF9pZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlKTsKKworY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciogdXNiX2RldmljZV9nZXRfZGV2aWNlX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSk7CisKKy8qIFJldHVybnMgYSBVU0IgZGVzY3JpcHRvciBzdHJpbmcgZm9yIHRoZSBnaXZlbiBzdHJpbmcgSUQuCisgKiBVc2VkIHRvIGltcGxlbWVudCB1c2JfZGV2aWNlX2dldF9tYW51ZmFjdHVyZXJfbmFtZSwKKyAqIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZSBhbmQgdXNiX2RldmljZV9nZXRfc2VyaWFsLgorICogQ2FsbCBmcmVlKCkgdG8gZnJlZSB0aGUgcmVzdWx0IHdoZW4geW91IGFyZSBkb25lIHdpdGggaXQuCisgKi8KK2NoYXIqIHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBpbnQgaWQpOworCisvKiBSZXR1cm5zIHRoZSBtYW51ZmFjdHVyZXIgbmFtZSBmb3IgdGhlIFVTQiBkZXZpY2UuCisgKiBDYWxsIGZyZWUoKSB0byBmcmVlIHRoZSByZXN1bHQgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4KKyAqLworY2hhciogdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSk7CisKKy8qIFJldHVybnMgdGhlIHByb2R1Y3QgbmFtZSBmb3IgdGhlIFVTQiBkZXZpY2UuCisgKiBDYWxsIGZyZWUoKSB0byBmcmVlIHRoZSByZXN1bHQgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4KKyAqLworY2hhciogdXNiX2RldmljZV9nZXRfcHJvZHVjdF9uYW1lKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UpOworCisvKiBSZXR1cm5zIHRoZSBVU0Igc2VyaWFsIG51bWJlciBmb3IgdGhlIFVTQiBkZXZpY2UuCisgKiBDYWxsIGZyZWUoKSB0byBmcmVlIHRoZSByZXN1bHQgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4KKyAqLworY2hhciogdXNiX2RldmljZV9nZXRfc2VyaWFsKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UpOworCisvKiBSZXR1cm5zIHRydWUgaWYgd2UgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIFVTQiBkZXZpY2UsCisgKiBhbmQgZmFsc2UgaWYgd2Ugb25seSBoYXZlIGFjY2VzcyB0byB0aGUgVVNCIGRldmljZSBjb25maWd1cmF0aW9uLgorICovCitpbnQgdXNiX2RldmljZV9pc193cml0ZWFibGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSk7CisKKy8qIEluaXRpYWxpemVzIGEgdXNiX2Rlc2NyaXB0b3JfaXRlciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbAorICogdGhlIFVTQiBkZXNjcmlwdG9ycyBmb3IgYSBVU0IgZGV2aWNlLgorICovCit2b2lkIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciAqaXRlcik7CisKKy8qIFJldHVybnMgdGhlIG5leHQgVVNCIGRlc2NyaXB0b3IgZm9yIGEgZGV2aWNlLCBvciBOVUxMIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUKKyAqIGVuZCBvZiB0aGUgbGlzdC4KKyAqLworc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyICppdGVyKTsKKworLyogQ2xhaW1zIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG9mIGEgVVNCIGRldmljZSAqLworaW50IHVzYl9kZXZpY2VfY2xhaW1faW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBpbnRlcmZhY2UpOworCisvKiBSZWxlYXNlcyB0aGUgc3BlY2lmaWVkIGludGVyZmFjZSBvZiBhIFVTQiBkZXZpY2UgKi8KK2ludCB1c2JfZGV2aWNlX3JlbGVhc2VfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBpbnRlcmZhY2UpOworCisvKiBSZXF1ZXN0cyB0aGUga2VybmVsIHRvIGNvbm5lY3Qgb3IgZGlzY29ubmVjdCBpdHMgZHJpdmVyIGZvciB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXNrIHRoZSBrZXJuZWwgdG8gZGlzY29ubmVjdCBpdHMgZHJpdmVyIGZvciBhIGRldmljZQorICogc28gdXNiX2RldmljZV9jbGFpbV9pbnRlcmZhY2UgY2FuIGNsYWltIGl0IGluc3RlYWQuCisgKi8KK2ludCB1c2JfZGV2aWNlX2Nvbm5lY3Rfa2VybmVsX2RyaXZlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLAorICAgICAgICB1bnNpZ25lZCBpbnQgaW50ZXJmYWNlLCBpbnQgY29ubmVjdCk7CisKKy8qIFNlbmRzIGEgY29udHJvbCBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlIG9uIGVuZHBvaW50IHplcm8gKi8KK2ludCB1c2JfZGV2aWNlX2NvbnRyb2xfdHJhbnNmZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGltZW91dCk7CisKKy8qIFJlYWRzIG9yIHdyaXRlcyBvbiBhIGJ1bGsgZW5kcG9pbnQuCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3IgbmVnYXRpdmUgdmFsdWUgZm9yIGVycm9yLgorICovCitpbnQgdXNiX2RldmljZV9idWxrX3RyYW5zZmVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0KTsKKworLyogQ3JlYXRlcyBhIG5ldyB1c2JfcmVxdWVzdC4gKi8KK3N0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3JlcXVlc3RfbmV3KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisgICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfZGVzYyk7CisKKy8qIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ICovCit2b2lkIHVzYl9yZXF1ZXN0X2ZyZWUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpOworCisvKiBTdWJtaXRzIGEgcmVhZCBvciB3cml0ZSByZXF1ZXN0IG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlICovCitpbnQgdXNiX3JlcXVlc3RfcXVldWUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpOworCisgLyogV2FpdHMgZm9yIHRoZSByZXN1bHRzIG9mIGEgcHJldmlvdXMgdXNiX3JlcXVlc3RfcXVldWUgb3BlcmF0aW9uLgorICAqIFJldHVybnMgYSB1c2JfcmVxdWVzdCwgb3IgTlVMTCBmb3IgZXJyb3IuCisgICovCitzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXF1ZXN0X3dhaXQoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CisKKy8qIENhbmNlbHMgYSBwZW5kaW5nIHVzYl9yZXF1ZXN0X3F1ZXVlKCkgb3BlcmF0aW9uLiAqLworaW50IHVzYl9yZXF1ZXN0X2NhbmNlbChzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogX19VU0JfSE9TVF9IICovCmRpZmYgLS1naXQgYS9pbml0L2J1aWx0aW5zLmMgYi9pbml0L2J1aWx0aW5zLmMKaW5kZXggZTBjY2Y5Zi4uZjJmNzZiNyAxMDA2NDQKLS0tIGEvaW5pdC9idWlsdGlucy5jCisrKyBiL2luaXQvYnVpbHRpbnMuYwpAQCAtMTYyLDYgKzE2MiwxMiBAQAogICAgIHJldHVybiAwOwogfQogCitpbnQgZG9fY2xhc3NfcmVzZXQoaW50IG5hcmdzLCBjaGFyICoqYXJncykKK3sKKyAgICBzZXJ2aWNlX2Zvcl9lYWNoX2NsYXNzKGFyZ3NbMV0sIHNlcnZpY2VfcmVzZXQpOworICAgIHJldHVybiAwOworfQorCiBpbnQgZG9fZG9tYWlubmFtZShpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQogewogICAgIHJldHVybiB3cml0ZV9maWxlKCIvcHJvYy9zeXMva2VybmVsL2RvbWFpbm5hbWUiLCBhcmdzWzFdKTsKQEAgLTI1OCw3ICsyNjQsNiBAQAogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgdW5zaWduZWQgZmxhZzsKIH0gbW91bnRfZmxhZ3NbXSA9IHsKLSAgICB7ICJtb3ZlIiwgICAgICAgTVNfTU9WRSB9LAogICAgIHsgIm5vYXRpbWUiLCAgICBNU19OT0FUSU1FIH0sCiAgICAgeyAibm9zdWlkIiwgICAgIE1TX05PU1VJRCB9LAogICAgIHsgIm5vZGV2IiwgICAgICBNU19OT0RFViB9LApAQCAtMjcwLDYgKzI3NSw4IEBACiAgICAgeyAwLCAgICAgICAgICAgIDAgfSwKIH07CiAKKyNkZWZpbmUgREFUQV9NTlRfUE9JTlQgIi9kYXRhIgorCiAvKiBtb3VudCA8dHlwZT4gPGRldmljZT4gPHBhdGg+IDxmbGFncyAuLi4+IDxvcHRpb25zPiAqLwogaW50IGRvX21vdW50KGludCBuYXJncywgY2hhciAqKmFyZ3MpCiB7CkBAIC0zMTUsNyArMzIyLDcgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiAwOworICAgICAgICBnb3RvIGV4aXRfc3VjY2VzczsKICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHNvdXJjZSwgImxvb3BAIiwgNSkpIHsKICAgICAgICAgaW50IG1vZGUsIGxvb3AsIGZkOwogICAgICAgICBzdHJ1Y3QgbG9vcF9pbmZvIGluZm87CkBAIC0zNDYsNyArMzUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGxvb3ApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0X3N1Y2Nlc3M7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0zNjAsMTEgKzM2Nyw2OCBAQAogICAgICAgICBpZiAod2FpdCkKICAgICAgICAgICAgIHdhaXRfZm9yX2ZpbGUoc291cmNlLCBDT01NQU5EX1JFVFJZX1RJTUVPVVQpOwogICAgICAgICBpZiAobW91bnQoc291cmNlLCB0YXJnZXQsIHN5c3RlbSwgZmxhZ3MsIG9wdGlvbnMpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgLyogSWYgdGhpcyBmYWlscywgaXQgbWF5IGJlIGFuIGVuY3J5cHRlZCBmaWxlc3lzdGVtLgorICAgICAgICAgICAgICogV2Ugb25seSBzdXBwb3J0IGVuY3J5cHRpbmcgL2RhdGEuICBDaGVjaworICAgICAgICAgICAgICogaWYgd2UncmUgdHJ5aW5nIHRvIG1vdW50IGl0LCBhbmQgaWYgc28sCisgICAgICAgICAgICAgKiBhc3N1bWUgaXQncyBlbmNyeXB0ZWQsIG1vdW50IGEgdG1wZnMgaW5zdGVhZC4KKyAgICAgICAgICAgICAqIFRoZW4gc2F2ZSB0aGUgb3JpZyBtb3VudCBwYXJtcyBpbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICAgKiBmb3Igdm9sZCB0byBxdWVyeSB3aGVuIGl0IG1vdW50cyB0aGUgcmVhbAorICAgICAgICAgICAgICogZW5jcnlwdGVkIC9kYXRhLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIXN0cmNtcCh0YXJnZXQsIERBVEFfTU5UX1BPSU5UKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcGZzX29wdGlvbnM7CisKKyAgICAgICAgICAgICAgICB0bXBmc19vcHRpb25zID0gcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8udG1wZnNfb3B0aW9ucyIpOworCisgICAgICAgICAgICAgICAgaWYgKG1vdW50KCJ0bXBmcyIsIHRhcmdldCwgInRtcGZzIiwgTVNfTk9BVElNRSB8IE1TX05PU1VJRCB8IE1TX05PREVWLAorICAgICAgICAgICAgICAgICAgICB0bXBmc19vcHRpb25zKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHJvcGVydHkgdGhhdCB0cmlnZ2VycyB0aGUgZnJhbWV3b3JrIHRvIGRvIGEgbWluaW1hbAorICAgICAgICAgICAgICAgICAqIHN0YXJ0dXAgYW5kIGFzayB0aGUgdXNlciBmb3IgYSBwYXNzd29yZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHByb3BlcnR5X3NldCgicm8uY3J5cHRvLnN0YXRlIiwgImVuY3J5cHRlZCIpOworICAgICAgICAgICAgICAgIHByb3BlcnR5X3NldCgidm9sZC5kZWNyeXB0IiwgIjEiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICghc3RyY21wKHRhcmdldCwgREFUQV9NTlRfUE9JTlQpKSB7CisgICAgICAgICAgICBjaGFyIGZzX2ZsYWdzWzMyXTsKKworICAgICAgICAgICAgLyogU2F2ZSB0aGUgb3JpZ2luYWwgbW91bnQgb3B0aW9ucyAqLworICAgICAgICAgICAgcHJvcGVydHlfc2V0KCJyby5jcnlwdG8uZnNfdHlwZSIsIHN5c3RlbSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoInJvLmNyeXB0by5mc19yZWFsX2Jsa2RldiIsIHNvdXJjZSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoInJvLmNyeXB0by5mc19tbnRfcG9pbnQiLCB0YXJnZXQpOworICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoInJvLmNyeXB0by5mc19vcHRpb25zIiwgb3B0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbnByaW50Zihmc19mbGFncywgc2l6ZW9mKGZzX2ZsYWdzKSwgIjB4JTguOHgiLCBmbGFncyk7CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoInJvLmNyeXB0by5mc19mbGFncyIsIGZzX2ZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KKworZXhpdF9zdWNjZXNzOgorICAgIC8qIElmIG5vdCBydW5uaW5nIGVuY3J5cHRlZCwgdGhlbiBzZXQgdGhlIHByb3BlcnR5IHNheWluZyB3ZSBhcmUKKyAgICAgKiB1bmVuY3J5cHRlZCwgYW5kIGFsc28gdHJpZ2dlciB0aGUgYWN0aW9uIGZvciBhIG5vbmVuY3J5cHRlZCBzeXN0ZW0uCisgICAgICovCisgICAgaWYgKCFzdHJjbXAodGFyZ2V0LCBEQVRBX01OVF9QT0lOVCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcHJvcDsKKworICAgICAgICBwcm9wID0gcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8uc3RhdGUiKTsKKyAgICAgICAgaWYgKCEgcHJvcCkgeworICAgICAgICAgICAgcHJvcCA9ICJub3RzZXQiOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAocHJvcCwgImVuY3J5cHRlZCIpKSB7CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoInJvLmNyeXB0by5zdGF0ZSIsICJ1bmVuY3J5cHRlZCIpOworICAgICAgICAgICAgYWN0aW9uX2Zvcl9lYWNoX3RyaWdnZXIoIm5vbmVuY3J5cHRlZCIsIGFjdGlvbl9hZGRfcXVldWVfdGFpbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKwogfQogCiBpbnQgZG9fc2V0a2V5KGludCBuYXJncywgY2hhciAqKmFyZ3MpCkBAIC00MzQsNiArNDk4LDE2IEBACiAgICAgcmV0dXJuIHN5bWxpbmsoYXJnc1sxXSwgYXJnc1syXSk7CiB9CiAKK2ludCBkb19ybShpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQoreworICAgIHJldHVybiB1bmxpbmsoYXJnc1sxXSk7Cit9CisKK2ludCBkb19ybWRpcihpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKQoreworICAgIHJldHVybiBybWRpcihhcmdzWzFdKTsKK30KKwogaW50IGRvX3N5c2Nsa3R6KGludCBuYXJncywgY2hhciAqKmFyZ3MpCiB7CiAgICAgc3RydWN0IHRpbWV6b25lIHR6OwpAQCAtNTU4LDYgKzYzMiwxNCBAQAogICAgIHJldHVybiAtMTsKIH0KIAoraW50IGRvX2xvYWRfcGVyc2lzdF9wcm9wcyhpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKSB7CisgICAgaWYgKG5hcmdzID09IDEpIHsKKyAgICAgICAgbG9hZF9wZXJzaXN0X3Byb3BzKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKIGludCBkb193YWl0KGludCBuYXJncywgY2hhciAqKmFyZ3MpCiB7CiAgICAgaWYgKG5hcmdzID09IDIpIHsKZGlmZiAtLWdpdCBhL2luaXQvZGV2aWNlcy5jIGIvaW5pdC9kZXZpY2VzLmMKaW5kZXggZTczZWZkZi4uYTIwMGM5NSAxMDA2NDQKLS0tIGEvaW5pdC9kZXZpY2VzLmMKKysrIGIvaW5pdC9kZXZpY2VzLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0zMyw2ICszNCw4IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL3VldmVudC5oPgorCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJsb2cuaCIKQEAgLTk2LDggKzk5LDE1IEBACiAgICAgc3RydWN0IGxpc3Rub2RlIHBsaXN0OwogfTsKIAorc3RydWN0IHBsYXRmb3JtX25vZGUgeworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IG5hbWVfbGVuOworICAgIHN0cnVjdCBsaXN0bm9kZSBsaXN0OworfTsKKwogc3RhdGljIGxpc3RfZGVjbGFyZShzeXNfcGVybXMpOwogc3RhdGljIGxpc3RfZGVjbGFyZShkZXZfcGVybXMpOworc3RhdGljIGxpc3RfZGVjbGFyZShwbGF0Zm9ybV9uYW1lcyk7CiAKIGludCBhZGRfZGV2X3Blcm1zKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsCiAgICAgICAgICAgICAgICAgICBtb2RlX3QgcGVybSwgdW5zaWduZWQgaW50IHVpZCwgdW5zaWduZWQgaW50IGdpZCwKQEAgLTIxMSw2ICsyMjEsNjggQEAKICAgICBzZXRlZ2lkKEFJRF9ST09UKTsKIH0KIAorc3RhdGljIHZvaWQgYWRkX3BsYXRmb3JtX2RldmljZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBuYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CisgICAgc3RydWN0IHBsYXRmb3JtX25vZGUgKmJ1czsKKworICAgIGxpc3RfZm9yX2VhY2hfcmV2ZXJzZShub2RlLCAmcGxhdGZvcm1fbmFtZXMpIHsKKyAgICAgICAgYnVzID0gbm9kZV90b19pdGVtKG5vZGUsIHN0cnVjdCBwbGF0Zm9ybV9ub2RlLCBsaXN0KTsKKyAgICAgICAgaWYgKChidXMtPm5hbWVfbGVuIDwgbmFtZV9sZW4pICYmCisgICAgICAgICAgICAgICAgKG5hbWVbYnVzLT5uYW1lX2xlbl0gPT0gJy8nKSAmJgorICAgICAgICAgICAgICAgICFzdHJuY21wKG5hbWUsIGJ1cy0+bmFtZSwgYnVzLT5uYW1lX2xlbikpCisgICAgICAgICAgICAvKiBzdWJkZXZpY2Ugb2YgYW4gZXhpc3RpbmcgcGxhdGZvcm0sIGlnbm9yZSBpdCAqLworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIElORk8oImFkZGluZyBwbGF0Zm9ybSBkZXZpY2UgJXNcbiIsIG5hbWUpOworCisgICAgYnVzID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGxhdGZvcm1fbm9kZSkpOworICAgIGJ1cy0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKyAgICBidXMtPm5hbWVfbGVuID0gbmFtZV9sZW47CisgICAgbGlzdF9hZGRfdGFpbCgmcGxhdGZvcm1fbmFtZXMsICZidXMtPmxpc3QpOworfQorCisvKgorICogZ2l2ZW4gYSBuYW1lIHRoYXQgbWF5IHN0YXJ0IHdpdGggYSBwbGF0Zm9ybSBkZXZpY2UsIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHBsYXRmb3JtIGRldmljZSBwcmVmaXguICBJZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBwbGF0Zm9ybSBkZXZpY2UsIHJldHVybgorICogMC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfcGxhdGZvcm1fZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IG5hbWVfbGVuID0gc3RybGVuKG5hbWUpOworICAgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKKyAgICBzdHJ1Y3QgcGxhdGZvcm1fbm9kZSAqYnVzOworCisgICAgbGlzdF9mb3JfZWFjaF9yZXZlcnNlKG5vZGUsICZwbGF0Zm9ybV9uYW1lcykgeworICAgICAgICBidXMgPSBub2RlX3RvX2l0ZW0obm9kZSwgc3RydWN0IHBsYXRmb3JtX25vZGUsIGxpc3QpOworICAgICAgICBpZiAoKGJ1cy0+bmFtZV9sZW4gPCBuYW1lX2xlbikgJiYKKyAgICAgICAgICAgICAgICAobmFtZVtidXMtPm5hbWVfbGVuXSA9PSAnLycpICYmCisgICAgICAgICAgICAgICAgIXN0cm5jbXAobmFtZSwgYnVzLT5uYW1lLCBidXMtPm5hbWVfbGVuKSkKKyAgICAgICAgICAgIHJldHVybiBidXMtPm5hbWU7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9wbGF0Zm9ybV9kZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CisgICAgc3RydWN0IHBsYXRmb3JtX25vZGUgKmJ1czsKKworICAgIGxpc3RfZm9yX2VhY2hfcmV2ZXJzZShub2RlLCAmcGxhdGZvcm1fbmFtZXMpIHsKKyAgICAgICAgYnVzID0gbm9kZV90b19pdGVtKG5vZGUsIHN0cnVjdCBwbGF0Zm9ybV9ub2RlLCBsaXN0KTsKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgYnVzLT5uYW1lKSkgeworICAgICAgICAgICAgSU5GTygicmVtb3ZpbmcgcGxhdGZvcm0gZGV2aWNlICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIGZyZWUoYnVzLT5uYW1lKTsKKyAgICAgICAgICAgIGxpc3RfcmVtb3ZlKG5vZGUpOworICAgICAgICAgICAgZnJlZShidXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCiAjaWYgTE9HX1VFVkVOVFMKIAogc3RhdGljIGlubGluZSBzdXNlY29uZHNfdCBnZXRfdXNlY3Modm9pZCkKQEAgLTI3OCw5ICszNTAsNjAgQEAKICAgICAgICAgICAgICAgICAgICAgdWV2ZW50LT5maXJtd2FyZSwgdWV2ZW50LT5tYWpvciwgdWV2ZW50LT5taW5vcik7CiB9CiAKK3N0YXRpYyBjaGFyICoqZ2V0X2NoYXJhY3Rlcl9kZXZpY2Vfc3ltbGlua3Moc3RydWN0IHVldmVudCAqdWV2ZW50KQoreworICAgIGNvbnN0IGNoYXIgKnBhcmVudDsKKyAgICBjaGFyICpzbGFzaDsKKyAgICBjaGFyICoqbGlua3M7CisgICAgaW50IGxpbmtfbnVtID0gMDsKKyAgICBpbnQgd2lkdGg7CisKKyAgICBpZiAoc3RybmNtcCh1ZXZlbnQtPnBhdGgsICIvZGV2aWNlcy9wbGF0Zm9ybS8iLCAxOCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbGlua3MgPSBtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiAyKTsKKyAgICBpZiAoIWxpbmtzKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQobGlua3MsIDAsIHNpemVvZihjaGFyICopICogMik7CisKKyAgICAvKiBza2lwICIvZGV2aWNlcy9wbGF0Zm9ybS88ZHJpdmVyPiIgKi8KKyAgICBwYXJlbnQgPSBzdHJjaHIodWV2ZW50LT5wYXRoICsgMTgsICcvJyk7CisgICAgaWYgKCEqcGFyZW50KQorICAgICAgICBnb3RvIGVycjsKKworICAgIGlmICghc3RybmNtcChwYXJlbnQsICIvdXNiIiwgNCkpIHsKKyAgICAgICAgLyogc2tpcCByb290IGh1YiBuYW1lIGFuZCBkZXZpY2UuIHVzZSBkZXZpY2UgaW50ZXJmYWNlICovCisgICAgICAgIHdoaWxlICgqKytwYXJlbnQgJiYgKnBhcmVudCAhPSAnLycpOworICAgICAgICBpZiAoKnBhcmVudCkKKyAgICAgICAgICAgIHdoaWxlICgqKytwYXJlbnQgJiYgKnBhcmVudCAhPSAnLycpOworICAgICAgICBpZiAoISpwYXJlbnQpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgc2xhc2ggPSBzdHJjaHIoKytwYXJlbnQsICcvJyk7CisgICAgICAgIGlmICghc2xhc2gpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgd2lkdGggPSBzbGFzaCAtIHBhcmVudDsKKyAgICAgICAgaWYgKHdpZHRoIDw9IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICBpZiAoYXNwcmludGYoJmxpbmtzW2xpbmtfbnVtXSwgIi9kZXYvdXNiLyVzJS4qcyIsIHVldmVudC0+c3Vic3lzdGVtLCB3aWR0aCwgcGFyZW50KSA+IDApCisgICAgICAgICAgICBsaW5rX251bSsrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW5rc1tsaW5rX251bV0gPSBOVUxMOworICAgICAgICBta2RpcigiL2Rldi91c2IiLCAwNzU1KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIHJldHVybiBsaW5rczsKK2VycjoKKyAgICBmcmVlKGxpbmtzKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGNoYXIgKipwYXJzZV9wbGF0Zm9ybV9ibG9ja19kZXZpY2Uoc3RydWN0IHVldmVudCAqdWV2ZW50KQogewotICAgIGNvbnN0IGNoYXIgKmRyaXZlcjsKKyAgICBjb25zdCBjaGFyICpkZXZpY2U7CiAgICAgY29uc3QgY2hhciAqcGF0aDsKICAgICBjaGFyICpzbGFzaDsKICAgICBpbnQgd2lkdGg7CkBAIC0zMDAsMTYgKzQyMywxNCBAQAogCiAgICAgLyogRHJvcCAiL2RldmljZXMvcGxhdGZvcm0vIiAqLwogICAgIHBhdGggPSB1ZXZlbnQtPnBhdGg7Ci0gICAgZHJpdmVyID0gcGF0aCArIDE4OwotICAgIHNsYXNoID0gc3RyY2hyKGRyaXZlciwgJy8nKTsKLSAgICBpZiAoIXNsYXNoKQotICAgICAgICBnb3RvIGVycjsKLSAgICB3aWR0aCA9IHNsYXNoIC0gZHJpdmVyOwotICAgIGlmICh3aWR0aCA8PSAwKQorICAgIGRldmljZSA9IHBhdGggKyAxODsKKyAgICBkZXZpY2UgPSBmaW5kX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOworICAgIGlmICghZGV2aWNlKQogICAgICAgICBnb3RvIGVycjsKIAotICAgIHNucHJpbnRmKGxpbmtfcGF0aCwgc2l6ZW9mKGxpbmtfcGF0aCksICIvZGV2L2Jsb2NrL3BsYXRmb3JtLyUuKnMiLAotICAgICAgICAgICAgIHdpZHRoLCBkcml2ZXIpOworICAgIElORk8oImZvdW5kIHBsYXRmb3JtIGRldmljZSAlc1xuIiwgZGV2aWNlKTsKKworICAgIHNucHJpbnRmKGxpbmtfcGF0aCwgc2l6ZW9mKGxpbmtfcGF0aCksICIvZGV2L2Jsb2NrL3BsYXRmb3JtLyVzIiwgZGV2aWNlKTsKIAogICAgIGlmICh1ZXZlbnQtPnBhcnRpdGlvbl9uYW1lKSB7CiAgICAgICAgIHAgPSBzdHJkdXAodWV2ZW50LT5wYXJ0aXRpb25fbmFtZSk7CkBAIC0zNDEsMTAzICs0NjIsMjAgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlX2RldmljZV9ldmVudChzdHJ1Y3QgdWV2ZW50ICp1ZXZlbnQpCitzdGF0aWMgdm9pZCBoYW5kbGVfZGV2aWNlKGNvbnN0IGNoYXIgKmFjdGlvbiwgY29uc3QgY2hhciAqZGV2cGF0aCwKKyAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgaW50IGJsb2NrLCBpbnQgbWFqb3IsIGludCBtaW5vciwgY2hhciAqKmxpbmtzKQogewotICAgIGNoYXIgZGV2cGF0aFs5Nl07Ci0gICAgaW50IGRldnBhdGhfcmVhZHkgPSAwOwotICAgIGNoYXIgKmJhc2UsICpuYW1lOwotICAgIGNoYXIgKipsaW5rcyA9IE5VTEw7Ci0gICAgaW50IGJsb2NrOwogICAgIGludCBpOwogCi0gICAgaWYgKCFzdHJjbXAodWV2ZW50LT5hY3Rpb24sImFkZCIpKQotICAgICAgICBmaXh1cF9zeXNfcGVybXModWV2ZW50LT5wYXRoKTsKLQotICAgICAgICAvKiBpZiBpdCdzIG5vdCBhIC9kZXYgZGV2aWNlLCBub3RoaW5nIGVsc2UgdG8gZG8gKi8KLSAgICBpZigodWV2ZW50LT5tYWpvciA8IDApIHx8ICh1ZXZlbnQtPm1pbm9yIDwgMCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgbmFtZT8gKi8KLSAgICBuYW1lID0gc3RycmNocih1ZXZlbnQtPnBhdGgsICcvJyk7Ci0gICAgaWYoIW5hbWUpCi0gICAgICAgIHJldHVybjsKLSAgICBuYW1lKys7Ci0KLSAgICAgICAgLyogdG9vLWxvbmcgbmFtZXMgd291bGQgb3ZlcnJ1biBvdXIgYnVmZmVyICovCi0gICAgaWYoc3RybGVuKG5hbWUpID4gNjQpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgICAvKiBhcmUgd2UgYmxvY2sgb3IgY2hhcj8gd2hlcmUgc2hvdWxkIHdlIGxpdmU/ICovCi0gICAgaWYoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJibG9jayIsIDUpKSB7Ci0gICAgICAgIGJsb2NrID0gMTsKLSAgICAgICAgYmFzZSA9ICIvZGV2L2Jsb2NrLyI7Ci0gICAgICAgIG1rZGlyKGJhc2UsIDA3NTUpOwotICAgICAgICBpZiAoIXN0cm5jbXAodWV2ZW50LT5wYXRoLCAiL2RldmljZXMvcGxhdGZvcm0vIiwgMTgpKQotICAgICAgICAgICAgbGlua3MgPSBwYXJzZV9wbGF0Zm9ybV9ibG9ja19kZXZpY2UodWV2ZW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICBibG9jayA9IDA7Ci0gICAgICAgICAgICAvKiB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBjb25maWd1cmFibGUgc29tZWhvdyAqLwotICAgICAgICBpZiAoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJ1c2IiLCAzKSkgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJ1c2IiKSkgewotICAgICAgICAgICAgICAgIC8qIFRoaXMgaW1pdGF0ZXMgdGhlIGZpbGUgc3lzdGVtIHRoYXQgd291bGQgYmUgY3JlYXRlZAotICAgICAgICAgICAgICAgICAqIGlmIHdlIHdlcmUgdXNpbmcgZGV2ZnMgaW5zdGVhZC4KLSAgICAgICAgICAgICAgICAgKiBNaW5vcnMgYXJlIGJyb2tlbiB1cCBpbnRvIGdyb3VwcyBvZiAxMjgsIHN0YXJ0aW5nIGF0ICIwMDEiCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaW50IGJ1c19pZCA9IHVldmVudC0+bWlub3IgLyAxMjggKyAxOwotICAgICAgICAgICAgICAgIGludCBkZXZpY2VfaWQgPSB1ZXZlbnQtPm1pbm9yICUgMTI4ICsgMTsKLSAgICAgICAgICAgICAgICAvKiBidWlsZCBkaXJlY3RvcmllcyAqLwotICAgICAgICAgICAgICAgIG1rZGlyKCIvZGV2L2J1cyIsIDA3NTUpOwotICAgICAgICAgICAgICAgIG1rZGlyKCIvZGV2L2J1cy91c2IiLCAwNzU1KTsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihkZXZwYXRoLCBzaXplb2YoZGV2cGF0aCksICIvZGV2L2J1cy91c2IvJTAzZCIsIGJ1c19pZCk7Ci0gICAgICAgICAgICAgICAgbWtkaXIoZGV2cGF0aCwgMDc1NSk7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoZGV2cGF0aCwgc2l6ZW9mKGRldnBhdGgpLCAiL2Rldi9idXMvdXNiLyUwM2QvJTAzZCIsIGJ1c19pZCwgZGV2aWNlX2lkKTsKLSAgICAgICAgICAgICAgICBkZXZwYXRoX3JlYWR5ID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogaWdub3JlIG90aGVyIFVTQiBldmVudHMgKi8KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJncmFwaGljcyIsIDgpKSB7Ci0gICAgICAgICAgICBiYXNlID0gIi9kZXYvZ3JhcGhpY3MvIjsKLSAgICAgICAgICAgIG1rZGlyKGJhc2UsIDA3NTUpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHVldmVudC0+c3Vic3lzdGVtLCAib25jcnBjIiwgNikpIHsKLSAgICAgICAgICAgIGJhc2UgPSAiL2Rldi9vbmNycGMvIjsKLSAgICAgICAgICAgIG1rZGlyKGJhc2UsIDA3NTUpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHVldmVudC0+c3Vic3lzdGVtLCAiYWRzcCIsIDQpKSB7Ci0gICAgICAgICAgICBiYXNlID0gIi9kZXYvYWRzcC8iOwotICAgICAgICAgICAgbWtkaXIoYmFzZSwgMDc1NSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJtc21fY2FtZXJhIiwgMTApKSB7Ci0gICAgICAgICAgICBiYXNlID0gIi9kZXYvbXNtX2NhbWVyYS8iOwotICAgICAgICAgICAgbWtkaXIoYmFzZSwgMDc1NSk7Ci0gICAgICAgIH0gZWxzZSBpZighc3RybmNtcCh1ZXZlbnQtPnN1YnN5c3RlbSwgImlucHV0IiwgNSkpIHsKLSAgICAgICAgICAgIGJhc2UgPSAiL2Rldi9pbnB1dC8iOwotICAgICAgICAgICAgbWtkaXIoYmFzZSwgMDc1NSk7Ci0gICAgICAgIH0gZWxzZSBpZighc3RybmNtcCh1ZXZlbnQtPnN1YnN5c3RlbSwgIm10ZCIsIDMpKSB7Ci0gICAgICAgICAgICBiYXNlID0gIi9kZXYvbXRkLyI7Ci0gICAgICAgICAgICBta2RpcihiYXNlLCAwNzU1KTsKLSAgICAgICAgfSBlbHNlIGlmKCFzdHJuY21wKHVldmVudC0+c3Vic3lzdGVtLCAic291bmQiLCA1KSkgewotICAgICAgICAgICAgYmFzZSA9ICIvZGV2L3NuZC8iOwotICAgICAgICAgICAgbWtkaXIoYmFzZSwgMDc1NSk7Ci0gICAgICAgIH0gZWxzZSBpZighc3RybmNtcCh1ZXZlbnQtPnN1YnN5c3RlbSwgIm1pc2MiLCA0KSAmJgotICAgICAgICAgICAgICAgICAgICAhc3RybmNtcChuYW1lLCAibG9nXyIsIDQpKSB7Ci0gICAgICAgICAgICBiYXNlID0gIi9kZXYvbG9nLyI7Ci0gICAgICAgICAgICBta2RpcihiYXNlLCAwNzU1KTsKLSAgICAgICAgICAgIG5hbWUgKz0gNDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBiYXNlID0gIi9kZXYvIjsKLSAgICB9Ci0KLSAgICBpZiAoIWRldnBhdGhfcmVhZHkpCi0gICAgICAgIHNucHJpbnRmKGRldnBhdGgsIHNpemVvZihkZXZwYXRoKSwgIiVzJXMiLCBiYXNlLCBuYW1lKTsKLQotICAgIGlmKCFzdHJjbXAodWV2ZW50LT5hY3Rpb24sICJhZGQiKSkgewotICAgICAgICBtYWtlX2RldmljZShkZXZwYXRoLCB1ZXZlbnQtPnBhdGgsIGJsb2NrLCB1ZXZlbnQtPm1ham9yLCB1ZXZlbnQtPm1pbm9yKTsKKyAgICBpZighc3RyY21wKGFjdGlvbiwgImFkZCIpKSB7CisgICAgICAgIG1ha2VfZGV2aWNlKGRldnBhdGgsIHBhdGgsIGJsb2NrLCBtYWpvciwgbWlub3IpOwogICAgICAgICBpZiAobGlua3MpIHsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGxpbmtzW2ldOyBpKyspCiAgICAgICAgICAgICAgICAgbWFrZV9saW5rKGRldnBhdGgsIGxpbmtzW2ldKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmKCFzdHJjbXAodWV2ZW50LT5hY3Rpb24sICJyZW1vdmUiKSkgeworICAgIGlmKCFzdHJjbXAoYWN0aW9uLCAicmVtb3ZlIikpIHsKICAgICAgICAgaWYgKGxpbmtzKSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBsaW5rc1tpXTsgaSsrKQogICAgICAgICAgICAgICAgIHJlbW92ZV9saW5rKGRldnBhdGgsIGxpbmtzW2ldKTsKQEAgLTQ1Miw2ICs0OTAsMTM4IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBoYW5kbGVfcGxhdGZvcm1fZGV2aWNlX2V2ZW50KHN0cnVjdCB1ZXZlbnQgKnVldmVudCkKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lID0gdWV2ZW50LT5wYXRoICsgMTg7IC8qIGxlbmd0aCBvZiAvZGV2aWNlcy9wbGF0Zm9ybS8gKi8KKworICAgIGlmICghc3RyY21wKHVldmVudC0+YWN0aW9uLCAiYWRkIikpCisgICAgICAgIGFkZF9wbGF0Zm9ybV9kZXZpY2UobmFtZSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcCh1ZXZlbnQtPmFjdGlvbiwgInJlbW92ZSIpKQorICAgICAgICByZW1vdmVfcGxhdGZvcm1fZGV2aWNlKG5hbWUpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGFyc2VfZGV2aWNlX25hbWUoc3RydWN0IHVldmVudCAqdWV2ZW50LCB1bnNpZ25lZCBpbnQgbGVuKQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAvKiBpZiBpdCdzIG5vdCBhIC9kZXYgZGV2aWNlLCBub3RoaW5nIGVsc2UgdG8gZG8gKi8KKyAgICBpZigodWV2ZW50LT5tYWpvciA8IDApIHx8ICh1ZXZlbnQtPm1pbm9yIDwgMCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogZG8gd2UgaGF2ZSBhIG5hbWU/ICovCisgICAgbmFtZSA9IHN0cnJjaHIodWV2ZW50LT5wYXRoLCAnLycpOworICAgIGlmKCFuYW1lKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lKys7CisKKyAgICAvKiB0b28tbG9uZyBuYW1lcyB3b3VsZCBvdmVycnVuIG91ciBidWZmZXIgKi8KKyAgICBpZihzdHJsZW4obmFtZSkgPiBsZW4pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9ibG9ja19kZXZpY2VfZXZlbnQoc3RydWN0IHVldmVudCAqdWV2ZW50KQoreworICAgIGNvbnN0IGNoYXIgKmJhc2UgPSAiL2Rldi9ibG9jay8iOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY2hhciBkZXZwYXRoWzk2XTsKKyAgICBjaGFyICoqbGlua3MgPSBOVUxMOworCisgICAgbmFtZSA9IHBhcnNlX2RldmljZV9uYW1lKHVldmVudCwgNjQpOworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc25wcmludGYoZGV2cGF0aCwgc2l6ZW9mKGRldnBhdGgpLCAiJXMlcyIsIGJhc2UsIG5hbWUpOworICAgIG1rZGlyKGJhc2UsIDA3NTUpOworCisgICAgaWYgKCFzdHJuY21wKHVldmVudC0+cGF0aCwgIi9kZXZpY2VzL3BsYXRmb3JtLyIsIDE4KSkKKyAgICAgICAgbGlua3MgPSBwYXJzZV9wbGF0Zm9ybV9ibG9ja19kZXZpY2UodWV2ZW50KTsKKworICAgIGhhbmRsZV9kZXZpY2UodWV2ZW50LT5hY3Rpb24sIGRldnBhdGgsIHVldmVudC0+cGF0aCwgMSwKKyAgICAgICAgICAgIHVldmVudC0+bWFqb3IsIHVldmVudC0+bWlub3IsIGxpbmtzKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2dlbmVyaWNfZGV2aWNlX2V2ZW50KHN0cnVjdCB1ZXZlbnQgKnVldmVudCkKK3sKKyAgICBjaGFyICpiYXNlOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY2hhciBkZXZwYXRoWzk2XSA9IHswfTsKKyAgICBjaGFyICoqbGlua3MgPSBOVUxMOworCisgICAgbmFtZSA9IHBhcnNlX2RldmljZV9uYW1lKHVldmVudCwgNjQpOworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFzdHJuY21wKHVldmVudC0+c3Vic3lzdGVtLCAidXNiIiwgMykpIHsKKyAgICAgICAgIGlmICghc3RyY21wKHVldmVudC0+c3Vic3lzdGVtLCAidXNiIikpIHsKKyAgICAgICAgICAgICAvKiBUaGlzIGltaXRhdGVzIHRoZSBmaWxlIHN5c3RlbSB0aGF0IHdvdWxkIGJlIGNyZWF0ZWQKKyAgICAgICAgICAgICAgKiBpZiB3ZSB3ZXJlIHVzaW5nIGRldmZzIGluc3RlYWQuCisgICAgICAgICAgICAgICogTWlub3JzIGFyZSBicm9rZW4gdXAgaW50byBncm91cHMgb2YgMTI4LCBzdGFydGluZyBhdCAiMDAxIgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIGludCBidXNfaWQgPSB1ZXZlbnQtPm1pbm9yIC8gMTI4ICsgMTsKKyAgICAgICAgICAgICBpbnQgZGV2aWNlX2lkID0gdWV2ZW50LT5taW5vciAlIDEyOCArIDE7CisgICAgICAgICAgICAgLyogYnVpbGQgZGlyZWN0b3JpZXMgKi8KKyAgICAgICAgICAgICBta2RpcigiL2Rldi9idXMiLCAwNzU1KTsKKyAgICAgICAgICAgICBta2RpcigiL2Rldi9idXMvdXNiIiwgMDc1NSk7CisgICAgICAgICAgICAgc25wcmludGYoZGV2cGF0aCwgc2l6ZW9mKGRldnBhdGgpLCAiL2Rldi9idXMvdXNiLyUwM2QiLCBidXNfaWQpOworICAgICAgICAgICAgIG1rZGlyKGRldnBhdGgsIDA3NTUpOworICAgICAgICAgICAgIHNucHJpbnRmKGRldnBhdGgsIHNpemVvZihkZXZwYXRoKSwgIi9kZXYvYnVzL3VzYi8lMDNkLyUwM2QiLCBidXNfaWQsIGRldmljZV9pZCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIC8qIGlnbm9yZSBvdGhlciBVU0IgZXZlbnRzICovCisgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHVldmVudC0+c3Vic3lzdGVtLCAiZ3JhcGhpY3MiLCA4KSkgeworICAgICAgICAgYmFzZSA9ICIvZGV2L2dyYXBoaWNzLyI7CisgICAgICAgICBta2RpcihiYXNlLCAwNzU1KTsKKyAgICAgfSBlbHNlIGlmICghc3RybmNtcCh1ZXZlbnQtPnN1YnN5c3RlbSwgIm9uY3JwYyIsIDYpKSB7CisgICAgICAgICBiYXNlID0gIi9kZXYvb25jcnBjLyI7CisgICAgICAgICBta2RpcihiYXNlLCAwNzU1KTsKKyAgICAgfSBlbHNlIGlmICghc3RybmNtcCh1ZXZlbnQtPnN1YnN5c3RlbSwgImFkc3AiLCA0KSkgeworICAgICAgICAgYmFzZSA9ICIvZGV2L2Fkc3AvIjsKKyAgICAgICAgIG1rZGlyKGJhc2UsIDA3NTUpOworICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHVldmVudC0+c3Vic3lzdGVtLCAibXNtX2NhbWVyYSIsIDEwKSkgeworICAgICAgICAgYmFzZSA9ICIvZGV2L21zbV9jYW1lcmEvIjsKKyAgICAgICAgIG1rZGlyKGJhc2UsIDA3NTUpOworICAgICB9IGVsc2UgaWYoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJpbnB1dCIsIDUpKSB7CisgICAgICAgICBiYXNlID0gIi9kZXYvaW5wdXQvIjsKKyAgICAgICAgIG1rZGlyKGJhc2UsIDA3NTUpOworICAgICB9IGVsc2UgaWYoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJtdGQiLCAzKSkgeworICAgICAgICAgYmFzZSA9ICIvZGV2L210ZC8iOworICAgICAgICAgbWtkaXIoYmFzZSwgMDc1NSk7CisgICAgIH0gZWxzZSBpZighc3RybmNtcCh1ZXZlbnQtPnN1YnN5c3RlbSwgInNvdW5kIiwgNSkpIHsKKyAgICAgICAgIGJhc2UgPSAiL2Rldi9zbmQvIjsKKyAgICAgICAgIG1rZGlyKGJhc2UsIDA3NTUpOworICAgICB9IGVsc2UgaWYoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJtaXNjIiwgNCkgJiYKKyAgICAgICAgICAgICAgICAgIXN0cm5jbXAobmFtZSwgImxvZ18iLCA0KSkgeworICAgICAgICAgYmFzZSA9ICIvZGV2L2xvZy8iOworICAgICAgICAgbWtkaXIoYmFzZSwgMDc1NSk7CisgICAgICAgICBuYW1lICs9IDQ7CisgICAgIH0gZWxzZQorICAgICAgICAgYmFzZSA9ICIvZGV2LyI7CisgICAgIGxpbmtzID0gZ2V0X2NoYXJhY3Rlcl9kZXZpY2Vfc3ltbGlua3ModWV2ZW50KTsKKworICAgICBpZiAoIWRldnBhdGhbMF0pCisgICAgICAgICBzbnByaW50ZihkZXZwYXRoLCBzaXplb2YoZGV2cGF0aCksICIlcyVzIiwgYmFzZSwgbmFtZSk7CisKKyAgICAgaGFuZGxlX2RldmljZSh1ZXZlbnQtPmFjdGlvbiwgZGV2cGF0aCwgdWV2ZW50LT5wYXRoLCAwLAorICAgICAgICAgICAgIHVldmVudC0+bWFqb3IsIHVldmVudC0+bWlub3IsIGxpbmtzKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2RldmljZV9ldmVudChzdHJ1Y3QgdWV2ZW50ICp1ZXZlbnQpCit7CisgICAgaWYgKCFzdHJjbXAodWV2ZW50LT5hY3Rpb24sImFkZCIpKQorICAgICAgICBmaXh1cF9zeXNfcGVybXModWV2ZW50LT5wYXRoKTsKKworICAgIGlmICghc3RybmNtcCh1ZXZlbnQtPnN1YnN5c3RlbSwgImJsb2NrIiwgNSkpIHsKKyAgICAgICAgaGFuZGxlX2Jsb2NrX2RldmljZV9ldmVudCh1ZXZlbnQpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAodWV2ZW50LT5zdWJzeXN0ZW0sICJwbGF0Zm9ybSIsIDgpKSB7CisgICAgICAgIGhhbmRsZV9wbGF0Zm9ybV9kZXZpY2VfZXZlbnQodWV2ZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoYW5kbGVfZ2VuZXJpY19kZXZpY2VfZXZlbnQodWV2ZW50KTsKKyAgICB9Cit9CisKIHN0YXRpYyBpbnQgbG9hZF9maXJtd2FyZShpbnQgZndfZmQsIGludCBsb2FkaW5nX2ZkLCBpbnQgZGF0YV9mZCkKIHsKICAgICBzdHJ1Y3Qgc3RhdCBzdDsKQEAgLTQ5OCwxMyArNjY4LDE5IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBpc19ib290aW5nKHZvaWQpCit7CisgICAgcmV0dXJuIGFjY2VzcygiL2Rldi8uYm9vdGluZyIsIEZfT0spID09IDA7Cit9CisKIHN0YXRpYyB2b2lkIHByb2Nlc3NfZmlybXdhcmVfZXZlbnQoc3RydWN0IHVldmVudCAqdWV2ZW50KQogewogICAgIGNoYXIgKnJvb3QsICpsb2FkaW5nLCAqZGF0YSwgKmZpbGUxID0gTlVMTCwgKmZpbGUyID0gTlVMTDsKICAgICBpbnQgbCwgbG9hZGluZ19mZCwgZGF0YV9mZCwgZndfZmQ7CisgICAgaW50IGJvb3RpbmcgPSBpc19ib290aW5nKCk7CiAKLSAgICBsb2dfZXZlbnRfcHJpbnQoImZpcm13YXJlIGV2ZW50IHsgJyVzJywgJyVzJyB9XG4iLAotICAgICAgICAgICAgICAgICAgICB1ZXZlbnQtPnBhdGgsIHVldmVudC0+ZmlybXdhcmUpOworICAgIElORk8oImZpcm13YXJlOiBsb2FkaW5nICclcycgZm9yICclcydcbiIsCisgICAgICAgICB1ZXZlbnQtPmZpcm13YXJlLCB1ZXZlbnQtPnBhdGgpOwogCiAgICAgbCA9IGFzcHJpbnRmKCZyb290LCBTWVNGU19QUkVGSVgiJXMvIiwgdWV2ZW50LT5wYXRoKTsKICAgICBpZiAobCA9PSAtMSkKQEAgLTUzNCwxNyArNzEwLDI5IEBACiAgICAgaWYoZGF0YV9mZCA8IDApCiAgICAgICAgIGdvdG8gbG9hZGluZ19jbG9zZV9vdXQ7CiAKK3RyeV9sb2FkaW5nX2FnYWluOgogICAgIGZ3X2ZkID0gb3BlbihmaWxlMSwgT19SRE9OTFkpOwogICAgIGlmKGZ3X2ZkIDwgMCkgewogICAgICAgICBmd19mZCA9IG9wZW4oZmlsZTIsIE9fUkRPTkxZKTsKLSAgICAgICAgaWYoZndfZmQgPCAwKQorICAgICAgICBpZiAoZndfZmQgPCAwKSB7CisgICAgICAgICAgICBpZiAoYm9vdGluZykgeworICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSdyZSBub3QgZnVsbHkgYm9vdGVkLCB3ZSBtYXkgYmUgbWlzc2luZworICAgICAgICAgICAgICAgICAgICAgKiBmaWxlc3lzdGVtcyBuZWVkZWQgZm9yIGZpcm13YXJlLCB3YWl0IGFuZCByZXRyeS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7CisgICAgICAgICAgICAgICAgYm9vdGluZyA9IGlzX2Jvb3RpbmcoKTsKKyAgICAgICAgICAgICAgICBnb3RvIHRyeV9sb2FkaW5nX2FnYWluOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSU5GTygiZmlybXdhcmU6IGNvdWxkIG5vdCBvcGVuICclcycgJWRcbiIsIHVldmVudC0+ZmlybXdhcmUsIGVycm5vKTsKKyAgICAgICAgICAgIHdyaXRlKGxvYWRpbmdfZmQsICItMSIsIDIpOwogICAgICAgICAgICAgZ290byBkYXRhX2Nsb3NlX291dDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmKCFsb2FkX2Zpcm13YXJlKGZ3X2ZkLCBsb2FkaW5nX2ZkLCBkYXRhX2ZkKSkKLSAgICAgICAgbG9nX2V2ZW50X3ByaW50KCJmaXJtd2FyZSBjb3B5IHN1Y2Nlc3MgeyAnJXMnLCAnJXMnIH1cbiIsIHJvb3QsIHVldmVudC0+ZmlybXdhcmUpOworICAgICAgICBJTkZPKCJmaXJtd2FyZTogY29weSBzdWNjZXNzIHsgJyVzJywgJyVzJyB9XG4iLCByb290LCB1ZXZlbnQtPmZpcm13YXJlKTsKICAgICBlbHNlCi0gICAgICAgIGxvZ19ldmVudF9wcmludCgiZmlybXdhcmUgY29weSBmYWlsdXJlIHsgJyVzJywgJyVzJyB9XG4iLCByb290LCB1ZXZlbnQtPmZpcm13YXJlKTsKKyAgICAgICAgSU5GTygiZmlybXdhcmU6IGNvcHkgZmFpbHVyZSB7ICclcycsICclcycgfVxuIiwgcm9vdCwgdWV2ZW50LT5maXJtd2FyZSk7CiAKICAgICBjbG9zZShmd19mZCk7CiBkYXRhX2Nsb3NlX291dDoKQEAgLTU2NSw3ICs3NTMsNiBAQAogc3RhdGljIHZvaWQgaGFuZGxlX2Zpcm13YXJlX2V2ZW50KHN0cnVjdCB1ZXZlbnQgKnVldmVudCkKIHsKICAgICBwaWRfdCBwaWQ7Ci0gICAgaW50IHN0YXR1czsKICAgICBpbnQgcmV0OwogCiAgICAgaWYoc3RyY21wKHVldmVudC0+c3Vic3lzdGVtLCAiZmlybXdhcmUiKSkKQEAgLTU3OSw0NSArNzY2LDE1IEBACiAgICAgaWYgKCFwaWQpIHsKICAgICAgICAgcHJvY2Vzc19maXJtd2FyZV9ldmVudCh1ZXZlbnQpOwogICAgICAgICBleGl0KEVYSVRfU1VDQ0VTUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmV0ID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOwotICAgICAgICB9IHdoaWxlIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwogICAgIH0KIH0KIAogI2RlZmluZSBVRVZFTlRfTVNHX0xFTiAgMTAyNAogdm9pZCBoYW5kbGVfZGV2aWNlX2ZkKCkKIHsKLSAgICBmb3IoOzspIHsKLSAgICAgICAgY2hhciBtc2dbVUVWRU5UX01TR19MRU4rMl07Ci0gICAgICAgIGNoYXIgY3JlZF9tc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHVjcmVkKSldOwotICAgICAgICBzdHJ1Y3QgaW92ZWMgaW92ID0ge21zZywgc2l6ZW9mKG1zZyl9OwotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgc25sOwotICAgICAgICBzdHJ1Y3QgbXNnaGRyIGhkciA9IHsmc25sLCBzaXplb2Yoc25sKSwgJmlvdiwgMSwgY3JlZF9tc2csIHNpemVvZihjcmVkX21zZyksIDB9OwotCi0gICAgICAgIHNzaXplX3QgbiA9IHJlY3Ztc2coZGV2aWNlX2ZkLCAmaGRyLCAwKTsKLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHNubC5ubF9ncm91cHMgIT0gMSkgfHwgKHNubC5ubF9waWQgIT0gMCkpIHsKLSAgICAgICAgICAgIC8qIGlnbm9yaW5nIG5vbi1rZXJuZWwgbmV0bGluayBtdWx0aWNhc3QgbWVzc2FnZSAqLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJ1Y3QgY21zZ2hkciAqIGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZoZHIpOwotICAgICAgICBpZiAoY21zZyA9PSBOVUxMIHx8IGNtc2ctPmNtc2dfdHlwZSAhPSBTQ01fQ1JFREVOVElBTFMpIHsKLSAgICAgICAgICAgIC8qIG5vIHNlbmRlciBjcmVkZW50aWFscyByZWNlaXZlZCwgaWdub3JlIG1lc3NhZ2UgKi8KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RydWN0IHVjcmVkICogY3JlZCA9IChzdHJ1Y3QgdWNyZWQgKilDTVNHX0RBVEEoY21zZyk7Ci0gICAgICAgIGlmIChjcmVkLT51aWQgIT0gMCkgewotICAgICAgICAgICAgLyogbWVzc2FnZSBmcm9tIG5vbi1yb290IHVzZXIsIGlnbm9yZSAqLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQorICAgIGNoYXIgbXNnW1VFVkVOVF9NU0dfTEVOKzJdOworICAgIGludCBuOworICAgIHdoaWxlICgobiA9IHVldmVudF9jaGVja2VkX3JlY3YoZGV2aWNlX2ZkLCBtc2csIFVFVkVOVF9NU0dfTEVOKSkgPiAwKSB7CiAgICAgICAgIGlmKG4gPj0gVUVWRU5UX01TR19MRU4pICAgLyogb3ZlcmZsb3cgLS0gZGlzY2FyZCAqLwogICAgICAgICAgICAgY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2luaXQvaW5pdC5jIGIvaW5pdC9pbml0LmMKaW5kZXggNzVmZmI1Yy4uMWUzMWNmOSAxMDA3NTUKLS0tIGEvaW5pdC9pbml0LmMKKysrIGIvaW5pdC9pbml0LmMKQEAgLTE1MCwxMSArMTUwLDExIEBACiAgICAgaW50IG5lZWRzX2NvbnNvbGU7CiAgICAgaW50IG47CiAKLSAgICAgICAgLyogc3RhcnRpbmcgYSBzZXJ2aWNlIHJlbW92ZXMgaXQgZnJvbSB0aGUgZGlzYWJsZWQKKyAgICAgICAgLyogc3RhcnRpbmcgYSBzZXJ2aWNlIHJlbW92ZXMgaXQgZnJvbSB0aGUgZGlzYWJsZWQgb3IgcmVzZXQKICAgICAgICAgICogc3RhdGUgYW5kIGltbWVkaWF0ZWx5IHRha2VzIGl0IG91dCBvZiB0aGUgcmVzdGFydGluZwogICAgICAgICAgKiBzdGF0ZSBpZiBpdCB3YXMgaW4gdGhlcmUKICAgICAgICAgICovCi0gICAgc3ZjLT5mbGFncyAmPSAofihTVkNfRElTQUJMRUR8U1ZDX1JFU1RBUlRJTkcpKTsKKyAgICBzdmMtPmZsYWdzICY9ICh+KFNWQ19ESVNBQkxFRHxTVkNfUkVTVEFSVElOR3xTVkNfUkVTRVQpKTsKICAgICBzdmMtPnRpbWVfc3RhcnRlZCA9IDA7CiAgICAgCiAgICAgICAgIC8qIHJ1bm5pbmcgcHJvY2Vzc2VzIHJlcXVpcmUgbm8gYWRkaXRpb25hbCB3b3JrIC0tIGlmCkBAIC0yNDMsMTMgKzI0MywyMiBAQAogCiAgICAgLyogYXMgcmVxdWVzdGVkLCBzZXQgb3VyIGdpZCwgc3VwcGxlbWVudGFsIGdpZHMsIGFuZCB1aWQgKi8KICAgICAgICAgaWYgKHN2Yy0+Z2lkKSB7Ci0gICAgICAgICAgICBzZXRnaWQoc3ZjLT5naWQpOworICAgICAgICAgICAgaWYgKHNldGdpZChzdmMtPmdpZCkgIT0gMCkgeworICAgICAgICAgICAgICAgIEVSUk9SKCJzZXRnaWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBfZXhpdCgxMjcpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdmMtPm5yX3N1cHBfZ2lkcykgewotICAgICAgICAgICAgc2V0Z3JvdXBzKHN2Yy0+bnJfc3VwcF9naWRzLCBzdmMtPnN1cHBfZ2lkcyk7CisgICAgICAgICAgICBpZiAoc2V0Z3JvdXBzKHN2Yy0+bnJfc3VwcF9naWRzLCBzdmMtPnN1cHBfZ2lkcykgIT0gMCkgeworICAgICAgICAgICAgICAgIEVSUk9SKCJzZXRncm91cHMgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBfZXhpdCgxMjcpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdmMtPnVpZCkgewotICAgICAgICAgICAgc2V0dWlkKHN2Yy0+dWlkKTsKKyAgICAgICAgICAgIGlmIChzZXR1aWQoc3ZjLT51aWQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBFUlJPUigic2V0dWlkIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgX2V4aXQoMTI3KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmICghZHluYW1pY19hcmdzKSB7CkBAIC0yOTEsMjcgKzMwMCw0MiBAQAogICAgICAgICBub3RpZnlfc2VydmljZV9zdGF0ZShzdmMtPm5hbWUsICJydW5uaW5nIik7CiB9CiAKLXZvaWQgc2VydmljZV9zdG9wKHN0cnVjdCBzZXJ2aWNlICpzdmMpCisvKiBUaGUgaG93IGZpZWxkIHNob3VsZCBiZSBlaXRoZXIgU1ZDX0RJU0FCTEVEIG9yIFNWQ19SRVNFVCAqLworc3RhdGljIHZvaWQgc2VydmljZV9zdG9wX29yX3Jlc2V0KHN0cnVjdCBzZXJ2aWNlICpzdmMsIGludCBob3cpCiB7CiAgICAgICAgIC8qIHdlIGFyZSBubyBsb25nZXIgcnVubmluZywgbm9yIHNob3VsZCB3ZQogICAgICAgICAgKiBhdHRlbXB0IHRvIHJlc3RhcnQKICAgICAgICAgICovCiAgICAgc3ZjLT5mbGFncyAmPSAofihTVkNfUlVOTklOR3xTVkNfUkVTVEFSVElORykpOwogCisgICAgaWYgKChob3cgIT0gU1ZDX0RJU0FCTEVEKSAmJiAoaG93ICE9IFNWQ19SRVNFVCkpIHsKKyAgICAgICAgLyogSHJtLCBhbiBpbGxlZ2FsIGZsYWcuICBEZWZhdWx0IHRvIFNWQ19ESVNBQkxFRCAqLworICAgICAgICBob3cgPSBTVkNfRElTQUJMRUQ7CisgICAgfQogICAgICAgICAvKiBpZiB0aGUgc2VydmljZSBoYXMgbm90IHlldCBzdGFydGVkLCBwcmV2ZW50CiAgICAgICAgICAqIGl0IGZyb20gYXV0by1zdGFydGluZyB3aXRoIGl0cyBjbGFzcwogICAgICAgICAgKi8KLSAgICBzdmMtPmZsYWdzIHw9IFNWQ19ESVNBQkxFRDsKKyAgICBzdmMtPmZsYWdzIHw9IGhvdzsKIAogICAgIGlmIChzdmMtPnBpZCkgewogICAgICAgICBOT1RJQ0UoInNlcnZpY2UgJyVzJyBpcyBiZWluZyBraWxsZWRcbiIsIHN2Yy0+bmFtZSk7Ci0gICAgICAgIGtpbGwoLXN2Yy0+cGlkLCBTSUdURVJNKTsKKyAgICAgICAga2lsbCgtc3ZjLT5waWQsIFNJR0tJTEwpOwogICAgICAgICBub3RpZnlfc2VydmljZV9zdGF0ZShzdmMtPm5hbWUsICJzdG9wcGluZyIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG5vdGlmeV9zZXJ2aWNlX3N0YXRlKHN2Yy0+bmFtZSwgInN0b3BwZWQiKTsKICAgICB9CiB9CiAKK3ZvaWQgc2VydmljZV9yZXNldChzdHJ1Y3Qgc2VydmljZSAqc3ZjKQoreworICAgIHNlcnZpY2Vfc3RvcF9vcl9yZXNldChzdmMsIFNWQ19SRVNFVCk7Cit9CisKK3ZvaWQgc2VydmljZV9zdG9wKHN0cnVjdCBzZXJ2aWNlICpzdmMpCit7CisgICAgc2VydmljZV9zdG9wX29yX3Jlc2V0KHN2YywgU1ZDX0RJU0FCTEVEKTsKK30KKwogdm9pZCBwcm9wZXJ0eV9jaGFuZ2VkKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQogewogICAgIGlmIChwcm9wZXJ0eV90cmlnZ2Vyc19lbmFibGVkKQpAQCAtMzg0LDYgKzQwOCw5IEBACiAgICAgICAgIG1zZ19zdGFydChhcmcpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChtc2csInN0b3AiKSkgewogICAgICAgICBtc2dfc3RvcChhcmcpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChtc2csInJlc3RhcnQiKSkgeworICAgICAgICBtc2dfc3RvcChhcmcpOworICAgICAgICBtc2dfc3RhcnQoYXJnKTsKICAgICB9IGVsc2UgewogICAgICAgICBFUlJPUigidW5rbm93biBjb250cm9sIG1zZyAnJXMnXG4iLCBtc2cpOwogICAgIH0KQEAgLTYyNCw2ICs2NTEsMTAgQEAKICAgICAgICAgRVJST1IoImluaXQgc3RhcnR1cCBmYWlsdXJlXG4iKTsKICAgICAgICAgZXhpdCgxKTsKICAgICB9CisKKyAgICAgICAgLyogc2lnbmFsIHRoYXQgd2UgaGl0IHRoaXMgcG9pbnQgKi8KKyAgICB1bmxpbmsoIi9kZXYvLmJvb3RpbmciKTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC02NzQsMTMgKzcwNSwxNiBAQAogICAgIG1rZGlyKCIvcHJvYyIsIDA3NTUpOwogICAgIG1rZGlyKCIvc3lzIiwgMDc1NSk7CiAKLSAgICBtb3VudCgidG1wZnMiLCAiL2RldiIsICJ0bXBmcyIsIDAsICJtb2RlPTA3NTUiKTsKKyAgICBtb3VudCgidG1wZnMiLCAiL2RldiIsICJ0bXBmcyIsIE1TX05PU1VJRCwgIm1vZGU9MDc1NSIpOwogICAgIG1rZGlyKCIvZGV2L3B0cyIsIDA3NTUpOwogICAgIG1rZGlyKCIvZGV2L3NvY2tldCIsIDA3NTUpOwogICAgIG1vdW50KCJkZXZwdHMiLCAiL2Rldi9wdHMiLCAiZGV2cHRzIiwgMCwgTlVMTCk7CiAgICAgbW91bnQoInByb2MiLCAiL3Byb2MiLCAicHJvYyIsIDAsIE5VTEwpOwogICAgIG1vdW50KCJzeXNmcyIsICIvc3lzIiwgInN5c2ZzIiwgMCwgTlVMTCk7CiAKKyAgICAgICAgLyogaW5kaWNhdGUgdGhhdCBib290aW5nIGlzIGluIHByb2dyZXNzIHRvIGJhY2tncm91bmQgZncgbG9hZGVycywgZXRjICovCisgICAgY2xvc2Uob3BlbigiL2Rldi8uYm9vdGluZyIsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDAwMCkpOworCiAgICAgICAgIC8qIFdlIG11c3QgaGF2ZSBzb21lIHBsYWNlIG90aGVyIHRoYW4gLyB0byBjcmVhdGUgdGhlCiAgICAgICAgICAqIGRldmljZSBub2RlcyBmb3Iga21zZyBhbmQgbnVsbCwgb3RoZXJ3aXNlIHdlIHdvbid0CiAgICAgICAgICAqIGJlIGFibGUgdG8gcmVtb3VudCAvIHJlYWQtb25seSBsYXRlciBvbi4KQEAgLTcxMyw2ICs3NDcsNyBAQAogICAgIGFjdGlvbl9mb3JfZWFjaF90cmlnZ2VyKCJlYXJseS1mcyIsIGFjdGlvbl9hZGRfcXVldWVfdGFpbCk7CiAgICAgYWN0aW9uX2Zvcl9lYWNoX3RyaWdnZXIoImZzIiwgYWN0aW9uX2FkZF9xdWV1ZV90YWlsKTsKICAgICBhY3Rpb25fZm9yX2VhY2hfdHJpZ2dlcigicG9zdC1mcyIsIGFjdGlvbl9hZGRfcXVldWVfdGFpbCk7CisgICAgYWN0aW9uX2Zvcl9lYWNoX3RyaWdnZXIoInBvc3QtZnMtZGF0YSIsIGFjdGlvbl9hZGRfcXVldWVfdGFpbCk7CiAKICAgICBxdWV1ZV9idWlsdGluX2FjdGlvbihwcm9wZXJ0eV9zZXJ2aWNlX2luaXRfYWN0aW9uLCAicHJvcGVydHlfc2VydmljZV9pbml0Iik7CiAgICAgcXVldWVfYnVpbHRpbl9hY3Rpb24oc2lnbmFsX2luaXRfYWN0aW9uLCAic2lnbmFsX2luaXQiKTsKZGlmZiAtLWdpdCBhL2luaXQvaW5pdC5oIGIvaW5pdC9pbml0LmgKaW5kZXggODY5MTMzNS4uMDVjZGZhYSAxMDA2NDQKLS0tIGEvaW5pdC9pbml0LmgKKysrIGIvaW5pdC9pbml0LmgKQEAgLTY5LDYgKzY5LDggQEAKICNkZWZpbmUgU1ZDX1JFU1RBUlRJTkcgIDB4MDggIC8qIHdhaXRpbmcgdG8gcmVzdGFydCAqLwogI2RlZmluZSBTVkNfQ09OU09MRSAgICAgMHgxMCAgLyogcmVxdWlyZXMgY29uc29sZSAqLwogI2RlZmluZSBTVkNfQ1JJVElDQUwgICAgMHgyMCAgLyogd2lsbCByZWJvb3QgaW50byByZWNvdmVyeSBpZiBrZWVwcyBjcmFzaGluZyAqLworI2RlZmluZSBTVkNfUkVTRVQgICAgICAgMHg0MCAgLyogVXNlIHdoZW4gc3RvcHBpbmcgYSBwcm9jZXNzLCBidXQgbm90IGRpc2FibGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gaXQgY2FuIGJlIHJlc3RhcnRlZCB3aXRoIGl0cyBjbGFzcyAqLwogCiAjZGVmaW5lIE5SX1NWQ19TVVBQX0dJRFMgMTIgICAgLyogdHdlbHZlIHN1cHBsZW1lbnRhcnkgZ3JvdXBzICovCiAKQEAgLTEyMSw2ICsxMjMsNyBAQAogdm9pZCBzZXJ2aWNlX2Zvcl9lYWNoX2ZsYWdzKHVuc2lnbmVkIG1hdGNoZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZ1bmMpKHN0cnVjdCBzZXJ2aWNlICpzdmMpKTsKIHZvaWQgc2VydmljZV9zdG9wKHN0cnVjdCBzZXJ2aWNlICpzdmMpOwordm9pZCBzZXJ2aWNlX3Jlc2V0KHN0cnVjdCBzZXJ2aWNlICpzdmMpOwogdm9pZCBzZXJ2aWNlX3N0YXJ0KHN0cnVjdCBzZXJ2aWNlICpzdmMsIGNvbnN0IGNoYXIgKmR5bmFtaWNfYXJncyk7CiB2b2lkIHByb3BlcnR5X2NoYW5nZWQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwogCmRpZmYgLS1naXQgYS9pbml0L2luaXRfcGFyc2VyLmMgYi9pbml0L2luaXRfcGFyc2VyLmMKaW5kZXggZDEzNmMyOC4uZThlNjVhYyAxMDA2NDQKLS0tIGEvaW5pdC9pbml0X3BhcnNlci5jCisrKyBiL2luaXQvaW5pdF9wYXJzZXIuYwpAQCAtODIsNiArODIsNyBAQAogICAgICAgICBpZiAoIXN0cmNtcChzLCAibGFzcyIpKSByZXR1cm4gS19jbGFzczsKICAgICAgICAgaWYgKCFzdHJjbXAocywgImxhc3Nfc3RhcnQiKSkgcmV0dXJuIEtfY2xhc3Nfc3RhcnQ7CiAgICAgICAgIGlmICghc3RyY21wKHMsICJsYXNzX3N0b3AiKSkgcmV0dXJuIEtfY2xhc3Nfc3RvcDsKKyAgICAgICAgaWYgKCFzdHJjbXAocywgImxhc3NfcmVzZXQiKSkgcmV0dXJuIEtfY2xhc3NfcmVzZXQ7CiAgICAgICAgIGlmICghc3RyY21wKHMsICJvbnNvbGUiKSkgcmV0dXJuIEtfY29uc29sZTsKICAgICAgICAgaWYgKCFzdHJjbXAocywgImhvd24iKSkgcmV0dXJuIEtfY2hvd247CiAgICAgICAgIGlmICghc3RyY21wKHMsICJobW9kIikpIHJldHVybiBLX2NobW9kOwpAQCAtMTEyLDYgKzExMyw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgJ2wnOgogICAgICAgICBpZiAoIXN0cmNtcChzLCAib2dsZXZlbCIpKSByZXR1cm4gS19sb2dsZXZlbDsKKyAgICAgICAgaWYgKCFzdHJjbXAocywgIm9hZF9wZXJzaXN0X3Byb3BzIikpIHJldHVybiBLX2xvYWRfcGVyc2lzdF9wcm9wczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAnbSc6CiAgICAgICAgIGlmICghc3RyY21wKHMsICJrZGlyIikpIHJldHVybiBLX21rZGlyOwpAQCAtMTI0LDYgKzEyNiw4IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgJ3InOgogICAgICAgICBpZiAoIXN0cmNtcChzLCAiZXN0YXJ0IikpIHJldHVybiBLX3Jlc3RhcnQ7CisgICAgICAgIGlmICghc3RyY21wKHMsICJtZGlyIikpIHJldHVybiBLX3JtZGlyOworICAgICAgICBpZiAoIXN0cmNtcChzLCAibSIpKSByZXR1cm4gS19ybTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAncyc6CiAgICAgICAgIGlmICghc3RyY21wKHMsICJlcnZpY2UiKSkgcmV0dXJuIEtfc2VydmljZTsKQEAgLTE4Nyw3ICsxOTEsNyBAQAogCiAgICAgbmFyZ3MgPSAwOwogICAgIHN0YXRlLmZpbGVuYW1lID0gZm47Ci0gICAgc3RhdGUubGluZSA9IDE7CisgICAgc3RhdGUubGluZSA9IDA7CiAgICAgc3RhdGUucHRyID0gczsKICAgICBzdGF0ZS5uZXh0dG9rZW4gPSAwOwogICAgIHN0YXRlLnBhcnNlX2xpbmUgPSBwYXJzZV9saW5lX25vX29wOwpAQCAtMTk3LDYgKzIwMSw3IEBACiAgICAgICAgICAgICBzdGF0ZS5wYXJzZV9saW5lKCZzdGF0ZSwgMCwgMCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGNhc2UgVF9ORVdMSU5FOgorICAgICAgICAgICAgc3RhdGUubGluZSsrOwogICAgICAgICAgICAgaWYgKG5hcmdzKSB7CiAgICAgICAgICAgICAgICAgaW50IGt3ID0gbG9va3VwX2tleXdvcmQoYXJnc1swXSk7CiAgICAgICAgICAgICAgICAgaWYgKGt3X2lzKGt3LCBTRUNUSU9OKSkgewpkaWZmIC0tZ2l0IGEvaW5pdC9rZXljaG9yZHMuYyBiL2luaXQva2V5Y2hvcmRzLmMKaW5kZXggZmViYjYyZi4uYWFiMDgxOSAxMDA2NDQKLS0tIGEvaW5pdC9rZXljaG9yZHMuYworKysgYi9pbml0L2tleWNob3Jkcy5jCkBAIC0xNyw5ICsxNywxMSBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleWNob3JkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAibG9nLmgiCmRpZmYgLS1naXQgYS9pbml0L2tleXdvcmRzLmggYi9pbml0L2tleXdvcmRzLmgKaW5kZXggMjUzMTVkOC4uOTVhY2QwMSAxMDA2NDQKLS0tIGEvaW5pdC9rZXl3b3Jkcy5oCisrKyBiL2luaXQva2V5d29yZHMuaApAQCAtNCw2ICs0LDcgQEAKIGludCBkb19jaGRpcihpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKIGludCBkb19jbGFzc19zdGFydChpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKIGludCBkb19jbGFzc19zdG9wKGludCBuYXJncywgY2hhciAqKmFyZ3MpOworaW50IGRvX2NsYXNzX3Jlc2V0KGludCBuYXJncywgY2hhciAqKmFyZ3MpOwogaW50IGRvX2RvbWFpbm5hbWUoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fZXhlYyhpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKIGludCBkb19leHBvcnQoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CkBAIC0xNCw2ICsxNSw4IEBACiBpbnQgZG9fbWtkaXIoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fbW91bnQoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fcmVzdGFydChpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKK2ludCBkb19ybShpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKK2ludCBkb19ybWRpcihpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKIGludCBkb19zZXRrZXkoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fc2V0cHJvcChpbnQgbmFyZ3MsIGNoYXIgKiphcmdzKTsKIGludCBkb19zZXRybGltaXQoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CkBAIC0yNyw2ICszMCw3IEBACiBpbnQgZG9fY2hvd24oaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fY2htb2QoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiBpbnQgZG9fbG9nbGV2ZWwoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CitpbnQgZG9fbG9hZF9wZXJzaXN0X3Byb3BzKGludCBuYXJncywgY2hhciAqKmFyZ3MpOwogaW50IGRvX3dhaXQoaW50IG5hcmdzLCBjaGFyICoqYXJncyk7CiAjZGVmaW5lIF9fTUFLRV9LRVlXT1JEX0VOVU1fXwogI2RlZmluZSBLRVlXT1JEKHN5bWJvbCwgZmxhZ3MsIG5hcmdzLCBmdW5jKSBLXyMjc3ltYm9sLApAQCAtMzksNiArNDMsNyBAQAogICAgIEtFWVdPUkQoY2xhc3MsICAgICAgIE9QVElPTiwgIDAsIDApCiAgICAgS0VZV09SRChjbGFzc19zdGFydCwgQ09NTUFORCwgMSwgZG9fY2xhc3Nfc3RhcnQpCiAgICAgS0VZV09SRChjbGFzc19zdG9wLCAgQ09NTUFORCwgMSwgZG9fY2xhc3Nfc3RvcCkKKyAgICBLRVlXT1JEKGNsYXNzX3Jlc2V0LCBDT01NQU5ELCAxLCBkb19jbGFzc19yZXNldCkKICAgICBLRVlXT1JEKGNvbnNvbGUsICAgICBPUFRJT04sICAwLCAwKQogICAgIEtFWVdPUkQoY3JpdGljYWwsICAgIE9QVElPTiwgIDAsIDApCiAgICAgS0VZV09SRChkaXNhYmxlZCwgICAgT1BUSU9OLCAgMCwgMCkKQEAgLTU3LDYgKzYyLDggQEAKICAgICBLRVlXT1JEKG9uZXNob3QsICAgICBPUFRJT04sICAwLCAwKQogICAgIEtFWVdPUkQob25yZXN0YXJ0LCAgIE9QVElPTiwgIDAsIDApCiAgICAgS0VZV09SRChyZXN0YXJ0LCAgICAgQ09NTUFORCwgMSwgZG9fcmVzdGFydCkKKyAgICBLRVlXT1JEKHJtLCAgICAgICAgICBDT01NQU5ELCAxLCBkb19ybSkKKyAgICBLRVlXT1JEKHJtZGlyLCAgICAgICBDT01NQU5ELCAxLCBkb19ybWRpcikKICAgICBLRVlXT1JEKHNlcnZpY2UsICAgICBTRUNUSU9OLCAwLCAwKQogICAgIEtFWVdPUkQoc2V0ZW52LCAgICAgIE9QVElPTiwgIDIsIDApCiAgICAgS0VZV09SRChzZXRrZXksICAgICAgQ09NTUFORCwgMCwgZG9fc2V0a2V5KQpAQCAtNzUsNiArODIsNyBAQAogICAgIEtFWVdPUkQoY2hvd24sICAgICAgIENPTU1BTkQsIDIsIGRvX2Nob3duKQogICAgIEtFWVdPUkQoY2htb2QsICAgICAgIENPTU1BTkQsIDIsIGRvX2NobW9kKQogICAgIEtFWVdPUkQobG9nbGV2ZWwsICAgIENPTU1BTkQsIDEsIGRvX2xvZ2xldmVsKQorICAgIEtFWVdPUkQobG9hZF9wZXJzaXN0X3Byb3BzLCAgICBDT01NQU5ELCAwLCBkb19sb2FkX3BlcnNpc3RfcHJvcHMpCiAgICAgS0VZV09SRChpb3ByaW8sICAgICAgT1BUSU9OLCAgMCwgMCkKICNpZmRlZiBfX01BS0VfS0VZV09SRF9FTlVNX18KICAgICBLRVlXT1JEX0NPVU5ULApkaWZmIC0tZ2l0IGEvaW5pdC9saXN0LmggYi9pbml0L2xpc3QuaAppbmRleCAwYTdiMjhjLi43YjllZjMyIDEwMDY0NAotLS0gYS9pbml0L2xpc3QuaAorKysgYi9pbml0L2xpc3QuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBfSU5JVF9MSVNUX0hfCiAjZGVmaW5lIF9JTklUX0xJU1RfSF8KIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCiBzdHJ1Y3QgbGlzdG5vZGUKIHsKICAgICBzdHJ1Y3QgbGlzdG5vZGUgKm5leHQ7CmRpZmYgLS1naXQgYS9pbml0L3BhcnNlci5jIGIvaW5pdC9wYXJzZXIuYwppbmRleCAyZjM2YWM3Li4zYzJlYzAwIDEwMDY0NAotLS0gYS9pbml0L3BhcnNlci5jCisrKyBiL2luaXQvcGFyc2VyLmMKQEAgLTgzLDcgKzgzLDYgQEAKICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSB4OwogICAgICAgICAgICAgcmV0dXJuIFRfRU9GOwogICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBzdGF0ZS0+bGluZSsrOwogICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgc3RhdGUtPnB0ciA9IHg7CiAgICAgICAgICAgICByZXR1cm4gVF9ORVdMSU5FOwpAQCAtOTQsOSArOTMsMTMgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgIHdoaWxlICgqeCAmJiAoKnggIT0gJ1xuJykpIHgrKzsKLSAgICAgICAgICAgIHN0YXRlLT5saW5lKys7Ci0gICAgICAgICAgICBzdGF0ZS0+cHRyID0geDsKLSAgICAgICAgICAgIHJldHVybiBUX05FV0xJTkU7CisgICAgICAgICAgICBpZiAoKnggPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSB4KzE7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRfTkVXTElORTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPnB0ciA9IHg7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRfRU9GOworICAgICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgZ290byB0ZXh0OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9pbml0L3Byb3BlcnR5X3NlcnZpY2UuYyBiL2luaXQvcHJvcGVydHlfc2VydmljZS5jCmluZGV4IGQ4ZmVhNTYuLmM4ZDZjMDkgMTAwNjQ0Ci0tLSBhL2luaXQvcHJvcGVydHlfc2VydmljZS5jCisrKyBiL2luaXQvcHJvcGVydHlfc2VydmljZS5jCkBAIC02MSw2ICs2MSw3IEBACiAgICAgeyAibmV0LnJtbmV0MC4iLCAgICAgIEFJRF9SQURJTywgICAgMCB9LAogICAgIHsgIm5ldC5ncHJzLiIsICAgICAgICBBSURfUkFESU8sICAgIDAgfSwKICAgICB7ICJuZXQucHBwIiwgICAgICAgICAgQUlEX1JBRElPLCAgICAwIH0sCisgICAgeyAibmV0LnFtaSIsICAgICAgICAgIEFJRF9SQURJTywgICAgMCB9LAogICAgIHsgInJpbC4iLCAgICAgICAgICAgICBBSURfUkFESU8sICAgIDAgfSwKICAgICB7ICJnc20uIiwgICAgICAgICAgICAgQUlEX1JBRElPLCAgICAwIH0sCiAgICAgeyAicGVyc2lzdC5yYWRpbyIsICAgIEFJRF9SQURJTywgICAgMCB9LApAQCAtNzksNiArODAsNyBAQAogICAgIHsgImRlYnVnLiIsICAgICAgICAgICBBSURfU0hFTEwsICAgIDAgfSwKICAgICB7ICJsb2cuIiwgICAgICAgICAgICAgQUlEX1NIRUxMLCAgICAwIH0sCiAgICAgeyAic2VydmljZS5hZGIucm9vdCIsIEFJRF9TSEVMTCwgICAgMCB9LAorICAgIHsgInNlcnZpY2UuYWRiLnRjcC5wb3J0IiwgQUlEX1NIRUxMLCAgICAwIH0sCiAgICAgeyAicGVyc2lzdC5zeXMuIiwgICAgIEFJRF9TWVNURU0sICAgMCB9LAogICAgIHsgInBlcnNpc3Quc2VydmljZS4iLCBBSURfU1lTVEVNLCAgIDAgfSwKICAgICB7ICJwZXJzaXN0LnNlY3VyaXR5LiIsIEFJRF9TWVNURU0sICAgMCB9LApAQCAtOTUsNiArOTcsNyBAQAogICAgIHVuc2lnbmVkIGludCBnaWQ7CiB9IGNvbnRyb2xfcGVybXNbXSA9IHsKICAgICB7ICJkdW1wc3RhdGUiLEFJRF9TSEVMTCwgQUlEX0xPRyB9LAorICAgIHsgInJpbC1kYWVtb24iLEFJRF9SQURJTywgQUlEX1JBRElPIH0sCiAgICAgIHtOVUxMLCAwLCAwIH0KIH07CiAKQEAgLTE4NiwxNSArMTg5LDYgQEAKICAgICBfX2Z1dGV4X3dha2UoJnBpLT5zZXJpYWwsIElOVDMyX01BWCk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvcGVydHlfd3JpdGUocHJvcF9pbmZvICpwaSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgaW50IHZhbHVlbGVuID0gc3RybGVuKHZhbHVlKTsKLSAgICBpZih2YWx1ZWxlbiA+PSBQUk9QX1ZBTFVFX01BWCkgcmV0dXJuIC0xOwotICAgIHVwZGF0ZV9wcm9wX2luZm8ocGksIHZhbHVlLCB2YWx1ZWxlbik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQogLyoKICAqIENoZWNrcyBwZXJtaXNzaW9ucyBmb3Igc3RhcnRpbmcvc3RvcGluZyBzeXN0ZW0gc2VydmljZXMuCiAgKiBBSURfU1lTVEVNIGFuZCBBSURfUk9PVCBhcmUgYWx3YXlzIGFsbG93ZWQuCkBAIC0zODEsOCArMzc1LDggQEAKICAgICB9CiAKICAgICByID0gcmVjdihzLCAmbXNnLCBzaXplb2YobXNnKSwgMCk7Ci0gICAgY2xvc2Uocyk7CiAgICAgaWYociAhPSBzaXplb2YocHJvcF9tc2cpKSB7CisgICAgICAgIGNsb3NlKHMpOwogICAgICAgICBFUlJPUigic3lzX3Byb3A6IG1pcy1tYXRjaCBtc2cgc2l6ZSByZWNpZXZlZDogJWQgZXhwZWN0ZWQ6ICVkXG4iLAogICAgICAgICAgICAgICByLCBzaXplb2YocHJvcF9tc2cpKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMzk0LDExICszODgsMTQgQEAKICAgICAgICAgbXNnLnZhbHVlW1BST1BfVkFMVUVfTUFYLTFdID0gMDsKIAogICAgICAgICBpZihtZW1jbXAobXNnLm5hbWUsImN0bC4iLDQpID09IDApIHsKKyAgICAgICAgICAgIC8vIEtlZXAgdGhlIG9sZCBjbG9zZS1zb2NrZXQtZWFybHkgYmVoYXZpb3Igd2hlbiBoYW5kbGluZworICAgICAgICAgICAgLy8gY3RsLiogcHJvcGVydGllcy4KKyAgICAgICAgICAgIGNsb3NlKHMpOwogICAgICAgICAgICAgaWYgKGNoZWNrX2NvbnRyb2xfcGVybXMobXNnLnZhbHVlLCBjci51aWQsIGNyLmdpZCkpIHsKICAgICAgICAgICAgICAgICBoYW5kbGVfY29udHJvbF9tZXNzYWdlKChjaGFyKikgbXNnLm5hbWUgKyA0LCAoY2hhciopIG1zZy52YWx1ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEVSUk9SKCJzeXNfcHJvcDogVW5hYmxlIHRvICVzIHNlcnZpY2UgY3RsIFslc10gdWlkOiAlZCBwaWQ6JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2cubmFtZSArIDQsIG1zZy52YWx1ZSwgY3IudWlkLCBjci5waWQpOworICAgICAgICAgICAgICAgIEVSUk9SKCJzeXNfcHJvcDogVW5hYmxlIHRvICVzIHNlcnZpY2UgY3RsIFslc10gdWlkOiVkIGdpZDolZCBwaWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cubmFtZSArIDQsIG1zZy52YWx1ZSwgY3IudWlkLCBjci5naWQsIGNyLnBpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoY2hlY2tfcGVybXMobXNnLm5hbWUsIGNyLnVpZCwgY3IuZ2lkKSkgewpAQCAtNDA3LDEwICs0MDQsMTYgQEAKICAgICAgICAgICAgICAgICBFUlJPUigic3lzX3Byb3A6IHBlcm1pc3Npb24gZGVuaWVkIHVpZDolZCAgbmFtZTolc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBjci51aWQsIG1zZy5uYW1lKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm90ZTogYmlvbmljJ3MgcHJvcGVydHkgY2xpZW50IGNvZGUgYXNzdW1lcyB0aGF0IHRoZQorICAgICAgICAgICAgLy8gcHJvcGVydHkgc2VydmVyIHdpbGwgbm90IGNsb3NlIHRoZSBzb2NrZXQgdW50aWwgKkFGVEVSKgorICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGlzIHdyaXR0ZW4gdG8gbWVtb3J5LgorICAgICAgICAgICAgY2xvc2Uocyk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgorICAgICAgICBjbG9zZShzKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogfQpAQCAtNTEyLDYgKzUxNSwxOCBAQAogICAgIHJldHVybiBwcm9wZXJ0eV9hcmVhX2luaXRlZDsKIH0KIAorLyogV2hlbiBib290aW5nIGFuIGVuY3J5cHRlZCBzeXN0ZW0sIC9kYXRhIGlzIG5vdCBtb3VudGVkIHdoZW4gdGhlCisgKiBwcm9wZXJ0eSBzZXJ2aWNlIGlzIHN0YXJ0ZWQsIHNvIGFueSBwcm9wZXJ0aWVzIHN0b3JlZCB0aGVyZSBhcmUKKyAqIG5vdCBsb2FkZWQuICBWb2xkIHRyaWdnZXJzIGluaXQgdG8gbG9hZCB0aGVzZSBwcm9wZXJ0aWVzIG9uY2UgaXQKKyAqIGhhcyBtb3VudGVkIC9kYXRhLgorICovCit2b2lkIGxvYWRfcGVyc2lzdF9wcm9wcyh2b2lkKQoreworICAgIGxvYWRfcHJvcGVydGllc19mcm9tX2ZpbGUoUFJPUF9QQVRIX0xPQ0FMX09WRVJSSURFKTsKKyAgICAvKiBSZWFkIHBlcnNpc3RlbnQgcHJvcGVydGllcyBhZnRlciBhbGwgZGVmYXVsdCB2YWx1ZXMgaGF2ZSBiZWVuIGxvYWRlZC4gKi8KKyAgICBsb2FkX3BlcnNpc3RlbnRfcHJvcGVydGllcygpOworfQorCiB2b2lkIHN0YXJ0X3Byb3BlcnR5X3NlcnZpY2Uodm9pZCkKIHsKICAgICBpbnQgZmQ7CmRpZmYgLS1naXQgYS9pbml0L3Byb3BlcnR5X3NlcnZpY2UuaCBiL2luaXQvcHJvcGVydHlfc2VydmljZS5oCmluZGV4IDA0NWQyMGEuLmJjOTdjYzQgMTAwNjQ0Ci0tLSBhL2luaXQvcHJvcGVydHlfc2VydmljZS5oCisrKyBiL2luaXQvcHJvcGVydHlfc2VydmljZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKIGV4dGVybiB2b2lkIGhhbmRsZV9wcm9wZXJ0eV9zZXRfZmQodm9pZCk7CiBleHRlcm4gdm9pZCBwcm9wZXJ0eV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbG9hZF9wZXJzaXN0X3Byb3BzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3RhcnRfcHJvcGVydHlfc2VydmljZSh2b2lkKTsKIHZvaWQgZ2V0X3Byb3BlcnR5X3dvcmtzcGFjZShpbnQgKmZkLCBpbnQgKnN6KTsKIGV4dGVybiBjb25zdCBjaGFyKiBwcm9wZXJ0eV9nZXQoY29uc3QgY2hhciAqbmFtZSk7CmRpZmYgLS1naXQgYS9pbml0L3NpZ25hbF9oYW5kbGVyLmMgYi9pbml0L3NpZ25hbF9oYW5kbGVyLmMKaW5kZXggM2U1ZDEzNi4uZjg5ZDA1OCAxMDA2NDQKLS0tIGEvaW5pdC9zaWduYWxfaGFuZGxlci5jCisrKyBiL2luaXQvc2lnbmFsX2hhbmRsZXIuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+Ci0jaW5jbHVkZSA8c3lzL3JlYm9vdC5oPgorI2luY2x1ZGUgPGN1dGlscy9hbmRyb2lkX3JlYm9vdC5oPgogCiAjaW5jbHVkZSAiaW5pdC5oIgogI2luY2x1ZGUgImxpc3QuaCIKQEAgLTgzLDggKzgzLDggQEAKICAgICAgICAgc3ZjLT5mbGFncyB8PSBTVkNfRElTQUJMRUQ7CiAgICAgfQogCi0gICAgICAgIC8qIGRpc2FibGVkIHByb2Nlc3NlcyBkbyBub3QgZ2V0IHJlc3RhcnRlZCBhdXRvbWF0aWNhbGx5ICovCi0gICAgaWYgKHN2Yy0+ZmxhZ3MgJiBTVkNfRElTQUJMRUQpIHsKKyAgICAgICAgLyogZGlzYWJsZWQgYW5kIHJlc2V0IHByb2Nlc3NlcyBkbyBub3QgZ2V0IHJlc3RhcnRlZCBhdXRvbWF0aWNhbGx5ICovCisgICAgaWYgKHN2Yy0+ZmxhZ3MgJiAoU1ZDX0RJU0FCTEVEIHwgU1ZDX1JFU0VUKSApICB7CiAgICAgICAgIG5vdGlmeV9zZXJ2aWNlX3N0YXRlKHN2Yy0+bmFtZSwgInN0b3BwZWQiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtOTYsOSArOTYsNyBAQAogICAgICAgICAgICAgICAgIEVSUk9SKCJjcml0aWNhbCBwcm9jZXNzICclcycgZXhpdGVkICVkIHRpbWVzIGluICVkIG1pbnV0ZXM7ICIKICAgICAgICAgICAgICAgICAgICAgICAicmVib290aW5nIGludG8gcmVjb3ZlcnkgbW9kZVxuIiwgc3ZjLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgIENSSVRJQ0FMX0NSQVNIX1RIUkVTSE9MRCwgQ1JJVElDQUxfQ1JBU0hfV0lORE9XIC8gNjApOwotICAgICAgICAgICAgICAgIHN5bmMoKTsKLSAgICAgICAgICAgICAgICBfX3JlYm9vdChMSU5VWF9SRUJPT1RfTUFHSUMxLCBMSU5VWF9SRUJPT1RfTUFHSUMyLAotICAgICAgICAgICAgICAgICAgICAgICAgIExJTlVYX1JFQk9PVF9DTURfUkVTVEFSVDIsICJyZWNvdmVyeSIpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfcmVib290KEFORFJPSURfUkJfUkVTVEFSVDIsIDAsICJyZWNvdmVyeSIpOwogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvaW5pdC91ZXZlbnRkLmMgYi9pbml0L3VldmVudGQuYwppbmRleCAwZTk3YmU3Li4xMzI4ZDE5IDEwMDY0NAotLS0gYS9pbml0L3VldmVudGQuYworKysgYi9pbml0L3VldmVudGQuYwpAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKwogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCiAjaW5jbHVkZSAidWV2ZW50ZC5oIgpAQCAtMzcsNiArMzksMTMgQEAKICAgICBpbnQgbnI7CiAgICAgY2hhciB0bXBbMzJdOwogCisgICAgICAgIC8qIFByZXZlbnQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkcmVuIGZyb20gYmVjb21pbmcgem9tYmllcy4KKyAgICAgICAgICogSWYgd2Ugc2hvdWxkIG5lZWQgdG8gd2FpdCgpIGZvciBzb21lIGNoaWxkcmVuIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICogKGFzIG9wcG9zZWQgdG8gbm9uZSByaWdodCBub3cpLCBkb3VibGUtZm9ya2luZyBoZXJlIGluc3RlYWQKKyAgICAgICAgICogb2YgaWdub3JpbmcgU0lHQ0hMRCBtYXkgYmUgdGhlIGJldHRlciBzb2x1dGlvbi4KKyAgICAgICAgICovCisgICAgc2lnbmFsKFNJR0NITEQsIFNJR19JR04pOworCiAgICAgb3Blbl9kZXZudWxsX3N0ZGlvKCk7CiAgICAgbG9nX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvaW5pdC91dGlsLmMgYi9pbml0L3V0aWwuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDM3Nzc1NGIuLmQ4ZWM4OGUKLS0tIGEvaW5pdC91dGlsLmMKKysrIGIvaW5pdC91dGlsLmMKQEAgLTQzOSw4ICs0MzksOSBAQAogICAgICAgICBpZiAoeCkgewogICAgICAgICAgICAgeCArPSAyOwogICAgICAgICAgICAgbiA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoKnggJiYgIWlzc3BhY2UoKngpKSB7Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmVbbisrXSA9IHRvbG93ZXIoKngpOworICAgICAgICAgICAgd2hpbGUgKCp4ICYmICp4ICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzc3BhY2UoKngpKQorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZVtuKytdID0gdG9sb3dlcigqeCk7CiAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgIGlmIChuID09IDMxKSBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYmFjYy9BbmRyb2lkLm1rIGIvbGliYWNjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDFlMTYuLjAwMDAwMDAKLS0tIGEvbGliYWNjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIFNoYXJlZCBsaWJyYXJ5IGZvciB0YXJnZXQKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTE9DQUxfTU9EVUxFOj0gbGliYWNjCi1MT0NBTF9TUkNfRklMRVMgOj0gYWNjLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmRsIGxpYmN1dGlscwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMgU3RhdGljIGxpYnJhcnkgZm9yIGhvc3QKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEU6PSBsaWJhY2MKLUxPQ0FMX1NSQ19GSUxFUyA6PSBhY2MuY3BwCi0KLUxPQ0FMX0NGTEFHUyA6PSAtTzAgLWcKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMKLUxPQ0FMX0xETElCUyA6PSAtbGRsCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQotCi0jIEJ1aWxkIGNoaWxkcmVuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2xpYmFjYy9GRUFUVVJFUyBiL2xpYmFjYy9GRUFUVVJFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmOWQ5OC4uMDAwMDAwMAotLS0gYS9saWJhY2MvRkVBVFVSRVMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0KLVN1cHBvcnRlZCBDIGxhbmd1YWdlIHN1YnNldDoKLQotICAgIC0gRXhwcmVzc2lvbnM6Ci0KLSAgICAgICAgKiBiaW5hcnkgb3BlcmF0b3JzLCBieSBkZWNyZWFzaW5nIHByaW9yaXR5IG9yZGVyOiAnKicgJy8nICclJywKLSAgICAgICAgICAnKycgJy0nLCAnPj4nICc8PCcsICc8JyAnPD0nICc+JyAnPj0nLCAnPT0nICchPScsICcmJywKLSAgICAgICAgICAnXicsICd8JywgJz0nLCAnJiYnLCAnfHwnLgotCi0gICAgICAgICogJyYmJyBhbmQgJ3x8JyBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyBDIDogbGVmdCB0byByaWdodAotICAgICAgICAgIGV2YWx1YXRpb24gYW5kIGVhcmx5IGV4aXQuCi0KLSAgICAgICAgKiBQYXJlbnRoZXNpcyBhcmUgc3VwcG9ydGVkLgotCi0gICAgICAgICogQ29tbWEgb3BlcmF0b3IgaXMgc3VwcG9ydGVkLgotCi0gICAgICAgICogVHJpbmFyeSBvcGVyYXRvciAoPzopIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLSAgICAgICAgKiBVbmFyeSBvcGVyYXRvcnM6ICcmJywgJyonIChwb2ludGVyIGluZGlyZWN0aW9uKSwgJy0nCi0gICAgICAgICAgKG5lZ2F0aW9uKSwgJysnLCAnIScsICd+JywgJysrJyBhbmQgJy0tJy4KLQotICAgICAgICAqIFBvaW50ZXIgaW5kaXJlY3Rpb24gKCcqJykgaXMgc3VwcG9ydGVkLgotCi0gICAgICAgICogU3F1YXJlIGJyYWNrZXRzIGFyZSBzdXBwb3J0ZWQuCi0KLSAgICAgICAgKiAnPScgYW5kIDxvcD49IGFyZSBzdXBwb3J0ZWQuCi0KLSAgICAgICAgKiBGdW5jdGlvbiBjYWxscyBhcmUgc3VwcG9ydGVkIHdpdGggc3RhbmRhcmQgTGludXggY2FsbGluZwotICAgICAgICAgIGNvbnZlbnRpb24uIEZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBzdXBwb3J0ZWQuCi0gICAgICAgICAgRnVuY3Rpb25zIGNhbiBiZSB1c2VkIGJlZm9yZSBiZWluZyBkZWNsYXJlZC4KLQotICAgICAgICAtIHNpemVvZigpIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLSAgICAtIFR5cGVzOgotICAgICAgICArIGludCwgc2hvcnQsIGNoYXIsIGZsb2F0LCBkb3VibGUKLSAgICAgICAgKyBwb2ludGVycwotICAgICAgICArIHZhcmlhYmxlcyBjYW4gYmUgaW5pdGlhbGl6ZWQgaW4gZGVjbGFyYXRpb25zLgotICAgICAgICArIE9ubHkgQU5TSS1zdHlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICAgICAgICAgLSAiLi4uIiBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgICAtIHNob3J0IGlzIHN1cHBvcnRlZAotICAgICAgICAtIGNvbnN0IGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgLSBzaWduZWQgYW5kIHVuc2lnbmVkIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAgICAtIGFycmF5cyBhcmUgc3VwcG9ydGVkCi0gICAgICAgIC0gbG9uZyBkb3VibGVzIGFyZSBub3Qgc3VwcG9ydGVkCi0gICAgICAgIC0gc3RydWN0cyBhbmQgdW5pb25zIGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgLSB0eXBlZGVmIGlzIHN1cHBvcnRlZAotICAgICAgICAtIGV4cGxpY2l0IHN0b3JhZ2UgY2xhc3Mgc3BlY2lmaWVycyBhcmUgbm90IHN1cHBvcnRlZDogcmVnaXN0ZXIsIGF1dG8sIHN0YXRpYywgZXh0ZXJuCi0KLSAgICAtIFVua25vd24gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYXJlIGJvdW5kIGF0IGNvbXBpbGUgdGltZSBieSBjYWxsaW5nCi0gICAgICBiYWNrIHRvIHRoZSBjYWxsZXIuIEZvciB0aGUgJ2FjYycgY29tbWFuZC1saW5lIHRvb2wgdW5rbm93biBmdW5jdGlvbnMKLSAgICAgIGFuZCB2YXJpYWJsZXMgYXJlIGxvb2tlZCB1cCB1c2luZyBkbHN5bSwgdG8gYWxsb3cgdXNpbmcgbWFueSBsaWJjCi0gICAgICBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcy4KLQotICAgIC0gSW5zdHJ1Y3Rpb25zOiBibG9ja3MgKCd7JyAnfScpIGFyZSBzdXBwb3J0ZWQgYXMgaW4gQy4gJ2lmJyBhbmQKLSAgICAgICdlbHNlJyBjYW4gYmUgdXNlZCBmb3IgdGVzdHMuIFRoZSAnd2hpbGUnIGFuZCAnZm9yJyBDIGNvbnN0cnVjdHMKLSAgICAgIGFyZSBzdXBwb3J0ZWQgZm9yIGxvb3BzLiAnYnJlYWsnIGNhbiBiZSB1c2VkIHRvIGV4aXQKLSAgICAgIGxvb3BzLiAncmV0dXJuJyBpcyB1c2VkIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24uCi0KLSAgICAgIC0gc3dpdGNoIC8gY2FzZSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgLSBnb3RvIGFuZCBsYWJlbHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAtIGNvbnRpbnVlIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLSAgICAtIElkZW50aWZpZXJzIGFyZSBwYXJzZWQgdGhlIHNhbWUgd2F5IGFzIEMuIExvY2FsIHZhcmlhYmxlcyBhcmUKLSAgICAgIGhhbmRsZWQsIGJ1dCB0aGVyZSBpcyBubyBsb2NhbCBuYW1lIHNwYWNlIChub3QgYSBwcm9ibGVtIGlmCi0gICAgICBkaWZmZXJlbnQgbmFtZXMgYXJlIHVzZWQgZm9yIGxvY2FsIGFuZCBnbG9iYWwgdmFyaWFibGVzKS4KLQotICAgIC0gTnVtYmVycyBjYW4gYmUgZW50ZXJlZCBpbiBkZWNpbWFsLCBoZXhhZGVjaW1hbCAoJzB4JyBvciAnMFgnCi0gICAgICBwcmVmaXgpLCBvciBvY3RhbCAoJzAnIHByZWZpeCkuCi0KLSAgICAtIEZsb2F0IGFuZCBkb3VibGUgY29uc3RhbnRzIGFyZSBzdXBwb3J0ZWQuCi0KLSAgICAtICcjZGVmaW5lJyBpcyBzdXBwb3J0ZWQgd2l0aG91dCBmdW5jdGlvbiBsaWtlIGFyZ3VtZW50cy4KLSAgICAtIE1hY3JvIHJlY3Vyc2lvbiBpcyBhbGxvd2VkLgotICAgIC0gU2VsZi1yZWZlcmVudGlhbCBtYWNyb3MgYXJlIGhhbmRsZWQgYXMgaW4gZ2NjLgotICAgIC0gJyNwcmFnbWEnIGlzIHN1cHBvcnRlZC4gVGhlIHByYWdtYSB0ZXh0IGlzIHBhc3NlZCB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uLAotICAgICAgIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBtZXRhLWluZm9ybWF0aW9uLgotICAgIC0gT3RoZXIgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYXJlIGlnbm9yZWQuCi0KLSAgICAtIEMgU3RyaW5ncyBhbmQgQyBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBzdXBwb3J0ZWQuIEFsbCBBTlNJIEMKLSAgICAgIGNoYXJhY3RlciBlc2NhcGVzIGFyZSBzdXBwb3J0ZWQuCi0KLSAgICAtIEJvdGggQyBjb21tZW50cyAoIC8qICovICkgYW5kIEMrKyBjb21tZW50cyAoIC8vIC4uLiBlbmQtb2YtbGluZSApIGFyZQotICAgICAgc3VwcG9ydGVkLgotCi0gICAgLSBTb21lIHN5bnRheCBlcnJvcnMgYXJlIHJlcG9ydGVkLCBvdGhlcnMgbWF5IGNhdXNlIGEgY3Jhc2guCi0KLSAgICAtIE1lbW9yeTogdGhlIGNvZGUsIGRhdGEsIGFuZCBzeW1ib2wgc2l6ZXMgYXJlIGxpbWl0ZWQgdG8gMTAwS0IKLSAgICAgIChpdCBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgc291cmNlIGNvZGUpLgotCmRpZmYgLS1naXQgYS9saWJhY2MvTElDRU5TRSBiL2xpYmFjYy9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWE0MWUwLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIE9iZnVzY2F0ZWQgVGlueSBDIENvbXBpbGVyCi0KLSBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBGYWJyaWNlIEJlbGxhcmQKLQotIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgYW5kIGl0cyBkb2N1bWVudGF0aW9uCi0gKmlzKiByZXF1aXJlZC4KLSAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0KZGlmZiAtLWdpdCBhL2xpYmFjYy9hY2MuY3BwIGIvbGliYWNjL2FjYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMTNmOWEuLjAwMDAwMDAKLS0tIGEvbGliYWNjL2FjYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NDA3ICswLDAgQEAKLS8qCi0gKiBBbmRyb2lkICJBbG1vc3QiIEMgQ29tcGlsZXIuCi0gKiBUaGlzIGlzIGEgY29tcGlsZXIgZm9yIGEgc21hbGwgc3Vic2V0IG9mIHRoZSBDIGxhbmd1YWdlLCBpbnRlbmRlZCBmb3IgdXNlCi0gKiBpbiBzY3JpcHRpbmcgZW52aXJvbm1lbnRzIHdoZXJlIHNwZWVkIGFuZCBtZW1vcnkgZm9vdHByaW50IGFyZSBpbXBvcnRhbnQuCi0gKgotICogVGhpcyBjb2RlIGlzIGJhc2VkIHVwb24gdGhlICJ1bm9iZnVzY2F0ZWQiIHZlcnNpb24gb2YgdGhlCi0gKiBPYmZ1c2NhdGVkIFRpbnkgQyBjb21waWxlciwgc2VlIHRoZSBmaWxlIExJQ0VOU0UgZm9yIGRldGFpbHMuCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiYWNjIgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2hhc2htYXAuaD4KLQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpZiBkZWZpbmVkKE1BUF9BTk9OKSAmJiAhZGVmaW5lZChNQVBfQU5PTllNT1VTKQotI2RlZmluZSBNQVBfQU5PTllNT1VTIE1BUF9BTk9OCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19hcm1fXykKLSNkZWZpbmUgREVGQVVMVF9BUk1fQ09ERUdFTgotI2RlZmluZSBQUk9WSURFX0FSTV9DT0RFR0VOCi0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQotI2RlZmluZSBERUZBVUxUX1g4Nl9DT0RFR0VOCi0jZGVmaW5lIFBST1ZJREVfWDg2X0NPREVHRU4KLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKLSNkZWZpbmUgREVGQVVMVF9YNjRfQ09ERUdFTgotI2RlZmluZSBQUk9WSURFX1g2NF9DT0RFR0VOCi0jZW5kaWYKLQotI2lmIChkZWZpbmVkKF9fVkZQX0ZQX18pICYmICFkZWZpbmVkKF9fU09GVEZQX18pKQotI2RlZmluZSBBUk1fVVNFX1ZGUAotI2VuZGlmCi0KLSNpbmNsdWRlIDxhY2MvYWNjLmg+Ci0KLSNkZWZpbmUgTE9HX0FQSSguLi4pIGRvIHt9IHdoaWxlKDApCi0vLyAjZGVmaW5lIExPR19BUEkoLi4uKSBmcHJpbnRmIChzdGRlcnIsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIExPR19TVEFDSyguLi4pIGRvIHt9IHdoaWxlKDApCi0vLyAjZGVmaW5lIExPR19TVEFDSyguLi4pIGZwcmludGYgKHN0ZGVyciwgX19WQV9BUkdTX18pCi0KLS8vICNkZWZpbmUgUFJPVklERV9UUkFDRV9DT0RFR0VOCi0KLS8vIFVuY29tbWVudCB0byBkaXNhYmxlIEFSTSBwZWVwaG9sZSBvcHRpbWl6YXRpb25zCi0vLyAjZGVmaW5lIERJU0FCTEVfQVJNX1BFRVBIT0xFCi0KLS8vIFVuY29tbWVudCB0byBzYXZlIGlucHV0IHRvIGEgdGV4dCBmaWxlIGluIERFQlVHX0RVTVBfUEFUVEVSTgotLy8gI2RlZmluZSBERUJVR19TQVZFX0lOUFVUX1RPX0ZJTEUKLQotI2lmZGVmIERFQlVHX1NBVkVfSU5QVVRfVE9fRklMRQotI2lmZGVmIEFSTV9VU0VfVkZQCi0jZGVmaW5lIERFQlVHX0RVTVBfUEFUVEVSTiAiL2RhdGEvbWlzYy9hY2NfZHVtcC8lZC5jIgotI2Vsc2UKLSNkZWZpbmUgREVCVUdfRFVNUF9QQVRURVJOICIvdG1wL2FjY19kdW1wLyVkLmMiCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIGFzc2VydChiKSBhc3NlcnRJbXBsKGIsIF9fTElORV9fKQotCi1uYW1lc3BhY2UgYWNjIHsKLQotLy8gU3Vic2V0IG9mIFNUTCB2ZWN0b3IuCi10ZW1wbGF0ZTxjbGFzcyBFPiBjbGFzcyBWZWN0b3IgewotICAgIHB1YmxpYzoKLSAgICBWZWN0b3IoKSB7Ci0gICAgICAgIG1wQmFzZSA9IDA7Ci0gICAgICAgIG1Vc2VkID0gMDsKLSAgICAgICAgbVNpemUgPSAwOwotICAgIH0KLQotICAgIH5WZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtcEJhc2UpIHsKLSAgICAgICAgICAgIGNsZWFyKCk7Ci0gICAgICAgICAgICBmcmVlKG1wQmFzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgRSYgb3BlcmF0b3JbXShzaXplX3QgaSkgewotICAgICAgICByZXR1cm4gbXBCYXNlW2ldOwotICAgIH0KLQotICAgIGlubGluZSBFJiBmcm9udCgpIHsKLSAgICAgICAgcmV0dXJuIG1wQmFzZVswXTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgRSYgYmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG1wQmFzZVttVXNlZCAtIDFdOwotICAgIH0KLQotICAgIHZvaWQgcG9wX2JhY2soKSB7Ci0gICAgICAgIG1Vc2VkIC09IDE7Ci0gICAgICAgIG1wQmFzZVttVXNlZF0ufkUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hfYmFjayhjb25zdCBFJiBpdGVtKSB7Ci0gICAgICAgICogZW5zdXJlKDEpID0gaXRlbTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtVXNlZDsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyKCkgewotICAgICAgICAgaWYgKG1wQmFzZSkgewotICAgICAgICAgICAgIHNpemVfdCB1c2VkID0gbVVzZWQ7Ci0gICAgICAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHVzZWQ7IGkrKykgewotICAgICAgICAgICAgICAgICBtcEJhc2VbaV0ufkUoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBtVXNlZCA9IDA7Ci0gICAgIH0KLQotcHJpdmF0ZToKLSAgICBFKiBlbnN1cmUoaW50IG4pIHsKLSAgICAgICAgc2l6ZV90IG5ld1VzZWQgPSBtVXNlZCArIG47Ci0gICAgICAgIGlmIChuZXdVc2VkID4gbVNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBuZXdTaXplID0gbVNpemUgKiAyICsgMTA7Ci0gICAgICAgICAgICBpZiAobmV3U2l6ZSA8IG5ld1VzZWQpIHsKLSAgICAgICAgICAgICAgICBuZXdTaXplID0gbmV3VXNlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1wQmFzZSA9IChFKikgcmVhbGxvYyhtcEJhc2UsIHNpemVvZihFKSAqIG5ld1NpemUpOwotICAgICAgICAgICAgbVNpemUgPSBuZXdTaXplOwotICAgICAgICB9Ci0gICAgICAgIEUqIHJlc3VsdCA9IG1wQmFzZSArIG1Vc2VkOwotICAgICAgICBtVXNlZCA9IG5ld1VzZWQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgRSogbXBCYXNlOwotICAgIHNpemVfdCBtVXNlZDsKLSAgICBzaXplX3QgbVNpemU7Ci19OwotCi1jbGFzcyBFcnJvclNpbmsgewotcHVibGljOgotICAgIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcDsKLSAgICAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgICAgIHZlcnJvcihmbXQsIGFwKTsKLSAgICAgICAgdmFfZW5kKGFwKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5FcnJvclNpbmsoKSB7fQotICAgIHZpcnR1YWwgdm9pZCB2ZXJyb3IoY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFwKSA9IDA7Ci19OwotCi1jbGFzcyBDb21waWxlciA6IHB1YmxpYyBFcnJvclNpbmsgewotICAgIHR5cGVkZWYgaW50IHRva2VuaWRfdDsKLSAgICBlbnVtIFR5cGVUYWcgewotICAgICAgICBUWV9VTktOT1dOID0gICAgIC0xLAotICAgICAgICBUWV9JTlQsICAgICAgIC8vIDAKLSAgICAgICAgVFlfQ0hBUiwgICAgICAvLyAxCi0gICAgICAgIFRZX1NIT1JULCAgICAgLy8gMgotICAgICAgICBUWV9WT0lELCAgICAgIC8vIDMKLSAgICAgICAgVFlfRkxPQVQsICAgICAvLyA0Ci0gICAgICAgIFRZX0RPVUJMRSwgICAgLy8gNQotICAgICAgICBUWV9QT0lOVEVSLCAgIC8vIDYKLSAgICAgICAgVFlfQVJSQVksICAgICAvLyA3Ci0gICAgICAgIFRZX1NUUlVDVCwgICAgLy8gOAotICAgICAgICBUWV9GVU5DLCAgICAgIC8vIDkKLSAgICAgICAgVFlfUEFSQU0gICAgICAvLyAxMAotICAgIH07Ci0KLSAgICBlbnVtIFN0b3JhZ2VDbGFzcyB7Ci0gICAgICAgIFNDX0RFRkFVTFQsICAvLyAwCi0gICAgICAgIFNDX0FVVE8sICAgICAvLyAxCi0gICAgICAgIFNDX1JFR0lTVEVSLCAvLyAyCi0gICAgICAgIFNDX1NUQVRJQywgICAvLyAzCi0gICAgICAgIFNDX0VYVEVSTiwgICAvLyA0Ci0gICAgICAgIFNDX1RZUEVERUYgICAvLyA1Ci0gICAgfTsKLQotICAgIHN0cnVjdCBUeXBlIHsKLSAgICAgICAgVHlwZVRhZyB0YWc7Ci0gICAgICAgIFN0b3JhZ2VDbGFzcyAgc3RvcmFnZUNsYXNzOwotICAgICAgICB0b2tlbmlkX3QgaWQ7IC8vIEZvciBmdW5jdGlvbiBhcmd1bWVudHMsIGdsb2JhbCB2YXJzLCBsb2NhbCB2YXJzLCBzdHJ1Y3QgZWxlbWVudHMKLSAgICAgICAgdG9rZW5pZF90IHN0cnVjdFRhZzsgLy8gRm9yIHN0cnVjdHMgdGhlIG5hbWUgb2YgdGhlIHN0cnVjdAotICAgICAgICBpbnQgbGVuZ3RoOyAvLyBsZW5ndGggb2YgYXJyYXksIG9mZnNldCBvZiBzdHJ1Y3QgZWxlbWVudC4gLTEgbWVhbnMgc3RydWN0IGlzIGZvcndhcmQgZGVmaW5lZAotICAgICAgICBpbnQgYWxpZ25tZW50OyAvLyBmb3Igc3RydWN0cyBvbmx5Ci0gICAgICAgIFR5cGUqIHBIZWFkOyAvLyBGb3IgYSBzdHJ1Y3QgdGhpcyBpcyB0aGUgcHJvdG90eXBlIHN0cnVjdC4KLSAgICAgICAgVHlwZSogcFRhaWw7Ci0gICAgfTsKLQotICAgIGVudW0gRXhwcmVzc2lvblR5cGUgewotICAgICAgICBFVF9SVkFMVUUsCi0gICAgICAgIEVUX0xWQUxVRQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgRXhwcmVzc2lvblZhbHVlIHsKLSAgICAgICAgRXhwcmVzc2lvblZhbHVlKCkgewotICAgICAgICAgICAgZXQgPSBFVF9SVkFMVUU7Ci0gICAgICAgICAgICBwVHlwZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgRXhwcmVzc2lvblR5cGUgZXQ7Ci0gICAgICAgIFR5cGUqIHBUeXBlOwotICAgIH07Ci0KLSAgICBjbGFzcyBJQ29kZUJ1ZiB7Ci0gICAgcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JQ29kZUJ1ZigpIHt9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBpbml0KGludCBzaXplKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRFcnJvclNpbmsoRXJyb3JTaW5rKiBwRXJyb3JTaW5rKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvNChpbnQgbikgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgb2IoaW50IG4pID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkKiBnZXRCYXNlKCkgPSAwOwotICAgICAgICB2aXJ0dWFsIGludHB0cl90IGdldFNpemUoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50cHRyX3QgZ2V0UEMoKSA9IDA7Ci0gICAgICAgIC8vIENhbGwgdGhpcyBiZWZvcmUgdHJ5aW5nIHRvIG1vZGlmeSBjb2RlIGluIHRoZSBidWZmZXIuCi0gICAgICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpID0gMDsKLSAgICB9OwotCi0gICAgY2xhc3MgQ29kZUJ1ZiA6IHB1YmxpYyBJQ29kZUJ1ZiB7Ci0gICAgICAgIGNoYXIqIGluZDsgLy8gT3V0cHV0IGNvZGUgcG9pbnRlcgotICAgICAgICBjaGFyKiBwUHJvZ3JhbUJhc2U7Ci0gICAgICAgIEVycm9yU2luayogbUVycm9yU2luazsKLSAgICAgICAgaW50IG1TaXplOwotICAgICAgICBib29sIG1PdmVyZmxvd2VkOwotCi0gICAgICAgIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgICAgIGlmIChwUHJvZ3JhbUJhc2UgIT0gMCkgewotICAgICAgICAgICAgICAgIG11bm1hcChwUHJvZ3JhbUJhc2UsIG1TaXplKTsKLSAgICAgICAgICAgICAgICBwUHJvZ3JhbUJhc2UgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBjaGVjayhpbnQgbikgewotICAgICAgICAgICAgaW50IG5ld1NpemUgPSBpbmQgLSBwUHJvZ3JhbUJhc2UgKyBuOwotICAgICAgICAgICAgYm9vbCBvdmVyZmxvdyA9IG5ld1NpemUgPiBtU2l6ZTsKLSAgICAgICAgICAgIGlmIChvdmVyZmxvdyAmJiAhbU92ZXJmbG93ZWQpIHsKLSAgICAgICAgICAgICAgICBtT3ZlcmZsb3dlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKG1FcnJvclNpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgbUVycm9yU2luay0+ZXJyb3IoIkNvZGUgdG9vIGxhcmdlOiAlZCBieXRlcyIsIG5ld1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvdmVyZmxvdzsKLSAgICAgICAgfQotCi0gICAgcHVibGljOgotICAgICAgICBDb2RlQnVmKCkgewotICAgICAgICAgICAgcFByb2dyYW1CYXNlID0gMDsKLSAgICAgICAgICAgIGluZCA9IDA7Ci0gICAgICAgICAgICBtRXJyb3JTaW5rID0gMDsKLSAgICAgICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgICAgIG1PdmVyZmxvd2VkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIH5Db2RlQnVmKCkgewotICAgICAgICAgICAgcmVsZWFzZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGluaXQoaW50IHNpemUpIHsKLSAgICAgICAgICAgIHJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1TaXplID0gc2l6ZTsKLSAgICAgICAgICAgIHBQcm9ncmFtQmFzZSA9IChjaGFyKikgbW1hcChOVUxMLCBzaXplLCAKLSAgICAgICAgICAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCAKLSAgICAgICAgICAgICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKLSAgICAgICAgICAgIGluZCA9IHBQcm9ncmFtQmFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRFcnJvclNpbmsoRXJyb3JTaW5rKiBwRXJyb3JTaW5rKSB7Ci0gICAgICAgICAgICBtRXJyb3JTaW5rID0gcEVycm9yU2luazsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvNChpbnQgbikgewotICAgICAgICAgICAgaWYoY2hlY2soNCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqIChpbnQqKSBpbmQgPSBuOwotICAgICAgICAgICAgaW5kICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBPdXRwdXQgYSBieXRlLiBIYW5kbGVzIGFsbCB2YWx1ZXMsIDAuLmZmLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIG9iKGludCBuKSB7Ci0gICAgICAgICAgICBpZihjaGVjaygxKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICppbmQrKyA9IG47Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQqIGdldEJhc2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHZvaWQqKSBwUHJvZ3JhbUJhc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludHB0cl90IGdldFNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kIC0gcFByb2dyYW1CYXNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnRwdHJfdCBnZXRQQygpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50cHRyX3QpIGluZDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpIHt9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEEgY29kZSBnZW5lcmF0b3IgY3JlYXRlcyBhbiBpbi1tZW1vcnkgcHJvZ3JhbSwgZ2VuZXJhdGluZyB0aGUgY29kZSBvbgotICAgICAqIHRoZSBmbHkuIFRoZXJlIGlzIG9uZSBjb2RlIGdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgZWFjaCBzdXBwb3J0ZWQKLSAgICAgKiBhcmNoaXRlY3R1cmUuCi0gICAgICoKLSAgICAgKiBUaGUgY29kZSBnZW5lcmF0b3IgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIGFic3RyYWN0IG1hY2hpbmU6Ci0gICAgICogUjAgLSB0aGUgYWNjdW11bGF0b3IuCi0gICAgICogRlAgLSBhIGZyYW1lIHBvaW50ZXIgZm9yIGFjY2Vzc2luZyBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIGxvY2FsCi0gICAgICogICAgICB2YXJpYWJsZXMuCi0gICAgICogU1AgLSBhIHN0YWNrIHBvaW50ZXIgZm9yIHN0b3JpbmcgaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2hpbGUgZXZhbHVhdGluZwotICAgICAqICAgICAgZXhwcmVzc2lvbnMuIFRoZSBzdGFjayBwb2ludGVyIGdyb3dzIGRvd253YXJkcy4KLSAgICAgKgotICAgICAqIFRoZSBmdW5jdGlvbiBjYWxsaW5nIGNvbnZlbnRpb24gaXMgdGhhdCBhbGwgYXJndW1lbnRzIGFyZSBwbGFjZWQgb24gdGhlCi0gICAgICogc3RhY2sgc3VjaCB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBoYXMgdGhlIGxvd2VzdCBhZGRyZXNzLgotICAgICAqIEFmdGVyIHRoZSBjYWxsLCB0aGUgcmVzdWx0IGlzIGluIFIwLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgICAqIHJlbW92aW5nIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2suCi0gICAgICogVGhlIFIwIHJlZ2lzdGVyIGlzIG5vdCBzYXZlZCBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMuIFRoZQotICAgICAqIEZQIGFuZCBTUCByZWdpc3RlcnMgYXJlIHNhdmVkLgotICAgICAqLwotCi0gICAgY2xhc3MgQ29kZUdlbmVyYXRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBDb2RlR2VuZXJhdG9yKCkgewotICAgICAgICAgICAgbUVycm9yU2luayA9IDA7Ci0gICAgICAgICAgICBwQ29kZUJ1ZiA9IDA7Ci0gICAgICAgICAgICBwdXNoVHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3IoKSB7fQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBpbml0KElDb2RlQnVmKiBwQ29kZUJ1ZikgewotICAgICAgICAgICAgdGhpcy0+cENvZGVCdWYgPSBwQ29kZUJ1ZjsKLSAgICAgICAgICAgIHBDb2RlQnVmLT5zZXRFcnJvclNpbmsobUVycm9yU2luayk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0RXJyb3JTaW5rKEVycm9yU2luayogcEVycm9yU2luaykgewotICAgICAgICAgICAgbUVycm9yU2luayA9IHBFcnJvclNpbms7Ci0gICAgICAgICAgICBpZiAocENvZGVCdWYpIHsKLSAgICAgICAgICAgICAgICBwQ29kZUJ1Zi0+c2V0RXJyb3JTaW5rKG1FcnJvclNpbmspOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogR2l2ZSB0aGUgY29kZSBnZW5lcmF0b3Igc29tZSB1dGlsaXR5IHR5cGVzIHNvIGl0IGNhbgotICAgICAgICAgKiB1c2UgaXRzIG93biB0eXBlcyBhcyBuZWVkZWQgZm9yIHRoZSByZXN1bHRzIG9mIHNvbWUKLSAgICAgICAgICogb3BlcmF0aW9ucyBsaWtlIGdjbXAuCi0gICAgICAgICAqLwotCi0gICAgICAgIHZvaWQgc2V0VHlwZXMoVHlwZSogcEludCkgewotICAgICAgICAgICAgbWtwSW50ID0gcEludDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEVtaXQgYSBmdW5jdGlvbiBwcm9sb2cuCi0gICAgICAgICAqIHBEZWNsIGlzIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgd2hpY2ggZ2l2ZXMgdGhlIGFyZ3VtZW50cy4KLSAgICAgICAgICogU2F2ZSB0aGUgb2xkIHZhbHVlIG9mIHRoZSBGUC4KLSAgICAgICAgICogU2V0IHRoZSBuZXcgdmFsdWUgb2YgdGhlIEZQLgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gdGhlIG5hdGl2ZSBwbGF0Zm9ybSBjYWxsaW5nIGNvbnZlbnRpb24gdG8KLSAgICAgICAgICogb3VyIHN0YWNrLWJhc2VkIGNhbGxpbmcgY29udmVudGlvbi4gVGhpcyBtYXkgcmVxdWlyZQotICAgICAgICAgKiBwdXNoaW5nIGFyZ3VtZW50cyBmcm9tIHJlZ2lzdGVycyB0byB0aGUgc3RhY2suCi0gICAgICAgICAqIEFsbG9jYXRlICJOIiBieXRlcyBvZiBzdGFjayBzcGFjZS4gTiBpc24ndCBrbm93biB5ZXQsIHNvCi0gICAgICAgICAqIGp1c3QgZW1pdCB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBhZGp1c3RpbmcgdGhlIHN0YWNrLCBhbmQgcmV0dXJuCi0gICAgICAgICAqIHRoZSBhZGRyZXNzIHRvIHBhdGNoIHVwLiBUaGUgcGF0Y2hpbmcgd2lsbCBiZSBkb25lIGluCi0gICAgICAgICAqIGZ1bmN0aW9uRXhpdCgpLgotICAgICAgICAgKiByZXR1cm5zIGFkZHJlc3MgdG8gcGF0Y2ggd2l0aCBsb2NhbCB2YXJpYWJsZSBzaXplLgotICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBmdW5jdGlvbkVudHJ5KFR5cGUqIHBEZWNsKSA9IDA7Ci0KLSAgICAgICAgLyogRW1pdCBhIGZ1bmN0aW9uIGVwaWxvZy4KLSAgICAgICAgICogUmVzdG9yZSB0aGUgb2xkIFNQIGFuZCBGUCByZWdpc3RlciB2YWx1ZXMuCi0gICAgICAgICAqIFJldHVybiB0byB0aGUgY2FsbGluZyBmdW5jdGlvbi4KLSAgICAgICAgICogYXJnQ291bnQgLSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uCi0gICAgICAgICAqIGxvY2FsVmFyaWFibGVBZGRyZXNzIC0gcmV0dXJuZWQgZnJvbSBmdW5jdGlvbkVudHJ5KCkKLSAgICAgICAgICogbG9jYWxWYXJpYWJsZVNpemUgLSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmN0aW9uRXhpdChUeXBlKiBwRGVjbCwgaW50IGxvY2FsVmFyaWFibGVBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NhbFZhcmlhYmxlU2l6ZSkgPSAwOwotCi0gICAgICAgIC8qIGxvYWQgaW1tZWRpYXRlIHZhbHVlIHRvIFIwICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBsaShpbnQgaSkgPSAwOwotCi0gICAgICAgIC8qIExvYWQgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZnJvbSBnbG9iYWwgYWRkcmVzcy4gKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIGxvYWRGbG9hdChpbnQgYWRkcmVzcywgVHlwZSogcFR5cGUpID0gMDsKLQotICAgICAgICAvKiBBZGQgdGhlIHN0cnVjdCBvZmZzZXQgaW4gYnl0ZXMgdG8gUjAsIGNoYW5nZSB0aGUgdHlwZSB0byBwVHlwZSAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkU3RydWN0T2Zmc2V0UjAoaW50IG9mZnNldCwgVHlwZSogcFR5cGUpID0gMDsKLQotICAgICAgICAvKiBKdW1wIHRvIGEgdGFyZ2V0LCBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSB3b3JkIHRoYXQKLSAgICAgICAgICogaG9sZHMgdGhlIHRhcmdldCBkYXRhLCBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIGZpeGVkIHVwIGxhdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgZ2ptcChpbnQgdCkgPSAwOwotCi0gICAgICAgIC8qIFRlc3QgUjAgYW5kIGp1bXAgdG8gYSB0YXJnZXQgaWYgdGhlIHRlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqIGwgPSAwOiBqZSwgbCA9PSAxOiBqbmUKLSAgICAgICAgICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgdGhlIHRhcmdlZCBkYXRhLCBpbgotICAgICAgICAgKiBjYXNlIGl0IG5lZWRzIHRvIGJlIGZpeGVkIHVwIGxhdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgZ3RzdChib29sIGwsIGludCB0KSA9IDA7Ci0KLSAgICAgICAgLyogQ29tcGFyZSBUT1MgYWdhaW5zdCBSMCwgYW5kIHN0b3JlIHRoZSBib29sZWFuIHJlc3VsdCBpbiBSMC4KLSAgICAgICAgICogUG9wcyBUT1MuCi0gICAgICAgICAqIG9wIHNwZWNpZmllcyB0aGUgY29tcGFyaXNvbi4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnY21wKGludCBvcCkgPSAwOwotCi0gICAgICAgIC8qIFBlcmZvcm0gdGhlIGFyaXRobWV0aWMgb3Agc3BlY2lmaWVkIGJ5IG9wLiBUT1MgaXMgdGhlCi0gICAgICAgICAqIGxlZnQgYXJndW1lbnQsIFIwIGlzIHRoZSByaWdodCBhcmd1bWVudC4KLSAgICAgICAgICogUG9wcyBUT1MuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgZ2VuT3AoaW50IG9wKSA9IDA7Ci0KLSAgICAgICAgLyogQ29tcGFyZSAwIGFnYWluc3QgUjAsIGFuZCBzdG9yZSB0aGUgYm9vbGVhbiByZXN1bHQgaW4gUjAuCi0gICAgICAgICAqIG9wIHNwZWNpZmllcyB0aGUgY29tcGFyaXNvbi4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnVW5hcnlDbXAoaW50IG9wKSA9IDA7Ci0KLSAgICAgICAgLyogUGVyZm9ybSB0aGUgYXJpdGhtZXRpYyBvcCBzcGVjaWZpZWQgYnkgb3AuIDAgaXMgdGhlCi0gICAgICAgICAqIGxlZnQgYXJndW1lbnQsIFIwIGlzIHRoZSByaWdodCBhcmd1bWVudC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnZW5VbmFyeU9wKGludCBvcCkgPSAwOwotCi0gICAgICAgIC8qIFB1c2ggUjAgb250byB0aGUgc3RhY2suIChBbHNvIGtub3duIGFzICJkdXAiIGZvciBkdXBsaWNhdGUuKQotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hSMCgpID0gMDsKLQotICAgICAgICAvKiBUdXJuIFIwLCBUT1MgaW50byBSMCBUT1MgUjAgKi8KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgb3ZlcigpID0gMDsKLQotICAgICAgICAvKiBQb3AgUjAgZnJvbSB0aGUgc3RhY2suIChBbHNvIGtub3duIGFzICJkcm9wIikKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBwb3BSMCgpID0gMDsKLQotICAgICAgICAvKiBTdG9yZSBSMCB0byB0aGUgYWRkcmVzcyBzdG9yZWQgaW4gVE9TLgotICAgICAgICAgKiBUaGUgVE9TIGlzIHBvcHBlZC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZVIwVG9UT1MoKSA9IDA7Ci0KLSAgICAgICAgLyogTG9hZCBSMCBmcm9tIHRoZSBhZGRyZXNzIHN0b3JlZCBpbiBSMC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBsb2FkUjBGcm9tUjAoKSA9IDA7Ci0KLSAgICAgICAgLyogTG9hZCB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIHRvIFIwLgotICAgICAgICAgKiBJZiBlYSA8PSBMT0NBTCwgdGhlbiB0aGlzIGlzIGEgbG9jYWwgdmFyaWFibGUsIG9yIGFuCi0gICAgICAgICAqIGFyZ3VtZW50LCBhZGRyZXNzZWQgcmVsYXRpdmUgdG8gRlAuCi0gICAgICAgICAqIGVsc2UgaXQgaXMgYW4gYWJzb2x1dGUgZ2xvYmFsIGFkZHJlc3MuCi0gICAgICAgICAqCi0gICAgICAgICAqIGV0IGlzIEVUX1JWQUxVRSBmb3IgdGhpbmdzIGxpa2Ugc3RyaW5nIGNvbnN0YW50cywgRVRfTFZBTFVFIGZvcgotICAgICAgICAgKiB2YXJpYWJsZXMuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgbGVhUjAoaW50IGVhLCBUeXBlKiBwUG9pbnRlclR5cGUsIEV4cHJlc3Npb25UeXBlIGV0KSA9IDA7Ci0KLSAgICAgICAgLyogTG9hZCB0aGUgcGMtcmVsYXRpdmUgYWRkcmVzcyBvZiBhIGZvcndhcmQtcmVmZXJlbmNlZCB2YXJpYWJsZSB0byBSMC4KLSAgICAgICAgICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSA0LWJ5dGUgY29uc3RhbnQgc28gdGhhdCBpdCBjYW4gYmUgZmlsbGVkCi0gICAgICAgICAqIGluIGxhdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgbGVhRm9yd2FyZChpbnQgZWEsIFR5cGUqIHBQb2ludGVyVHlwZSkgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IFIwIHRvIHRoZSBnaXZlbiB0eXBlLgotICAgICAgICAgKi8KLQotICAgICAgICB2b2lkIGNvbnZlcnRSMChUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgY29udmVydFIwSW1wKHBUeXBlLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNhc3RSMChUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgY29udmVydFIwSW1wKHBUeXBlLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBjb252ZXJ0UjBJbXAoVHlwZSogcFR5cGUsIGJvb2wgaXNDYXN0KSA9IDA7Ci0KLSAgICAgICAgLyogRW1pdCBjb2RlIHRvIGFkanVzdCB0aGUgc3RhY2sgZm9yIGEgZnVuY3Rpb24gY2FsbC4gUmV0dXJuIHRoZQotICAgICAgICAgKiBsYWJlbCBmb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHRoYXQgYWRqdXN0cyB0aGUKLSAgICAgICAgICogc3RhY2sgc2l6ZS4gVGhpcyB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudCAiYSIgdG8KLSAgICAgICAgICogZW5kRnVuY3Rpb25DYWxsQXJndW1lbnRzLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgYmVnaW5GdW5jdGlvbkNhbGxBcmd1bWVudHMoKSA9IDA7Ci0KLSAgICAgICAgLyogRW1pdCBjb2RlIHRvIHN0b3JlIFIwIHRvIHRoZSBzdGFjayBhdCBieXRlIG9mZnNldCBsLgotICAgICAgICAgKiBSZXR1cm5zIHN0YWNrIHNpemUgb2Ygb2JqZWN0ICh0eXBpY2FsbHkgNCBvciA4IGJ5dGVzKQotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBzaXplX3Qgc3RvcmVSMFRvQXJnKGludCBsLCBUeXBlKiBwQXJnVHlwZSkgPSAwOwotCi0gICAgICAgIC8qIFBhdGNoIHRoZSBmdW5jdGlvbiBjYWxsIHByZWFtYmxlLgotICAgICAgICAgKiBhIGlzIHRoZSBhZGRyZXNzIHJldHVybmVkIGZyb20gYmVnaW5GdW5jdGlvbkNhbGxBcmd1bWVudHMKLSAgICAgICAgICogbCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBhcmd1bWVudHMgdG9vayBvbiB0aGUgc3RhY2suCi0gICAgICAgICAqIFR5cGljYWxseSB5b3Ugd291bGQgYWxzbyBlbWl0IGNvZGUgdG8gY29udmVydCB0aGUgYXJndW1lbnQKLSAgICAgICAgICogbGlzdCBpbnRvIHdoYXRldmVyIHRoZSBuYXRpdmUgZnVuY3Rpb24gY2FsbGluZyBjb252ZW50aW9uIGlzLgotICAgICAgICAgKiBPbiBBUk0gZm9yIGV4YW1wbGUgeW91IHdvdWxkIHBvcCB0aGUgZmlyc3QgNSBhcmd1bWVudHMgaW50bwotICAgICAgICAgKiBSMC4uUjQKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBlbmRGdW5jdGlvbkNhbGxBcmd1bWVudHMoVHlwZSogcERlY2wsIGludCBhLCBpbnQgbCkgPSAwOwotCi0gICAgICAgIC8qIEVtaXQgYSBjYWxsIHRvIGFuIHVua25vd24gZnVuY3Rpb24uIFRoZSBhcmd1bWVudCAic3ltYm9sIiBuZWVkcyB0bwotICAgICAgICAgKiBiZSBzdG9yZWQgaW4gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBhZGRyZXNzIHNob3VsZCBnby4gSXQgZm9ybXMKLSAgICAgICAgICogYSBjaGFpbi4gVGhlIGFkZHJlc3Mgd2lsbCBiZSBwYXRjaGVkIGxhdGVyLgotICAgICAgICAgKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHdvcmQgdGhhdCBoYXMgdG8gYmUgcGF0Y2hlZC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGNhbGxGb3J3YXJkKGludCBzeW1ib2wsIFR5cGUqIHBGdW5jKSA9IDA7Ci0KLSAgICAgICAgLyogQ2FsbCBhIGZ1bmN0aW9uIHBvaW50ZXIuIEwgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgYXJndW1lbnRzCi0gICAgICAgICAqIHRha2Ugb24gdGhlIHN0YWNrLiBUaGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaXMgc3RvcmVkIGF0Ci0gICAgICAgICAqIGxvY2F0aW9uIFNQICsgbC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsSW5kaXJlY3QoaW50IGwsIFR5cGUqIHBGdW5jKSA9IDA7Ci0KLSAgICAgICAgLyogQWRqdXN0IFNQIGFmdGVyIHJldHVybmluZyBmcm9tIGEgZnVuY3Rpb24gY2FsbC4gbCBpcyB0aGUKLSAgICAgICAgICogbnVtYmVyIG9mIGJ5dGVzIG9mIGFyZ3VtZW50cyBzdG9yZWQgb24gdGhlIHN0YWNrLiBpc0luZGlyZWN0Ci0gICAgICAgICAqIGlzIHRydWUgaWYgdGhpcyB3YXMgYW4gaW5kaXJlY3QgY2FsbC4gKEluIHdoaWNoIGNhc2UgdGhlCi0gICAgICAgICAqIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGlzIHN0b3JlZCBhdCBsb2NhdGlvbiBTUCArIGwuKQotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFN0YWNrQWZ0ZXJDYWxsKFR5cGUqIHBEZWNsLCBpbnQgbCwgYm9vbCBpc0luZGlyZWN0KSA9IDA7Ci0KLSAgICAgICAgLyogR2VuZXJhdGUgYSBzeW1ib2wgYXQgdGhlIGN1cnJlbnQgUEMuIHQgaXMgdGhlIGhlYWQgb2YgYQotICAgICAgICAgKiBsaW5rZWQgbGlzdCBvZiBhZGRyZXNzZXMgdG8gcGF0Y2guCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgZ3N5bShpbnQgdCkgPSAwOwotCi0gICAgICAgIC8qIFJlc29sdmUgYSBmb3J3YXJkIHJlZmVyZW5jZSBmdW5jdGlvbiBhdCB0aGUgY3VycmVudCBQQy4KLSAgICAgICAgICogdCBpcyB0aGUgaGVhZCBvZiBhCi0gICAgICAgICAqIGxpbmtlZCBsaXN0IG9mIGFkZHJlc3NlcyB0byBwYXRjaC4KLSAgICAgICAgICogKExpa2UgZ3N5bSwgYnV0IHVzaW5nIGFic29sdXRlIGFkZHJlc3MsIG5vdCBQQyByZWxhdGl2ZSBhZGRyZXNzLikKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCByZXNvbHZlRm9yd2FyZChpbnQgdCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIERvIGFueSBjbGVhbnVwIHdvcmsgcmVxdWlyZWQgYXQgdGhlIGVuZCBvZiBhIGNvbXBpbGUuCi0gICAgICAgICAqIEZvciBleGFtcGxlLCBhbiBpbnN0cnVjdGlvbiBjYWNoZSBtaWdodCBuZWVkIHRvIGJlCi0gICAgICAgICAqIGludmFsaWRhdGVkLgotICAgICAgICAgKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBmaW5pc2hDb21waWxlKCkgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGp1c3QgcmVsYXRpdmUgYnJhbmNoZXMgYnkgdGhpcyBhbW91bnQuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBqdW1wT2Zmc2V0KCkgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBNZW1vcnkgYWxpZ25tZW50IChpbiBieXRlcykgZm9yIHRoaXMgdHlwZSBvZiBkYXRhCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIHNpemVfdCBhbGlnbm1lbnRPZihUeXBlKiB0eXBlKSA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFycmF5IGVsZW1lbnQgYWxpZ25tZW50IChpbiBieXRlcykgZm9yIHRoaXMgdHlwZSBvZiBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBzaXplX3Qgc2l6ZU9mKFR5cGUqIHR5cGUpID0gMDsKLQotICAgICAgICB2aXJ0dWFsIFR5cGUqIGdldFIwVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXhwcmVzc2lvblN0YWNrLmJhY2soKS5wVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgRXhwcmVzc2lvblR5cGUgZ2V0UjBFeHByZXNzaW9uVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXhwcmVzc2lvblN0YWNrLmJhY2soKS5ldDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSMEV4cHJlc3Npb25UeXBlKEV4cHJlc3Npb25UeXBlIGV0KSB7Ci0gICAgICAgICAgICBtRXhwcmVzc2lvblN0YWNrLmJhY2soKS5ldCA9IGV0OwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0RXhwcmVzc2lvblN0YWNrRGVwdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4cHJlc3Npb25TdGFjay5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZm9yY2VSMFJWYWwoKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0UjBFeHByZXNzaW9uVHlwZSgpID09IEVUX0xWQUxVRSkgewotICAgICAgICAgICAgICAgIGxvYWRSMEZyb21SMCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE91dHB1dCBhIGJ5dGUuIEhhbmRsZXMgYWxsIHZhbHVlcywgMC4uZmYuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9iKGludCBuKSB7Ci0gICAgICAgICAgICBwQ29kZUJ1Zi0+b2Iobik7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG80KGludCBkYXRhKSB7Ci0gICAgICAgICAgICBwQ29kZUJ1Zi0+bzQoZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRwdHJfdCBnZXRCYXNlKCkgewotICAgICAgICAgICAgcmV0dXJuIChpbnRwdHJfdCkgcENvZGVCdWYtPmdldEJhc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludHB0cl90IGdldFBDKCkgewotICAgICAgICAgICAgcmV0dXJuIHBDb2RlQnVmLT5nZXRQQygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50cHRyX3QgZ2V0U2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBwQ29kZUJ1Zi0+Z2V0U2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmbHVzaCgpIHsKLSAgICAgICAgICAgIHBDb2RlQnVmLT5mbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlcnJvcihjb25zdCBjaGFyKiBmbXQsLi4uKSB7Ci0gICAgICAgICAgICB2YV9saXN0IGFwOwotICAgICAgICAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgICAgICAgICBtRXJyb3JTaW5rLT52ZXJyb3IoZm10LCBhcCk7Ci0gICAgICAgICAgICB2YV9lbmQoYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhc3NlcnRJbXBsKGJvb2wgdGVzdCwgaW50IGxpbmUpIHsKLSAgICAgICAgICAgIGlmICghdGVzdCkgewotICAgICAgICAgICAgICAgIGVycm9yKCJjb2RlIGdlbmVyYXRvciBhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgJXM6JWQuIiwgX19GSUxFX18sIGxpbmUpOwotICAgICAgICAgICAgICAgIExPR0QoImNvZGUgZ2VuZXJhdG9yIGFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSAlczolZC4iLCBfX0ZJTEVfXywgbGluZSk7Ci0gICAgICAgICAgICAgICAgKiAoY2hhciopIDAgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRSMFR5cGUoVHlwZSogcFR5cGUpIHsKLSAgICAgICAgICAgIGFzc2VydChwVHlwZSAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1FeHByZXNzaW9uU3RhY2suYmFjaygpLnBUeXBlID0gcFR5cGU7Ci0gICAgICAgICAgICBtRXhwcmVzc2lvblN0YWNrLmJhY2soKS5ldCA9IEVUX1JWQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UjBUeXBlKFR5cGUqIHBUeXBlLCBFeHByZXNzaW9uVHlwZSBldCkgewotICAgICAgICAgICAgYXNzZXJ0KHBUeXBlICE9IE5VTEwpOwotICAgICAgICAgICAgbUV4cHJlc3Npb25TdGFjay5iYWNrKCkucFR5cGUgPSBwVHlwZTsKLSAgICAgICAgICAgIG1FeHByZXNzaW9uU3RhY2suYmFjaygpLmV0ID0gZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlKiBnZXRUT1NUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHByZXNzaW9uU3RhY2tbbUV4cHJlc3Npb25TdGFjay5zaXplKCktMl0ucFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1c2hUeXBlKCkgewotICAgICAgICAgICAgaWYgKG1FeHByZXNzaW9uU3RhY2suc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbUV4cHJlc3Npb25TdGFjay5wdXNoX2JhY2sobUV4cHJlc3Npb25TdGFjay5iYWNrKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRXhwcmVzc2lvblN0YWNrLnB1c2hfYmFjayhFeHByZXNzaW9uVmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgb3ZlclR5cGUoKSB7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1FeHByZXNzaW9uU3RhY2suc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPj0gMikgewotICAgICAgICAgICAgICAgIG1FeHByZXNzaW9uU3RhY2sucHVzaF9iYWNrKG1FeHByZXNzaW9uU3RhY2suYmFjaygpKTsKLSAgICAgICAgICAgICAgICBtRXhwcmVzc2lvblN0YWNrW3NpemUtMV0gPSBtRXhwcmVzc2lvblN0YWNrW3NpemUtMl07Ci0gICAgICAgICAgICAgICAgbUV4cHJlc3Npb25TdGFja1tzaXplLTJdID0gbUV4cHJlc3Npb25TdGFja1tzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcG9wVHlwZSgpIHsKLSAgICAgICAgICAgIG1FeHByZXNzaW9uU3RhY2sucG9wX2JhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgYml0c1NhbWUoVHlwZSogcEEsIFR5cGUqIHBCKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sbGFwc2VUeXBlKHBBLT50YWcpID09IGNvbGxhcHNlVHlwZShwQi0+dGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIFR5cGVUYWcgY29sbGFwc2VUeXBlKFR5cGVUYWcgdGFnKSB7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgVHlwZVRhZyBjb2xsYXBzZWRUYWdbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgVFlfSU5ULAotICAgICAgICAgICAgICAgICAgICBUWV9JTlQsCi0gICAgICAgICAgICAgICAgICAgIFRZX0lOVCwKLSAgICAgICAgICAgICAgICAgICAgVFlfVk9JRCwKLSAgICAgICAgICAgICAgICAgICAgVFlfRkxPQVQsCi0gICAgICAgICAgICAgICAgICAgIFRZX0RPVUJMRSwKLSAgICAgICAgICAgICAgICAgICAgVFlfSU5ULAotICAgICAgICAgICAgICAgICAgICBUWV9JTlQsCi0gICAgICAgICAgICAgICAgICAgIFRZX1ZPSUQsCi0gICAgICAgICAgICAgICAgICAgIFRZX1ZPSUQsCi0gICAgICAgICAgICAgICAgICAgIFRZX1ZPSUQKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgcmV0dXJuIGNvbGxhcHNlZFRhZ1t0YWddOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZVRhZyBjb2xsYXBzZVR5cGVSMCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjb2xsYXBzZVR5cGUoZ2V0UjBUeXBlKCktPnRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgYm9vbCBpc0Zsb2F0VHlwZShUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIGlzRmxvYXRUYWcocFR5cGUtPnRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgYm9vbCBpc0Zsb2F0VGFnKFR5cGVUYWcgdGFnKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFnID09IFRZX0ZMT0FUIHx8IHRhZyA9PSBUWV9ET1VCTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgYm9vbCBpc1BvaW50ZXJUeXBlKFR5cGUqIHBUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNQb2ludGVyVGFnKHBUeXBlLT50YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGJvb2wgaXNQb2ludGVyVGFnKFR5cGVUYWcgdGFnKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFnID09IFRZX1BPSU5URVIgfHwgdGFnID09IFRZX0FSUkFZOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZSogZ2V0UG9pbnRlckFyaXRobWV0aWNSZXN1bHRUeXBlKFR5cGUqIGEsIFR5cGUqIGIpIHsKLSAgICAgICAgICAgIFR5cGVUYWcgYVRhZyA9IGEtPnRhZzsKLSAgICAgICAgICAgIFR5cGVUYWcgYlRhZyA9IGItPnRhZzsKLSAgICAgICAgICAgIGlmIChhVGFnID09IFRZX1BPSU5URVIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiVGFnID09IFRZX1BPSU5URVIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhVGFnID09IFRZX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGEtPnBUYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJUYWcgPT0gVFlfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYi0+cFRhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBUeXBlKiBta3BJbnQ7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBWZWN0b3I8RXhwcmVzc2lvblZhbHVlPiBtRXhwcmVzc2lvblN0YWNrOwotICAgICAgICBJQ29kZUJ1ZiogcENvZGVCdWY7Ci0gICAgICAgIEVycm9yU2luayogbUVycm9yU2luazsKLSAgICB9OwotCi0jaWZkZWYgUFJPVklERV9BUk1fQ09ERUdFTgotCi0gICAgc3RhdGljIHNpemVfdCByb3RhdGVSaWdodChzaXplX3Qgbiwgc2l6ZV90IHJvdGF0ZSkgewotICAgICAgICByZXR1cm4gKG4gPj4gcm90YXRlKSB8IChuIDw8ICgzMiAtIHJvdGF0ZSkpOwotICAgIH0KLQotICAgIHN0YXRpYyBzaXplX3Qgcm90YXRlTGVmdChzaXplX3Qgbiwgc2l6ZV90IHJvdGF0ZSkgewotICAgICAgICByZXR1cm4gKG4gPDwgcm90YXRlKSB8IChuID4+ICgzMiAtIHJvdGF0ZSkpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGVuY29kZTEyQml0SW1tZWRpYXRlKHNpemVfdCBpbW1lZGlhdGUsIHNpemVfdCogcFJlc3VsdCkgewotICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgc2l6ZV90IHJvdGF0ZSA9IGkgKiAyOwotICAgICAgICAgICAgc2l6ZV90IG1hc2sgPSByb3RhdGVSaWdodCgweGZmLCByb3RhdGUpOwotICAgICAgICAgICAgaWYgKChpbW1lZGlhdGUgfCBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGJpdHM4ID0gcm90YXRlTGVmdChpbW1lZGlhdGUsIHJvdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gYXNzZXJ0KGJpdHM4IDw9IDB4ZmYpOwotICAgICAgICAgICAgICAgICpwUmVzdWx0ID0gKGkgPDwgOCkgfCBiaXRzODsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdGljIHNpemVfdCBkZWNvZGUxMkJpdEltbWVkaWF0ZShzaXplX3QgaW1tZWRpYXRlKSB7Ci0gICAgICAgIHNpemVfdCBkYXRhID0gaW1tZWRpYXRlICYgMHhmZjsKLSAgICAgICAgc2l6ZV90IHJvdGF0ZSA9IDIgKiAoKGltbWVkaWF0ZSA+PiA4KSAmIDB4Zik7Ci0gICAgICAgIHJldHVybiByb3RhdGVSaWdodChkYXRhLCByb3RhdGUpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGlzUG93ZXJPZlR3byhzaXplX3QgbikgewotICAgICAgICByZXR1cm4gKG4gIT0gMCkgJiAoKG4gJiAobi0xKSkgPT0gMCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHNpemVfdCBsb2cyKHNpemVfdCBuKSB7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICB3aGlsZSAobiA+Pj0gMSkgewotICAgICAgICAgICAgcmVzdWx0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBjbGFzcyBBUk1Db2RlQnVmIDogcHVibGljIElDb2RlQnVmIHsKLSAgICAgICAgSUNvZGVCdWYqIG1wQmFzZTsKLSAgICAgICAgRXJyb3JTaW5rKiBtRXJyb3JTaW5rOwotCi0gICAgICAgIGNsYXNzIENpcmN1bGFyUXVldWUgewotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBTSVpFID0gMTY7IC8vIE11c3QgYmUgcG93ZXIgb2YgMgotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBNQVNLID0gU0laRS0xOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IG1CdWZbU0laRV07Ci0gICAgICAgICAgICBpbnQgbUhlYWQ7Ci0gICAgICAgICAgICBpbnQgbUNvdW50OwotCi0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIENpcmN1bGFyUXVldWUoKSB7Ci0gICAgICAgICAgICAgICAgbUhlYWQgPSAwOwotICAgICAgICAgICAgICAgIG1Db3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvaWQgcHVzaEJhY2sodW5zaWduZWQgaW50IGRhdGEpIHsKLSAgICAgICAgICAgICAgICBtQnVmWyhtSGVhZCArIG1Db3VudCkgJiBNQVNLXSA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgbUNvdW50ICs9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3BGcm9udCgpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gbUJ1ZlttSGVhZF07Ci0gICAgICAgICAgICAgICAgbUhlYWQgPSAobUhlYWQgKyAxKSAmIE1BU0s7Ci0gICAgICAgICAgICAgICAgbUNvdW50IC09IDE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCBwb3BCYWNrKGludCBuKSB7Ci0gICAgICAgICAgICAgICAgbUNvdW50IC09IG47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlubGluZSBpbnQgY291bnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db3VudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBlbXB0eSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvdW50ID09IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2wgZnVsbCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvdW50ID09IFNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSB2YWxpZCBpbmRleGVzIGFyZSAxIC0gY291bnQoKSB0byAwCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3BlcmF0b3JbXShpbnQgaSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQnVmWyhtSGVhZCArIG1Db3VudCArIGkpICYgTUFTS107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgQ2lyY3VsYXJRdWV1ZSBtUTsKLQotICAgICAgICB2b2lkIGVycm9yKGNvbnN0IGNoYXIqIGZtdCwuLi4pIHsKLSAgICAgICAgICAgIHZhX2xpc3QgYXA7Ci0gICAgICAgICAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICAgICAgICAgIG1FcnJvclNpbmstPnZlcnJvcihmbXQsIGFwKTsKLSAgICAgICAgICAgIHZhX2VuZChhcCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZsdXNoKCkgewotICAgICAgICAgICAgd2hpbGUgKCFtUS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbXBCYXNlLT5vNChtUS5wb3BGcm9udCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1wQmFzZS0+Zmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgcHVibGljOgotICAgICAgICBBUk1Db2RlQnVmKElDb2RlQnVmKiBwQmFzZSkgewotICAgICAgICAgICAgbXBCYXNlID0gcEJhc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIH5BUk1Db2RlQnVmKCkgewotICAgICAgICAgICAgZGVsZXRlIG1wQmFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgaW5pdChpbnQgc2l6ZSkgewotICAgICAgICAgICAgbXBCYXNlLT5pbml0KHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRFcnJvclNpbmsoRXJyb3JTaW5rKiBwRXJyb3JTaW5rKSB7Ci0gICAgICAgICAgICBtRXJyb3JTaW5rID0gcEVycm9yU2luazsKLSAgICAgICAgICAgIG1wQmFzZS0+c2V0RXJyb3JTaW5rKHBFcnJvclNpbmspOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBvNChpbnQgbikgewotICAgICAgICAgICAgaWYgKG1RLmZ1bGwoKSkgewotICAgICAgICAgICAgICAgIG1wQmFzZS0+bzQobVEucG9wRnJvbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUS5wdXNoQmFjayhuKTsKLQotI2lmbmRlZiBESVNBQkxFX0FSTV9QRUVQSE9MRQotICAgICAgICAgICAgLy8gUGVlcGhvbGUgY2hlY2sKLSAgICAgICAgICAgIGJvb2wgZGlkUGVlcDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG9wTWFzayA9IDB4MDFlMDAwMDA7Ci0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbW1lZGlhdGVNYXNrID0gMHgwMDAwMGZmZjsKLSAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEJNYXNrID0gMHgwMDQwMDAwMDsKLSAgICAgICAgICAgICAgICBkaWRQZWVwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKG1RLmNvdW50KCkgPj0gNCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhbmQgYnkgYSBzbWFsbCBjb25zdGFudAotICAgICAgICAgICAgICAgICAgICAvLyBwdXNoO21vdiAjaW1tO3BvcDtvcCA9PT4gb3AgI2ltbQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtUVstNF0gPT0gMHhlOTJkMDAwMSAgJiYgLy8gc3RtZmQgICAgcjEzISwge3IwfQotICAgICAgICAgICAgICAgICAgICAgICAgKG1RWy0zXSAmIH5pbW1lZGlhdGVNYXNrKSA9PSAweGUzYTAwMDAwICAmJiAvLyBtb3YgICAgcjAsICNYCi0gICAgICAgICAgICAgICAgICAgICAgICBtUVstMl0gPT0gMHhlOGJkMDAwMiAgJiYgLy8gbGRtZWEgICAgcjEzISwge3IxfQotICAgICAgICAgICAgICAgICAgICAgICAgKG1RWy0xXSAmIH5vcE1hc2spID09ICgweGUwODEwMDAwICYgfm9wTWFzaykpIHsgIC8vIE9QICAgIHIwLCByMSwgcjAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb3ZDb25zdCA9IG1RWy0zXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcCA9IG1RWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb21iaW5lZCA9IDB4ZTIwMDAwMDAgfCAob3AgJiBvcE1hc2spIHwgKG1vdkNvbnN0ICYgaW1tZWRpYXRlTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcHJpbnRmKHN0ZGVyciwgIm9wICV4IG1vdkNvbnN0ICV4IGNvbWJpbmVkICV4XG4iLCBvcCwgbW92Q29uc3QsIGNvbWJpbmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIChjb21iaW5lZCA9PSAweGUyODAwMDAwIHx8IGNvbWJpbmVkID09IDB4ZTI0MDAwMDApKSB7IC8vIGFkZC9zdWIgIzAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUS5wb3BCYWNrKDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1RLnB1c2hCYWNrKGNvbWJpbmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRQZWVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVEucG9wQmFjayg0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRQZWVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIExvYWQgbG9jYWwgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAvLyBzdWIgcjAscjExLCNpbW07bGRyL2xkcmIgcjAsW3IwXSAgPT0+IGxkci9sZHJiIHIwLCBbcjExLCMtaW1tXQotICAgICAgICAgICAgICAgIGlmIChtUS5jb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtUVstMl0gJiB+aW1tZWRpYXRlTWFzaykgPT0gMHhlMjRiMDAwMCkgeyAvLyBzdWIgcjAscjExLCNpbW0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBlbmNvZGVkSW1tZWRpYXRlID0gbVFbLTJdICYgaW1tZWRpYXRlTWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBsZCA9IG1RWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGQgJiB+Qk1hc2spID09IDB4ZTU5MDAwMDApIHsgLy8gbGRye2J9IHIwLCBbcjBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbWJpbmVkID0gZW5jb2RlZEltbWVkaWF0ZSB8ICgweEU1MUIwMDAwIHwgKGxkICYgQk1hc2spKTsgLy8gbGRyIHIwLCBbcjExLCAjLTBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVEucG9wQmFjaygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUS5wdXNoQmFjayhjb21iaW5lZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkUGVlcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxkID09IDB4ZWRkMDdhMDApIHsgIC8vIGxkY2wgICAgcDEwLCBjNywgW3IwLCAjMHgwMDBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlY29kZWRJbW1lZGlhdGUgPSBkZWNvZGUxMkJpdEltbWVkaWF0ZShlbmNvZGVkSW1tZWRpYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlZEltbWVkaWF0ZSA8PSAxMDIwICYmICgoZGVjb2RlZEltbWVkaWF0ZSAmIDMpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb21iaW5lZCA9IChkZWNvZGVkSW1tZWRpYXRlID4+IDIpIHwgMHhlZDViN2EwMDsgLy8gbGRjbCAgICBwMTAsIGM3LCBbcjExLCAjLTBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1RLnBvcEJhY2soMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1RLnB1c2hCYWNrKGNvbWJpbmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkUGVlcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ29uc3RhbnQgYXJyYXkgbG9va3VwCi0KLSAgICAgICAgICAgICAgICBpZiAobVEuY291bnQoKSA+PSA2ICYmCi0gICAgICAgICAgICAgICAgICAgIG1RWy02XSA9PSAweGU5MmQwMDAxICYmIC8vIHN0bWZkIHIxMyEsIHtyMH0KLSAgICAgICAgICAgICAgICAgICAgKG1RWy01XSAmIH5pbW1lZGlhdGVNYXNrKT09IDB4ZTNhMDAwMDAgJiYgLy8gbW92IHIwLCAjMHgwMDAwMDAwMQotICAgICAgICAgICAgICAgICAgICBtUVstNF0gPT0gMHhlOGJkMDAwMiAmJiAvLyBsZG1lYSByMTMhLCB7cjF9Ci0gICAgICAgICAgICAgICAgICAgIChtUVstM10gJiB+aW1tZWRpYXRlTWFzayk9PSAweGUzYTAyMDAwICYmIC8vIG1vdiByMiwgIzB4MDAwMDAwMDQKLSAgICAgICAgICAgICAgICAgICAgbVFbLTJdID09IDB4ZTAwMDAwOTIgJiYgLy8gbXVsIHIwLCByMiwgcjAKLSAgICAgICAgICAgICAgICAgICAgbVFbLTFdID09IDB4ZTA4MTAwMDApIHsgLy8gYWRkIHIwLCByMSwgcjAKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vdjEgPSBtUVstNV07Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb3YyID0gbVFbLTNdOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QxID0gZGVjb2RlMTJCaXRJbW1lZGlhdGUobW92MSk7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb25zdDIgPSBkZWNvZGUxMkJpdEltbWVkaWF0ZShtb3YyKTsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbWJvQ29uc3QgPSBjb25zdDEgKiBjb25zdDI7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbW1lZGlhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlMTJCaXRJbW1lZGlhdGUoY29tYm9Db25zdCwgJmltbWVkaWF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1RLnBvcEJhY2soNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWRkID0gaW1tZWRpYXRlIHwgMHhFMjgwMDAwMDsgLy8gYWRkIHIwLCByMCwgI24KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21ib0NvbnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVEucHVzaEJhY2soYWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZFBlZXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUG9pbnRlciBhcml0aG1ldGljIHdpdGggYSBzdHJpZGUgdGhhdCBpcyBhIHBvd2VyIG9mIHR3bwotCi0gICAgICAgICAgICAgICAgaWYgKG1RLmNvdW50KCkgPj0gMyAmJgotICAgICAgICAgICAgICAgICAgICAobVFbLTNdICYgfiBpbW1lZGlhdGVNYXNrKSA9PSAweGUzYTAyMDAwICYmICAvLyBtb3YgICAgcjIsICNzdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgIG1RWy0yXSA9PSAweGUwMDAwMDkyICYmIC8vIG11bCAgICByMCwgcjIsIHIwCi0gICAgICAgICAgICAgICAgICAgICBtUVstMV0gPT0gMHhlMDgxMDAwMCkgeyAgLy8gYWRkIHIwLCByMSwgcjAKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSA9IGRlY29kZTEyQml0SW1tZWRpYXRlKG1RWy0zXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1Bvd2VyT2ZUd28oc3RyaWRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVEucG9wQmFjaygzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhZGQgPSAweGUwODEwMDAwIHwgKGxvZzIoc3RyaWRlKSA8PCA3KTsgLy8gYWRkIHIwLCByMSwgcjAsIExTTCAjbG9nMihzdHJpZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBtUS5wdXNoQmFjayhhZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlkUGVlcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gd2hpbGUgKGRpZFBlZXApOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG9iKGludCBuKSB7Ci0gICAgICAgICAgICBlcnJvcigib2IoKSBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCogZ2V0QmFzZSgpIHsKLSAgICAgICAgICAgIGZsdXNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gbXBCYXNlLT5nZXRCYXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRwdHJfdCBnZXRTaXplKCkgewotICAgICAgICAgICAgZmx1c2goKTsKLSAgICAgICAgICAgIHJldHVybiBtcEJhc2UtPmdldFNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludHB0cl90IGdldFBDKCkgewotICAgICAgICAgICAgZmx1c2goKTsKLSAgICAgICAgICAgIHJldHVybiBtcEJhc2UtPmdldFBDKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgY2xhc3MgQVJNQ29kZUdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEFSTUNvZGVHZW5lcmF0b3IoKSB7Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgIC8vIExPR0QoIlVzaW5nIEFSTSBWRlAgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQuIik7Ci0jZWxzZQotICAgICAgICAgICAgLy8gTE9HRCgiVXNpbmcgQVJNIHNvZnQgZmxvYXRpbmcgcG9pbnQuIik7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgfkFSTUNvZGVHZW5lcmF0b3IoKSB7fQotCi0gICAgICAgIC8qIHJldHVybnMgYWRkcmVzcyB0byBwYXRjaCB3aXRoIGxvY2FsIHZhcmlhYmxlIHNpemUKLSAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgZnVuY3Rpb25FbnRyeShUeXBlKiBwRGVjbCkgewotICAgICAgICAgICAgbVN0YWNrVXNlID0gMDsKLSAgICAgICAgICAgIC8vIHNwIC0+IGFyZzQgYXJnNSAuLi4KLSAgICAgICAgICAgIC8vIFB1c2ggb3VyIHJlZ2lzdGVyLWJhc2VkIGFyZ3VtZW50cyBiYWNrIG9uIHRoZSBzdGFjawotICAgICAgICAgICAgaW50IHJlZ0FyZ0NvdW50ID0gY2FsY1JlZ0FyZ0NvdW50KHBEZWNsKTsKLSAgICAgICAgICAgIGlmIChyZWdBcmdDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBtU3RhY2tVc2UgKz0gcmVnQXJnQ291bnQgKiA0OwotICAgICAgICAgICAgICAgIG80KDB4RTkyRDAwMDAgfCAoKDEgPDwgcmVnQXJnQ291bnQpIC0gMSkpOyAvLyBzdG1mZCAgICBzcCEsIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzcCAtPiBhcmcwIGFyZzEgLi4uCi0gICAgICAgICAgICBvNCgweEU5MkQ0ODAwKTsgLy8gc3RtZmQgc3AhLCB7ZnAsIGxyfQotICAgICAgICAgICAgbVN0YWNrVXNlICs9IDIgKiA0OwotICAgICAgICAgICAgLy8gc3AsIGZwIC0+IG9sZGZwLCByZXRhZHIsIGFyZzAgYXJnMSAuLi4uCi0gICAgICAgICAgICBvNCgweEUxQTBCMDBEKTsgLy8gbW92ICAgIGZwLCBzcAotICAgICAgICAgICAgTE9HX1NUQUNLKCJmdW5jdGlvbkVudHJ5OiAlZFxuIiwgbVN0YWNrVXNlKTsKLSAgICAgICAgICAgIGludCBwYyA9IGdldFBDKCk7Ci0gICAgICAgICAgICBvNCgweEUyNEREMDAwKTsgLy8gc3ViICAgIHNwLCBzcCwgIyA8bG9jYWwgdmFyaWFibGVzPgotICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgbWFueSBsb2NhbCB2YXJpYWJsZXMgd2UgYXJlIGdvaW5nIHRvIHVzZSwKLSAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIHJvdW5kIHRoZSBhbGxvY2F0aW9uIHVwIHRvIGEgbXVsdGlwbGUgb2YKLSAgICAgICAgICAgIC8vIFNUQUNLX0FMSUdOTUVOVCwgc28gaXQgd29uJ3QgYWZmZWN0IHRoZSBzdGFjayBhbGlnbm1lbnQuCi0gICAgICAgICAgICByZXR1cm4gcGM7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZnVuY3Rpb25FeGl0KFR5cGUqIHBEZWNsLCBpbnQgbG9jYWxWYXJpYWJsZUFkZHJlc3MsIGludCBsb2NhbFZhcmlhYmxlU2l6ZSkgewotICAgICAgICAgICAgLy8gUm91bmQgbG9jYWwgdmFyaWFibGUgc2l6ZSB1cCB0byBhIG11bHRpcGxlIG9mIHN0YWNrIGFsaWdubWVudAotICAgICAgICAgICAgbG9jYWxWYXJpYWJsZVNpemUgPSAoKGxvY2FsVmFyaWFibGVTaXplICsgU1RBQ0tfQUxJR05NRU5UIC0gMSkgLwotICAgICAgICAgICAgICAgIFNUQUNLX0FMSUdOTUVOVCkgKiBTVEFDS19BTElHTk1FTlQ7Ci0gICAgICAgICAgICAvLyBQYXRjaCBsb2NhbCB2YXJpYWJsZSBhbGxvY2F0aW9uIGNvZGU6Ci0gICAgICAgICAgICBpZiAobG9jYWxWYXJpYWJsZVNpemUgPCAwIHx8IGxvY2FsVmFyaWFibGVTaXplID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoImxvY2FsVmFyaWFibGVzIG91dCBvZiByYW5nZTogJWQiLCBsb2NhbFZhcmlhYmxlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGNoYXIqKSAobG9jYWxWYXJpYWJsZUFkZHJlc3MpID0gbG9jYWxWYXJpYWJsZVNpemU7Ci0KLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFR5cGUqIHBSZXR1cm5UeXBlID0gcERlY2wtPnBIZWFkOwotICAgICAgICAgICAgICAgIHN3aXRjaChwUmV0dXJuVHlwZS0+dGFnKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFRTE3MEE5MCk7IC8vIGZtcnMgICAgcjAsIHMxNQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFQzUxMEIxNyk7IC8vIGZtcnJkIHIwLCByMSwgZDcKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIC8vIHNwIC0+IGxvY2FscyAuLi4uIGZwIC0+IG9sZGZwLCByZXRhZHIsIGFyZzAsIGFyZzEsIC4uLgotICAgICAgICAgICAgbzQoMHhFMUEwRTAwQik7IC8vIG1vdiBsciwgZnAKLSAgICAgICAgICAgIG80KDB4RTU5QkIwMDApOyAvLyBsZHIgZnAsIFtmcF0KLSAgICAgICAgICAgIG80KDB4RTI4RUQwMDQpOyAvLyBhZGQgc3AsIGxyLCAjNAotICAgICAgICAgICAgLy8gc3AgLT4gcmV0YWRyLCBhcmcwLCAuLi4KLSAgICAgICAgICAgIG80KDB4RThCRDQwMDApOyAvLyBsZG1mZCAgICBzcCEsIHtscn0KLSAgICAgICAgICAgIC8vIHNwIC0+IGFyZzAgLi4uLgotCi0gICAgICAgICAgICAvLyBXZSBzdG9yZSB0aGUgUEMgaW50byB0aGUgbHIgc28gd2UgY2FuIGFkanVzdCB0aGUgc3AgYmVmb3JlCi0gICAgICAgICAgICAvLyByZXR1cm5pbmcuIFdlIG5lZWQgdG8gcHVsbCBvZmYgdGhlIHJlZ2lzdGVycyB3ZSBwdXNoZWQKLSAgICAgICAgICAgIC8vIGVhcmxpZXIuIFdlIGRvbid0IG5lZWQgdG8gYWN0dWFsbHkgc3RvcmUgdGhlbSBhbnl3aGVyZSwKLSAgICAgICAgICAgIC8vIGp1c3QgYWRqdXN0IHRoZSBzdGFjay4KLSAgICAgICAgICAgIGludCByZWdBcmdDb3VudCA9IGNhbGNSZWdBcmdDb3VudChwRGVjbCk7Ci0gICAgICAgICAgICBpZiAocmVnQXJnQ291bnQpIHsKLSAgICAgICAgICAgICAgICBvNCgweEUyOEREMDAwIHwgKHJlZ0FyZ0NvdW50IDw8IDIpKTsgLy8gYWRkIHNwLCBzcCwgI2FyZ0NvdW50IDw8IDIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG80KDB4RTEyRkZGMUUpOyAvLyBieCBscgotICAgICAgICB9Ci0KLSAgICAgICAgLyogbG9hZCBpbW1lZGlhdGUgdmFsdWUgKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIGxpKGludCB0KSB7Ci0gICAgICAgICAgICBsaVJlZyh0LCAwKTsKLSAgICAgICAgICAgIHNldFIwVHlwZShta3BJbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGxvYWRGbG9hdChpbnQgYWRkcmVzcywgVHlwZSogcFR5cGUpIHsKLSAgICAgICAgICAgIHNldFIwVHlwZShwVHlwZSk7Ci0gICAgICAgICAgICAvLyBHbG9iYWwsIGFic29sdXRlIGFkZHJlc3MKLSAgICAgICAgICAgIG80KDB4RTU5RjAwMDApOyAvLyAgICAgICAgbGRyIHIwLCAuTDEKLSAgICAgICAgICAgIG80KDB4RUEwMDAwMDApOyAvLyAgICAgICAgYiAuTDk5Ci0gICAgICAgICAgICBvNChhZGRyZXNzKTsgICAgICAgICAvLyAuTDE6ICAgLndvcmQgZWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC5MOTk6Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocFR5cGUtPnRhZykgewotICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgIG80KDB4RUREMDdBMDApOyAgICAgIC8vIGZsZHMgICAgczE1LCBbcjBdCi0jZWxzZQotICAgICAgICAgICAgICAgIG80KDB4RTU5MDAwMDApOyAgICAgIC8vIGxkciByMCwgW3IwXQotI2VuZGlmCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgIG80KDB4RUQ5MDdCMDApOyAgICAgIC8vIGZsZGQgICAgZDcsIFtyMF0KLSNlbHNlCi0gICAgICAgICAgICAgICAgbzQoMHhFMUMwMDBEMCk7ICAgICAgLy8gbGRyZCByMCwgW3IwXQotI2VuZGlmCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGRTdHJ1Y3RPZmZzZXRSMChpbnQgb2Zmc2V0LCBUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgaWYgKG9mZnNldCkgewotICAgICAgICAgICAgICAgIHNpemVfdCBpbW1lZGlhdGUgPSAwOwotICAgICAgICAgICAgICAgIGlmIChlbmNvZGUxMkJpdEltbWVkaWF0ZShvZmZzZXQsICZpbW1lZGlhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTI4MDAwMDAgfCBpbW1lZGlhdGUpOyAvLyBhZGQgICAgcjAsIHIwLCAjb2Zmc2V0Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoInN0cnVjdHVyZSBvZmZzZXQgb3V0IG9mIHJhbmdlOiAlZCIsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UjBUeXBlKHBUeXBlLCBFVF9MVkFMVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgZ2ptcChpbnQgdCkgewotICAgICAgICAgICAgaW50IHBjID0gZ2V0UEMoKTsKLSAgICAgICAgICAgIG80KDB4RUEwMDAwMDAgfCBlbmNvZGVBZGRyZXNzKHQpKTsgLy8gYiAuTDMzCi0gICAgICAgICAgICByZXR1cm4gcGM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBsID0gMDogamUsIGwgPT0gMTogam5lICovCi0gICAgICAgIHZpcnR1YWwgaW50IGd0c3QoYm9vbCBsLCBpbnQgdCkgewotICAgICAgICAgICAgVHlwZSogcFIwVHlwZSA9IGdldFIwVHlwZSgpOwotICAgICAgICAgICAgVHlwZVRhZyB0YWdSMCA9IHBSMFR5cGUtPnRhZzsKLSAgICAgICAgICAgIHN3aXRjaCh0YWdSMCkgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfRkxPQVQ6Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFRUY1N0E0MCk7IC8vIGZjbXB6cyAgICBzMTUKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFRUYxRkExMCk7IC8vIGZtc3RhdAotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2lzX25vbl96ZXJvX2YpOwotICAgICAgICAgICAgICAgICAgICBvNCgweEUzNTAwMDAwKTsgLy8gY21wIHIwLCMwCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9ET1VCTEU6Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFRUI1N0I0MCk7IC8vIGZjbXB6ZCAgICBkNwotICAgICAgICAgICAgICAgICAgICBvNCgweEVFRjFGQTEwKTsgLy8gZm1zdGF0Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfaXNfbm9uX3plcm9fZCk7Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTM1MDAwMDApOyAvLyBjbXAgcjAsIzAKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBvNCgweEUzNTAwMDAwKTsgLy8gY21wIHIwLCMwCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGJyYW5jaCA9IGwgPyAweDFBMDAwMDAwIDogMHgwQTAwMDAwMDsgLy8gYm5lIDogYmVxCi0gICAgICAgICAgICBpbnQgcGMgPSBnZXRQQygpOwotICAgICAgICAgICAgbzQoYnJhbmNoIHwgZW5jb2RlQWRkcmVzcyh0KSk7Ci0gICAgICAgICAgICByZXR1cm4gcGM7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZ2NtcChpbnQgb3ApIHsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGUqIHBUT1NUeXBlID0gZ2V0VE9TVHlwZSgpOwotICAgICAgICAgICAgVHlwZVRhZyB0YWdSMCA9IGNvbGxhcHNlVHlwZShwUjBUeXBlLT50YWcpOwotICAgICAgICAgICAgVHlwZVRhZyB0YWdUT1MgPSBjb2xsYXBzZVR5cGUocFRPU1R5cGUtPnRhZyk7Ci0gICAgICAgICAgICBpZiAodGFnUjAgPT0gVFlfSU5UICYmIHRhZ1RPUyA9PSBUWV9JTlQpIHsKLSAgICAgICAgICAgICAgICBzZXR1cEludFB0ckFyZ3MoKTsKLSAgICAgICAgICAgICAgICBvNCgweEUxNTEwMDAwKTsgLy8gY21wIHIxLCByMQotICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgIGNhc2UgT1BfRVFVQUxTOgotICAgICAgICAgICAgICAgICAgICBvNCgweDAzQTAwMDAxKTsgLy8gbW92ZXEgcjAsIzEKLSAgICAgICAgICAgICAgICAgICAgbzQoMHgxM0EwMDAwMCk7IC8vIG1vdm5lIHIwLCMwCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT1BfTk9UX0VRVUFMUzoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHgwM0EwMDAwMCk7IC8vIG1vdmVxIHIwLCMwCi0gICAgICAgICAgICAgICAgICAgIG80KDB4MTNBMDAwMDEpOyAvLyBtb3ZuZSByMCwjMQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9QX0xFU1NfRVFVQUw6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RDNBMDAwMDEpOyAvLyBtb3ZsZSByMCwjMQotICAgICAgICAgICAgICAgICAgICBvNCgweEMzQTAwMDAwKTsgLy8gbW92Z3QgcjAsIzAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPUF9HUkVBVEVSOgotICAgICAgICAgICAgICAgICAgICBvNCgweEQzQTAwMDAwKTsgLy8gbW92bGUgcjAsIzAKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhDM0EwMDAwMSk7IC8vIG1vdmd0IHIwLCMxCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT1BfR1JFQVRFUl9FUVVBTDoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhBM0EwMDAwMSk7IC8vIG1vdmdlIHIwLCMxCi0gICAgICAgICAgICAgICAgICAgIG80KDB4QjNBMDAwMDApOyAvLyBtb3ZsdCByMCwjMAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9QX0xFU1M6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4QTNBMDAwMDApOyAvLyBtb3ZnZSByMCwjMAotICAgICAgICAgICAgICAgICAgICBvNCgweEIzQTAwMDAxKTsgLy8gbW92bHQgcjAsIzEKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVua25vd24gY29tcGFyaXNvbiBvcCAlZCIsIG9wKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh0YWdSMCA9PSBUWV9ET1VCTEUgfHwgdGFnVE9TID09IFRZX0RPVUJMRSkgewotICAgICAgICAgICAgICAgIHNldHVwRG91YmxlQXJncygpOwotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgbzQoMHhFRUI0NkJDNyk7IC8vICAgICAgICAgZmNtcGVkICAgIGQ2LCBkNwotICAgICAgICAgICAgICAgICAgIG80KDB4RUVGMUZBMTApOyAvLyBmbXN0YXQKLSAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICBjYXNlIE9QX0VRVUFMUzoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHgwM0EwMDAwMSk7IC8vIG1vdmVxIHIwLCMxCi0gICAgICAgICAgICAgICAgICAgIG80KDB4MTNBMDAwMDApOyAvLyBtb3ZuZSByMCwjMAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9QX05PVF9FUVVBTFM6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4MDNBMDAwMDApOyAvLyBtb3ZlcSByMCwjMAotICAgICAgICAgICAgICAgICAgICBvNCgweDEzQTAwMDAxKTsgLy8gbW92bmUgcjAsIzEKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPUF9MRVNTX0VRVUFMOgotICAgICAgICAgICAgICAgICAgICBvNCgweEQzQTAwMDAxKTsgLy8gbW92bGUgcjAsIzEKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhDM0EwMDAwMCk7IC8vIG1vdmd0IHIwLCMwCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT1BfR1JFQVRFUjoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhEM0EwMDAwMCk7IC8vIG1vdmxlIHIwLCMwCi0gICAgICAgICAgICAgICAgICAgIG80KDB4QzNBMDAwMDEpOyAvLyBtb3ZndCByMCwjMQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9QX0dSRUFURVJfRVFVQUw6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4QTNBMDAwMDEpOyAvLyBtb3ZnZSByMCwjMQotICAgICAgICAgICAgICAgICAgICBvNCgweEIzQTAwMDAwKTsgLy8gbW92bHQgcjAsIzAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPUF9MRVNTOgotICAgICAgICAgICAgICAgICAgICBvNCgweEEzQTAwMDAwKTsgLy8gbW92Z2UgcjAsIzAKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhCM0EwMDAwMSk7IC8vIG1vdmx0IHIwLCMxCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbmtub3duIGNvbXBhcmlzb24gb3AgJWQiLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfRVFVQUxTOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2NtcF9lcV9kZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9OT1RfRVFVQUxTOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2NtcF9uZV9kZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9MRVNTX0VRVUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2NtcF9sZV9kZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9HUkVBVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2NtcF9ndF9kZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9HUkVBVEVSX0VRVUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2NtcF9nZV9kZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9MRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2NtcF9sdF9kZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbmtub3duIGNvbXBhcmlzb24gb3AgJWQiLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0dXBGbG9hdEFyZ3MoKTsKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgIG80KDB4RUVCNDdBRTcpOyAvLyBmY21wZXMgczE0LCBzMTUKLSAgICAgICAgICAgICAgICAgICBvNCgweEVFRjFGQTEwKTsgLy8gZm1zdGF0Ci0gICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPUF9FUVVBTFM6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4MDNBMDAwMDEpOyAvLyBtb3ZlcSByMCwjMQotICAgICAgICAgICAgICAgICAgICBvNCgweDEzQTAwMDAwKTsgLy8gbW92bmUgcjAsIzAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPUF9OT1RfRVFVQUxTOgotICAgICAgICAgICAgICAgICAgICBvNCgweDAzQTAwMDAwKTsgLy8gbW92ZXEgcjAsIzAKLSAgICAgICAgICAgICAgICAgICAgbzQoMHgxM0EwMDAwMSk7IC8vIG1vdm5lIHIwLCMxCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT1BfTEVTU19FUVVBTDoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhEM0EwMDAwMSk7IC8vIG1vdmxlIHIwLCMxCi0gICAgICAgICAgICAgICAgICAgIG80KDB4QzNBMDAwMDApOyAvLyBtb3ZndCByMCwjMAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE9QX0dSRUFURVI6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RDNBMDAwMDApOyAvLyBtb3ZsZSByMCwjMAotICAgICAgICAgICAgICAgICAgICBvNCgweEMzQTAwMDAxKTsgLy8gbW92Z3QgcjAsIzEKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBPUF9HUkVBVEVSX0VRVUFMOgotICAgICAgICAgICAgICAgICAgICBvNCgweEEzQTAwMDAxKTsgLy8gbW92Z2UgcjAsIzEKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhCM0EwMDAwMCk7IC8vIG1vdmx0IHIwLCMwCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgT1BfTEVTUzoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhBM0EwMDAwMCk7IC8vIG1vdmdlIHIwLCMwCi0gICAgICAgICAgICAgICAgICAgIG80KDB4QjNBMDAwMDEpOyAvLyBtb3ZsdCByMCwjMQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5rbm93biBjb21wYXJpc29uIG9wICVkIiwgb3ApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0VRVUFMUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9jbXBfZXFfZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTk9UX0VRVUFMUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9jbXBfbmVfZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTEVTU19FUVVBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9jbXBfbGVfZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfR1JFQVRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9jbXBfZ3RfZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfR1JFQVRFUl9FUVVBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9jbXBfZ2VfZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTEVTUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9jbXBfbHRfZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5rbm93biBjb21wYXJpc29uIG9wICVkIiwgb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRSMFR5cGUobWtwSW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnZW5PcChpbnQgb3ApIHsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGUqIHBUT1NUeXBlID0gZ2V0VE9TVHlwZSgpOwotICAgICAgICAgICAgVHlwZVRhZyB0YWdSMCA9IHBSMFR5cGUtPnRhZzsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnVE9TID0gcFRPU1R5cGUtPnRhZzsKLSAgICAgICAgICAgIGJvb2wgaXNGbG9hdFIwID0gaXNGbG9hdFRhZyh0YWdSMCk7Ci0gICAgICAgICAgICBib29sIGlzRmxvYXRUT1MgPSBpc0Zsb2F0VGFnKHRhZ1RPUyk7Ci0gICAgICAgICAgICBpZiAoIWlzRmxvYXRSMCAmJiAhaXNGbG9hdFRPUykgewotICAgICAgICAgICAgICAgIHNldHVwSW50UHRyQXJncygpOwotICAgICAgICAgICAgICAgIGJvb2wgaXNQdHJSMCA9IGlzUG9pbnRlclRhZyh0YWdSMCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc1B0clRPUyA9IGlzUG9pbnRlclRhZyh0YWdUT1MpOwotICAgICAgICAgICAgICAgIGlmIChpc1B0clIwIHx8IGlzUHRyVE9TKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1B0clIwICYmIGlzUHRyVE9TKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgIT0gT1BfTUlOVVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5zdXBwb3J0ZWQgcG9pbnRlci1wb2ludGVyIG9wZXJhdGlvbiAlZC4iLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISB0eXBlRXF1YWwocFIwVHlwZSwgcFRPU1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkluY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGZvciBzdWJ0cmFjdGlvbi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RTA0MTAwMDApOyAvLyBzdWIgICAgIHIwLHIxLHIwCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRSMFR5cGUobWtwSW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gc2l6ZU9mKHBSMFR5cGUtPnBIZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoUjAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaShzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBPcHRpbWl6ZSBmb3IgcG93ZXItb2YtdHdvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbk9wKE9QX0RJVik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISAob3AgPT0gT1BfUExVUyB8fCAob3AgPT0gT1BfTUlOVVMgJiYgaXNQdHJSMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuc3VwcG9ydGVkIHBvaW50ZXItc2NhbGFyIG9wZXJhdGlvbiAlZCIsIG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUqIHBQdHJUeXBlID0gZ2V0UG9pbnRlckFyaXRobWV0aWNSZXN1bHRUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUjBUeXBlLCBwVE9TVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHNpemVPZihwUHRyVHlwZS0+cEhlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IE9wdGltaXplIGZvciBwb3dlci1vZi10d28uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlSZWcoc2l6ZSwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHRyUjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHgwRTAwMTAxOTIpOyAvLyBtdWwgICAgIHIxLHIyLHIxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHgwRTAwMDAwOTIpOyAvLyBtdWwgICAgIHIwLHIyLHIwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9QTFVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RTA4MTAwMDApOyAvLyBhZGQgICAgIHIwLHIxLHIwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9NSU5VUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvNCgweEUwNDEwMDAwKTsgLy8gc3ViICAgICByMCxyMSxyMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UjBUeXBlKHBQdHJUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9NVUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweDBFMDAwMDA5MSk7IC8vIG11bCAgICAgcjAscjEscjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9ESVY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfRElWKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9NT0Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfTU9EKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9QTFVTOgotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFMDgxMDAwMCk7IC8vIGFkZCAgICAgcjAscjEscjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9NSU5VUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RTA0MTAwMDApOyAvLyBzdWIgICAgIHIwLHIxLHIwCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hJRlRfTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RTFBMDAwMTEpOyAvLyBsc2wgICAgIHIwLHIxLHIwCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hJRlRfUklHSFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEUxQTAwMDUxKTsgLy8gYXNyICAgICByMCxyMSxyMAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0JJVF9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEUwMDEwMDAwKTsgLy8gYW5kICAgICByMCxyMSxyMAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0JJVF9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEUwMjEwMDAwKTsgLy8gZW9yICAgICByMCxyMSxyMAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0JJVF9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RTE4MTAwMDApOyAvLyBvcnIgICAgIHIwLHIxLHIwCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfQklUX05PVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RTFFMDAwMDApOyAvLyBtdm4gICAgIHIwLCByMAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuaW1wbGVtZW50ZWQgb3AgJWRcbiIsIG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUeXBlKiBwUmVzdWx0VHlwZSA9IHRhZ1IwID4gdGFnVE9TID8gcFIwVHlwZSA6IHBUT1NUeXBlOwotICAgICAgICAgICAgICAgIGlmIChwUmVzdWx0VHlwZS0+dGFnID09IFRZX0RPVUJMRSkgewotICAgICAgICAgICAgICAgICAgICBzZXR1cERvdWJsZUFyZ3MoKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9NVUw6Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUUyNjdCMDcpOyAvLyBmbXVsZCBkNywgZDYsIGQ3Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX29wX211bF9kZCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0RJVjoKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFRTg2N0IwNyk7IC8vIGZkaXZkIGQ3LCBkNiwgZDcKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfb3BfZGl2X2RkKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfUExVUzoKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFRTM2N0IwNyk7IC8vIGZhZGRkIGQ3LCBkNiwgZDcKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfb3BfYWRkX2RkKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTUlOVVM6Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUUzNjdCNDcpOyAvLyBmc3ViZCBkNywgZDYsIGQ3Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX29wX3N1Yl9kZCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuc3VwcG9ydGVkIGJpbmFyeSBmbG9hdGluZyBvcGVyYXRpb24gJWRcbiIsIG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0dXBGbG9hdEFyZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTVVMOgotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFNjc3QTI3KTsgLy8gZm11bHMgczE1LCBzMTQsIHMxNQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9vcF9tdWxfZmYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9ESVY6Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUVDNzdBMjcpOyAvLyBmZGl2cyBzMTUsIHMxNCwgczE1Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX29wX2Rpdl9mZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1BMVVM6Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUU3NzdBMjcpOyAvLyBmYWRkcyBzMTUsIHMxNCwgczE1Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX29wX2FkZF9mZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX01JTlVTOgotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFNzc3QTY3KTsgLy8gZnN1YnMgczE1LCBzMTQsIHMxNQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9vcF9zdWJfZmYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbnN1cHBvcnRlZCBiaW5hcnkgZmxvYXRpbmcgb3BlcmF0aW9uICVkXG4iLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRSMFR5cGUocFJlc3VsdFR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGdVbmFyeUNtcChpbnQgb3ApIHsKLSAgICAgICAgICAgIGlmIChvcCAhPSBPUF9MT0dJQ0FMX05PVCkgewotICAgICAgICAgICAgICAgIGVycm9yKCJVbmtub3duIHVuYXJ5IGNtcCAlZCIsIG9wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVHlwZSogcFIwVHlwZSA9IGdldFIwVHlwZSgpOwotICAgICAgICAgICAgICAgIFR5cGVUYWcgdGFnID0gY29sbGFwc2VUeXBlKHBSMFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RTNBMDEwMDApOyAvLyBtb3YgICAgcjEsICMwCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEUxNTEwMDAwKTsgLy8gY21wIHIxLCByMAotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHgwM0EwMDAwMSk7IC8vIG1vdmVxIHIwLCMxCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweDEzQTAwMDAwKTsgLy8gbW92bmUgcjAsIzAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFRjU3QTQwKTsgLy8gZmNtcHpzIHMxNQotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFRUYxRkExMCk7IC8vIGZtc3RhdAotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHgwM0EwMDAwMSk7IC8vIG1vdmVxIHIwLCMxCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweDEzQTAwMDAwKTsgLy8gbW92bmUgcjAsIzAKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfaXNfemVyb19mKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFQjU3QjQwKTsgLy8gZmNtcHpkIGQ3Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFRjFGQTEwKTsgLy8gZm1zdGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweDAzQTAwMDAxKTsgLy8gbW92ZXEgcjAsIzEKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4MTNBMDAwMDApOyAvLyBtb3ZuZSByMCwjMAotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9pc196ZXJvX2QpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJnVW5hcnlDbXAgdW5zdXBwb3J0ZWQgdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UjBUeXBlKG1rcEludCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZ2VuVW5hcnlPcChpbnQgb3ApIHsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnID0gY29sbGFwc2VUeXBlKHBSMFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX01JTlVTOgotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFM0EwMTAwMCk7ICAvLyBtb3YgICAgcjEsICMwCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEUwNDEwMDAwKTsgIC8vIHN1YiAgICAgcjAscjEscjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0JJVF9OT1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEUxRTAwMDAwKTsgIC8vIG12biAgICAgcjAsIHIwCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbmtub3duIHVuYXJ5IG9wICVkXG4iLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX01JTlVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gVFlfRkxPQVQpIHsKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFRjE3QTY3KTsgLy8gZm5lZ3MgICAgczE1LCBzMTUKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9vcF9uZWdfZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUVCMTdCNDcpOyAvLyBmbmVnZCAgICBkNywgZDcKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9vcF9uZWdfZCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0JJVF9OT1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkNhbid0IGFwcGx5ICd+JyBvcGVyYXRvciB0byBhIGZsb2F0IG9yIGRvdWJsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVua25vd24gdW5hcnkgb3AgJWRcbiIsIG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoImdlblVuYXJ5T3AgdW5zdXBwb3J0ZWQgdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoUjAoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHIwY3QgPSBjb2xsYXBzZVR5cGUocFIwVHlwZS0+dGFnKTsKLQotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICBzd2l0Y2ggKHIwY3QgKSB7Ci0gICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgIG80KDB4RUQ2RDdBMDEpOyAvLyBmc3RtZmRzICAgc3AhLHtzMTV9Ci0gICAgICAgICAgICAgICAgbVN0YWNrVXNlICs9IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICBvNCgweEVEMkQ3QjAyKTsgLy8gZnN0bWZkZCAgIHNwISx7ZDd9Ci0gICAgICAgICAgICAgICAgbVN0YWNrVXNlICs9IDg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG80KDB4RTkyRDAwMDEpOyAgLy8gc3RtZmQgICBzcCEse3IwfQotICAgICAgICAgICAgICAgIG1TdGFja1VzZSArPSA0OwotICAgICAgICAgICAgfQotI2Vsc2UKLQotICAgICAgICAgICAgaWYgKHIwY3QgIT0gVFlfRE9VQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTkyRDAwMDEpOyAgLy8gc3RtZmQgICBzcCEse3IwfQotICAgICAgICAgICAgICAgICAgICBtU3RhY2tVc2UgKz0gNDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTkyRDAwMDMpOyAgLy8gc3RtZmQgICBzcCEse3IwLHIxfQotICAgICAgICAgICAgICAgICAgICBtU3RhY2tVc2UgKz0gODsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgcHVzaFR5cGUoKTsKLSAgICAgICAgICAgIExPR19TVEFDSygicHVzaFIwOiAlZFxuIiwgbVN0YWNrVXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvdmVyKCkgewotICAgICAgICAgICAgLy8gV2Uga25vdyBpdCdzIG9ubHkgdXNlZCBmb3IgaW50LXB0ciBvcHMgKCsrLy0tKQotCi0gICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHIwY3QgPSBjb2xsYXBzZVR5cGUocFIwVHlwZS0+dGFnKTsKLQotICAgICAgICAgICAgVHlwZSogcFRPU1R5cGUgPSBnZXRUT1NUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHRvc2N0ID0gY29sbGFwc2VUeXBlKHBUT1NUeXBlLT50YWcpOwotCi0gICAgICAgICAgICBhc3NlcnQgKHIwY3QgPT0gVFlfSU5UICAmJiB0b3NjdCA9PSBUWV9JTlQpOwotCi0gICAgICAgICAgICBvNCgweEU4QkQwMDAyKTsgIC8vIGxkbWZkICAgc3AhLHtyMX0KLSAgICAgICAgICAgIG80KDB4RTkyRDAwMDEpOyAgLy8gc3RtZmQgICBzcCEse3IwfQotICAgICAgICAgICAgbzQoMHhFOTJEMDAwMik7ICAvLyBzdG1mZCAgIHNwISx7cjF9Ci0gICAgICAgICAgICBvdmVyVHlwZSgpOwotICAgICAgICAgICAgbVN0YWNrVXNlICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wUjAoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwVE9TVHlwZSA9IGdldFRPU1R5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdG9zY3QgPSBjb2xsYXBzZVR5cGUocFRPU1R5cGUtPnRhZyk7Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgIGlmICh0b3NjdCA9PSBUWV9GTE9BVCB8fCB0b3NjdCA9PSBUWV9ET1VCTEUpIHsKLSAgICAgICAgICAgICAgICBlcnJvcigiVW5zdXBwb3J0ZWQgcG9wUjAgZmxvYXQvZG91YmxlIik7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIHN3aXRjaCAodG9zY3QpewotICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgIGNhc2UgVFlfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RThCRDAwMDEpOyAgLy8gbGRtZmQgICBzcCEse3IwfQotICAgICAgICAgICAgICAgICAgICBtU3RhY2tVc2UgLT0gNDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RThCRDAwMDMpOyAgLy8gbGRtZmQgICBzcCEse3IwLCByMX0gIC8vIFJlc3RvcmUgUjAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFja1VzZSAtPSA4OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigiQ2FuJ3QgcG9wIHRoaXMgdHlwZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3BUeXBlKCk7Ci0gICAgICAgICAgICBMT0dfU1RBQ0soInBvcFIwOiAlZFxuIiwgbVN0YWNrVXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZVIwVG9UT1MoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUG9pbnRlclR5cGUgPSBnZXRUT1NUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnQocFBvaW50ZXJUeXBlLT50YWcgPT0gVFlfUE9JTlRFUik7Ci0gICAgICAgICAgICBUeXBlKiBwRGVzdFR5cGUgPSBwUG9pbnRlclR5cGUtPnBIZWFkOwotICAgICAgICAgICAgY29udmVydFIwKHBEZXN0VHlwZSk7Ci0gICAgICAgICAgICBvNCgweEU4QkQwMDA0KTsgIC8vIGxkbWZkICAgc3AhLHtyMn0KLSAgICAgICAgICAgIHBvcFR5cGUoKTsKLSAgICAgICAgICAgIG1TdGFja1VzZSAtPSA0OwotICAgICAgICAgICAgc3dpdGNoIChwRGVzdFR5cGUtPnRhZykgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfUE9JTlRFUjoKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFNTgyMDAwMCk7IC8vIHN0ciByMCwgW3IyXQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgIG80KDB4RURDMjdBMDApOyAvLyBmc3RzICAgIHMxNSwgW3IyLCAjMF0KLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIG80KDB4RTU4MjAwMDApOyAvLyBzdHIgcjAsIFtyMl0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICBvNCgweEUxQzIwMEIwKTsgLy8gc3RyaCByMCwgW3IyXQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0NIQVI6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTVDMjAwMDApOyAvLyBzdHJiIHIwLCBbcjJdCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgIG80KDB4RUQ4MjdCMDApOyAvLyBmc3RkICAgIGQ3LCBbcjIsICMwXQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFMUMyMDBGMCk7IC8vIHN0cmQgcjAsIFtyMl0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1NUUlVDVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gc2l6ZU9mKHBEZXN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlSZWcoc2l6ZSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfc3RydWN0Q29weSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJzdG9yZVIwVG9UT1M6IHVuaW1wbGVtZW50ZWQgdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlc3RUeXBlLT50YWcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFIwVHlwZShwRGVzdFR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGxvYWRSMEZyb21SMCgpIHsKLSAgICAgICAgICAgIFR5cGUqIHBQb2ludGVyVHlwZSA9IGdldFIwVHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0KHBQb2ludGVyVHlwZS0+dGFnID09IFRZX1BPSU5URVIpOwotICAgICAgICAgICAgVHlwZSogcE5ld1R5cGUgPSBwUG9pbnRlclR5cGUtPnBIZWFkOwotICAgICAgICAgICAgVHlwZVRhZyB0YWcgPSBwTmV3VHlwZS0+dGFnOwotICAgICAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTU5MDAwMDApOyAvLyBsZHIgcjAsIFtyMF0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgICAgICBvNCgweEVERDA3QTAwKTsgLy8gZmxkcyAgICBzMTUsIFtyMCwgIzBdCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICBvNCgweEU1OTAwMDAwKTsgLy8gbGRyIHIwLCBbcjBdCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFMUQwMDBGMCk7IC8vIGxkcnNoIHIwLCBbcjBdCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfQ0hBUjoKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFNUQwMDAwMCk7IC8vIGxkcmIgcjAsIFtyMF0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9ET1VCTEU6Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFRDkwN0IwMCk7IC8vIGZsZGQgICAgZDcsIFtyMCwgIzBdCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICBvNCgweEUxQzAwMEQwKTsgLy8gbGRyZCAgIHIwLCBbcjBdCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9BUlJBWToKLSAgICAgICAgICAgICAgICAgICAgcE5ld1R5cGUgPSBwTmV3VHlwZS0+cFRhaWw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfU1RSVUNUOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigibG9hZFIwRnJvbVIwOiB1bmltcGxlbWVudGVkIHR5cGUgJWQiLCB0YWcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFIwVHlwZShwTmV3VHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgbGVhUjAoaW50IGVhLCBUeXBlKiBwUG9pbnRlclR5cGUsIEV4cHJlc3Npb25UeXBlIGV0KSB7Ci0gICAgICAgICAgICBpZiAoZWEgPiAtTE9DQUwgJiYgZWEgPCBMT0NBTCkgewotICAgICAgICAgICAgICAgIC8vIExvY2FsLCBmcCByZWxhdGl2ZQotCi0gICAgICAgICAgICAgICAgc2l6ZV90IGltbWVkaWF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgYm9vbCBpblJhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGVhIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpblJhbmdlID0gZW5jb2RlMTJCaXRJbW1lZGlhdGUoLWVhLCAmaW1tZWRpYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFMjRCMDAwMCB8IGltbWVkaWF0ZSk7IC8vIHN1YiAgICByMCwgZnAsICNlYQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGluUmFuZ2UgPSBlbmNvZGUxMkJpdEltbWVkaWF0ZShlYSwgJmltbWVkaWF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTI4QjAwMDAgfCBpbW1lZGlhdGUpOyAvLyBhZGQgICAgcjAsIGZwLCAjZWEKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCEgaW5SYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBlcnJvcigiT2Zmc2V0IG91dCBvZiByYW5nZTogJTA4eCIsIGVhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEdsb2JhbCwgYWJzb2x1dGUuCi0gICAgICAgICAgICAgICAgbzQoMHhFNTlGMDAwMCk7IC8vICAgICAgICBsZHIgICAgcjAsIC5MMQotICAgICAgICAgICAgICAgIG80KDB4RUEwMDAwMDApOyAvLyAgICAgICAgYiAuTDk5Ci0gICAgICAgICAgICAgICAgbzQoZWEpOyAgICAgICAgIC8vIC5MMTogICAud29yZCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC5MOTk6Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRSMFR5cGUocFBvaW50ZXJUeXBlLCBldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludCBsZWFGb3J3YXJkKGludCBlYSwgVHlwZSogcFBvaW50ZXJUeXBlKSB7Ci0gICAgICAgICAgICBzZXRSMFR5cGUocFBvaW50ZXJUeXBlKTsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBlYTsKLSAgICAgICAgICAgIGludCBwYyA9IGdldFBDKCk7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGlmIChlYSkgewotICAgICAgICAgICAgICAgIG9mZnNldCA9IChwYyAtIGVhIC0gOCkgPj4gMjsKLSAgICAgICAgICAgICAgICBpZiAoKG9mZnNldCAmIDB4ZmZmZikgIT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJmdW5jdGlvbiBmb3J3YXJkIHJlZmVyZW5jZSBvdXQgb2YgYm91bmRzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbzQoMHhFNTlGMDAwMCB8IG9mZnNldCk7IC8vICAgICAgICBsZHIgICAgcjAsIC5MMQotCi0gICAgICAgICAgICBpZiAoZWEgPT0gMCkgewotICAgICAgICAgICAgICAgIG80KDB4RUEwMDAwMDApOyAvLyAgICAgICAgYiAuTDk5Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0UEMoKTsKLSAgICAgICAgICAgICAgICBvNChlYSk7ICAgICAgICAgLy8gLkwxOiAgIC53b3JkIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuTDk5OgotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBjb252ZXJ0UjBJbXAoVHlwZSogcFR5cGUsIGJvb2wgaXNDYXN0KXsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChpc1BvaW50ZXJUeXBlKHBUeXBlKSAmJiBpc1BvaW50ZXJUeXBlKHBSMFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgVHlwZSogcEEgPSBwUjBUeXBlOwotICAgICAgICAgICAgICAgIFR5cGUqIHBCID0gcFR5cGU7Ci0gICAgICAgICAgICAgICAgLy8gQXJyYXkgZGVjYXlzIHRvIHBvaW50ZXIKLSAgICAgICAgICAgICAgICBpZiAocEEtPnRhZyA9PSBUWV9BUlJBWSAmJiBwQi0+dGFnID09IFRZX1BPSU5URVIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEEgPSBwQS0+cFRhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghICh0eXBlRXF1YWwocEEsIHBCKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcEItPnBIZWFkLT50YWcgPT0gVFlfVk9JRAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBBLT50YWcgPT0gVFlfUE9JTlRFUiAmJiBwQi0+dGFnID09IFRZX1BPSU5URVIgJiYgaXNDYXN0KQotICAgICAgICAgICAgICAgICAgICApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJJbmNvbXBhdGlibGUgcG9pbnRlciBvciBhcnJheSB0eXBlcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0c1NhbWUocFR5cGUsIHBSMFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyBzcGVjaWFsCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFR5cGVUYWcgcjBUYWcgPSBjb2xsYXBzZVR5cGUocFIwVHlwZS0+dGFnKTsKLSAgICAgICAgICAgICAgICBUeXBlVGFnIGRlc3RUYWcgPSBjb2xsYXBzZVR5cGUocFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHIwVGFnID09IFRZX0lOVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdFRhZyA9PSBUWV9GTE9BVCkgewotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFMDcwQTkwKTsgLy8gZm1zciAgICBzMTUsIHIwCi0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFRjg3QUU3KTsgLy8gZnNpdG9zIHMxNSwgczE1Ci0KLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfaW50X3RvX2Zsb2F0KTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlc3RUYWcgPT0gVFlfRE9VQkxFKTsKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFRTA3MEE5MCk7IC8vIGZtc3IgczE1LCByMAotICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFRUI4N0JFNyk7IC8vIGZzaXRvZCBkNywgczE1Ci0KLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfaW50X3RvX2RvdWJsZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocjBUYWcgPT0gVFlfRkxPQVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RUYWcgPT0gVFlfSU5UKSB7Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUVGRDdBRTcpOyAvLyBmdG9zaXpzIHMxNSwgczE1Ci0gICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFMTcwQTkwKTsgLy8gZm1ycyByMCwgczE1Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2Zsb2F0X3RvX2ludCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChkZXN0VGFnID09IFRZX0RPVUJMRSk7Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUVCNzdBRTcpOyAvLyBmY3Z0ZHMgICAgZDcsIHMxNQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9mbG9hdF90b19kb3VibGUpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocjBUYWcgPT0gVFlfRE9VQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdFRhZyA9PSBUWV9JTlQpIHsKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG80KDB4RUVGRDdCQzcpOyAvLyBmdG9zaXpkIHMxNSwgZDcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvNCgweEVFMTcwQTkwKTsgLy8gZm1ycyByMCwgczE1Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9kb3VibGVfdG9faW50KTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZXN0VGFnID09IFRZX0ZMT0FUKSB7Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzQoMHhFRUY3N0JDNyk7IC8vIGZjdnRzZCBzMTUsIGQ3Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfZG91YmxlX3RvX2Zsb2F0KTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZVR5cGVzKHBSMFR5cGUsIHBUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBhdGlibGVUeXBlcyhwUjBUeXBlLCBwVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRSMFR5cGUocFR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgYmVnaW5GdW5jdGlvbkNhbGxBcmd1bWVudHMoKSB7Ci0gICAgICAgICAgICBpbnQgcGMgPSBnZXRQQygpOwotICAgICAgICAgICAgbzQoMHhFMjREREYwMCk7IC8vIFBsYWNlaG9sZGVyIHN1YiAgc3AsIHNwLCAjMAotICAgICAgICAgICAgcmV0dXJuIHBjOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBzaXplX3Qgc3RvcmVSMFRvQXJnKGludCBsLCBUeXBlKiBwQXJnVHlwZSkgewotICAgICAgICAgICAgY29udmVydFIwKHBBcmdUeXBlKTsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgcjBjdCA9IGNvbGxhcHNlVHlwZShwUjBUeXBlLT50YWcpOwotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICBzd2l0Y2gocjBjdCkgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgICAgICBpZiAobCA8IDAgfHwgbCA+IDQwOTYtNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoImwgb3V0IG9mIHJhbmdlIGZvciBzdGFjayBvZmZzZXQ6IDB4JTA4eCIsIGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTU4RDAwMDAgfCBsKTsgLy8gc3RyIHIwLCBbc3AsICNsXQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBpZiAobCA8IDAgfHwgbCA+IDEwMjAgfHwgKGwgJiAzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoImwgb3V0IG9mIHJhbmdlIGZvciBzdGFjayBvZmZzZXQ6IDB4JTA4eCIsIGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RURDRDdBMDAgfCAobCA+PiAyKSk7IC8vIGZzdHMgICAgczE1LCBbc3AsICNsXQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0RPVUJMRTogewotICAgICAgICAgICAgICAgICAgICAvLyBBbGlnbiB0byA4IGJ5dGUgYm91bmRhcnkKLSAgICAgICAgICAgICAgICAgICAgaW50IGwyID0gKGwgKyA3KSAmIH43OwotICAgICAgICAgICAgICAgICAgICBpZiAobDIgPCAwIHx8IGwyID4gMTAyMCB8fCAobDIgJiAzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoImwgb3V0IG9mIHJhbmdlIGZvciBzdGFjayBvZmZzZXQ6IDB4JTA4eCIsIGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RUQ4RDdCMDAgfCAobDIgPj4gMikpOyAvLyBmc3RkICAgIGQ3LCBbc3AsICNsMl0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsMiAtIGwpICsgODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgc3dpdGNoKHIwY3QpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0lOVDoKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBpZiAobCA8IDAgfHwgbCA+IDQwOTYtNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoImwgb3V0IG9mIHJhbmdlIGZvciBzdGFjayBvZmZzZXQ6IDB4JTA4eCIsIGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RTU4RDAwMDAgKyBsKTsgLy8gc3RyIHIwLCBbc3AsICNsXQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0RPVUJMRTogewotICAgICAgICAgICAgICAgICAgICAvLyBBbGlnbiB0byA4IGJ5dGUgYm91bmRhcnkKLSAgICAgICAgICAgICAgICAgICAgaW50IGwyID0gKGwgKyA3KSAmIH43OwotICAgICAgICAgICAgICAgICAgICBpZiAobDIgPCAwIHx8IGwyID4gNDA5Ni04KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigibCBvdXQgb2YgcmFuZ2UgZm9yIHN0YWNrIG9mZnNldDogMHglMDh4IiwgbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFNThEMDAwMCArIGwyKTsgLy8gc3RyIHIwLCBbc3AsICNsXQotICAgICAgICAgICAgICAgICAgICBvNCgweEU1OEQxMDAwICsgbDIgKyA0KTsgLy8gc3RyIHIxLCBbc3AsICNsKzRdCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobDIgLSBsKSArIDg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZW5kRnVuY3Rpb25DYWxsQXJndW1lbnRzKFR5cGUqIHBEZWNsLCBpbnQgYSwgaW50IGwpIHsKLSAgICAgICAgICAgIGludCBhcmd1bWVudFN0YWNrVXNlID0gbDsKLSAgICAgICAgICAgIC8vIEhhdmUgdG8gY2FsY3VsYXRlIHJlZ2lzdGVyIGFyZyBjb3VudCBmcm9tIGFjdHVhbCBzdGFjayBzaXplLAotICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gcHJvcGVybHkgaGFuZGxlIC4uLiBmdW5jdGlvbnMuCi0gICAgICAgICAgICBpbnQgcmVnQXJnQ291bnQgPSBsID4+IDI7Ci0gICAgICAgICAgICBpZiAocmVnQXJnQ291bnQgPiA0KSB7Ci0gICAgICAgICAgICAgICAgcmVnQXJnQ291bnQgPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlZ0FyZ0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIGFyZ3VtZW50U3RhY2tVc2UgLT0gcmVnQXJnQ291bnQgKiA0OwotICAgICAgICAgICAgICAgIG80KDB4RThCRDAwMDAgfCAoKDEgPDwgcmVnQXJnQ291bnQpIC0gMSkpOyAvLyBsZG1mZCAgIHNwISx7fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YWNrVXNlICs9IGFyZ3VtZW50U3RhY2tVc2U7Ci0KLSAgICAgICAgICAgIC8vIEFsaWduIHN0YWNrLgotICAgICAgICAgICAgaW50IG1pc3NhbGlnbm1lbnQgPSBtU3RhY2tVc2UgLSAoKG1TdGFja1VzZSAvIFNUQUNLX0FMSUdOTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgKiBTVEFDS19BTElHTk1FTlQpOwotICAgICAgICAgICAgbVN0YWNrQWxpZ25tZW50QWRqdXN0bWVudCA9IDA7Ci0gICAgICAgICAgICBpZiAobWlzc2FsaWdubWVudCA+IDApIHsKLSAgICAgICAgICAgICAgICBtU3RhY2tBbGlnbm1lbnRBZGp1c3RtZW50ID0gU1RBQ0tfQUxJR05NRU5UIC0gbWlzc2FsaWdubWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGwgKz0gbVN0YWNrQWxpZ25tZW50QWRqdXN0bWVudDsKLQotICAgICAgICAgICAgaWYgKGwgPCAwIHx8IGwgPiAweDNGQykgewotICAgICAgICAgICAgICAgIGVycm9yKCJMIG91dCBvZiByYW5nZSBmb3Igc3RhY2sgYWRqdXN0bWVudDogMHglMDh4IiwgbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbHVzaCgpOwotICAgICAgICAgICAgKiAoaW50KikgYSA9IDB4RTI0RERGMDAgfCAobCA+PiAyKTsgLy8gc3ViICAgIHNwLCBzcCwgIzAgPDwgMgotICAgICAgICAgICAgbVN0YWNrVXNlICs9IG1TdGFja0FsaWdubWVudEFkanVzdG1lbnQ7Ci0gICAgICAgICAgICBMT0dfU1RBQ0soImVuZEZ1bmN0aW9uQ2FsbEFyZ3VtZW50cyBtU3RhY2tVc2U6ICVkLCBtU3RhY2tBbGlnbm1lbnRBZGp1c3RtZW50ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIG1TdGFja1VzZSwgbVN0YWNrQWxpZ25tZW50QWRqdXN0bWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludCBjYWxsRm9yd2FyZChpbnQgc3ltYm9sLCBUeXBlKiBwRnVuYykgewotICAgICAgICAgICAgc2V0UjBUeXBlKHBGdW5jLT5wSGVhZCk7Ci0gICAgICAgICAgICAvLyBGb3J3YXJkIGNhbGxzIGFyZSBhbHdheXMgc2hvcnQgKGxvY2FsKQotICAgICAgICAgICAgaW50IHBjID0gZ2V0UEMoKTsKLSAgICAgICAgICAgIG80KDB4RUIwMDAwMDAgfCBlbmNvZGVBZGRyZXNzKHN5bWJvbCkpOwotICAgICAgICAgICAgcmV0dXJuIHBjOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGNhbGxJbmRpcmVjdChpbnQgbCwgVHlwZSogcEZ1bmMpIHsKLSAgICAgICAgICAgIGFzc2VydChwRnVuYy0+dGFnID09IFRZX0ZVTkMpOwotICAgICAgICAgICAgcG9wVHlwZSgpOyAvLyBHZXQgcmlkIG9mIGluZGlyZWN0IGZuIHBvaW50ZXIgdHlwZQotICAgICAgICAgICAgaW50IGFyZ0NvdW50ID0gbCA+PiAyOwotICAgICAgICAgICAgaW50IHBvcHBlZEFyZ3MgPSBhcmdDb3VudCA+IDQgPyA0IDogYXJnQ291bnQ7Ci0gICAgICAgICAgICBpbnQgYWRqdXN0ZWRMID0gbCAtIChwb3BwZWRBcmdzIDw8IDIpICsgbVN0YWNrQWxpZ25tZW50QWRqdXN0bWVudDsKLSAgICAgICAgICAgIGlmIChhZGp1c3RlZEwgPCAwIHx8IGFkanVzdGVkTCA+IDQwOTYtNCkgewotICAgICAgICAgICAgICAgIGVycm9yKCJsIG91dCBvZiByYW5nZSBmb3Igc3RhY2sgb2Zmc2V0OiAweCUwOHgiLCBsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG80KDB4RTU5REMwMDAgfCAoMHhmZmYgJiBhZGp1c3RlZEwpKTsgLy8gbGRyICAgIHIxMiwgW3NwLCNhZGp1c3RlZExdCi0gICAgICAgICAgICBvNCgweEUxMkZGRjNDKTsgLy8gYmx4IHIxMgotICAgICAgICAgICAgVHlwZSogcFJldHVyblR5cGUgPSBwRnVuYy0+cEhlYWQ7Ci0gICAgICAgICAgICBzZXRSMFR5cGUocFJldHVyblR5cGUpOwotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICBzd2l0Y2gocFJldHVyblR5cGUtPnRhZykgewotICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSAgICAgICAgICAgICAgICBvNCgweEVFMDcwQTkwKTsgLy8gZm1zciBzMTUsIHIwCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICBvNCgweEVDNDEwQjE3KTsgLy8gZm1kcnIgZDcsIHIwLCByMQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFN0YWNrQWZ0ZXJDYWxsKFR5cGUqIHBEZWNsLCBpbnQgbCwgYm9vbCBpc0luZGlyZWN0KSB7Ci0gICAgICAgICAgICBpbnQgYXJnQ291bnQgPSBsID4+IDI7Ci0gICAgICAgICAgICAvLyBIYXZlIHRvIGNhbGN1bGF0ZSByZWdpc3RlciBhcmcgY291bnQgZnJvbSBhY3R1YWwgc3RhY2sgc2l6ZSwKLSAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIHByb3Blcmx5IGhhbmRsZSAuLi4gZnVuY3Rpb25zLgotICAgICAgICAgICAgaW50IHJlZ0FyZ0NvdW50ID0gbCA+PiAyOwotICAgICAgICAgICAgaWYgKHJlZ0FyZ0NvdW50ID4gNCkgewotICAgICAgICAgICAgICAgIHJlZ0FyZ0NvdW50ID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdGFja0FyZ3MgPSBhcmdDb3VudCAtIHJlZ0FyZ0NvdW50OwotICAgICAgICAgICAgaW50IHN0YWNrVXNlID0gIHN0YWNrQXJncyArIChpc0luZGlyZWN0ID8gMSA6IDApCi0gICAgICAgICAgICAgICAgKyAobVN0YWNrQWxpZ25tZW50QWRqdXN0bWVudCA+PiAyKTsKLSAgICAgICAgICAgIGlmIChzdGFja1VzZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGFja1VzZSA8IDAgfHwgc3RhY2tVc2UgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkwgb3V0IG9mIHJhbmdlIGZvciBzdGFjayBhZGp1c3RtZW50OiAweCUwOHgiLCBsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbzQoMHhFMjhEREYwMCB8IHN0YWNrVXNlKTsgLy8gYWRkICAgIHNwLCBzcCwgI3N0YWNrVXNlIDw8IDIKLSAgICAgICAgICAgICAgICBtU3RhY2tVc2UgLT0gc3RhY2tVc2UgKiA0OwotICAgICAgICAgICAgICAgIExPR19TVEFDSygiYWRqdXN0U3RhY2tBZnRlckNhbGw6ICVkXG4iLCBtU3RhY2tVc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQganVtcE9mZnNldCgpIHsKLSAgICAgICAgICAgIHJldHVybiA4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3V0cHV0IGEgc3ltYm9sIGFuZCBwYXRjaCBhbGwgY2FsbHMgdG8gaXQgKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIGdzeW0oaW50IHQpIHsKLSAgICAgICAgICAgIGludCBuOwotICAgICAgICAgICAgaW50IGJhc2UgPSBnZXRCYXNlKCk7Ci0gICAgICAgICAgICBpbnQgcGMgPSBnZXRQQygpOwotICAgICAgICAgICAgd2hpbGUgKHQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZGF0YSA9ICogKGludCopIHQ7Ci0gICAgICAgICAgICAgICAgaW50IGRlY29kZWRPZmZzZXQgPSAoKEJSQU5DSF9SRUxfQUREUkVTU19NQVNLICYgZGF0YSkgPDwgMik7Ci0gICAgICAgICAgICAgICAgaWYgKGRlY29kZWRPZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuID0gYmFzZSArIGRlY29kZWRPZmZzZXQ7IC8qIG5leHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKihpbnQgKikgdCA9IChkYXRhICYgfkJSQU5DSF9SRUxfQUREUkVTU19NQVNLKQotICAgICAgICAgICAgICAgICAgICB8IGVuY29kZVJlbEFkZHJlc3MocGMgLSB0IC0gOCk7Ci0gICAgICAgICAgICAgICAgdCA9IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBvdXRwdXQgYSBzeW1ib2wgYW5kIHBhdGNoIGFsbCBjYWxscyB0byBpdCAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVzb2x2ZUZvcndhcmQoaW50IHQpIHsKLSAgICAgICAgICAgIGlmICh0KSB7Ci0gICAgICAgICAgICAgICAgaW50IHBjID0gZ2V0UEMoKTsKLSAgICAgICAgICAgICAgICAqKGludCAqKSB0ID0gcGM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludCBmaW5pc2hDb21waWxlKCkgewotI2lmIGRlZmluZWQoX19hcm1fXykKLSAgICAgICAgICAgIGNvbnN0IGxvbmcgYmFzZSA9IGxvbmcoZ2V0QmFzZSgpKTsKLSAgICAgICAgICAgIGNvbnN0IGxvbmcgY3VyciA9IGxvbmcoZ2V0UEMoKSk7Ci0gICAgICAgICAgICBpbnQgZXJyID0gY2FjaGVmbHVzaChiYXNlLCBjdXJyLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0jZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBhbGlnbm1lbnQgKGluIGJ5dGVzKSBmb3IgdGhpcyB0eXBlIG9mIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgc2l6ZV90IGFsaWdubWVudE9mKFR5cGUqIHBUeXBlKXsKLSAgICAgICAgICAgIHN3aXRjaChwVHlwZS0+dGFnKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9DSEFSOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDg7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9BUlJBWToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWdubWVudE9mKHBUeXBlLT5wSGVhZCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9TVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwVHlwZS0+cEhlYWQtPmFsaWdubWVudCAmIDB4N2ZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9GVU5DOgotICAgICAgICAgICAgICAgICAgICBlcnJvcigiYWxpZ25tZW50IG9mIGZ1bmMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcnJheSBlbGVtZW50IGFsaWdubWVudCAoaW4gYnl0ZXMpIGZvciB0aGlzIHR5cGUgb2YgZGF0YS4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgc2l6ZV90IHNpemVPZihUeXBlKiBwVHlwZSl7Ci0gICAgICAgICAgICBzd2l0Y2gocFR5cGUtPnRhZykgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0NIQVI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gODsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgICAgIGNhc2UgVFlfQVJSQVk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwVHlwZS0+bGVuZ3RoICogc2l6ZU9mKHBUeXBlLT5wSGVhZCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9TVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwVHlwZS0+cEhlYWQtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSAlZCIsIHBUeXBlLT50YWcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IEJSQU5DSF9SRUxfQUREUkVTU19NQVNLID0gMHgwMGZmZmZmZjsKLQotICAgICAgICAvKiogRW5jb2RlIGEgcmVsYXRpdmUgYWRkcmVzcyB0aGF0IG1pZ2h0IGFsc28gYmUKLSAgICAgICAgICogYSBsYWJlbC4KLSAgICAgICAgICovCi0gICAgICAgIGludCBlbmNvZGVBZGRyZXNzKGludCB2YWx1ZSkgewotICAgICAgICAgICAgaW50IGJhc2UgPSBnZXRCYXNlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPj0gYmFzZSAmJiB2YWx1ZSA8PSBnZXRQQygpICkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsYWJlbCwgZW5jb2RlIGl0IHJlbGF0aXZlIHRvIHRoZSBiYXNlLgotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgLSBiYXNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVuY29kZVJlbEFkZHJlc3ModmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGVuY29kZVJlbEFkZHJlc3MoaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQlJBTkNIX1JFTF9BRERSRVNTX01BU0sgJiAodmFsdWUgPj4gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY2FsY1JlZ0FyZ0NvdW50KFR5cGUqIHBEZWNsKSB7Ci0gICAgICAgICAgICBpbnQgcmVnID0gMDsKLSAgICAgICAgICAgIFR5cGUqIHBBcmdzID0gcERlY2wtPnBUYWlsOwotICAgICAgICAgICAgd2hpbGUgKHBBcmdzICYmIHJlZyA8IDQpIHsKLSAgICAgICAgICAgICAgICBUeXBlKiBwQXJnID0gcEFyZ3MtPnBIZWFkOwotICAgICAgICAgICAgICAgIGlmICggcEFyZy0+dGFnID09IFRZX0RPVUJMRSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZXZlblJlZyA9IChyZWcgKyAxKSAmIH4xOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlblJlZyA+PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZWcgPSBldmVuUmVnICsgMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWcrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEFyZ3MgPSBwQXJncy0+cFRhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVnOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXR1cEludFB0ckFyZ3MoKSB7Ci0gICAgICAgICAgICBvNCgweEU4QkQwMDAyKTsgIC8vIGxkbWZkICAgc3AhLHtyMX0KLSAgICAgICAgICAgIG1TdGFja1VzZSAtPSA0OwotICAgICAgICAgICAgcG9wVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUG9wIFRPUyB0byBSMSAodXNlIHMxNCBpZiBWRlApCi0gICAgICAgICAqIE1ha2Ugc3VyZSBib3RoIFIwIGFuZCBUT1MgYXJlIGZsb2F0cy4gKENvdWxkIGJlIGludHMpCi0gICAgICAgICAqIFdlIGtub3cgdGhhdCBhdCBsZWFzdCBvbmUgb2YgUjAgYW5kIFRPUyBpcyBhbHJlYWR5IGEgZmxvYXQKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgc2V0dXBGbG9hdEFyZ3MoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlKiBwVE9TVHlwZSA9IGdldFRPU1R5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnUjAgPSBjb2xsYXBzZVR5cGUocFIwVHlwZS0+dGFnKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnVE9TID0gY29sbGFwc2VUeXBlKHBUT1NUeXBlLT50YWcpOwotICAgICAgICAgICAgaWYgKHRhZ1IwICE9IFRZX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KHRhZ1IwID09IFRZX0lOVCk7Ci0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICBvNCgweEVFMDcwQTkwKTsgLy8gZm1zciAgICBzMTUsIHIwCi0gICAgICAgICAgICAgICAgbzQoMHhFRUY4N0FFNyk7IC8vIGZzaXRvcyBzMTUsIHMxNQotI2Vsc2UKLSAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfaW50X3RvX2Zsb2F0KTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRhZ1RPUyAhPSBUWV9GTE9BVCkgewotICAgICAgICAgICAgICAgIGFzc2VydCh0YWdUT1MgPT0gVFlfSU5UKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQodGFnUjAgPT0gVFlfRkxPQVQpOwotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgbzQoMHhFQ0JEN0EwMSk7IC8vIGZsZG1mZHMgc3AhLCB7czE0fQotICAgICAgICAgICAgICAgIG80KDB4RUVCODdBQzcpOyAvLyBmc2l0b3MgczE0LCBzMTQKLSNlbHNlCi0gICAgICAgICAgICAgICAgbzQoMHhFOTJEMDAwMSk7ICAvLyBzdG1mZCAgIHNwISx7cjB9ICAvLyBwdXNoIFIwCi0gICAgICAgICAgICAgICAgbzQoMHhFNTlEMDAwNCk7ICAvLyBsZHIgICAgIHIwLCBbc3AsICM0XQotICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9pbnRfdG9fZmxvYXQpOwotICAgICAgICAgICAgICAgIG80KDB4RTFBMDEwMDApOyAgLy8gbW92IHIxLCByMAotICAgICAgICAgICAgICAgIG80KDB4RThCRDAwMDEpOyAgLy8gbGRtZmQgICBzcCEse3IwfSAgLy8gcG9wIFIwCi0gICAgICAgICAgICAgICAgbzQoMHhFMjhERDAwNCk7ICAvLyBhZGQgc3AsIHNwLCAjNCAvLyBQb3Agc3AKLSNlbmRpZgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBQb3AgVE9TCi0jaWZkZWYgQVJNX1VTRV9WRlAKLSAgICAgICAgICAgICAgICBvNCgweEVDQkQ3QTAxKTsgLy8gZmxkbWZkcyBzcCEsIHtzMTR9Ci0KLSNlbHNlCi0gICAgICAgICAgICAgICAgbzQoMHhFOEJEMDAwMik7ICAvLyBsZG1mZCAgIHNwISx7cjF9Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdGFja1VzZSAtPSA0OwotICAgICAgICAgICAgcG9wVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUG9wIFRPUyBpbnRvIFIyLi5SMyAodXNlIEQ2IGlmIFZGUCkKLSAgICAgICAgICogTWFrZSBzdXJlIGJvdGggUjAgYW5kIFRPUyBhcmUgZG91Ymxlcy4gQ291bGQgYmUgZmxvYXRzIG9yIGludHMuCi0gICAgICAgICAqIFdlIGtub3cgdGhhdCBhdCBsZWFzdCBvbmUgb2YgUjAgYW5kIFRPUyBhcmUgYWxyZWFkeSBhIGRvdWJsZS4KLSAgICAgICAgICovCi0KLSAgICAgICAgdm9pZCBzZXR1cERvdWJsZUFyZ3MoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlKiBwVE9TVHlwZSA9IGdldFRPU1R5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnUjAgPSBjb2xsYXBzZVR5cGUocFIwVHlwZS0+dGFnKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnVE9TID0gY29sbGFwc2VUeXBlKHBUT1NUeXBlLT50YWcpOwotICAgICAgICAgICAgaWYgKHRhZ1IwICE9IFRZX0RPVUJMRSkgewotICAgICAgICAgICAgICAgIGlmICh0YWdSMCA9PSBUWV9JTlQpIHsKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgICAgICBvNCgweEVFMDcwQTkwKTsgLy8gZm1zciBzMTUsIHIwCi0gICAgICAgICAgICAgICAgICAgIG80KDB4RUVCODdCRTcpOyAvLyBmc2l0b2QgZDcsIHMxNQotCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfaW50X3RvX2RvdWJsZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQodGFnUjAgPT0gVFlfRkxPQVQpOwotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgICAgIG80KDB4RUVCNzdBRTcpOyAvLyBmY3Z0ZHMgICAgZDcsIHMxNQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWUoKHZvaWQqKSBydW50aW1lX2Zsb2F0X3RvX2RvdWJsZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGFnVE9TICE9IFRZX0RPVUJMRSkgewotI2lmZGVmIEFSTV9VU0VfVkZQCi0gICAgICAgICAgICAgICAgaWYgKHRhZ1RPUyA9PSBUWV9JTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgbzQoMHhFQ0ZENkEwMSk7ICAvLyBmbGRtZmRzIHNwISx7czEzfQotICAgICAgICAgICAgICAgICAgICBvNCgweEVFQjg2QkU2KTsgIC8vIGZzaXRvZCAgZDYsIHMxMwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0YWdUT1MgPT0gVFlfRkxPQVQpOwotICAgICAgICAgICAgICAgICAgICBvNCgweEVDRkQ2QTAxKTsgIC8vIGZsZG1mZHMgc3AhLHtzMTN9Ci0gICAgICAgICAgICAgICAgICAgIG80KDB4RUVCNzZBRTYpOyAgLy8gZmN2dGRzICAgIGQ2LCBzMTMKLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgICAgIG80KDB4RTkyRDAwMDMpOyAgLy8gc3RtZmQgICBzcCEse3IwLHIxfSAgLy8gcHVzaCByMCxyMQotICAgICAgICAgICAgICAgIG80KDB4RTU5RDAwMDgpOyAgLy8gbGRyICAgICByMCwgW3NwLCAjOF0KLSAgICAgICAgICAgICAgICBpZiAodGFnVE9TID09IFRZX0lOVCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsUnVudGltZSgodm9pZCopIHJ1bnRpbWVfaW50X3RvX2RvdWJsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHRhZ1RPUyA9PSBUWV9GTE9BVCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lKCh2b2lkKikgcnVudGltZV9mbG9hdF90b19kb3VibGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvNCgweEUxQTAyMDAwKTsgIC8vIG1vdiByMiwgcjAKLSAgICAgICAgICAgICAgICBvNCgweEUxQTAzMDAxKTsgIC8vIG1vdiByMywgcjEKLSAgICAgICAgICAgICAgICBvNCgweEU4QkQwMDAzKTsgIC8vIGxkbWZkICAgc3AhLHtyMCwgcjF9ICAvLyBSZXN0b3JlIFIwCi0gICAgICAgICAgICAgICAgbzQoMHhFMjhERDAwNCk7ICAvLyBhZGQgc3AsIHNwLCAjNCAvLyBQb3Agc3AKLSNlbmRpZgotICAgICAgICAgICAgICAgIG1TdGFja1VzZSAtPSA0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSNpZmRlZiBBUk1fVVNFX1ZGUAotICAgICAgICAgICAgICAgIG80KDB4RUNCRDZCMDIpOyAgLy8gZmxkbWZkZCAgICBzcCEsIHtkNn0KLSNlbHNlCi0gICAgICAgICAgICAgICAgbzQoMHhFOEJEMDAwQyk7ICAvLyBsZG1mZCAgIHNwISx7cjIscjN9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBtU3RhY2tVc2UgLT0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcFR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbGlSZWcoaW50IHQsIGludCByZWcpIHsKLSAgICAgICAgICAgIGFzc2VydChyZWcgPj0gMCAmJiByZWcgPCAxNik7Ci0gICAgICAgICAgICBpbnQgck4gPSAocmVnICYgMHhmKSA8PCAxMjsKLSAgICAgICAgICAgIHNpemVfdCBlbmNvZGVkSW1tZWRpYXRlOwotICAgICAgICAgICAgaWYgKGVuY29kZTEyQml0SW1tZWRpYXRlKHQsICZlbmNvZGVkSW1tZWRpYXRlKSkgewotICAgICAgICAgICAgICAgICBvNCgweEUzQTAwMDAwIHwgZW5jb2RlZEltbWVkaWF0ZSB8IHJOKTsgLy8gbW92ICAgIHJOLCAjMAotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGUxMkJpdEltbWVkaWF0ZSgtKHQrMSksICZlbmNvZGVkSW1tZWRpYXRlKSkgewotICAgICAgICAgICAgICAgIC8vIG12biBtZWFucyBtb3ZlIGNvbnN0YW50IF4gfjAKLSAgICAgICAgICAgICAgICBvNCgweEUzRTAwMDAwIHwgZW5jb2RlZEltbWVkaWF0ZSB8IHJOKTsgLy8gbXZuICAgIHJOLCAjMAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvNCgweEU1MUYwMDAwIHwgck4pOyAvLyAgICAgICAgIGxkciAgICByTiwgLkwzCi0gICAgICAgICAgICAgICAgbzQoMHhFQTAwMDAwMCk7IC8vICAgICAgICAgYiAuTDk5Ci0gICAgICAgICAgICAgICAgbzQodCk7ICAgICAgICAgIC8vIC5MMzogICAud29yZCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLkw5OToKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgaW5jb21wYXRpYmxlVHlwZXMoVHlwZSogcFIwVHlwZSwgVHlwZSogcFR5cGUpIHsKLSAgICAgICAgICAgIGVycm9yKCJJbmNvbXBhdGlibGUgdHlwZXMgb2xkOiAlZCBuZXc6ICVkIiwgcFIwVHlwZS0+dGFnLCBwVHlwZS0+dGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY2FsbFJ1bnRpbWUodm9pZCogZm4pIHsKLSAgICAgICAgICAgIG80KDB4RTU5RkMwMDApOyAvLyBsZHIgICAgcjEyLCAuTDEKLSAgICAgICAgICAgIG80KDB4RUEwMDAwMDApOyAvLyBiICAgICAgLkw5OQotICAgICAgICAgICAgbzQoKGludCkgZm4pOyAgIC8vLkwxOiAgLndvcmQgIGZuCi0gICAgICAgICAgICBvNCgweEUxMkZGRjNDKTsgLy8uTDk5OiBibHggICAgcjEyCi0gICAgICAgIH0KLQotICAgICAgICAvLyBJbnRlZ2VyIG1hdGg6Ci0KLSAgICAgICAgc3RhdGljIGludCBydW50aW1lX0RJVihpbnQgYiwgaW50IGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhIC8gYjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBpbnQgcnVudGltZV9NT0QoaW50IGIsIGludCBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSAlIGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgdm9pZCBydW50aW1lX3N0cnVjdENvcHkodm9pZCogc3JjLCBzaXplX3Qgc2l6ZSwgdm9pZCogZGVzdCkgewotICAgICAgICAgICAgbWVtY3B5KGRlc3QsIHNyYywgc2l6ZSk7Ci0gICAgICAgIH0KLQotI2lmbmRlZiBBUk1fVVNFX1ZGUAotCi0gICAgICAgIC8vIENvbXBhcmlzb24gdG8gemVybwotCi0gICAgICAgIHN0YXRpYyBpbnQgcnVudGltZV9pc19ub25femVyb19mKGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhICE9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVfaXNfbm9uX3plcm9fZChkb3VibGUgYSkgewotICAgICAgICAgICAgcmV0dXJuIGEgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbXBhcmlzb24gdG8gemVybwotCi0gICAgICAgIHN0YXRpYyBpbnQgcnVudGltZV9pc196ZXJvX2YoZmxvYXQgYSkgewotICAgICAgICAgICAgcmV0dXJuIGEgPT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBpbnQgcnVudGltZV9pc196ZXJvX2QoZG91YmxlIGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhID09IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUeXBlIGNvbnZlcnNpb24KLQotICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVfZmxvYXRfdG9faW50KGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBhOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGRvdWJsZSBydW50aW1lX2Zsb2F0X3RvX2RvdWJsZShmbG9hdCBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkgYTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBpbnQgcnVudGltZV9kb3VibGVfdG9faW50KGRvdWJsZSBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgYTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBmbG9hdCBydW50aW1lX2RvdWJsZV90b19mbG9hdChkb3VibGUgYSkgewotICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgYTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBmbG9hdCBydW50aW1lX2ludF90b19mbG9hdChpbnQgYSkgewotICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgYTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBkb3VibGUgcnVudGltZV9pbnRfdG9fZG91YmxlKGludCBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkgYTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbXBhcmlzb25zIGZsb2F0Ci0KLSAgICAgICAgc3RhdGljIGludCBydW50aW1lX2NtcF9lcV9mZihmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSA9PSBiOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGludCBydW50aW1lX2NtcF9uZV9mZihmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSAhPSBiOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGludCBydW50aW1lX2NtcF9sdF9mZihmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSA8IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVfY21wX2xlX2ZmKGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhIDw9IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVfY21wX2dlX2ZmKGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhID49IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVfY21wX2d0X2ZmKGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhID4gYjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbXBhcmlzb25zIGRvdWJsZQotCi0gICAgICAgIHN0YXRpYyBpbnQgcnVudGltZV9jbXBfZXFfZGQoZG91YmxlIGIsIGRvdWJsZSBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSA9PSBiOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGludCBydW50aW1lX2NtcF9uZV9kZChkb3VibGUgYiwgZG91YmxlIGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhICE9IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVfY21wX2x0X2RkKGRvdWJsZSBiLCBkb3VibGUgYSkgewotICAgICAgICAgICAgcmV0dXJuIGEgPCBiOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGludCBydW50aW1lX2NtcF9sZV9kZChkb3VibGUgYiwgZG91YmxlIGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhIDw9IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVfY21wX2dlX2RkKGRvdWJsZSBiLCBkb3VibGUgYSkgewotICAgICAgICAgICAgcmV0dXJuIGEgPj0gYjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBpbnQgcnVudGltZV9jbXBfZ3RfZGQoZG91YmxlIGIsIGRvdWJsZSBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSA+IGI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXRoIGZsb2F0Ci0KLSAgICAgICAgc3RhdGljIGZsb2F0IHJ1bnRpbWVfb3BfYWRkX2ZmKGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhICsgYjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBmbG9hdCBydW50aW1lX29wX3N1Yl9mZihmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSAtIGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgZmxvYXQgcnVudGltZV9vcF9tdWxfZmYoZmxvYXQgYiwgZmxvYXQgYSkgewotICAgICAgICAgICAgcmV0dXJuIGEgKiBiOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGZsb2F0IHJ1bnRpbWVfb3BfZGl2X2ZmKGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhIC8gYjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBmbG9hdCBydW50aW1lX29wX25lZ19mKGZsb2F0IGEpIHsKLSAgICAgICAgICAgIHJldHVybiAtYTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hdGggZG91YmxlCi0KLSAgICAgICAgc3RhdGljIGRvdWJsZSBydW50aW1lX29wX2FkZF9kZChkb3VibGUgYiwgZG91YmxlIGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhICsgYjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBkb3VibGUgcnVudGltZV9vcF9zdWJfZGQoZG91YmxlIGIsIGRvdWJsZSBhKSB7Ci0gICAgICAgICAgICByZXR1cm4gYSAtIGI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgZG91YmxlIHJ1bnRpbWVfb3BfbXVsX2RkKGRvdWJsZSBiLCBkb3VibGUgYSkgewotICAgICAgICAgICAgcmV0dXJuIGEgKiBiOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGRvdWJsZSBydW50aW1lX29wX2Rpdl9kZChkb3VibGUgYiwgZG91YmxlIGEpIHsKLSAgICAgICAgICAgIHJldHVybiBhIC8gYjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBkb3VibGUgcnVudGltZV9vcF9uZWdfZChkb3VibGUgYSkgewotICAgICAgICAgICAgcmV0dXJuIC1hOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgU1RBQ0tfQUxJR05NRU5UID0gODsKLSAgICAgICAgaW50IG1TdGFja1VzZTsKLSAgICAgICAgLy8gVGhpcyB2YXJpYWJsZSBob2xkcyB0aGUgYW1vdW50IHdlIGFkanVzdGVkIHRoZSBzdGFjayBpbiB0aGUgbW9zdAotICAgICAgICAvLyByZWNlbnQgZW5kRnVuY3Rpb25DYWxsQXJndW1lbnRzIGNhbGwuIEl0J3MgZXhhbWluZWQgYnkgdGhlCi0gICAgICAgIC8vIGZvbGxvd2luZyBhZGp1c3RTdGFja0FmdGVyQ2FsbCBjYWxsLgotICAgICAgICBpbnQgbVN0YWNrQWxpZ25tZW50QWRqdXN0bWVudDsKLSAgICB9OwotCi0jZW5kaWYgLy8gUFJPVklERV9BUk1fQ09ERUdFTgotCi0jaWZkZWYgUFJPVklERV9YODZfQ09ERUdFTgotCi0gICAgY2xhc3MgWDg2Q29kZUdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFg4NkNvZGVHZW5lcmF0b3IoKSB7fQotICAgICAgICB2aXJ0dWFsIH5YODZDb2RlR2VuZXJhdG9yKCkge30KLQotICAgICAgICAvKiByZXR1cm5zIGFkZHJlc3MgdG8gcGF0Y2ggd2l0aCBsb2NhbCB2YXJpYWJsZSBzaXplCi0gICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGZ1bmN0aW9uRW50cnkoVHlwZSogcERlY2wpIHsKLSAgICAgICAgICAgIG8oMHhlNTg5NTUpOyAvKiBwdXNoICAgJWVicCwgbW92ICVlc3AsICVlYnAgKi8KLSAgICAgICAgICAgIHJldHVybiBvYWQoMHhlYzgxLCAwKTsgLyogc3ViICR4eHgsICVlc3AgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBmdW5jdGlvbkV4aXQoVHlwZSogcERlY2wsIGludCBsb2NhbFZhcmlhYmxlQWRkcmVzcywgaW50IGxvY2FsVmFyaWFibGVTaXplKSB7Ci0gICAgICAgICAgICBvKDB4YzNjOSk7IC8qIGxlYXZlLCByZXQgKi8KLSAgICAgICAgICAgICooaW50ICopIGxvY2FsVmFyaWFibGVBZGRyZXNzID0gbG9jYWxWYXJpYWJsZVNpemU7IC8qIHNhdmUgbG9jYWwgdmFyaWFibGVzICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBsb2FkIGltbWVkaWF0ZSB2YWx1ZSAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgbGkoaW50IGkpIHsKLSAgICAgICAgICAgIG9hZCgweGI4LCBpKTsgLyogbW92ICR4eCwgJWVheCAqLwotICAgICAgICAgICAgc2V0UjBUeXBlKG1rcEludCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgbG9hZEZsb2F0KGludCBhZGRyZXNzLCBUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgc2V0UjBUeXBlKHBUeXBlKTsKLSAgICAgICAgICAgIHN3aXRjaCAocFR5cGUtPnRhZykgewotICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSAgICAgICAgICAgICAgICBvYWQoMHgwNUQ5LCBhZGRyZXNzKTsgICAgICAvLyBmbGRzCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICBvYWQoMHgwNURELCBhZGRyZXNzKTsgICAgICAvLyBmbGRsCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkU3RydWN0T2Zmc2V0UjAoaW50IG9mZnNldCwgVHlwZSogcFR5cGUpIHsKLSAgICAgICAgICAgIGlmIChvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBvYWQoMHgwNSwgb2Zmc2V0KTsgLy8gYWRkbCBvZmZzZXQsICVlYXgKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFIwVHlwZShwVHlwZSwgRVRfTFZBTFVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgaW50IGdqbXAoaW50IHQpIHsKLSAgICAgICAgICAgIHJldHVybiBwc3ltKDB4ZTksIHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbCA9IDA6IGplLCBsID09IDE6IGpuZSAqLwotICAgICAgICB2aXJ0dWFsIGludCBndHN0KGJvb2wgbCwgaW50IHQpIHsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnUjAgPSBwUjBUeXBlLT50YWc7Ci0gICAgICAgICAgICBib29sIGlzRmxvYXRSMCA9IGlzRmxvYXRUYWcodGFnUjApOwotICAgICAgICAgICAgaWYgKGlzRmxvYXRSMCkgewotICAgICAgICAgICAgICAgIG8oMHhlZWQ5KTsgLy8gZmxkegotICAgICAgICAgICAgICAgIG8oMHhlOWRhKTsgLy8gZnVjb21wcAotICAgICAgICAgICAgICAgIG8oMHhlMGRmKTsgLy8gZm5zdHN3ICVheAotICAgICAgICAgICAgICAgIG8oMHg5ZSk7ICAgLy8gc2FoZgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvKDB4YzA4NSk7IC8vIHRlc3QgJWVheCwgJWVheAotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVXNlIHR3byBvdXRwdXQgc3RhdGVtZW50cyB0byBnZW5lcmF0ZSBvbmUgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICBvKDB4MGYpOyAgIC8vIGplL2puZSB4eHgKLSAgICAgICAgICAgIHJldHVybiBwc3ltKDB4ODQgKyBsLCB0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnY21wKGludCBvcCkgewotICAgICAgICAgICAgVHlwZSogcFIwVHlwZSA9IGdldFIwVHlwZSgpOwotICAgICAgICAgICAgVHlwZSogcFRPU1R5cGUgPSBnZXRUT1NUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHRhZ1IwID0gcFIwVHlwZS0+dGFnOwotICAgICAgICAgICAgVHlwZVRhZyB0YWdUT1MgPSBwVE9TVHlwZS0+dGFnOwotICAgICAgICAgICAgYm9vbCBpc0Zsb2F0UjAgPSBpc0Zsb2F0VGFnKHRhZ1IwKTsKLSAgICAgICAgICAgIGJvb2wgaXNGbG9hdFRPUyA9IGlzRmxvYXRUYWcodGFnVE9TKTsKLSAgICAgICAgICAgIGlmICghaXNGbG9hdFIwICYmICFpc0Zsb2F0VE9TKSB7Ci0gICAgICAgICAgICAgICAgaW50IHQgPSBkZWNvZGVPcChvcCk7Ci0gICAgICAgICAgICAgICAgbygweDU5KTsgLyogcG9wICVlY3ggKi8KLSAgICAgICAgICAgICAgICBvKDB4YzEzOSk7IC8qIGNtcCAlZWF4LCVlY3ggKi8KLSAgICAgICAgICAgICAgICBsaSgwKTsKLSAgICAgICAgICAgICAgICBvKDB4MGYpOyAvKiBzZXR4eCAlYWwgKi8KLSAgICAgICAgICAgICAgICBvKHQgKyAweDkwKTsKLSAgICAgICAgICAgICAgICBvKDB4YzApOwotICAgICAgICAgICAgICAgIHBvcFR5cGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0dXBGbG9hdE9wZXJhbmRzKCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0VRVUFMUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhlOWRhKTsgICAvLyBmdWNvbXBwCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZTBkZik7ICAgLy8gZm5zdHN3ICVheAotICAgICAgICAgICAgICAgICAgICAgICAgbygweDllKTsgICAgIC8vIHNhaGYKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhjMDk0MGYpOyAvLyBzZXRlICVhbAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGMyOWIwZik7IC8vIHNldG5wICVkbAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGQwMjEpOyAgIC8vIGFuZGwgJWVkeCwgJWVheAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTk9UX0VRVUFMUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhlOWRhKTsgICAvLyBmdWNvbXBwCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZTBkZik7ICAgLy8gZm5zdHN3ICVheAotICAgICAgICAgICAgICAgICAgICAgICAgbygweDllKTsgICAgIC8vIHNhaGYKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhjMDk1MGYpOyAvLyBzZXRuZSAlYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhjMjlhMGYpOyAvLyBzZXRwICVkbAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGQwMDkpOyAgIC8vIG9ybCAlZWR4LCAlZWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9HUkVBVEVSX0VRVUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgbygweGU5ZGEpOyAgIC8vIGZ1Y29tcHAKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhlMGRmKTsgICAvLyBmbnN0c3cgJWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4MDVjNGY2KTsgLy8gdGVzdGIgJDUsICVhaAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGMwOTQwZik7IC8vIHNldGUgJWFsCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9MRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgbygweGM5ZDkpOyAgIC8vIGZ4Y2ggJXN0KDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZTlkYSk7ICAgLy8gZnVjb21wcAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGUwZGYpOyAgIC8vIGZuc3RzdyAlYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHg5ZSk7ICAgICAvLyBzYWhmCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4YzA5NzBmKTsgLy8gc2V0YSAlYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0xFU1NfRVFVQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4YzlkOSk7ICAgLy8gZnhjaCAlc3QoMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhlOWRhKTsgICAvLyBmdWNvbXBwCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZTBkZik7ICAgLy8gZm5zdHN3ICVheAotICAgICAgICAgICAgICAgICAgICAgICAgbygweDllKTsgICAgIC8vIHNhaGYKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhjMDkzMGYpOyAvLyBzZXRlYSAlYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0dSRUFURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZTlkYSk7ICAgLy8gZnVjb21wcAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGUwZGYpOyAgIC8vIGZuc3RzdyAlYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHg0NWM0ZjYpOyAvLyB0ZXN0YiAkNjksICVhaAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGMwOTQwZik7IC8vIHNldGUgJWFsCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbmtub3duIGNvbXBhcmlzb24gb3AiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbygweGMwYjYwZik7IC8vIG1vdnpibCAlYWwsICVlYXgKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFIwVHlwZShta3BJbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGdlbk9wKGludCBvcCkgewotICAgICAgICAgICAgVHlwZSogcFIwVHlwZSA9IGdldFIwVHlwZSgpOwotICAgICAgICAgICAgVHlwZSogcFRPU1R5cGUgPSBnZXRUT1NUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHRhZ1IwID0gcFIwVHlwZS0+dGFnOwotICAgICAgICAgICAgVHlwZVRhZyB0YWdUT1MgPSBwVE9TVHlwZS0+dGFnOwotICAgICAgICAgICAgYm9vbCBpc0Zsb2F0UjAgPSBpc0Zsb2F0VGFnKHRhZ1IwKTsKLSAgICAgICAgICAgIGJvb2wgaXNGbG9hdFRPUyA9IGlzRmxvYXRUYWcodGFnVE9TKTsKLSAgICAgICAgICAgIGlmICghaXNGbG9hdFIwICYmICFpc0Zsb2F0VE9TKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc1B0clIwID0gaXNQb2ludGVyVGFnKHRhZ1IwKTsKLSAgICAgICAgICAgICAgICBib29sIGlzUHRyVE9TID0gaXNQb2ludGVyVGFnKHRhZ1RPUyk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUHRyUjAgfHwgaXNQdHJUT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHRyUjAgJiYgaXNQdHJUT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCAhPSBPUF9NSU5VUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbnN1cHBvcnRlZCBwb2ludGVyLXBvaW50ZXIgb3BlcmF0aW9uICVkLiIsIG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHR5cGVFcXVhbChwUjBUeXBlLCBwVE9TVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiSW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgZm9yIHN1YnRyYWN0aW9uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbygweDU5KTsgLyogcG9wICVlY3ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG8oZGVjb2RlT3Aob3ApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFIwVHlwZShta3BJbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBzaXplT2YocFIwVHlwZS0+cEhlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hSMCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpKHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IE9wdGltaXplIGZvciBwb3dlci1vZi10d28uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuT3AoT1BfRElWKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIChvcCA9PSBPUF9QTFVTIHx8IChvcCA9PSBPUF9NSU5VUyAmJiBpc1B0clIwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5zdXBwb3J0ZWQgcG9pbnRlci1zY2FsYXIgb3BlcmF0aW9uICVkIiwgb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSogcFB0clR5cGUgPSBnZXRQb2ludGVyQXJpdGhtZXRpY1Jlc3VsdFR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSMFR5cGUsIHBUT1NUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHg1OSk7IC8qIHBvcCAlZWN4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHNpemVPZihwUHRyVHlwZS0+cEhlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IE9wdGltaXplIGZvciBwb3dlci1vZi10d28uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHRyUjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2FkKDB4Qzk2OSwgc2l6ZSk7IC8vIGltdWxsICRzaXplLCAlZWN4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2FkKDB4QzA2OSwgc2l6ZSk7IC8vIG11bCAkc2l6ZSwgJWVheAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG8oZGVjb2RlT3Aob3ApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFIwVHlwZShwUHRyVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvKDB4NTkpOyAvKiBwb3AgJWVjeCAqLwotICAgICAgICAgICAgICAgICAgICBvKGRlY29kZU9wKG9wKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSBPUF9NT0QpCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4OTIpOyAvKiB4Y2hnICVlZHgsICVlYXggKi8KLSAgICAgICAgICAgICAgICAgICAgcG9wVHlwZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVHlwZSogcFJlc3VsdFR5cGUgPSB0YWdSMCA+IHRhZ1RPUyA/IHBSMFR5cGUgOiBwVE9TVHlwZTsKLSAgICAgICAgICAgICAgICBzZXR1cEZsb2F0T3BlcmFuZHMoKTsKLSAgICAgICAgICAgICAgICAvLyBCb3RoIGZsb2F0LiB4ODcgUjAgPT0gbGVmdCBoYW5kLCB4ODcgUjEgPT0gcmlnaHQgaGFuZAotICAgICAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9NVUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4YzlkZSk7IC8vIGZtdWxwCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9ESVY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZjFkZSk7IC8vIGZkaXZwCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9QTFVTOgotICAgICAgICAgICAgICAgICAgICAgICAgbygweGMxZGUpOyAvLyBmYWRkcAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTUlOVVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZTFkZSk7IC8vIGZzdWJwCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbnN1cHBvcnRlZCBiaW5hcnkgZmxvYXRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFIwVHlwZShwUmVzdWx0VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZ1VuYXJ5Q21wKGludCBvcCkgewotICAgICAgICAgICAgaWYgKG9wICE9IE9QX0xPR0lDQUxfTk9UKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoIlVua25vd24gdW5hcnkgY21wICVkIiwgb3ApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICAgICAgVHlwZVRhZyB0YWcgPSBjb2xsYXBzZVR5cGUocFIwVHlwZS0+dGFnKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2FkKDB4YjksIDApOyAvKiBtb3ZsICQwLCAlZWN4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHQgPSBkZWNvZGVPcChvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbygweGMxMzkpOyAvKiBjbXAgJWVheCwlZWN4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbygweDBmKTsgLyogc2V0eHggJWFsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbyh0ICsgMHg5MCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbygweGMwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhlZWQ5KTsgICAvLyBmbGR6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZTlkYSk7ICAgLy8gZnVjb21wcAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGUwZGYpOyAgIC8vIGZuc3RzdyAlYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHg5ZSk7ICAgICAvLyBzYWhmCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4YzA5NTBmKTsgLy8gc2V0bmUgJWFsCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4YzI5YTBmKTsgLy8gc2V0cCAlZGwKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhkMDA5KTsgICAvLyBvcmwgJWVkeCwgJWVheAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGMwYjYwZik7IC8vIG1vdnpibCAlYWwsICVlYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHgwMWYwODMpOyAvLyB4b3JsICQxLCAgJWVheAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiZ1VuYXJ5Q21wIHVuc3VwcG9ydGVkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFIwVHlwZShta3BJbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGdlblVuYXJ5T3AoaW50IG9wKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHRhZyA9IGNvbGxhcHNlVHlwZShwUjBUeXBlLT50YWcpOwotICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgICAgICBvYWQoMHhiOSwgMCk7IC8qIG1vdmwgJDAsICVlY3ggKi8KLSAgICAgICAgICAgICAgICAgICAgbyhkZWNvZGVPcChvcCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX01JTlVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhlMGQ5KTsgIC8vIGZjaHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfQklUX05PVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiQ2FuJ3QgYXBwbHkgJ34nIG9wZXJhdG9yIHRvIGEgZmxvYXQgb3IgZG91YmxlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5rbm93biB1bmFyeSBvcCAlZFxuIiwgb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigiZ2VuVW5hcnlPcCB1bnN1cHBvcnRlZCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hSMCgpIHsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgcjBjdCA9IGNvbGxhcHNlVHlwZShwUjBUeXBlLT50YWcpOwotICAgICAgICAgICAgc3dpdGNoKHIwY3QpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgbygweDUwKTsgLyogcHVzaCAlZWF4ICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIG8oMHg1MCk7IC8qIHB1c2ggJWVheCAqLwotICAgICAgICAgICAgICAgICAgICBvKDB4MjQxY2Q5KTsgLy8gZnN0cHMgMCglZXNwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgbygweDUwKTsgLyogcHVzaCAlZWF4ICovCi0gICAgICAgICAgICAgICAgICAgIG8oMHg1MCk7IC8qIHB1c2ggJWVheCAqLwotICAgICAgICAgICAgICAgICAgICBvKDB4MjQxY2RkKTsgLy8gZnN0cGwgMCglZXNwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigicHVzaFIwIHVuc3VwcG9ydGVkIHR5cGUgJWQiLCByMGN0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXNoVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIG92ZXIoKSB7Ci0gICAgICAgICAgICAvLyBXZSBrbm93IGl0J3Mgb25seSB1c2VkIGZvciBpbnQtcHRyIG9wcyAoKysvLS0pCi0KLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgcjBjdCA9IGNvbGxhcHNlVHlwZShwUjBUeXBlLT50YWcpOwotCi0gICAgICAgICAgICBUeXBlKiBwVE9TVHlwZSA9IGdldFRPU1R5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgdG9zY3QgPSBjb2xsYXBzZVR5cGUocFRPU1R5cGUtPnRhZyk7Ci0KLSAgICAgICAgICAgIGFzc2VydCAocjBjdCA9PSBUWV9JTlQgJiYgdG9zY3QgPT0gVFlfSU5UKTsKLQotICAgICAgICAgICAgbygweDU5KTsgLyogcG9wICVlY3ggKi8KLSAgICAgICAgICAgIG8oMHg1MCk7IC8qIHB1c2ggJWVheCAqLwotICAgICAgICAgICAgbygweDUxKTsgLyogcHVzaCAlZWN4ICovCi0KLSAgICAgICAgICAgIG92ZXJUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wUjAoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHIwY3QgPSBjb2xsYXBzZVR5cGUocFIwVHlwZS0+dGFnKTsKLSAgICAgICAgICAgIHN3aXRjaChyMGN0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIG8oMHg1OCk7IC8qIHBvcGwgJWVheCAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBvKDB4MjQwNGQ5KTsgLy8gZmxkcyAoJWVzcCkKLSAgICAgICAgICAgICAgICAgICAgbygweDU4KTsgLyogcG9wbCAlZWF4ICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBvKDB4MjQwNGRkKTsgLy8gZmxkbCAoJWVzcCkKLSAgICAgICAgICAgICAgICAgICAgbygweDU4KTsgLyogcG9wbCAlZWF4ICovCi0gICAgICAgICAgICAgICAgICAgIG8oMHg1OCk7IC8qIHBvcGwgJWVheCAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigicG9wUjAgdW5zdXBwb3J0ZWQgdHlwZSAlZCIsIHIwY3QpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcFR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZVIwVG9UT1MoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUG9pbnRlclR5cGUgPSBnZXRUT1NUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnQocFBvaW50ZXJUeXBlLT50YWcgPT0gVFlfUE9JTlRFUik7Ci0gICAgICAgICAgICBUeXBlKiBwVGFyZ2V0VHlwZSA9IHBQb2ludGVyVHlwZS0+cEhlYWQ7Ci0gICAgICAgICAgICBjb252ZXJ0UjAocFRhcmdldFR5cGUpOwotICAgICAgICAgICAgbygweDU5KTsgLyogcG9wICVlY3ggKi8KLSAgICAgICAgICAgIHBvcFR5cGUoKTsKLSAgICAgICAgICAgIHN3aXRjaCAocFRhcmdldFR5cGUtPnRhZykgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfUE9JTlRFUjoKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgbygweDAxODkpOyAvKiBtb3ZsICVlYXgvJWFsLCAoJWVjeCkgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9TSE9SVDoKLSAgICAgICAgICAgICAgICAgICAgbygweDAxODk2Nik7IC8qIG1vdncgJWF4LCAoJWVjeCkgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9DSEFSOgotICAgICAgICAgICAgICAgICAgICBvKDB4MDE4OCk7IC8qIG1vdmwgJWVheC8lYWwsICglZWN4KSAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBvKDB4MTlkOSk7IC8qIGZzdHBzICglZWN4KSAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0RPVUJMRToKLSAgICAgICAgICAgICAgICAgICAgbygweDE5ZGQpOyAvKiBmc3RwbCAoJWVjeCkgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9TVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYWxpZ25tZW50IGluZm9ybWF0aW9uIHRvIHVzZSBtb3Zzdy9tb3ZzbCBpbnN0ZWFkIG9mIG1vdnNiCi0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gc2l6ZU9mKHBUYXJnZXRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4OWMpOyAgICAgICAgIC8vIHB1c2hmCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4NTcpOyAgICAgICAgIC8vIHB1c2hsICVlZGkKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHg1Nik7ICAgICAgICAgLy8gcHVzaGwgJWVzaQotICAgICAgICAgICAgICAgICAgICAgICAgbygweGNmODkpOyAgICAgICAvLyBtb3ZsICVlY3gsICVlZGkKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhjNjg5KTsgICAgICAgLy8gbW92bCAlZWF4LCAlZXNpCi0gICAgICAgICAgICAgICAgICAgICAgICBvYWQoMHhiOSwgc2l6ZSk7ICAvLyBtb3YgI3NpemUsICVlY3gKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHhmYyk7ICAgICAgICAgLy8gY2xkCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4ZjMpOyAgICAgICAgIC8vIHJlcAotICAgICAgICAgICAgICAgICAgICAgICAgbygweGE0KTsgICAgICAgICAvLyBtb3ZzYgotICAgICAgICAgICAgICAgICAgICAgICAgbygweDVlKTsgICAgICAgICAvLyBwb3BsICVlc2kKLSAgICAgICAgICAgICAgICAgICAgICAgIG8oMHg1Zik7ICAgICAgICAgLy8gcG9wbCAlZWRpCi0gICAgICAgICAgICAgICAgICAgICAgICBvKDB4OWQpOyAgICAgICAgIC8vIHBvcGYKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoInN0b3JlUjBUb1RPUzogdW5zdXBwb3J0ZWQgdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UjBUeXBlKHBUYXJnZXRUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBsb2FkUjBGcm9tUjAoKSB7Ci0gICAgICAgICAgICBUeXBlKiBwUG9pbnRlclR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIGFzc2VydChwUG9pbnRlclR5cGUtPnRhZyA9PSBUWV9QT0lOVEVSKTsKLSAgICAgICAgICAgIFR5cGUqIHBOZXdUeXBlID0gcFBvaW50ZXJUeXBlLT5wSGVhZDsKLSAgICAgICAgICAgIFR5cGVUYWcgdGFnID0gcE5ld1R5cGUtPnRhZzsKLSAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9QT0lOVEVSOgotICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgICAgICBvMigweDAwOGIpOyAvKiBtb3YgKCVlYXgpLCAlZWF4ICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgICAgIG8oMHhiZjBmKTsgLyogbW92c3dsICglZWF4KSwgJWVheCAqLwotICAgICAgICAgICAgICAgICAgICBvYigwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9DSEFSOgotICAgICAgICAgICAgICAgICAgICBvKDB4YmUwZik7IC8qIG1vdnNibCAoJWVheCksICVlYXggKi8KLSAgICAgICAgICAgICAgICAgICAgb2IoMCk7IC8qIGFkZCB6ZXJvIGluIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgbzIoMHgwMGQ5KTsgLy8gZmxkcyAoJWVheCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgIG8yKDB4MDBkZCk7IC8vIGZsZGwgKCVlYXgpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfQVJSQVk6Ci0gICAgICAgICAgICAgICAgICAgIHBOZXdUeXBlID0gcE5ld1R5cGUtPnBUYWlsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1NUUlVDVDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoImxvYWRSMEZyb21SMDogdW5zdXBwb3J0ZWQgdHlwZSAlZCIsIHRhZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UjBUeXBlKHBOZXdUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBsZWFSMChpbnQgZWEsIFR5cGUqIHBQb2ludGVyVHlwZSwgRXhwcmVzc2lvblR5cGUgZXQpIHsKLSAgICAgICAgICAgIGdtb3YoMTAsIGVhKTsgLyogbGVhbCBFQSwgJWVheCAqLwotICAgICAgICAgICAgc2V0UjBUeXBlKHBQb2ludGVyVHlwZSwgZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgbGVhRm9yd2FyZChpbnQgZWEsIFR5cGUqIHBQb2ludGVyVHlwZSkgewotICAgICAgICAgICAgb2FkKDB4YjgsIGVhKTsgLyogbW92ICR4eCwgJWVheCAqLwotICAgICAgICAgICAgc2V0UjBUeXBlKHBQb2ludGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UEMoKSAtIDQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgY29udmVydFIwSW1wKFR5cGUqIHBUeXBlLCBib29sIGlzQ2FzdCl7Ci0gICAgICAgICAgICBUeXBlKiBwUjBUeXBlID0gZ2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICBpZiAocFIwVHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXRSMFR5cGUocFR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc1BvaW50ZXJUeXBlKHBUeXBlKSAmJiBpc1BvaW50ZXJUeXBlKHBSMFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgVHlwZSogcEEgPSBwUjBUeXBlOwotICAgICAgICAgICAgICAgIFR5cGUqIHBCID0gcFR5cGU7Ci0gICAgICAgICAgICAgICAgLy8gQXJyYXkgZGVjYXlzIHRvIHBvaW50ZXIKLSAgICAgICAgICAgICAgICBpZiAocEEtPnRhZyA9PSBUWV9BUlJBWSAmJiBwQi0+dGFnID09IFRZX1BPSU5URVIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEEgPSBwQS0+cFRhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghICh0eXBlRXF1YWwocEEsIHBCKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcEItPnBIZWFkLT50YWcgPT0gVFlfVk9JRAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBBLT50YWcgPT0gVFlfUE9JTlRFUiAmJiBwQi0+dGFnID09IFRZX1BPSU5URVIgJiYgaXNDYXN0KQotICAgICAgICAgICAgICAgICAgICApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJJbmNvbXBhdGlibGUgcG9pbnRlciBvciBhcnJheSB0eXBlcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0c1NhbWUocFR5cGUsIHBSMFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyBzcGVjaWFsCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRmxvYXRUeXBlKHBUeXBlKSAmJiBpc0Zsb2F0VHlwZShwUjBUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgc3BlY2lhbCwgYm90aCBoZWxkIGluIHNhbWUgcmVnaXN0ZXIgb24geDg3LgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUeXBlVGFnIHIwVGFnID0gY29sbGFwc2VUeXBlKHBSMFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICAgICAgVHlwZVRhZyBkZXN0VGFnID0gY29sbGFwc2VUeXBlKHBUeXBlLT50YWcpOwotICAgICAgICAgICAgICAgIGlmIChyMFRhZyA9PSBUWV9JTlQgJiYgaXNGbG9hdFRhZyhkZXN0VGFnKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IFIwIGZyb20gaW50IHRvIGZsb2F0Ci0gICAgICAgICAgICAgICAgICAgIG8oMHg1MCk7ICAgICAgLy8gcHVzaCAlZWF4Ci0gICAgICAgICAgICAgICAgICAgIG8oMHgyNDA0REIpOyAgLy8gZmlsZGwgMCglZXNwKQotICAgICAgICAgICAgICAgICAgICBvKDB4NTgpOyAgICAgIC8vIHBvcCAlZWF4Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Zsb2F0VGFnKHIwVGFnKSAmJiBkZXN0VGFnID09IFRZX0lOVCkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IFIwIGZyb20gZmxvYXQgdG8gaW50LiBDb21wbGljYXRlZCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgcm91bmRpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgbygweDUwKTsgICAgICAgLy8gcHVzaCAlZWF4Ci0gICAgICAgICAgICAgICAgICAgIG8oMHg1MCk7ICAgICAgIC8vIHB1c2ggJWVheAotICAgICAgICAgICAgICAgICAgICBvKDB4MDIyNDdjRDkpOyAvLyBmbnN0Y3cgMiglZXNwKQotICAgICAgICAgICAgICAgICAgICBvKDB4MjQ0NGI3MGYpOyAvLyBtb3Z6d2wgMiglZXNwKSwgJWVheAotICAgICAgICAgICAgICAgICAgICBvKDB4MDIpOwotICAgICAgICAgICAgICAgICAgICBvKDB4MGNiNCk7ICAgICAvLyBtb3ZiICQxMiwgJWFoCi0gICAgICAgICAgICAgICAgICAgIG8oMHgyNDA0ODk2Nik7IC8vIG1vdncgJWF4LCAwKCVlc3ApCi0gICAgICAgICAgICAgICAgICAgIG8oMHgyNDJjZDkpOyAgIC8vIGZsZGN3IDAoJWVzcCkKLSAgICAgICAgICAgICAgICAgICAgbygweDA0MjQ1Y2RiKTsgLy8gZmlzdHBsIDQoJWVzcCkKLSAgICAgICAgICAgICAgICAgICAgbygweDAyMjQ2Y2Q5KTsgLy8gZmxkY3cgIDIoJWVzcCkKLSAgICAgICAgICAgICAgICAgICAgbygweDU4KTsgLy8gcG9wICVlYXgKLSAgICAgICAgICAgICAgICAgICAgbygweDU4KTsgLy8gcG9wICVlYXgKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnJvcigiSW5jb21wYXRpYmxlIHR5cGVzIG9sZDogJWQgbmV3OiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSMFR5cGUtPnRhZywgcFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UjBUeXBlKHBUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgaW50IGJlZ2luRnVuY3Rpb25DYWxsQXJndW1lbnRzKCkgewotICAgICAgICAgICAgcmV0dXJuIG9hZCgweGVjODEsIDApOyAvKiBzdWIgJHh4eCwgJWVzcCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBzaXplX3Qgc3RvcmVSMFRvQXJnKGludCBsLCBUeXBlKiBwQXJnVHlwZSkgewotICAgICAgICAgICAgY29udmVydFIwKHBBcmdUeXBlKTsKLSAgICAgICAgICAgIFR5cGUqIHBSMFR5cGUgPSBnZXRSMFR5cGUoKTsKLSAgICAgICAgICAgIFR5cGVUYWcgcjBjdCA9IGNvbGxhcHNlVHlwZShwUjBUeXBlLT50YWcpOwotICAgICAgICAgICAgc3dpdGNoKHIwY3QpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgb2FkKDB4MjQ4NDg5LCBsKTsgLyogbW92bCAlZWF4LCB4eHgoJWVzcCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgb2FkKDB4MjQ5Q0Q5LCBsKTsgLyogZnN0cHMgICB4eHgoJWVzcCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgIG9hZCgweDI0OUNERCwgbCk7IC8qIGZzdHBsICAgeHh4KCVlc3ApICovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiA4OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGVuZEZ1bmN0aW9uQ2FsbEFyZ3VtZW50cyhUeXBlKiBwRGVjbCwgaW50IGEsIGludCBsKSB7Ci0gICAgICAgICAgICAqIChpbnQqKSBhID0gbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgaW50IGNhbGxGb3J3YXJkKGludCBzeW1ib2wsIFR5cGUqIHBGdW5jKSB7Ci0gICAgICAgICAgICBhc3NlcnQocEZ1bmMtPnRhZyA9PSBUWV9GVU5DKTsKLSAgICAgICAgICAgIHNldFIwVHlwZShwRnVuYy0+cEhlYWQpOwotICAgICAgICAgICAgcmV0dXJuIHBzeW0oMHhlOCwgc3ltYm9sKTsgLyogY2FsbCB4eHggKi8KLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsSW5kaXJlY3QoaW50IGwsIFR5cGUqIHBGdW5jKSB7Ci0gICAgICAgICAgICBhc3NlcnQocEZ1bmMtPnRhZyA9PSBUWV9GVU5DKTsKLSAgICAgICAgICAgIHBvcFR5cGUoKTsgLy8gR2V0IHJpZCBvZiBpbmRpcmVjdCBmbiBwb2ludGVyIHR5cGUKLSAgICAgICAgICAgIHNldFIwVHlwZShwRnVuYy0+cEhlYWQpOwotICAgICAgICAgICAgb2FkKDB4MjQ5NGZmLCBsKTsgLyogY2FsbCAqeHh4KCVlc3ApICovCi0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U3RhY2tBZnRlckNhbGwoVHlwZSogcERlY2wsIGludCBsLCBib29sIGlzSW5kaXJlY3QpIHsKLSAgICAgICAgICAgIGFzc2VydChwRGVjbC0+dGFnID09IFRZX0ZVTkMpOwotICAgICAgICAgICAgaWYgKGlzSW5kaXJlY3QpIHsKLSAgICAgICAgICAgICAgICBsICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobCA+IDApIHsKLSAgICAgICAgICAgICAgICBvYWQoMHhjNDgxLCBsKTsgLyogYWRkICR4eHgsICVlc3AgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgaW50IGp1bXBPZmZzZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gNTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG91dHB1dCBhIHN5bWJvbCBhbmQgcGF0Y2ggYWxsIGNhbGxzIHRvIGl0ICovCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnc3ltKGludCB0KSB7Ci0gICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgIGludCBwYyA9IGdldFBDKCk7Ci0gICAgICAgICAgICB3aGlsZSAodCkgewotICAgICAgICAgICAgICAgIG4gPSAqKGludCAqKSB0OyAvKiBuZXh0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgKihpbnQgKikgdCA9IHBjIC0gdCAtIDQ7Ci0gICAgICAgICAgICAgICAgdCA9IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBvdXRwdXQgYSBzeW1ib2wgYW5kIHBhdGNoIGFsbCBjYWxscyB0byBpdCwgdXNpbmcgYWJzb2x1dGUgYWRkcmVzcyAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVzb2x2ZUZvcndhcmQoaW50IHQpIHsKLSAgICAgICAgICAgIGludCBuOwotICAgICAgICAgICAgaW50IHBjID0gZ2V0UEMoKTsKLSAgICAgICAgICAgIHdoaWxlICh0KSB7Ci0gICAgICAgICAgICAgICAgbiA9ICooaW50ICopIHQ7IC8qIG5leHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAqKGludCAqKSB0ID0gcGM7Ci0gICAgICAgICAgICAgICAgdCA9IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludCBmaW5pc2hDb21waWxlKCkgewotICAgICAgICAgICAgc2l6ZV90IHBhZ2VzaXplID0gNDA5NjsKLSAgICAgICAgICAgIHNpemVfdCBiYXNlID0gKHNpemVfdCkgZ2V0QmFzZSgpICYgfiAocGFnZXNpemUgLSAxKTsKLSAgICAgICAgICAgIHNpemVfdCB0b3AgPSAgKChzaXplX3QpIGdldFBDKCkgKyBwYWdlc2l6ZSAtIDEpICYgfiAocGFnZXNpemUgLSAxKTsKLSAgICAgICAgICAgIGludCBlcnIgPSBtcHJvdGVjdCgodm9pZCopIGJhc2UsIHRvcCAtIGJhc2UsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMpOwotICAgICAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgICAgZXJyb3IoIm1wcm90ZWN0KCkgZmFpbGVkOiAlZCIsIGVycm5vKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWxpZ25tZW50IChpbiBieXRlcykgZm9yIHRoaXMgdHlwZSBvZiBkYXRhCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIHNpemVfdCBhbGlnbm1lbnRPZihUeXBlKiBwVHlwZSl7Ci0gICAgICAgICAgICBzd2l0Y2ggKHBUeXBlLT50YWcpIHsKLSAgICAgICAgICAgIGNhc2UgVFlfQ0hBUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGNhc2UgVFlfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICBjYXNlIFRZX0FSUkFZOgotICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbm1lbnRPZihwVHlwZS0+cEhlYWQpOwotICAgICAgICAgICAgY2FzZSBUWV9TVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBUeXBlLT5wSGVhZC0+YWxpZ25tZW50ICYgMHg3ZmZmZmZmZjsKLSAgICAgICAgICAgIGNhc2UgVFlfRlVOQzoKLSAgICAgICAgICAgICAgICBlcnJvcigiYWxpZ25tZW50IG9mIGZ1bmMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcnJheSBlbGVtZW50IGFsaWdubWVudCAoaW4gYnl0ZXMpIGZvciB0aGlzIHR5cGUgb2YgZGF0YS4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgc2l6ZV90IHNpemVPZihUeXBlKiBwVHlwZSl7Ci0gICAgICAgICAgICBzd2l0Y2gocFR5cGUtPnRhZykgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1NIT1JUOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0NIQVI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gODsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgICAgIGNhc2UgVFlfQVJSQVk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwVHlwZS0+bGVuZ3RoICogc2l6ZU9mKHBUeXBlLT5wSGVhZCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9TVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwVHlwZS0+cEhlYWQtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSAlZCIsIHBUeXBlLT50YWcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLQotICAgICAgICAvKiogT3V0cHV0IDEgdG8gNCBieXRlcy4KLSAgICAgICAgICoKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgbyhpbnQgbikgewotICAgICAgICAgICAgLyogY2Fubm90IHVzZSB1bnNpZ25lZCwgc28gd2UgbXVzdCBkbyBhIGhhY2sgKi8KLSAgICAgICAgICAgIHdoaWxlIChuICYmIG4gIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBvYihuICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgbiA9IG4gPj4gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE91dHB1dCBleGFjdGx5IDIgYnl0ZXMKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgbzIoaW50IG4pIHsKLSAgICAgICAgICAgIG9iKG4gJiAweGZmKTsKLSAgICAgICAgICAgIG9iKDB4ZmYgJiAobiA+PiA4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwc3ltIGlzIHVzZWQgdG8gcHV0IGFuIGluc3RydWN0aW9uIHdpdGggYSBkYXRhIGZpZWxkIHdoaWNoIGlzIGEKLSAgICAgICAgIHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gSXQgaXMgaW4gZmFjdCB0aGUgc2FtZSBhcyBvYWQgISAqLwotICAgICAgICBpbnQgcHN5bShpbnQgbiwgaW50IHQpIHsKLSAgICAgICAgICAgIHJldHVybiBvYWQobiwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpbnN0cnVjdGlvbiArIGFkZHJlc3MgKi8KLSAgICAgICAgaW50IG9hZChpbnQgbiwgaW50IHQpIHsKLSAgICAgICAgICAgIG8obik7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0UEMoKTsKLSAgICAgICAgICAgIG80KHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgb3BlcmF0b3JIZWxwZXJbXTsKLQotICAgICAgICBpbnQgZGVjb2RlT3AoaW50IG9wKSB7Ci0gICAgICAgICAgICBpZiAob3AgPCAwIHx8IG9wID4gT1BfQ09VTlQpIHsKLSAgICAgICAgICAgICAgICBlcnJvcigiT3V0LW9mLXJhbmdlIG9wZXJhdG9yOiAlZFxuIiwgb3ApOwotICAgICAgICAgICAgICAgIG9wID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRvckhlbHBlcltvcF07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGdtb3YoaW50IGwsIGludCB0KSB7Ci0gICAgICAgICAgICBvKGwgKyAweDgzKTsKLSAgICAgICAgICAgIG9hZCgodCA+IC1MT0NBTCAmJiB0IDwgTE9DQUwpIDw8IDcgfCA1LCB0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0dXBGbG9hdE9wZXJhbmRzKCkgewotICAgICAgICAgICAgVHlwZSogcFIwVHlwZSA9IGdldFIwVHlwZSgpOwotICAgICAgICAgICAgVHlwZSogcFRPU1R5cGUgPSBnZXRUT1NUeXBlKCk7Ci0gICAgICAgICAgICBUeXBlVGFnIHRhZ1IwID0gcFIwVHlwZS0+dGFnOwotICAgICAgICAgICAgVHlwZVRhZyB0YWdUT1MgPSBwVE9TVHlwZS0+dGFnOwotICAgICAgICAgICAgYm9vbCBpc0Zsb2F0UjAgPSBpc0Zsb2F0VGFnKHRhZ1IwKTsKLSAgICAgICAgICAgIGJvb2wgaXNGbG9hdFRPUyA9IGlzRmxvYXRUYWcodGFnVE9TKTsKLSAgICAgICAgICAgIGlmICghIGlzRmxvYXRSMCkgewotICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgUjAgZnJvbSBpbnQgdG8gZmxvYXQKLSAgICAgICAgICAgICAgICBvKDB4NTApOyAgICAgIC8vIHB1c2ggJWVheAotICAgICAgICAgICAgICAgIG8oMHgyNDA0REIpOyAgLy8gZmlsZGwgMCglZXNwKQotICAgICAgICAgICAgICAgIG8oMHg1OCk7ICAgICAgLy8gcG9wICVlYXgKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghIGlzRmxvYXRUT1MpewotICAgICAgICAgICAgICAgIG8oMHgyNDA0REIpOyAgLy8gZmlsZGwgMCglZXNwKTsKLSAgICAgICAgICAgICAgICBvKDB4NTgpOyAgICAgIC8vIHBvcCAlZWF4Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh0YWdUT1MgPT0gVFlfRkxPQVQpIHsKLSAgICAgICAgICAgICAgICAgICAgbygweDI0MDRkOSk7ICAvLyBmbGRzICglZXNwKQotICAgICAgICAgICAgICAgICAgICBvKDB4NTgpOyAgICAgIC8vIHBvcCAlZWF4Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbygweDI0MDRkZCk7ICAvLyBmbGRsICglZXNwKQotICAgICAgICAgICAgICAgICAgICBvKDB4NTgpOyAgICAgIC8vIHBvcCAlZWF4Ci0gICAgICAgICAgICAgICAgICAgIG8oMHg1OCk7ICAgICAgLy8gcG9wICVlYXgKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3BUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0jZW5kaWYgLy8gUFJPVklERV9YODZfQ09ERUdFTgotCi0jaWZkZWYgUFJPVklERV9UUkFDRV9DT0RFR0VOCi0gICAgY2xhc3MgVHJhY2VDb2RlR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgewotICAgIHByaXZhdGU6Ci0gICAgICAgIENvZGVHZW5lcmF0b3IqIG1wQmFzZTsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgVHJhY2VDb2RlR2VuZXJhdG9yKENvZGVHZW5lcmF0b3IqIHBCYXNlKSB7Ci0gICAgICAgICAgICBtcEJhc2UgPSBwQmFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgflRyYWNlQ29kZUdlbmVyYXRvcigpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtcEJhc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdChJQ29kZUJ1ZiogcENvZGVCdWYpIHsKLSAgICAgICAgICAgIG1wQmFzZS0+aW5pdChwQ29kZUJ1Zik7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldEVycm9yU2luayhFcnJvclNpbmsqIHBFcnJvclNpbmspIHsKLSAgICAgICAgICAgIG1wQmFzZS0+c2V0RXJyb3JTaW5rKHBFcnJvclNpbmspOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcmV0dXJucyBhZGRyZXNzIHRvIHBhdGNoIHdpdGggbG9jYWwgdmFyaWFibGUgc2l6ZQotICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBmdW5jdGlvbkVudHJ5KFR5cGUqIHBEZWNsKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gbXBCYXNlLT5mdW5jdGlvbkVudHJ5KHBEZWNsKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZnVuY3Rpb25FbnRyeShwRGVjbCkgLT4gJWRcbiIsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmN0aW9uRXhpdChUeXBlKiBwRGVjbCwgaW50IGxvY2FsVmFyaWFibGVBZGRyZXNzLCBpbnQgbG9jYWxWYXJpYWJsZVNpemUpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZnVuY3Rpb25FeGl0KHBEZWNsLCAlZCwgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICBsb2NhbFZhcmlhYmxlQWRkcmVzcywgbG9jYWxWYXJpYWJsZVNpemUpOwotICAgICAgICAgICAgbXBCYXNlLT5mdW5jdGlvbkV4aXQocERlY2wsIGxvY2FsVmFyaWFibGVBZGRyZXNzLCBsb2NhbFZhcmlhYmxlU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBsb2FkIGltbWVkaWF0ZSB2YWx1ZSAqLwotICAgICAgICB2aXJ0dWFsIHZvaWQgbGkoaW50IHQpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGkoJWQpXG4iLCB0KTsKLSAgICAgICAgICAgIG1wQmFzZS0+bGkodCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgbG9hZEZsb2F0KGludCBhZGRyZXNzLCBUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2FkRmxvYXQoJWQsIHR5cGU9JWQpXG4iLCBhZGRyZXNzLCBwVHlwZS0+dGFnKTsKLSAgICAgICAgICAgIG1wQmFzZS0+bG9hZEZsb2F0KGFkZHJlc3MsIHBUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGRTdHJ1Y3RPZmZzZXRSMChpbnQgb2Zmc2V0LCBUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGRTdHJ1Y3RPZmZzZXRSMCglZCwgdHlwZT0lZClcbiIsIG9mZnNldCwgcFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICBtcEJhc2UtPmFkZFN0cnVjdE9mZnNldFIwKG9mZnNldCwgcFR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgZ2ptcChpbnQgdCkgewotICAgICAgICAgICAgaW50IHJlc3VsdCA9IG1wQmFzZS0+Z2ptcCh0KTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2ptcCglZCkgPSAlZFxuIiwgdCwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBsID0gMDogamUsIGwgPT0gMTogam5lICovCi0gICAgICAgIHZpcnR1YWwgaW50IGd0c3QoYm9vbCBsLCBpbnQgdCkgewotICAgICAgICAgICAgaW50IHJlc3VsdCA9IG1wQmFzZS0+Z3RzdChsLCB0KTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3RzdCglZCwlZCkgPSAlZFxuIiwgbCwgdCwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZ2NtcChpbnQgb3ApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2NtcCglZClcbiIsIG9wKTsKLSAgICAgICAgICAgIG1wQmFzZS0+Z2NtcChvcCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZ2VuT3AoaW50IG9wKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbk9wKCVkKVxuIiwgb3ApOwotICAgICAgICAgICAgbXBCYXNlLT5nZW5PcChvcCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnVW5hcnlDbXAoaW50IG9wKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdVbmFyeUNtcCglZClcbiIsIG9wKTsKLSAgICAgICAgICAgIG1wQmFzZS0+Z1VuYXJ5Q21wKG9wKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBnZW5VbmFyeU9wKGludCBvcCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5VbmFyeU9wKCVkKVxuIiwgb3ApOwotICAgICAgICAgICAgbXBCYXNlLT5nZW5VbmFyeU9wKG9wKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoUjAoKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInB1c2hSMCgpXG4iKTsKLSAgICAgICAgICAgIG1wQmFzZS0+cHVzaFIwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgb3ZlcigpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAib3ZlcigpXG4iKTsKLSAgICAgICAgICAgIG1wQmFzZS0+b3ZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHBvcFIwKCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwb3BSMCgpXG4iKTsKLSAgICAgICAgICAgIG1wQmFzZS0+cG9wUjAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZVIwVG9UT1MoKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInN0b3JlUjBUb1RPUygpXG4iKTsKLSAgICAgICAgICAgIG1wQmFzZS0+c3RvcmVSMFRvVE9TKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgbG9hZFIwRnJvbVIwKCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2FkUjBGcm9tUjAoKVxuIik7Ci0gICAgICAgICAgICBtcEJhc2UtPmxvYWRSMEZyb21SMCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGxlYVIwKGludCBlYSwgVHlwZSogcFBvaW50ZXJUeXBlLCBFeHByZXNzaW9uVHlwZSBldCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsZWFSMCglZCwgJWQsICVkKVxuIiwgZWEsCi0gICAgICAgICAgICAgICAgICAgIHBQb2ludGVyVHlwZS0+cEhlYWQtPnRhZywgZXQpOwotICAgICAgICAgICAgbXBCYXNlLT5sZWFSMChlYSwgcFBvaW50ZXJUeXBlLCBldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludCBsZWFGb3J3YXJkKGludCBlYSwgVHlwZSogcFBvaW50ZXJUeXBlKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxlYUZvcndhcmQoJWQpXG4iLCBlYSk7Ci0gICAgICAgICAgICByZXR1cm4gbXBCYXNlLT5sZWFGb3J3YXJkKGVhLCBwUG9pbnRlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGNvbnZlcnRSMEltcChUeXBlKiBwVHlwZSwgYm9vbCBpc0Nhc3QpewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb252ZXJ0UjAocFR5cGUgdGFnPSVkLCAlZClcbiIsICBwVHlwZS0+dGFnLCBpc0Nhc3QpOwotICAgICAgICAgICAgbXBCYXNlLT5jb252ZXJ0UjBJbXAocFR5cGUsIGlzQ2FzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludCBiZWdpbkZ1bmN0aW9uQ2FsbEFyZ3VtZW50cygpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBtcEJhc2UtPmJlZ2luRnVuY3Rpb25DYWxsQXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJlZ2luRnVuY3Rpb25DYWxsQXJndW1lbnRzKCkgPSAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHNpemVfdCBzdG9yZVIwVG9BcmcoaW50IGwsIFR5cGUqIHBBcmdUeXBlKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInN0b3JlUjBUb0FyZyglZCwgcEFyZ1R5cGU9JWQpXG4iLCBsLAotICAgICAgICAgICAgICAgICAgICBwQXJnVHlwZS0+dGFnKTsKLSAgICAgICAgICAgIHJldHVybiBtcEJhc2UtPnN0b3JlUjBUb0FyZyhsLCBwQXJnVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZW5kRnVuY3Rpb25DYWxsQXJndW1lbnRzKFR5cGUqIHBEZWNsLCBpbnQgYSwgaW50IGwpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZW5kRnVuY3Rpb25DYWxsQXJndW1lbnRzKCVkLCAlZClcbiIsIGEsIGwpOwotICAgICAgICAgICAgbXBCYXNlLT5lbmRGdW5jdGlvbkNhbGxBcmd1bWVudHMocERlY2wsIGEsIGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgY2FsbEZvcndhcmQoaW50IHN5bWJvbCwgVHlwZSogcEZ1bmMpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBtcEJhc2UtPmNhbGxGb3J3YXJkKHN5bWJvbCwgcEZ1bmMpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYWxsRm9yd2FyZCglZCkgPSAlZFxuIiwgc3ltYm9sLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsSW5kaXJlY3QoaW50IGwsIFR5cGUqIHBGdW5jKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNhbGxJbmRpcmVjdCglZCByZXR1cm50eXBlID0gJWQpXG4iLCBsLAotICAgICAgICAgICAgICAgICAgICBwRnVuYy0+cEhlYWQtPnRhZyk7Ci0gICAgICAgICAgICBtcEJhc2UtPmNhbGxJbmRpcmVjdChsLCBwRnVuYyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U3RhY2tBZnRlckNhbGwoVHlwZSogcERlY2wsIGludCBsLCBib29sIGlzSW5kaXJlY3QpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWRqdXN0U3RhY2tBZnRlckNhbGwocFR5cGUsICVkLCAlZClcbiIsIGwsIGlzSW5kaXJlY3QpOwotICAgICAgICAgICAgbXBCYXNlLT5hZGp1c3RTdGFja0FmdGVyQ2FsbChwRGVjbCwgbCwgaXNJbmRpcmVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGludCBqdW1wT2Zmc2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1wQmFzZS0+anVtcE9mZnNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3V0cHV0IGEgc3ltYm9sIGFuZCBwYXRjaCBhbGwgY2FsbHMgdG8gaXQgKi8KLSAgICAgICAgdmlydHVhbCB2b2lkIGdzeW0oaW50IHQpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3N5bSglZClcbiIsIHQpOwotICAgICAgICAgICAgbXBCYXNlLT5nc3ltKHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHJlc29sdmVGb3J3YXJkKGludCB0KSB7Ci0gICAgICAgICAgICBtcEJhc2UtPnJlc29sdmVGb3J3YXJkKHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgZmluaXNoQ29tcGlsZSgpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBtcEJhc2UtPmZpbmlzaENvbXBpbGUoKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmluaXNoQ29tcGlsZSgpID0gJWRcbiIsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFsaWdubWVudCAoaW4gYnl0ZXMpIGZvciB0aGlzIHR5cGUgb2YgZGF0YQotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBzaXplX3QgYWxpZ25tZW50T2YoVHlwZSogcFR5cGUpewotICAgICAgICAgICAgcmV0dXJuIG1wQmFzZS0+YWxpZ25tZW50T2YocFR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFycmF5IGVsZW1lbnQgYWxpZ25tZW50IChpbiBieXRlcykgZm9yIHRoaXMgdHlwZSBvZiBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBzaXplX3Qgc2l6ZU9mKFR5cGUqIHBUeXBlKXsKLSAgICAgICAgICAgIHJldHVybiBtcEJhc2UtPnNpemVPZihwVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIFR5cGUqIGdldFIwVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtcEJhc2UtPmdldFIwVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBFeHByZXNzaW9uVHlwZSBnZXRSMEV4cHJlc3Npb25UeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1wQmFzZS0+Z2V0UjBFeHByZXNzaW9uVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHNldFIwRXhwcmVzc2lvblR5cGUoRXhwcmVzc2lvblR5cGUgZXQpIHsKLSAgICAgICAgICAgIG1wQmFzZS0+c2V0UjBFeHByZXNzaW9uVHlwZShldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRFeHByZXNzaW9uU3RhY2tEZXB0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtcEJhc2UtPmdldEV4cHJlc3Npb25TdGFja0RlcHRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgZm9yY2VSMFJWYWwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbXBCYXNlLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotI2VuZGlmIC8vIFBST1ZJREVfVFJBQ0VfQ09ERUdFTgotCi0gICAgY2xhc3MgQXJlbmEgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gVXNlZCB0byByZWNvcmQgYSBnaXZlbiBhbGxvY2F0aW9uIGFtb3VudC4KLSAgICAgICAgLy8gVXNlZDoKLSAgICAgICAgLy8gTWFyayBtYXJrID0gYXJlbmEubWFyaygpOwotICAgICAgICAvLyAuLi4gbG90cyBvZiBhcmVuYS5hbGxvY2F0ZSgpCi0gICAgICAgIC8vIGFyZW5hLmZyZWUobWFyayk7Ci0KLSAgICAgICAgc3RydWN0IE1hcmsgewotICAgICAgICAgICAgc2l6ZV90IGNodW5rOwotICAgICAgICAgICAgc2l6ZV90IG9mZnNldDsKLSAgICAgICAgfTsKLQotICAgICAgICBBcmVuYSgpIHsKLSAgICAgICAgICAgIG1DdXJyZW50Q2h1bmsgPSAwOwotICAgICAgICAgICAgQ2h1bmsgc3RhcnQoQ0hVTktfU0laRSk7Ci0gICAgICAgICAgICBtRGF0YS5wdXNoX2JhY2soc3RhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgfkFyZW5hKCkgewotICAgICAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1EYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbURhdGFbaV0uZnJlZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsb2MgdXNpbmcgdGhlIHN0YW5kYXJkIGFsaWdubWVudCBzaXplIHNhZmUgZm9yIGFueSB2YXJpYWJsZQotICAgICAgICB2b2lkKiBhbGxvYyhzaXplX3Qgc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGFsbG9jKHNpemUsIDgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFyayBtYXJrKCl7Ci0gICAgICAgICAgICBNYXJrIHJlc3VsdDsKLSAgICAgICAgICAgIHJlc3VsdC5jaHVuayA9IG1DdXJyZW50Q2h1bms7Ci0gICAgICAgICAgICByZXN1bHQub2Zmc2V0ID0gbURhdGFbbUN1cnJlbnRDaHVua10ubU9mZnNldDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZyZWVUb01hcmsoY29uc3QgTWFyayYgbWFyaykgewotICAgICAgICAgICAgbUN1cnJlbnRDaHVuayA9IG1hcmsuY2h1bms7Ci0gICAgICAgICAgICBtRGF0YVttQ3VycmVudENodW5rXS5tT2Zmc2V0ID0gbWFyay5vZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBhbGlnbmVkIHRvIGEgZ2l2ZW4gc2l6ZQotICAgICAgICAvLyBhbmQgYSBnaXZlbiBwb3dlci1vZi10d28tc2l6ZWQgYWxpZ25tZW50IChlLmcuIDEsMiw0LDgsLi4uKQotICAgICAgICAvLyBNZW1vcnkgaXMgbm90IHplcm8gZmlsbGVkLgotCi0gICAgICAgIHZvaWQqIGFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50KSB7Ci0gICAgICAgICAgICB3aGlsZSAoc2l6ZSA+IG1EYXRhW21DdXJyZW50Q2h1bmtdLnJlbWFpbmluZ0NhcGFjaXR5KGFsaWdubWVudCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRDaHVuayArIDEgPCBtRGF0YS5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDaHVuaysrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGxvY1NpemUgPSBDSFVOS19TSVpFOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NTaXplIDwgc2l6ZSArIGFsaWdubWVudCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnQgLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENodW5rIGNodW5rKGFsbG9jU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhLnB1c2hfYmFjayhjaHVuayk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2h1bmsrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURhdGFbbUN1cnJlbnRDaHVua10uYWxsb2NhdGUoc2l6ZSwgYWxpZ25tZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgQ0hVTktfU0laRSA9IDEyOCoxMDI0OwotICAgICAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGRvZXMgbm90IGRlYWxsb2NhdGUgaXRzCi0gICAgICAgIC8vIG1lbW9yeSB3aGVuIGl0J3MgZGVzdHJveWVkLiBJdCBkZXBlbmRzIHVwb24KLSAgICAgICAgLy8gaXRzIHBhcmVudCB0byBkZWFsbG9jYXRlIHRoZSBtZW1vcnkuCi0gICAgICAgIHN0cnVjdCBDaHVuayB7Ci0gICAgICAgICAgICBDaHVuaygpIHsKLSAgICAgICAgICAgICAgICBtcERhdGEgPSAwOwotICAgICAgICAgICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgICAgICAgICBtT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2h1bmsoc2l6ZV90IHNpemUpIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgbXBEYXRhID0gKGNoYXIqKSBtYWxsb2Moc2l6ZSk7Ci0gICAgICAgICAgICAgICAgbU9mZnNldCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH5DaHVuaygpIHsKLSAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGRlYWxsb2NhdGUgbWVtb3J5LgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkKiBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCkgewotICAgICAgICAgICAgICAgIHNpemVfdCBhbGlnbmVkT2Zmc2V0ID0gYWxpZ25lZChtT2Zmc2V0LCBhbGlnbm1lbnQpOwotICAgICAgICAgICAgICAgIHZvaWQqIHJlc3VsdCA9IG1wRGF0YSArIGFsaWduZWRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbU9mZnNldCA9IGFsaWduZWRPZmZzZXQgKyBzaXplOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvaWQgZnJlZSgpIHsKLSAgICAgICAgICAgICAgICBpZiAobXBEYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIDo6ZnJlZShtcERhdGEpOwotICAgICAgICAgICAgICAgICAgICBtcERhdGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZ0NhcGFjaXR5KHNpemVfdCBhbGlnbm1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25lZChtU2l6ZSwgYWxpZ25tZW50KSAtIGFsaWduZWQobU9mZnNldCwgYWxpZ25tZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXNzdW1lIGFsaWdubWVudCBpcyBhIHBvd2VyIG9mIHR3bwotICAgICAgICAgICAgaW5saW5lIHNpemVfdCBhbGlnbmVkKHNpemVfdCB2LCBzaXplX3QgYWxpZ25tZW50KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG1hc2sgPSBhbGlnbm1lbnQtMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHYgKyBtYXNrKSAmIH5tYXNrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjaGFyKiBtcERhdGE7Ci0gICAgICAgICAgICBzaXplX3QgbVNpemU7Ci0gICAgICAgICAgICBzaXplX3QgbU9mZnNldDsKLSAgICAgICAgfTsKLQotICAgICAgICBzaXplX3QgbUN1cnJlbnRDaHVuazsKLQotICAgICAgICBWZWN0b3I8Q2h1bms+IG1EYXRhOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVmFyaWFibGVJbmZvOwotCi0gICAgc3RydWN0IFRva2VuIHsKLSAgICAgICAgaW50IGhhc2g7Ci0gICAgICAgIHNpemVfdCBsZW5ndGg7Ci0gICAgICAgIGNoYXIqIHBUZXh0OwotICAgICAgICB0b2tlbmlkX3QgaWQ7Ci0KLSAgICAgICAgLy8gQ3VycmVudCB2YWx1ZXMgZm9yIHRoZSB0b2tlbgotICAgICAgICBjaGFyKiBtcE1hY3JvRGVmaW5pdGlvbjsKLSAgICAgICAgVmFyaWFibGVJbmZvKiBtcFZhcmlhYmxlSW5mbzsKLSAgICAgICAgVmFyaWFibGVJbmZvKiBtcFN0cnVjdEluZm87Ci0gICAgfTsKLQotICAgIGNsYXNzIFRva2VuVGFibGUgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gRG9uJ3QgdXNlIDAuLjB4ZmYsIGFsbG93cyBjaGFyYWN0ZXJzIGFuZCBvcGVyYXRvcnMgdG8gYmUgdG9rZW5zIHRvby4KLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IFRPS0VOX0JBU0UgPSAweDEwMDsKLSAgICAgICAgVG9rZW5UYWJsZSgpIHsKLSAgICAgICAgICAgIG1wTWFwID0gaGFzaG1hcENyZWF0ZSgxMjgsIGhhc2hGbiwgZXF1YWxzRm4pOwotICAgICAgICB9Ci0KLSAgICAgICAgflRva2VuVGFibGUoKSB7Ci0gICAgICAgICAgICBoYXNobWFwRnJlZShtcE1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldEFyZW5hKEFyZW5hKiBwQXJlbmEpIHsKLSAgICAgICAgICAgIG1wQXJlbmEgPSBwQXJlbmE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXR1cm5zIGEgdG9rZW4gZm9yIGEgZ2l2ZW4gc3RyaW5nIG9mIGNoYXJhY3RlcnMuCi0gICAgICAgIHRva2VuaWRfdCBpbnRlcm4oY29uc3QgY2hhciogcFRleHQsIHNpemVfdCBsZW5ndGgpIHsKLSAgICAgICAgICAgIFRva2VuIHByb2JlOwotICAgICAgICAgICAgaW50IGhhc2ggPSBoYXNobWFwSGFzaCgodm9pZCopIHBUZXh0LCBsZW5ndGgpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRva2VuIHByb2JlOwotICAgICAgICAgICAgICAgIHByb2JlLmhhc2ggPSBoYXNoOwotICAgICAgICAgICAgICAgIHByb2JlLmxlbmd0aCA9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICBwcm9iZS5wVGV4dCA9IChjaGFyKikgcFRleHQ7Ci0gICAgICAgICAgICAgICAgVG9rZW4qIHBWYWx1ZSA9IChUb2tlbiopIGhhc2htYXBHZXQobXBNYXAsICZwcm9iZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFZhbHVlLT5pZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRva2VuKiBwVG9rZW4gPSAoVG9rZW4qKSBtcEFyZW5hLT5hbGxvYyhzaXplb2YoVG9rZW4pKTsKLSAgICAgICAgICAgIG1lbXNldChwVG9rZW4sIDAsIHNpemVvZigqcFRva2VuKSk7Ci0gICAgICAgICAgICBwVG9rZW4tPmhhc2ggPSBoYXNoOwotICAgICAgICAgICAgcFRva2VuLT5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgICAgICBwVG9rZW4tPnBUZXh0ID0gKGNoYXIqKSBtcEFyZW5hLT5hbGxvYyhsZW5ndGggKyAxKTsKLSAgICAgICAgICAgIG1lbWNweShwVG9rZW4tPnBUZXh0LCBwVGV4dCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIHBUb2tlbi0+cFRleHRbbGVuZ3RoXSA9IDA7Ci0gICAgICAgICAgICBwVG9rZW4tPmlkID0gbVRva2Vucy5zaXplKCkgKyBUT0tFTl9CQVNFOwotICAgICAgICAgICAgbVRva2Vucy5wdXNoX2JhY2socFRva2VuKTsKLSAgICAgICAgICAgIGhhc2htYXBQdXQobXBNYXAsIHBUb2tlbiwgcFRva2VuKTsKLSAgICAgICAgICAgIHJldHVybiBwVG9rZW4tPmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSBUb2tlbiBmb3IgYSBnaXZlbiB0b2tlbmlkLgotICAgICAgICBUb2tlbiYgb3BlcmF0b3JbXSh0b2tlbmlkX3QgaWQpIHsKLSAgICAgICAgICAgIHJldHVybiAqbVRva2Vuc1tpZCAtIFRPS0VOX0JBU0VdOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHNpemVfdCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ub2tlbnMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgIHN0YXRpYyBpbnQgaGFzaEZuKHZvaWQqIHBLZXkpIHsKLSAgICAgICAgICAgIFRva2VuKiBwVG9rZW4gPSAoVG9rZW4qKSBwS2V5OwotICAgICAgICAgICAgcmV0dXJuIHBUb2tlbi0+aGFzaDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBib29sIGVxdWFsc0ZuKHZvaWQqIGtleUEsIHZvaWQqIGtleUIpIHsKLSAgICAgICAgICAgIFRva2VuKiBwVG9rZW5BID0gKFRva2VuKikga2V5QTsKLSAgICAgICAgICAgIFRva2VuKiBwVG9rZW5CID0gKFRva2VuKikga2V5QjsKLSAgICAgICAgICAgIC8vIERvbid0IG5lZWQgdG8gY29tcGFyZSBoYXNoIHZhbHVlcywgdGhleSBzaG91bGQgYWx3YXlzIGJlIGVxdWFsCi0gICAgICAgICAgICByZXR1cm4gcFRva2VuQS0+bGVuZ3RoID09IHBUb2tlbkItPmxlbmd0aAotICAgICAgICAgICAgICAgICYmIHN0cmNtcChwVG9rZW5BLT5wVGV4dCwgcFRva2VuQi0+cFRleHQpID09IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBIYXNobWFwKiBtcE1hcDsKLSAgICAgICAgVmVjdG9yPFRva2VuKj4gbVRva2VuczsKLSAgICAgICAgQXJlbmEqIG1wQXJlbmE7Ci0gICAgfTsKLQotICAgIGNsYXNzIElucHV0U3RyZWFtIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfklucHV0U3RyZWFtKCkge30KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q2hhcigpID0gMDsKLSAgICB9OwotCi0gICAgY2xhc3MgVGV4dElucHV0U3RyZWFtIDogcHVibGljIElucHV0U3RyZWFtIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFRleHRJbnB1dFN0cmVhbShjb25zdCBjaGFyKiB0ZXh0LCBzaXplX3QgdGV4dExlbmd0aCkKLSAgICAgICAgICAgIDogcFRleHQodGV4dCksIG1UZXh0TGVuZ3RoKHRleHRMZW5ndGgpLCBtUG9zaXRpb24oMCkgewotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb24gPCBtVGV4dExlbmd0aCA/IHBUZXh0W21Qb3NpdGlvbisrXSA6IEVPRjsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3QgY2hhciogcFRleHQ7Ci0gICAgICAgIHNpemVfdCBtVGV4dExlbmd0aDsKLSAgICAgICAgc2l6ZV90IG1Qb3NpdGlvbjsKLSAgICB9OwotCi0gICAgY2xhc3MgU3RyaW5nIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFN0cmluZygpIHsKLSAgICAgICAgICAgIG1wQmFzZSA9IDA7Ci0gICAgICAgICAgICBtVXNlZCA9IDA7Ci0gICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcoY29uc3QgY2hhciogaXRlbSwgaW50IGxlbiwgYm9vbCBhZG9wdCkgewotICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWRvcHQpIHsKLSAgICAgICAgICAgICAgICBtcEJhc2UgPSAoY2hhciopIGl0ZW07Ci0gICAgICAgICAgICAgICAgbVVzZWQgPSBsZW47Ci0gICAgICAgICAgICAgICAgbVNpemUgPSBsZW4gKyAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtcEJhc2UgPSAwOwotICAgICAgICAgICAgICAgIG1Vc2VkID0gMDsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgYXBwZW5kQnl0ZXMoaXRlbSwgbGVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyhjb25zdCBTdHJpbmcmIG90aGVyKSB7Ci0gICAgICAgICAgICBtcEJhc2UgPSAwOwotICAgICAgICAgICAgbVVzZWQgPSAwOwotICAgICAgICAgICAgbVNpemUgPSAwOwotICAgICAgICAgICAgYXBwZW5kQnl0ZXMob3RoZXIuZ2V0VW53cmFwcGVkKCksIG90aGVyLmxlbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIH5TdHJpbmcoKSB7Ci0gICAgICAgICAgICBpZiAobXBCYXNlKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtcEJhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgU3RyaW5nJiBvdGhlcikgewotICAgICAgICAgICAgY2xlYXIoKTsKLSAgICAgICAgICAgIGFwcGVuZEJ5dGVzKG90aGVyLmdldFVud3JhcHBlZCgpLCBvdGhlci5sZW4oKSk7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgY2hhciogZ2V0VW53cmFwcGVkKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1wQmFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBtVXNlZCA9IDA7Ci0gICAgICAgICAgICBpZiAobVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbXBCYXNlWzBdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXBwZW5kQ1N0cihjb25zdCBjaGFyKiBzKSB7Ci0gICAgICAgICAgICBhcHBlbmRCeXRlcyhzLCBzdHJsZW4ocykpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhcHBlbmRCeXRlcyhjb25zdCBjaGFyKiBzLCBpbnQgbikgewotICAgICAgICAgICAgbWVtY3B5KGVuc3VyZShuKSwgcywgbiArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhcHBlbmQoY2hhciBjKSB7Ci0gICAgICAgICAgICAqIGVuc3VyZSgxKSA9IGM7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFwcGVuZChTdHJpbmcmIG90aGVyKSB7Ci0gICAgICAgICAgICBhcHBlbmRCeXRlcyhvdGhlci5nZXRVbndyYXBwZWQoKSwgb3RoZXIubGVuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciogb3JwaGFuKCkgewotICAgICAgICAgICAgY2hhciogcmVzdWx0ID0gbXBCYXNlOwotICAgICAgICAgICAgbXBCYXNlID0gMDsKLSAgICAgICAgICAgIG1Vc2VkID0gMDsKLSAgICAgICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHByaW50Zihjb25zdCBjaGFyKiBmbXQsLi4uKSB7Ci0gICAgICAgICAgICB2YV9saXN0IGFwOwotICAgICAgICAgICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgICAgICAgICB2cHJpbnRmKGZtdCwgYXApOwotICAgICAgICAgICAgdmFfZW5kKGFwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdnByaW50Zihjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApIHsKLSAgICAgICAgICAgIGNoYXIqIHRlbXA7Ci0gICAgICAgICAgICBpbnQgbnVtQ2hhcnMgPSB2YXNwcmludGYoJnRlbXAsIGZtdCwgYXApOwotICAgICAgICAgICAgbWVtY3B5KGVuc3VyZShudW1DaGFycyksIHRlbXAsIG51bUNoYXJzKzEpOwotICAgICAgICAgICAgZnJlZSh0ZW1wKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBzaXplX3QgbGVuKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1Vc2VkOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjaGFyKiBlbnN1cmUoaW50IG4pIHsKLSAgICAgICAgICAgIHNpemVfdCBuZXdVc2VkID0gbVVzZWQgKyBuOwotICAgICAgICAgICAgaWYgKG5ld1VzZWQgPiBtU2l6ZSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBuZXdTaXplID0gbVNpemUgKiAyICsgMTA7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1NpemUgPCBuZXdVc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1NpemUgPSBuZXdVc2VkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtcEJhc2UgPSAoY2hhciopIHJlYWxsb2MobXBCYXNlLCBuZXdTaXplICsgMSk7Ci0gICAgICAgICAgICAgICAgbVNpemUgPSBuZXdTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXBCYXNlW25ld1VzZWRdID0gJ1wwJzsKLSAgICAgICAgICAgIGNoYXIqIHJlc3VsdCA9IG1wQmFzZSArIG1Vc2VkOwotICAgICAgICAgICAgbVVzZWQgPSBuZXdVc2VkOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIqIG1wQmFzZTsKLSAgICAgICAgc2l6ZV90IG1Vc2VkOwotICAgICAgICBzaXplX3QgbVNpemU7Ci0gICAgfTsKLQotICAgIHZvaWQgaW50ZXJuS2V5d29yZHMoKSB7Ci0gICAgICAgIC8vIE5vdGU6IG9yZGVyIGhhcyB0byBtYXRjaCBUT0tfIGNvbnN0YW50cwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhcioga2V5d29yZHNbXSA9IHsKLSAgICAgICAgICAgICJpbnQiLAotICAgICAgICAgICAgImNoYXIiLAotICAgICAgICAgICAgInZvaWQiLAotICAgICAgICAgICAgImlmIiwKLSAgICAgICAgICAgICJlbHNlIiwKLSAgICAgICAgICAgICJ3aGlsZSIsCi0gICAgICAgICAgICAiYnJlYWsiLAotICAgICAgICAgICAgInJldHVybiIsCi0gICAgICAgICAgICAiZm9yIiwKLSAgICAgICAgICAgICJhdXRvIiwKLSAgICAgICAgICAgICJjYXNlIiwKLSAgICAgICAgICAgICJjb25zdCIsCi0gICAgICAgICAgICAiY29udGludWUiLAotICAgICAgICAgICAgImRlZmF1bHQiLAotICAgICAgICAgICAgImRvIiwKLSAgICAgICAgICAgICJkb3VibGUiLAotICAgICAgICAgICAgImVudW0iLAotICAgICAgICAgICAgImV4dGVybiIsCi0gICAgICAgICAgICAiZmxvYXQiLAotICAgICAgICAgICAgImdvdG8iLAotICAgICAgICAgICAgImxvbmciLAotICAgICAgICAgICAgInJlZ2lzdGVyIiwKLSAgICAgICAgICAgICJzaG9ydCIsCi0gICAgICAgICAgICAic2lnbmVkIiwKLSAgICAgICAgICAgICJzaXplb2YiLAotICAgICAgICAgICAgInN0YXRpYyIsCi0gICAgICAgICAgICAic3RydWN0IiwKLSAgICAgICAgICAgICJzd2l0Y2giLAotICAgICAgICAgICAgInR5cGVkZWYiLAotICAgICAgICAgICAgInVuaW9uIiwKLSAgICAgICAgICAgICJ1bnNpZ25lZCIsCi0gICAgICAgICAgICAidm9sYXRpbGUiLAotICAgICAgICAgICAgIl9Cb29sIiwKLSAgICAgICAgICAgICJfQ29tcGxleCIsCi0gICAgICAgICAgICAiX0ltYWdpbmFyeSIsCi0gICAgICAgICAgICAiaW5saW5lIiwKLSAgICAgICAgICAgICJyZXN0cmljdCIsCi0KLSAgICAgICAgICAgIC8vIHByZWRlZmluZWQgdG9rZW5zIHRoYXQgY2FuIGFsc28gYmUgc3ltYm9scyBzdGFydCBoZXJlOgotICAgICAgICAgICAgInByYWdtYSIsCi0gICAgICAgICAgICAiZGVmaW5lIiwKLSAgICAgICAgICAgICJsaW5lIiwKLSAgICAgICAgICAgIDB9OwotCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGtleXdvcmRzW2ldOyBpKyspIHsKLSAgICAgICAgICAgIG1Ub2tlblRhYmxlLmludGVybihrZXl3b3Jkc1tpXSwgc3RybGVuKGtleXdvcmRzW2ldKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJ1Y3QgSW5wdXRTdGF0ZSB7Ci0gICAgICAgIElucHV0U3RyZWFtKiBwU3RyZWFtOwotICAgICAgICBpbnQgb2xkQ2g7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBWYXJpYWJsZUluZm8gewotICAgICAgICB2b2lkKiBwQWRkcmVzczsKLSAgICAgICAgdm9pZCogcEZvcndhcmQ7IC8vIEZvciBhIGZvcndhcmQgZGlyZWN0aW9uLCBsaW5rZWQgbGlzdCBvZiBkYXRhIHRvIGZpeCB1cAotICAgICAgICB0b2tlbmlkX3QgdG9rOwotICAgICAgICBzaXplX3QgbGV2ZWw7Ci0gICAgICAgIFZhcmlhYmxlSW5mbyogcE9sZERlZmluaXRpb247Ci0gICAgICAgIFR5cGUqIHBUeXBlOwotICAgICAgICBib29sIGlzU3RydWN0VGFnOwotICAgIH07Ci0KLSAgICBjbGFzcyBTeW1ib2xTdGFjayB7Ci0gICAgcHVibGljOgotICAgICAgICBTeW1ib2xTdGFjaygpIHsKLSAgICAgICAgICAgIG1wQXJlbmEgPSAwOwotICAgICAgICAgICAgbXBUb2tlblRhYmxlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0QXJlbmEoQXJlbmEqIHBBcmVuYSkgewotICAgICAgICAgICAgbXBBcmVuYSA9IHBBcmVuYTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0VG9rZW5UYWJsZShUb2tlblRhYmxlKiBwVG9rZW5UYWJsZSkgewotICAgICAgICAgICAgbXBUb2tlblRhYmxlID0gcFRva2VuVGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1c2hMZXZlbCgpIHsKLSAgICAgICAgICAgIE1hcmsgbWFyazsKLSAgICAgICAgICAgIG1hcmsubUFyZW5hTWFyayA9IG1wQXJlbmEtPm1hcmsoKTsKLSAgICAgICAgICAgIG1hcmsubVN5bWJvbEhlYWQgPSBtU3RhY2suc2l6ZSgpOwotICAgICAgICAgICAgbUxldmVsU3RhY2sucHVzaF9iYWNrKG1hcmspOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwb3BMZXZlbCgpIHsKLSAgICAgICAgICAgIC8vIFVuZG8gYW55IHNoYWRvd2luZyB0aGF0IHdhcyBkb25lOgotICAgICAgICAgICAgTWFyayBtYXJrID0gbUxldmVsU3RhY2suYmFjaygpOwotICAgICAgICAgICAgbUxldmVsU3RhY2sucG9wX2JhY2soKTsKLSAgICAgICAgICAgIHdoaWxlIChtU3RhY2suc2l6ZSgpID4gbWFyay5tU3ltYm9sSGVhZCkgewotICAgICAgICAgICAgICAgIFZhcmlhYmxlSW5mbyogcFYgPSBtU3RhY2suYmFjaygpOwotICAgICAgICAgICAgICAgIG1TdGFjay5wb3BfYmFjaygpOwotICAgICAgICAgICAgICAgIGlmIChwVi0+aXNTdHJ1Y3RUYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgKCptcFRva2VuVGFibGUpW3BWLT50b2tdLm1wU3RydWN0SW5mbyA9IHBWLT5wT2xkRGVmaW5pdGlvbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAoKm1wVG9rZW5UYWJsZSlbcFYtPnRva10ubXBWYXJpYWJsZUluZm8gPSBwVi0+cE9sZERlZmluaXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXBBcmVuYS0+ZnJlZVRvTWFyayhtYXJrLm1BcmVuYU1hcmspOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBpc0RlZmluZWRBdEN1cnJlbnRMZXZlbCh0b2tlbmlkX3QgdG9rKSB7Ci0gICAgICAgICAgICBWYXJpYWJsZUluZm8qIHBWID0gKCptcFRva2VuVGFibGUpW3Rva10ubXBWYXJpYWJsZUluZm87Ci0gICAgICAgICAgICByZXR1cm4gcFYgJiYgcFYtPmxldmVsID09IGxldmVsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGlzU3RydWN0VGFnRGVmaW5lZEF0Q3VycmVudExldmVsKHRva2VuaWRfdCB0b2spIHsKLSAgICAgICAgICAgIFZhcmlhYmxlSW5mbyogcFYgPSAoKm1wVG9rZW5UYWJsZSlbdG9rXS5tcFN0cnVjdEluZm87Ci0gICAgICAgICAgICByZXR1cm4gcFYgJiYgcFYtPmxldmVsID09IGxldmVsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBWYXJpYWJsZUluZm8qIGFkZCh0b2tlbmlkX3QgdG9rKSB7Ci0gICAgICAgICAgICBUb2tlbiYgdG9rZW4gPSAoKm1wVG9rZW5UYWJsZSlbdG9rXTsKLSAgICAgICAgICAgIFZhcmlhYmxlSW5mbyogcE9sZFYgPSB0b2tlbi5tcFZhcmlhYmxlSW5mbzsKLSAgICAgICAgICAgIFZhcmlhYmxlSW5mbyogcE5ld1YgPQotICAgICAgICAgICAgICAgIChWYXJpYWJsZUluZm8qKSBtcEFyZW5hLT5hbGxvYyhzaXplb2YoVmFyaWFibGVJbmZvKSk7Ci0gICAgICAgICAgICBtZW1zZXQocE5ld1YsIDAsIHNpemVvZihWYXJpYWJsZUluZm8pKTsKLSAgICAgICAgICAgIHBOZXdWLT50b2sgPSB0b2s7Ci0gICAgICAgICAgICBwTmV3Vi0+bGV2ZWwgPSBsZXZlbCgpOwotICAgICAgICAgICAgcE5ld1YtPnBPbGREZWZpbml0aW9uID0gcE9sZFY7Ci0gICAgICAgICAgICB0b2tlbi5tcFZhcmlhYmxlSW5mbyA9IHBOZXdWOwotICAgICAgICAgICAgbVN0YWNrLnB1c2hfYmFjayhwTmV3Vik7Ci0gICAgICAgICAgICByZXR1cm4gcE5ld1Y7Ci0gICAgICAgIH0KLQotICAgICAgICBWYXJpYWJsZUluZm8qIGFkZFN0cnVjdFRhZyh0b2tlbmlkX3QgdG9rKSB7Ci0gICAgICAgICAgICBUb2tlbiYgdG9rZW4gPSAoKm1wVG9rZW5UYWJsZSlbdG9rXTsKLSAgICAgICAgICAgIFZhcmlhYmxlSW5mbyogcE9sZFMgPSB0b2tlbi5tcFN0cnVjdEluZm87Ci0gICAgICAgICAgICBWYXJpYWJsZUluZm8qIHBOZXdTID0KLSAgICAgICAgICAgICAgICAoVmFyaWFibGVJbmZvKikgbXBBcmVuYS0+YWxsb2Moc2l6ZW9mKFZhcmlhYmxlSW5mbykpOwotICAgICAgICAgICAgbWVtc2V0KHBOZXdTLCAwLCBzaXplb2YoVmFyaWFibGVJbmZvKSk7Ci0gICAgICAgICAgICBwTmV3Uy0+dG9rID0gdG9rOwotICAgICAgICAgICAgcE5ld1MtPmxldmVsID0gbGV2ZWwoKTsKLSAgICAgICAgICAgIHBOZXdTLT5pc1N0cnVjdFRhZyA9IHRydWU7Ci0gICAgICAgICAgICBwTmV3Uy0+cE9sZERlZmluaXRpb24gPSBwT2xkUzsKLSAgICAgICAgICAgIHRva2VuLm1wU3RydWN0SW5mbyA9IHBOZXdTOwotICAgICAgICAgICAgbVN0YWNrLnB1c2hfYmFjayhwTmV3Uyk7Ci0gICAgICAgICAgICByZXR1cm4gcE5ld1M7Ci0gICAgICAgIH0KLQotICAgICAgICBWYXJpYWJsZUluZm8qIGFkZChUeXBlKiBwVHlwZSkgewotICAgICAgICAgICAgVmFyaWFibGVJbmZvKiBwVkkgPSBhZGQocFR5cGUtPmlkKTsKLSAgICAgICAgICAgIHBWSS0+cFR5cGUgPSBwVHlwZTsKLSAgICAgICAgICAgIHJldHVybiBwVkk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZvckVhY2goYm9vbCAoKmZuKShWYXJpYWJsZUluZm8qLCB2b2lkKiksIHZvaWQqIGNvbnRleHQpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0YWNrLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgZm4obVN0YWNrW2ldLCBjb250ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGlubGluZSBzaXplX3QgbGV2ZWwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUxldmVsU3RhY2suc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RydWN0IE1hcmsgewotICAgICAgICAgICAgQXJlbmE6Ok1hcmsgbUFyZW5hTWFyazsKLSAgICAgICAgICAgIHNpemVfdCBtU3ltYm9sSGVhZDsKLSAgICAgICAgfTsKLQotICAgICAgICBBcmVuYSogbXBBcmVuYTsKLSAgICAgICAgVG9rZW5UYWJsZSogbXBUb2tlblRhYmxlOwotICAgICAgICBWZWN0b3I8VmFyaWFibGVJbmZvKj4gbVN0YWNrOwotICAgICAgICBWZWN0b3I8TWFyaz4gbUxldmVsU3RhY2s7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNYWNyb1N0YXRlIHsKLSAgICAgICAgdG9rZW5pZF90IG5hbWU7IC8vIE5hbWUgb2YgdGhlIGN1cnJlbnQgbWFjcm8gd2UgYXJlIGV4cGFuZGluZwotICAgICAgICBjaGFyKiBkcHRyOyAvLyBwb2ludCB0byBtYWNybyB0ZXh0IGR1cmluZyBtYWNybyBwbGF5YmFjawotICAgICAgICBpbnQgZGNoOyAvLyBTYXZlcyBvbGQgdmFsdWUgb2YgY2ggZHVyaW5nIGEgbWFjcm8gcGxheWJhY2sKLSAgICB9OwotCi0jZGVmaW5lIE1BQ1JPX05FU1RJTkdfTUFYIDMyCi0gICAgTWFjcm9TdGF0ZSBtYWNyb1N0YXRlW01BQ1JPX05FU1RJTkdfTUFYXTsKLSAgICBpbnQgbWFjcm9MZXZlbDsgLy8gLTEgbWVhbnMgbm90IHBsYXlpbmcgYW55IG1hY3JvLgotCi0gICAgaW50IGNoOyAvLyBDdXJyZW50IGlucHV0IGNoYXJhY3Rlciwgb3IgRU9GCi0gICAgdG9rZW5pZF90IHRvazsgICAgICAvLyB0b2tlbgotICAgIGludHB0cl90IHRva2M7ICAgIC8vIHRva2VuIGV4dHJhIGluZm8KLSAgICBkb3VibGUgdG9rZDsgICAgIC8vIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IHZhbHVlCi0gICAgaW50IHRva2w7ICAgICAgICAgLy8gdG9rZW4gb3BlcmF0b3IgbGV2ZWwKLSAgICBpbnRwdHJfdCByc3ltOyAvLyByZXR1cm4gc3ltYm9sCi0gICAgVHlwZSogcFJldHVyblR5cGU7IC8vIHR5cGUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24ncyByZXR1cm4uCi0gICAgaW50cHRyX3QgbG9jOyAvLyBsb2NhbCB2YXJpYWJsZSBpbmRleAotICAgIGNoYXIqIGdsbzsgIC8vIGdsb2JhbCB2YXJpYWJsZSBpbmRleAotICAgIFN0cmluZyBtVG9rZW5TdHJpbmc7Ci0gICAgYm9vbCBtYlN1cHByZXNzTWFjcm9FeHBhbnNpb247Ci0gICAgY2hhciogcEdsb2JhbEJhc2U7Ci0gICAgQUNDU3ltYm9sTG9va3VwRm4gbXBTeW1ib2xMb29rdXBGbjsKLSAgICB2b2lkKiBtcFN5bWJvbExvb2t1cENvbnRleHQ7Ci0KLSAgICAvLyBBcmVuYSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb21waWxlCi0gICAgQXJlbmEgbUdsb2JhbEFyZW5hOwotICAgIC8vIEFyZW5hIGZvciBkYXRhIHRoYXQncyBvbmx5IG5lZWRlZCB3aGVuIGNvbXBpbGluZyBhIHNpbmdsZSBmdW5jdGlvbgotICAgIEFyZW5hIG1Mb2NhbEFyZW5hOwotCi0gICAgQXJlbmEqIG1wQ3VycmVudEFyZW5hOwotCi0gICAgVG9rZW5UYWJsZSBtVG9rZW5UYWJsZTsKLSAgICBTeW1ib2xTdGFjayBtR2xvYmFsczsKLSAgICBTeW1ib2xTdGFjayBtTG9jYWxzOwotCi0gICAgU3ltYm9sU3RhY2sqIG1wQ3VycmVudFN5bWJvbFN0YWNrOwotCi0gICAgLy8gUHJlYnVpbHQgdHlwZXMsIG1ha2VzIHRoaW5ncyBzbGlnaHRseSBmYXN0ZXIuCi0gICAgVHlwZSogbWtwSW50OyAgICAgICAgLy8gaW50Ci0gICAgVHlwZSogbWtwU2hvcnQ7ICAgICAgLy8gc2hvcnQKLSAgICBUeXBlKiBta3BDaGFyOyAgICAgICAvLyBjaGFyCi0gICAgVHlwZSogbWtwVm9pZDsgICAgICAgLy8gdm9pZAotICAgIFR5cGUqIG1rcEZsb2F0OwotICAgIFR5cGUqIG1rcERvdWJsZTsKLSAgICBUeXBlKiBta3BJbnRGbjsKLSAgICBUeXBlKiBta3BJbnRQdHI7Ci0gICAgVHlwZSogbWtwQ2hhclB0cjsKLSAgICBUeXBlKiBta3BGbG9hdFB0cjsKLSAgICBUeXBlKiBta3BEb3VibGVQdHI7Ci0gICAgVHlwZSogbWtwUHRySW50Rm47Ci0KLSAgICBJbnB1dFN0cmVhbSogZmlsZTsKLSAgICBpbnQgbUxpbmVOdW1iZXI7Ci0gICAgYm9vbCBtYkJ1bXBMaW5lOwotCi0gICAgSUNvZGVCdWYqIHBDb2RlQnVmOwotICAgIENvZGVHZW5lcmF0b3IqIHBHZW47Ci0KLSAgICBTdHJpbmcgbUVycm9yQnVmOwotCi0gICAgU3RyaW5nIG1QcmFnbWFzOwotICAgIGludCBtUHJhZ21hU3RyaW5nQ291bnQ7Ci0gICAgaW50IG1Db21waWxlUmVzdWx0OwotCi0gICAgc3RhdGljIGNvbnN0IGludCBBTExPQ19TSVpFID0gOTk5OTk7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50IFRPS19EVU1NWSA9IDE7Ci0gICAgc3RhdGljIGNvbnN0IGludCBUT0tfTlVNID0gMjsKLSAgICBzdGF0aWMgY29uc3QgaW50IFRPS19OVU1fRkxPQVQgPSAzOwotICAgIHN0YXRpYyBjb25zdCBpbnQgVE9LX05VTV9ET1VCTEUgPSA0OwotICAgIHN0YXRpYyBjb25zdCBpbnQgVE9LX09QX0FTU0lHTk1FTlQgPSA1OwotICAgIHN0YXRpYyBjb25zdCBpbnQgVE9LX09QX0FSUk9XID0gNjsKLQotICAgIC8vIDMuLjI1NSBhcmUgY2hhcmFjdGVyIGFuZC9vciBvcGVyYXRvcnMKLQotICAgIC8vIEtleXdvcmRzIHN0YXJ0IGF0IDB4MTAwIGFuZCBpbmNyZWFzZSBieSAxCi0gICAgLy8gT3JkZXIgaGFzIHRvIG1hdGNoIHN0cmluZyBsaXN0IGluICJpbnRlcm5LZXl3b3JkcyIuCi0gICAgZW51bSB7Ci0gICAgICAgIFRPS19LRVlXT1JEID0gVG9rZW5UYWJsZTo6VE9LRU5fQkFTRSwKLSAgICAgICAgVE9LX0lOVCA9IFRPS19LRVlXT1JELAotICAgICAgICBUT0tfQ0hBUiwKLSAgICAgICAgVE9LX1ZPSUQsCi0gICAgICAgIFRPS19JRiwKLSAgICAgICAgVE9LX0VMU0UsCi0gICAgICAgIFRPS19XSElMRSwKLSAgICAgICAgVE9LX0JSRUFLLAotICAgICAgICBUT0tfUkVUVVJOLAotICAgICAgICBUT0tfRk9SLAotICAgICAgICBUT0tfQVVUTywKLSAgICAgICAgVE9LX0NBU0UsCi0gICAgICAgIFRPS19DT05TVCwKLSAgICAgICAgVE9LX0NPTlRJTlVFLAotICAgICAgICBUT0tfREVGQVVMVCwKLSAgICAgICAgVE9LX0RPLAotICAgICAgICBUT0tfRE9VQkxFLAotICAgICAgICBUT0tfRU5VTSwKLSAgICAgICAgVE9LX0VYVEVSTiwKLSAgICAgICAgVE9LX0ZMT0FULAotICAgICAgICBUT0tfR09UTywKLSAgICAgICAgVE9LX0xPTkcsCi0gICAgICAgIFRPS19SRUdJU1RFUiwKLSAgICAgICAgVE9LX1NIT1JULAotICAgICAgICBUT0tfU0lHTkVELAotICAgICAgICBUT0tfU0laRU9GLAotICAgICAgICBUT0tfU1RBVElDLAotICAgICAgICBUT0tfU1RSVUNULAotICAgICAgICBUT0tfU1dJVENILAotICAgICAgICBUT0tfVFlQRURFRiwKLSAgICAgICAgVE9LX1VOSU9OLAotICAgICAgICBUT0tfVU5TSUdORUQsCi0gICAgICAgIFRPS19WT0xBVElMRSwKLSAgICAgICAgVE9LX19CT09MLAotICAgICAgICBUT0tfX0NPTVBMRVgsCi0gICAgICAgIFRPS19fSU1BR0lOQVJZLAotICAgICAgICBUT0tfSU5MSU5FLAotICAgICAgICBUT0tfUkVTVFJJQ1QsCi0KLSAgICAgICAgLy8gU3ltYm9scyBzdGFydCBhZnRlciBrZXl3b3JkcwotCi0gICAgICAgIFRPS19TWU1CT0wsCi0gICAgICAgIFRPS19QUkFHTUEgPSBUT0tfU1lNQk9MLAotICAgICAgICBUT0tfREVGSU5FLAotICAgICAgICBUT0tfTElORQotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50IExPQ0FMID0gMHgyMDA7Ci0KLSAgICAvKiB0b2tlbnMgaW4gc3RyaW5nIGhlYXAgKi8KLSAgICBzdGF0aWMgY29uc3QgaW50IFRBR19UT0sgPSAnICc7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50IE9QX0lOQ1JFTUVOVCA9IDA7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9ERUNSRU1FTlQgPSAxOwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfTVVMID0gMjsKLSAgICBzdGF0aWMgY29uc3QgaW50IE9QX0RJViA9IDM7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9NT0QgPSA0OwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfUExVUyA9IDU7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9NSU5VUyA9IDY7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9TSElGVF9MRUZUID0gNzsKLSAgICBzdGF0aWMgY29uc3QgaW50IE9QX1NISUZUX1JJR0hUID0gODsKLSAgICBzdGF0aWMgY29uc3QgaW50IE9QX0xFU1NfRVFVQUwgPSA5OwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfR1JFQVRFUl9FUVVBTCA9IDEwOwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfTEVTUyA9IDExOwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfR1JFQVRFUiA9IDEyOwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfRVFVQUxTID0gMTM7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9OT1RfRVFVQUxTID0gMTQ7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9MT0dJQ0FMX0FORCA9IDE1OwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfTE9HSUNBTF9PUiA9IDE2OwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfQklUX0FORCA9IDE3OwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfQklUX1hPUiA9IDE4OwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfQklUX09SID0gMTk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9CSVRfTk9UID0gMjA7Ci0gICAgc3RhdGljIGNvbnN0IGludCBPUF9MT0dJQ0FMX05PVCA9IDIxOwotICAgIHN0YXRpYyBjb25zdCBpbnQgT1BfQ09VTlQgPSAyMjsKLQotICAgIC8qIE9wZXJhdG9ycyBhcmUgc2VhcmNoZWQgZnJvbSBmcm9udCwgdGhlIHR3by1jaGFyYWN0ZXIgb3BlcmF0b3JzIGFwcGVhcgotICAgICAqIGJlZm9yZSB0aGUgc2luZ2xlLWNoYXJhY3RlciBvcGVyYXRvcnMgd2l0aCB0aGUgc2FtZSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAgICogQCBpcyB1c2VkIHRvIHBhZCBvdXQgc2luZ2xlLWNoYXJhY3RlciBvcGVyYXRvcnMuCi0gICAgICovCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqIG9wZXJhdG9yQ2hhcnM7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgb3BlcmF0b3JMZXZlbFtdOwotCi0gICAgLyogQ2FsbGVkIHdoZW4gd2UgZGV0ZWN0IGFuIGludGVybmFsIHByb2JsZW0uIERvZXMgbm90aGluZyBpbiBwcm9kdWN0aW9uLgotICAgICAqCi0gICAgICovCi0gICAgdm9pZCBpbnRlcm5hbEVycm9yKCkgewotICAgICAgICAqIChjaGFyKikgMCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRJbXBsKGJvb2wgaXNUcnVlLCBpbnQgbGluZSkgewotICAgICAgICBpZiAoIWlzVHJ1ZSkgewotICAgICAgICAgICAgTE9HRCgiJWQ6IGFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSAlczolZC4iLCBtTGluZU51bWJlciwgX19GSUxFX18sIGxpbmUpOwotICAgICAgICAgICAgaW50ZXJuYWxFcnJvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1N5bWJvbCh0b2tlbmlkX3QgdCkgewotICAgICAgICByZXR1cm4gdCA+PSBUT0tfU1lNQk9MICYmCi0gICAgICAgICAgICAoKHNpemVfdCkgKHQtVE9LX1NZTUJPTCkpIDwgbVRva2VuVGFibGUuc2l6ZSgpOwotICAgIH0KLQotICAgIGJvb2wgaXNTeW1ib2xPcktleXdvcmQodG9rZW5pZF90IHQpIHsKLSAgICAgICAgcmV0dXJuIHQgPj0gVE9LX0tFWVdPUkQgJiYKLSAgICAgICAgICAgICgoc2l6ZV90KSAodC1UT0tfS0VZV09SRCkpIDwgbVRva2VuVGFibGUuc2l6ZSgpOwotICAgIH0KLQotICAgIFZhcmlhYmxlSW5mbyogVkkodG9rZW5pZF90IHQpIHsKLSAgICAgICAgYXNzZXJ0KGlzU3ltYm9sKHQpKTsKLSAgICAgICAgVmFyaWFibGVJbmZvKiBwViA9IG1Ub2tlblRhYmxlW3RdLm1wVmFyaWFibGVJbmZvOwotICAgICAgICBpZiAocFYgJiYgcFYtPnRvayAhPSB0KSB7Ci0gICAgICAgICAgICBpbnRlcm5hbEVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBWOwotICAgIH0KLQotICAgIGlubGluZSBib29sIGlzRGVmaW5lZCh0b2tlbmlkX3QgdCkgewotICAgICAgICByZXR1cm4gdCA+PSBUT0tfU1lNQk9MICYmIFZJKHQpICE9IDA7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciogbmFtZW9mKHRva2VuaWRfdCB0KSB7Ci0gICAgICAgIGFzc2VydChpc1N5bWJvbE9yS2V5d29yZCh0KSk7Ci0gICAgICAgIHJldHVybiBtVG9rZW5UYWJsZVt0XS5wVGV4dDsKLSAgICB9Ci0KLSAgICB2b2lkIHBkZWYoaW50IHQpIHsKLSAgICAgICAgbVRva2VuU3RyaW5nLmFwcGVuZCh0KTsKLSAgICB9Ci0KLSAgICB2b2lkIGlucCgpIHsKLSAgICAgICAgLy8gQ2xvc2UgYW55IHRvdGFsbHkgZW1wdHkgbWFjcm9zLiBXZSBsZWF2ZSB0aGVtIG9uIHRoZSBzdGFjayB1bnRpbCBub3cKLSAgICAgICAgLy8gc28gdGhhdCB3ZSBrbm93IHdoaWNoIG1hY3JvcyBhcmUgYmVpbmcgZXhwYW5kZWQgd2hlbiBjaGVja2luZyBpZiB0aGUKLSAgICAgICAgLy8gbGFzdCB0b2tlbiBpbiB0aGUgbWFjcm8gaXMgYSBtYWNybyB0aGF0J3MgYWxyZWFkeSBiZWluZyBleHBhbmRlZC4KLSAgICAgICAgd2hpbGUgKG1hY3JvTGV2ZWwgPj0gMCAmJiBtYWNyb1N0YXRlW21hY3JvTGV2ZWxdLmRwdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgbWFjcm9MZXZlbC0tOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWNyb0xldmVsID49IDApIHsKLSAgICAgICAgICAgIGNoID0gKm1hY3JvU3RhdGVbbWFjcm9MZXZlbF0uZHB0cisrOwotICAgICAgICAgICAgaWYgKGNoID09IDApIHsKLSAgICAgICAgICAgICAgICBjaCA9IG1hY3JvU3RhdGVbbWFjcm9MZXZlbF0uZGNoOwotICAgICAgICAgICAgICAgIG1hY3JvU3RhdGVbbWFjcm9MZXZlbF0uZHB0ciA9IE5VTEw7IC8vIFRoaXMgbWFjcm8ncyBkb25lCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWJCdW1wTGluZSkgewotICAgICAgICAgICAgICAgIG1MaW5lTnVtYmVyKys7Ci0gICAgICAgICAgICAgICAgbWJCdW1wTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBmaWxlLT5nZXRDaGFyKCk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIG1iQnVtcExpbmUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jaWYgMAotICAgICAgICBwcmludGYoImNoPSclYycgMHgleFxuIiwgY2gsIGNoKTsKLSNlbmRpZgotICAgIH0KLQotICAgIGludCBpc2lkKCkgewotICAgICAgICByZXR1cm4gaXNhbG51bShjaCkgfCAoY2ggPT0gJ18nKTsKLSAgICB9Ci0KLSAgICBpbnQgZGVjb2RlSGV4KGludCBjKSB7Ci0gICAgICAgIGlmIChpc2RpZ2l0KGMpKSB7Ci0gICAgICAgICAgICBjIC09ICcwJzsKLSAgICAgICAgfSBlbHNlIGlmIChjIDw9ICdGJykgewotICAgICAgICAgICAgYyA9IGMgLSAnQScgKyAxMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGMgPWMgLSAnYScgKyAxMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgICAvKiByZWFkIGEgY2hhcmFjdGVyIGNvbnN0YW50LCBhZHZhbmNlcyBjaCB0byBhZnRlciBlbmQgb2YgY29uc3RhbnQgKi8KLSAgICBpbnQgZ2V0cSgpIHsKLSAgICAgICAgaW50IHZhbCA9IGNoOwotICAgICAgICBpZiAoY2ggPT0gJ1xcJykgewotICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICBpZiAoaXNvY3RhbChjaCkpIHsKLSAgICAgICAgICAgICAgICAvLyAxIHRvIDMgb2N0YWwgY2hhcmFjdGVycy4KLSAgICAgICAgICAgICAgICB2YWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzb2N0YWwoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAodmFsIDw8IDMpICsgY2ggLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAneCcgfHwgY2ggPT0gJ1gnKSB7Ci0gICAgICAgICAgICAgICAgLy8gTiBoZXggY2hhcnMKLSAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICBpZiAoISBpc3hkaWdpdChjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIid4JyBjaGFyYWN0ZXIgZXNjYXBlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBkaWdpdC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXN4ZGlnaXQoY2gpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAodmFsIDw8IDQpICsgZGVjb2RlSGV4KGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgdmFsID0gY2g7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICdcYSc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAnXGInOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gJ1xmJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICdcbic7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAnXHInOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gJ1x0JzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICdcdic7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gJ1xcJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAnXCcnOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gJyInOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gJz8nOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5kZWZpbmVkIGNoYXJhY3RlciBlc2NhcGUgJWMiLCBjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlucCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgaXNvY3RhbChpbnQgY2gpIHsKLSAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnNyc7Ci0gICAgfQotCi0gICAgYm9vbCBhY2NlcHRDaChpbnQgYykgewotICAgICAgICBib29sIHJlc3VsdCA9IGMgPT0gY2g7Ci0gICAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgIHBkZWYoY2gpOwotICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBib29sIGFjY2VwdERpZ2l0c0NoKCkgewotICAgICAgICBib29sIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoaXNkaWdpdChjaCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICBwZGVmKGNoKTsKLSAgICAgICAgICAgIGlucCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBwYXJzZUZsb2F0KCkgewotICAgICAgICB0b2sgPSBUT0tfTlVNX0RPVUJMRTsKLSAgICAgICAgLy8gbVRva2VuU3RyaW5nIGFscmVhZHkgaGFzIHRoZSBpbnRlZ3JhbCBwYXJ0IG9mIHRoZSBudW1iZXIuCi0gICAgICAgIGlmKG1Ub2tlblN0cmluZy5sZW4oKSA9PSAwKSB7Ci0gICAgICAgICAgICBtVG9rZW5TdHJpbmcuYXBwZW5kKCcwJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYWNjZXB0Q2goJy4nKTsKLSAgICAgICAgYWNjZXB0RGlnaXRzQ2goKTsKLSAgICAgICAgaWYgKGFjY2VwdENoKCdlJykgfHwgYWNjZXB0Q2goJ0UnKSkgewotICAgICAgICAgICAgYWNjZXB0Q2goJy0nKSB8fCBhY2NlcHRDaCgnKycpOwotICAgICAgICAgICAgYWNjZXB0RGlnaXRzQ2goKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggPT0gJ2YnIHx8IGNoID09ICdGJykgewotICAgICAgICAgICAgdG9rID0gVE9LX05VTV9GTE9BVDsKLSAgICAgICAgICAgIGlucCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdsJyB8fCBjaCA9PSAnTCcpIHsKLSAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgZXJyb3IoIkxvbmcgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciogcFRleHQgPSBtVG9rZW5TdHJpbmcuZ2V0VW53cmFwcGVkKCk7Ci0gICAgICAgIGNoYXIqIHBFbmQgPSBwVGV4dCArIHN0cmxlbihwVGV4dCk7Ci0gICAgICAgIGNoYXIqIHBFbmRQdHIgPSAwOwotICAgICAgICBlcnJubyA9IDA7Ci0gICAgICAgIGlmICh0b2sgPT0gVE9LX05VTV9GTE9BVCkgewotICAgICAgICAgICAgdG9rZCA9IHN0cnRvZihwVGV4dCwgJnBFbmRQdHIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9rZCA9IHN0cnRvZChwVGV4dCwgJnBFbmRQdHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJubyB8fCBwRW5kUHRyICE9IHBFbmQpIHsKLSAgICAgICAgICAgIGVycm9yKCJDYW4ndCBwYXJzZSBjb25zdGFudDogJXMiLCBwVGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZnByaW50ZihzdGRlcnIsICJmbG9hdCBjb25zdGFudDogJXMgKCVkKSAlZ1xuIiwgcFRleHQsIHRvaywgdG9rZCk7Ci0gICAgfQotCi0gICAgYm9vbCBjdXJyZW50bHlCZWluZ0V4cGFuZGVkKHRva2VuaWRfdCBpZCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBtYWNyb0xldmVsOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtYWNyb1N0YXRlW21hY3JvTGV2ZWxdLm5hbWUgPT0gaWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBuZXh0KCkgewotICAgICAgICBpbnQgbCwgYTsKLQotICAgICAgICB3aGlsZSAoaXNzcGFjZShjaCkgfCAoY2ggPT0gJyMnKSkgewotICAgICAgICAgICAgaWYgKGNoID09ICcjJykgewotICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rID09IFRPS19ERUZJTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9EZWZpbmUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvayA9PSBUT0tfUFJBR01BKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvUHJhZ21hKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2sgPT0gVE9LX0xJTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9MaW5lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuc3VwcG9ydGVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgXCIlc1wiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuU3RyaW5nLmdldFVud3JhcHBlZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgfQotICAgICAgICB0b2tsID0gMDsKLSAgICAgICAgdG9rID0gY2g7Ci0gICAgICAgIC8qIGVuY29kZSBpZGVudGlmaWVycyAmIG51bWJlcnMgKi8KLSAgICAgICAgaWYgKGlzZGlnaXQoY2gpIHx8IGNoID09ICcuJykgewotICAgICAgICAgICAgLy8gU3RhcnQgb2YgYSBudW1lcmljIGNvbnN0YW50LiBDb3VsZCBiZSBpbnRlZ2VyLCBmbG9hdCwgb3IKLSAgICAgICAgICAgIC8vIGRvdWJsZSwgd29uJ3Qga25vdyB1bnRpbCB3ZSBsb29rIGZ1cnRoZXIuCi0gICAgICAgICAgICBtVG9rZW5TdHJpbmcuY2xlYXIoKTsKLSAgICAgICAgICAgIHBkZWYoY2gpOwotICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICBpZiAodG9rID09ICcuJyAmJiAhaXNkaWdpdChjaCkpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYmFzZSA9IDEwOwotICAgICAgICAgICAgaWYgKHRvayA9PSAnMCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ3gnIHx8IGNoID09ICdYJykgewotICAgICAgICAgICAgICAgICAgICBiYXNlID0gMTY7Ci0gICAgICAgICAgICAgICAgICAgIHRvayA9IFRPS19OVU07Ci0gICAgICAgICAgICAgICAgICAgIHRva2MgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBpc3hkaWdpdChjaCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tjID0gKHRva2MgPDwgNCkgKyBkZWNvZGVIZXgoY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzb2N0YWwoY2gpKXsKLSAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDg7Ci0gICAgICAgICAgICAgICAgICAgIHRvayA9IFRPS19OVU07Ci0gICAgICAgICAgICAgICAgICAgIHRva2MgPSAwOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGlzb2N0YWwoY2gpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rYyA9ICh0b2tjIDw8IDMpICsgKGNoIC0gJzAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KHRvaykpewotICAgICAgICAgICAgICAgIGFjY2VwdERpZ2l0c0NoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYmFzZSA9PSAxMCkgewotICAgICAgICAgICAgICAgIGlmICh0b2sgPT0gJy4nIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnZScgfHwgY2ggPT0gJ0UnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGFuIGludGVnZXIgY29uc3RhbnQKLSAgICAgICAgICAgICAgICAgICAgY2hhciogcFRleHQgPSBtVG9rZW5TdHJpbmcuZ2V0VW53cmFwcGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIqIHBFbmQgPSBwVGV4dCArIHN0cmxlbihwVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIqIHBFbmRQdHIgPSAwOwotICAgICAgICAgICAgICAgICAgICBlcnJubyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHRva2MgPSBzdHJ0b2wocFRleHQsICZwRW5kUHRyLCBiYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vIHx8IHBFbmRQdHIgIT0gcEVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkNhbid0IHBhcnNlIGNvbnN0YW50OiAlcyAlZCAlZCIsIHBUZXh0LCBiYXNlLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdG9rID0gVE9LX05VTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNpZCgpKSB7Ci0gICAgICAgICAgICBtVG9rZW5TdHJpbmcuY2xlYXIoKTsKLSAgICAgICAgICAgIHdoaWxlIChpc2lkKCkpIHsKLSAgICAgICAgICAgICAgICBwZGVmKGNoKTsKLSAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvayA9IG1Ub2tlblRhYmxlLmludGVybihtVG9rZW5TdHJpbmcuZ2V0VW53cmFwcGVkKCksIG1Ub2tlblN0cmluZy5sZW4oKSk7Ci0gICAgICAgICAgICBpZiAoISBtYlN1cHByZXNzTWFjcm9FeHBhbnNpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGEgbWFjcm8/Ci0gICAgICAgICAgICAgICAgY2hhciogcE1hY3JvRGVmaW5pdGlvbiA9IG1Ub2tlblRhYmxlW3Rva10ubXBNYWNyb0RlZmluaXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHBNYWNyb0RlZmluaXRpb24gJiYgIWN1cnJlbnRseUJlaW5nRXhwYW5kZWQodG9rKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBZZXMsIGl0IGlzIGEgbWFjcm8KLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXhwYW5kaW5nIG1hY3JvICVzIC0+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW5TdHJpbmcuZ2V0VW53cmFwcGVkKCksIHBNYWNyb0RlZmluaXRpb24pOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYWNyb0xldmVsID49IE1BQ1JPX05FU1RJTkdfTUFYLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJUb28gbWFueSBsZXZlbHMgb2YgbWFjcm8gcmVjdXJzaW9uLiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9MZXZlbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9TdGF0ZVttYWNyb0xldmVsXS5uYW1lID0gdG9rOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9TdGF0ZVttYWNyb0xldmVsXS5kcHRyID0gcE1hY3JvRGVmaW5pdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvU3RhdGVbbWFjcm9MZXZlbF0uZGNoID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgaWYgKHRvayA9PSAnXCcnKSB7Ci0gICAgICAgICAgICAgICAgdG9rID0gVE9LX05VTTsKLSAgICAgICAgICAgICAgICB0b2tjID0gZ2V0cSgpOwotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnXCcnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhICcgY2hhcmFjdGVyLCBnb3QgJWMiLCBjaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRvayA9PSAnLycpICYgKGNoID09ICcqJykpIHsKLSAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY2ggJiYgY2ggIT0gRU9GKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaCAhPSAnKicgJiYgY2ggIT0gRU9GKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nKQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJFbmQgb2YgZmlsZSBpbnNpZGUgY29tbWVudC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgodG9rID09ICcvJykgJiAoY2ggPT0gJy8nKSkgewotICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChjaCAmJiAoY2ggIT0gJ1xuJykgJiYgKGNoICE9IEVPRikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRvayA9PSAnLScpICYgKGNoID09ICc+JykpIHsKLSAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICB0b2sgPSBUT0tfT1BfQVJST1c7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHQgPSBvcGVyYXRvckNoYXJzOwotICAgICAgICAgICAgICAgIGludCBvcEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGwgPSAqdCsrKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqdCsrOwotICAgICAgICAgICAgICAgICAgICB0b2tsID0gb3BlcmF0b3JMZXZlbFtvcEluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgdG9rYyA9IG9wSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobCA9PSB0b2spICYgKChhID09IGNoKSB8IChhID09ICdAJykpKSB7Ci0jaWYgMAotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyVjIC0+IHRva2w9JWQgdG9rYz0weCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLCBhLCB0b2tsLCB0b2tjKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBUT0tfRFVNTVk7IC8qIGR1bW15IHRva2VuIGZvciBkb3VibGUgdG9rZW5zICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBmb3Igb3A9LCB2YWxpZCBmb3IgKiAvICUgKyAtIDw8ID4+ICYgXiB8ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz0nICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodG9rbCA+PSAxICYmIHRva2wgPD0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodG9rbCA+PTYgJiYgdG9rbCA8PSA4KSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gVE9LX09QX0FTU0lHTk1FTlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvcEluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG9rbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHRva2MgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgZG9uZTogOwotI2lmIDAKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGJ1ZjsKLSAgICAgICAgICAgIGRlY29kZVRva2VuKGJ1ZiwgdG9rLCB0cnVlKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1Zi5nZXRVbndyYXBwZWQoKSk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAgIHZvaWQgZG9EZWZpbmUoKSB7Ci0gICAgICAgIG1iU3VwcHJlc3NNYWNyb0V4cGFuc2lvbiA9IHRydWU7Ci0gICAgICAgIG5leHQoKTsKLSAgICAgICAgbWJTdXBwcmVzc01hY3JvRXhwYW5zaW9uID0gZmFsc2U7Ci0gICAgICAgIHRva2VuaWRfdCBuYW1lID0gdG9rOwotICAgICAgICBpZiAoY2ggPT0gJygnKSB7Ci0gICAgICAgICAgICBlcnJvcigiRGVmaW5lcyB3aXRoIGFyZ3VtZW50cyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGlzc3BhY2UoY2gpKSB7Ci0gICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgIGJvb2wgYXBwZW5kVG9WYWx1ZSA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRikgewotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yICcvLycgY29tbWVudHMuCi0gICAgICAgICAgICBpZiAoYXBwZW5kVG9WYWx1ZSAmJiBjaCA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBpbnAoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXBwZW5kVG9WYWx1ZSAmJiBjaCAhPSBFT0YpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciogcERlZm4gPSAoY2hhciopbUdsb2JhbEFyZW5hLmFsbG9jKHZhbHVlLmxlbigpICsgMSk7Ci0gICAgICAgIG1lbWNweShwRGVmbiwgdmFsdWUuZ2V0VW53cmFwcGVkKCksIHZhbHVlLmxlbigpKTsKLSAgICAgICAgcERlZm5bdmFsdWUubGVuKCldID0gMDsKLSAgICAgICAgbVRva2VuVGFibGVbbmFtZV0ubXBNYWNyb0RlZmluaXRpb24gPSBwRGVmbjsKLSNpZiAwCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBidWY7Ci0gICAgICAgICAgICBkZWNvZGVUb2tlbihidWYsIG5hbWUsIHRydWUpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZpbmUgJXMgPSBcIiVzXCJcbiIsIGJ1Zi5nZXRVbndyYXBwZWQoKSwgcERlZm4pOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICB2b2lkIGRvUHJhZ21hKCkgewotICAgICAgICAvLyAjIHByYWdtYSBuYW1lKHZhbCkKLSAgICAgICAgaW50IHN0YXRlID0gMDsKLSAgICAgICAgd2hpbGUoY2ggIT0gRU9GICYmIGNoICE9ICdcbicgJiYgc3RhdGUgPCAxMCkgewotICAgICAgICAgICAgc3dpdGNoKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBpZiAoaXNzcGFjZShjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc2FsbnVtKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVByYWdtYXMuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcoJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVByYWdtYXMuYXBwZW5kKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc2FsbnVtKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVByYWdtYXMuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcpJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVByYWdtYXMuYXBwZW5kKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihzdGF0ZSAhPSAxMCkgewotICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgcHJhZ21hIHN5bnRheCIpOwotICAgICAgICB9Ci0gICAgICAgIG1QcmFnbWFTdHJpbmdDb3VudCArPSAyOwotICAgIH0KLQotICAgIHZvaWQgZG9MaW5lKCkgewotICAgICAgICAvLyAjIGxpbmUgbnVtYmVyIHsgImZpbGVuYW1lICJ9Ci0gICAgICAgIG5leHQoKTsKLSAgICAgICAgaWYgKHRvayAhPSBUT0tfTlVNKSB7Ci0gICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYSBsaW5lLW51bWJlciIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUxpbmVOdW1iZXIgPSB0b2tjLTE7IC8vIFRoZSBlbmQtb2YtbGluZSB3aWxsIGluY3JlbWVudCBpdC4KLSAgICAgICAgfQotICAgICAgICB3aGlsZShjaCAhPSBFT0YgJiYgY2ggIT0gJ1xuJykgewotICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdmVycm9yKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcCkgewotICAgICAgICBtRXJyb3JCdWYucHJpbnRmKCIlbGQ6ICIsIG1MaW5lTnVtYmVyKTsKLSAgICAgICAgbUVycm9yQnVmLnZwcmludGYoZm10LCBhcCk7Ci0gICAgICAgIG1FcnJvckJ1Zi5wcmludGYoIlxuIik7Ci0gICAgfQotCi0gICAgdm9pZCBza2lwKGludHB0cl90IGMpIHsKLSAgICAgICAgaWYgKCFhY2NlcHQoYykpIHsKLSAgICAgICAgICAgIGVycm9yKCInJWMnIGV4cGVjdGVkIiwgYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIGFjY2VwdChpbnRwdHJfdCBjKSB7Ci0gICAgICAgIGlmICh0b2sgPT0gYykgewotICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgYWNjZXB0U3RyaW5nTGl0ZXJhbCgpIHsKLSAgICAgICAgaWYgKHRvayA9PSAnIicpIHsKLSAgICAgICAgICAgIHBHZW4tPmxlYVIwKChpbnQpIGdsbywgbWtwQ2hhclB0ciwgRVRfUlZBTFVFKTsKLSAgICAgICAgICAgIC8vIFRoaXMgd2hpbGUgbG9vcCBtZXJnZXMgbXVsdGlwbGUgYWRqYWNlbnQgc3RyaW5nIGNvbnN0YW50cy4KLSAgICAgICAgICAgIHdoaWxlICh0b2sgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNoICE9ICciJyAmJiBjaCAhPSBFT0YpIHsKLSAgICAgICAgICAgICAgICAgICAgKmFsbG9jR2xvYmFsU3BhY2UoMSwxKSA9IGdldHEoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICciJykgewotICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wKCk7Ci0gICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogTnVsbCB0ZXJtaW5hdGUgKi8KLSAgICAgICAgICAgICpnbG8gPSAwOwotICAgICAgICAgICAgLyogYWxpZ24gaGVhcCAqLwotICAgICAgICAgICAgYWxsb2NHbG9iYWxTcGFjZSgxLChjaGFyKikgKCgoaW50cHRyX3QpIGdsbyArIDQpICYgLTQpIC0gZ2xvKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgbGlua0dsb2JhbCh0b2tlbmlkX3QgdCwgYm9vbCBpc0Z1bmN0aW9uKSB7Ci0gICAgICAgIFZhcmlhYmxlSW5mbyogcFZJID0gVkkodCk7Ci0gICAgICAgIHZvaWQqIG4gPSBOVUxMOwotICAgICAgICBpZiAobXBTeW1ib2xMb29rdXBGbikgewotICAgICAgICAgICAgbiA9IG1wU3ltYm9sTG9va3VwRm4obXBTeW1ib2xMb29rdXBDb250ZXh0LCBuYW1lb2YodCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwVkktPnBUeXBlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcFZJLT5wVHlwZSA9IG1rcEludEZuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwVkktPnBUeXBlID0gbWtwSW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBWSS0+cEFkZHJlc3MgPSBuOwotICAgIH0KLQotICAgIHZvaWQgdW5hcnlPckFzc2lnbm1lbnQoKSB7Ci0gICAgICAgIHVuYXJ5KCk7Ci0gICAgICAgIGlmIChhY2NlcHQoJz0nKSkgewotICAgICAgICAgICAgY2hlY2tMVmFsKCk7Ci0gICAgICAgICAgICBwR2VuLT5wdXNoUjAoKTsKLSAgICAgICAgICAgIGV4cHIoKTsKLSAgICAgICAgICAgIHBHZW4tPmZvcmNlUjBSVmFsKCk7Ci0gICAgICAgICAgICBwR2VuLT5zdG9yZVIwVG9UT1MoKTsKLSAgICAgICAgfSBlbHNlIGlmICh0b2sgPT0gVE9LX09QX0FTU0lHTk1FTlQpIHsKLSAgICAgICAgICAgIGludCB0ID0gdG9rYzsKLSAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgIGNoZWNrTFZhbCgpOwotICAgICAgICAgICAgcEdlbi0+cHVzaFIwKCk7Ci0gICAgICAgICAgICBwR2VuLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICAgICAgcEdlbi0+cHVzaFIwKCk7Ci0gICAgICAgICAgICBleHByKCk7Ci0gICAgICAgICAgICBwR2VuLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICAgICAgcEdlbi0+Z2VuT3AodCk7Ci0gICAgICAgICAgICBwR2VuLT5zdG9yZVIwVG9UT1MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFBhcnNlIGFuZCBldmFsdWF0ZSBhIHVuYXJ5IGV4cHJlc3Npb24uCi0gICAgICovCi0gICAgdm9pZCB1bmFyeSgpIHsKLSAgICAgICAgdG9rZW5pZF90IHQ7Ci0gICAgICAgIGludHB0cl90IGE7Ci0gICAgICAgIHQgPSAwOwotICAgICAgICBpZiAoYWNjZXB0U3RyaW5nTGl0ZXJhbCgpKSB7Ci0gICAgICAgICAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgYyA9IHRva2w7Ci0gICAgICAgICAgICBhID0gdG9rYzsKLSAgICAgICAgICAgIGRvdWJsZSBhZCA9IHRva2Q7Ci0gICAgICAgICAgICB0ID0gdG9rOwotICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgaWYgKHQgPT0gVE9LX05VTSkgewotICAgICAgICAgICAgICAgIHBHZW4tPmxpKGEpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0ID09IFRPS19OVU1fRkxPQVQpIHsKLSAgICAgICAgICAgICAgICAvLyBBbGlnbiB0byA0LWJ5dGUgYm91bmRhcnkKLSAgICAgICAgICAgICAgICBnbG8gPSAoY2hhciopICgoKGludHB0cl90KSBnbG8gKyAzKSAmIC00KTsKLSAgICAgICAgICAgICAgICAqIChmbG9hdCopIGdsbyA9IChmbG9hdCkgYWQ7Ci0gICAgICAgICAgICAgICAgcEdlbi0+bG9hZEZsb2F0KChpbnQpIGdsbywgbWtwRmxvYXQpOwotICAgICAgICAgICAgICAgIGdsbyArPSA0OwotICAgICAgICAgICAgfSBlbHNlIGlmICh0ID09IFRPS19OVU1fRE9VQkxFKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5Ci0gICAgICAgICAgICAgICAgZ2xvID0gKGNoYXIqKSAoKChpbnRwdHJfdCkgZ2xvICsgNykgJiAtOCk7Ci0gICAgICAgICAgICAgICAgKiAoZG91YmxlKikgZ2xvID0gYWQ7Ci0gICAgICAgICAgICAgICAgcEdlbi0+bG9hZEZsb2F0KChpbnQpIGdsbywgbWtwRG91YmxlKTsKLSAgICAgICAgICAgICAgICBnbG8gKz0gODsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgLyogLSwgKywgISwgfiAqLwotICAgICAgICAgICAgICAgIHVuYXJ5KCk7Ci0gICAgICAgICAgICAgICAgcEdlbi0+Zm9yY2VSMFJWYWwoKTsKLSAgICAgICAgICAgICAgICBpZiAodCA9PSAnIScpCi0gICAgICAgICAgICAgICAgICAgIHBHZW4tPmdVbmFyeUNtcChhKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09ICcrJykgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdW5hcnkgcGx1cy4KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwR2VuLT5nZW5VbmFyeU9wKGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAxMSkgewotICAgICAgICAgICAgICAgIC8vIHByZSBpbmNyZW1lbnQgLyBwcmUgZGVjcmVtZW50Ci0gICAgICAgICAgICAgICAgdW5hcnkoKTsKLSAgICAgICAgICAgICAgICBkb0luY0RlYyhhID09IE9QX0lOQ1JFTUVOVCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0ID09ICcoJykgewotICAgICAgICAgICAgICAgIC8vIEl0J3MgZWl0aGVyIGEgY2FzdCBvciBhbiBleHByZXNzaW9uCi0gICAgICAgICAgICAgICAgVHlwZSogcENhc3QgPSBhY2NlcHRDYXN0VHlwZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBDYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNraXAoJyknKTsKLSAgICAgICAgICAgICAgICAgICAgdW5hcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+Zm9yY2VSMFJWYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+Y2FzdFIwKHBDYXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb21tYUV4cHIoKTsKLSAgICAgICAgICAgICAgICAgICAgc2tpcCgnKScpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodCA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGEgcG9pbnRlciBkZXJlZmVyZW5jZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB1bmFyeSgpOwotICAgICAgICAgICAgICAgIGRvUG9pbnRlcigpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0ID09ICcmJykgewotICAgICAgICAgICAgICAgIHVuYXJ5KCk7Ci0gICAgICAgICAgICAgICAgZG9BZGRyZXNzT2YoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodCA9PSBFT0YgKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgRU9GLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0ID09ICc7JykgewotICAgICAgICAgICAgICAgIGVycm9yKCJVbmV4cGVjdGVkICc7JyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tTeW1ib2wodCkpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgaGVyZSwgdGhlIGVycm9yCi0gICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB3YXMgcHJpbnRlZCBieSBjaGVja1N5bWJvbCgpIGFib3ZlLgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRGVmaW5lZCh0KSkgewotICAgICAgICAgICAgICAgICAgICBtR2xvYmFscy5hZGQodCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHByaW50ZigiQWRkaW5nIG5ldyBnbG9iYWwgZnVuY3Rpb24gJXNcbiIsIG5hbWVvZih0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFZhcmlhYmxlSW5mbyogcFZJID0gVkkodCk7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSAoaW50cHRyX3QpIHBWSS0+cEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgLyogZm9yd2FyZCByZWZlcmVuY2U6IHRyeSBvdXIgbG9va3VwIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgaWYgKCFuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmtHbG9iYWwodCwgdG9rID09ICcoJyk7Ci0gICAgICAgICAgICAgICAgICAgIG4gPSAoaW50cHRyX3QpIHBWSS0+cEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbiAmJiB0b2sgIT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5kZWNsYXJlZCB2YXJpYWJsZSAlcyIsIG5hbWVvZih0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRvayAhPSAnKCcpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdmFyaWFibGUgb3IgZnVuY3Rpb24gbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtHbG9iYWwodCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChpbnRwdHJfdCkgcFZJLT5wQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJVbmRlY2xhcmVkIHZhcmlhYmxlICVzIiwgbmFtZW9mKHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBsb2FkIGEgdmFyaWFibGUKLSAgICAgICAgICAgICAgICBUeXBlKiBwVmFsOwotICAgICAgICAgICAgICAgIEV4cHJlc3Npb25UeXBlIGV0OwotICAgICAgICAgICAgICAgIGlmIChwVkktPnBUeXBlLT50YWcgPT0gVFlfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgcFZhbCA9IHBWSS0+cFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGV0ID0gRVRfUlZBTFVFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBWYWwgPSBjcmVhdGVQdHJUeXBlKHBWSS0+cFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBldCA9IEVUX0xWQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG4pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHRhZyA9IHBWYWwtPnBIZWFkLT50YWc7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gVFlfRlVOQykgewotICAgICAgICAgICAgICAgICAgICAgICAgZXQgPSBFVF9SVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+bGVhUjAobiwgcFZhbCwgZXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBWSS0+cEZvcndhcmQgPSAodm9pZCopIHBHZW4tPmxlYUZvcndhcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgcFZJLT5wRm9yd2FyZCwgcFZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogTm93IGhhbmRsZSBwb3N0Zml4IG9wZXJhdG9ycyAqLwotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIGlmICh0b2tsID09IDExKSB7Ci0gICAgICAgICAgICAgICAgLy8gcG9zdCBpbmMgLyBwb3N0IGRlYwotICAgICAgICAgICAgICAgIGRvSW5jRGVjKHRva2MgPT0gT1BfSU5DUkVNRU5ULCB0cnVlKTsKLSAgICAgICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjY2VwdCgnWycpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXJyYXkgcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgcEdlbi0+Zm9yY2VSMFJWYWwoKTsKLSAgICAgICAgICAgICAgICBwR2VuLT5wdXNoUjAoKTsKLSAgICAgICAgICAgICAgICBjb21tYUV4cHIoKTsKLSAgICAgICAgICAgICAgICBwR2VuLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICAgICAgICAgIHBHZW4tPmdlbk9wKE9QX1BMVVMpOwotICAgICAgICAgICAgICAgIGRvUG9pbnRlcigpOwotICAgICAgICAgICAgICAgIHNraXAoJ10nKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0KCcuJykpIHsKLSAgICAgICAgICAgICAgICAvLyBzdHJ1Y3QgZWxlbWVudAotICAgICAgICAgICAgICAgIHBHZW4tPmZvcmNlUjBSVmFsKCk7Ci0gICAgICAgICAgICAgICAgVHlwZSogcFN0cnVjdCA9IHBHZW4tPmdldFIwVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChwU3RydWN0LT50YWcgPT0gVFlfU1RSVUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvU3RydWN0TWVtYmVyKHBTdHJ1Y3QsIHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJleHBlY3RlZCBhIHN0cnVjdCB2YWx1ZSB0byB0aGUgbGVmdCBvZiAnLiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjY2VwdChUT0tfT1BfQVJST1cpKSB7Ci0gICAgICAgICAgICAgICAgcEdlbi0+Zm9yY2VSMFJWYWwoKTsKLSAgICAgICAgICAgICAgICBUeXBlKiBwUHRyID0gcEdlbi0+Z2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBQdHItPnRhZyA9PSBUWV9QT0lOVEVSICYmIHBQdHItPnBIZWFkLT50YWcgPT0gVFlfU1RSVUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW4tPmxvYWRSMEZyb21SMCgpOwotICAgICAgICAgICAgICAgICAgICBkb1N0cnVjdE1lbWJlcihwUHRyLT5wSGVhZCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgdG8gdGhlIGxlZnQgb2YgJy0+JyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSAgaWYgKGFjY2VwdCgnKCcpKSB7Ci0gICAgICAgICAgICAgICAgLyogZnVuY3Rpb24gY2FsbCAqLwotICAgICAgICAgICAgICAgIFR5cGUqIHBEZWNsID0gTlVMTDsKLSAgICAgICAgICAgICAgICBWYXJpYWJsZUluZm8qIHBWSSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgVHlwZSogcEZuID0gcEdlbi0+Z2V0UjBUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBGbi0+dGFnID09IFRZX1BPSU5URVIgJiYgcEZuLT5wSGVhZC0+dGFnID09IFRZX0ZVTkMpIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY2wgPSBwRm4tPnBIZWFkOwotICAgICAgICAgICAgICAgICAgICBwR2VuLT5wdXNoUjAoKTsKLSAgICAgICAgICAgICAgICAgICAgVHlwZSogcEFyZ0xpc3QgPSBwRGVjbC0+cFRhaWw7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgdmFyQXJncyA9IHBBcmdMaXN0ID09IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHB1c2ggYXJncyBhbmQgaW52ZXJ0IG9yZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGEgPSBwR2VuLT5iZWdpbkZ1bmN0aW9uQ2FsbEFyZ3VtZW50cygpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhcmdDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0b2sgIT0gJyknICYmIHRvayAhPSBFT0YpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHZhckFyZ3MgJiYgIXBBcmdMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwR2VuLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSogcFRhcmdldFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFyZ0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0VHlwZSA9IHBBcmdMaXN0LT5wSGVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXJnTGlzdCA9IHBBcmdMaXN0LT5wVGFpbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIC4uLiBmdW5jdGlvbiwganVzdCBwYXNzIGFyZ3VtZW50cyBpbiB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hdHVyYWwgdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0VHlwZSA9IHBHZW4tPmdldFIwVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwVGFyZ2V0VHlwZS0+dGFnID09IFRZX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRUeXBlID0gbWtwRG91YmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFRhcmdldFR5cGUtPnRhZyA9PSBUWV9BUlJBWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIGFycmF5cyBieSBwb2ludGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0VHlwZSA9IHBUYXJnZXRUeXBlLT5wVGFpbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFRhcmdldFR5cGUtPnRhZyA9PSBUWV9WT0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkNhbid0IHBhc3Mgdm9pZCB2YWx1ZSBmb3IgYXJndW1lbnQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ0NvdW50ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gcEdlbi0+c3RvcmVSMFRvQXJnKGwsIHBUYXJnZXRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY2NlcHQoJywnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHRvayAhPSAnKScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJywnIG9yICcpJyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYXJnQ291bnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoISB2YXJBcmdzICYmIHBBcmdMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgbW9yZSBhcmd1bWVudChzKS4gU2F3ICVkIiwgYXJnQ291bnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBHZW4tPmVuZEZ1bmN0aW9uQ2FsbEFyZ3VtZW50cyhwRGVjbCwgYSwgbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNraXAoJyknKTsKLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+Y2FsbEluZGlyZWN0KGwsIHBEZWNsKTsKLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+YWRqdXN0U3RhY2tBZnRlckNhbGwocERlY2wsIGwsIHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIHZhbHVlIHRvIGxlZnQgb2YgJygnLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRvU3RydWN0TWVtYmVyKFR5cGUqIHBTdHJ1Y3QsIGJvb2wgaXNEb3QpIHsKLSAgICAgICAgVHlwZSogcFN0cnVjdEVsZW1lbnQgPSBsb29rdXBTdHJ1Y3RNZW1iZXIocFN0cnVjdCwgdG9rKTsKLSAgICAgICAgaWYgKHBTdHJ1Y3RFbGVtZW50KSB7Ci0gICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICBwR2VuLT5hZGRTdHJ1Y3RPZmZzZXRSMChwU3RydWN0RWxlbWVudC0+bGVuZ3RoLCBjcmVhdGVQdHJUeXBlKHBTdHJ1Y3RFbGVtZW50LT5wSGVhZCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGJ1ZjsKLSAgICAgICAgICAgIGRlY29kZVRva2VuKGJ1ZiwgdG9rLCB0cnVlKTsKLSAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhIHN0cnVjdCBtZW1iZXIgdG8gdGhlIHJpZ2h0IG9mICclcycsIGdvdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgIGlzRG90ID8gIi4iIDogIi0+IiwgYnVmLmdldFVud3JhcHBlZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZG9JbmNEZWMoaW50IGlzSW5jLCBpbnQgaXNQb3N0KSB7Ci0gICAgICAgIC8vIFIwIGFscmVhZHkgaGFzIHRoZSBsdmFsCi0gICAgICAgIGNoZWNrTFZhbCgpOwotICAgICAgICBpbnQgbGl0ID0gaXNJbmMgPyAxIDogLTE7Ci0gICAgICAgIHBHZW4tPnB1c2hSMCgpOwotICAgICAgICBwR2VuLT5sb2FkUjBGcm9tUjAoKTsKLSAgICAgICAgaW50IHRhZyA9IHBHZW4tPmdldFIwVHlwZSgpLT50YWc7Ci0gICAgICAgIGlmICghKHRhZyA9PSBUWV9JTlQgfHwgdGFnID09IFRZX1NIT1JUIHx8IHRhZyA9PSBUWV9DSEFSIHx8Ci0gICAgICAgICAgICAgICAgdGFnID09IFRZX1BPSU5URVIpKSB7Ci0gICAgICAgICAgICBlcnJvcigiKysvLS0gaWxsZWdhbCBmb3IgdGhpcyB0eXBlLiAlZCIsIHRhZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUG9zdCkgewotICAgICAgICAgICAgcEdlbi0+b3ZlcigpOwotICAgICAgICAgICAgcEdlbi0+cHVzaFIwKCk7Ci0gICAgICAgICAgICBwR2VuLT5saShsaXQpOwotICAgICAgICAgICAgcEdlbi0+Z2VuT3AoT1BfUExVUyk7Ci0gICAgICAgICAgICBwR2VuLT5zdG9yZVIwVG9UT1MoKTsKLSAgICAgICAgICAgIHBHZW4tPnBvcFIwKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwR2VuLT5wdXNoUjAoKTsKLSAgICAgICAgICAgIHBHZW4tPmxpKGxpdCk7Ci0gICAgICAgICAgICBwR2VuLT5nZW5PcChPUF9QTFVTKTsKLSAgICAgICAgICAgIHBHZW4tPm92ZXIoKTsKLSAgICAgICAgICAgIHBHZW4tPnN0b3JlUjBUb1RPUygpOwotICAgICAgICAgICAgcEdlbi0+cG9wUjAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZG9Qb2ludGVyKCkgewotICAgICAgICBwR2VuLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICBUeXBlKiBwUjBUeXBlID0gcEdlbi0+Z2V0UjBUeXBlKCk7Ci0gICAgICAgIGlmIChwUjBUeXBlLT50YWcgIT0gVFlfUE9JTlRFUikgewotICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgcG9pbnRlciB0eXBlLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBSMFR5cGUtPnBIZWFkLT50YWcgIT0gVFlfRlVOQykgewotICAgICAgICAgICAgICAgIHBHZW4tPnNldFIwRXhwcmVzc2lvblR5cGUoRVRfTFZBTFVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZG9BZGRyZXNzT2YoKSB7Ci0gICAgICAgIFR5cGUqIHBSMCA9IHBHZW4tPmdldFIwVHlwZSgpOwotICAgICAgICBib29sIGlzRnVuY1B0ciA9IHBSMC0+dGFnID09IFRZX1BPSU5URVIgJiYgcFIwLT5wSGVhZC0+dGFnID09IFRZX0ZVTkM7Ci0gICAgICAgIGlmICgoISBpc0Z1bmNQdHIpICYmIHBHZW4tPmdldFIwRXhwcmVzc2lvblR5cGUoKSAhPSBFVF9MVkFMVUUpIHsKLSAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhbiBsdmFsdWUiKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlKiBwUjBUeXBlID0gcEdlbi0+Z2V0UjBUeXBlKCk7Ci0gICAgICAgIHBHZW4tPnNldFIwRXhwcmVzc2lvblR5cGUoRVRfUlZBTFVFKTsKLSAgICB9Ci0KLSAgICAvKiBSZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgZm9yIGJpbmFyeSBvcGVyYXRpb25zLgotICAgICAqLwotICAgIHZvaWQgYmluYXJ5T3AoaW50IGxldmVsKSB7Ci0gICAgICAgIGludHB0cl90IHQsIGE7Ci0gICAgICAgIHQgPSAwOwotICAgICAgICBpZiAobGV2ZWwtLSA9PSAxKQotICAgICAgICAgICAgdW5hcnlPckFzc2lnbm1lbnQoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBiaW5hcnlPcChsZXZlbCk7Ci0gICAgICAgICAgICBhID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChsZXZlbCA9PSB0b2tsKSB7Ci0gICAgICAgICAgICAgICAgdCA9IHRva2M7Ci0gICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgICAgIHBHZW4tPmZvcmNlUjBSVmFsKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsID4gOCkgewotICAgICAgICAgICAgICAgICAgICBhID0gcEdlbi0+Z3RzdCh0ID09IE9QX0xPR0lDQUxfT1IsIGEpOyAvKiAmJiBhbmQgfHwgb3V0cHV0IGNvZGUgZ2VuZXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiaW5hcnlPcChsZXZlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+cHVzaFIwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmFyeU9wKGxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHN5bnRheCBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBHZW4tPmdldFIwVHlwZSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZhaWxlZCB0byBwYXJzZSBhIHJpZ2h0LWhhbmQgYXJndW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBQdXNoIGEgZHVtbXkgdmFsdWUgc28gd2UgZG9uJ3QgZmFpbAotICAgICAgICAgICAgICAgICAgICAgICAgcEdlbi0+bGkoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+Zm9yY2VSMFJWYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChsZXZlbCA9PSA0KSB8IChsZXZlbCA9PSA1KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEdlbi0+Z2NtcCh0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBHZW4tPmdlbk9wKHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogJiYgYW5kIHx8IG91dHB1dCBjb2RlIGdlbmVyYXRpb24gKi8KLSAgICAgICAgICAgIGlmIChhICYmIGxldmVsID4gOCkgewotICAgICAgICAgICAgICAgIHBHZW4tPmZvcmNlUjBSVmFsKCk7Ci0gICAgICAgICAgICAgICAgYSA9IHBHZW4tPmd0c3QodCA9PSBPUF9MT0dJQ0FMX09SLCBhKTsKLSAgICAgICAgICAgICAgICBwR2VuLT5saSh0ICE9IE9QX0xPR0lDQUxfT1IpOwotICAgICAgICAgICAgICAgIGludCBiID0gcEdlbi0+Z2ptcCgwKTsKLSAgICAgICAgICAgICAgICBwR2VuLT5nc3ltKGEpOwotICAgICAgICAgICAgICAgIHBHZW4tPmxpKHQgPT0gT1BfTE9HSUNBTF9PUik7Ci0gICAgICAgICAgICAgICAgcEdlbi0+Z3N5bShiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY29tbWFFeHByKCkgewotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIGV4cHIoKTsKLSAgICAgICAgICAgIGlmICghYWNjZXB0KCcsJykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZXhwcigpIHsKLSAgICAgICAgYmluYXJ5T3AoMTEpOwotICAgIH0KLQotICAgIGludCB0ZXN0X2V4cHIoKSB7Ci0gICAgICAgIGNvbW1hRXhwcigpOwotICAgICAgICBwR2VuLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICByZXR1cm4gcEdlbi0+Z3RzdCgwLCAwKTsKLSAgICB9Ci0KLSAgICB2b2lkIGJsb2NrKGludHB0cl90KiBicmVha0xhYmVsLCBpbnRwdHJfdCBjb250aW51ZUFkZHJlc3MsIGJvb2wgb3V0ZXJtb3N0RnVuY3Rpb25CbG9jaykgewotICAgICAgICBpbnRwdHJfdCBhLCBuLCB0OwotCi0gICAgICAgIFR5cGUqIHBCYXNlVHlwZTsKLSAgICAgICAgaWYgKChwQmFzZVR5cGUgPSBhY2NlcHRQcmltaXRpdmVUeXBlKHRydWUpKSkgewotICAgICAgICAgICAgLyogZGVjbGFyYXRpb25zICovCi0gICAgICAgICAgICBsb2NhbERlY2xhcmF0aW9ucyhwQmFzZVR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHRvayA9PSBUT0tfSUYpIHsKLSAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgIHNraXAoJygnKTsKLSAgICAgICAgICAgIGEgPSB0ZXN0X2V4cHIoKTsKLSAgICAgICAgICAgIHNraXAoJyknKTsKLSAgICAgICAgICAgIGJsb2NrKGJyZWFrTGFiZWwsIGNvbnRpbnVlQWRkcmVzcywgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHRvayA9PSBUT0tfRUxTRSkgewotICAgICAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgICAgICBuID0gcEdlbi0+Z2ptcCgwKTsgLyogam1wICovCi0gICAgICAgICAgICAgICAgcEdlbi0+Z3N5bShhKTsKLSAgICAgICAgICAgICAgICBibG9jayhicmVha0xhYmVsLCBjb250aW51ZUFkZHJlc3MsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBwR2VuLT5nc3ltKG4pOyAvKiBwYXRjaCBlbHNlIGptcCAqLwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwR2VuLT5nc3ltKGEpOyAvKiBwYXRjaCBpZiB0ZXN0ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRvayA9PSBUT0tfV0hJTEUpIHwgKHRvayA9PSBUT0tfRk9SKSkgewotICAgICAgICAgICAgdCA9IHRvazsKLSAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgIHNraXAoJygnKTsKLSAgICAgICAgICAgIGlmICh0ID09IFRPS19XSElMRSkgewotICAgICAgICAgICAgICAgIG4gPSBwQ29kZUJ1Zi0+Z2V0UEMoKTsgLy8gdG9wIG9mIGxvb3AsIHRhcmdldCBvZiAibmV4dCIgaXRlcmF0aW9uCi0gICAgICAgICAgICAgICAgYSA9IHRlc3RfZXhwcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rICE9ICc7JykKLSAgICAgICAgICAgICAgICAgICAgY29tbWFFeHByKCk7Ci0gICAgICAgICAgICAgICAgc2tpcCgnOycpOwotICAgICAgICAgICAgICAgIG4gPSBwQ29kZUJ1Zi0+Z2V0UEMoKTsKLSAgICAgICAgICAgICAgICBhID0gMDsKLSAgICAgICAgICAgICAgICBpZiAodG9rICE9ICc7JykKLSAgICAgICAgICAgICAgICAgICAgYSA9IHRlc3RfZXhwcigpOwotICAgICAgICAgICAgICAgIHNraXAoJzsnKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rICE9ICcpJykgewotICAgICAgICAgICAgICAgICAgICB0ID0gcEdlbi0+Z2ptcCgwKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFFeHByKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW4tPmdqbXAobiAtIHBDb2RlQnVmLT5nZXRQQygpIC0gcEdlbi0+anVtcE9mZnNldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcEdlbi0+Z3N5bSh0KTsKLSAgICAgICAgICAgICAgICAgICAgbiA9IHQgKyA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNraXAoJyknKTsKLSAgICAgICAgICAgIGJsb2NrKCZhLCBuLCBmYWxzZSk7Ci0gICAgICAgICAgICBwR2VuLT5nam1wKG4gLSBwQ29kZUJ1Zi0+Z2V0UEMoKSAtIHBHZW4tPmp1bXBPZmZzZXQoKSk7IC8qIGptcCAqLwotICAgICAgICAgICAgcEdlbi0+Z3N5bShhKTsKLSAgICAgICAgfSBlbHNlIGlmICh0b2sgPT0gJ3snKSB7Ci0gICAgICAgICAgICBpZiAoISBvdXRlcm1vc3RGdW5jdGlvbkJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUxvY2Fscy5wdXNoTGV2ZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2sgIT0gJ30nICYmIHRvayAhPSBFT0YpCi0gICAgICAgICAgICAgICAgYmxvY2soYnJlYWtMYWJlbCwgY29udGludWVBZGRyZXNzLCBmYWxzZSk7Ci0gICAgICAgICAgICBza2lwKCd9Jyk7Ci0gICAgICAgICAgICBpZiAoISBvdXRlcm1vc3RGdW5jdGlvbkJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUxvY2Fscy5wb3BMZXZlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGFjY2VwdChUT0tfUkVUVVJOKSkgewotICAgICAgICAgICAgICAgIGlmICh0b2sgIT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hRXhwcigpOwotICAgICAgICAgICAgICAgICAgICBwR2VuLT5mb3JjZVIwUlZhbCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJldHVyblR5cGUtPnRhZyA9PSBUWV9WT0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiTXVzdCBub3QgcmV0dXJuIGEgdmFsdWUgZnJvbSBhIHZvaWQgZnVuY3Rpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBHZW4tPmNvbnZlcnRSMChwUmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocFJldHVyblR5cGUtPnRhZyAhPSBUWV9WT0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiTXVzdCBzcGVjaWZ5IGEgdmFsdWUgaGVyZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJzeW0gPSBwR2VuLT5nam1wKHJzeW0pOyAvKiBqbXAgKi8KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0KFRPS19CUkVBSykpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnJlYWtMYWJlbCkgewotICAgICAgICAgICAgICAgICAgICAqYnJlYWtMYWJlbCA9IHBHZW4tPmdqbXAoKmJyZWFrTGFiZWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJicmVhayBzdGF0ZW1lbnQgbXVzdCBiZSB3aXRoaW4gYSBmb3IsIGRvLCB3aGlsZSwgb3Igc3dpdGNoIHN0YXRlbWVudCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0KFRPS19DT05USU5VRSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGludWVBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW4tPmdqbXAoY29udGludWVBZGRyZXNzIC0gcENvZGVCdWYtPmdldFBDKCkgLSBwR2VuLT5qdW1wT2Zmc2V0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yKCJjb250aW51ZSBzdGF0ZW1lbnQgbXVzdCBiZSB3aXRoaW4gYSBmb3IsIGRvLCBvciB3aGlsZSBzdGF0ZW1lbnQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRvayAhPSAnOycpCi0gICAgICAgICAgICAgICAgY29tbWFFeHByKCk7Ci0gICAgICAgICAgICBza2lwKCc7Jyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbCB0eXBlRXF1YWwoVHlwZSogYSwgVHlwZSogYikgewotICAgICAgICBpZiAoYSA9PSBiKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYSA9PSBOVUxMIHx8IGIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFR5cGVUYWcgYXQgPSBhLT50YWc7Ci0gICAgICAgIGlmIChhdCAhPSBiLT50YWcpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXQgPT0gVFlfUE9JTlRFUikgewotICAgICAgICAgICAgcmV0dXJuIHR5cGVFcXVhbChhLT5wSGVhZCwgYi0+cEhlYWQpOwotICAgICAgICB9IGVsc2UgaWYgKGF0ID09IFRZX0FSUkFZKSB7Ci0gICAgICAgICAgICByZXR1cm4gYS0+bGVuZ3RoID09IGItPmxlbmd0aCAmJiB0eXBlRXF1YWwoYS0+cEhlYWQsIGItPnBIZWFkKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdCA9PSBUWV9GVU5DIHx8IGF0ID09IFRZX1BBUkFNKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZUVxdWFsKGEtPnBIZWFkLCBiLT5wSGVhZCkKLSAgICAgICAgICAgICAgICAmJiB0eXBlRXF1YWwoYS0+cFRhaWwsIGItPnBUYWlsKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdCA9PSBUWV9TVFJVQ1QpIHsKLSAgICAgICAgICAgIHJldHVybiBhLT5wSGVhZCA9PSBiLT5wSGVhZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBUeXBlKiBjcmVhdGVUeXBlKFR5cGVUYWcgdGFnLCBUeXBlKiBwSGVhZCwgVHlwZSogcFRhaWwpIHsKLSAgICAgICAgYXNzZXJ0KHRhZyA+PSBUWV9VTktOT1dOICYmIHRhZyA8PSBUWV9QQVJBTSk7Ci0gICAgICAgIFR5cGUqIHBUeXBlID0gKFR5cGUqKSBtcEN1cnJlbnRBcmVuYS0+YWxsb2Moc2l6ZW9mKFR5cGUpKTsKLSAgICAgICAgbWVtc2V0KHBUeXBlLCAwLCBzaXplb2YoKnBUeXBlKSk7Ci0gICAgICAgIHBUeXBlLT5zdG9yYWdlQ2xhc3MgPSBTQ19ERUZBVUxUOwotICAgICAgICBwVHlwZS0+dGFnID0gdGFnOwotICAgICAgICBwVHlwZS0+cEhlYWQgPSBwSGVhZDsKLSAgICAgICAgcFR5cGUtPnBUYWlsID0gcFRhaWw7Ci0gICAgICAgIHJldHVybiBwVHlwZTsKLSAgICB9Ci0KLSAgICBUeXBlKiBjcmVhdGVQdHJUeXBlKFR5cGUqIHBUeXBlKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUeXBlKFRZX1BPSU5URVIsIHBUeXBlLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcnkgdG8gcHJpbnQgYSB0eXBlIGluIGRlY2xhcmF0aW9uIG9yZGVyCi0gICAgICovCi0gICAgdm9pZCBkZWNvZGVUeXBlKFN0cmluZyYgYnVmZmVyLCBUeXBlKiBwVHlwZSkgewotICAgICAgICBidWZmZXIuY2xlYXIoKTsKLSAgICAgICAgaWYgKHBUeXBlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRDU3RyKCJudWxsIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZGVjb2RlVHlwZUltcChidWZmZXIsIHBUeXBlKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRlY29kZVR5cGVJbXAoU3RyaW5nJiBidWZmZXIsIFR5cGUqIHBUeXBlKSB7Ci0gICAgICAgIGRlY29kZVR5cGVJbXBQcmVmaXgoYnVmZmVyLCBwVHlwZSk7Ci0gICAgICAgIGRlY29kZUlkKGJ1ZmZlciwgcFR5cGUtPmlkKTsKLSAgICAgICAgZGVjb2RlVHlwZUltcFBvc3RmaXgoYnVmZmVyLCBwVHlwZSk7Ci0gICAgfQotCi0gICAgdm9pZCBkZWNvZGVJZChTdHJpbmcmIGJ1ZmZlciwgdG9rZW5pZF90IGlkKSB7Ci0gICAgICAgIGlmIChpZCkgewotICAgICAgICAgICAgU3RyaW5nIHRlbXA7Ci0gICAgICAgICAgICBkZWNvZGVUb2tlbih0ZW1wLCBpZCwgZmFsc2UpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZW1wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVjb2RlVHlwZUltcFByZWZpeChTdHJpbmcmIGJ1ZmZlciwgVHlwZSogcFR5cGUpIHsKLSAgICAgICAgVHlwZVRhZyB0YWcgPSBwVHlwZS0+dGFnOwotCi0gICAgICAgIGlmICgodGFnID49IFRZX0lOVCAmJiB0YWcgPD0gVFlfRE9VQkxFKSB8fCB0YWcgPT0gVFlfU1RSVUNUKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRhZykgewotICAgICAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kQ1N0cigiaW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRDU3RyKCJzaG9ydCIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZX0NIQVI6Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRDU3RyKCJjaGFyIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfVk9JRDoKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZENTdHIoInZvaWQiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZENTdHIoImZsb2F0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kQ1N0cigiZG91YmxlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlfU1RSVUNUOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cnVjdCA9IChwVHlwZS0+cEhlYWQtPmFsaWdubWVudCAmIDB4ODAwMDAwMDApICE9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRDU3RyKGlzU3RydWN0ID8gInN0cnVjdCIgOiAidW5pb24iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUeXBlLT5wSGVhZCAmJiBwVHlwZS0+cEhlYWQtPnN0cnVjdFRhZykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlSWQoYnVmZmVyLCBwVHlwZS0+cEhlYWQtPnN0cnVjdFRhZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICAgIGNhc2UgVFlfSU5UOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWV9TSE9SVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlfQ0hBUjoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlfVk9JRDoKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZX0ZMT0FUOgotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlfRE9VQkxFOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWV9QT0lOVEVSOgotICAgICAgICAgICAgICAgIGRlY29kZVR5cGVJbXBQcmVmaXgoYnVmZmVyLCBwVHlwZS0+cEhlYWQpOwotICAgICAgICAgICAgICAgIGlmKHBUeXBlLT5wSGVhZCAmJiBwVHlwZS0+cEhlYWQtPnRhZyA9PSBUWV9GVU5DKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJygnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnKicpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWV9BUlJBWToKLSAgICAgICAgICAgICAgICBkZWNvZGVUeXBlSW1wUHJlZml4KGJ1ZmZlciwgcFR5cGUtPnBIZWFkKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlfU1RSVUNUOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWV9GVU5DOgotICAgICAgICAgICAgICAgIGRlY29kZVR5cGVJbXAoYnVmZmVyLCBwVHlwZS0+cEhlYWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWV9QQVJBTToKLSAgICAgICAgICAgICAgICBkZWNvZGVUeXBlSW1wKGJ1ZmZlciwgcFR5cGUtPnBIZWFkKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRlbXA7Ci0gICAgICAgICAgICAgICAgdGVtcC5wcmludGYoIlVua25vd24gdGFnICVkIiwgcFR5cGUtPnRhZyk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZW1wKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVjb2RlVHlwZUltcFBvc3RmaXgoU3RyaW5nJiBidWZmZXIsIFR5cGUqIHBUeXBlKSB7Ci0gICAgICAgIFR5cGVUYWcgdGFnID0gcFR5cGUtPnRhZzsKLQotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICBjYXNlIFRZX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgaWYocFR5cGUtPnBIZWFkICYmIHBUeXBlLT5wSGVhZC0+dGFnID09IFRZX0ZVTkMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnKScpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWNvZGVUeXBlSW1wUG9zdGZpeChidWZmZXIsIHBUeXBlLT5wSGVhZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZX0FSUkFZOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAucHJpbnRmKCJbJWRdIiwgcFR5cGUtPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodGVtcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWV9TVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgaWYgKHBUeXBlLT5wSGVhZC0+bGVuZ3RoID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZENTdHIoIiB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihUeXBlKiBwQXJnID0gcFR5cGUtPnBUYWlsOyBwQXJnOyBwQXJnID0gcEFyZy0+cFRhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVR5cGVJbXAoYnVmZmVyLCBwQXJnLT5wSGVhZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kQ1N0cigiOyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJ30nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRZX0ZVTkM6Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnKCcpOwotICAgICAgICAgICAgICAgIGZvcihUeXBlKiBwQXJnID0gcFR5cGUtPnBUYWlsOyBwQXJnOyBwQXJnID0gcEFyZy0+cFRhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlVHlwZUltcChidWZmZXIsIHBBcmcpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEFyZy0+cFRhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRDU3RyKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyknKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50VHlwZShUeXBlKiBwVHlwZSkgewotICAgICAgICBTdHJpbmcgYnVmZmVyOwotICAgICAgICBkZWNvZGVUeXBlKGJ1ZmZlciwgcFR5cGUpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBidWZmZXIuZ2V0VW53cmFwcGVkKCkpOwotICAgIH0KLQotICAgIHZvaWQgaW5zZXJ0VHlwZVNwZWNpZmllcihUeXBlKiogcHBUeXBlLCBUeXBlVGFnIHRhZykgewotICAgICAgICBpZiAoISAqcHBUeXBlKSB7Ci0gICAgICAgICAgICAqcHBUeXBlID0gY3JlYXRlVHlwZSh0YWcsIE5VTEwsIE5VTEwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCgqcHBUeXBlKS0+dGFnICE9IFRZX1VOS05PV04pIHsKLSAgICAgICAgICAgICAgICBlcnJvcigiT25seSBvbmUgdHlwZSBzcGVjaWZpZXIgYWxsb3dlZC4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKCpwcFR5cGUpLT50YWcgPSB0YWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydFN0b3JhZ2VDbGFzcyhUeXBlKiogcHBUeXBlLCBTdG9yYWdlQ2xhc3Mgc3RvcmFnZUNsYXNzKSB7Ci0gICAgICAgIGlmICghICpwcFR5cGUpIHsKLSAgICAgICAgICAgICpwcFR5cGUgPSBjcmVhdGVUeXBlKFRZX1VOS05PV04sIE5VTEwsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoKnBwVHlwZSktPnN0b3JhZ2VDbGFzcyAhPSBTQ19ERUZBVUxUKSB7Ci0gICAgICAgICAgICBlcnJvcigiT25seSBvbmUgc3RvcmFnZSBjbGFzcyBhbGxvd2VkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKCpwcFR5cGUpLT5zdG9yYWdlQ2xhc3MgPSBzdG9yYWdlQ2xhc3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBUeXBlKiBhY2NlcHRQcmltaXRpdmVUeXBlKGJvb2wgYWxsb3dTdG9yYWdlQ2xhc3MpIHsKLSAgICAgICAgVHlwZSogcFR5cGUgPSBOVUxMOwotICAgICAgICBmb3IgKGJvb2wga2VlcEdvaW5nID0gdHJ1ZTsga2VlcEdvaW5nOykgewotICAgICAgICAgICAgc3dpdGNoKHRvaykgewotICAgICAgICAgICAgY2FzZSBUT0tfQVVUTzoKLSAgICAgICAgICAgICAgICBpbnNlcnRTdG9yYWdlQ2xhc3MoJnBUeXBlLCBTQ19BVVRPKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVE9LX1JFR0lTVEVSOgotICAgICAgICAgICAgICAgIGluc2VydFN0b3JhZ2VDbGFzcygmcFR5cGUsIFNDX1JFR0lTVEVSKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVE9LX1NUQVRJQzoKLSAgICAgICAgICAgICAgICBpbnNlcnRTdG9yYWdlQ2xhc3MoJnBUeXBlLCBTQ19TVEFUSUMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUT0tfRVhURVJOOgotICAgICAgICAgICAgICAgIGluc2VydFN0b3JhZ2VDbGFzcygmcFR5cGUsIFNDX0VYVEVSTik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRPS19UWVBFREVGOgotICAgICAgICAgICAgICAgIGluc2VydFN0b3JhZ2VDbGFzcygmcFR5cGUsIFNDX1RZUEVERUYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUT0tfSU5UOgotICAgICAgICAgICAgICAgIGluc2VydFR5cGVTcGVjaWZpZXIoJnBUeXBlLCBUWV9JTlQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUT0tfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgaW5zZXJ0VHlwZVNwZWNpZmllcigmcFR5cGUsIFRZX1NIT1JUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVE9LX0NIQVI6Ci0gICAgICAgICAgICAgICAgaW5zZXJ0VHlwZVNwZWNpZmllcigmcFR5cGUsIFRZX0NIQVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUT0tfVk9JRDoKLSAgICAgICAgICAgICAgICBpbnNlcnRUeXBlU3BlY2lmaWVyKCZwVHlwZSwgVFlfVk9JRCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRPS19GTE9BVDoKLSAgICAgICAgICAgICAgICBpbnNlcnRUeXBlU3BlY2lmaWVyKCZwVHlwZSwgVFlfRkxPQVQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUT0tfRE9VQkxFOgotICAgICAgICAgICAgICAgIGluc2VydFR5cGVTcGVjaWZpZXIoJnBUeXBlLCBUWV9ET1VCTEUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUT0tfU1RSVUNUOgotICAgICAgICAgICAgY2FzZSBUT0tfVU5JT046Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5zZXJ0VHlwZVNwZWNpZmllcigmcFR5cGUsIFRZX1NUUlVDVCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc1N0cnVjdCA9ICh0b2sgPT0gVE9LX1NUUlVDVCk7Ci0gICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgICAgIHBUeXBlID0gYWNjZXB0U3RydWN0KHBUeXBlLCBpc1N0cnVjdCk7Ci0gICAgICAgICAgICAgICAga2VlcEdvaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIElzIGl0IGEgdHlwZWRlZj8KLSAgICAgICAgICAgICAgICBpZiAoaXNTeW1ib2wodG9rKSkgewotICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUluZm8qIHBWID0gVkkodG9rKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWICYmIHBWLT5wVHlwZS0+c3RvcmFnZUNsYXNzID09IFNDX1RZUEVERUYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHBUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUgPSBjcmVhdGVUeXBlKFRZX1VOS05PV04sIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIHN0b3JhZ2VDbGFzcyA9IHBUeXBlLT5zdG9yYWdlQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcFR5cGUgPSAqcFYtPnBUeXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUtPnN0b3JhZ2VDbGFzcyA9IHN0b3JhZ2VDbGFzczsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBHb2luZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAga2VlcEdvaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtlZXBHb2luZykgewotICAgICAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocFR5cGUpIHsKLSAgICAgICAgICAgIGlmIChwVHlwZS0+dGFnID09IFRZX1VOS05PV04pIHsKLSAgICAgICAgICAgICAgICBwVHlwZS0+dGFnID0gVFlfSU5UOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFsbG93U3RvcmFnZUNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHBUeXBlLT5zdG9yYWdlQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNDX0FVVE86IGVycm9yKCJhdXRvIG5vdCBzdXBwb3J0ZWQuIik7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0NfUkVHSVNURVI6IGVycm9yKCJyZWdpc3RlciBub3Qgc3VwcG9ydGVkLiIpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNDX1NUQVRJQzogZXJyb3IoInN0YXRpYyBub3Qgc3VwcG9ydGVkLiIpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNDX0VYVEVSTjogZXJyb3IoImV4dGVybiBub3Qgc3VwcG9ydGVkLiIpOyBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwVHlwZS0+c3RvcmFnZUNsYXNzICE9IFNDX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkFuIGV4cGxpY2l0IHN0b3JhZ2UgY2xhc3MgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyB0eXBlIGRlY2xhcmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwVHlwZTsKLSAgICB9Ci0KLSAgICBUeXBlKiBhY2NlcHRTdHJ1Y3QoVHlwZSogcFN0cnVjdFR5cGUsIGJvb2wgaXNTdHJ1Y3QpIHsKLSAgICAgICAgdG9rZW5pZF90IHN0cnVjdFRhZyA9IGFjY2VwdFN5bWJvbCgpOwotICAgICAgICBib29sIGlzRGVjbGFyYXRpb24gPSBhY2NlcHQoJ3snKTsKLSAgICAgICAgYm9vbCBmYWlsID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHN0cnVjdFRhZykgewotICAgICAgICAgICAgVG9rZW4qIHBUb2tlbiA9ICZtVG9rZW5UYWJsZVtzdHJ1Y3RUYWddOwotICAgICAgICAgICAgVmFyaWFibGVJbmZvKiBwU3RydWN0SW5mbyA9IHBUb2tlbi0+bXBTdHJ1Y3RJbmZvOwotICAgICAgICAgICAgYm9vbCBuZWVkVG9EZWNsYXJlID0gIXBTdHJ1Y3RJbmZvOwotICAgICAgICAgICAgaWYgKHBTdHJ1Y3RJbmZvKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1wQ3VycmVudFN5bWJvbFN0YWNrLT5pc1N0cnVjdFRhZ0RlZmluZWRBdEN1cnJlbnRMZXZlbChzdHJ1Y3RUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFN0cnVjdEluZm8tPnBUeXBlLT5wSGVhZC0+bGVuZ3RoID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZmlsbGluZyBpbiBhIGZvcndhcmQgZGVjbGFyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFRvRGVjbGFyZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiQSBzdHJ1Y3Qgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgZGVmaW5lZCBhdCB0aGlzIGxldmVsLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFRvRGVjbGFyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFmYWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgICBhc3NlcnQocFN0cnVjdEluZm8tPmlzU3RydWN0VGFnKTsKLSAgICAgICAgICAgICAgICAgICAgIHBTdHJ1Y3RUeXBlLT5wSGVhZCA9IHBTdHJ1Y3RJbmZvLT5wVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgIHBTdHJ1Y3RUeXBlLT5wVGFpbCA9IHBTdHJ1Y3RUeXBlLT5wSGVhZC0+cFRhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmVlZFRvRGVjbGFyZSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgc3RydWN0IG5hbWUKLSAgICAgICAgICAgICAgICBwVG9rZW4tPm1wU3RydWN0SW5mbyA9IG1wQ3VycmVudFN5bWJvbFN0YWNrLT5hZGRTdHJ1Y3RUYWcoc3RydWN0VGFnKTsKLSAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3Mgc3RvcmFnZUNsYXNzID0gcFN0cnVjdFR5cGUtPnN0b3JhZ2VDbGFzczsKLSAgICAgICAgICAgICAgICBwU3RydWN0VHlwZSA9IGNyZWF0ZVR5cGUoVFlfU1RSVUNULCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBwU3RydWN0VHlwZS0+c3RydWN0VGFnID0gc3RydWN0VGFnOwotICAgICAgICAgICAgICAgIHBTdHJ1Y3RUeXBlLT5wSGVhZCA9IHBTdHJ1Y3RUeXBlOwotICAgICAgICAgICAgICAgIHBTdHJ1Y3RUeXBlLT5zdG9yYWdlQ2xhc3MgPSBzdG9yYWdlQ2xhc3M7Ci0gICAgICAgICAgICAgICAgaWYgKCEgaXNEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvLyBBIGZvcndhcmQgZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgcFN0cnVjdFR5cGUtPmxlbmd0aCA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwVG9rZW4tPm1wU3RydWN0SW5mby0+cFR5cGUgPSBwU3RydWN0VHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEFuIGFub255bW91cyBzdHJ1Y3QKLSAgICAgICAgICAgIHBTdHJ1Y3RUeXBlLT5wSGVhZCA9IHBTdHJ1Y3RUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IHN0cnVjdFNpemUgPSAwOwotICAgICAgICAgICAgc2l6ZV90IHN0cnVjdEFsaWdubWVudCA9IDA7Ci0gICAgICAgICAgICBUeXBlKiogcFBhcmFtSG9sZGVyID0gJiBwU3RydWN0VHlwZS0+cEhlYWQtPnBUYWlsOwotICAgICAgICAgICAgd2hpbGUgKHRvayAhPSAnfScgJiYgdG9rICE9IEVPRikgewotICAgICAgICAgICAgICAgIFR5cGUqIHBQcmltaXRpdmVUeXBlID0gZXhwZWN0UHJpbWl0aXZlVHlwZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBQcmltaXRpdmVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0b2sgIT0gJzsnICYmIHRvayAhPSBFT0YpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUqIHBJdGVtID0gYWNjZXB0RGVjbGFyYXRpb24ocFByaW1pdGl2ZVR5cGUsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcEl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29rdXBTdHJ1Y3RNZW1iZXIocFN0cnVjdFR5cGUsIHBJdGVtLT5pZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRva2VuKGJ1ZiwgcEl0ZW0tPmlkLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBzdHJ1Y3QgbWVtYmVyICVzIiwgYnVmLmdldFVud3JhcHBlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUqIHBTdHJ1Y3RFbGVtZW50ID0gY3JlYXRlVHlwZShUWV9QQVJBTSwgcEl0ZW0sIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IHBHZW4tPmFsaWdubWVudE9mKHBJdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlnbm1lbnQgPiBzdHJ1Y3RBbGlnbm1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50TWFzayA9IGFsaWdubWVudCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ICsgYWxpZ25tZW50TWFzaykgJiB+YWxpZ25tZW50TWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJ1Y3RFbGVtZW50LT5sZW5ndGggPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHBHZW4tPnNpemVPZihwSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdHJ1Y3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RTaXplID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSBzdHJ1Y3RTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdFNpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwUGFyYW1Ib2xkZXIgPSBwU3RydWN0RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbUhvbGRlciA9ICZwU3RydWN0RWxlbWVudC0+cFRhaWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQoJywnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBza2lwKCc7Jyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBzb3J0IG9mIHN5bnRheCBlcnJvciwgc2tpcCB0b2tlbiBhbmQga2VlcCB0cnlpbmcKLSAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZmFpbCkgewotICAgICAgICAgICAgICAgIHBTdHJ1Y3RUeXBlLT5wSGVhZC0+bGVuZ3RoID0gc3RydWN0U2l6ZTsKLSAgICAgICAgICAgICAgICBwU3RydWN0VHlwZS0+cEhlYWQtPmFsaWdubWVudCA9IHN0cnVjdEFsaWdubWVudCB8IChpc1N0cnVjdCA8PCAzMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBza2lwKCd9Jyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhaWwpIHsKLSAgICAgICAgICAgIHBTdHJ1Y3RUeXBlID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFN0cnVjdFR5cGU7Ci0gICAgfQotCi0gICAgVHlwZSogbG9va3VwU3RydWN0TWVtYmVyKFR5cGUqIHBTdHJ1Y3QsIHRva2VuaWRfdCBtZW1iZXJJZCkgewotICAgICAgICBmb3IoVHlwZSogcFN0cnVjdEVsZW1lbnQgPSBwU3RydWN0LT5wSGVhZC0+cFRhaWw7IHBTdHJ1Y3RFbGVtZW50OyBwU3RydWN0RWxlbWVudCA9IHBTdHJ1Y3RFbGVtZW50LT5wVGFpbCkgewotICAgICAgICAgICAgaWYgKHBTdHJ1Y3RFbGVtZW50LT5wSGVhZC0+aWQgPT0gbWVtYmVySWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcFN0cnVjdEVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVHlwZSogYWNjZXB0RGVjbGFyYXRpb24oVHlwZSogcFR5cGUsIGJvb2wgbmFtZUFsbG93ZWQsIGJvb2wgbmFtZVJlcXVpcmVkKSB7Ci0gICAgICAgIHRva2VuaWRfdCBkZWNsTmFtZSA9IDA7Ci0gICAgICAgIGJvb2wgcmVwb3J0RmFpbHVyZSA9IGZhbHNlOwotICAgICAgICBTdG9yYWdlQ2xhc3Mgc3RvcmFnZUNsYXNzID0gcFR5cGUtPnN0b3JhZ2VDbGFzczsKLSAgICAgICAgcFR5cGUgPSBhY2NlcHREZWNsMihwVHlwZSwgZGVjbE5hbWUsIG5hbWVBbGxvd2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVSZXF1aXJlZCwgcmVwb3J0RmFpbHVyZSk7Ci0gICAgICAgIGlmIChkZWNsTmFtZSkgewotICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIHBhcmVudCB0eXBlIHNvIHdlIGNhbiBzZXQgYSB1bmlxdWUgSUQKLSAgICAgICAgICAgIFR5cGUqIHBPbGRUeXBlID0gcFR5cGU7Ci0gICAgICAgICAgICBwVHlwZSA9IGNyZWF0ZVR5cGUocFR5cGUtPnRhZywgcFR5cGUtPnBIZWFkLCBwVHlwZS0+cFRhaWwpOwotICAgICAgICAgICAgKnBUeXBlID0gKnBPbGRUeXBlOwotICAgICAgICAgICAgcFR5cGUtPmlkID0gZGVjbE5hbWU7Ci0gICAgICAgICAgICBwVHlwZS0+c3RvcmFnZUNsYXNzID0gc3RvcmFnZUNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWVSZXF1aXJlZCkgewotICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgdmFyaWFibGUgbmFtZSIpOwotICAgICAgICB9Ci0jaWYgMAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNlZCBhIGRlY2xhcmF0aW9uOiAgICAgICAiKTsKLSAgICAgICAgcHJpbnRUeXBlKHBUeXBlKTsKLSNlbmRpZgotICAgICAgICBpZiAocmVwb3J0RmFpbHVyZSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBUeXBlOwotICAgIH0KLQotICAgIFR5cGUqIGV4cGVjdERlY2xhcmF0aW9uKFR5cGUqIHBCYXNlVHlwZSkgewotICAgICAgICBib29sIG5hbWVSZXF1aXJlZCA9IHBCYXNlVHlwZS0+dGFnICE9IFRZX1NUUlVDVDsKLSAgICAgICAgVHlwZSogcFR5cGUgPSBhY2NlcHREZWNsYXJhdGlvbihwQmFzZVR5cGUsIHRydWUsIG5hbWVSZXF1aXJlZCk7Ci0gICAgICAgIGlmICghIHBUeXBlKSB7Ci0gICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYSBkZWNsYXJhdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwVHlwZTsKLSAgICB9Ci0KLSAgICAvKiBVc2VkIGZvciBhY2NlcHRpbmcgdHlwZXMgdGhhdCBhcHBlYXIgaW4gY2FzdHMgKi8KLSAgICBUeXBlKiBhY2NlcHRDYXN0VHlwZURlY2xhcmF0aW9uKCkgewotICAgICAgICBUeXBlKiBwVHlwZSA9IGFjY2VwdFByaW1pdGl2ZVR5cGUoZmFsc2UpOwotICAgICAgICBpZiAocFR5cGUpIHsKLSAgICAgICAgICAgIHBUeXBlID0gYWNjZXB0RGVjbGFyYXRpb24ocFR5cGUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBUeXBlOwotICAgIH0KLQotICAgIFR5cGUqIGV4cGVjdENhc3RUeXBlRGVjbGFyYXRpb24oKSB7Ci0gICAgICAgIFR5cGUqIHBUeXBlID0gYWNjZXB0Q2FzdFR5cGVEZWNsYXJhdGlvbigpOwotICAgICAgICBpZiAoISBwVHlwZSkgewotICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgZGVjbGFyYXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFR5cGU7Ci0gICAgfQotCi0gICAgVHlwZSogYWNjZXB0RGVjbDIoVHlwZSogcFR5cGUsIHRva2VuaWRfdCYgZGVjbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lQWxsb3dlZCwgYm9vbCBuYW1lUmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCYgcmVwb3J0RmFpbHVyZSkgewotICAgICAgICB3aGlsZSAoYWNjZXB0KCcqJykpIHsKLSAgICAgICAgICAgIHBUeXBlID0gY3JlYXRlVHlwZShUWV9QT0lOVEVSLCBwVHlwZSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgcFR5cGUgPSBhY2NlcHREZWNsMyhwVHlwZSwgZGVjbE5hbWUsIG5hbWVBbGxvd2VkLCBuYW1lUmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0RmFpbHVyZSk7Ci0gICAgICAgIHJldHVybiBwVHlwZTsKLSAgICB9Ci0KLSAgICBUeXBlKiBhY2NlcHREZWNsMyhUeXBlKiBwVHlwZSwgdG9rZW5pZF90JiBkZWNsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVBbGxvd2VkLCBib29sIG5hbWVSZXF1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sJiByZXBvcnRGYWlsdXJlKSB7Ci0gICAgICAgIC8vIGRpcmVjdC1kY2wgOgotICAgICAgICAvLyAgIG5hbWUKLSAgICAgICAgLy8gIChkY2wpCi0gICAgICAgIC8vICAgZGlyZWN0LWRjbCgpCi0gICAgICAgIC8vICAgZGlyZWN0LWRjbFtdCi0gICAgICAgIFR5cGUqIHBOZXdIZWFkID0gTlVMTDsKLSAgICAgICAgaWYgKGFjY2VwdCgnKCcpKSB7Ci0gICAgICAgICAgICBwTmV3SGVhZCA9IGFjY2VwdERlY2wyKHBOZXdIZWFkLCBkZWNsTmFtZSwgbmFtZUFsbG93ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVSZXF1aXJlZCwgcmVwb3J0RmFpbHVyZSk7Ci0gICAgICAgICAgICBza2lwKCcpJyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGRlY2xOYW1lID0gYWNjZXB0U3ltYm9sKCkpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChuYW1lQWxsb3dlZCA9PSBmYWxzZSAmJiBkZWNsTmFtZSkgewotICAgICAgICAgICAgICAgIGVycm9yKCJTeW1ib2wgJXMgbm90IGFsbG93ZWQgaGVyZSIsIG5hbWVvZihkZWNsTmFtZSkpOwotICAgICAgICAgICAgICAgIHJlcG9ydEZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5hbWVSZXF1aXJlZCAmJiAhIGRlY2xOYW1lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcDsKLSAgICAgICAgICAgIGRlY29kZVRva2VuKHRlbXAsIHRvaywgdHJ1ZSk7Ci0gICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgbmFtZS4gR290ICVzIiwgdGVtcC5nZXRVbndyYXBwZWQoKSk7Ci0gICAgICAgICAgICByZXBvcnRGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIGlmIChhY2NlcHQoJygnKSkgewotICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgVHlwZSogcFRhaWwgPSBhY2NlcHRBcmdzKG5hbWVBbGxvd2VkKTsKLSAgICAgICAgICAgICAgICBwVHlwZSA9IGNyZWF0ZVR5cGUoVFlfRlVOQywgcFR5cGUsIHBUYWlsKTsKLSAgICAgICAgICAgICAgICBza2lwKCcpJyk7Ci0gICAgICAgICAgICB9IGlmIChhY2NlcHQoJ1snKSkgewotICAgICAgICAgICAgICAgIGlmICh0b2sgIT0gJ10nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2sgIT0gVE9LX05VTSB8fCB0b2tjIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBwb3NpdGl2ZSBpbnRlZ2VyIGNvbnN0YW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUeXBlKiBwRGVjYXlUeXBlID0gY3JlYXRlUHRyVHlwZShwVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVHlwZSA9IGNyZWF0ZVR5cGUoVFlfQVJSQVksIHBUeXBlLCBwRGVjYXlUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlLT5sZW5ndGggPSB0b2tjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2tpcCgnXScpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwTmV3SGVhZCkgewotICAgICAgICAgICAgVHlwZSogcEEgPSBwTmV3SGVhZDsKLSAgICAgICAgICAgIHdoaWxlIChwQS0+cEhlYWQpIHsKLSAgICAgICAgICAgICAgICBwQSA9IHBBLT5wSGVhZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBLT5wSGVhZCA9IHBUeXBlOwotICAgICAgICAgICAgcFR5cGUgPSBwTmV3SGVhZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFR5cGU7Ci0gICAgfQotCi0gICAgVHlwZSogYWNjZXB0QXJncyhib29sIG5hbWVBbGxvd2VkKSB7Ci0gICAgICAgIFR5cGUqIHBIZWFkID0gTlVMTDsKLSAgICAgICAgVHlwZSogcFRhaWwgPSBOVUxMOwotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIFR5cGUqIHBCYXNlQXJnID0gYWNjZXB0UHJpbWl0aXZlVHlwZShmYWxzZSk7Ci0gICAgICAgICAgICBpZiAocEJhc2VBcmcpIHsKLSAgICAgICAgICAgICAgICBUeXBlKiBwQXJnID0gYWNjZXB0RGVjbGFyYXRpb24ocEJhc2VBcmcsIG5hbWVBbGxvd2VkLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBBcmcpIHsKLSAgICAgICAgICAgICAgICAgICAgVHlwZSogcFBhcmFtID0gY3JlYXRlVHlwZShUWV9QQVJBTSwgcEFyZywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcEhlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBIZWFkID0gcFBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRhaWwgPSBwUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGFpbC0+cFRhaWwgPSBwUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGFpbCA9IHBQYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghIGFjY2VwdCgnLCcpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBIZWFkOwotICAgIH0KLQotICAgIFR5cGUqIGV4cGVjdFByaW1pdGl2ZVR5cGUoYm9vbCBhbGxvd1N0b3JhZ2VDbGFzcykgewotICAgICAgICBUeXBlKiBwVHlwZSA9IGFjY2VwdFByaW1pdGl2ZVR5cGUoYWxsb3dTdG9yYWdlQ2xhc3MpOwotICAgICAgICBpZiAoIXBUeXBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYnVmOwotICAgICAgICAgICAgZGVjb2RlVG9rZW4oYnVmLCB0b2ssIHRydWUpOwotICAgICAgICAgICAgZXJyb3IoIkV4cGVjdGVkIGEgdHlwZSwgZ290ICVzIiwgYnVmLmdldFVud3JhcHBlZCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcFR5cGU7Ci0gICAgfQotCi0gICAgdm9pZCBjaGVja0xWYWwoKSB7Ci0gICAgICAgIGlmIChwR2VuLT5nZXRSMEV4cHJlc3Npb25UeXBlKCkgIT0gRVRfTFZBTFVFKSB7Ci0gICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgYW4gbHZhbHVlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZEdsb2JhbFN5bWJvbChUeXBlKiBwRGVjbCkgewotICAgICAgICB0b2tlbmlkX3QgdCA9IHBEZWNsLT5pZDsKLSAgICAgICAgVmFyaWFibGVJbmZvKiBwVkkgPSBWSSh0KTsKLSAgICAgICAgaWYocFZJICYmIHBWSS0+cEFkZHJlc3MpIHsKLSAgICAgICAgICAgIHJlcG9ydER1cGxpY2F0ZSh0KTsKLSAgICAgICAgfQotICAgICAgICBtR2xvYmFscy5hZGQocERlY2wpOwotICAgIH0KLQotICAgIHZvaWQgcmVwb3J0RHVwbGljYXRlKHRva2VuaWRfdCB0KSB7Ci0gICAgICAgIGVycm9yKCJEdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiAlcyIsIG5hbWVvZih0KSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRMb2NhbFN5bWJvbChUeXBlKiBwRGVjbCkgewotICAgICAgICB0b2tlbmlkX3QgdCA9IHBEZWNsLT5pZDsKLSAgICAgICAgaWYgKG1Mb2NhbHMuaXNEZWZpbmVkQXRDdXJyZW50TGV2ZWwodCkpIHsKLSAgICAgICAgICAgIHJlcG9ydER1cGxpY2F0ZSh0KTsKLSAgICAgICAgfQotICAgICAgICBtTG9jYWxzLmFkZChwRGVjbCk7Ci0gICAgfQotCi0gICAgYm9vbCBjaGVja1VuZGVjbGFyZWRTdHJ1Y3QoVHlwZSogcEJhc2VUeXBlKSB7Ci0gICAgICAgIGlmIChwQmFzZVR5cGUtPnRhZyA9PSBUWV9TVFJVQ1QgJiYgcEJhc2VUeXBlLT5sZW5ndGggPCAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcDsKLSAgICAgICAgICAgIGRlY29kZVRva2VuKHRlbXAsIHBCYXNlVHlwZS0+c3RydWN0VGFnLCBmYWxzZSk7Ci0gICAgICAgICAgICBlcnJvcigiVW5kZWNsYXJlZCBzdHJ1Y3QgJXMiLCB0ZW1wLmdldFVud3JhcHBlZCgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGxvY2FsRGVjbGFyYXRpb25zKFR5cGUqIHBCYXNlVHlwZSkgewotICAgICAgICBpbnRwdHJfdCBhOwotCi0gICAgICAgIHdoaWxlIChwQmFzZVR5cGUpIHsKLSAgICAgICAgICAgIHdoaWxlICh0b2sgIT0gJzsnICYmIHRvayAhPSBFT0YpIHsKLSAgICAgICAgICAgICAgICBUeXBlKiBwRGVjbCA9IGV4cGVjdERlY2xhcmF0aW9uKHBCYXNlVHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwRGVjbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFwRGVjbC0+aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjaGVja1VuZGVjbGFyZWRTdHJ1Y3QocERlY2wpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRMb2NhbFN5bWJvbChwRGVjbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBEZWNsLT50YWcgPT0gVFlfRlVOQykgewotICAgICAgICAgICAgICAgICAgICBpZiAodG9rID09ICd7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIk5lc3RlZCBmdW5jdGlvbnMgYXJlIG5vdCBhbGxvd2VkLiBEaWQgeW91IGZvcmdldCBhICd9JyA/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBFbHNlIGl0J3MgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24uCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwRGVjbC0+c3RvcmFnZUNsYXNzICE9IFNDX1RZUEVERUYpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhcmlhYmxlQWRkcmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBwR2VuLT5hbGlnbm1lbnRPZihwRGVjbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChhbGlnbm1lbnQgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWdubWVudE1hc2sgPSB+IChhbGlnbm1lbnQgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVPZiA9IHBHZW4tPnNpemVPZihwRGVjbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChzaXplT2YgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgbG9jID0gKGxvYyArIGFsaWdubWVudCAtIDEpICYgYWxpZ25tZW50TWFzazsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWduZWRTaXplID0gKHNpemVPZiArIGFsaWdubWVudCAtIDEpICYgYWxpZ25tZW50TWFzazsKLSAgICAgICAgICAgICAgICAgICAgbG9jID0gbG9jICsgYWxpZ25lZFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlQWRkcmVzcyA9IC1sb2M7Ci0gICAgICAgICAgICAgICAgICAgIFZJKHBEZWNsLT5pZCktPnBBZGRyZXNzID0gKHZvaWQqKSB2YXJpYWJsZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2NlcHQoJz0nKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogYXNzaWdubWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEdlbi0+bGVhUjAodmFyaWFibGVBZGRyZXNzLCBjcmVhdGVQdHJUeXBlKHBEZWNsKSwgRVRfTFZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBHZW4tPnB1c2hSMCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEdlbi0+Zm9yY2VSMFJWYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBHZW4tPnN0b3JlUjBUb1RPUygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0b2sgPT0gJywnKQotICAgICAgICAgICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBza2lwKCc7Jyk7Ci0gICAgICAgICAgICBwQmFzZVR5cGUgPSBhY2NlcHRQcmltaXRpdmVUeXBlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBjaGVja1N5bWJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrU3ltYm9sKHRvayk7Ci0gICAgfQotCi0gICAgdm9pZCBkZWNvZGVUb2tlbihTdHJpbmcmIGJ1ZmZlciwgdG9rZW5pZF90IHRva2VuLCBib29sIHF1b3RlKSB7Ci0gICAgICAgIGlmICh0b2tlbiA9PSBFT0YgKSB7Ci0gICAgICAgICAgICBidWZmZXIucHJpbnRmKCJFT0YiKTsKLSAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PSBUT0tfTlVNKSB7Ci0gICAgICAgICAgICBidWZmZXIucHJpbnRmKCJudW1lcmljIGNvbnN0YW50ICVkKDB4JXgpIiwgdG9rYywgdG9rYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gVE9LX05VTV9GTE9BVCkgewotICAgICAgICAgICAgYnVmZmVyLnByaW50ZigibnVtZXJpYyBjb25zdGFudCBmbG9hdCAlZyIsIHRva2QpOwotICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09IFRPS19OVU1fRE9VQkxFKSB7Ci0gICAgICAgICAgICBidWZmZXIucHJpbnRmKCJudW1lcmljIGNvbnN0YW50IGRvdWJsZSAlZyIsIHRva2QpOwotICAgICAgICB9ICBlbHNlIGlmICh0b2tlbiA+PSAwICYmIHRva2VuIDwgMjU2KSB7Ci0gICAgICAgICAgICBpZiAodG9rZW4gPCAzMikgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5wcmludGYoIidcXHglMDJ4JyIsIHRva2VuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLnByaW50ZigiJyVjJyIsIHRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChxdW90ZSkgewotICAgICAgICAgICAgICAgIGlmICh0b2tlbiA+PSBUT0tfS0VZV09SRCAmJiB0b2tlbiA8IFRPS19TWU1CT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnByaW50Zigia2V5d29yZCBcIiVzXCIiLCBuYW1lb2YodG9rZW4pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIucHJpbnRmKCJzeW1ib2wgXCIlc1wiIiwgbmFtZW9mKHRva2VuKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIucHJpbnRmKCIlcyIsIG5hbWVvZih0b2tlbikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFRva2VuKHRva2VuaWRfdCB0b2tlbikgewotICAgICAgICBTdHJpbmcgYnVmZmVyOwotICAgICAgICBkZWNvZGVUb2tlbihidWZmZXIsIHRva2VuLCB0cnVlKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVmZmVyLmdldFVud3JhcHBlZCgpKTsKLSAgICB9Ci0KLSAgICBib29sIGNoZWNrU3ltYm9sKHRva2VuaWRfdCB0b2tlbikgewotICAgICAgICBib29sIHJlc3VsdCA9IHRva2VuID49IFRPS19TWU1CT0w7Ci0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcDsKLSAgICAgICAgICAgIGRlY29kZVRva2VuKHRlbXAsIHRva2VuLCB0cnVlKTsKLSAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBzeW1ib2wuIEdvdCAlcyIsIHRlbXAuZ2V0VW53cmFwcGVkKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdG9rZW5pZF90IGFjY2VwdFN5bWJvbCgpIHsKLSAgICAgICAgdG9rZW5pZF90IHJlc3VsdCA9IDA7Ci0gICAgICAgIGlmICh0b2sgPj0gVE9LX1NZTUJPTCkgewotICAgICAgICAgICAgcmVzdWx0ID0gdG9rOwotICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBnbG9iYWxEZWNsYXJhdGlvbnMoKSB7Ci0gICAgICAgIG1wQ3VycmVudFN5bWJvbFN0YWNrID0gJm1HbG9iYWxzOwotICAgICAgICB3aGlsZSAodG9rICE9IEVPRikgewotICAgICAgICAgICAgVHlwZSogcEJhc2VUeXBlID0gZXhwZWN0UHJpbWl0aXZlVHlwZSh0cnVlKTsKLSAgICAgICAgICAgIGlmICghcEJhc2VUeXBlKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUeXBlKiBwRGVjbCA9IGV4cGVjdERlY2xhcmF0aW9uKHBCYXNlVHlwZSk7Ci0gICAgICAgICAgICBpZiAoIXBEZWNsKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBEZWNsLT5pZCkgewotICAgICAgICAgICAgICAgIHNraXAoJzsnKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoZWNrVW5kZWNsYXJlZFN0cnVjdChwRGVjbCkpIHsKLSAgICAgICAgICAgICAgICBza2lwKCc7Jyk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoISBpc0RlZmluZWQocERlY2wtPmlkKSkgewotICAgICAgICAgICAgICAgIGFkZEdsb2JhbFN5bWJvbChwRGVjbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBWYXJpYWJsZUluZm8qIG5hbWUgPSBWSShwRGVjbC0+aWQpOwotICAgICAgICAgICAgaWYgKG5hbWUgJiYgbmFtZS0+cEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBlcnJvcigiQWxyZWFkeSBkZWZpbmVkIGdsb2JhbCAlcyIsIG5hbWVvZihwRGVjbC0+aWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRGVjbC0+dGFnIDwgVFlfRlVOQykgewotICAgICAgICAgICAgICAgIC8vIGl0J3MgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgICAgICAgICBpZiAocERlY2wtPnN0b3JhZ2VDbGFzcyA9PSBTQ19UWVBFREVGKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWxsb2NhdGUgc3RvcmFnZS4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmICFuYW1lLT5wQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPnBBZGRyZXNzID0gKGludCopIGFsbG9jR2xvYmFsU3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdlbi0+YWxpZ25tZW50T2YobmFtZS0+cFR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHZW4tPnNpemVPZihuYW1lLT5wVHlwZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdCgnPScpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvayA9PSBUT0tfTlVNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChpbnQqKSBuYW1lLT5wQWRkcmVzcyA9IHRva2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCBhbiBpbnRlZ2VyIGNvbnN0YW50Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYWNjZXB0KCcsJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNsID0gZXhwZWN0RGVjbGFyYXRpb24ocEJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwRGVjbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEgaXNEZWZpbmVkKHBEZWNsLT5pZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEdsb2JhbFN5bWJvbChwRGVjbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFZJKHBEZWNsLT5pZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNraXAoJzsnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICBpZiAoYWNjZXB0KCc7JykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbi4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvayAhPSAneycpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IoImV4cGVjdGVkICd7JyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ3VycmVudEFyZW5hID0gJm1Mb2NhbEFyZW5hOwotICAgICAgICAgICAgICAgICAgICBtcEN1cnJlbnRTeW1ib2xTdGFjayA9ICZtTG9jYWxzOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogcGF0Y2ggZm9yd2FyZCByZWZlcmVuY2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwR2VuLT5yZXNvbHZlRm9yd2FyZCgoaW50KSBuYW1lLT5wRm9yd2FyZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgZnVuY3Rpb24gYWRkcmVzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+cEFkZHJlc3MgPSAodm9pZCopIHBDb2RlQnVmLT5nZXRQQygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzdGFjayBvZmZzZXRzIGZvciBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIG1Mb2NhbHMucHVzaExldmVsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludHB0cl90IGEgPSA4OwotICAgICAgICAgICAgICAgICAgICBpbnQgYXJnQ291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFR5cGUqIHBQID0gcERlY2wtPnBUYWlsOyBwUDsgcFAgPSBwUC0+cFRhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUqIHBBcmcgPSBwUC0+cEhlYWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFyZy0+aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMb2NhbFN5bWJvbChwQXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQgcGFyYW0gbmFtZSBhbmQgY29tcHV0ZSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUqIHBQYXNzaW5nVHlwZSA9IHBhc3NpbmdUeXBlKHBBcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IHBHZW4tPmFsaWdubWVudE9mKHBQYXNzaW5nVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhID0gKGEgKyBhbGlnbm1lbnQgLSAxKSAmIH4gKGFsaWdubWVudC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQXJnLT5pZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJKHBBcmctPmlkKS0+cEFkZHJlc3MgPSAodm9pZCopIGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhID0gYSArIHBHZW4tPnNpemVPZihwUGFzc2luZ1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByc3ltID0gbG9jID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcFJldHVyblR5cGUgPSBwRGVjbC0+cEhlYWQ7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSBwR2VuLT5mdW5jdGlvbkVudHJ5KHBEZWNsKTsKLSAgICAgICAgICAgICAgICAgICAgYmxvY2soMCwgMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW4tPmdzeW0ocnN5bSk7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW4tPmZ1bmN0aW9uRXhpdChwRGVjbCwgYSwgbG9jKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2Fscy5wb3BMZXZlbCgpOwotICAgICAgICAgICAgICAgICAgICBtcEN1cnJlbnRBcmVuYSA9ICZtR2xvYmFsQXJlbmE7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ3VycmVudFN5bWJvbFN0YWNrID0gJm1HbG9iYWxzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIFR5cGUqIHBhc3NpbmdUeXBlKFR5cGUqIHBUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAocFR5cGUtPnRhZykgewotICAgICAgICBjYXNlIFRZX0NIQVI6Ci0gICAgICAgIGNhc2UgVFlfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWtwSW50OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHBUeXBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2hhciogYWxsb2NHbG9iYWxTcGFjZShzaXplX3QgYWxpZ25tZW50LCBzaXplX3QgYnl0ZXMpIHsKLSAgICAgICAgc2l6ZV90IGJhc2UgPSAoKChzaXplX3QpIGdsbykgKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50LTEpOwotICAgICAgICBzaXplX3QgZW5kID0gYmFzZSArIGJ5dGVzOwotICAgICAgICBpZiAoKGVuZCAtIChzaXplX3QpIHBHbG9iYWxCYXNlKSA+IChzaXplX3QpIEFMTE9DX1NJWkUpIHsKLSAgICAgICAgICAgIGVycm9yKCJHbG9iYWwgc3BhY2UgZXhoYXVzdGVkIik7Ci0gICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciogcmVzdWx0ID0gKGNoYXIqKSBiYXNlOwotICAgICAgICBnbG8gPSAoY2hhciopIGVuZDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGlmIChwR2xvYmFsQmFzZSAhPSAwKSB7Ci0gICAgICAgICAgICBmcmVlKHBHbG9iYWxCYXNlKTsKLSAgICAgICAgICAgIHBHbG9iYWxCYXNlID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocEdlbikgewotICAgICAgICAgICAgZGVsZXRlIHBHZW47Ci0gICAgICAgICAgICBwR2VuID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocENvZGVCdWYpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ29kZUJ1ZjsKLSAgICAgICAgICAgIHBDb2RlQnVmID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZSkgewotICAgICAgICAgICAgZGVsZXRlIGZpbGU7Ci0gICAgICAgICAgICBmaWxlID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE9uZS10aW1lIGluaXRpYWxpemF0aW9uLCB3aGVuIGNsYXNzIGlzIGNvbnN0cnVjdGVkLgotICAgIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgbXBTeW1ib2xMb29rdXBGbiA9IDA7Ci0gICAgICAgIG1wU3ltYm9sTG9va3VwQ29udGV4dCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgdG9rID0gMDsKLSAgICAgICAgdG9rYyA9IDA7Ci0gICAgICAgIHRva2wgPSAwOwotICAgICAgICBjaCA9IDA7Ci0gICAgICAgIHJzeW0gPSAwOwotICAgICAgICBsb2MgPSAwOwotICAgICAgICBnbG8gPSAwOwotICAgICAgICBtYWNyb0xldmVsID0gLTE7Ci0gICAgICAgIGZpbGUgPSAwOwotICAgICAgICBwR2xvYmFsQmFzZSA9IDA7Ci0gICAgICAgIHBDb2RlQnVmID0gMDsKLSAgICAgICAgcEdlbiA9IDA7Ci0gICAgICAgIG1QcmFnbWFTdHJpbmdDb3VudCA9IDA7Ci0gICAgICAgIG1Db21waWxlUmVzdWx0ID0gMDsKLSAgICAgICAgbUxpbmVOdW1iZXIgPSAxOwotICAgICAgICBtYkJ1bXBMaW5lID0gZmFsc2U7Ci0gICAgICAgIG1iU3VwcHJlc3NNYWNyb0V4cGFuc2lvbiA9IGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgc2V0QXJjaGl0ZWN0dXJlKGNvbnN0IGNoYXIqIGFyY2hpdGVjdHVyZSkgewotICAgICAgICBkZWxldGUgcEdlbjsKLSAgICAgICAgcEdlbiA9IDA7Ci0KLSAgICAgICAgZGVsZXRlIHBDb2RlQnVmOwotICAgICAgICBwQ29kZUJ1ZiA9IG5ldyBDb2RlQnVmKCk7Ci0KLSAgICAgICAgaWYgKGFyY2hpdGVjdHVyZSAhPSBOVUxMKSB7Ci0jaWZkZWYgUFJPVklERV9BUk1fQ09ERUdFTgotICAgICAgICAgICAgaWYgKCEgcEdlbiAmJiBzdHJjbXAoYXJjaGl0ZWN0dXJlLCAiYXJtIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHBHZW4gPSBuZXcgQVJNQ29kZUdlbmVyYXRvcigpOwotICAgICAgICAgICAgICAgIHBDb2RlQnVmID0gbmV3IEFSTUNvZGVCdWYocENvZGVCdWYpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0jaWZkZWYgUFJPVklERV9YODZfQ09ERUdFTgotICAgICAgICAgICAgaWYgKCEgcEdlbiAmJiBzdHJjbXAoYXJjaGl0ZWN0dXJlLCAieDg2IikgPT0gMCkgewotICAgICAgICAgICAgICAgIHBHZW4gPSBuZXcgWDg2Q29kZUdlbmVyYXRvcigpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBpZiAoIXBHZW4gKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IoIlVua25vd24gYXJjaGl0ZWN0dXJlICVzXG4iLCBhcmNoaXRlY3R1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBHZW4gPT0gTlVMTCkgewotI2lmIGRlZmluZWQoREVGQVVMVF9BUk1fQ09ERUdFTikKLSAgICAgICAgICAgIHBHZW4gPSBuZXcgQVJNQ29kZUdlbmVyYXRvcigpOwotICAgICAgICAgICAgcENvZGVCdWYgPSBuZXcgQVJNQ29kZUJ1ZihwQ29kZUJ1Zik7Ci0jZWxpZiBkZWZpbmVkKERFRkFVTFRfWDg2X0NPREVHRU4pCi0gICAgICAgICAgICBwR2VuID0gbmV3IFg4NkNvZGVHZW5lcmF0b3IoKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGlmIChwR2VuID09IE5VTEwpIHsKLSAgICAgICAgICAgIGVycm9yKCJObyBjb2RlIGdlbmVyYXRvciBkZWZpbmVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEdlbi0+c2V0RXJyb3JTaW5rKHRoaXMpOwotICAgICAgICAgICAgcEdlbi0+c2V0VHlwZXMobWtwSW50KTsKLSAgICAgICAgfQotICAgIH0KLQotcHVibGljOgotICAgIHN0cnVjdCBhcmdzIHsKLSAgICAgICAgYXJncygpIHsKLSAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgY2hhciogYXJjaGl0ZWN0dXJlOwotICAgIH07Ci0KLSAgICBDb21waWxlcigpIHsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBjbGVhcigpOwotICAgIH0KLQotICAgIH5Db21waWxlcigpIHsKLSAgICAgICAgY2xlYW51cCgpOwotICAgIH0KLQotICAgIHZvaWQgcmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhBQ0NTeW1ib2xMb29rdXBGbiBwRm4sIEFDQ3ZvaWQqIHBDb250ZXh0KSB7Ci0gICAgICAgIG1wU3ltYm9sTG9va3VwRm4gPSBwRm47Ci0gICAgICAgIG1wU3ltYm9sTG9va3VwQ29udGV4dCA9IHBDb250ZXh0OwotICAgIH0KLQotICAgIGludCBjb21waWxlKGNvbnN0IGNoYXIqIHRleHQsIHNpemVfdCB0ZXh0TGVuZ3RoKSB7Ci0gICAgICAgIGludCByZXN1bHQ7Ci0KLSAgICAgICAgbXBDdXJyZW50QXJlbmEgPSAmbUdsb2JhbEFyZW5hOwotICAgICAgICBjcmVhdGVQcmltaXRpdmVUeXBlcygpOwotICAgICAgICBjbGVhbnVwKCk7Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgICAgIG1Ub2tlblRhYmxlLnNldEFyZW5hKCZtR2xvYmFsQXJlbmEpOwotICAgICAgICBtR2xvYmFscy5zZXRBcmVuYSgmbUdsb2JhbEFyZW5hKTsKLSAgICAgICAgbUdsb2JhbHMuc2V0VG9rZW5UYWJsZSgmbVRva2VuVGFibGUpOwotICAgICAgICBtTG9jYWxzLnNldEFyZW5hKCZtTG9jYWxBcmVuYSk7Ci0gICAgICAgIG1Mb2NhbHMuc2V0VG9rZW5UYWJsZSgmbVRva2VuVGFibGUpOwotCi0gICAgICAgIGludGVybktleXdvcmRzKCk7Ci0gICAgICAgIHNldEFyY2hpdGVjdHVyZShOVUxMKTsKLSAgICAgICAgaWYgKCFwR2VuKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSNpZmRlZiBQUk9WSURFX1RSQUNFX0NPREVHRU4KLSAgICAgICAgICAgIHBHZW4gPSBuZXcgVHJhY2VDb2RlR2VuZXJhdG9yKHBHZW4pOwotI2VuZGlmCi0gICAgICAgIHBHZW4tPnNldEVycm9yU2luayh0aGlzKTsKLQotICAgICAgICBpZiAocENvZGVCdWYpIHsKLSAgICAgICAgICAgIHBDb2RlQnVmLT5pbml0KEFMTE9DX1NJWkUpOwotICAgICAgICB9Ci0gICAgICAgIHBHZW4tPmluaXQocENvZGVCdWYpOwotICAgICAgICBmaWxlID0gbmV3IFRleHRJbnB1dFN0cmVhbSh0ZXh0LCB0ZXh0TGVuZ3RoKTsKLSAgICAgICAgcEdsb2JhbEJhc2UgPSAoY2hhciopIGNhbGxvYygxLCBBTExPQ19TSVpFKTsKLSAgICAgICAgZ2xvID0gcEdsb2JhbEJhc2U7Ci0gICAgICAgIGlucCgpOwotICAgICAgICBuZXh0KCk7Ci0gICAgICAgIGdsb2JhbERlY2xhcmF0aW9ucygpOwotICAgICAgICBjaGVja0ZvclVuZGVmaW5lZEZvcndhcmRSZWZlcmVuY2VzKCk7Ci0gICAgICAgIHJlc3VsdCA9IHBHZW4tPmZpbmlzaENvbXBpbGUoKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobUVycm9yQnVmLmxlbigpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gLTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbXBpbGVSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVQcmltaXRpdmVUeXBlcygpIHsKLSAgICAgICAgbWtwSW50ID0gY3JlYXRlVHlwZShUWV9JTlQsIE5VTEwsIE5VTEwpOwotICAgICAgICBta3BTaG9ydCA9IGNyZWF0ZVR5cGUoVFlfU0hPUlQsIE5VTEwsIE5VTEwpOwotICAgICAgICBta3BDaGFyID0gY3JlYXRlVHlwZShUWV9DSEFSLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgbWtwVm9pZCA9IGNyZWF0ZVR5cGUoVFlfVk9JRCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIG1rcEZsb2F0ID0gY3JlYXRlVHlwZShUWV9GTE9BVCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIG1rcERvdWJsZSA9IGNyZWF0ZVR5cGUoVFlfRE9VQkxFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgbWtwSW50Rm4gPSAgY3JlYXRlVHlwZShUWV9GVU5DLCBta3BJbnQsIE5VTEwpOwotICAgICAgICBta3BJbnRQdHIgPSBjcmVhdGVQdHJUeXBlKG1rcEludCk7Ci0gICAgICAgIG1rcENoYXJQdHIgPSBjcmVhdGVQdHJUeXBlKG1rcENoYXIpOwotICAgICAgICBta3BGbG9hdFB0ciA9IGNyZWF0ZVB0clR5cGUobWtwRmxvYXQpOwotICAgICAgICBta3BEb3VibGVQdHIgPSBjcmVhdGVQdHJUeXBlKG1rcERvdWJsZSk7Ci0gICAgICAgIG1rcFB0ckludEZuID0gY3JlYXRlUHRyVHlwZShta3BJbnRGbik7Ci0gICAgfQotCi0gICAgdm9pZCBjaGVja0ZvclVuZGVmaW5lZEZvcndhcmRSZWZlcmVuY2VzKCkgewotICAgICAgICBtR2xvYmFscy5mb3JFYWNoKHN0YXRpY191ZnJjRm4sIHRoaXMpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIHN0YXRpY191ZnJjRm4oVmFyaWFibGVJbmZvKiB2YWx1ZSwgdm9pZCogY29udGV4dCkgewotICAgICAgICBDb21waWxlciogcENvbXBpbGVyID0gKENvbXBpbGVyKikgY29udGV4dDsKLSAgICAgICAgcmV0dXJuIHBDb21waWxlci0+dW5kZWZpbmVkRm9yd2FyZFJlZmVyZW5jZUNoZWNrKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBib29sIHVuZGVmaW5lZEZvcndhcmRSZWZlcmVuY2VDaGVjayhWYXJpYWJsZUluZm8qIHZhbHVlKSB7Ci0gICAgICAgIGlmICghdmFsdWUtPnBBZGRyZXNzICYmIHZhbHVlLT5wRm9yd2FyZCkgewotICAgICAgICAgICAgZXJyb3IoIlVuZGVmaW5lZCBmb3J3YXJkIHJlZmVyZW5jZTogJXMiLAotICAgICAgICAgICAgICAgICAgbVRva2VuVGFibGVbdmFsdWUtPnRva10ucFRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGZpbmQgYSBzeW1ib2wuCi0gICAgICogSWYgZm91bmQsIHJldHVybiBpdHMgdmFsdWUuCi0gICAgICovCi0gICAgdm9pZCogbG9va3VwKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICAgICAgaWYgKG1Db21waWxlUmVzdWx0ID09IDApIHsKLSAgICAgICAgICAgIHRva2VuaWRfdCB0b2sgPSBtVG9rZW5UYWJsZS5pbnRlcm4obmFtZSwgc3RybGVuKG5hbWUpKTsKLSAgICAgICAgICAgIFZhcmlhYmxlSW5mbyogcFZhcmlhYmxlSW5mbyA9IFZJKHRvayk7Ci0gICAgICAgICAgICBpZiAocFZhcmlhYmxlSW5mbykgewotICAgICAgICAgICAgICAgIHJldHVybiBwVmFyaWFibGVJbmZvLT5wQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2b2lkIGdldFByYWdtYXMoQUNDc2l6ZWkqIGFjdHVhbFN0cmluZ0NvdW50LAotICAgICAgICAgICAgICAgICAgICBBQ0NzaXplaSBtYXhTdHJpbmdDb3VudCwgQUNDY2hhcioqIHN0cmluZ3MpIHsKLSAgICAgICAgaW50IHN0cmluZ0NvdW50ID0gbVByYWdtYVN0cmluZ0NvdW50OwotICAgICAgICBpZiAoYWN0dWFsU3RyaW5nQ291bnQpIHsKLSAgICAgICAgICAgICphY3R1YWxTdHJpbmdDb3VudCA9IHN0cmluZ0NvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJpbmdDb3VudCA+IG1heFN0cmluZ0NvdW50KSB7Ci0gICAgICAgICAgICBzdHJpbmdDb3VudCA9IG1heFN0cmluZ0NvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJpbmdzKSB7Ci0gICAgICAgICAgICBjaGFyKiBwUHJhZ21hcyA9IG1QcmFnbWFzLmdldFVud3JhcHBlZCgpOwotICAgICAgICAgICAgd2hpbGUgKHN0cmluZ0NvdW50LS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgKnN0cmluZ3MrKyA9IHBQcmFnbWFzOwotICAgICAgICAgICAgICAgIHBQcmFnbWFzICs9IHN0cmxlbihwUHJhZ21hcykgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBnZXRQcm9ncmFtQmluYXJ5KEFDQ3ZvaWQqKiBiYXNlLCBBQ0NzaXplaSogbGVuZ3RoKSB7Ci0gICAgICAgICpiYXNlID0gcENvZGVCdWYtPmdldEJhc2UoKTsKLSAgICAgICAgKmxlbmd0aCA9IChBQ0NzaXplaSkgcENvZGVCdWYtPmdldFNpemUoKTsKLSAgICB9Ci0KLSAgICBjaGFyKiBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtRXJyb3JCdWYuZ2V0VW53cmFwcGVkKCk7Ci0gICAgfQotfTsKLQotY29uc3QgY2hhciogQ29tcGlsZXI6Om9wZXJhdG9yQ2hhcnMgPQotICAgICIrKy0tKkAvQCVAK0AtQDw8Pj48PT49PEA+QD09IT0mJnx8JkBeQHxAfkAhQCI7Ci0KLWNvbnN0IGNoYXIgQ29tcGlsZXI6Om9wZXJhdG9yTGV2ZWxbXSA9Ci0gICAgezExLCAxMSwgMSwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNCwgNCwKLSAgICAgICAgICAgIDUsIDUsIC8qID09LCAhPSAqLwotICAgICAgICAgICAgOSwgMTAsIC8qICYmLCB8fCAqLwotICAgICAgICAgICAgNiwgNywgOCwgLyogJiBeIHwgKi8KLSAgICAgICAgICAgIDIsIDIgLyogfiAhICovCi0gICAgICAgICAgICB9OwotCi0jaWZkZWYgUFJPVklERV9YODZfQ09ERUdFTgotY29uc3QgaW50IENvbXBpbGVyOjpYODZDb2RlR2VuZXJhdG9yOjpvcGVyYXRvckhlbHBlcltdID0gewotICAgICAgICAweDEsICAgICAvLyArKwotICAgICAgICAweGZmLCAgICAvLyAtLQotICAgICAgICAweGMxYWYwZiwgLy8gKgotICAgICAgICAweGY5Zjc5OTkxLCAvLyAvCi0gICAgICAgIDB4ZjlmNzk5OTEsIC8vICUgKFdpdGggbWFudWFsIGFzc2lzdCB0byBzd2FwIHJlc3VsdHMpCi0gICAgICAgIDB4YzgwMSwgLy8gKwotICAgICAgICAweGQ4ZjdjODI5LCAvLyAtCi0gICAgICAgIDB4ZTBkMzkxLCAvLyA8PAotICAgICAgICAweGY4ZDM5MSwgLy8gPj4KLSAgICAgICAgMHhlLCAvLyA8PQotICAgICAgICAweGQsIC8vID49Ci0gICAgICAgIDB4YywgLy8gPAotICAgICAgICAweGYsIC8vID4KLSAgICAgICAgMHg0LCAvLyA9PQotICAgICAgICAweDUsIC8vICE9Ci0gICAgICAgIDB4MCwgLy8gJiYKLSAgICAgICAgMHgxLCAvLyB8fAotICAgICAgICAweGM4MjEsIC8vICYKLSAgICAgICAgMHhjODMxLCAvLyBeCi0gICAgICAgIDB4YzgwOSwgLy8gfAotICAgICAgICAweGQwZjcsIC8vIH4KLSAgICAgICAgMHg0ICAgICAvLyAhCi19OwotI2VuZGlmCi0KLXN0cnVjdCBBQ0NzY3JpcHQgewotICAgIEFDQ3NjcmlwdCgpIHsKLSAgICAgICAgdGV4dCA9IDA7Ci0gICAgICAgIHRleHRMZW5ndGggPSAwOwotICAgICAgICBhY2NFcnJvciA9IEFDQ19OT19FUlJPUjsKLSAgICB9Ci0KLSAgICB+QUNDc2NyaXB0KCkgewotICAgICAgICBkZWxldGUgdGV4dDsKLSAgICB9Ci0KLSAgICB2b2lkIHJlZ2lzdGVyU3ltYm9sQ2FsbGJhY2soQUNDU3ltYm9sTG9va3VwRm4gcEZuLCBBQ0N2b2lkKiBwQ29udGV4dCkgewotICAgICAgICBjb21waWxlci5yZWdpc3RlclN5bWJvbENhbGxiYWNrKHBGbiwgcENvbnRleHQpOwotICAgIH0KLQotICAgIHZvaWQgc2V0RXJyb3IoQUNDZW51bSBlcnJvcikgewotICAgICAgICBpZiAoYWNjRXJyb3IgPT0gQUNDX05PX0VSUk9SICYmIGVycm9yICE9IEFDQ19OT19FUlJPUikgewotICAgICAgICAgICAgYWNjRXJyb3IgPSBlcnJvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFDQ2VudW0gZ2V0RXJyb3IoKSB7Ci0gICAgICAgIEFDQ2VudW0gcmVzdWx0ID0gYWNjRXJyb3I7Ci0gICAgICAgIGFjY0Vycm9yID0gQUNDX05PX0VSUk9SOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIENvbXBpbGVyIGNvbXBpbGVyOwotICAgIGNoYXIqIHRleHQ7Ci0gICAgaW50IHRleHRMZW5ndGg7Ci0gICAgQUNDZW51bSBhY2NFcnJvcjsKLX07Ci0KLQotZXh0ZXJuICJDIgotQUNDc2NyaXB0KiBhY2NDcmVhdGVTY3JpcHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBBQ0NzY3JpcHQoKTsKLX0KLQotZXh0ZXJuICJDIgotQUNDZW51bSBhY2NHZXRFcnJvciggQUNDc2NyaXB0KiBzY3JpcHQgKSB7Ci0gICAgcmV0dXJuIHNjcmlwdC0+Z2V0RXJyb3IoKTsKLX0KLQotZXh0ZXJuICJDIgotdm9pZCBhY2NEZWxldGVTY3JpcHQoQUNDc2NyaXB0KiBzY3JpcHQpIHsKLSAgICBkZWxldGUgc2NyaXB0OwotfQotCi1leHRlcm4gIkMiCi12b2lkIGFjY1JlZ2lzdGVyU3ltYm9sQ2FsbGJhY2soQUNDc2NyaXB0KiBzY3JpcHQsIEFDQ1N5bWJvbExvb2t1cEZuIHBGbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0N2b2lkKiBwQ29udGV4dCkgewotICAgIHNjcmlwdC0+cmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhwRm4sIHBDb250ZXh0KTsKLX0KLQotZXh0ZXJuICJDIgotdm9pZCBhY2NTY3JpcHRTb3VyY2UoQUNDc2NyaXB0KiBzY3JpcHQsCi0gICAgQUNDc2l6ZWkgY291bnQsCi0gICAgY29uc3QgQUNDY2hhciAqKiBzdHJpbmcsCi0gICAgY29uc3QgQUNDaW50ICogbGVuZ3RoKSB7Ci0gICAgaW50IHRvdGFsTGVuZ3RoID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBpbnQgbGVuID0gLTE7Ci0gICAgICAgIGNvbnN0IEFDQ2NoYXIqIHMgPSBzdHJpbmdbaV07Ci0gICAgICAgIGlmIChsZW5ndGgpIHsKLSAgICAgICAgICAgIGxlbiA9IGxlbmd0aFtpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuIDwgMCkgewotICAgICAgICAgICAgbGVuID0gc3RybGVuKHMpOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsTGVuZ3RoICs9IGxlbjsKLSAgICB9Ci0gICAgZGVsZXRlIHNjcmlwdC0+dGV4dDsKLSAgICBjaGFyKiB0ZXh0ID0gbmV3IGNoYXJbdG90YWxMZW5ndGggKyAxXTsKLSAgICBzY3JpcHQtPnRleHQgPSB0ZXh0OwotICAgIHNjcmlwdC0+dGV4dExlbmd0aCA9IHRvdGFsTGVuZ3RoOwotICAgIGNoYXIqIGRlc3QgPSB0ZXh0OwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBsZW4gPSAtMTsKLSAgICAgICAgY29uc3QgQUNDY2hhciogcyA9IHN0cmluZ1tpXTsKLSAgICAgICAgaWYgKGxlbmd0aCkgewotICAgICAgICAgICAgbGVuID0gbGVuZ3RoW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgICBsZW4gPSBzdHJsZW4ocyk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGRlc3QsIHMsIGxlbik7Ci0gICAgICAgIGRlc3QgKz0gbGVuOwotICAgIH0KLSAgICB0ZXh0W3RvdGFsTGVuZ3RoXSA9ICdcMCc7Ci0KLSNpZmRlZiBERUJVR19TQVZFX0lOUFVUX1RPX0ZJTEUKLSAgICBMT0dEKCJTYXZpbmcgaW5wdXQgdG8gZmlsZS4uLiIpOwotICAgIGludCBjb3VudGVyOwotICAgIGNoYXIgcGF0aFtQQVRIX01BWF07Ci0gICAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDQwOTY7IGNvdW50ZXIrKykgewotICAgICAgICBzcHJpbnRmKHBhdGgsIERFQlVHX0RVTVBfUEFUVEVSTiwgY291bnRlcik7Ci0gICAgICAgIGlmKGFjY2VzcyhwYXRoLCBGX09LKSAhPSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoY291bnRlciA8IDQwOTYpIHsKLSAgICAgICAgTE9HRCgiU2F2aW5nIGlucHV0IHRvIGZpbGUgJXMiLCBwYXRoKTsKLSAgICAgICAgRklMRSogZmQgPSBmb3BlbihwYXRoLCAidyIpOwotICAgICAgICBpZiAoZmQpIHsKLSAgICAgICAgICAgIGZ3cml0ZSh0ZXh0LCB0b3RhbExlbmd0aCwgMSwgZmQpOwotICAgICAgICAgICAgZmNsb3NlKGZkKTsKLSAgICAgICAgICAgIExPR0QoIlNhdmVkIGlucHV0IHRvIGZpbGUgJXMiLCBwYXRoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR0QoIkNvdWxkIG5vdCBzYXZlLiBlcnJubzogJWQiLCBlcnJubyk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLX0KLQotZXh0ZXJuICJDIgotdm9pZCBhY2NDb21waWxlU2NyaXB0KEFDQ3NjcmlwdCogc2NyaXB0KSB7Ci0gICAgaW50IHJlc3VsdCA9IHNjcmlwdC0+Y29tcGlsZXIuY29tcGlsZShzY3JpcHQtPnRleHQsIHNjcmlwdC0+dGV4dExlbmd0aCk7Ci0gICAgaWYgKHJlc3VsdCkgewotICAgICAgICBzY3JpcHQtPnNldEVycm9yKEFDQ19JTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotfQotCi1leHRlcm4gIkMiCi12b2lkIGFjY0dldFNjcmlwdGl2KEFDQ3NjcmlwdCogc2NyaXB0LAotICAgIEFDQ2VudW0gcG5hbWUsCi0gICAgQUNDaW50ICogcGFyYW1zKSB7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgICAgICBjYXNlIEFDQ19JTkZPX0xPR19MRU5HVEg6Ci0gICAgICAgICAgICAqcGFyYW1zID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotZXh0ZXJuICJDIgotdm9pZCBhY2NHZXRTY3JpcHRJbmZvTG9nKEFDQ3NjcmlwdCogc2NyaXB0LAotICAgIEFDQ3NpemVpIG1heExlbmd0aCwKLSAgICBBQ0NzaXplaSAqIGxlbmd0aCwKLSAgICBBQ0NjaGFyICogaW5mb0xvZykgewotICAgIGNoYXIqIG1lc3NhZ2UgPSBzY3JpcHQtPmNvbXBpbGVyLmdldEVycm9yTWVzc2FnZSgpOwotICAgIGludCBtZXNzYWdlTGVuZ3RoID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKLSAgICBpZiAobGVuZ3RoKSB7Ci0gICAgICAgICpsZW5ndGggPSBtZXNzYWdlTGVuZ3RoOwotICAgIH0KLSAgICBpZiAoaW5mb0xvZyAmJiBtYXhMZW5ndGggPiAwKSB7Ci0gICAgICAgIGludCB0cmltbWVkTGVuZ3RoID0gbWF4TGVuZ3RoIDwgbWVzc2FnZUxlbmd0aCA/Ci0gICAgICAgICAgICAgICAgbWF4TGVuZ3RoIDogbWVzc2FnZUxlbmd0aDsKLSAgICAgICAgbWVtY3B5KGluZm9Mb2csIG1lc3NhZ2UsIHRyaW1tZWRMZW5ndGgpOwotICAgICAgICBpbmZvTG9nW3RyaW1tZWRMZW5ndGhdID0gMDsKLSAgICB9Ci19Ci0KLWV4dGVybiAiQyIKLXZvaWQgYWNjR2V0U2NyaXB0TGFiZWwoQUNDc2NyaXB0KiBzY3JpcHQsIGNvbnN0IEFDQ2NoYXIgKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBBQ0N2b2lkICoqIGFkZHJlc3MpIHsKLSAgICB2b2lkKiB2YWx1ZSA9IHNjcmlwdC0+Y29tcGlsZXIubG9va3VwKG5hbWUpOwotICAgIGlmICh2YWx1ZSkgewotICAgICAgICAqYWRkcmVzcyA9IHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNjcmlwdC0+c2V0RXJyb3IoQUNDX0lOVkFMSURfVkFMVUUpOwotICAgIH0KLX0KLQotZXh0ZXJuICJDIgotdm9pZCBhY2NHZXRQcmFnbWFzKEFDQ3NjcmlwdCogc2NyaXB0LCBBQ0NzaXplaSogYWN0dWFsU3RyaW5nQ291bnQsCi0gICAgICAgICAgICAgICAgICAgQUNDc2l6ZWkgbWF4U3RyaW5nQ291bnQsIEFDQ2NoYXIqKiBzdHJpbmdzKXsKLSAgICBzY3JpcHQtPmNvbXBpbGVyLmdldFByYWdtYXMoYWN0dWFsU3RyaW5nQ291bnQsIG1heFN0cmluZ0NvdW50LCBzdHJpbmdzKTsKLX0KLQotZXh0ZXJuICJDIgotdm9pZCBhY2NHZXRQcm9ncmFtQmluYXJ5KEFDQ3NjcmlwdCogc2NyaXB0LAotICAgIEFDQ3ZvaWQqKiBiYXNlLCBBQ0NzaXplaSogbGVuZ3RoKSB7Ci0gICAgc2NyaXB0LT5jb21waWxlci5nZXRQcm9ncmFtQmluYXJ5KGJhc2UsIGxlbmd0aCk7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYWNjCi0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy8uZ2l0aWdub3JlIGIvbGliYWNjL3Rlc3RzLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmIyOTguLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXRlc3QtYWNjCi0qLm91dApkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL0FuZHJvaWQubWsgYi9saWJhY2MvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkZmE3NC4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEV4ZWN1dGFibGUgZm9yIGhvc3QKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFOj0gYWNjCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQltYWluLmNwcAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhY2MgXAotICAgIGxpYmN1dGlscwotCi1MT0NBTF9MRExJQlMgOj0gLWxkbAotCi0gICAgCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQotCi0jIEV4ZWN1dGFibGUgZm9yIHRhcmdldAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEU6PSBhY2MKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW4uY3BwIFwKLSAgICBkaXNhc3NlbS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYWNjIFwKLSAgICBsaWJkbAotCi1MT0NBTF9DRkxBR1MgOj0gLU8wIC1nIAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyBSdW50aW1lIHRlc3RzIGZvciBob3N0Ci0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRTo9IGFjY1J1bnRpbWVUZXN0Ci0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlydW50aW1lVGVzdC5jcHAKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYWNjIFwKLSAgICBsaWJjdXRpbHMKLQotTE9DQUxfTERMSUJTIDo9IC1sZGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQotIyBSdW50aW1lIHRlc3RzIGZvciB0YXJnZXQKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFOj0gYWNjUnVudGltZVRlc3QKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCXJ1bnRpbWVUZXN0LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhY2MgXAotICAgIGxpYmRsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtTzAgLWcgCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2FjY2FybSBiL2xpYmFjYy90ZXN0cy9hY2Nhcm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMWJmNjYuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2FjY2FybQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMhL3Vzci9iaW4vcHl0aG9uCi0jCi0jIFJ1biBhIHRlc3Qgb24gdGhlIEFSTSB2ZXJzaW9uIG9mIGFjYy4KLQotaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi0KLWRlZiBjb21waWxlKGFyZ3MpOgotICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFsiYWNjIl0gKyBhcmdzLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgIHJlc3VsdCA9IHByb2MuY29tbXVuaWNhdGUoKQotICAgIHJldHVybiByZXN1bHQKLQotZGVmIHJ1bkNtZChhcmdzKToKLSAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQotICAgIHJlc3VsdCA9IHByb2MuY29tbXVuaWNhdGUoKQotICAgIHJldHVybiByZXN1bHRbMF0uc3RyaXAoKQotCi1kZWYgdW5hbWUoKToKLSAgICByZXR1cm4gcnVuQ21kKFsidW5hbWUiXSkKLQotZGVmIHVuYW1lTSgpOgotICAgIHJldHVybiBydW5DbWQoWyJ1bmFtZSIsICItbSJdKQotCi1kZWYgd2hpY2goaXRlbSk6Ci0gICAgcmV0dXJuIHJ1bkNtZChbIndoaWNoIiwgaXRlbV0pCi0KLWRlZiBhZGIoYXJncyk6Ci0gICAgcmV0dXJuIHJ1bkNtZChbImFkYiJdICsgYXJncykKLQotZGVmIHNldHVwQXJtKGZpbGUpOgotICAgIHByaW50ICJTZXR0aW5nIHVwIGFybSIKLSAgICBhZGIoWyJyZW1vdW50Il0pCi0gICAgYWRiKFsic2hlbGwiLCAicm0iLCAiL3N5c3RlbS9iaW4vYWNjIl0pCi0gICAgYWRiKFsic2hlbGwiLCAibWtkaXIiLCAiL3N5c3RlbS9iaW4vYWNjZGF0YSJdKQotICAgIGFkYihbInNoZWxsIiwgIm1rZGlyIiwgIi9zeXN0ZW0vYmluL2FjY2RhdGEvZGF0YSJdKQotCi0gICAgcmVtb3RlRmlsZU5hbWUgPSBvcy5wYXRoLmpvaW4oIi9zeXN0ZW0vYmluL2FjY2RhdGEiLCBmaWxlKQotICAgIGFkYihbInB1c2giLCBmaWxlLCByZW1vdGVGaWxlTmFtZV0pCi0KLSAgICAjIENvcHkgb3ZlciBjb21waWxlcgotICAgIGFkYihbInN5bmMiXSkKLSAgICByZXR1cm4gcmVtb3RlRmlsZU5hbWUKLQotZGVmIGNvbXBpbGVBcm0oYXJncyk6Ci0gICAgcmVtb3RlQXJncyA9IFtdCi0gICAgZmlsZU5hbWUgPSAiIgotICAgIGZvciBhcmcgaW4gc3lzLmFyZ3ZbMTpdOgotICAgICAgICBpZiBhcmcuc3RhcnRzd2l0aCgnLScpOgotICAgICAgICAgICAgcmVtb3RlQXJncy5hcHBlbmQoYXJnKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZmlsZU5hbWUgPSBhcmcKLQotICAgIHJlbW90ZUZpbGVOYW1lID0gc2V0dXBBcm0oZmlsZU5hbWUpCi0gICAgcmVtb3RlQXJncy5hcHBlbmQocmVtb3RlRmlsZU5hbWUpCi0gICAgcmVtb3RlQ21kTGluZSA9IFsiYWRiIiwgInNoZWxsIiwgIi9zeXN0ZW0vYmluL2FjYyJdICsgcmVtb3RlQXJncwotICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHJlbW90ZUNtZExpbmUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gICAgcmVzdWx0ID0gcHJvYy5jb21tdW5pY2F0ZSgpCi0gICAgcmV0dXJuIHJlc3VsdFswXS5yZXBsYWNlKCJcciIsIiIpCi0KLQotZGVmIG1haW4oKToKLSAgICBwcmludCBjb21waWxlQXJtKHN5cy5hcmd2WzE6XSkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBtYWluKCkKLQotCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvYXJtcmVnLmggYi9saWJhY2MvdGVzdHMvYXJtcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTgxYmEuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2FybXJlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qCSROZXRCU0Q6IGFybXJlZy5oLHYgMS4yOCAyMDAzLzEwLzMxIDE2OjMwOjE1IHNjdyBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwMSBCZW4gSGFycmlzCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NiBNYXJrIEJyaW5pY29tYmUuCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQgQnJpbmkuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgd3JpdHRlbiBmb3IgQnJpbmkgYnkgTWFyayBCcmluaWNvbWJlCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQnJpbmkuCi0gKiA0LiBUaGUgbmFtZSBvZiB0aGUgY29tcGFueSBub3IgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEJSSU5JIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBCUklOSSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqICRGcmVlQlNEOiAvcmVwb21hbi9yL25jdnMvc3JjL3N5cy9hcm0vaW5jbHVkZS9hcm1yZWcuaCx2IDEuMyAyMDA1LzExLzIxIDE5OjA2OjI1IGNvZ25ldCBFeHAgJAotICovCi0KLSNpZm5kZWYgTUFDSElORV9BUk1SRUdfSAotI2RlZmluZSBNQUNISU5FX0FSTVJFR19ICi0jZGVmaW5lIElOU05fU0laRQk0Ci0jZGVmaW5lIElOU05fQ09ORF9NQVNLCTB4ZjAwMDAwMDAJLyogQ29uZGl0aW9uIG1hc2sgKi8KLSNkZWZpbmUgUFNSX01PREUgICAgICAgIDB4MDAwMDAwMWYgICAgICAvKiBtb2RlIG1hc2sgKi8KLSNkZWZpbmUgUFNSX1VTUjI2X01PREUgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUFNSX0ZJUTI2X01PREUgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUFNSX0lSUTI2X01PREUgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUFNSX1NWQzI2X01PREUgIDB4MDAwMDAwMDMKLSNkZWZpbmUgUFNSX1VTUjMyX01PREUgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUFNSX0ZJUTMyX01PREUgIDB4MDAwMDAwMTEKLSNkZWZpbmUgUFNSX0lSUTMyX01PREUgIDB4MDAwMDAwMTIKLSNkZWZpbmUgUFNSX1NWQzMyX01PREUgIDB4MDAwMDAwMTMKLSNkZWZpbmUgUFNSX0FCVDMyX01PREUgIDB4MDAwMDAwMTcKLSNkZWZpbmUgUFNSX1VORDMyX01PREUgIDB4MDAwMDAwMWIKLSNkZWZpbmUgUFNSX1NZUzMyX01PREUgIDB4MDAwMDAwMWYKLSNkZWZpbmUgUFNSXzMyX01PREUgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUFNSX0ZMQUdTCTB4ZjAwMDAwMDAgICAgLyogZmxhZ3MgKi8KLQotI2RlZmluZSBQU1JfQ19iaXQgKDEgPDwgMjkpICAgICAgIC8qIGNhcnJ5ICovCi0KLS8qIFRoZSBoaWdoLW9yZGVyIGJ5dGUgaXMgYWx3YXlzIHRoZSBpbXBsZW1lbnRvciAqLwotI2RlZmluZSBDUFVfSURfSU1QTEVNRU5UT1JfTUFTSwkweGZmMDAwMDAwCi0jZGVmaW5lIENQVV9JRF9BUk1fTFRECQkweDQxMDAwMDAwIC8qICdBJyAqLwotI2RlZmluZSBDUFVfSURfREVDCQkweDQ0MDAwMDAwIC8qICdEJyAqLwotI2RlZmluZSBDUFVfSURfSU5URUwJCTB4NjkwMDAwMDAgLyogJ2knICovCi0jZGVmaW5lCUNQVV9JRF9USQkJMHg1NDAwMDAwMCAvKiAnVCcgKi8KLQotLyogSG93IHRvIGRlY2lkZSB3aGF0IGZvcm1hdCB0aGUgQ1BVSUQgaXMgaW4uICovCi0jZGVmaW5lIENQVV9JRF9JU09MRCh4KQkJKCgoeCkgJiAweDAwMDBmMDAwKSA9PSAweDAwMDAwMDAwKQotI2RlZmluZSBDUFVfSURfSVM3KHgpCQkoKCh4KSAmIDB4MDAwMGYwMDApID09IDB4MDAwMDcwMDApCi0jZGVmaW5lIENQVV9JRF9JU05FVyh4KQkJKCFDUFVfSURfSVNPTEQoeCkgJiYgIUNQVV9JRF9JUzcoeCkpCi0KLS8qIE9uIEFSTTMgYW5kIEFSTTYsIHRoaXMgYnl0ZSBob2xkcyB0aGUgZm91bmRyeSBJRC4gKi8KLSNkZWZpbmUgQ1BVX0lEX0ZPVU5EUllfTUFTSwkweDAwZmYwMDAwCi0jZGVmaW5lIENQVV9JRF9GT1VORFJZX1ZMU0kJMHgwMDU2MDAwMAotCi0vKiBPbiBBUk03IGl0IGhvbGRzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIHZhcmlhbnQgKHN1Yi1tb2RlbCkgKi8KLSNkZWZpbmUgQ1BVX0lEXzdBUkNIX01BU0sJMHgwMDgwMDAwMAotI2RlZmluZSBDUFVfSURfN0FSQ0hfVjMJCTB4MDAwMDAwMDAKLSNkZWZpbmUgQ1BVX0lEXzdBUkNIX1Y0VAkweDAwODAwMDAwCi0jZGVmaW5lIENQVV9JRF83VkFSSUFOVF9NQVNLCTB4MDA3ZjAwMDAKLQotLyogT24gbW9yZSByZWNlbnQgQVJNcywgaXQgZG9lcyB0aGUgc2FtZSwgYnV0IGluIGEgZGlmZmVyZW50IGZvcm1hdCAqLwotI2RlZmluZSBDUFVfSURfQVJDSF9NQVNLCTB4MDAwZjAwMDAKLSNkZWZpbmUgQ1BVX0lEX0FSQ0hfVjMJCTB4MDAwMDAwMDAKLSNkZWZpbmUgQ1BVX0lEX0FSQ0hfVjQJCTB4MDAwMTAwMDAKLSNkZWZpbmUgQ1BVX0lEX0FSQ0hfVjRUCQkweDAwMDIwMDAwCi0jZGVmaW5lIENQVV9JRF9BUkNIX1Y1CQkweDAwMDMwMDAwCi0jZGVmaW5lIENQVV9JRF9BUkNIX1Y1VAkJMHgwMDA0MDAwMAotI2RlZmluZSBDUFVfSURfQVJDSF9WNVRFCTB4MDAwNTAwMDAKLSNkZWZpbmUgQ1BVX0lEX1ZBUklBTlRfTUFTSwkweDAwZjAwMDAwCi0KLS8qIE5leHQgdGhyZWUgbnliYmxlcyBhcmUgcGFydCBudW1iZXIgKi8KLSNkZWZpbmUgQ1BVX0lEX1BBUlROT19NQVNLCTB4MDAwMGZmZjAKLQotLyogSW50ZWwgWFNjYWxlIGhhcyBzdWIgZmllbGRzIGluIHBhcnQgbnVtYmVyICovCi0jZGVmaW5lIENQVV9JRF9YU0NBTEVfQ09SRUdFTl9NQVNLCTB4MDAwMGUwMDAgLyogY29yZSBnZW5lcmF0aW9uICovCi0jZGVmaW5lIENQVV9JRF9YU0NBTEVfQ09SRVJFVl9NQVNLCTB4MDAwMDFjMDAgLyogY29yZSByZXZpc2lvbiAqLwotI2RlZmluZSBDUFVfSURfWFNDQUxFX1BST0RVQ1RfTUFTSwkweDAwMDAwM2YwIC8qIHByb2R1Y3QgbnVtYmVyICovCi0KLS8qIEFuZCBmaW5hbGx5LCB0aGUgcmV2aXNpb24gbnVtYmVyLiAqLwotI2RlZmluZSBDUFVfSURfUkVWSVNJT05fTUFTSwkweDAwMDAwMDBmCi0KLS8qIEluZGl2aWR1YWwgQ1BVcyBhcmUgcHJvYmFibHkgYmVzdCBJRGVkIGJ5IGV2ZXJ5dGhpbmcgYnV0IHRoZSByZXZpc2lvbi4gKi8KLSNkZWZpbmUgQ1BVX0lEX0NQVV9NQVNLCQkweGZmZmZmZmYwCi0KLS8qIEZha2UgQ1BVIElEcyBmb3IgQVJNcyB3aXRob3V0IENQMTUgKi8KLSNkZWZpbmUgQ1BVX0lEX0FSTTIJCTB4NDE1NjAyMDAKLSNkZWZpbmUgQ1BVX0lEX0FSTTI1MAkJMHg0MTU2MDI1MAotCi0vKiBQcmUtQVJNNyBDUFVzIC0tIFsxNToxMl0gPT0gMCAqLwotI2RlZmluZSBDUFVfSURfQVJNMwkJMHg0MTU2MDMwMAotI2RlZmluZSBDUFVfSURfQVJNNjAwCQkweDQxNTYwNjAwCi0jZGVmaW5lIENQVV9JRF9BUk02MTAJCTB4NDE1NjA2MTAKLSNkZWZpbmUgQ1BVX0lEX0FSTTYyMAkJMHg0MTU2MDYyMAotCi0vKiBBUk03IENQVXMgLS0gWzE1OjEyXSA9PSA3ICovCi0jZGVmaW5lIENQVV9JRF9BUk03MDAJCTB4NDEwMDcwMDAgLyogWFhYIFRoaXMgaXMgYSBndWVzcy4gKi8KLSNkZWZpbmUgQ1BVX0lEX0FSTTcxMAkJMHg0MTAwNzEwMAotI2RlZmluZSBDUFVfSURfQVJNNzUwMAkJMHg0MTAyNzEwMCAvKiBYWFggVGhpcyBpcyBhIGd1ZXNzLiAqLwotI2RlZmluZSBDUFVfSURfQVJNNzEwQQkJMHg0MTA0NzEwMCAvKiBpbmMgQVJNNzEwMCAqLwotI2RlZmluZSBDUFVfSURfQVJNNzUwMEZFCTB4NDEwNzcxMDAKLSNkZWZpbmUgQ1BVX0lEX0FSTTcxMFQJCTB4NDE4MDcxMDAKLSNkZWZpbmUgQ1BVX0lEX0FSTTcyMFQJCTB4NDE4MDcyMDAKLSNkZWZpbmUgQ1BVX0lEX0FSTTc0MFQ4SwkweDQxODA3NDAwIC8qIFhYWCBubyBNTVUsIDhLQiBjYWNoZSAqLwotI2RlZmluZSBDUFVfSURfQVJNNzQwVDRLCTB4NDE4MTc0MDAgLyogWFhYIG5vIE1NVSwgNEtCIGNhY2hlICovCi0KLS8qIFBvc3QtQVJNNyBDUFVzICovCi0jZGVmaW5lIENQVV9JRF9BUk04MTAJCTB4NDEwMTgxMDAKLSNkZWZpbmUgQ1BVX0lEX0FSTTkyMFQJCTB4NDExMjkyMDAKLSNkZWZpbmUgQ1BVX0lEX0FSTTkyMFRfQUxUCTB4NDEwMDkyMDAKLSNkZWZpbmUgQ1BVX0lEX0FSTTkyMlQJCTB4NDEwMjkyMjAKLSNkZWZpbmUgQ1BVX0lEX0FSTTk0MFQJCTB4NDEwMjk0MDAgLyogWFhYIG5vIE1NVSAqLwotI2RlZmluZSBDUFVfSURfQVJNOTQ2RVMJCTB4NDEwNDk0NjAgLyogWFhYIG5vIE1NVSAqLwotI2RlZmluZQlDUFVfSURfQVJNOTY2RVMJCTB4NDEwNDk2NjAgLyogWFhYIG5vIE1NVSAqLwotI2RlZmluZQlDUFVfSURfQVJNOTY2RVNSMQkweDQxMDU5NjYwIC8qIFhYWCBubyBNTVUgKi8KLSNkZWZpbmUgQ1BVX0lEX0FSTTEwMjBFCQkweDQxMTVhMjAwIC8qIChBS0EgYXJtMTAgcmV2IDEpICovCi0jZGVmaW5lIENQVV9JRF9BUk0xMDIyRVMJMHg0MTA1YTIyMAotI2RlZmluZSBDUFVfSURfU0ExMTAJCTB4NDQwMWExMDAKLSNkZWZpbmUgQ1BVX0lEX1NBMTEwMAkJMHg0NDAxYTExMAotI2RlZmluZQlDUFVfSURfVEk5MjVUCQkweDU0MDI5MjUwCi0jZGVmaW5lIENQVV9JRF9TQTExMTAJCTB4NjkwMWIxMTAKLSNkZWZpbmUgQ1BVX0lEX0lYUDEyMDAJCTB4NjkwMWMxMjAKLSNkZWZpbmUgQ1BVX0lEXzgwMjAwCQkweDY5MDUyMDAwCi0jZGVmaW5lIENQVV9JRF9QWEEyNTAgICAgCTB4NjkwNTIxMDAgLyogc2FucyBjb3JlIHJldmlzaW9uICovCi0jZGVmaW5lIENQVV9JRF9QWEEyMTAgICAgCTB4NjkwNTIxMjAKLSNkZWZpbmUgQ1BVX0lEX1BYQTI1MEEJCTB4NjkwNTIxMDAgLyogMXN0IHZlcnNpb24gQ29yZSAqLwotI2RlZmluZSBDUFVfSURfUFhBMjEwQQkJMHg2OTA1MjEyMCAvKiAxc3QgdmVyc2lvbiBDb3JlICovCi0jZGVmaW5lIENQVV9JRF9QWEEyNTBCCQkweDY5MDUyOTAwIC8qIDNyZCB2ZXJzaW9uIENvcmUgKi8KLSNkZWZpbmUgQ1BVX0lEX1BYQTIxMEIJCTB4NjkwNTI5MjAgLyogM3JkIHZlcnNpb24gQ29yZSAqLwotI2RlZmluZSBDUFVfSURfUFhBMjUwQwkJMHg2OTA1MmQwMCAvKiA0dGggdmVyc2lvbiBDb3JlICovCi0jZGVmaW5lIENQVV9JRF9QWEEyMTBDCQkweDY5MDUyZDIwIC8qIDR0aCB2ZXJzaW9uIENvcmUgKi8KLSNkZWZpbmUJQ1BVX0lEXzgwMzIxXzQwMAkweDY5MDUyNDIwCi0jZGVmaW5lCUNQVV9JRF84MDMyMV82MDAJMHg2OTA1MjQzMAotI2RlZmluZQlDUFVfSURfODAzMjFfNDAwX0IwCTB4NjkwNTJjMjAKLSNkZWZpbmUJQ1BVX0lEXzgwMzIxXzYwMF9CMAkweDY5MDUyYzMwCi0jZGVmaW5lCUNQVV9JRF9JWFA0MjVfNTMzCTB4NjkwNTQxYzAKLSNkZWZpbmUJQ1BVX0lEX0lYUDQyNV80MDAJMHg2OTA1NDFkMAotI2RlZmluZQlDUFVfSURfSVhQNDI1XzI2NgkweDY5MDU0MWYwCi0KLS8qIEFSTTMtc3BlY2lmaWMgY29wcm9jZXNzb3IgMTUgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEFSTTNfQ1AxNV9GTFVTSAkJMQotI2RlZmluZSBBUk0zX0NQMTVfQ09OVFJPTAkyCi0jZGVmaW5lIEFSTTNfQ1AxNV9DQUNIRUFCTEUJMwotI2RlZmluZSBBUk0zX0NQMTVfVVBEQVRFQUJMRQk0Ci0jZGVmaW5lIEFSTTNfQ1AxNV9ESVNSVVBUSVZFCTUJCi0KLS8qIEFSTTMgQ29udHJvbCByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIEFSTTNfQ1RMX0NBQ0hFX09OCTB4MDAwMDAwMDEKLSNkZWZpbmUgQVJNM19DVExfU0hBUkVECQkweDAwMDAwMDAyCi0jZGVmaW5lIEFSTTNfQ1RMX01PTklUT1IJMHgwMDAwMDAwNAotCi0vKgotICogUG9zdC1BUk0zIENQMTUgcmVnaXN0ZXJzOgotICoKLSAqCTEJQ29udHJvbCByZWdpc3RlcgotICoKLSAqCTIJVHJhbnNsYXRpb24gVGFibGUgQmFzZQotICoKLSAqCTMJRG9tYWluIEFjY2VzcyBDb250cm9sCi0gKgotICoJNAlSZXNlcnZlZAotICoKLSAqCTUJRmF1bHQgU3RhdHVzCi0gKgotICoJNglGYXVsdCBBZGRyZXNzCi0gKgotICoJNwlDYWNoZS93cml0ZS1idWZmZXIgQ29udHJvbAotICoKLSAqCTgJVExCIENvbnRyb2wKLSAqCi0gKgk5CUNhY2hlIExvY2tkb3duCi0gKgotICoJMTAJVExCIExvY2tkb3duCi0gKgotICoJMTEJUmVzZXJ2ZWQKLSAqCi0gKgkxMglSZXNlcnZlZAotICoKLSAqCTEzCVByb2Nlc3MgSUQgKGZvciBGQ1NFKQotICoKLSAqCTE0CVJlc2VydmVkCi0gKgotICoJMTUJSW1wbGVtZW50YXRpb24gRGVwZW5kZW50Ci0gKi8KLQotLyogU29tZSBvZiB0aGUgZGVmaW5pdGlvbnMgYmVsb3cgbmVlZCBjbGVhbmluZyB1cCBmb3IgVjMvVjQgYXJjaGl0ZWN0dXJlcyAqLwotCi0vKiBDUFUgY29udHJvbCByZWdpc3RlciAoQ1AxNSByZWdpc3RlciAxKSAqLwotI2RlZmluZSBDUFVfQ09OVFJPTF9NTVVfRU5BQkxFCTB4MDAwMDAwMDEgLyogTTogTU1VL1Byb3RlY3Rpb24gdW5pdCBlbmFibGUgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfQUZMVF9FTkFCTEUJMHgwMDAwMDAwMiAvKiBBOiBBbGlnbm1lbnQgZmF1bHQgZW5hYmxlICovCi0jZGVmaW5lIENQVV9DT05UUk9MX0RDX0VOQUJMRQkweDAwMDAwMDA0IC8qIEM6IElEQy9EQyBlbmFibGUgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfV0JVRl9FTkFCTEUgMHgwMDAwMDAwOCAvKiBXOiBXcml0ZSBidWZmZXIgZW5hYmxlICovCi0jZGVmaW5lIENQVV9DT05UUk9MXzMyQlBfRU5BQkxFIDB4MDAwMDAwMTAgLyogUDogMzItYml0IGV4Y2VwdGlvbiBoYW5kbGVycyAqLwotI2RlZmluZSBDUFVfQ09OVFJPTF8zMkJEX0VOQUJMRSAweDAwMDAwMDIwIC8qIEQ6IDMyLWJpdCBhZGRyZXNzaW5nICovCi0jZGVmaW5lIENQVV9DT05UUk9MX0xBQlRfRU5BQkxFIDB4MDAwMDAwNDAgLyogTDogTGF0ZSBhYm9ydCBlbmFibGUgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfQkVORF9FTkFCTEUgMHgwMDAwMDA4MCAvKiBCOiBCaWctZW5kaWFuIG1vZGUgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfU1lTVF9FTkFCTEUgMHgwMDAwMDEwMCAvKiBTOiBTeXN0ZW0gcHJvdGVjdGlvbiBiaXQgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfUk9NX0VOQUJMRQkweDAwMDAwMjAwIC8qIFI6IFJPTSBwcm90ZWN0aW9uIGJpdCAqLwotI2RlZmluZSBDUFVfQ09OVFJPTF9DUENMSwkweDAwMDAwNDAwIC8qIEY6IEltcGxlbWVudGF0aW9uIGRlZmluZWQgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfQlBSRF9FTkFCTEUgMHgwMDAwMDgwMCAvKiBaOiBCcmFuY2ggcHJlZGljdGlvbiBlbmFibGUgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfSUNfRU5BQkxFICAgMHgwMDAwMTAwMCAvKiBJOiBJQyBlbmFibGUgKi8KLSNkZWZpbmUgQ1BVX0NPTlRST0xfVkVDUkVMT0MJMHgwMDAwMjAwMCAvKiBWOiBWZWN0b3IgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBDUFVfQ09OVFJPTF9ST1VORFJPQklOCTB4MDAwMDQwMDAgLyogUlI6IFByZWRpY3RhYmxlIHJlcGxhY2VtZW50ICovCi0jZGVmaW5lIENQVV9DT05UUk9MX1Y0Q09NUEFUCTB4MDAwMDgwMDAgLyogTDQ6IEFSTXY0IGNvbXBhdCBMRFIgUjE1IGV0YyAqLwotCi0jZGVmaW5lIENQVV9DT05UUk9MX0lEQ19FTkFCTEUJQ1BVX0NPTlRST0xfRENfRU5BQkxFCi0KLS8qIFhTY2FsZSBBdXhpbGxhcnkgQ29udHJvbCBSZWdpc3RlciAoQ1AxNSByZWdpc3RlciAxLCBvcGNvZGUyIDEpICovCi0jZGVmaW5lCVhTQ0FMRV9BVVhDVExfSwkJMHgwMDAwMDAwMSAvKiBkaXMuIHdyaXRlIGJ1ZmZlciBjb2FsZXNjaW5nICovCi0jZGVmaW5lCVhTQ0FMRV9BVVhDVExfUAkJMHgwMDAwMDAwMiAvKiBFQ0MgcHJvdGVjdCBwYWdlIHRhYmxlIGFjY2VzcyAqLwotI2RlZmluZQlYU0NBTEVfQVVYQ1RMX01EX1dCX1JBCTB4MDAwMDAwMDAgLyogbWluaS1EJCB3YiwgcmVhZC1hbGxvY2F0ZSAqLwotI2RlZmluZQlYU0NBTEVfQVVYQ1RMX01EX1dCX1JXQQkweDAwMDAwMDEwIC8qIG1pbmktRCQgd2IsIHJlYWQvd3JpdGUtYWxsb2NhdGUgKi8KLSNkZWZpbmUJWFNDQUxFX0FVWENUTF9NRF9XVAkweDAwMDAwMDIwIC8qIG1pbmktRCQgd3QsIHJlYWQtYWxsb2NhdGUgKi8KLSNkZWZpbmUJWFNDQUxFX0FVWENUTF9NRF9NQVNLCTB4MDAwMDAwMzAKLQotLyogQ2FjaGUgdHlwZSByZWdpc3RlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZQlDUFVfQ1RfSVNJWkUoeCkJCSgoeCkgJiAweGZmZikJCS8qIEkkIGluZm8gKi8KLSNkZWZpbmUJQ1BVX0NUX0RTSVpFKHgpCQkoKCh4KSA+PiAxMikgJiAweGZmZikJLyogRCQgaW5mbyAqLwotI2RlZmluZQlDUFVfQ1RfUwkJKDFVIDw8IDI0KQkJLyogc3BsaXQgY2FjaGUgKi8KLSNkZWZpbmUJQ1BVX0NUX0NUWVBFKHgpCQkoKCh4KSA+PiAyNSkgJiAweGYpCS8qIGNhY2hlIHR5cGUgKi8KLQotI2RlZmluZQlDUFVfQ1RfQ1RZUEVfV1QJCTAJLyogd3JpdGUtdGhyb3VnaCAqLwotI2RlZmluZQlDUFVfQ1RfQ1RZUEVfV0IxCTEJLyogd3JpdGUtYmFjaywgY2xlYW4gdy8gcmVhZCAqLwotI2RlZmluZQlDUFVfQ1RfQ1RZUEVfV0IyCTIJLyogdy9iLCBjbGVhbiB3LyBjcDE1LDcgKi8KLSNkZWZpbmUJQ1BVX0NUX0NUWVBFX1dCNgk2CS8qIHcvYiwgY3AxNSw3LCBsb2NrZG93biBmbXQgQSAqLwotI2RlZmluZQlDUFVfQ1RfQ1RZUEVfV0I3CTcJLyogdy9iLCBjcDE1LDcsIGxvY2tkb3duIGZtdCBCICovCi0KLSNkZWZpbmUJQ1BVX0NUX3hTSVpFX0xFTih4KQkoKHgpICYgMHgzKQkJLyogbGluZSBzaXplICovCi0jZGVmaW5lCUNQVV9DVF94U0laRV9NCQkoMVUgPDwgMikJCS8qIG11bHRpcGxpZXIgKi8KLSNkZWZpbmUJQ1BVX0NUX3hTSVpFX0FTU09DKHgpCSgoKHgpID4+IDMpICYgMHg3KQkvKiBhc3NvY2lhdGl2aXR5ICovCi0jZGVmaW5lCUNQVV9DVF94U0laRV9TSVpFKHgpCSgoKHgpID4+IDYpICYgMHg3KQkvKiBzaXplICovCi0KLS8qIEZhdWx0IHN0YXR1cyByZWdpc3RlciBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIEZBVUxUX1RZUEVfTUFTSyAweDBmCi0jZGVmaW5lIEZBVUxUX1VTRVIgICAgICAweDEwCi0KLSNkZWZpbmUgRkFVTFRfV1JUQlVGXzAgIDB4MDAgLyogVmVjdG9yIEV4Y2VwdGlvbiAqLwotI2RlZmluZSBGQVVMVF9XUlRCVUZfMSAgMHgwMiAvKiBUZXJtaW5hbCBFeGNlcHRpb24gKi8KLSNkZWZpbmUgRkFVTFRfQlVTRVJSXzAgIDB4MDQgLyogRXh0ZXJuYWwgQWJvcnQgb24gTGluZWZldGNoIC0tIFNlY3Rpb24gKi8KLSNkZWZpbmUgRkFVTFRfQlVTRVJSXzEgIDB4MDYgLyogRXh0ZXJuYWwgQWJvcnQgb24gTGluZWZldGNoIC0tIFBhZ2UgKi8KLSNkZWZpbmUgRkFVTFRfQlVTRVJSXzIgIDB4MDggLyogRXh0ZXJuYWwgQWJvcnQgb24gTm9uLWxpbmVmZXRjaCAtLSBTZWN0aW9uICovCi0jZGVmaW5lIEZBVUxUX0JVU0VSUl8zICAweDBhIC8qIEV4dGVybmFsIEFib3J0IG9uIE5vbi1saW5lZmV0Y2ggLS0gUGFnZSAqLwotI2RlZmluZSBGQVVMVF9CVVNUUk5MMSAgMHgwYyAvKiBFeHRlcm5hbCBhYm9ydCBvbiBUcmFuc2xhdGlvbiAtLSBMZXZlbCAxICovCi0jZGVmaW5lIEZBVUxUX0JVU1RSTkwyICAweDBlIC8qIEV4dGVybmFsIGFib3J0IG9uIFRyYW5zbGF0aW9uIC0tIExldmVsIDIgKi8KLSNkZWZpbmUgRkFVTFRfQUxJR05fMCAgIDB4MDEgLyogQWxpZ25tZW50ICovCi0jZGVmaW5lIEZBVUxUX0FMSUdOXzEgICAweDAzIC8qIEFsaWdubWVudCAqLwotI2RlZmluZSBGQVVMVF9UUkFOU19TICAgMHgwNSAvKiBUcmFuc2xhdGlvbiAtLSBTZWN0aW9uICovCi0jZGVmaW5lIEZBVUxUX1RSQU5TX1AgICAweDA3IC8qIFRyYW5zbGF0aW9uIC0tIFBhZ2UgKi8KLSNkZWZpbmUgRkFVTFRfRE9NQUlOX1MgIDB4MDkgLyogRG9tYWluIC0tIFNlY3Rpb24gKi8KLSNkZWZpbmUgRkFVTFRfRE9NQUlOX1AgIDB4MGIgLyogRG9tYWluIC0tIFBhZ2UgKi8KLSNkZWZpbmUgRkFVTFRfUEVSTV9TICAgIDB4MGQgLyogUGVybWlzc2lvbiAtLSBTZWN0aW9uICovCi0jZGVmaW5lIEZBVUxUX1BFUk1fUCAgICAweDBmIC8qIFBlcm1pc3Npb24gLS0gUGFnZSAqLwotCi0jZGVmaW5lCUZBVUxUX0lNUFJFQ0lTRQkweDQwMAkvKiBJbXByZWNpc2UgZXhjZXB0aW9uIChYU0NBTEUpICovCi0KLS8qCi0gKiBBZGRyZXNzIG9mIHRoZSB2ZWN0b3IgcGFnZSwgbG93IGFuZCBoaWdoIHZlcnNpb25zLgotICovCi0jZGVmaW5lCUFSTV9WRUNUT1JTX0xPVwkJMHgwMDAwMDAwMFUKLSNkZWZpbmUJQVJNX1ZFQ1RPUlNfSElHSAkweGZmZmYwMDAwVQotCi0vKgotICogQVJNIEluc3RydWN0aW9ucwotICoKLSAqICAgICAgIDMgMyAyIDIgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgMSAwIDkgOCA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0gKiAgICAgICstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgIHwgY29uZCAgfCAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gZGVwZW5kYW50ICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgIHxjIGMgYyBjfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKi8KLQotI2RlZmluZSBJTlNOX1NJWkUJCTQJCS8qIEFsd2F5cyA0IGJ5dGVzICovCi0jZGVmaW5lIElOU05fQ09ORF9NQVNLCQkweGYwMDAwMDAwCS8qIENvbmRpdGlvbiBtYXNrICovCi0jZGVmaW5lIElOU05fQ09ORF9BTAkJMHhlMDAwMDAwMAkvKiBBbHdheXMgY29uZGl0aW9uICovCi0KLSNlbmRpZiAvKiAhTUFDSElORV9BUk1SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvYWRkcmVzc09mLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9hZGRyZXNzT2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhY2RlNS4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9hZGRyZXNzT2YuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXZvaWQgdGVzdFN0cnVjdCgpIHsKLSAgICBzdHJ1Y3Qgc3RyIHsKLSAgICAgICAgZmxvYXQgeDsKLSAgICAgICAgZmxvYXQgeTsKLSAgICB9OwotCi0gICAgc3RydWN0IHN0ciBiYXNlOwotICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICBiYXNlLnggPSAxMC4wOwotICAgIHN0cnVjdCBzdHIgKnMgPSAmYmFzZTsKLQotICAgIGZsb2F0ICp2ID0gJigqcykueDsKLSAgICBmbG9hdCAqdjIgPSAmc1tpbmRleF0ueDsKLSAgICBwcmludGYoInRlc3RTdHJ1Y3Q6ICVnICVnICVnXG4iLGJhc2UueCwgKnYsICp2Mik7Ci19Ci0KLXZvaWQgdGVzdEFycmF5KCkgewotICAgIGludCBhWzJdOwotICAgIGFbMF0gPSAxOwotICAgIGFbMV0gPSAyOwotICAgIGludCogcCA9ICZhWzBdOwotICAgIGludCogcDIgPSBhOwotICAgIHByaW50ZigidGVzdEFycmF5OiAlZCAlZCAlZFxuIiwgYVswXSwgKnAsICpwMik7Ci19Ci0KLWludCBtYWluKCkgewotICAgIHRlc3RTdHJ1Y3QoKTsKLSAgICB0ZXN0QXJyYXkoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2FycmF5LmMgYi9saWJhY2MvdGVzdHMvZGF0YS9hcnJheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTRhNzI4Li4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2FycmF5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8gQXJyYXkgYWxsb2NhdGlvbiB0ZXN0cwotCi12b2lkIHRlc3RMb2NhbEludCgpCi17Ci0gICAgaW50IGFbM107Ci0gICAgYVswXSA9IDE7Ci0gICAgYVsxXSA9IDI7Ci0gICAgYVsyXSA9IGFbMF0gKyBhWzFdOwotICAgIHByaW50ZigibG9jYWxJbnQ6ICVkXG4iLCBhWzJdKTsKLX0KLQotY2hhciBhWzNdOwotZG91YmxlIGRbM107Ci0KLXZvaWQgdGVzdEdsb2JhbENoYXIoKQotewotICAgIGFbMF0gPSAxOwotICAgIGFbMV0gPSAyOwotICAgIGFbMl0gPSBhWzBdICsgYVsxXTsKLSAgICBwcmludGYoImdsb2JhbENoYXI6ICVkXG4iLCBhWzJdKTsKLX0KLQotdm9pZCB0ZXN0R2xvYmFsRG91YmxlKCkKLXsKLSAgICBkWzBdID0gMTsKLSAgICBkWzFdID0gMjsKLSAgICBkWzJdID0gZFswXSArIGRbMV07Ci0gICAgcHJpbnRmKCJnbG9iYWxEb3VibGU6ICVnXG4iLCBkWzJdKTsKLX0KLQotdm9pZCB0ZXN0TG9jYWxEb3VibGUoKQotewotICAgIGRvdWJsZSBkWzNdOwotICAgIGZsb2F0ICBtWzEyXTsKLSAgICBtWzBdID0gMS4wZjsKLSAgICBtWzFdID0gMi4wZjsKLSAgICBkWzBdID0gMS4wOwotICAgIGRbMV0gPSAyLjA7Ci0gICAgZFsyXSA9IGRbMF0gKyBkWzFdOwotICAgIG1bMl0gPSBtWzBdICsgbVsxXTsKLSAgICBwcmludGYoImxvY2FsRG91YmxlOiAlZyAlZ1xuIiwgZFsyXSwgbVsyXSk7Ci19Ci0KLXZvaWQgdmVjdG9yQWRkKGludCogYSwgaW50KiBiLCBmbG9hdCogYywgaW50IGxlbikgewotICAgIGludCBpOwotICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGNbaV0gPSBhW2ldICsgYltpXTsKLSAgICB9Ci19Ci0KLXZvaWQgdGVzdEFyZ3MoKSB7Ci0gICAgaW50IGFbM10sIGJbM107Ci0gICAgZmxvYXQgY1szXTsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGVuID0gMzsKLSAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBhW2ldID0gaTsKLSAgICAgICAgYltpXSA9IGk7Ci0gICAgICAgIGNbaV0gPSAwOwotICAgIH0KLSAgICB2ZWN0b3JBZGQoYSxiLGMsIGxlbik7Ci0gICAgcHJpbnRmKCJ0ZXN0QXJnczoiKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBwcmludGYoIiAlZyIsIGNbaV0pOwotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLXZvaWQgdGVzdERlY2F5KCkgewotICAgIGNoYXIgY1s0XTsKLSAgICBjWzBdID0gJ0gnOwotICAgIGNbMV0gPSAnaSc7Ci0gICAgY1syXSA9ICchJzsKLSAgICBjWzNdID0gMDsKLSAgICBwcmludGYoInRlc3REZWNheTogJXNcbiIsIGMpOwotfQotCi12b2lkIHRlc3QyRCgpIHsKLSAgICBjaGFyIGNbMTBdWzIwXTsKLSAgICBpbnQgeDsKLSAgICBpbnQgeTsKLSAgICBwcmludGYoInRlc3QyRDpcbiIpOwotICAgIGZvcih5ID0gMDsgeSA8IDEwOyB5KyspIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgMjA7IHgrKykgewotICAgICAgICAgICAgY1t5XVt4XSA9ICdhJyArICgxNSAmICh5ICogMTkgKyB4KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yKHkgPSAwOyB5IDwgMTA7IHkrKykgewotICAgICAgICBmb3IoeCA9IDA7IHggPCAyMDsgeCsrKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVjIiwgY1t5XVt4XSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KLQotfQotCi1pbnQgbWFpbigpCi17Ci0gICAgdGVzdExvY2FsSW50KCk7Ci0gICAgdGVzdExvY2FsRG91YmxlKCk7Ci0gICAgdGVzdEdsb2JhbENoYXIoKTsKLSAgICB0ZXN0R2xvYmFsRG91YmxlKCk7Ci0gICAgdGVzdEFyZ3MoKTsKLSAgICB0ZXN0RGVjYXkoKTsKLSAgICB0ZXN0MkQoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2Fzc2lnbm1lbnQuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL2Fzc2lnbm1lbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjNzgwMS4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9hc3NpZ25tZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWludCBtYWluKCkgewotICAgIGludCBhID0gMDsKLSAgICBpbnQgYiA9IDE7Ci0gICAgYSA9IGIgPSAyOyAvLyBUZXN0IHRoYXQgImIgPSAyIiBnZW5lcmF0ZXMgYW4gcnZhbHVlLgotICAgIGlmIChhID0gNykgeyAvLyBUZXN0IHRoYXQgYSA9IDcgZ2VuZXJhdGVzIGFuIHJ2YWx1ZS4KLSAgICAgICAgYiA9IDM7Ci0gICAgfQotICAgIHJldHVybiBhOwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvYXNzaWdubWVudG9wLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9hc3NpZ25tZW50b3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5ZWRmOS4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9hc3NpZ25tZW50b3AuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vIFRlc3QgYXNzaWdubWVudCBvcGVyYXRpb25zCi0KLXZvaWQgdGVzdEFzc2lnbm1lbnQoKSB7Ci0gICAgaW50IGEgPSAyOwotICAgIGEgKj0gNTsKLSAgICBwcmludGYoIjIgKj0gNSAgJWRcbiIsIGEpOwotICAgIGEgPSAyMDsKLSAgICBhIC89IDU7Ci0gICAgcHJpbnRmKCIyMCAvPSA1ICAlZFxuIiwgYSk7Ci0gICAgYSA9IDE3OwotICAgIGEgJT0gNTsKLSAgICBwcmludGYoIjE3ICUlPSA1ICAlZFxuIiwgYSk7Ci0gICAgYSA9IDE3OwotICAgIGEgKz0gNTsKLSAgICBwcmludGYoIjE3ICs9IDUgICVkXG4iLCBhKTsKLSAgICBhID0gMTc7Ci0gICAgYS09NTsKLSAgICBwcmludGYoIjE3IC09IDUgICVkXG4iLCBhKTsKLSAgICBhID0gMTc7Ci0gICAgYTw8PTE7Ci0gICAgcHJpbnRmKCIxNzw8PSAxICAlZFxuIiwgYSk7Ci0gICAgYSA9IDE3OwotICAgIGE+Pj0xOwotICAgIHByaW50ZigiMTc+Pj0gMSAgJWRcbiIsIGEpOwotICAgIGEgPSAxNzsKLSAgICBhJj0xOwotICAgIHByaW50ZigiMTcmPSAxICAlZFxuIiwgYSk7Ci0gICAgYSA9IDE3OwotICAgIGFePTE7Ci0gICAgcHJpbnRmKCIxN149IDEgICVkXG4iLCBhKTsKLSAgICBhID0gMTY7Ci0gICAgYV49MTsKLSAgICBwcmludGYoIjE2fD0gMSAgJWRcbiIsIGEpOwotfQotCi1pbnQgYTsKLQotaW50KiBmKCkgewotICAgIHByaW50ZigiZigpXG4iKTsKLSAgICByZXR1cm4gJmE7Ci19Ci0KLXZvaWQgdGVzdEV2YWwoKSB7Ci0gICAgYSA9IDA7Ci0gICAgcHJpbnRmKCIqZigpID0gKmYoKSArIDEwO1xuIik7Ci0gICAgKmYoKSA9ICpmKCkgKyAxMDsKLSAgICBwcmludGYoImEgPSAlZFxuIiwgYSk7Ci19Ci0KLXZvaWQgdGVzdE9wRXZhbCgpIHsKLSAgICBhID0gMDsKLSAgICBwcmludGYoIipmKCkgKz0gMTA7XG4iKTsKLSAgICAqZigpICs9IDEwOwotICAgIHByaW50ZigiYSA9ICVkXG4iLCBhKTsKLX0KLQotaW50IG1haW4oKSB7Ci0gICAgdGVzdEFzc2lnbm1lbnQoKTsKLSAgICB0ZXN0RXZhbCgpOwotICAgIHRlc3RPcEV2YWwoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2IyMDcxNjcwLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9iMjA3MTY3MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTFiYzRmLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2IyMDcxNjcwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8vIFNlZSBodHRwOi8vYi8yMDcxNjcwCi0KLWludCBtYWluKCkgewotICAgIGZsb2F0IGYgPSAxMC4wZjsKLSAgICBmbG9hdCogZmxvYXRQb2ludGVyID0gJmY7Ci0gICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIHVzZWQgdG8gaW5jb3JyZWN0bHkgZXJyb3I6ICJJbmNvbXBhdGlibGUgcG9pbnRlciBvciBhcnJheSB0eXBlcyIKLSAgICBpbnQqIGJ1ZmZlciA9IChpbnQqKSBmbG9hdFBvaW50ZXI7Ci0gICAgcmV0dXJuICpidWZmZXI7Ci19CmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9iZWxsYXJkLm90Y2NleC5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvYmVsbGFyZC5vdGNjZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmMDk4OS4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9iZWxsYXJkLm90Y2NleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qICMhL3Vzci9sb2NhbC9iaW4vb3RjYyAqLwotLyoKLSAqIFNhbXBsZSBPVENDIEMgZXhhbXBsZS4gWW91IGNhbiB1bmNvbW1lbnQgdGhlIGZpcnN0IGxpbmUgYW5kIGluc3RhbGwKLSAqIG90Y2MgaW4gL3Vzci9sb2NhbC9iaW4gdG8gbWFrZSBvdGNjIHNjcmlwdHMgISAgCi0gKi8KLQotLyogQW55IHByZXByb2Nlc3NvciBkaXJlY3RpdmUgZXhjZXB0ICNkZWZpbmUgYXJlIGlnbm9yZWQuIFdlIHB1dCB0aGlzCi0gICBpbmNsdWRlIHNvIHRoYXQgYSBzdGFuZGFyZCBDIGNvbXBpbGVyIGNhbiBjb21waWxlIHRoaXMgY29kZSB0b28uICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogZGVmaW5lcyBhcmUgaGFuZGxlZCwgYnV0IG1hY3JvIGFyZ3VtZW50cyBjYW5ub3QgYmUgZ2l2ZW4uIE5vCi0gICByZWN1cnNpdmUgZGVmaW5lcyBhcmUgdG9sZXJhdGVkICovCi0jZGVmaW5lIERFRkFVTFRfQkFTRSAxMAotCi0vKgotICogT25seSBvbGQgc3R5bGUgSyZSIHByb3RvdHlwZXMgYXJlIHBhcnNlZC4gT25seSBpbnQgYXJndW1lbnRzIGFyZQotICogYWxsb3dlZCAoaW1wbGljaXQgdHlwZXMpLgotICogCi0gKiBCeSBiZW5jaG1hcmtpbmcgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gKGZvciBleGFtcGxlCi0gKiBmb3IgZmliKDM1KSksIHlvdSdsbCBub3RpY2UgdGhhdCBPVENDIGlzIHF1aXRlIGZhc3QgYmVjYXVzZSBpdAotICogZ2VuZXJhdGVzIG5hdGl2ZSBpMzg2IG1hY2hpbmUgY29kZS4gIAotICovCi1maWIobikKLXsKLSAgICBpZiAobiA8PSAyKQotICAgICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBmaWIobi0xKSArIGZpYihuLTIpOwotfQotCi0vKiBJZGVudGlmaWVycyBhcmUgcGFyc2VkIHRoZSBzYW1lIHdheSBhcyBDOiBiZWdpbnMgd2l0aCBsZXR0ZXIgb3IKLSAgICdfJywgYW5kIHRoZW4gbGV0dGVycywgJ18nIG9yIGRpZ2l0cyAqLwotZmFjdChuKQotewotICAgIC8qIGxvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZGVjbGFyZWQuIE9ubHkgJ2ludCcgdHlwZSBpcyBzdXBwb3J0ZWQgKi8KLSAgICBpbnQgaSwgcjsKLSAgICByID0gMTsKLSAgICAvKiAnd2hpbGUnIGFuZCAnZm9yJyBsb29wcyBhcmUgc3VwcG9ydGVkICovCi0gICAgZm9yKGk9MjtpPD1uO2krKykKLSAgICAgICAgciA9IHIgKiBpOwotICAgIHJldHVybiByOwotfQotCi0vKiBXZWxsLCB3ZSBjb3VsZCB1c2UgcHJpbnRmLCBidXQgaXQgd291bGQgYmUgdG9vIGVhc3kgKi8KLXByaW50X251bShuLCBiKQotewotICAgIGludCB0YWIsIHAsIGM7Ci0gICAgLyogTnVtYmVycyBjYW4gYmUgZW50ZXJlZCBpbiBkZWNpbWFsLCBoZXhhZGVjaW1hbCAoJzB4JyBwcmVmaXgpIGFuZAotICAgICAgIG9jdGFsICgnMCcgcHJlZml4KSAqLwotICAgIC8qIG1vcmUgY29tcGxleCBwcm9ncmFtcyB1c2UgbWFsbG9jICovCi0gICAgdGFiID0gbWFsbG9jKDB4MTAwKTsgCi0gICAgcCA9IHRhYjsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBjID0gbiAlIGI7Ci0gICAgICAgIC8qIENoYXJhY3RlciBjb25zdGFudHMgY2FuIGJlIHVzZWQgKi8KLSAgICAgICAgaWYgKGMgPj0gMTApCi0gICAgICAgICAgICBjID0gYyArICdhJyAtIDEwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjID0gYyArICcwJzsKLSAgICAgICAgKihjaGFyICopcCA9IGM7Ci0gICAgICAgIHArKzsKLSAgICAgICAgbiA9IG4gLyBiOwotICAgICAgICAvKiAnYnJlYWsnIGlzIHN1cHBvcnRlZCAqLwotICAgICAgICBpZiAobiA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHdoaWxlIChwICE9IHRhYikgewotICAgICAgICBwLS07Ci0gICAgICAgIHByaW50ZigiJWMiLCAqKGNoYXIgKilwKTsKLSAgICB9Ci0gICAgZnJlZSh0YWIpOwotfQotCi0vKiAnbWFpbicgdGFrZXMgc3RhbmRhcmQgJ2FyZ2MnIGFuZCAnYXJndicgcGFyYW1ldGVycyAqLwotbWFpbihhcmdjLCBhcmd2KQotewotICAgIC8qIG5vIGxvY2FsIG5hbWUgc3BhY2UgaXMgc3VwcG9ydGVkLCBidXQgbG9jYWwgdmFyaWFibGVzIEFSRQotICAgICAgIHN1cHBvcnRlZC4gQXMgbG9uZyBhcyB5b3UgZG8gbm90IHVzZSBhIGdsb2JhbGx5IGRlZmluZWQKLSAgICAgICB2YXJpYWJsZSBuYW1lIGFzIGxvY2FsIHZhcmlhYmxlICh3aGljaCBpcyBhIGJhZCBoYWJiaXQpLCB5b3UKLSAgICAgICB3b24ndCBoYXZlIGFueSBwcm9ibGVtICovCi0gICAgaW50IHMsIG4sIGYsIGJhc2U7Ci0gICAgCi0gICAgLyogJiYgYW5kIHx8IG9wZXJhdG9yIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIEMgKGxlZnQgdG8gcmlnaHQKLSAgICAgICBldmFsdWF0aW9uIGFuZCBlYXJseSBleGl0KSAqLwotICAgIGlmIChhcmdjICE9IDIgJiYgYXJnYyAhPSAzKSB7Ci0gICAgICAgIC8qICcqJyBvcGVyYXRvciBpcyBzdXBwb3J0ZWQgd2l0aCBleHBsaWNpdCBjYXN0aW5nIHRvICdpbnQgKicsCi0gICAgICAgICAgICdjaGFyIConIG9yICdpbnQgKCopKCknIChmdW5jdGlvbiBwb2ludGVyKS4gT2YgY291cnNlLCAnaW50JwotICAgICAgICAgICBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhcyBwb2ludGVycyB0b28uICovCi0gICAgICAgIHMgPSAqKGludCAqKWFyZ3Y7Ci0gICAgICAgIGhlbHAocyk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAvKiBBbnkgbGliYyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBiZWNhdXNlIE9UQ0MgdXNlcyBkeW5hbWljIGxpbmtpbmcgKi8KLSAgICBuID0gYXRvaSgqKGludCAqKShhcmd2ICsgNCkpOwotICAgIGJhc2UgPSBERUZBVUxUX0JBU0U7Ci0gICAgaWYgKGFyZ2MgPj0gMykgewotICAgICAgICBiYXNlID0gYXRvaSgqKGludCAqKShhcmd2ICsgOCkpOwotICAgICAgICBpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KSB7Ci0gICAgICAgICAgICAvKiBleHRlcm5hbCB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgdG9vIChoZXJlOiAnc3RkZXJyJykgKi8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBiYXNlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiZmliKCVkKSA9ICIsIG4pOwotICAgIHByaW50X251bShmaWIobiksIGJhc2UpOwotICAgIHByaW50ZigiXG4iKTsKLQotICAgIHByaW50ZigiZmFjdCglZCkgPSAiLCBuKTsKLSAgICBpZiAobiA+IDEyKSB7Ci0gICAgICAgIHByaW50ZigiT3ZlcmZsb3ciKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiB3aHkgbm90IHVzaW5nIGEgZnVuY3Rpb24gcG9pbnRlciA/ICovCi0gICAgICAgIGYgPSAmZmFjdDsKLSAgICAgICAgcHJpbnRfbnVtKCgqKGludCAoKikoKSlmKShuKSwgYmFzZSk7Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGJlZm9yZSBiZWluZyBkZWZpbmVkICovCi1oZWxwKG5hbWUpCi17Ci0gICAgcHJpbnRmKCJ1c2FnZTogJXMgbiBbYmFzZV1cbiIsIG5hbWUpOwotICAgIHByaW50ZigiQ29tcHV0ZSBmaWIobikgYW5kIGZhY3QobikgYW5kIG91dHB1dCB0aGUgcmVzdWx0IGluIGJhc2UgJ2Jhc2UnXG4iKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvYnJhY2tldHMuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL2JyYWNrZXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjg4YTIuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvYnJhY2tldHMuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXZvaWQgdGVzdEJyYWNrZXRzKGludCogYXIsIGludCBsZW4pIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgZXJyb3JzID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgYXJbaV0gPSBpOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgaWYgKGFyW2ldICE9IGkpIHsKLSAgICAgICAgICAgIHByaW50ZigiZXJyb3I6IFslZF0gJWQgIT0gJWRcbiIsIGksIGFyW2ldLCBpKTsKLSAgICAgICAgICAgIGVycm9ycysrOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiRXJyb3JzOiAlZFxuIiwgZXJyb3JzKTsKLX0KLQotdm9pZCB0ZXN0QnJhY2tldHMyRChpbnQqKiBhcjJELCBpbnQgbGVuWCwgaW50IGxlblkpIHsKLSAgICBpbnQgeCwgeTsKLSAgICBpbnQgZXJyb3JzID0gMDsKLSAgICBmb3IgKHggPSAwOyB4IDwgbGVuWDsgeCsrKSB7Ci0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBsZW5ZOyB5KyspIHsKLSAgICAgICAgICAgIGFyMkRbeF1beV0gPSB4ICogbGVuWSArIHk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yICh4ID0gMDsgeCA8IGxlblg7IHgrKykgewotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbGVuWTsgeSsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWQgPSB4ICogbGVuWSArIHk7Ci0gICAgICAgICAgICBpbnQgdmFsID0gYXIyRFt4XVt5XTsKLSAgICAgICAgICAgIGlmICh2YWwgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImVycm9yOiBbJWRdWyVkXSAlZCAhPSAlZFxuIiwgeCwgeSwgdmFsLCBleHBlY3RlZCk7Ci0gICAgICAgICAgICAgICAgZXJyb3JzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpbnRmKCIyRCBFcnJvcnM6ICVkXG4iLCBlcnJvcnMpOwotfQotCi12b2lkIHRlc3RIZWFwKCkgewotICAgIGludCogYXIgPSAoaW50KikgbWFsbG9jKDEwMCk7Ci0gICAgdGVzdEJyYWNrZXRzKGFyLCAyNSk7Ci0gICAgZnJlZShhcik7Ci19Ci0KLXZvaWQgdGVzdEhlYXAyRCgpIHsKLSAgICBpbnQgbGVuWCA9IDEwOwotICAgIGludCBsZW5ZID0gNTsKLSAgICBpbnQqIGFyID0gKGludCopIG1hbGxvYyhsZW5YICogbGVuWSAqIDQpOwotICAgIGludCoqIGFyMkQgPSAoaW50KiopIG1hbGxvYyhsZW5YICogNCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbGVuWDsgaSsrKSB7Ci0gICAgICAgIGFyMkRbaV0gPSBhciArIGxlblkgKiBpOwotICAgIH0KLSAgICB0ZXN0QnJhY2tldHMyRChhcjJELCBsZW5YLCBsZW5ZKTsKLSAgICBmcmVlKGFyKTsKLSAgICBmcmVlKGFyMkQpOwotfQotCi1pbnQgbWFpbigpIHsKLSAgICB0ZXN0SGVhcCgpOwotICAgIHRlc3RIZWFwMkQoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2Nhc3RzLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9jYXN0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2E0OWI0Li4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2Nhc3RzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi12b2lkIHRlc3QxKCkgewotICAgIGludCBhID0gMzsKLSAgICBpbnQqIHBiID0gJmE7Ci0gICAgaW50IGMgPSAqcGI7Ci0gICAgcHJpbnRmKCJSZWFkaW5nIGZyb20gYSBwb2ludGVyOiAlZCAlZFxuIiwgYSwgYyk7Ci0gICAgKnBiID0gNDsKLSAgICBwcmludGYoIldyaXRpbmcgdG8gYSBwb2ludGVyOiAlZFxuIiwgYSk7Ci0gICAgcHJpbnRmKCJUZXN0aW5nIGNhc3RzOiAlZCAlZyAlZyAlZFxuIiwgMywgKGZsb2F0KSAzLCA0LjUsIChpbnQpIDQuNSk7Ci19Ci0KLXZvaWQgdGVzdDIoKSB7Ci0gICAgaW50IHggPSA0OwotICAgIGludCBweCA9ICZ4OwotICAgIC8vIGludCB6ID0gKiBweDsgLy8gQW4gZXJyb3IsIGV4cGVjdGVkIGEgcG9pbnRlciB0eXBlCi0gICAgaW50IHkgPSAqIChpbnQqKSBweDsKLSAgICBwcmludGYoIlRlc3RpbmcgcmVhZGluZyAoaW50Kik6ICVkXG4iLCB5KTsKLX0KLQotdm9pZCB0ZXN0MygpIHsKLSAgICBpbnQgcHggPSAoaW50KSBtYWxsb2MoMTIwKTsKLSAgICAqIChpbnQqKSBweCA9IDg7Ci0gICAgKiAoaW50KikgKHB4ICsgNCkgPSA5OwotICAgIHByaW50ZigiVGVzdGluZyB3cml0aW5nIChpbnQqKTogJWQgJWRcbiIsICogKGludCopIHB4LCAqIChpbnQqKSAocHggKyA0KSk7Ci0gICAgZnJlZSgodm9pZCopIHB4KTsKLX0KLQotdm9pZCB0ZXN0NCgpIHsKLSAgICBpbnQgeCA9IDB4MTIzNDU2Nzg7Ci0gICAgaW50IHB4ID0gJng7Ci0gICAgaW50IGEgPSAqIChjaGFyKikgcHg7Ci0gICAgaW50IGIgPSAqIChjaGFyKikgKHB4ICsgMSk7Ci0gICAgaW50IGMgPSAqIChjaGFyKikgKHB4ICsgMik7Ci0gICAgaW50IGQgPSAqIChjaGFyKikgKHB4ICsgMyk7Ci0gICAgcHJpbnRmKCJUZXN0aW5nIHJlYWRpbmcgKGNoYXIqKTogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLCBhLCBiLCBjLCBkKTsKLX0KLQotdm9pZCB0ZXN0NSgpIHsKLSAgICBpbnQgeCA9IDB4RkZGRkZGRkY7Ci0gICAgaW50IHB4ID0gJng7Ci0gICAgKiAoY2hhciopIHB4ID0gMHgyMTsKLSAgICAqIChjaGFyKikgKHB4ICsgMSkgPSAweDQzOwotICAgICogKGNoYXIqKSAocHggKyAyKSA9IDB4NjU7Ci0gICAgKiAoY2hhciopIChweCArIDMpID0gMHg4NzsKLSAgICBwcmludGYoIlRlc3Rpbmcgd3JpdGluZyAoY2hhciopOiAweCUwOHhcbiIsIHgpOwotfQotCi1pbnQgZihpbnQgYikgewotICAgIHByaW50ZigiZiglZClcbiIsIGIpOwotICAgIHJldHVybiA3ICogYjsKLX0KLQotdm9pZCB0ZXN0NigpIHsKLSAgICBpbnQgZnAgPSAmZjsKLSAgICBpbnQgeCA9ICgqKGludCgqKSgpKSBmcCkoMTApOwotICAgIHByaW50ZigiRnVuY3Rpb24gcG9pbnRlciByZXN1bHQ6ICVkXG4iLCB4KTsKLX0KLQotdm9pZCB0ZXN0NygpIHsKLSAgICBpbnQgcHggPSAoaW50KSBtYWxsb2MoMTIwKTsKLSAgICAqIChmbG9hdCopIHB4ID0gOC44ZjsKLSAgICAqIChmbG9hdCopIChweCArIDQpID0gOS45ZjsKLSAgICBwcmludGYoIlRlc3RpbmcgcmVhZC93cml0ZSAoZmxvYXQqKTogJWcgJWdcbiIsICogKGZsb2F0KikgcHgsICogKGZsb2F0KikgKHB4ICsgNCkpOwotICAgIGZyZWUoKHZvaWQqKSBweCk7Ci19Ci0KLXZvaWQgdGVzdDgoKSB7Ci0gICAgaW50IHB4ID0gKGludCkgbWFsbG9jKDEyMCk7Ci0gICAgKiAoZG91YmxlKikgcHggPSA4Ljg7Ci0gICAgKiAoZG91YmxlKikgKHB4ICsgOCkgPSA5Ljk7Ci0gICAgcHJpbnRmKCJUZXN0aW5nIHJlYWQvd3JpdGUgKGRvdWJsZSopOiAlZyAlZ1xuIiwgKiAoZG91YmxlKikgcHgsICogKGRvdWJsZSopIChweCArIDgpKTsKLSAgICBmcmVlKCh2b2lkKikgcHgpOwotfQotCi0KLWludCBtYWluKCkgewotICAgIHRlc3QxKCk7Ci0gICAgdGVzdDIoKTsKLSAgICB0ZXN0MygpOwotICAgIHRlc3Q0KCk7Ci0gICAgdGVzdDUoKTsKLSAgICB0ZXN0NigpOwotICAgIHRlc3Q3KCk7Ci0gICAgdGVzdDgoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2NoYXIuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL2NoYXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2M2JhMi4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9jaGFyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1jaGFyIGdhOwotY2hhciBnYjsKLQotaW50IG1haW4oKSB7Ci0gICAgY2hhciBhID0gJ2MnOwotICAgIGNoYXIgYiA9IGEgKiAzOwotICAgIHByaW50ZigiYSA9ICVkLCBiID0gJWRcbiIsIGEsIGIpOwotICAgIGdhID0gJ2QnOwotICAgIGdiID0gZ2EgKiAzOwotICAgIHByaW50ZigiZ2EgPSAlZCwgZ2IgPSAlZFxuIiwgZ2EsIGdiKTsKLSAgICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvY29tbWEuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL2NvbW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Njk0NGMuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvY29tbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWludCB0ZXN0UmV0dXJuKCkgewotICAgIHJldHVybiAxMCwgMjAsIDMwOwotfQotCi1pbnQgdGVzdEFyZyhpbnQgYSkgewotICAgIHJldHVybiBhOwotfQotCi12b2lkIHRlc3RDb21tYSgpIHsKLSAgICBpbnQgYTsKLSAgICAwLCBhID0gMTAsMjA7Ci0gICAgcHJpbnRmKCJzdGF0ZW1lbnQ6ICVkXG4iLCBhKTsKLSAgICBhID0gMTsKLSAgICBpZiAoYSA9IDAsIDEpIHsKLSAgICAgICAgcHJpbnRmKCJpZjogYSA9ICVkXG4iLCBhKTsKLSAgICB9Ci0gICAgaW50IGIgPSAwOwotICAgIGEgPSAxMDsKLSAgICB3aGlsZShiKyssYS0tKSB7fQotICAgIHByaW50Zigid2hpbGU6IGIgPSAlZFxuIiwgYik7Ci0gICAgYiA9IDA7Ci0gICAgZm9yKGIrKyxhID0gMDtiKyssIGEgPCAxMDsgYisrLCBhKyspIHt9Ci0gICAgcHJpbnRmKCJmb3I6IGIgPSAlZFxuIiwgYik7Ci0gICAgYiA9IHRlc3RSZXR1cm4oKTsKLSAgICBwcmludGYoInJldHVybjogJWRcbiIsIGIpOwotICAgIGIgPSB0ZXN0QXJnKChhLDEyKSk7Ci0gICAgcHJpbnRmKCJhcmc6ICVkXG4iLCBiKTsKLX0KLQotCi0KLWludCBtYWluKCkgewotICAgIHRlc3RDb21tYSgpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvY29uc3RhbnRzLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9jb25zdGFudHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwMTA5YS4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9jb25zdGFudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNkZWZpbmUgRk9PIDB4MTAKLQotaW50IG1haW4oKSB7Ci0gICAgcHJpbnRmKCIwID0gJWRcbiIsIDApOwotICAgIHByaW50ZigiMDEwID0gJWRcbiIsIDAxMCk7Ci0gICAgcHJpbnRmKCIweDEwID0gJWRcbiIsIEZPTyk7Ci0gICAgcHJpbnRmKCInXFxhJyA9ICVkXG4iLCAnXGEnKTsKLSAgICBwcmludGYoIidcXGInID0gJWRcbiIsICdcYicpOwotICAgIHByaW50ZigiJ1xcZicgPSAlZFxuIiwgJ1xmJyk7Ci0gICAgcHJpbnRmKCInXFxuJyA9ICVkXG4iLCAnXG4nKTsKLSAgICBwcmludGYoIidcXHInID0gJWRcbiIsICdccicpOwotICAgIHByaW50ZigiJ1xcdCcgPSAlZFxuIiwgJ1x0Jyk7Ci0gICAgcHJpbnRmKCInXFx2JyA9ICVkXG4iLCAnXHYnKTsKLSAgICAvLyBVbmRlZmluZWQKLSAgICAvLyBwcmludGYoIidcXHonID0gJWRcbiIsICdceicpOwotICAgIHByaW50ZigiJ1xcXFwnID0gJWRcbiIsICdcXCcpOwotICAgIHByaW50ZigiJ1xcJycgPSAlZFxuIiwgJ1wnJyk7Ci0gICAgcHJpbnRmKCInXFxcIicgPSAlZFxuIiwgJ1wiJyk7Ci0gICAgcHJpbnRmKCInXFw/JyA9ICVkXG4iLCAnXD8nKTsKLSAgICBwcmludGYoIidcXDAnID0gJWRcbiIsICdcMCcpOwotICAgIHByaW50ZigiJ1xcMScgPSAlZFxuIiwgJ1wxJyk7Ci0gICAgcHJpbnRmKCInXFwxMicgPSAlZFxuIiwgJ1wxMicpOwotICAgIHByaW50ZigiJ1xcMTIzJyA9ICVkXG4iLCAnXDEyMycpOwotICAgIHByaW50ZigiJ1xceDAnID0gJWRcbiIsICdceDAnKTsKLSAgICBwcmludGYoIidcXHgxJyA9ICVkXG4iLCAnXHgxJyk7Ci0gICAgcHJpbnRmKCInXFx4MTInID0gJWRcbiIsICdceDEyJyk7Ci0gICAgcHJpbnRmKCInXFx4MTIzJyA9ICVkXG4iLCAnXHgxMjMnKTsKLSAgICBwcmludGYoIidcXHgxZicgPSAlZFxuIiwgJ1x4MWYnKTsKLSAgICBwcmludGYoIidcXHgxRicgPSAlZFxuIiwgJ1x4MUYnKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2NvbnRpbnVlLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9jb250aW51ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI4ZTM2Li4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2NvbnRpbnVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1pbnQgbWFpbigpIHsKLSAgICBpbnQgaSwgaiwgc3VtOwotICAgIHN1bSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgaWYgKGkgJiAxKSBjb250aW51ZTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChqICYgMSkgY29udGludWU7Ci0gICAgICAgICAgICBzdW0gKz0gaSAqIGo7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1bTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvZGVmaW5lcy5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvZGVmaW5lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2I2ZjdlLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2RlZmluZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLy8gU2ltcGxlIHRlc3RzIG9mIHRoZSBDIHByZXByb2Nlc3NvcgotCi0jZGVmaW5lIEEgMQotI2RlZmluZSBBICg0IC8gMikKLSNkZWZpbmUgQiAxIC8vIFRoaXMgaXMgYSBjb21tZW50LiBXaXRoIGEgLyBpbiBpdC4KLQotaW50IG1haW4oKSB7Ci0gICAgcmV0dXJuIEEgKyBCOwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvZG91YmxlLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9kb3VibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjMjBhMy4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9kb3VibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotZG91YmxlIGF0b2YoY2hhciAqbnB0cik7Ci0KLWludCBtYWluKCkgewotICAgIHByaW50ZigiVmFsdWUgPSAlZ1xuIiwgYXRvZigiMTAuNDIiKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2Vycm9yLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9lcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTA4ZGNjLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2Vycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXZvaWQgZm9vOwotCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9leHByLWFuc2kuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL2V4cHItYW5zaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDYzNjU5Li4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2V4cHItYW5zaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogVGVzdCBvcGVyYXRvcnMgKi8KLQotdm9pZCB0ZXN0SW5jKCkgeyBpbnQgYSwgYjsgYSA9IDM7IGIgPSBhKys7IHByaW50ZigiMysrID0gJWQgJWRcbiIsIGIsIGEpOyB9Ci12b2lkIHRlc3REZWMoKSB7IGludCBhLCBiOyBhID0gMzsgYiA9IGEtLTsgcHJpbnRmKCIzLS0gPSAlZCAlZFxuIiwgYiwgYSk7IH0KLXZvaWQgdGVzdFRpbWVzKCl7IHByaW50ZigiJWQgKiAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgKiA0KTsgfQotdm9pZCB0ZXN0RGl2KCl7IHByaW50ZigiJWQgLyAlZCA9ICVkXG4iLCAxMSwgNCwgMTEgLyA0KTsgfQotdm9pZCB0ZXN0TW9kKCl7IHByaW50ZigiJWQgJSUgJWQgPSAlZFxuIiwgMTEsIDQsIDExICUgNCk7IH0KLXZvaWQgdGVzdFBsdXMoKXsgcHJpbnRmKCIlZCArICVkID0gJWRcbiIsIDEwLCA0LCAxMCArIDQpOyB9Ci12b2lkIHRlc3RNaW51cygpeyBwcmludGYoIiVkIC0gJWQgPSAlZFxuIiwgMTAsIDQsIDEwIC0gNCk7IH0KLXZvaWQgdGVzdFNoaWZ0TGVmdCgpeyBwcmludGYoIiVkIDw8ICVkID0gJWRcbiIsIDEwLCA0LCAxMCA8PCA0KTsgfQotdm9pZCB0ZXN0U2hpZnRSaWdodCgpeyBwcmludGYoIiVkID4+ICVkID0gJWRcbiIsIDEwMCwgNCwgMTAwID4+IDQpOyB9Ci12b2lkIHRlc3RMZXNzKCl7IHByaW50ZigiJWQgPCAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgPCA0KTsgfQotdm9pZCB0ZXN0TGVzRXF1YWwoKXsgcHJpbnRmKCIlZCA8PSAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgPD0gNCk7IH0KLXZvaWQgdGVzdEdyZWF0ZXIoKXsgcHJpbnRmKCIlZCA+ICVkID0gJWRcbiIsIDEwLCA0LCAxMCA+IDQpOyB9Ci12b2lkIHRlc3RHcmVhdGVyRXF1YWwoKXsgcHJpbnRmKCIlZCA+PSAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgPj0gNCk7IH0KLXZvaWQgdGVzdEVxdWFsVG8oKXsgcHJpbnRmKCIlZCA9PSAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgPT0gNCk7IH0KLXZvaWQgdGVzdE5vdEVxdWFsVG8oKXsgcHJpbnRmKCIlZCAhPSAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgIT0gNCk7IH0KLXZvaWQgdGVzdEJpdEFuZCgpeyBwcmludGYoIiVkICYgJWQgPSAlZFxuIiwgMTAsIDcsIDEwICYgNyk7IH0KLXZvaWQgdGVzdEJpdFhvcigpeyBwcmludGYoIiVkIF4gJWQgPSAlZFxuIiwgMTAsIDcsIDEwIF4gNyk7IH0KLXZvaWQgdGVzdEJpdE9yKCl7IHByaW50ZigiJWQgfCAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgfCA0KTsgfQotdm9pZCB0ZXN0QXNzaWdubWVudCgpeyBpbnQgYSwgYjsgYSA9IDM7IGIgPSBhOyBwcmludGYoImIgPT0gJWRcbiIsIGIpOyB9Ci12b2lkIHRlc3RMb2dpY2FsQW5kKCl7IHByaW50ZigiJWQgJiYgJWQgPSAlZFxuIiwgMTAsIDQsIDEwICYmIDQpOyB9Ci12b2lkIHRlc3RMb2dpY2FsT3IoKXsgcHJpbnRmKCIlZCB8fCAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgfHwgNCk7IH0KLXZvaWQgdGVzdEFkZHJlc3NPZigpeyBpbnQgYTsgcHJpbnRmKCImYSBpcyAlZFxuIiwgJmEpOyB9Ci12b2lkIHRlc3RQb2ludGVySW5kaXJlY3Rpb24oKXsgaW50IGEsIGI7IGEgPSAmYjsgYiA9IDE3OyBwcmludGYoIiolZCAgPSAlZCA9Pz0gJWRcbiIsIGEsICogKGludCopIGEsIGIpOyB9Ci12b2lkIHRlc3ROZWdhdGlvbigpeyBwcmludGYoIi0lZCA9ICVkXG4iLCAxMCwgLTEwKTsgfQotdm9pZCB0ZXN0VW5hcnlQbHVzKCl7IHByaW50ZigiKyVkID0gJWRcbiIsIDEwLCArMTApOyB9Ci12b2lkIHRlc3RVbmFyeU5vdCgpeyBwcmludGYoIiElZCA9ICVkXG4iLCAxMCwgITEwKTsgfQotdm9pZCB0ZXN0Qml0Tm90KCl7IHByaW50ZigifiVkID0gJWRcbiIsIDEwLCB+MTApOyB9Ci0KLWludCBtYWluKGludCBhLCBjaGFyKiogYikgewotICAgIHRlc3RJbmMoKTsKLSAgICB0ZXN0RGVjKCk7Ci0gICAgdGVzdFRpbWVzKCk7Ci0gICAgdGVzdERpdigpOwotICAgIHRlc3RNb2QoKTsKLSAgICB0ZXN0UGx1cygpOwotICAgIHRlc3RNaW51cygpOwotICAgIHRlc3RTaGlmdExlZnQoKTsKLSAgICB0ZXN0U2hpZnRSaWdodCgpOwotICAgIHRlc3RMZXNzKCk7Ci0gICAgdGVzdExlc0VxdWFsKCk7Ci0gICAgdGVzdEdyZWF0ZXIoKTsKLSAgICB0ZXN0R3JlYXRlckVxdWFsKCk7Ci0gICAgdGVzdEVxdWFsVG8oKTsKLSAgICB0ZXN0Tm90RXF1YWxUbygpOwotICAgIHRlc3RCaXRBbmQoKTsKLSAgICB0ZXN0QmluWG9yKCk7Ci0gICAgdGVzdEJpdE9yKCk7Ci0gICAgdGVzdEFzc2lnbm1lbnQoKTsKLSAgICB0ZXN0TG9naWNhbEFuZCgpOwotICAgIHRlc3RMb2dpY2FsT3IoKTsKLSAgICB0ZXN0QWRkcmVzc09mKCk7Ci0gICAgdGVzdFBvaW50ZXJJbmRpcmVjdGlvbigpOwotICAgIHRlc3ROZWdhdGlvbigpOwotICAgIHRlc3RVbmFyeVBsdXMoKTsKLSAgICB0ZXN0VW5hcnlOb3QoKTsKLSAgICB0ZXN0Qml0Tm90KCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9leHByLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9leHByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMmQyZTcuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvZXhwci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogVGVzdCBvcGVyYXRvcnMgKi8KLQotdGVzdEluYygpIHsgaW50IGEsIGI7IGEgPSAzOyBiID0gYSsrOyBwcmludGYoIjMrKyA9ICVkICVkXG4iLCBiLCBhKTsgfQotdGVzdERlYygpIHsgaW50IGEsIGI7IGEgPSAzOyBiID0gYS0tOyBwcmludGYoIjMtLSA9ICVkICVkXG4iLCBiLCBhKTsgfQotdGVzdFRpbWVzKCl7IHByaW50ZigiJWQgKiAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgKiA0KTsgfQotdGVzdERpdigpeyBwcmludGYoIiVkIC8gJWQgPSAlZFxuIiwgMTEsIDQsIDExIC8gNCk7IH0KLXRlc3RNb2QoKXsgcHJpbnRmKCIlZCAlJSAlZCA9ICVkXG4iLCAxMSwgNCwgMTEgJSA0KTsgfQotdGVzdFBsdXMoKXsgcHJpbnRmKCIlZCArICVkID0gJWRcbiIsIDEwLCA0LCAxMCArIDQpOyB9Ci10ZXN0TWludXMoKXsgcHJpbnRmKCIlZCAtICVkID0gJWRcbiIsIDEwLCA0LCAxMCAtIDQpOyB9Ci10ZXN0U2hpZnRMZWZ0KCl7IHByaW50ZigiJWQgPDwgJWQgPSAlZFxuIiwgMTAsIDQsIDEwIDw8IDQpOyB9Ci10ZXN0U2hpZnRSaWdodCgpeyBwcmludGYoIiVkID4+ICVkID0gJWRcbiIsIDEwMCwgNCwgMTAwID4+IDQpOyB9Ci10ZXN0TGVzcygpeyBwcmludGYoIiVkIDwgJWQgPSAlZFxuIiwgMTAsIDQsIDEwIDwgNCk7IH0KLXRlc3RMZXNFcXVhbCgpeyBwcmludGYoIiVkIDw9ICVkID0gJWRcbiIsIDEwLCA0LCAxMCA8PSA0KTsgfQotdGVzdEdyZWF0ZXIoKXsgcHJpbnRmKCIlZCA+ICVkID0gJWRcbiIsIDEwLCA0LCAxMCA+IDQpOyB9Ci10ZXN0R3JlYXRlckVxdWFsKCl7IHByaW50ZigiJWQgPj0gJWQgPSAlZFxuIiwgMTAsIDQsIDEwID49IDQpOyB9Ci10ZXN0RXF1YWxUbygpeyBwcmludGYoIiVkID09ICVkID0gJWRcbiIsIDEwLCA0LCAxMCA9PSA0KTsgfQotdGVzdE5vdEVxdWFsVG8oKXsgcHJpbnRmKCIlZCAhPSAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgIT0gNCk7IH0KLXRlc3RCaXRBbmQoKXsgcHJpbnRmKCIlZCAmICVkID0gJWRcbiIsIDEwLCA3LCAxMCAmIDcpOyB9Ci10ZXN0Qml0WG9yKCl7IHByaW50ZigiJWQgXiAlZCA9ICVkXG4iLCAxMCwgNywgMTAgXiA3KTsgfQotdGVzdEJpdE9yKCl7IHByaW50ZigiJWQgfCAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgfCA0KTsgfQotdGVzdEFzc2lnbm1lbnQoKXsgaW50IGEsIGI7IGEgPSAzOyBiID0gYTsgcHJpbnRmKCJiID09ICVkXG4iLCBiKTsgfQotdGVzdExvZ2ljYWxBbmQoKXsgcHJpbnRmKCIlZCAmJiAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgJiYgNCk7IH0KLXRlc3RMb2dpY2FsT3IoKXsgcHJpbnRmKCIlZCB8fCAlZCA9ICVkXG4iLCAxMCwgNCwgMTAgfHwgNCk7IH0KLXRlc3RBZGRyZXNzT2YoKXsgaW50IGE7IHByaW50ZigiJmEgaXMgJWRcbiIsICZhKTsgfQotdGVzdFBvaW50ZXJJbmRpcmVjdGlvbigpeyBpbnQgYSwgYjsgYSA9ICZiOyBiID0gMTc7IHByaW50ZigiKiVkICA9ICVkID0/PSAlZFxuIiwgYSwgKiAoaW50KikgYSwgYik7IH0KLXRlc3ROZWdhdGlvbigpeyBwcmludGYoIi0lZCA9ICVkXG4iLCAxMCwgLTEwKTsgfQotdGVzdFVuYXJ5UGx1cygpeyBwcmludGYoIislZCA9ICVkXG4iLCAxMCwgKzEwKTsgfQotdGVzdFVuYXJ5Tm90KCl7IHByaW50ZigiISVkID0gJWRcbiIsIDEwLCAhMTApOyB9Ci10ZXN0Qml0Tm90KCl7IHByaW50ZigifiVkID0gJWRcbiIsIDEwLCB+MTApOyB9Ci0KLW1haW4oYSxiKSB7Ci0gICAgdGVzdEluYygpOwotICAgIHRlc3REZWMoKTsKLSAgICB0ZXN0VGltZXMoKTsKLSAgICB0ZXN0RGl2KCk7Ci0gICAgdGVzdE1vZCgpOwotICAgIHRlc3RQbHVzKCk7Ci0gICAgdGVzdE1pbnVzKCk7Ci0gICAgdGVzdFNoaWZ0TGVmdCgpOwotICAgIHRlc3RTaGlmdFJpZ2h0KCk7Ci0gICAgdGVzdExlc3MoKTsKLSAgICB0ZXN0TGVzRXF1YWwoKTsKLSAgICB0ZXN0R3JlYXRlcigpOwotICAgIHRlc3RHcmVhdGVyRXF1YWwoKTsKLSAgICB0ZXN0RXF1YWxUbygpOwotICAgIHRlc3ROb3RFcXVhbFRvKCk7Ci0gICAgdGVzdEJpdEFuZCgpOwotICAgIHRlc3RCaW5Yb3IoKTsKLSAgICB0ZXN0Qml0T3IoKTsKLSAgICB0ZXN0QXNzaWdubWVudCgpOwotICAgIHRlc3RMb2dpY2FsQW5kKCk7Ci0gICAgdGVzdExvZ2ljYWxPcigpOwotICAgIHRlc3RBZGRyZXNzT2YoKTsKLSAgICB0ZXN0UG9pbnRlckluZGlyZWN0aW9uKCk7Ci0gICAgdGVzdE5lZ2F0aW9uKCk7Ci0gICAgdGVzdFVuYXJ5UGx1cygpOwotICAgIHRlc3RVbmFyeU5vdCgpOwotICAgIHRlc3RCaXROb3QoKTsKLSAgICByZXR1cm4gMDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9leHByMi5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvZXhwcjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiNmEzOC4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9leHByMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKiBUZXN0IG9wZXJhdG9ycyAqLwotCi1tYWluKCkgewotICAgIGludCBhOwotICAgIGEgPSBhKys7Ci19CmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9maWxtLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9maWxtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYzJkMzYuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvZmlsbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gVGVzdCBsb2dpY2FsIGFuZCBiaXR3aXNlIEFORCBhbmQgT1IKLQotaW50IHRlc3QoaW50IHgsIGludCB5KSB7Ci0gICAgaW50IHYgPSB4IHx8IHk7Ci0gICAgcmV0dXJuIHY7Ci19Ci0KLWludCB0ZXN0MihpbnQgeCwgaW50IHkpIHsKLSAgICBpZih4IHwgeSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLWludCB0ZXN0MyhpbnQgeCwgaW50IHkpIHsKLSAgICBpbnQgdiA9IHggJiYgeTsKLSAgICByZXR1cm4gdjsKLX0KLQotaW50IHRlc3Q0KGludCB4LCBpbnQgeSkgewotICAgIGlmKHggJiB5KSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotaW50IG1haW4oaW50IGluZGV4KQotewotICAgIGludCB4LHk7Ci0gICAgcHJpbnRmKCJ0ZXN0aW5nLi4uXG4iKTsKLSAgICBpbnQgdG90YWxCYWQgPSAwOwotICAgIGZvcih5ID0gMDsgeSA8IDI7IHkrKykgewotICAgICAgICBmb3IoeCA9IDA7IHggPCAyOyB4KyspIHsKLSAgICAgICAgICAgIGludCBhID0gdGVzdCh4LHkpOwotICAgICAgICAgICAgaW50IGIgPSB0ZXN0Mih4LHkpOwotICAgICAgICAgICAgaWYgKGEgIT0gYikgewotICAgICAgICAgICAgICAgIHByaW50ZigiUmVzdWx0cyBkaWZmZXI6IE9SIHg9JWQgeT0lZCBhPSVkIGI9JWRcbiIsIHgsIHksIGEsIGIpOwotICAgICAgICAgICAgICAgIHRvdGFsQmFkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhID0gdGVzdDMoeCx5KTsKLSAgICAgICAgICAgIGIgPSB0ZXN0NCh4LHkpOwotICAgICAgICAgICAgaWYgKGEgIT0gYikgewotICAgICAgICAgICAgICAgIHByaW50ZigiUmVzdWx0cyBkaWZmZXI6IEFORCB4PSVkIHk9JWQgYT0lZCBiPSVkXG4iLCB4LCB5LCBhLCBiKTsKLSAgICAgICAgICAgICAgICB0b3RhbEJhZCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiVG90YWwgYmFkOiAlZFxuIiwgdG90YWxCYWQpOwotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9mbG9hdC5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvZmxvYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4YjNkMS4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9mbG9hdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotaW50IGZ0b2koZmxvYXQgZikgewotICAgIHJldHVybiBmOwotfQotCi1pbnQgZHRvaShkb3VibGUgZCkgewotICAgIHJldHVybiBkOwotfQotCi1mbG9hdCBpdG9mKGludCBpKSB7Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLWRvdWJsZSBpdG9kKGludCBpKSB7Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLWZsb2F0IGYwLCBmMTsKLWRvdWJsZSBkMCwgZDE7Ci0KLXZvaWQgdGVzdFBhcnNlQ29uc3RzKCkgewotICAgIHByaW50ZigiQ29uc3RhbnRzOiAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZ1xuIiwgMGUxLCAwRTEsIDAuZiwgLjAxZiwKLSAgICAgICAgICAuMDFlMGYsIDEuMGUtMSwgMS4wZTEsIDEuMGUrMSwKLSAgICAgICAgICAuMWYpOwotfQotdm9pZCB0ZXN0VmFycyhmbG9hdCBhcmcwLCBmbG9hdCBhcmcxLCBkb3VibGUgYXJnMiwgZG91YmxlIGFyZzMpIHsKLSAgICBmbG9hdCBsb2NhbDAsIGxvY2FsMTsKLSAgICBkb3VibGUgbG9jYWwyLCBsb2NhbDM7Ci0gICAgZjAgPSBhcmcwOwotICAgIGYxID0gYXJnMTsKLSAgICBkMCA9IGFyZzI7Ci0gICAgZDEgPSBhcmczOwotICAgIGxvY2FsMCA9IGFyZzA7Ci0gICAgbG9jYWwxID0gYXJnMTsKLSAgICBsb2NhbDIgPSBhcmcyOwotICAgIGxvY2FsMyA9IGFyZzM7Ci0gICAgcHJpbnRmKCJnbG9iYWxzOiAlZyAlZyAlZyAlZ1xuIiwgZjAsIGYxLCBkMCwgZDEpOwotICAgIHByaW50ZigiYXJnczogJWcgJWcgJWcgJWdcbiIsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIHByaW50ZigibG9jYWxzOiAlZyAlZyAlZyAlZ1xuIiwgbG9jYWwwLCBsb2NhbDEsIGxvY2FsMiwgbG9jYWwzKTsKLQotCi0gICAgcHJpbnRmKCJjYXN0IHJ2YWw6ICVnICVnXG4iLCAqIChmbG9hdCopICYgZjEsICogKGRvdWJsZSopICYgZDEpOwotCi0gICAgKiAoZmxvYXQqKSAmIGYwID0gMS4xZjsKLSAgICAqIChkb3VibGUqKSAmIGQwID0gMy4zOwotICAgIHByaW50ZigiY2FzdCBsdmFsOiAlZyAlZyAlZyAlZ1xuIiwgZjAsIGYxLCBkMCwgZDEpOwotfQotCi1pbnQgbWFpbigpIHsKLSAgICB0ZXN0UGFyc2VDb25zdHMoKTsKLSAgICBwcmludGYoImludDogJWQgZmxvYXQ6ICVnIGRvdWJsZTogJWdcbiIsIDEsIDIuMmYsIDMuMyk7Ci0gICAgcHJpbnRmKCIgZnRvaSgxLjRmKT0lZFxuIiwgZnRvaSgxLjRmKSk7Ci0gICAgcHJpbnRmKCIgZHRvaSgyLjQpPSVkXG4iLCBkdG9pKDIuNCkpOwotICAgIHByaW50ZigiIGl0b2YoMyk9JWdcbiIsIGl0b2YoMykpOwotICAgIHByaW50ZigiIGl0b2QoNCk9JWdcbiIsIGl0b2QoNCkpOwotICAgIHRlc3RWYXJzKDEuMGYsIDIuMGYsIDMuMCwgNC4wKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2Zsb2F0ZG91YmxlLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9mbG9hdGRvdWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRjNjQxLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2Zsb2F0ZG91YmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWludCBtYWluKCkKLXsKLSAgICAvLyBUZXN0IGNvZXJjaW5nIHZhbHVlcyB3aGVuIHN0b3JpbmcuCi0gICAgZmxvYXQgYSA9IDAuMDAyOwotICAgIGRvdWJsZSBiID0gMC4xZjsKLSAgICBpbnQgYyA9IDEwLjAwMjsKLSAgICBwcmludGYoIiVnICVnICVkXG4iLCBhLCBiLCBjKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2Zsb3BzLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9mbG9wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGIxYjI4Li4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL2Zsb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8gVGVzdCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgotCi12b2lkIHVuYXJ5T3BzKCkgewotICAgIC8vIFVuYXJ5IG9wcwotICAgIHByaW50ZigiLSVnID0gJWdcbiIsIDEuMSwgLTEuMSk7Ci0gICAgcHJpbnRmKCIhJWcgPSAlZFxuIiwgMS4yLCAhMS4yKTsKLSAgICBwcmludGYoIiElZyA9ICVkXG4iLCAwLjAsICEwLjApOwotfQotCi12b2lkIGJpbmFyeU9wcygpIHsKLSAgICBwcmludGYoImRvdWJsZSBvcCBkb3VibGU6XG4iKTsKLSAgICBwcmludGYoIiVnICsgJWcgPSAlZ1xuIiwgMS4wLCAyLjAsIDEuMCArIDIuMCk7Ci0gICAgcHJpbnRmKCIlZyAtICVnID0gJWdcbiIsIDEuMCwgMi4wLCAxLjAgLSAyLjApOwotICAgIHByaW50ZigiJWcgKiAlZyA9ICVnXG4iLCAxLjAsIDIuMCwgMS4wICogMi4wKTsKLSAgICBwcmludGYoIiVnIC8gJWcgPSAlZ1xuIiwgMS4wLCAyLjAsIDEuMCAvIDIuMCk7Ci0KLSAgICBwcmludGYoImZsb2F0IG9wIGZsb2F0OlxuIik7Ci0gICAgcHJpbnRmKCIlZyArICVnID0gJWdcbiIsIDEuMGYsIDIuMGYsIDEuMGYgKyAyLjBmKTsKLSAgICBwcmludGYoIiVnIC0gJWcgPSAlZ1xuIiwgMS4wZiwgMi4wZiwgMS4wZiAtIDIuMGYpOwotICAgIHByaW50ZigiJWcgKiAlZyA9ICVnXG4iLCAxLjBmLCAyLjBmLCAxLjBmICogMi4wZik7Ci0gICAgcHJpbnRmKCIlZyAvICVnID0gJWdcbiIsIDEuMGYsIDIuMGYsIDEuMGYgLyAyLjBmKTsKLQotICAgIHByaW50ZigiZG91YmxlIG9wIGZsb2F0OlxuIik7Ci0gICAgcHJpbnRmKCIlZyArICVnID0gJWdcbiIsIDEuMCwgMi4wZiwgMS4wICsgMi4wZik7Ci0gICAgcHJpbnRmKCIlZyAtICVnID0gJWdcbiIsIDEuMCwgMi4wZiwgMS4wIC0gMi4wZik7Ci0gICAgcHJpbnRmKCIlZyAqICVnID0gJWdcbiIsIDEuMCwgMi4wZiwgMS4wICogMi4wZik7Ci0gICAgcHJpbnRmKCIlZyAvICVnID0gJWdcbiIsIDEuMCwgMi4wZiwgMS4wIC8gMi4wZik7Ci0KLSAgICBwcmludGYoImRvdWJsZSBvcCBpbnQ6XG4iKTsKLSAgICBwcmludGYoIiVnICsgJWQgPSAlZ1xuIiwgMS4wLCAyLCAxLjAgKyAyKTsKLSAgICBwcmludGYoIiVnIC0gJWQgPSAlZ1xuIiwgMS4wLCAyLCAxLjAgLSAyKTsKLSAgICBwcmludGYoIiVnICogJWQgPSAlZ1xuIiwgMS4wLCAyLCAxLjAgKiAyKTsKLSAgICBwcmludGYoIiVnIC8gJWQgPSAlZ1xuIiwgMS4wLCAyLCAxLjAgLyAyKTsKLQotICAgIHByaW50ZigiaW50IG9wIGRvdWJsZTpcbiIpOwotICAgIHByaW50ZigiJWQgKyAlZyA9ICVnXG4iLCAxLCAyLjAsIDEgKyAyLjApOwotICAgIHByaW50ZigiJWQgLSAlZyA9ICVnXG4iLCAxLCAyLjAsIDEgLSAyLjApOwotICAgIHByaW50ZigiJWQgKiAlZyA9ICVnXG4iLCAxLCAyLjAsIDEgKiAyLjApOwotICAgIHByaW50ZigiJWQgLyAlZyA9ICVnXG4iLCAxLCAyLjAsIDEgLyAyLjApOwotfQotCi12b2lkIGNvbXBhcmlzb25UZXN0ZGQoZG91YmxlIGEsIGRvdWJsZSBiKSB7Ci0gICAgcHJpbnRmKCIlZyBvcCAlZzogPCAlZCAgIDw9ICVkICAgPT0gJWQgICA+PSAlZCAgID4gJWQgICAhPSAlZFxuIiwKLSAgICAgICAgICAgYSwgYiwgYSA8IGIsIGEgPD0gYiwgYSA9PSBiLCBhID49IGIsIGEgPiBiLCBhICE9IGIpOwotfQotCi12b2lkIGNvbXBhcmlzb25PcHNkZCgpIHsKLSAgICBwcmludGYoImRvdWJsZSBvcCBkb3VibGU6XG4iKTsKLSAgICBjb21wYXJpc29uVGVzdGRkKDEuMCwgMi4wKTsKLSAgICBjb21wYXJpc29uVGVzdGRkKDEuMCwgMS4wKTsKLSAgICBjb21wYXJpc29uVGVzdGRkKDIuMCwgMS4wKTsKLX0KLQotCi12b2lkIGNvbXBhcmlzb25UZXN0ZGYoZG91YmxlIGEsIGZsb2F0IGIpIHsKLSAgICBwcmludGYoIiVnIG9wICVnOiA8ICVkICAgPD0gJWQgICA9PSAlZCAgID49ICVkICAgPiAlZCAgICE9ICVkXG4iLAotICAgICAgICAgICBhLCBiLCBhIDwgYiwgYSA8PSBiLCBhID09IGIsIGEgPj0gYiwgYSA+IGIsIGEgIT0gYik7Ci19Ci0KLXZvaWQgY29tcGFyaXNvbk9wc2RmKCkgewotICAgIHByaW50ZigiZG91YmxlIG9wIGZsb2F0OlxuIik7Ci0gICAgY29tcGFyaXNvblRlc3RkZigxLjAsIDIuMGYpOwotICAgIGNvbXBhcmlzb25UZXN0ZGYoMS4wLCAxLjBmKTsKLSAgICBjb21wYXJpc29uVGVzdGRmKDIuMCwgMS4wZik7Ci19Ci0KLXZvaWQgY29tcGFyaXNvblRlc3RmZihmbG9hdCBhLCBmbG9hdCBiKSB7Ci0gICAgcHJpbnRmKCIlZyBvcCAlZzogPCAlZCAgIDw9ICVkICAgPT0gJWQgICA+PSAlZCAgID4gJWQgICAhPSAlZFxuIiwKLSAgICAgICAgICAgYSwgYiwgYSA8IGIsIGEgPD0gYiwgYSA9PSBiLCBhID49IGIsIGEgPiBiLCBhICE9IGIpOwotfQotCi12b2lkIGNvbXBhcmlzb25PcHNmZigpIHsKLSAgICBwcmludGYoImZsb2F0IG9wIGZsb2F0OlxuIik7Ci0gICAgY29tcGFyaXNvblRlc3RmZigxLjBmLCAyLjBmKTsKLSAgICBjb21wYXJpc29uVGVzdGZmKDEuMGYsIDEuMGYpOwotICAgIGNvbXBhcmlzb25UZXN0ZmYoMi4wZiwgMS4wZik7Ci19Ci0KLXZvaWQgY29tcGFyaXNvblRlc3RpZChpbnQgYSwgZG91YmxlIGIpIHsKLSAgICBwcmludGYoIiVkIG9wICVnOiA8ICVkICAgPD0gJWQgICA9PSAlZCAgID49ICVkICAgPiAlZCAgICE9ICVkXG4iLAotICAgICAgICAgICBhLCBiLCBhIDwgYiwgYSA8PSBiLCBhID09IGIsIGEgPj0gYiwgYSA+IGIsIGEgIT0gYik7Ci19Ci0KLXZvaWQgY29tcGFyaXNvbk9wc2lkKCkgewotICAgIHByaW50ZigiaW50IG9wIGRvdWJsZTpcbiIpOwotICAgIGNvbXBhcmlzb25UZXN0aWQoMSwgMi4wKTsKLSAgICBjb21wYXJpc29uVGVzdGlkKDEsIDEuMCk7Ci0gICAgY29tcGFyaXNvblRlc3RpZCgyLCAxLjApOwotfQotdm9pZCBjb21wYXJpc29uVGVzdGRpKGRvdWJsZSBhLCBpbnQgYikgewotICAgIHByaW50ZigiJWcgb3AgJWQ6IDwgJWQgICA8PSAlZCAgID09ICVkICAgPj0gJWQgICA+ICVkICAgIT0gJWRcbiIsCi0gICAgICAgICAgIGEsIGIsIGEgPCBiLCBhIDw9IGIsIGEgPT0gYiwgYSA+PSBiLCBhID4gYiwgYSAhPSBiKTsKLX0KLQotdm9pZCBjb21wYXJpc29uT3BzZGkoKSB7Ci0gICAgcHJpbnRmKCJkb3VibGUgb3AgaW50OlxuIik7Ci0gICAgY29tcGFyaXNvblRlc3RkaSgxLjBmLCAyKTsKLSAgICBjb21wYXJpc29uVGVzdGRpKDEuMGYsIDEpOwotICAgIGNvbXBhcmlzb25UZXN0ZGkoMi4wZiwgMSk7Ci19Ci0KLXZvaWQgY29tcGFyaXNvbk9wcygpIHsKLSAgICBjb21wYXJpc29uT3BzZGQoKTsKLSAgICBjb21wYXJpc29uT3BzZGYoKTsKLSAgICBjb21wYXJpc29uT3BzZmYoKTsKLSAgICBjb21wYXJpc29uT3BzaWQoKTsKLSAgICBjb21wYXJpc29uT3BzZGkoKTsKLX0KLQotaW50IGJyYW5jaChkb3VibGUgZCkgewotICAgIGlmIChkKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCB0ZXN0QnJhbmNoaW5nKCkgewotICAgIHByaW50ZigiYnJhbmNoaW5nOiAlZCAlZCAlZFxuIiwgYnJhbmNoKC0xLjApLCBicmFuY2goMC4wKSwgYnJhbmNoKDEuMCkpOwotfQotCi12b2lkIHRlc3RwYXNzaShpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUsIGludCBmLCBpbnQgZywgaW50IGgsIGludCBpLCBpbnQgaiwgaW50IGssIGludCBsKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0cGFzc2k6ICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkXG4iLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKTsKLX0KLQotdm9pZCB0ZXN0cGFzc2YoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCwgZmxvYXQgZSwgZmxvYXQgZiwgZmxvYXQgZywgZmxvYXQgaCwgZmxvYXQgaSwgZmxvYXQgaiwgZmxvYXQgaywgZmxvYXQgbCkgewotICAgIHByaW50ZigidGVzdHBhc3NmOiAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZyAlZ1xuIiwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCk7Ci19Ci0KLXZvaWQgdGVzdHBhc3NkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYsIGRvdWJsZSBnLCBkb3VibGUgaCwgZG91YmxlIGksIGRvdWJsZSBqLCBkb3VibGUgaywgZG91YmxlIGwpIHsKLSAgICBwcmludGYoInRlc3RwYXNzZDogJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWcgJWdcbiIsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpOwotfQotCi12b2lkIHRlc3RwYXNzaWRmKGludCBpLCBkb3VibGUgZCwgZmxvYXQgZikgewotICAgIHByaW50ZigidGVzdHBhc3NpZGY6ICVkICVnICVnXG4iLCBpLCBkLCBmKTsKLX0KLQotdm9pZCB0ZXN0UGFyYW1ldGVyUGFzc2luZygpIHsKLSAgICBmbG9hdCB4OwotICAgIHRlc3RwYXNzaSgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyKTsKLSAgICB0ZXN0cGFzc2YoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMik7Ci0gICAgdGVzdHBhc3NkKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIpOwotICAgIHRlc3RwYXNzaSgxLjBmLCAyLjBmLCAzLjBmLCA0LjBmLCA1LjBmLCA2LjBmLCA3LjBmLCA4LjBmLCA5LjBmLCAxMC4wZiwgMTEuMGYsIDEyLjBmKTsKLSAgICB0ZXN0cGFzc2YoMS4wZiwgMi4wZiwgMy4wZiwgNC4wZiwgNS4wZiwgNi4wZiwgNy4wZiwgOC4wZiwgOS4wZiwgMTAuMGYsIDExLjBmLCAxMi4wZik7Ci0gICAgdGVzdHBhc3NkKDEuMGYsIDIuMGYsIDMuMGYsIDQuMGYsIDUuMGYsIDYuMGYsIDcuMGYsIDguMGYsIDkuMGYsIDEwLjBmLCAxMS4wZiwgMTIuMGYpOwotICAgIHRlc3RwYXNzaSgxLjAsIDIuMCwgMy4wLCA0LjAsIDUuMCwgNi4wLCA3LjAsIDguMCwgOS4wLCAxMC4wLCAxMS4wLCAxMi4wKTsKLSAgICB0ZXN0cGFzc2YoMS4wLCAyLjAsIDMuMCwgNC4wLCA1LjAsIDYuMCwgNy4wLCA4LjAsIDkuMCwgMTAuMCwgMTEuMCwgMTIuMCk7Ci0gICAgdGVzdHBhc3NkKDEuMCwgMi4wLCAzLjAsIDQuMCwgNS4wLCA2LjAsIDcuMCwgOC4wLCA5LjAsIDEwLjAsIDExLjAsIDEyLjApOwotICAgIHRlc3RwYXNzaWRmKDEsIDIuMCwgMy4wZik7Ci19Ci0KLWludCBtYWluKCkgewotICAgIHVuYXJ5T3BzKCk7Ci0gICAgYmluYXJ5T3BzKCk7Ci0gICAgY29tcGFyaXNvbk9wcygpOwotICAgIHRlc3RCcmFuY2hpbmcoKTsKLSAgICB0ZXN0UGFyYW1ldGVyUGFzc2luZygpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvZnVuY2FyZ3MuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL2Z1bmNhcmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkY2UyMjYuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvZnVuY2FyZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotaW50IGYoaW50IGEsaW50LCBpbnQgYykgewotICAgIHJldHVybiBhICsgYzsKLX0KLQotaW50IG1haW4oKSB7Ci0gICAgcmV0dXJuIGYoMSwyLDMpOwotfQotCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9oZWxsby5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvaGVsbG8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1Y2U2Yy4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9oZWxsby5jCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1tYWluKGEsYikgewotICAgIHByaW50ZigiSGVsbG8sIHdvcmxkXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2luYy5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvaW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzA5ZDEuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvaW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vLyBDaGVjayBpbnRlZ2VyIG9wZXJhdGlvbnMKLQotaW50IG1haW4oKSB7Ci0gICAgaW50IGEgPSAwOwotICAgIHByaW50ZigiJWRcbiIsIGErKyk7Ci0gICAgcHJpbnRmKCIlZFxuIiwgYSsrKTsKLSAgICBwcmludGYoIiVkXG4iLCBhLS0pOwotICAgIHByaW50ZigiJWRcbiIsIGEtLSk7Ci0gICAgcHJpbnRmKCIlZFxuIiwgKythKTsKLSAgICBwcmludGYoIiVkXG4iLCArK2EpOwotICAgIHByaW50ZigiJWRcbiIsIC0tYSk7Ci0gICAgcHJpbnRmKCIlZFxuIiwgLS1hKTsKLSAgICByZXR1cm4gYTsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2lvcHMuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL2lvcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwZTk1ZC4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9pb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDaGVjayBpbnRlZ2VyIG9wZXJhdGlvbnMKLQotdm9pZCBsb29wcygpIHsKLSAgICBpbnQgeTsKLSAgICBwcmludGYoIisrXG4iKTsKLSAgICBmb3IoeSA9IDA7IHkgPCAxMDsgeSsrKSB7Ci0gICAgICAgIHByaW50ZigiJWRcbiIsIHkpOwotICAgIH0KLSAgICBwcmludGYoIi0tXG4iKTsKLSAgICBmb3IoeSA9IDEwOyB5ID49IDA7IHktLSkgewotICAgICAgICBwcmludGYoIiVkXG4iLCB5KTsKLSAgICB9Ci19Ci0KLXZvaWQgY2hlY2tMaXRlcmFscygpIHsKLSAgICBwcmludGYoIkxpdGVyYWxzOiAlZCAlZFxuIiwgMSwgLTEpOwotfQotCi1pbnQgbWFpbigpIHsKLSAgICBjaGVja0xpdGVyYWxzKCk7Ci0gICAgbG9vcHMoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL2xvY2Fscy5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvbG9jYWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZWYzNjMuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvbG9jYWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1pbnQgYTsKLQotaW50IGYoKSB7Ci0gICAgaW50IGE7Ci0gICAgLy8gVW5kZWZpbmVkIHZhcmlhYmxlIGIKLSAgICAvLyBwcmludGYoImYgMDogYSA9ICVkIGIgPSAlZFxuIiwgYSwgYik7Ci0gICAgcHJpbnRmKCJmIDA6IGEgPSAlZFxuIiwgYSk7Ci0gICAgYSA9IDI7Ci0gICAgcHJpbnRmKCJmIDE6IGEgPSAlZFxuIiwgYSk7Ci19Ci0KLWludCBnKGludCBhKSB7Ci0gICAgcHJpbnRmKCJnIDA6IGEgPSAlZFxuIiwgYSk7Ci0gICAgYSA9IDM7Ci0gICAgcHJpbnRmKCJnIDE6IGEgPSAlZFxuIiwgYSk7Ci19Ci0KLWludCBoKGludCBhKSB7Ci0gICAgLy8gaW50IGE7IC8vIGdjYyA0LjMgc2F5cyBlcnJvcjogJ2EnIHJlZGVjbGFyZWQgYXMgZGlmZmVyZW50IGtpbmQgb2Ygc3ltYm9sCi0KLSAgICBwcmludGYoImggMDogYSA9ICVkXG4iLCBhKTsKLSAgICBhID0gNDsKLSAgICBwcmludGYoImggMTogYSA9ICVkXG4iLCBhKTsKLX0KLQotLy8gQWxyZWFkeSBkZWZpbmVkIGdsb2JhbCAKLS8vIGludCBoKCkge30KLWludCBnbG9iQ2hlY2soKSB7Ci0gICAgZnByaW50ZihzdGRvdXQsICJnbG9iQ2hlY2soKVxuIik7Ci19Ci0KLWludCBmd2RDaGVjaygpIHsKLSAgICBiKCk7Ci0gICAgLy8gVW5kZWZpbmVkIGZvcndhcmQgcmVmZXJlbmNlCi0gICAgLy8gYygpOwotfQotCi1pbnQgYigpIHsKLSAgICBwcmludGYoImIoKVxuIik7Ci19Ci0KLWludCBuZXN0ZWQoKSB7Ci0gICAgaW50IGE7Ci0gICAgcHJpbnRmKCJuZXN0ZWQgMDogYSA9ICVkXG4iLCBhKTsKLSAgICBhID0gNTA7Ci0gICAgcHJpbnRmKCJuZXN0ZWQgMTogYSA9ICVkXG4iLCBhKTsKLSAgICB7Ci0gICAgICAgIGludCBhOwotICAgICAgICBwcmludGYoIm5lc3RlZCAyOiBhID0gJWRcbiIsIGEpOwotICAgICAgICBhID0gNTE7Ci0gICAgICAgIHByaW50ZigibmVzdGVkIDM6IGEgPSAlZFxuIiwgYSk7Ci0gICAgfQotICAgIHByaW50ZigibmVzdGVkIDQ6IGEgPSAlZFxuIiwgYSk7Ci19Ci0KLWludCBtYWluKCkgewotICAgIGdsb2JDaGVjaygpOwotICAgIGZ3ZENoZWNrKCk7Ci0gICAgcHJpbnRmKCJtYWluIDA6IGEgPSAlZFxuIiwgYSk7Ci0gICAgYSA9IDU7Ci0gICAgcHJpbnRmKCJtYWluIDE6IGEgPSAlZFxuIiwgYSk7Ci0gICAgZigpOwotICAgIHByaW50ZigibWFpbiAyOiBhID0gJWRcbiIsIGEpOwotICAgIGcoNzcpOwotICAgIHByaW50ZigibWFpbiAzOiBhID0gJWRcbiIsIGEpOwotICAgIGgoMzApOwotICAgIHByaW50ZigibWFpbiA0OiBhID0gJWRcbiIsIGEpOwotICAgIG5lc3RlZCgpOwotICAgIHByaW50ZigibWFpbiA1OiBhID0gJWRcbiIsIGEpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvbWFjcm9zLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9tYWNyb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlNTRkYy4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9tYWNyb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNkZWZpbmUgQSBCICsgQgotI2RlZmluZSBCIEMKLQotaW50IG1haW4oKSB7Ci0gICAgaW50IEMgPSAzOwotICAgIHByaW50ZigiQSA9ICVkXG4iLCBBKTsKLSNkZWZpbmUgQyA1Ci0gICAgcHJpbnRmKCJBID0gJWRcbiIsIEEpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvbWlzc2luZy1tYWluLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9taXNzaW5nLW1haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczZWVjNC4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9taXNzaW5nLW1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogTm8gbWFpbi4gKi8KLQotYSgpIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9vdGNjLWFuc2kuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL290Y2MtYW5zaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU4MGU5Li4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL290Y2MtYW5zaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLS8vICNpbmNsdWRlIDxzdGRpby5oPgotaW50IGQsIHosIEMsIGgsIFAsIEssIGFjLCBxLCBHLCB2LCBRLCBSLCBELCBMLCBXLCBNOwotCi12b2lkIEUoaW50IGUpIHsKLSAgICAqKGNoYXIqKSBEKysgPSBlOwotfQotCi12b2lkIG8oKSB7Ci0gICAgaWYgKEwpIHsKLSAgICAgICAgaCA9ICooY2hhciopIEwrKzsKLSAgICAgICAgaWYgKGggPT0gMikgewotICAgICAgICAgICAgTCA9IDA7Ci0gICAgICAgICAgICBoID0gVzsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBoID0gZmdldGMoUSk7Ci19Ci0KLWludCBYKCkgewotICAgIHJldHVybiBpc2FsbnVtKGgpIHwgaCA9PSA5NTsKLX0KLQotdm9pZCBZKCkgewotICAgIGlmIChoID09IDkyKSB7Ci0gICAgICAgIG8oKTsKLSAgICAgICAgaWYgKGggPT0gMTEwKQotICAgICAgICAgICAgaCA9IDEwOwotICAgIH0KLX0KLQotdm9pZCBhZCgpIHsKLSAgICBpbnQgZSwgaiwgbTsKLSAgICB3aGlsZSAoaXNzcGFjZShoKSB8IGggPT0gMzUpIHsKLSAgICAgICAgaWYgKGggPT0gMzUpIHsKLSAgICAgICAgICAgIG8oKTsKLSAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgICAgICBpZiAoZCA9PSA1MzYpIHsKLSAgICAgICAgICAgICAgICBhZCgpOwotICAgICAgICAgICAgICAgIEUoMzIpOwotICAgICAgICAgICAgICAgICooaW50KikgZCA9IDE7Ci0gICAgICAgICAgICAgICAgKihpbnQqKSAoZCArIDQpID0gRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChoICE9IDEwKSB7Ci0gICAgICAgICAgICAgICAgRShoKTsKLSAgICAgICAgICAgICAgICBvKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFKGgpOwotICAgICAgICAgICAgRSgyKTsKLSAgICAgICAgfQotICAgICAgICBvKCk7Ci0gICAgfQotICAgIEMgPSAwOwotICAgIGQgPSBoOwkKLSAgICBpZiAoWCgpKSB7Ci0gICAgICAgIEUoMzIpOwotICAgICAgICBNID0gRDsKLSAgICAgICAgd2hpbGUgKFgoKSkgewotICAgICAgICAgICAgRShoKTsKLSAgICAgICAgICAgIG8oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNkaWdpdChkKSkgewotICAgICAgICAgICAgeiA9IHN0cnRvbChNLCAwLCAwKTsKLSAgICAgICAgICAgIGQgPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKihjaGFyKikgRCA9IDMyOwotICAgICAgICAgICAgZCA9IHN0cnN0cihSLCBNIC0gMSkgLSBSOwotICAgICAgICAgICAgKihjaGFyKikgRCA9IDA7Ci0gICAgICAgICAgICBkID0gZCAqIDggKyAyNTY7Ci0gICAgICAgICAgICBpZiAoZCA+IDUzNikgewotICAgICAgICAgICAgICAgIGQgPSBQICsgZDsKLSAgICAgICAgICAgICAgICBpZiAoKihpbnQqKSBkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgTCA9ICooaW50KikgKGQgKyA0KTsKLSAgICAgICAgICAgICAgICAgICAgVyA9IGg7Ci0gICAgICAgICAgICAgICAgICAgIG8oKTsKLSAgICAgICAgICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBvKCk7Ci0gICAgICAgIGlmIChkID09IDM5KSB7Ci0gICAgICAgICAgICBkID0gMjsKLSAgICAgICAgICAgIFkoKTsKLSAgICAgICAgICAgIHogPSBoOwotICAgICAgICAgICAgbygpOwotICAgICAgICAgICAgbygpOwotICAgICAgICB9IGVsc2UgaWYgKGQgPT0gNDcgJiBoID09IDQyKSB7Ci0gICAgICAgICAgICBvKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChoICE9IDQyKQotICAgICAgICAgICAgICAgICAgICBvKCk7Ci0gICAgICAgICAgICAgICAgbygpOwotICAgICAgICAgICAgICAgIGlmIChoID09IDQ3KQotICAgICAgICAgICAgICAgICAgICBoID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG8oKTsKLSAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlCi0gICAgICAgICAgICAgICAgICAgID0gIisrI20tLSVhbSpAUjxeMWMvQCVbX1tIM2MlQCVbX1tIM2MrQC5CI2QtQCU6X15CS2Q8PFovMDNlPj5gLzAzZTw9MGY+PS9mPEAuZj5AMWY9PSZnIT0nZyYma3x8I2wmQC5CQ2heQC5CU2l8QC5CK2p+QC8lWWQhQCZkKkBiIjsKLSAgICAgICAgICAgIHdoaWxlIChqID0gKihjaGFyKikgZSsrKSB7Ci0gICAgICAgICAgICAgICAgbSA9ICooY2hhciopIGUrKzsKLSAgICAgICAgICAgICAgICB6ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKEMgPSAqKGNoYXIqKSBlKysgLSA5OCkgPCAwKQotICAgICAgICAgICAgICAgICAgICB6ID0geiAqIDY0ICsgQyArIDY0OwotICAgICAgICAgICAgICAgIGlmIChqID09IGQgJiAobSA9PSBoIHwgbSA9PSA2NCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGFlKGludCBnKSB7Ci0gICAgd2hpbGUoIGcmJmchPS0xKSB7Ci0gICAgICAgICooY2hhciopIHErKz1nOwotICAgICAgICBnPWc+Pjg7Ci0gICAgfQotfQotCi12b2lkIEEoaW50IGUpIHsKLSAgICBpbnQgZzsKLSAgICB3aGlsZSggZSkgewotICAgICAgICBnPSooaW50KikgZTsKLSAgICAgICAgKihpbnQqKSBlPXEtZS00OwotICAgICAgICBlPWc7Ci0gICAgfQotfQotCi1pbnQgcyhpbnQgZywgaW50IGUpIHsKLSAgICBhZShnKTsKLSAgICAqKGludCopIHEgPSBlOwotICAgIGUgPSBxOwotICAgIHEgPSBxICsgNDsKLSAgICByZXR1cm4gZTsKLX0KLQotdm9pZCBIKGludCBlKSB7Ci0gICAgcygxODQsZSk7Ci19Ci0KLWludCBCKGludCBlKSB7Ci0gICAgcmV0dXJuIHMoMjMzLGUpOwotfQotCi1pbnQgUyhpbnQgaiwgaW50IGUpIHsKLSAgICBhZSgxMDMyMzI1KTsKLSAgICByZXR1cm4gcygxMzIgKyBqLCBlKTsKLX0KLQotdm9pZCBaKGludCBlKSB7Ci0gICAgYWUoIDQ5NDY1KTsKLSAgICBIKDApOwotICAgIGFlKCAxNSk7Ci0gICAgYWUoIGUrMTQ0KTsKLSAgICBhZSggMTkyKTsKLX0KLQotdm9pZCBOKGludCBqLCBpbnQgZSkgewotICAgIGFlKGogKyAxMzEpOwotICAgIHMoKGUgPiAtNTEyICYmIGUgPCA1MTIpIDw8IDcgfCA1LCBlKTsKLX0KLQotdm9pZCBUIChpbnQgaikgewotICAgIGludCBnLGUsbSxhYTsKLSAgICBnPTE7Ci0gICAgaWYoIGQgPT0gMzQpIHsKLSAgICAgICAgSCh2KTsKLSAgICAgICAgd2hpbGUoIGghPTM0KSB7Ci0gICAgICAgICAgICBZICgpOwotICAgICAgICAgICAgKihjaGFyKikgdisrPWg7Ci0gICAgICAgICAgICBvICgpOwotICAgICAgICB9Ci0gICAgICAgICooY2hhciopIHY9MDsKLSAgICAgICAgdj12ICs0Ji00OwotICAgICAgICBvICgpOwotICAgICAgICBhZCgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYWE9QzsKLSAgICAgICAgbT0gejsKLSAgICAgICAgZT1kOwotICAgICAgICBhZCgpOwotICAgICAgICBpZiggZSA9PSAyKSB7Ci0gICAgICAgICAgICBIKG0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGFhID09IDIpIHsKLSAgICAgICAgICAgIFQoMCk7Ci0gICAgICAgICAgICBzKDE4NSwwKTsKLSAgICAgICAgICAgIGlmKCBlID09IDMzKVoobSk7Ci0gICAgICAgICAgICBlbHNlIGFlKCBtKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBlID09IDQwKSB7Ci0gICAgICAgICAgICB3ICgpOwotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBlID09IDQyKSB7Ci0gICAgICAgICAgICBhZCgpOwotICAgICAgICAgICAgZT1kOwotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgICAgICBpZiggZCA9PSA0MikgewotICAgICAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgICAgICBhZCgpOwotICAgICAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgICAgICAgICAgZT0wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgIFQoMCk7Ci0gICAgICAgICAgICBpZiggZCA9PSA2MSkgewotICAgICAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgICAgICAgICAgYWUoIDgwKTsKLSAgICAgICAgICAgICAgICB3ICgpOwotICAgICAgICAgICAgICAgIGFlKCA4OSk7Ci0gICAgICAgICAgICAgICAgYWUoIDM5MisoZSA9PSAyNTYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGUpIHsKLSAgICAgICAgICAgICAgICBpZiggZSA9PSAyNTYpYWUoIDEzOSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBhZSggNDg2NTUpOwotICAgICAgICAgICAgICAgIHErKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBlID09IDM4KSB7Ci0gICAgICAgICAgICBOKDEwLCooaW50KikgZCk7Ci0gICAgICAgICAgICBhZCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZz0qKGludCopIGU7Ci0gICAgICAgICAgICBpZighZylnPWRsc3ltKDAsTSk7Ci0gICAgICAgICAgICBpZiggZCA9PSA2MSZqKSB7Ci0gICAgICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgICAgICB3ICgpOwotICAgICAgICAgICAgICAgIE4oNixnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGQhPSA0MCkgewotICAgICAgICAgICAgICAgIE4oOCxnKTsKLSAgICAgICAgICAgICAgICBpZiggQyA9PSAxMSkgewotICAgICAgICAgICAgICAgICAgICBOKDAsZyk7Ci0gICAgICAgICAgICAgICAgICAgIGFlKCB6KTsKLSAgICAgICAgICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIGQgPT0gNDApIHsKLSAgICAgICAgaWYoIGcgPT0gMSlhZSggODApOwotICAgICAgICBtPSBzKDYwNTQ1LDApOwotICAgICAgICBhZCgpOwotICAgICAgICBqPTA7Ci0gICAgICAgIHdoaWxlKCBkIT0gNDEpIHsKLSAgICAgICAgICAgIHcgKCk7Ci0gICAgICAgICAgICBzKDIzOTMyMjUsaik7Ci0gICAgICAgICAgICBpZiggZCA9PSA0NClhZCgpOwotICAgICAgICAgICAgaj1qICs0OwotICAgICAgICB9Ci0gICAgICAgICooaW50KikgbT0gajsKLSAgICAgICAgYWQoKTsKLSAgICAgICAgaWYoIWcpIHsKLSAgICAgICAgICAgIGU9ZSArNDsKLSAgICAgICAgICAgICooaW50KikgZT1zKDIzMiwqKGludCopIGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGcgPT0gMSkgewotICAgICAgICAgICAgcygyMzk3NDM5LGopOwotICAgICAgICAgICAgaj1qICs0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcygyMzIsZy1xLTUpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBqKXMoNTAzMDUsaik7Ci0gICAgfQotfQotCi12b2lkIE8gKGludCBqKSB7Ci0gICAgaW50IGUsZyxtOwotICAgIGlmKCBqLS09PSAxKVQoMSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIE8gKGopOwotICAgICAgICBtPSAwOwotICAgICAgICB3aGlsZSggaiA9PSBDKSB7Ci0gICAgICAgICAgICBnPWQ7Ci0gICAgICAgICAgICBlPXo7Ci0gICAgICAgICAgICBhZCgpOwotICAgICAgICAgICAgaWYoIGo+OCkgewotICAgICAgICAgICAgICAgIG09IFMoZSxtKTsKLSAgICAgICAgICAgICAgICBPIChqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFlKCA4MCk7Ci0gICAgICAgICAgICAgICAgTyAoaik7Ci0gICAgICAgICAgICAgICAgYWUoIDg5KTsKLSAgICAgICAgICAgICAgICBpZiggaiA9PSA0fGogPT0gNSkgewotICAgICAgICAgICAgICAgICAgICBaKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWUoIGUpOwotICAgICAgICAgICAgICAgICAgICBpZiggZyA9PSAzNylhZSggMTQ2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIG0mJmo+OCkgewotICAgICAgICAgICAgbT0gUyhlLG0pOwotICAgICAgICAgICAgSChlXjEpOwotICAgICAgICAgICAgQig1KTsKLSAgICAgICAgICAgIEEobSk7Ci0gICAgICAgICAgICBIKGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIHcoKSB7Ci0gICAgTygxMSk7Ci19Ci0KLWludCBVKCkgewotICAgIHcoKTsKLSAgICByZXR1cm4gUygwLCAwKTsKLX0KLQotdm9pZCBJIChpbnQgaikgewotICAgIGludCBtLGcsZTsKLSAgICBpZiggZCA9PSAyODgpIHsKLSAgICAgICAgYWQoKTsKLSAgICAgICAgYWQoKTsKLSAgICAgICAgbT0gVSAoKTsKLSAgICAgICAgYWQoKTsKLSAgICAgICAgSSAoaik7Ci0gICAgICAgIGlmKCBkID09IDMxMikgewotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgIGc9QigwKTsKLSAgICAgICAgICAgIEEobSk7Ci0gICAgICAgICAgICBJIChqKTsKLSAgICAgICAgICAgIEEoZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBBKG0pOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoIGQgPT0gMzUyfGQgPT0gNTA0KSB7Ci0gICAgICAgIGU9ZDsKLSAgICAgICAgYWQoKTsKLSAgICAgICAgYWQoKTsKLSAgICAgICAgaWYoIGUgPT0gMzUyKSB7Ci0gICAgICAgICAgICBnPXE7Ci0gICAgICAgICAgICBtPSBVICgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYoIGQhPSA1OSl3ICgpOwotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgIGc9cTsKLSAgICAgICAgICAgIG09IDA7Ci0gICAgICAgICAgICBpZiggZCE9IDU5KW09IFUgKCk7Ci0gICAgICAgICAgICBhZCgpOwotICAgICAgICAgICAgaWYoIGQhPSA0MSkgewotICAgICAgICAgICAgICAgIGU9QigwKTsKLSAgICAgICAgICAgICAgICB3ICgpOwotICAgICAgICAgICAgICAgIEIoZy1xLTUpOwotICAgICAgICAgICAgICAgIEEoZSk7Ci0gICAgICAgICAgICAgICAgZz1lICs0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFkKCk7Ci0gICAgICAgIEkoJm0pOwotICAgICAgICBCKGctcS01KTsKLSAgICAgICAgQShtKTsKLSAgICB9Ci0gICAgZWxzZSBpZiggZCA9PSAxMjMpIHsKLSAgICAgICAgYWQoKTsKLSAgICAgICAgYWIoMSk7Ci0gICAgICAgIHdoaWxlKCBkIT0gMTI1KUkgKGopOwotICAgICAgICBhZCgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYoIGQgPT0gNDQ4KSB7Ci0gICAgICAgICAgICBhZCgpOwotICAgICAgICAgICAgaWYoIGQhPSA1OSl3ICgpOwotICAgICAgICAgICAgSz1CKEspOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGQgPT0gNDAwKSB7Ci0gICAgICAgICAgICBhZCgpOwotICAgICAgICAgICAgKihpbnQqKSBqPUIoKihpbnQqKSBqKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBkIT0gNTkpdyAoKTsKLSAgICAgICAgYWQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgYWIgKGludCBqKSB7Ci0gICAgaW50IG07Ci0gICAgd2hpbGUoIGQgPT0gMjU2fGQhPS0xJiFqKSB7Ci0gICAgICAgIGlmKCBkID09IDI1NikgewotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgIHdoaWxlKCBkIT0gNTkpIHsKLSAgICAgICAgICAgICAgICBpZiggaikgewotICAgICAgICAgICAgICAgICAgICBHPUcgKzQ7Ci0gICAgICAgICAgICAgICAgICAgICooaW50KikgZD0tRzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICooaW50KikgZD12OwotICAgICAgICAgICAgICAgICAgICB2PXYgKzQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgICAgICAgICAgaWYoIGQgPT0gNDQpYWQoKQk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgQSgqKGludCopKGQgKzQpKTsKLSAgICAgICAgICAgICooaW50KikgZD1xOwotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgIGFkKCk7Ci0gICAgICAgICAgICBtPSA4OwotICAgICAgICAgICAgd2hpbGUoIGQhPSA0MSkgewotICAgICAgICAgICAgICAgICooaW50KikgZD1tOwotICAgICAgICAgICAgICAgIG09IG0gKzQ7Ci0gICAgICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgICAgICBpZiggZCA9PSA0NClhZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWQoKTsKLSAgICAgICAgICAgIEs9Rz0wOwotICAgICAgICAgICAgYWUoIDE1MDQyOTAxKTsKLSAgICAgICAgICAgIG09IHMoNjA1NDUsMCk7Ci0gICAgICAgICAgICBJKDApOwotICAgICAgICAgICAgQShLKTsKLSAgICAgICAgICAgIGFlKCA1MDEyMSk7Ci0gICAgICAgICAgICAqKGludCopIG09IEc7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBydW4oaW50IGcsIGludCBlKSB7Ci0gICAgcmV0dXJuICgqKGludCgqKSgpKSAqKGludCopIChQICsgNTkyKSkoZywgZSk7Ci19Ci0KLWludCBtYWluKGludCBnLCBpbnQgZSkgewotICAgIGludCByZXN1bHQ7Ci0gICAgUSA9IHN0ZGluOwotICAgIGlmIChnLS0gPiAxKSB7Ci0gICAgICAgIGUgPSBlICsgNDsKLSAgICAgICAgUSA9IGZvcGVuKCooaW50KikgZSwgInIiKTsKLSAgICAgICAgaWYgKCFRKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm90Y2MtYW5zaS5jOiBjb3VsZCBub3Qgb3BlbiBmaWxlICVzXG4iLCAqKGludCopIGUpOwotICAgICAgICAgICAgcmV0dXJuIC0yOwotICAgICAgICB9Ci0gICAgfQotICAgIEQgPSBzdHJjcHkoUiA9IGNhbGxvYygxLCA5OTk5OSksICIgaW50IGlmIGVsc2Ugd2hpbGUgYnJlYWsgcmV0dXJuIGZvciBkZWZpbmUgbWFpbiAiKSArIDQ4OwotICAgIHYgPSBjYWxsb2MoMSwgOTk5OTkpOwotICAgIHEgPSBhYyA9IGNhbGxvYygxLCA5OTk5OSk7Ci0gICAgUCA9IGNhbGxvYygxLCA5OTk5OSk7Ci0gICAgbygpOwotICAgIGFkKCk7Ci0gICAgYWIoMCk7Ci0gICAgaWYgKG1wcm90ZWN0KGFjICYgKH4gNDA5NSksICg5OTk5OSArIDQwOTUpICYgKH4gNDA5NSksIDcpKSB7Ci0gICAgICAgIHByaW50ZigiTXByb3RlY3QgZmFpbGVkLiAlZFxuIiwgZXJybm8pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAib3RjYy1hbnNpLmM6IEFib3V0IHRvIGV4ZWN1dGUgY29tcGlsZWQgY29kZTpcbiIpOwotICAgIHJlc3VsdCA9IHJ1bihnLCBlKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImF0Y2MtYW5zaS5jOiByZXN1bHQ6ICVkXG4iLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL290Y2Mtbm9pbmNsdWRlLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9vdGNjLW5vaW5jbHVkZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzBmOWUyLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL290Y2Mtbm9pbmNsdWRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLy8gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIGsgKihpbnQqKQotI2RlZmluZSBhIGlmKAotI2RlZmluZSBjIGFkKCkKLSNkZWZpbmUgaSBlbHNlCi0jZGVmaW5lIHAgd2hpbGUoCi0jZGVmaW5lIHggKihjaGFyKikKLSNkZWZpbmUgYiA9PQotI2RlZmluZSBWID1jYWxsb2MoMSw5OTk5OSkKLSNkZWZpbmUgZiAoKQotI2RlZmluZSBKIHJldHVybgotI2RlZmluZSBsIGFlKAotI2RlZmluZSBuIGUpCi0jZGVmaW5lIHUgZCE9Ci0jZGVmaW5lIEYgaW50IAotI2RlZmluZSB5IChqKQotI2RlZmluZSByIG09Ci0jZGVmaW5lIHQgKzQKLUYgZCx6LEMsaCxQLEssYWMscSxHLHYsUSxSLEQsTCxXLE07Ci1FKG57Ci14IEQrKz1lOwotfQotbyBmewotYSBMKXsKLWg9eCBMKys7Ci1hIGggYiAyKXsKLUw9MDsKLWg9VzsKLX0KLX0KLWkgaD1mZ2V0YyhRKTsKLX0KLVggZnsKLUogaXNhbG51bShoKXxoIGIgOTU7Ci19Ci1ZIGZ7Ci1hIGggYiA5Mil7Ci1vIGY7Ci1hIGggYiAxMTApaD0xMDsKLX0KLX0KLWN7Ci1GIGUsaixtOwotcCBpc3NwYWNlKGgpfGggYiAzNSl7Ci1hIGggYiAzNSl7Ci1vIGY7Ci1jOwotYSBkIGIgNTM2KXsKLWM7Ci1FKDMyKTsKLWsgZD0xOwotayhkIHQpPUQ7Ci19Ci1wIGghPTEwKXsKLUUoaCk7Ci1vIGY7Ci19Ci1FKGgpOwotRSgyKTsKLX0KLW8gZjsKLX0KLUM9MDsKLWQ9aDsKLWEgWCBmKXsKLUUoMzIpOwotTT1EOwotcCBYIGYpewotRShoKTsKLW8gZjsKLX0KLWEgaXNkaWdpdChkKSl7Ci16PXN0cnRvbChNLDAsMCk7Ci1kPTI7Ci19Ci1pewoteCBEPTMyOwotZD1zdHJzdHIoUixNLTEpLVI7Ci14IEQ9MDsKLWQ9ZCo4KzI1NjsKLWEgZD41MzYpewotZD1QK2Q7Ci1hIGsgZCBiIDEpewotTD1rKGQgdCk7Ci1XPWg7Ci1vIGY7Ci1jOwotfQotfQotfQotfQotaXsKLW8gZjsKLWEgZCBiIDM5KXsKLWQ9MjsKLVkgZjsKLXo9aDsKLW8gZjsKLW8gZjsKLX0KLWkgYSBkIGIgNDcmaCBiIDQyKXsKLW8gZjsKLXAgaCl7Ci1wIGghPTQyKW8gZjsKLW8gZjsKLWEgaCBiIDQ3KWg9MDsKLX0KLW8gZjsKLWM7Ci19Ci1pewotZT0iKysjbS0tJWFtKkBSPF4xYy9AJVtfW0gzYyVAJVtfW0gzYytALkIjZC1AJTpfXkJLZDw8Wi8wM2U+PmAvMDNlPD0wZj49L2Y8QC5mPkAxZj09JmchPSdnJiZrfHwjbCZALkJDaF5ALkJTaXxALkIran5ALyVZZCFAJmQqQGIiOwotcCBqPXggZSsrKXsKLXIgeCBlKys7Ci16PTA7Ci1wKEM9eCBlKystOTgpPDApej16KjY0K0MrNjQ7Ci1hIGogYiBkJihtIGIgaHxtIGIgNjQpKXsKLWEgbSBiIGgpewotbyBmOwotZD0xOwotfQotYnJlYWs7Ci19Ci19Ci19Ci19Ci19Ci1sIGcpewotcCBnJiZnIT0tMSl7Ci14IHErKz1nOwotZz1nPj44OwotfQotfQotQShuewotRiBnOwotcCBuewotZz1rIGU7Ci1rIGU9cS1lLTQ7Ci1lPWc7Ci19Ci19Ci1zKGcsbnsKLWwgZyk7Ci1rIHE9ZTsKLWU9cTsKLXE9cSB0OwotSiBlOwotfQotSChuewotcygxODQsbjsKLX0KLUIobnsKLUogcygyMzMsbjsKLX0KLVMoaixuewotbCAxMDMyMzI1KTsKLUogcygxMzIraixuOwotfQotWihuewotbCA0OTQ2NSk7Ci1IKDApOwotbCAxNSk7Ci1sIGUrMTQ0KTsKLWwgMTkyKTsKLX0KLU4oaixuewotbCBqKzEzMSk7Ci1zKChlPDUxMik8PDd8NSxuOwotfQotVCB5ewotRiBnLGUsbSxhYTsKLWc9MTsKLWEgZCBiIDM0KXsKLUgodik7Ci1wIGghPTM0KXsKLVkgZjsKLXggdisrPWg7Ci1vIGY7Ci19Ci14IHY9MDsKLXY9diB0Ji00OwotbyBmOwotYzsKLX0KLWl7Ci1hYT1DOwotciB6OwotZT1kOwotYzsKLWEgZSBiIDIpewotSChtKTsKLX0KLWkgYSBhYSBiIDIpewotVCgwKTsKLXMoMTg1LDApOwotYSBlIGIgMzMpWihtKTsKLWkgbCBtKTsKLX0KLWkgYSBlIGIgNDApewotdyBmOwotYzsKLX0KLWkgYSBlIGIgNDIpewotYzsKLWU9ZDsKLWM7Ci1jOwotYSBkIGIgNDIpewotYzsKLWM7Ci1jOwotYzsKLWU9MDsKLX0KLWM7Ci1UKDApOwotYSBkIGIgNjEpewotYzsKLWwgODApOwotdyBmOwotbCA4OSk7Ci1sIDM5MisoZSBiIDI1NikpOwotfQotaSBhIG57Ci1hIGUgYiAyNTYpbCAxMzkpOwotaSBsIDQ4NjU1KTsKLXErKzsKLX0KLX0KLWkgYSBlIGIgMzgpewotTigxMCxrIGQpOwotYzsKLX0KLWl7Ci1nPWsgZTsKLWEhZylnPWRsc3ltKDAsTSk7Ci1hIGQgYiA2MSZqKXsKLWM7Ci13IGY7Ci1OKDYsZyk7Ci19Ci1pIGEgdSA0MCl7Ci1OKDgsZyk7Ci1hIEMgYiAxMSl7Ci1OKDAsZyk7Ci1sIHopOwotYzsKLX0KLX0KLX0KLX0KLWEgZCBiIDQwKXsKLWEgZyBiIDEpbCA4MCk7Ci1yIHMoNjA1NDUsMCk7Ci1jOwotaj0wOwotcCB1IDQxKXsKLXcgZjsKLXMoMjM5MzIyNSxqKTsKLWEgZCBiIDQ0KWM7Ci1qPWogdDsKLX0KLWsgciBqOwotYzsKLWEhZyl7Ci1lPWUgdDsKLWsgZT1zKDIzMixrIG47Ci19Ci1pIGEgZyBiIDEpewotcygyMzk3NDM5LGopOwotaj1qIHQ7Ci19Ci1pewotcygyMzIsZy1xLTUpOwotfQotYSBqKXMoNTAzMDUsaik7Ci19Ci19Ci1PIHl7Ci1GIGUsZyxtOwotYSBqLS1iIDEpVCgxKTsKLWl7Ci1PIHk7Ci1yIDA7Ci1wIGogYiBDKXsKLWc9ZDsKLWU9ejsKLWM7Ci1hIGo+OCl7Ci1yIFMoZSxtKTsKLU8geTsKLX0KLWl7Ci1sIDgwKTsKLU8geTsKLWwgODkpOwotYSBqIGIgNHxqIGIgNSl7Ci1aKG47Ci19Ci1pewotbCBuOwotYSBnIGIgMzcpbCAxNDYpOwotfQotfQotfQotYSBtJiZqPjgpewotciBTKGUsbSk7Ci1IKGVeMSk7Ci1CKDUpOwotQShtKTsKLUgobjsKLX0KLX0KLX0KLXcgZnsKLU8oMTEpOwotfQotVSBmewotdyBmOwotSiBTKDAsMCk7Ci19Ci1JIHl7Ci1GIG0sZyxlOwotYSBkIGIgMjg4KXsKLWM7Ci1jOwotciBVIGY7Ci1jOwotSSB5OwotYSBkIGIgMzEyKXsKLWM7Ci1nPUIoMCk7Ci1BKG0pOwotSSB5OwotQShnKTsKLX0KLWl7Ci1BKG0pOwotfQotfQotaSBhIGQgYiAzNTJ8ZCBiIDUwNCl7Ci1lPWQ7Ci1jOwotYzsKLWEgZSBiIDM1Mil7Ci1nPXE7Ci1yIFUgZjsKLX0KLWl7Ci1hIHUgNTkpdyBmOwotYzsKLWc9cTsKLXIgMDsKLWEgdSA1OSlyIFUgZjsKLWM7Ci1hIHUgNDEpewotZT1CKDApOwotdyBmOwotQihnLXEtNSk7Ci1BKG47Ci1nPWUgdDsKLX0KLX0KLWM7Ci1JKCZtKTsKLUIoZy1xLTUpOwotQShtKTsKLX0KLWkgYSBkIGIgMTIzKXsKLWM7Ci1hYigxKTsKLXAgdSAxMjUpSSB5OwotYzsKLX0KLWl7Ci1hIGQgYiA0NDgpewotYzsKLWEgdSA1OSl3IGY7Ci1LPUIoSyk7Ci19Ci1pIGEgZCBiIDQwMCl7Ci1jOwotayBqPUIoayBqKTsKLX0KLWkgYSB1IDU5KXcgZjsKLWM7Ci19Ci19Ci1hYiB5ewotRiBtOwotcCBkIGIgMjU2fHUtMSYhail7Ci1hIGQgYiAyNTYpewotYzsKLXAgdSA1OSl7Ci1hIGopewotRz1HIHQ7Ci1rIGQ9LUc7Ci19Ci1pewotayBkPXY7Ci12PXYgdDsKLX0KLWM7Ci1hIGQgYiA0NCljOwotfQotYzsKLX0KLWl7Ci1BKGsoZCB0KSk7Ci1rIGQ9cTsKLWM7Ci1jOwotciA4OwotcCB1IDQxKXsKLWsgZD1tOwotciBtIHQ7Ci1jOwotYSBkIGIgNDQpYzsKLX0KLWM7Ci1LPUc9MDsKLWwgMTUwNDI5MDEpOwotciBzKDYwNTQ1LDApOwotSSgwKTsKLUEoSyk7Ci1sIDUwMTIxKTsKLWsgciBHOwotfQotfQotfQotbWFpbihnLG57Ci1RPXN0ZGluOwotYSBnLS0+MSl7Ci1lPWUgdDsKLVE9Zm9wZW4oayBlLCJyIik7Ci19Ci1EPXN0cmNweShSIFYsIiBpbnQgaWYgZWxzZSB3aGlsZSBicmVhayByZXR1cm4gZm9yIGRlZmluZSBtYWluICIpKzQ4OwotdiBWOwotcT1hYyBWOwotUCBWOwotbyBmOwotYzsKLWFiKDApOwotSigqKGludCgqKWYpayhQKzU5MikpKGcsbjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvb3RjYy5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvb3RjYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzNhZTJlLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL290Y2MuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgayAqKGludCopCi0jZGVmaW5lIGEgaWYoCi0jZGVmaW5lIGMgYWQoKQotI2RlZmluZSBpIGVsc2UKLSNkZWZpbmUgcCB3aGlsZSgKLSNkZWZpbmUgeCAqKGNoYXIqKQotI2RlZmluZSBiID09Ci0jZGVmaW5lIFYgPWNhbGxvYygxLDk5OTk5KQotI2RlZmluZSBmICgpCi0jZGVmaW5lIEogcmV0dXJuCi0jZGVmaW5lIGwgYWUoCi0jZGVmaW5lIG4gZSkKLSNkZWZpbmUgdSBkIT0KLSNkZWZpbmUgRiBpbnQgCi0jZGVmaW5lIHkgKGopCi0jZGVmaW5lIHIgbT0KLSNkZWZpbmUgdCArNAotRiBkLHosQyxoLFAsSyxhYyxxLEcsdixRLFIsRCxMLFcsTTsKLUUobnsKLXggRCsrPWU7Ci19Ci1vIGZ7Ci1hIEwpewotaD14IEwrKzsKLWEgaCBiIDIpewotTD0wOwotaD1XOwotfQotfQotaSBoPWZnZXRjKFEpOwotfQotWCBmewotSiBpc2FsbnVtKGgpfGggYiA5NTsKLX0KLVkgZnsKLWEgaCBiIDkyKXsKLW8gZjsKLWEgaCBiIDExMCloPTEwOwotfQotfQotY3sKLUYgZSxqLG07Ci1wIGlzc3BhY2UoaCl8aCBiIDM1KXsKLWEgaCBiIDM1KXsKLW8gZjsKLWM7Ci1hIGQgYiA1MzYpewotYzsKLUUoMzIpOwotayBkPTE7Ci1rKGQgdCk9RDsKLX0KLXAgaCE9MTApewotRShoKTsKLW8gZjsKLX0KLUUoaCk7Ci1FKDIpOwotfQotbyBmOwotfQotQz0wOwotZD1oOwotYSBYIGYpewotRSgzMik7Ci1NPUQ7Ci1wIFggZil7Ci1FKGgpOwotbyBmOwotfQotYSBpc2RpZ2l0KGQpKXsKLXo9c3RydG9sKE0sMCwwKTsKLWQ9MjsKLX0KLWl7Ci14IEQ9MzI7Ci1kPXN0cnN0cihSLE0tMSktUjsKLXggRD0wOwotZD1kKjgrMjU2OwotYSBkPjUzNil7Ci1kPVArZDsKLWEgayBkIGIgMSl7Ci1MPWsoZCB0KTsKLVc9aDsKLW8gZjsKLWM7Ci19Ci19Ci19Ci19Ci1pewotbyBmOwotYSBkIGIgMzkpewotZD0yOwotWSBmOwotej1oOwotbyBmOwotbyBmOwotfQotaSBhIGQgYiA0NyZoIGIgNDIpewotbyBmOwotcCBoKXsKLXAgaCE9NDIpbyBmOwotbyBmOwotYSBoIGIgNDcpaD0wOwotfQotbyBmOwotYzsKLX0KLWl7Ci1lPSIrKyNtLS0lYW0qQFI8XjFjL0AlW19bSDNjJUAlW19bSDNjK0AuQiNkLUAlOl9eQktkPDxaLzAzZT4+YC8wM2U8PTBmPj0vZjxALmY+QDFmPT0mZyE9J2cmJmt8fCNsJkAuQkNoXkAuQlNpfEAuQitqfkAvJVlkIUAmZCpAYiI7Ci1wIGo9eCBlKyspewotciB4IGUrKzsKLXo9MDsKLXAoQz14IGUrKy05OCk8MCl6PXoqNjQrQys2NDsKLWEgaiBiIGQmKG0gYiBofG0gYiA2NCkpewotYSBtIGIgaCl7Ci1vIGY7Ci1kPTE7Ci19Ci1icmVhazsKLX0KLX0KLX0KLX0KLX0KLWwgZyl7Ci1wIGcmJmchPS0xKXsKLXggcSsrPWc7Ci1nPWc+Pjg7Ci19Ci19Ci1BKG57Ci1GIGc7Ci1wIG57Ci1nPWsgZTsKLWsgZT1xLWUtNDsKLWU9ZzsKLX0KLX0KLXMoZyxuewotbCBnKTsKLWsgcT1lOwotZT1xOwotcT1xIHQ7Ci1KIGU7Ci19Ci1IKG57Ci1zKDE4NCxuOwotfQotQihuewotSiBzKDIzMyxuOwotfQotUyhqLG57Ci1sIDEwMzIzMjUpOwotSiBzKDEzMitqLG47Ci19Ci1aKG57Ci1sIDQ5NDY1KTsKLUgoMCk7Ci1sIDE1KTsKLWwgZSsxNDQpOwotbCAxOTIpOwotfQotTihqLG57Ci1sIGorMTMxKTsKLXMoKGU8NTEyKTw8N3w1LG47Ci19Ci1UIHl7Ci1GIGcsZSxtLGFhOwotZz0xOwotYSBkIGIgMzQpewotSCh2KTsKLXAgaCE9MzQpewotWSBmOwoteCB2Kys9aDsKLW8gZjsKLX0KLXggdj0wOwotdj12IHQmLTQ7Ci1vIGY7Ci1jOwotfQotaXsKLWFhPUM7Ci1yIHo7Ci1lPWQ7Ci1jOwotYSBlIGIgMil7Ci1IKG0pOwotfQotaSBhIGFhIGIgMil7Ci1UKDApOwotcygxODUsMCk7Ci1hIGUgYiAzMylaKG0pOwotaSBsIG0pOwotfQotaSBhIGUgYiA0MCl7Ci13IGY7Ci1jOwotfQotaSBhIGUgYiA0Mil7Ci1jOwotZT1kOwotYzsKLWM7Ci1hIGQgYiA0Mil7Ci1jOwotYzsKLWM7Ci1jOwotZT0wOwotfQotYzsKLVQoMCk7Ci1hIGQgYiA2MSl7Ci1jOwotbCA4MCk7Ci13IGY7Ci1sIDg5KTsKLWwgMzkyKyhlIGIgMjU2KSk7Ci19Ci1pIGEgbnsKLWEgZSBiIDI1NilsIDEzOSk7Ci1pIGwgNDg2NTUpOwotcSsrOwotfQotfQotaSBhIGUgYiAzOCl7Ci1OKDEwLGsgZCk7Ci1jOwotfQotaXsKLWc9ayBlOwotYSFnKWc9ZGxzeW0oMCxNKTsKLWEgZCBiIDYxJmopewotYzsKLXcgZjsKLU4oNixnKTsKLX0KLWkgYSB1IDQwKXsKLU4oOCxnKTsKLWEgQyBiIDExKXsKLU4oMCxnKTsKLWwgeik7Ci1jOwotfQotfQotfQotfQotYSBkIGIgNDApewotYSBnIGIgMSlsIDgwKTsKLXIgcyg2MDU0NSwwKTsKLWM7Ci1qPTA7Ci1wIHUgNDEpewotdyBmOwotcygyMzkzMjI1LGopOwotYSBkIGIgNDQpYzsKLWo9aiB0OwotfQotayByIGo7Ci1jOwotYSFnKXsKLWU9ZSB0OwotayBlPXMoMjMyLGsgbjsKLX0KLWkgYSBnIGIgMSl7Ci1zKDIzOTc0Mzksaik7Ci1qPWogdDsKLX0KLWl7Ci1zKDIzMixnLXEtNSk7Ci19Ci1hIGopcyg1MDMwNSxqKTsKLX0KLX0KLU8geXsKLUYgZSxnLG07Ci1hIGotLWIgMSlUKDEpOwotaXsKLU8geTsKLXIgMDsKLXAgaiBiIEMpewotZz1kOwotZT16OwotYzsKLWEgaj44KXsKLXIgUyhlLG0pOwotTyB5OwotfQotaXsKLWwgODApOwotTyB5OwotbCA4OSk7Ci1hIGogYiA0fGogYiA1KXsKLVoobjsKLX0KLWl7Ci1sIG47Ci1hIGcgYiAzNylsIDE0Nik7Ci19Ci19Ci19Ci1hIG0mJmo+OCl7Ci1yIFMoZSxtKTsKLUgoZV4xKTsKLUIoNSk7Ci1BKG0pOwotSChuOwotfQotfQotfQotdyBmewotTygxMSk7Ci19Ci1VIGZ7Ci13IGY7Ci1KIFMoMCwwKTsKLX0KLUkgeXsKLUYgbSxnLGU7Ci1hIGQgYiAyODgpewotYzsKLWM7Ci1yIFUgZjsKLWM7Ci1JIHk7Ci1hIGQgYiAzMTIpewotYzsKLWc9QigwKTsKLUEobSk7Ci1JIHk7Ci1BKGcpOwotfQotaXsKLUEobSk7Ci19Ci19Ci1pIGEgZCBiIDM1MnxkIGIgNTA0KXsKLWU9ZDsKLWM7Ci1jOwotYSBlIGIgMzUyKXsKLWc9cTsKLXIgVSBmOwotfQotaXsKLWEgdSA1OSl3IGY7Ci1jOwotZz1xOwotciAwOwotYSB1IDU5KXIgVSBmOwotYzsKLWEgdSA0MSl7Ci1lPUIoMCk7Ci13IGY7Ci1CKGctcS01KTsKLUEobjsKLWc9ZSB0OwotfQotfQotYzsKLUkoJm0pOwotQihnLXEtNSk7Ci1BKG0pOwotfQotaSBhIGQgYiAxMjMpewotYzsKLWFiKDEpOwotcCB1IDEyNSlJIHk7Ci1jOwotfQotaXsKLWEgZCBiIDQ0OCl7Ci1jOwotYSB1IDU5KXcgZjsKLUs9QihLKTsKLX0KLWkgYSBkIGIgNDAwKXsKLWM7Ci1rIGo9QihrIGopOwotfQotaSBhIHUgNTkpdyBmOwotYzsKLX0KLX0KLWFiIHl7Ci1GIG07Ci1wIGQgYiAyNTZ8dS0xJiFqKXsKLWEgZCBiIDI1Nil7Ci1jOwotcCB1IDU5KXsKLWEgail7Ci1HPUcgdDsKLWsgZD0tRzsKLX0KLWl7Ci1rIGQ9djsKLXY9diB0OwotfQotYzsKLWEgZCBiIDQ0KWM7Ci19Ci1jOwotfQotaXsKLUEoayhkIHQpKTsKLWsgZD1xOwotYzsKLWM7Ci1yIDg7Ci1wIHUgNDEpewotayBkPW07Ci1yIG0gdDsKLWM7Ci1hIGQgYiA0NCljOwotfQotYzsKLUs9Rz0wOwotbCAxNTA0MjkwMSk7Ci1yIHMoNjA1NDUsMCk7Ci1JKDApOwotQShLKTsKLWwgNTAxMjEpOwotayByIEc7Ci19Ci19Ci19Ci1tYWluKGcsbnsKLVE9c3RkaW47Ci1hIGctLT4xKXsKLWU9ZSB0OwotUT1mb3BlbihrIGUsInIiKTsKLX0KLUQ9c3RyY3B5KFIgViwiIGludCBpZiBlbHNlIHdoaWxlIGJyZWFrIHJldHVybiBmb3IgZGVmaW5lIG1haW4gIikrNDg7Ci12IFY7Ci1xPWFjIFY7Ci1QIFY7Ci1vIGY7Ci1jOwotYWIoMCk7Ci1tcHJvdGVjdChhYyAmICh+IDQwOTUpLCAoOTk5OTkgKyA0MDk1KSAmICh+IDQwOTUpLCA3KTsKLWZwcmludGYoc3RkZXJyLCAib3RjYy5jOiBhYm91dCB0byBleGVjdXRlIGNvbXBpbGVkIGNvZGUuXG4iKTsKLUooKihpbnQoKilmKWsoUCs1OTIpKShnLG47Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL3BvaW50ZXJzLmMgYi9saWJhY2MvdGVzdHMvZGF0YS9wb2ludGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjFlYmViLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL3BvaW50ZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1pbnQgbWFpbigpIHsKLSAgICBpbnQqIHBhID0gKGludCopIG1hbGxvYygxMDApOwotICAgIGludCogcGIgPSBwYSArIDE7Ci0gICAgaW50KiBwYyA9IChpbnQqKSAwOwotICAgICpwYSA9IDE7Ci0gICAgKnBiID0gMjsKLSAgICBwcmludGYoIlBvaW50ZXIgZGlmZmVyZW5jZTogJWQgJWRcbiIsIHBiIC0gcGEsICgoaW50KSBwYikgLSAoKGludCkgcGEpKTsKLSAgICBpbnQgYyA9ICogKHBhICsgMSk7Ci0gICAgcHJpbnRmKCJQb2ludGVyIGFkZGl0aW9uOiAlZFxuIiwgYyk7Ci0gICAgcHJpbnRmKCJQb2ludGVyIGNvbXBhcmlzb24gdG8gemVybzogJWQgJWQgJWRcbiIsIHBhID09IDAsIHBiID09IDAsIHBjID09IDApOwotICAgIHByaW50ZigiUG9pbnRlciBjb21wYXJpc29uOiAlZCAlZCAlZCAlZCAlZFxuIiwgcGEgPCBwYiwgcGEgPT0gcGIsIHBhID4gcGIsICEgcGIsICEgcGMpOwotICAgIGZyZWUocGEpOwotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9wb2ludGVyczIuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL3BvaW50ZXJzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWU0MDJmLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL3BvaW50ZXJzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8gVGVzdCBtdWx0aXBsZSBsZXZlbHMgb2YgaW5kaXJlY3Rpb24KLQotdm9pZCB0ZXN0c2luZ2xlKCkgewotICAgIGludCBhID0gMDsKLSAgICBpbnQqIHBhID0gJmE7Ci0gICAgcHJpbnRmKCJhID0gJWQsICpwYSA9ICVkXG4iLCBhLCAqcGEpOwotICAgICpwYSA9IDI7Ci0gICAgcHJpbnRmKCJhID0gJWQsICpwYSA9ICVkXG4iLCBhLCAqcGEpOwotfQotCi12b2lkIHRlc3Rkb3VibGUoKSB7Ci0gICAgaW50IGEgPSAwOwotICAgIGludCogcGEgPSAmYTsKLSAgICBpbnQqKiBwcGEgPSAmcGE7Ci0gICAgcHJpbnRmKCJhID0gJWQsICpwYSA9ICVkICoqcHBhID0gJWRcbiIsIGEsICpwYSwgKipwcGEpOwotICAgICoqcHBhID0gMjsKLSAgICBwcmludGYoImEgPSAlZCwgKnBhID0gJWQgKipwcGEgPSAlZFxuIiwgYSwgKnBhLCAqKnBwYSk7Ci19Ci0KLXZvaWQgdGVzdHRyaXBwbGUoKSB7Ci0gICAgaW50IGEgPSAwOwotICAgIGludCogcGEgPSAmYTsKLSAgICBpbnQqKiBwcGEgPSAmcGE7Ci0gICAgaW50KioqIHBwcGEgPSAmcHBhOwotICAgIHByaW50ZigiYSA9ICVkLCAqcGEgPSAlZCAqKnBwYSA9ICVkXG4gKioqcHBwYSA9ICVkIiwgYSwgKnBhLCAqKnBwYSwgKioqcHBwYSk7Ci0gICAgKioqcHBwYSA9IDI7Ci0gICAgcHJpbnRmKCJhID0gJWQsICpwYSA9ICVkICoqcHBhID0gJWRcbiAqKipwcHBhID0gJWQiLCBhLCAqcGEsICoqcHBhLCAqKipwcHBhKTsKLX0KLQotaW50IG1haW4oKSB7Ci0gICAgdGVzdHNpbmdsZSgpOwotICAgIHRlc3Rkb3VibGUoKTsKLSAgICB0ZXN0ZG91YmxlKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9yZXR1cm52YWwtYW5zaS5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvcmV0dXJudmFsLWFuc2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1M2ZkNS4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9yZXR1cm52YWwtYW5zaS5jCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICByZXR1cm4gZigpOwotfQotCi1pbnQgZigpIHsKLSAgICByZXR1cm4gNDI7Ci19CmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGF0YS9yZXR1cm52YWwuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL3JldHVybnZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Y1YmFlLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL3JldHVybnZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1tYWluKCkgewotICByZXR1cm4gNDI7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL3JvbGxvMy5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvcm9sbG8zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWMxMmYuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL2RhdGEvcm9sbG8zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotZmxvYXQgZmFic2YoZmxvYXQpOwotCi1pbnQgbWFpbih2b2lkKiBjb24sIGludCBmdCwgaW50IGxhdW5jaElEKQotewotICAgZmxvYXQgZiA9ICBmYWJzZigtMTAuMGYpOwotICAgcmV0dXJuIGY7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL3Nob3J0LmMgYi9saWJhY2MvdGVzdHMvZGF0YS9zaG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTIyMmYzLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL3Nob3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNob3J0IGEgPSAzOwotaW50IG1haW4oKSB7Ci0gICAgc2hvcnQqIGIgPSAmYTsKLSAgICAqYiA9ICpiIC0gNTsKLSAgICByZXR1cm4gYTsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL3NpbXBsZXN0LmMgYi9saWJhY2MvdGVzdHMvZGF0YS9zaW1wbGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWU4OTVhLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL3NpbXBsZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1tYWluKCkge30KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9kYXRhL3N0cnVjdHMuYyBiL2xpYmFjYy90ZXN0cy9kYXRhL3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MWFmMy4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGF0YS9zdHJ1Y3RzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLyBzdHJ1Y3QgZGVmaW5pdGlvbiBhbmQgZGVjbGFyYXRpb24KLXN0cnVjdCBhIHsKLSAgICBpbnQgYTsKLSAgICBpbnQgYjsKLX0gYzsKLQotLy8gVXNlbGVzcywgYnV0IGxlZ2FsIHN0cnVjdCBkZWNsYXJhdGlvbgotc3RydWN0IHsKLSAgICBpbnQgeDsKLX07Ci0KLS8vIFVzZWZ1bCBhbm9ueW1vdXMgc3RydWN0IGRlY2xhcmF0aW9uCi1zdHJ1Y3QgewotICAgIGludCB5OwotfSBhbm9uMSwgYW5vbjI7Ci0KLS8vIGZvcndhcmQgZGVjbGFyYXRpb25zCi1zdHJ1Y3QgYTsKLXN0cnVjdCBiOwotc3RydWN0IGM7Ci0KLXN0cnVjdCBiIHtpbnQgYTsgaW50IGI7IH07Ci0KLS8vIHN0cnVjdCBjIHtiIGc7IH07IC8vIHN5bnRheCBlcnJvci4KLQotLy8gc3RydWN0IHMge2Zsb2F0IGMsYSxiLGM7fSBzOyAvLyBkdXBsaWNhdGUgc3RydWN0IG1lbWJlcgotCi1zdHJ1Y3QgYyB7c3RydWN0IGIgZzsgfTsKLQotLy8gc3RydWN0IGEgeyBpbnQgdzsgfTsgLy8gZXJyb3IKLQotdm9pZCB0ZXN0Q29weWluZygpIHsKLSAgICBzdHJ1Y3QgYSB7aW50IGFbMTBdOyBjaGFyIGM7fSBhLCBiOwotICAgIGEuYyA9IDM3OwotICAgIGIuYyA9IDM4OwotICAgIGIgPSBhOwotICAgIHByaW50ZigidGVzdENvcHlpbmc6ICVkID09ICVkXG4iLCBhLmMsIGIuYyk7Ci19Ci0KLXZvaWQgdGVzdFVuaW9uKCkgewotICAgIHVuaW9uIHU7Ci0gICAgdW5pb24gdSB7ZmxvYXQgZjtpbnQgaTt9IHU7Ci0gICAgdS5mID0gMS4wZjsKLSAgICBwcmludGYoInRlc3RVbmlvbjogJWcgPT0gMHglMDh4XG4iLCB1LmYsIHUuaSk7Ci19Ci0KLXN0cnVjdCB2IHtmbG9hdCB4LCB5LCB6LCB3OyB9OwotCi12b2lkIGFkZChzdHJ1Y3QgdiogcmVzdWx0LCBzdHJ1Y3QgdiogYSwgc3RydWN0IHYqIGIpIHsKLSAgICByZXN1bHQtPnggPSBhLT54ICsgYi0+eDsKLSAgICByZXN1bHQtPnkgPSBhLT55ICsgYi0+eTsKLSAgICByZXN1bHQtPnogPSBhLT56ICsgYi0+ejsKLSAgICByZXN1bHQtPncgPSBhLT53ICsgYi0+dzsKLX0KLQotdm9pZCBzZXQoc3RydWN0IHYqIHYsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcpIHsKLSAgICB2LT54ID0geDsKLSAgICB2LT55ID0geTsKLSAgICB2LT56ID0gejsKLSAgICB2LT53ID0gdzsKLX0KLQotdm9pZCBwcmludChzdHJ1Y3QgdiogdikgewotICAgIHByaW50ZigiKCVnLCAlZywgJWcsICVnKVxuIiwgdi0+eCwgdi0+eSwgdi0+eiwgdi0+dyk7Ci19Ci0KLXZvaWQgdGVzdEFyZ3MoKSB7Ci0gICAgc3RydWN0IHYgYSwgYiwgYzsKLSAgICBzZXQoJmEsIDEuMGYsIDIuMGYsIDMuMGYsIDQuMGYpOwotICAgIHNldCgmYiwgNS4wZiwgNi4wZiwgNy4wZiwgOC4wZik7Ci0gICAgYWRkKCZjLCAmYSwgJmIpOwotICAgIHByaW50ZigidGVzdEFyZ3M6ICIpOwotICAgIHByaW50KCZjKTsKLX0KLQotaW50IG1haW4oKSB7Ci0gICAgYW5vbjEueSA9IDM7Ci0gICAgYW5vbjIueSA9IGFub24xLnk7Ci0KLSAgICB0ZXN0Q29weWluZygpOwotICAgIHRlc3RVbmlvbigpOwotICAgIHRlc3RBcmdzKCk7Ci0KLSAgICBzdHJ1Y3QgYyBjYzsKLSAgICBjYy5nLmEgPSAzOwotICAgIGMuYSA9IDE7Ci0gICAgYy5iID0gMzsKLSAgICBzdHJ1Y3QgYSB7aW50IHgsIHk7IH0gejsKLSAgICAvLyBzdHJ1Y3QgYSB7aW50IHgsIHk7IH0gejI7Ci0gICAgei54ID0gYy5hOwotICAgIHN0cnVjdCBhICpwQTsKLSAgICBwQSA9ICZ6OwotICAgIHBBLT54ICs9IDU7Ci0gICAgcmV0dXJuIHBBLT54OwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvdGVzdFN0cmluZ0NvbmNhdC5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvdGVzdFN0cmluZ0NvbmNhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA2YWUxLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL3Rlc3RTdHJpbmdDb25jYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotaW50IG1haW4oKSB7Ci0gICAgcmV0dXJuIHByaW50ZigiSGVsbG8iICIsIiAiIHdvcmxkXG4iKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL2RhdGEvdHlwZWRlZi5jIGIvbGliYWNjL3Rlc3RzL2RhdGEvdHlwZWRlZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzkyZjZhLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kYXRhL3R5cGVkZWYuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXR5cGVkZWYgc2hvcnQgQ09PUkQ7Ci10eXBlZGVmIHN0cnVjdCBQb2ludCB7Ci0gICAgQ09PUkQgeDsKLSAgICBDT09SRCB5OwotfSBQb2ludDsKLQotdm9pZCBhZGQoUG9pbnQqIHJlc3VsdCwgUG9pbnQqIGEsIFBvaW50KiBiKSB7Ci0gICAgcmVzdWx0LT54ID0gYS0+eCArIGItPng7Ci0gICAgcmVzdWx0LT55ID0gYS0+eSArIGItPnk7Ci19Ci0KLXZvaWQgcHJpbnQoUG9pbnQqIHApIHsKLSAgICBwcmludGYoIiglZCwgJWQpIiwgcC0+eCwgcC0+eSk7Ci19Ci0KLXZvaWQgc2V0KFBvaW50KiBwLCBpbnQgeCwgaW50IHkpIHsKLSAgICBwLT54ID0geDsKLSAgICBwLT55ID0geTsKLX0KLQotaW50IG1haW4oKSB7Ci0gICAgdHlwZWRlZiBjaGFyKiBTdHJpbmc7Ci0gICAgU3RyaW5nIHMgPSAieCA9ICVkXG4iOwotICAgIHsKLSAgICAgICB0eXBlZGVmIGludCBpdGVtOwotICAgICAgIGl0ZW0geCA9IDM7Ci0gICAgICAgcHJpbnRmKHMsIHgpOwotICAgIH0KLSAgICBQb2ludCBhLCBiLCBjOwotICAgIHNldCgmYSwgMSwyKTsKLSAgICBzZXQoJmIsIDMsNCk7Ci0gICAgYWRkKCZjLCAmYSwgJmIpOwotICAgIHByaW50KCZjKTsKLSAgICBwcmludGYoIiA9ICIpOwotICAgIHByaW50KCZhKTsKLSAgICBwcmludGYoIiArICIpOwotICAgIHByaW50KCZiKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGlzYXNzZW0uY3BwIGIvbGliYWNjL3Rlc3RzL2Rpc2Fzc2VtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzNTM0Mi4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvZGlzYXNzZW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzExICswLDAgQEAKLS8qCSROZXRCU0Q6IGRpc2Fzc2VtLmMsdiAxLjE0IDIwMDMvMDMvMjcgMTY6NTg6MzYgbXljcm9mdCBFeHAgJAkqLwotCi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5NiBNYXJrIEJyaW5pY29tYmUuCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYgQnJpbmkuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBCcmluaS4KLSAqIDQuIFRoZSBuYW1lIG9mIHRoZSBjb21wYW55IG5vciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYwotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQlJJTkkgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIEJSSU5JIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogUmlzY0JTRCBrZXJuZWwgcHJvamVjdAotICoKLSAqIGRiX2Rpc2FzbS5jCi0gKgotICogS2VybmVsIGRpc2Fzc2VtYmxlcgotICoKLSAqIENyZWF0ZWQgICAgICA6IDEwLzAyLzk2Ci0gKgotICogU3RydWN0dXJlZCBhZnRlciB0aGUgc3BhcmMvc3BhcmMvZGJfZGlzYXNtLmMgYnkgRGF2aWQgUy4gTWlsbGVyICYKLSAqIFBhdWwgS3JhbmVuYnVyZwotICoKLSAqIFRoaXMgY29kZSBpcyBub3QgY29tcGxldGUuIE5vdCBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBkaXNhc3NlbWJsZWQuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgotLy9fX0ZCU0RJRCgiJEZyZWVCU0Q6IC9yZXBvbWFuL3IvbmN2cy9zcmMvc3lzL2FybS9hcm0vZGlzYXNzZW0uYyx2IDEuMiAyMDA1LzAxLzA1IDIxOjU4OjQ3IGltcCBFeHAgJCIpOwotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJkaXNhc3NlbS5oIgotI2luY2x1ZGUgImFybXJlZy5oIgotLy8jaW5jbHVkZSA8ZGRiL2RkYi5oPgotCi0vKgotICogR2VuZXJhbCBpbnN0cnVjdGlvbiBmb3JtYXQKLSAqCi0gKglpbnNuW2NjXVttb2RdCVtvcGVyYW5kc10KLSAqCi0gKiBUaG9zZSBmaWVsZHMgd2l0aCBhbiB1cHBlcmNhc2UgZm9ybWF0IGNvZGUgaW5kaWNhdGUgdGhhdCB0aGUgZmllbGQKLSAqIGZvbGxvd3MgZGlyZWN0bHkgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgc2VwYXJhdG9yIGkuZS4KLSAqIHRoZXkgbW9kaWZ5IHRoZSBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBqdXN0IGJlaW5nIGFuIG9wZXJhbmQgdG8KLSAqIHRoZSBpbnN0cnVjdGlvbi4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoZSB3cml0ZWJhY2sgZmxhZyB3aGljaAotICogZm9sbG93cyBhIG9wZXJhbmQuCi0gKgotICoKLSAqIDIgLSBwcmludCBPcGVyYW5kIDIgb2YgYSBkYXRhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLSAqIGQgLSBkZXN0aW5hdGlvbiByZWdpc3RlciAoYml0cyAxMi0xNSkKLSAqIG4gLSBuIHJlZ2lzdGVyIChiaXRzIDE2LTE5KQotICogcyAtIHMgcmVnaXN0ZXIgKGJpdHMgOC0xMSkKLSAqIG8gLSBpbmRpcmVjdCByZWdpc3RlciBybiAoYml0cyAxNi0xOSkgKHVzZWQgYnkgc3dhcCkKLSAqIG0gLSBtIHJlZ2lzdGVyIChiaXRzIDAtMykKLSAqIGEgLSBhZGRyZXNzIG9wZXJhbmQgb2YgbGRyL3N0ciBpbnN0cnVjdGlvbgotICogZSAtIGFkZHJlc3Mgb3BlcmFuZCBvZiBsZHJoL3N0cmggaW5zdHJ1Y3Rpb24KLSAqIGwgLSByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0gKiBmIC0gMXN0IGZwIG9wZXJhbmQgKHJlZ2lzdGVyKSAoYml0cyAxMi0xNCkKLSAqIGcgLSAybmQgZnAgb3BlcmFuZCAocmVnaXN0ZXIpIChiaXRzIDE2LTE4KQotICogaCAtIDNyZCBmcCBvcGVyYW5kIChyZWdpc3Rlci9pbW1lZGlhdGUpIChiaXRzIDAtNCkKLSAqIGIgLSBicmFuY2ggYWRkcmVzcwotICogdCAtIHRodW1iIGJyYW5jaCBhZGRyZXNzIChiaXRzIDI0LCAwLTIzKQotICogayAtIGJyZWFrcG9pbnQgY29tbWVudCAoYml0cyAwLTMsIDgtMTkpCi0gKiBYIC0gYmxvY2sgdHJhbnNmZXIgdHlwZQotICogWSAtIGJsb2NrIHRyYW5zZmVyIHR5cGUgKHIxMyBiYXNlKQotICogYyAtIGNvbW1lbnQgZmllbGQgYml0cygwLTIzKQotICogcCAtIHNhdmVkIG9yIGN1cnJlbnQgc3RhdHVzIHJlZ2lzdGVyCi0gKiBGIC0gUFNSIHRyYW5zZmVyIGZpZWxkcwotICogRCAtIGRlc3RpbmF0aW9uLWlzLXIxNSAoUCkgZmxhZyBvbiBUU1QsIFRFUSwgQ01QLCBDTU4KLSAqIEwgLSBjby1wcm9jZXNzb3IgdHJhbnNmZXIgc2l6ZQotICogUyAtIHNldCBzdGF0dXMgZmxhZwotICogUCAtIGZwIHByZWNpc2lvbgotICogUSAtIGZwIHByZWNpc2lvbiAoZm9yIGxkZi9zdGYpCi0gKiBSIC0gZnAgcm91bmRpbmcKLSAqIHYgLSBjby1wcm9jZXNzb3IgZGF0YSB0cmFuc2ZlciByZWdpc3RlcnMgKyBhZGRyZXNzaW5nIG1vZGUKLSAqIFcgLSB3cml0ZWJhY2sgZmxhZwotICogeCAtIGluc3RydWN0aW9uIGluIGhleAotICogIyAtIGNvLXByb2Nlc3NvciBudW1iZXIKLSAqIHkgLSBjby1wcm9jZXNzb3IgZGF0YSBwcm9jZXNzaW5nIHJlZ2lzdGVycwotICogeiAtIGNvLXByb2Nlc3NvciByZWdpc3RlciB0cmFuc2ZlciByZWdpc3RlcnMKLSAqLwotCi1zdHJ1Y3QgYXJtMzJfaW5zbiB7Ci0JdV9pbnQgbWFzazsKLQl1X2ludCBwYXR0ZXJuOwotCWNvbnN0IGNoYXIqIG5hbWU7Ci0JY29uc3QgY2hhciogZm9ybWF0OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm0zMl9pbnNuIGFybTMyX2lbXSA9IHsKLSAgICB7IDB4MGZmZmZmZmYsIDB4MGZmMDAwMDAsICJpbWIiLAkiYyIgfSwJCS8qIEJlZm9yZSBzd2kgKi8KLSAgICB7IDB4MGZmZmZmZmYsIDB4MGZmMDAwMDEsICJpbWJyYW5nZSIsCSJjIiB9LAkvKiBCZWZvcmUgc3dpICovCi0gICAgeyAweDBmMDAwMDAwLCAweDBmMDAwMDAwLCAic3dpIiwJImMiIH0sCi0gICAgeyAweGZlMDAwMDAwLCAweGZhMDAwMDAwLCAiYmx4IiwJInQiIH0sCQkvKiBCZWZvcmUgYiBhbmQgYmwgKi8KLSAgICB7IDB4MGYwMDAwMDAsIDB4MGEwMDAwMDAsICJiIiwJImIiIH0sCi0gICAgeyAweDBmMDAwMDAwLCAweDBiMDAwMDAwLCAiYmwiLAkiYiIgfSwKLSAgICB7IDB4MGZlMDAwZjAsIDB4MDAwMDAwOTAsICJtdWwiLAkiU25tcyIgfSwKLSAgICB7IDB4MGZlMDAwZjAsIDB4MDAyMDAwOTAsICJtbGEiLAkiU25tc2QiIH0sCi0gICAgeyAweDBmZTAwMGYwLCAweDAwODAwMDkwLCAidW11bGwiLAkiU2RubXMiIH0sCi0gICAgeyAweDBmZTAwMGYwLCAweDAwYzAwMDkwLCAic211bGwiLAkiU2RubXMiIH0sCi0gICAgeyAweDBmZTAwMGYwLCAweDAwYTAwMDkwLCAidW1sYWwiLAkiU2RubXMiIH0sCi0gICAgeyAweDBmZTAwMGYwLCAweDAwZTAwMDkwLCAic21sYWwiLAkiU2RubXMiIH0sCi0gICAgeyAweDBkNzAwMDAwLCAweDA0MjAwMDAwLCAic3RydCIsCSJkYVciIH0sCi0gICAgeyAweDBkNzAwMDAwLCAweDA0MzAwMDAwLCAibGRydCIsCSJkYVciIH0sCi0gICAgeyAweDBkNzAwMDAwLCAweDA0NjAwMDAwLCAic3RyYnQiLAkiZGFXIiB9LAotICAgIHsgMHgwZDcwMDAwMCwgMHgwNDcwMDAwMCwgImxkcmJ0IiwJImRhVyIgfSwKLSAgICB7IDB4MGM1MDAwMDAsIDB4MDQwMDAwMDAsICJzdHIiLAkiZGFXIiB9LAotICAgIHsgMHgwYzUwMDAwMCwgMHgwNDEwMDAwMCwgImxkciIsCSJkYVciIH0sCi0gICAgeyAweDBjNTAwMDAwLCAweDA0NDAwMDAwLCAic3RyYiIsCSJkYVciIH0sCi0gICAgeyAweDBjNTAwMDAwLCAweDA0NTAwMDAwLCAibGRyYiIsCSJkYVciIH0sCi0gICAgeyAweDBlMWYwMDAwLCAweDA4MGQwMDAwLCAic3RtIiwJIlluV2wiIH0sLyogc2VwYXJhdGUgb3V0IHIxMyBiYXNlICovCi0gICAgeyAweDBlMWYwMDAwLCAweDA4MWQwMDAwLCAibGRtIiwJIlluV2wiIH0sLyogc2VwYXJhdGUgb3V0IHIxMyBiYXNlICovICAgIAotICAgIHsgMHgwZTEwMDAwMCwgMHgwODAwMDAwMCwgInN0bSIsCSJYbldsIiB9LAotICAgIHsgMHgwZTEwMDAwMCwgMHgwODEwMDAwMCwgImxkbSIsCSJYbldsIiB9LCAgICAKLSAgICB7IDB4MGUxMDAwZjAsIDB4MDAxMDAwOTAsICJsZHJiIiwJImRlVyIgfSwKLSAgICB7IDB4MGUxMDAwZjAsIDB4MDAwMDAwOTAsICJzdHJiIiwJImRlVyIgfSwKLSAgICB7IDB4MGUxMDAwZjAsIDB4MDAxMDAwZDAsICJsZHJzYiIsCSJkZVciIH0sCi0gICAgeyAweDBlMTAwMGYwLCAweDAwMTAwMGIwLCAibGRyaCIsCSJkZVciIH0sCi0gICAgeyAweDBlMTAwMGYwLCAweDAwMDAwMGIwLCAic3RyaCIsCSJkZVciIH0sCi0gICAgeyAweDBlMTAwMGYwLCAweDAwMTAwMGYwLCAibGRyc2giLAkiZGVXIiB9LAotICAgIHsgMHgwZjIwMDA5MCwgMHgwMDIwMDA5MCwgInVuZCIsCSJ4IiB9LAkvKiBCZWZvcmUgZGF0YSBwcm9jZXNzaW5nICovCi0gICAgeyAweDBlMTAwMGQwLCAweDAwMDAwMGQwLCAidW5kIiwJIngiIH0sCS8qIEJlZm9yZSBkYXRhIHByb2Nlc3NpbmcgKi8KLSAgICB7IDB4MGZmMDBmZjAsIDB4MDEwMDAwOTAsICJzd3AiLAkiZG1vIiB9LAotICAgIHsgMHgwZmYwMGZmMCwgMHgwMTQwMDA5MCwgInN3cGIiLAkiZG1vIiB9LAotICAgIHsgMHgwZmJmMGZmZiwgMHgwMTBmMDAwMCwgIm1ycyIsCSJkcCIgfSwJLyogQmVmb3JlIGRhdGEgcHJvY2Vzc2luZyAqLwotICAgIHsgMHgwZmIwZmZmMCwgMHgwMTIwZjAwMCwgIm1zciIsCSJwRm0iIH0sLyogQmVmb3JlIGRhdGEgcHJvY2Vzc2luZyAqLwotICAgIHsgMHgwZmIwZjAwMCwgMHgwMzIwZjAwMCwgIm1zciIsCSJwRjIiIH0sLyogQmVmb3JlIGRhdGEgcHJvY2Vzc2luZyAqLwotICAgIHsgMHgwZmZmZmZmMCwgMHgwMTJmZmYxMCwgImJ4IiwgICAgICJtIiB9LAotICAgIHsgMHgwZmZmMGZmMCwgMHgwMTZmMGYxMCwgImNseiIsCSJkbSIgfSwKLSAgICB7IDB4MGZmZmZmZjAsIDB4MDEyZmZmMzAsICJibHgiLAkibSIgfSwKLSAgICB7IDB4ZmZmMDAwZjAsIDB4ZTEyMDAwNzAsICJia3B0IiwJImsiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwMDAwMDAwLCAiYW5kIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwMjAwMDAwLCAiZW9yIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwNDAwMDAwLCAic3ViIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwNjAwMDAwLCAicnNiIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwODAwMDAwLCAiYWRkIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwYTAwMDAwLCAiYWRjIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwYzAwMDAwLCAic2JjIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZTAwMDAwLCAweDAwZTAwMDAwLCAicnNjIiwJIlNkbjIiIH0sCi0gICAgeyAweDBkZjAwMDAwLCAweDAxMTAwMDAwLCAidHN0IiwJIkRuMiIgfSwKLSAgICB7IDB4MGRmMDAwMDAsIDB4MDEzMDAwMDAsICJ0ZXEiLAkiRG4yIiB9LAotICAgIHsgMHgwZGYwMDAwMCwgMHgwMTUwMDAwMCwgImNtcCIsCSJEbjIiIH0sCi0gICAgeyAweDBkZjAwMDAwLCAweDAxNzAwMDAwLCAiY21uIiwJIkRuMiIgfSwKLSAgICB7IDB4MGRlMDAwMDAsIDB4MDE4MDAwMDAsICJvcnIiLAkiU2RuMiIgfSwKLSAgICB7IDB4MGRlMDAwMDAsIDB4MDFhMDAwMDAsICJtb3YiLAkiU2QyIiB9LAotICAgIHsgMHgwZGUwMDAwMCwgMHgwMWMwMDAwMCwgImJpYyIsCSJTZG4yIiB9LAotICAgIHsgMHgwZGUwMDAwMCwgMHgwMWUwMDAwMCwgIm12biIsCSJTZDIiIH0sCi0gICAgeyAweDBmZjA4ZjEwLCAweDBlMDAwMTAwLCAiYWRmIiwJIlBSZmdoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTEwMDEwMCwgIm11ZiIsCSJQUmZnaCIgfSwKLSAgICB7IDB4MGZmMDhmMTAsIDB4MGUyMDAxMDAsICJzdWYiLAkiUFJmZ2giIH0sCi0gICAgeyAweDBmZjA4ZjEwLCAweDBlMzAwMTAwLCAicnNmIiwJIlBSZmdoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTQwMDEwMCwgImR2ZiIsCSJQUmZnaCIgfSwKLSAgICB7IDB4MGZmMDhmMTAsIDB4MGU1MDAxMDAsICJyZGYiLAkiUFJmZ2giIH0sCi0gICAgeyAweDBmZjA4ZjEwLCAweDBlNjAwMTAwLCAicG93IiwJIlBSZmdoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTcwMDEwMCwgInJwdyIsCSJQUmZnaCIgfSwKLSAgICB7IDB4MGZmMDhmMTAsIDB4MGU4MDAxMDAsICJybWYiLAkiUFJmZ2giIH0sCi0gICAgeyAweDBmZjA4ZjEwLCAweDBlOTAwMTAwLCAiZm1sIiwJIlBSZmdoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZWEwMDEwMCwgImZkdiIsCSJQUmZnaCIgfSwKLSAgICB7IDB4MGZmMDhmMTAsIDB4MGViMDAxMDAsICJmcmQiLAkiUFJmZ2giIH0sCi0gICAgeyAweDBmZjA4ZjEwLCAweDBlYzAwMTAwLCAicG9sIiwJIlBSZmdoIiB9LAotICAgIHsgMHgwZjAwOGYxMCwgMHgwZTAwMDEwMCwgImZwYm9wIiwJIlBSZmdoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTAwODEwMCwgIm12ZiIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTEwODEwMCwgIm1uZiIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTIwODEwMCwgImFicyIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTMwODEwMCwgInJuZCIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTQwODEwMCwgInNxdCIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTUwODEwMCwgImxvZyIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTYwODEwMCwgImxnbiIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTcwODEwMCwgImV4cCIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTgwODEwMCwgInNpbiIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZTkwODEwMCwgImNvcyIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZWEwODEwMCwgInRhbiIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZWIwODEwMCwgImFzbiIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZWMwODEwMCwgImFjcyIsCSJQUmZoIiB9LAotICAgIHsgMHgwZmYwOGYxMCwgMHgwZWQwODEwMCwgImF0biIsCSJQUmZoIiB9LAotICAgIHsgMHgwZjAwOGYxMCwgMHgwZTAwODEwMCwgImZwdW9wIiwJIlBSZmgiIH0sCi0gICAgeyAweDBlMTAwZjAwLCAweDBjMDAwMTAwLCAic3RmIiwJIlFMdiIgfSwKLSAgICB7IDB4MGUxMDBmMDAsIDB4MGMxMDAxMDAsICJsZGYiLAkiUUx2IiB9LAotICAgIHsgMHgwZmYwMGYxMCwgMHgwZTAwMDExMCwgImZsdCIsCSJQUmdkIiB9LAotICAgIHsgMHgwZmYwMGYxMCwgMHgwZTEwMDExMCwgImZpeCIsCSJQUmRoIiB9LAotICAgIHsgMHgwZmYwMGYxMCwgMHgwZTIwMDExMCwgIndmcyIsCSJkIiB9LAotICAgIHsgMHgwZmYwMGYxMCwgMHgwZTMwMDExMCwgInJmcyIsCSJkIiB9LAotICAgIHsgMHgwZmYwMGYxMCwgMHgwZTQwMDExMCwgIndmYyIsCSJkIiB9LAotICAgIHsgMHgwZmYwMGYxMCwgMHgwZTUwMDExMCwgInJmYyIsCSJkIiB9LAotICAgIHsgMHgwZmYwZmYxMCwgMHgwZTkwZjExMCwgImNtZiIsCSJQUmdoIiB9LAotICAgIHsgMHgwZmYwZmYxMCwgMHgwZWIwZjExMCwgImNuZiIsCSJQUmdoIiB9LAotICAgIHsgMHgwZmYwZmYxMCwgMHgwZWQwZjExMCwgImNtZmUiLAkiUFJnaCIgfSwKLSAgICB7IDB4MGZmMGZmMTAsIDB4MGVmMGYxMTAsICJjbmZlIiwJIlBSZ2giIH0sCi0gICAgeyAweGZmMTAwMDEwLCAweGZlMDAwMDEwLCAibWNyMiIsCSIjeiIgfSwKLSAgICB7IDB4MGYxMDAwMTAsIDB4MGUwMDAwMTAsICJtY3IiLAkiI3oiIH0sCi0gICAgeyAweGZmMTAwMDEwLCAweGZlMTAwMDEwLCAibXJjMiIsCSIjeiIgfSwKLSAgICB7IDB4MGYxMDAwMTAsIDB4MGUxMDAwMTAsICJtcmMiLAkiI3oiIH0sCi0gICAgeyAweGZmMDAwMDEwLCAweGZlMDAwMDAwLCAiY2RwMiIsCSIjeSIgfSwKLSAgICB7IDB4MGYwMDAwMTAsIDB4MGUwMDAwMDAsICJjZHAiLAkiI3kiIH0sCi0gICAgeyAweGZlMTAwMDkwLCAweGZjMTAwMDAwLCAibGRjMiIsCSJMI3YiIH0sCi0gICAgeyAweDBlMTAwMDkwLCAweDBjMTAwMDAwLCAibGRjIiwJIkwjdiIgfSwKLSAgICB7IDB4ZmUxMDAwOTAsIDB4ZmMwMDAwMDAsICJzdGMyIiwJIkwjdiIgfSwKLSAgICB7IDB4MGUxMDAwOTAsIDB4MGMwMDAwMDAsICJzdGMiLAkiTCN2IiB9LAotICAgIHsgMHhmNTUwZjAwMCwgMHhmNTUwZjAwMCwgInBsZCIsCSJuZSIgfSwKLSAgICB7IDB4MGZmMDBmZjAsIDB4MDEwMDAwNTAsICJxYWFkIiwJImRtbiIgfSwKLSAgICB7IDB4MGZmMDBmZjAsIDB4MDE0MDAwNTAsICJxZGFhZCIsCSJkbW4iIH0sCi0gICAgeyAweDBmZjAwZmYwLCAweDAxNjAwMDUwLCAicWRzdWIiLAkiZG1uIiB9LAotICAgIHsgMHgwZmYwMGZmMCwgMHgwMTIwMDA1MCwgImRzdWIiLAkiZG1uIiB9LAotICAgIHsgMHgwZmYwMDBmMCwgMHgwMTAwMDA4MCwgInNtbGFiYiIsCSJubXNkIiB9LCAgIC8vIGQgJiBuIGludmVydGVkISEKLSAgICB7IDB4MGZmMDAwZjAsIDB4MDEwMDAwYTAsICJzbWxhdGIiLAkibm1zZCIgfSwgICAvLyBkICYgbiBpbnZlcnRlZCEhCi0gICAgeyAweDBmZjAwMGYwLCAweDAxMDAwMGMwLCAic21sYWJ0IiwJIm5tc2QiIH0sICAgLy8gZCAmIG4gaW52ZXJ0ZWQhIQotICAgIHsgMHgwZmYwMDBmMCwgMHgwMTAwMDBlMCwgInNtbGF0dCIsCSJubXNkIiB9LCAgIC8vIGQgJiBuIGludmVydGVkISEKLSAgICB7IDB4MGZmMDAwZjAsIDB4MDE0MDAwODAsICJzbWxhbGJiIiwibmRtcyIgfSwgICAvLyBkICYgbiBpbnZlcnRlZCEhCi0gICAgeyAweDBmZjAwMGYwLCAweDAxNDAwMGEwLCAic21sYWx0YiIsIm5kbXMiIH0sICAgLy8gZCAmIG4gaW52ZXJ0ZWQhIQotICAgIHsgMHgwZmYwMDBmMCwgMHgwMTQwMDBjMCwgInNtbGFsYnQiLCJuZG1zIiB9LCAgIC8vIGQgJiBuIGludmVydGVkISEKLSAgICB7IDB4MGZmMDAwZjAsIDB4MDE0MDAwZTAsICJzbWxhbHR0IiwibmRtcyIgfSwgICAvLyBkICYgbiBpbnZlcnRlZCEhCi0gICAgeyAweDBmZjAwMGYwLCAweDAxMjAwMDgwLCAic21sYXdiIiwgIm5tc2QiIH0sICAgLy8gZCAmIG4gaW52ZXJ0ZWQhIQotICAgIHsgMHgwZmYwZjBmMCwgMHgwMTIwMDBhMCwgInNtdWx3YiIsIm5tcyIgfSwgICAvLyBkICYgbiBpbnZlcnRlZCEhCi0gICAgeyAweDBmZjAwMGYwLCAweDAxMjAwMGMwLCAic21sYXd0IiwgIm5tc2QiIH0sICAgLy8gZCAmIG4gaW52ZXJ0ZWQhIQotICAgIHsgMHgwZmYwZjBmMCwgMHgwMTIwMDBlMCwgInNtdWx3dCIsIm5tcyIgfSwgICAvLyBkICYgbiBpbnZlcnRlZCEhCi0gICAgeyAweDBmZjBmMGYwLCAweDAxNjAwMDgwLCAic211bGJiIiwibm1zIiB9LCAgIC8vIGQgJiBuIGludmVydGVkISEKLSAgICB7IDB4MGZmMGYwZjAsIDB4MDE2MDAwYTAsICJzbXVsdGIiLCJubXMiIH0sICAgLy8gZCAmIG4gaW52ZXJ0ZWQhIQotICAgIHsgMHgwZmYwZjBmMCwgMHgwMTYwMDBjMCwgInNtdWxidCIsIm5tcyIgfSwgICAvLyBkICYgbiBpbnZlcnRlZCEhCi0gICAgeyAweDBmZjBmMGYwLCAweDAxNjAwMGUwLCAic211bHR0Iiwibm1zIiB9LCAgIC8vIGQgJiBuIGludmVydGVkISEKLSAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIE5VTEwsCU5VTEwgfQotfTsKLQotc3RhdGljIGNoYXIgY29uc3QgYXJtMzJfaW5zbl9jb25kaXRpb25zW11bNF0gPSB7Ci0JImVxIiwgIm5lIiwgImNzIiwgImNjIiwKLQkibWkiLCAicGwiLCAidnMiLCAidmMiLAotCSJoaSIsICJscyIsICJnZSIsICJsdCIsCi0JImd0IiwgImxlIiwgIiIsICAgIm52IgotfTsKLQotc3RhdGljIGNoYXIgY29uc3QgaW5zbl9ibG9ja190cmFuc2ZlcnNbXVs0XSA9IHsKLQkiZGEiLCAiaWEiLCAiZGIiLCAiaWIiCi19OwotCi1zdGF0aWMgY2hhciBjb25zdCBpbnNuX3N0YWNrX2Jsb2NrX3RyYW5zZmVyc1tdWzRdID0gewotCSJlZCIsICJlYSIsICJmZCIsICJmYSIKLX07Ci0KLXN0YXRpYyBjaGFyIGNvbnN0IG9wX3NoaWZ0c1tdWzRdID0gewotCSJsc2wiLCAibHNyIiwgImFzciIsICJyb3IiCi19OwotCi1zdGF0aWMgY2hhciBjb25zdCBpbnNuX2ZwYV9yb3VuZGluZ1tdWzJdID0gewotCSIiLCAicCIsICJtIiwgInoiCi19OwotCi1zdGF0aWMgY2hhciBjb25zdCBpbnNuX2ZwYV9wcmVjaXNpb25bXVsyXSA9IHsKLQkicyIsICJkIiwgImUiLCAicCIKLX07Ci0KLXN0YXRpYyBjaGFyIGNvbnN0IGluc25fZnBhY29uc3RhbnRzW11bOF0gPSB7Ci0JIjAuMCIsICIxLjAiLCAiMi4wIiwgIjMuMCIsCi0JIjQuMCIsICI1LjAiLCAiMC41IiwgIjEwLjAiCi19OwotCi0jZGVmaW5lIGluc25fY29uZGl0aW9uKHgpCWFybTMyX2luc25fY29uZGl0aW9uc1soeCA+PiAyOCkgJiAweDBmXQotI2RlZmluZSBpbnNuX2Jsa3RyYW5zKHgpCWluc25fYmxvY2tfdHJhbnNmZXJzWyh4ID4+IDIzKSAmIDNdCi0jZGVmaW5lIGluc25fc3RrYmxrdHJhbnMoeCkJaW5zbl9zdGFja19ibG9ja190cmFuc2ZlcnNbKHggPj4gMjMpICYgM10KLSNkZWZpbmUgb3AyX3NoaWZ0KHgpCQlvcF9zaGlmdHNbKHggPj4gNSkgJiAzXQotI2RlZmluZSBpbnNuX2ZwYXJuZCh4KQkJaW5zbl9mcGFfcm91bmRpbmdbKHggPj4gNSkgJiAweDAzXQotI2RlZmluZSBpbnNuX2ZwYXByZWMoeCkJCWluc25fZnBhX3ByZWNpc2lvblsoKCh4ID4+IDE4KSAmIDIpfCh4ID4+IDcpKSAmIDFdCi0jZGVmaW5lIGluc25fZnBhcHJlY3QoeCkJaW5zbl9mcGFfcHJlY2lzaW9uWygoKHggPj4gMjEpICYgMil8KHggPj4gMTUpKSAmIDFdCi0jZGVmaW5lIGluc25fZnBhaW1tKHgpCQlpbnNuX2ZwYWNvbnN0YW50c1t4ICYgMHgwN10KLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgZGlzYXNtX3JlZ2lzdGVyX3NoaWZ0KGNvbnN0IGRpc2FzbV9pbnRlcmZhY2VfdCAqZGksIHVfaW50IGluc24pOwotc3RhdGljIHZvaWQgZGlzYXNtX3ByaW50X3JlZ2xpc3QoY29uc3QgZGlzYXNtX2ludGVyZmFjZV90ICpkaSwgdV9pbnQgaW5zbik7Ci1zdGF0aWMgdm9pZCBkaXNhc21faW5zbl9sZHJzdHIoY29uc3QgZGlzYXNtX2ludGVyZmFjZV90ICpkaSwgdV9pbnQgaW5zbiwKLSAgICB1X2ludCBsb2MpOwotc3RhdGljIHZvaWQgZGlzYXNtX2luc25fbGRyaHN0cmgoY29uc3QgZGlzYXNtX2ludGVyZmFjZV90ICpkaSwgdV9pbnQgaW5zbiwKLSAgICB1X2ludCBsb2MpOwotc3RhdGljIHZvaWQgZGlzYXNtX2luc25fbGRjc3RjKGNvbnN0IGRpc2FzbV9pbnRlcmZhY2VfdCAqZGksIHVfaW50IGluc24sCi0gICAgdV9pbnQgbG9jKTsKLXN0YXRpYyB1X2ludCBkaXNhc3NlbWJsZV9yZWFkd29yZCh1X2ludCBhZGRyZXNzKTsKLXN0YXRpYyB2b2lkIGRpc2Fzc2VtYmxlX3ByaW50YWRkcih1X2ludCBhZGRyZXNzKTsKLQotdV9pbnQKLWRpc2FzbShjb25zdCBkaXNhc21faW50ZXJmYWNlX3QgKmRpLCB1X2ludCBsb2MsIGludCBhbHRmbXQpCi17Ci0JY29uc3Qgc3RydWN0IGFybTMyX2luc24gKmlfcHRyID0gJmFybTMyX2lbMF07Ci0KLQl1X2ludCBpbnNuOwotCWludCBtYXRjaHA7Ci0JaW50IGJyYW5jaDsKLQljb25zdCBjaGFyKiBmX3B0cjsKLQlpbnQgZm10OwotCi0JZm10ID0gMDsKLQltYXRjaHAgPSAwOwotCWluc24gPSBkaS0+ZGlfcmVhZHdvcmQobG9jKTsKLQotLyoJZGktPmRpX3ByaW50ZigibG9jPSUwOHggaW5zbj0lMDh4IDogIiwgbG9jLCBpbnNuKTsqLwotCi0Jd2hpbGUgKGlfcHRyLT5uYW1lKSB7Ci0JCWlmICgoaW5zbiAmIGlfcHRyLT5tYXNrKSA9PSAgaV9wdHItPnBhdHRlcm4pIHsKLQkJCW1hdGNocCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlpX3B0cisrOwotCX0KLQotCWlmICghbWF0Y2hwKSB7Ci0JCWRpLT5kaV9wcmludGYoInVuZCVzXHQlMDh4XG4iLCBpbnNuX2NvbmRpdGlvbihpbnNuKSwgaW5zbik7Ci0JCXJldHVybihsb2MgKyBJTlNOX1NJWkUpOwotCX0KLQotCS8qIElmIGluc3RydWN0aW9uIGZvcmNlcyBjb25kaXRpb24gY29kZSwgZG9uJ3QgcHJpbnQgaXQuICovCi0JaWYgKChpX3B0ci0+bWFzayAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCi0JCWRpLT5kaV9wcmludGYoIiVzIiwgaV9wdHItPm5hbWUpOwotCWVsc2UKLQkJZGktPmRpX3ByaW50ZigiJXMlcyIsIGlfcHRyLT5uYW1lLCBpbnNuX2NvbmRpdGlvbihpbnNuKSk7Ci0KLQlmX3B0ciA9IGlfcHRyLT5mb3JtYXQ7Ci0KLQkvKiBJbnNlcnQgdGFiIGlmIHRoZXJlIGFyZSBubyBpbnN0cnVjdGlvbiBtb2RpZmllcnMgKi8KLQotCWlmICgqKGZfcHRyKSA8ICdBJyB8fCAqKGZfcHRyKSA+ICdaJykgewotCQkrK2ZtdDsKLQkJZGktPmRpX3ByaW50ZigiXHQiKTsKLQl9Ci0KLQl3aGlsZSAoKmZfcHRyKSB7Ci0JCXN3aXRjaCAoKmZfcHRyKSB7Ci0JCS8qIDIgLSBwcmludCBPcGVyYW5kIDIgb2YgYSBkYXRhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gKi8KLQkJY2FzZSAnMic6Ci0JCQlpZiAoaW5zbiAmIDB4MDIwMDAwMDApIHsKLQkJCQlpbnQgcm90YXRlPSAoKGluc24gPj4gNykgJiAweDFlKTsKLQotCQkJCWRpLT5kaV9wcmludGYoIiMweCUwOHgiLAotCQkJCQkgICAgICAoaW5zbiAmIDB4ZmYpIDw8ICgzMiAtIHJvdGF0ZSkgfAotCQkJCQkgICAgICAoaW5zbiAmIDB4ZmYpID4+IHJvdGF0ZSk7Ci0JCQl9IGVsc2UgeyAgCi0JCQkJZGlzYXNtX3JlZ2lzdGVyX3NoaWZ0KGRpLCBpbnNuKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkvKiBkIC0gZGVzdGluYXRpb24gcmVnaXN0ZXIgKGJpdHMgMTItMTUpICovCi0JCWNhc2UgJ2QnOgotCQkJZGktPmRpX3ByaW50ZigiciVkIiwgKChpbnNuID4+IDEyKSAmIDB4MGYpKTsKLQkJCWJyZWFrOwotCQkvKiBEIC0gaW5zZXJ0ICdwJyBpZiBSZCBpcyBSMTUgKi8KLQkJY2FzZSAnRCc6Ci0JCQlpZiAoKChpbnNuID4+IDEyKSAmIDB4MGYpID09IDE1KQotCQkJCWRpLT5kaV9wcmludGYoInAiKTsKLQkJCWJyZWFrOwotCQkvKiBuIC0gbiByZWdpc3RlciAoYml0cyAxNi0xOSkgKi8KLQkJY2FzZSAnbic6Ci0JCQlkaS0+ZGlfcHJpbnRmKCJyJWQiLCAoKGluc24gPj4gMTYpICYgMHgwZikpOwotCQkJYnJlYWs7Ci0JCS8qIHMgLSBzIHJlZ2lzdGVyIChiaXRzIDgtMTEpICovCi0JCWNhc2UgJ3MnOgotCQkJZGktPmRpX3ByaW50ZigiciVkIiwgKChpbnNuID4+IDgpICYgMHgwZikpOwotCQkJYnJlYWs7Ci0JCS8qIG8gLSBpbmRpcmVjdCByZWdpc3RlciBybiAoYml0cyAxNi0xOSkgKHVzZWQgYnkgc3dhcCkgKi8KLQkJY2FzZSAnbyc6Ci0JCQlkaS0+ZGlfcHJpbnRmKCJbciVkXSIsICgoaW5zbiA+PiAxNikgJiAweDBmKSk7Ci0JCQlicmVhazsKLQkJLyogbSAtIG0gcmVnaXN0ZXIgKGJpdHMgMC00KSAqLwotCQljYXNlICdtJzoKLQkJCWRpLT5kaV9wcmludGYoInIlZCIsICgoaW5zbiA+PiAwKSAmIDB4MGYpKTsKLQkJCWJyZWFrOwotCQkvKiBhIC0gYWRkcmVzcyBvcGVyYW5kIG9mIGxkci9zdHIgaW5zdHJ1Y3Rpb24gKi8KLQkJY2FzZSAnYSc6Ci0JCQlkaXNhc21faW5zbl9sZHJzdHIoZGksIGluc24sIGxvYyk7Ci0JCQlicmVhazsKLQkJLyogZSAtIGFkZHJlc3Mgb3BlcmFuZCBvZiBsZHJoL3N0cmggaW5zdHJ1Y3Rpb24gKi8KLQkJY2FzZSAnZSc6Ci0JCQlkaXNhc21faW5zbl9sZHJoc3RyaChkaSwgaW5zbiwgbG9jKTsKLQkJCWJyZWFrOwotCQkvKiBsIC0gcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bSBpbnN0cnVjdGlvbiAqLwotCQljYXNlICdsJzoKLQkJCWRpc2FzbV9wcmludF9yZWdsaXN0KGRpLCBpbnNuKTsKLQkJCWJyZWFrOwotCQkvKiBmIC0gMXN0IGZwIG9wZXJhbmQgKHJlZ2lzdGVyKSAoYml0cyAxMi0xNCkgKi8KLQkJY2FzZSAnZic6Ci0JCQlkaS0+ZGlfcHJpbnRmKCJmJWQiLCAoaW5zbiA+PiAxMikgJiA3KTsKLQkJCWJyZWFrOwotCQkvKiBnIC0gMm5kIGZwIG9wZXJhbmQgKHJlZ2lzdGVyKSAoYml0cyAxNi0xOCkgKi8KLQkJY2FzZSAnZyc6Ci0JCQlkaS0+ZGlfcHJpbnRmKCJmJWQiLCAoaW5zbiA+PiAxNikgJiA3KTsKLQkJCWJyZWFrOwotCQkvKiBoIC0gM3JkIGZwIG9wZXJhbmQgKHJlZ2lzdGVyL2ltbWVkaWF0ZSkgKGJpdHMgMC00KSAqLwotCQljYXNlICdoJzoKLQkJCWlmIChpbnNuICYgKDEgPDwgMykpCi0JCQkJZGktPmRpX3ByaW50ZigiIyVzIiwgaW5zbl9mcGFpbW0oaW5zbikpOwotCQkJZWxzZQotCQkJCWRpLT5kaV9wcmludGYoImYlZCIsIGluc24gJiA3KTsKLQkJCWJyZWFrOwotCQkvKiBiIC0gYnJhbmNoIGFkZHJlc3MgKi8KLQkJY2FzZSAnYic6Ci0JCQlicmFuY2ggPSAoKGluc24gPDwgMikgJiAweDAzZmZmZmZmKTsKLQkJCWlmIChicmFuY2ggJiAweDAyMDAwMDAwKQotCQkJCWJyYW5jaCB8PSAweGZjMDAwMDAwOwotCQkJZGktPmRpX3ByaW50YWRkcihsb2MgKyA4ICsgYnJhbmNoKTsKLQkJCWJyZWFrOwotCQkvKiB0IC0gYmx4IGFkZHJlc3MgKi8KLQkJY2FzZSAndCc6Ci0JCQlicmFuY2ggPSAoKGluc24gPDwgMikgJiAweDAzZmZmZmZmKSB8Ci0JCQkgICAgKGluc24gPj4gMjMgJiAweDAwMDAwMDAyKTsKLQkJCWlmIChicmFuY2ggJiAweDAyMDAwMDAwKQotCQkJCWJyYW5jaCB8PSAweGZjMDAwMDAwOwotCQkJZGktPmRpX3ByaW50YWRkcihsb2MgKyA4ICsgYnJhbmNoKTsKLQkJCWJyZWFrOwotCQkvKiBYIC0gYmxvY2sgdHJhbnNmZXIgdHlwZSAqLwotCQljYXNlICdYJzoKLQkJCWRpLT5kaV9wcmludGYoIiVzIiwgaW5zbl9ibGt0cmFucyhpbnNuKSk7Ci0JCQlicmVhazsKLQkJLyogWSAtIGJsb2NrIHRyYW5zZmVyIHR5cGUgKHIxMyBiYXNlKSAqLwotCQljYXNlICdZJzoKLQkJCWRpLT5kaV9wcmludGYoIiVzIiwgaW5zbl9zdGtibGt0cmFucyhpbnNuKSk7Ci0JCQlicmVhazsKLQkJLyogYyAtIGNvbW1lbnQgZmllbGQgYml0cygwLTIzKSAqLwotCQljYXNlICdjJzoKLQkJCWRpLT5kaV9wcmludGYoIjB4JTA4eCIsIChpbnNuICYgMHgwMGZmZmZmZikpOwotCQkJYnJlYWs7Ci0JCS8qIGsgLSBicmVha3BvaW50IGNvbW1lbnQgKGJpdHMgMC0zLCA4LTE5KSAqLwotCQljYXNlICdrJzoKLQkJCWRpLT5kaV9wcmludGYoIjB4JTA0eCIsCi0JCQkgICAgKGluc24gJiAweDAwMGZmZjAwKSA+PiA0IHwgKGluc24gJiAweDAwMDAwMDBmKSk7Ci0JCQlicmVhazsKLQkJLyogcCAtIHNhdmVkIG9yIGN1cnJlbnQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCWNhc2UgJ3AnOgotCQkJaWYgKGluc24gJiAweDAwNDAwMDAwKQotCQkJCWRpLT5kaV9wcmludGYoInNwc3IiKTsKLQkJCWVsc2UKLQkJCQlkaS0+ZGlfcHJpbnRmKCJjcHNyIik7Ci0JCQlicmVhazsKLQkJLyogRiAtIFBTUiB0cmFuc2ZlciBmaWVsZHMgKi8KLQkJY2FzZSAnRic6Ci0JCQlkaS0+ZGlfcHJpbnRmKCJfIik7Ci0JCQlpZiAoaW5zbiAmICgxIDw8IDE2KSkKLQkJCQlkaS0+ZGlfcHJpbnRmKCJjIik7Ci0JCQlpZiAoaW5zbiAmICgxIDw8IDE3KSkKLQkJCQlkaS0+ZGlfcHJpbnRmKCJ4Iik7Ci0JCQlpZiAoaW5zbiAmICgxIDw8IDE4KSkKLQkJCQlkaS0+ZGlfcHJpbnRmKCJzIik7Ci0JCQlpZiAoaW5zbiAmICgxIDw8IDE5KSkKLQkJCQlkaS0+ZGlfcHJpbnRmKCJmIik7Ci0JCQlicmVhazsKLQkJLyogQiAtIGJ5dGUgdHJhbnNmZXIgZmxhZyAqLwotCQljYXNlICdCJzoKLQkJCWlmIChpbnNuICYgMHgwMDQwMDAwMCkKLQkJCQlkaS0+ZGlfcHJpbnRmKCJiIik7Ci0JCQlicmVhazsKLQkJLyogTCAtIGNvLXByb2Nlc3NvciB0cmFuc2ZlciBzaXplICovCi0JCWNhc2UgJ0wnOgotCQkJaWYgKGluc24gJiAoMSA8PCAyMikpCi0JCQkJZGktPmRpX3ByaW50ZigibCIpOwotCQkJYnJlYWs7Ci0JCS8qIFMgLSBzZXQgc3RhdHVzIGZsYWcgKi8KLQkJY2FzZSAnUyc6Ci0JCQlpZiAoaW5zbiAmIDB4MDAxMDAwMDApCi0JCQkJZGktPmRpX3ByaW50ZigicyIpOwotCQkJYnJlYWs7Ci0JCS8qIFAgLSBmcCBwcmVjaXNpb24gKi8KLQkJY2FzZSAnUCc6Ci0JCQlkaS0+ZGlfcHJpbnRmKCIlcyIsIGluc25fZnBhcHJlYyhpbnNuKSk7Ci0JCQlicmVhazsKLQkJLyogUSAtIGZwIHByZWNpc2lvbiAoZm9yIGxkZi9zdGYpICovCi0JCWNhc2UgJ1EnOgotCQkJYnJlYWs7Ci0JCS8qIFIgLSBmcCByb3VuZGluZyAqLwotCQljYXNlICdSJzoKLQkJCWRpLT5kaV9wcmludGYoIiVzIiwgaW5zbl9mcGFybmQoaW5zbikpOwotCQkJYnJlYWs7Ci0JCS8qIFcgLSB3cml0ZWJhY2sgZmxhZyAqLwotCQljYXNlICdXJzoKLQkJCWlmIChpbnNuICYgKDEgPDwgMjEpKQotCQkJCWRpLT5kaV9wcmludGYoIiEiKTsKLQkJCWJyZWFrOwotCQkvKiAjIC0gY28tcHJvY2Vzc29yIG51bWJlciAqLwotCQljYXNlICcjJzoKLQkJCWRpLT5kaV9wcmludGYoInAlZCIsIChpbnNuID4+IDgpICYgMHgwZik7Ci0JCQlicmVhazsKLQkJLyogdiAtIGNvLXByb2Nlc3NvciBkYXRhIHRyYW5zZmVyIHJlZ2lzdGVycythZGRyZXNzaW5nIG1vZGUgKi8KLQkJY2FzZSAndic6Ci0JCQlkaXNhc21faW5zbl9sZGNzdGMoZGksIGluc24sIGxvYyk7Ci0JCQlicmVhazsKLQkJLyogeCAtIGluc3RydWN0aW9uIGluIGhleCAqLwotCQljYXNlICd4JzoKLQkJCWRpLT5kaV9wcmludGYoIjB4JTA4eCIsIGluc24pOwotCQkJYnJlYWs7Ci0JCS8qIHkgLSBjby1wcm9jZXNzb3IgZGF0YSBwcm9jZXNzaW5nIHJlZ2lzdGVycyAqLwotCQljYXNlICd5JzoKLQkJCWRpLT5kaV9wcmludGYoIiVkLCAiLCAoaW5zbiA+PiAyMCkgJiAweDBmKTsKLQotCQkJZGktPmRpX3ByaW50ZigiYyVkLCBjJWQsIGMlZCIsIChpbnNuID4+IDEyKSAmIDB4MGYsCi0JCQkgICAgKGluc24gPj4gMTYpICYgMHgwZiwgaW5zbiAmIDB4MGYpOwotCi0JCQlkaS0+ZGlfcHJpbnRmKCIsICVkIiwgKGluc24gPj4gNSkgJiAweDA3KTsKLQkJCWJyZWFrOwotCQkvKiB6IC0gY28tcHJvY2Vzc29yIHJlZ2lzdGVyIHRyYW5zZmVyIHJlZ2lzdGVycyAqLwotCQljYXNlICd6JzoKLQkJCWRpLT5kaV9wcmludGYoIiVkLCAiLCAoaW5zbiA+PiAyMSkgJiAweDA3KTsKLQkJCWRpLT5kaV9wcmludGYoInIlZCwgYyVkLCBjJWQsICVkIiwKLQkJCSAgICAoaW5zbiA+PiAxMikgJiAweDBmLCAoaW5zbiA+PiAxNikgJiAweDBmLAotCQkJICAgIGluc24gJiAweDBmLCAoaW5zbiA+PiA1KSAmIDB4MDcpOwotCi0vKgkJCWlmICgoKGluc24gPj4gNSkgJiAweDA3KSAhPSAwKQotCQkJCWRpLT5kaV9wcmludGYoIiwgJWQiLCAoaW5zbiA+PiA1KSAmIDB4MDcpOyovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRpLT5kaV9wcmludGYoIlslYyAtIHVua25vd25dIiwgKmZfcHRyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgqKGZfcHRyKzEpID49ICdBJyAmJiAqKGZfcHRyKzEpIDw9ICdaJykKLQkJCSsrZl9wdHI7Ci0JCWVsc2UgaWYgKCooKytmX3B0cikpIHsKLQkJCSsrZm10OwotCQkJaWYgKGZtdCA9PSAxKQotCQkJCWRpLT5kaV9wcmludGYoIlx0Iik7Ci0JCQllbHNlCi0JCQkJZGktPmRpX3ByaW50ZigiLCAiKTsKLQkJfQotCX07Ci0KLQlkaS0+ZGlfcHJpbnRmKCJcbiIpOwotCi0JcmV0dXJuKGxvYyArIElOU05fU0laRSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRpc2FzbV9yZWdpc3Rlcl9zaGlmdChjb25zdCBkaXNhc21faW50ZXJmYWNlX3QgKmRpLCB1X2ludCBpbnNuKQotewotCWRpLT5kaV9wcmludGYoInIlZCIsIChpbnNuICYgMHgwZikpOwotCWlmICgoaW5zbiAmIDB4MDAwMDBmZjApID09IDApCi0JCTsKLQllbHNlIGlmICgoaW5zbiAmIDB4MDAwMDBmZjApID09IDB4MDAwMDAwNjApCi0JCWRpLT5kaV9wcmludGYoIiwgcnJ4Iik7Ci0JZWxzZSB7Ci0JCWlmIChpbnNuICYgMHgxMCkKLQkJCWRpLT5kaV9wcmludGYoIiwgJXMgciVkIiwgb3AyX3NoaWZ0KGluc24pLAotCQkJICAgIChpbnNuID4+IDgpICYgMHgwZik7Ci0JCWVsc2UKLQkJCWRpLT5kaV9wcmludGYoIiwgJXMgIyVkIiwgb3AyX3NoaWZ0KGluc24pLAotCQkJICAgIChpbnNuID4+IDcpICYgMHgxZik7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkCi1kaXNhc21fcHJpbnRfcmVnbGlzdChjb25zdCBkaXNhc21faW50ZXJmYWNlX3QgKmRpLCB1X2ludCBpbnNuKQotewotCWludCBsb29wOwotCWludCBzdGFydDsKLQlpbnQgY29tbWE7Ci0KLQlkaS0+ZGlfcHJpbnRmKCJ7Iik7Ci0Jc3RhcnQgPSAtMTsKLQljb21tYSA9IDA7Ci0KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTc7ICsrbG9vcCkgewotCQlpZiAoc3RhcnQgIT0gLTEpIHsKLQkJCWlmIChsb29wID09IDE2IHx8ICEoaW5zbiAmICgxIDw8IGxvb3ApKSkgewotCQkJCWlmIChjb21tYSkKLQkJCQkJZGktPmRpX3ByaW50ZigiLCAiKTsKLQkJCQllbHNlCi0JCQkJCWNvbW1hID0gMTsKLSAgICAgICAgCQkJaWYgKHN0YXJ0ID09IGxvb3AgLSAxKQotICAgICAgICAJCQkJZGktPmRpX3ByaW50ZigiciVkIiwgc3RhcnQpOwotICAgICAgICAJCQllbHNlCi0gICAgICAgIAkJCQlkaS0+ZGlfcHJpbnRmKCJyJWQtciVkIiwgc3RhcnQsIGxvb3AgLSAxKTsKLSAgICAgICAgCQkJc3RhcnQgPSAtMTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCWlmIChpbnNuICYgKDEgPDwgbG9vcCkpCi0gICAgICAgIAkJCXN0YXJ0ID0gbG9vcDsKLSAgICAgICAgCX0KLSAgICAgICAgfQotCWRpLT5kaV9wcmludGYoIn0iKTsKLQotCWlmIChpbnNuICYgKDEgPDwgMjIpKQotCQlkaS0+ZGlfcHJpbnRmKCJeIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc21faW5zbl9sZHJzdHIoY29uc3QgZGlzYXNtX2ludGVyZmFjZV90ICpkaSwgdV9pbnQgaW5zbiwgdV9pbnQgbG9jKQotewotCWludCBvZmZzZXQ7Ci0KLQlvZmZzZXQgPSBpbnNuICYgMHhmZmY7Ci0JaWYgKChpbnNuICYgMHgwMzJmMDAwMCkgPT0gMHgwMTBmMDAwMCkgewotCQkvKiByQSA9IHBjLCBpbW1lZGlhdGUgaW5kZXggKi8KLQkJaWYgKGluc24gJiAweDAwODAwMDAwKQotCQkJbG9jICs9IG9mZnNldDsKLQkJZWxzZQotCQkJbG9jIC09IG9mZnNldDsKLQkJZGktPmRpX3ByaW50YWRkcihsb2MgKyA4KTsKLSAJfSBlbHNlIHsKLQkJZGktPmRpX3ByaW50ZigiW3IlZCIsIChpbnNuID4+IDE2KSAmIDB4MGYpOwotCQlpZiAoKGluc24gJiAweDAzMDAwZmZmKSAhPSAweDAxMDAwMDAwKSB7Ci0JCQlkaS0+ZGlfcHJpbnRmKCIlcywgIiwgKGluc24gJiAoMSA8PCAyNCkpID8gIiIgOiAiXSIpOwotCQkJaWYgKCEoaW5zbiAmIDB4MDA4MDAwMDApKQotCQkJCWRpLT5kaV9wcmludGYoIi0iKTsKLQkJCWlmIChpbnNuICYgKDEgPDwgMjUpKQotCQkJCWRpc2FzbV9yZWdpc3Rlcl9zaGlmdChkaSwgaW5zbik7Ci0JCQllbHNlCi0JCQkJZGktPmRpX3ByaW50ZigiIzB4JTAzeCIsIG9mZnNldCk7Ci0JCX0KLQkJaWYgKGluc24gJiAoMSA8PCAyNCkpCi0JCQlkaS0+ZGlfcHJpbnRmKCJdIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNtX2luc25fbGRyaHN0cmgoY29uc3QgZGlzYXNtX2ludGVyZmFjZV90ICpkaSwgdV9pbnQgaW5zbiwgdV9pbnQgbG9jKQotewotCWludCBvZmZzZXQ7Ci0KLQlvZmZzZXQgPSAoKGluc24gJiAweGYwMCkgPj4gNCkgfCAoaW5zbiAmIDB4Zik7Ci0JaWYgKChpbnNuICYgMHgwMDRmMDAwMCkgPT0gMHgwMDRmMDAwMCkgewotCQkvKiByQSA9IHBjLCBpbW1lZGlhdGUgaW5kZXggKi8KLQkJaWYgKGluc24gJiAweDAwODAwMDAwKQotCQkJbG9jICs9IG9mZnNldDsKLQkJZWxzZQotCQkJbG9jIC09IG9mZnNldDsKLQkJZGktPmRpX3ByaW50YWRkcihsb2MgKyA4KTsKLSAJfSBlbHNlIHsKLQkJZGktPmRpX3ByaW50ZigiW3IlZCIsIChpbnNuID4+IDE2KSAmIDB4MGYpOwotCQlpZiAoKGluc24gJiAweDAxNDAwZjBmKSAhPSAweDAxNDAwMDAwKSB7Ci0JCQlkaS0+ZGlfcHJpbnRmKCIlcywgIiwgKGluc24gJiAoMSA8PCAyNCkpID8gIiIgOiAiXSIpOwotCQkJaWYgKCEoaW5zbiAmIDB4MDA4MDAwMDApKQotCQkJCWRpLT5kaV9wcmludGYoIi0iKTsKLQkJCWlmIChpbnNuICYgKDEgPDwgMjIpKQotCQkJCWRpLT5kaV9wcmludGYoIiMweCUwMngiLCBvZmZzZXQpOwotCQkJZWxzZQotCQkJCWRpLT5kaV9wcmludGYoInIlZCIsIChpbnNuICYgMHgwZikpOwotCQl9Ci0JCWlmIChpbnNuICYgKDEgPDwgMjQpKQotCQkJZGktPmRpX3ByaW50ZigiXSIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWRpc2FzbV9pbnNuX2xkY3N0Yyhjb25zdCBkaXNhc21faW50ZXJmYWNlX3QgKmRpLCB1X2ludCBpbnNuLCB1X2ludCBsb2MpCi17Ci0JaWYgKCgoaW5zbiA+PiA4KSAmIDB4ZikgPT0gMSkKLQkJZGktPmRpX3ByaW50ZigiZiVkLCAiLCAoaW5zbiA+PiAxMikgJiAweDA3KTsKLQllbHNlCi0JCWRpLT5kaV9wcmludGYoImMlZCwgIiwgKGluc24gPj4gMTIpICYgMHgwZik7Ci0KLQlkaS0+ZGlfcHJpbnRmKCJbciVkIiwgKGluc24gPj4gMTYpICYgMHgwZik7Ci0KLQlkaS0+ZGlfcHJpbnRmKCIlcywgIiwgKGluc24gJiAoMSA8PCAyNCkpID8gIiIgOiAiXSIpOwotCi0JaWYgKCEoaW5zbiAmICgxIDw8IDIzKSkpCi0JCWRpLT5kaV9wcmludGYoIi0iKTsKLQotCWRpLT5kaV9wcmludGYoIiMweCUwM3giLCAoaW5zbiAmIDB4ZmYpIDw8IDIpOwotCi0JaWYgKGluc24gJiAoMSA8PCAyNCkpCi0JCWRpLT5kaV9wcmludGYoIl0iKTsKLQotCWlmIChpbnNuICYgKDEgPDwgMjEpKQotCQlkaS0+ZGlfcHJpbnRmKCIhIik7Ci19Ci0KLXN0YXRpYyB1X2ludAotZGlzYXNzZW1ibGVfcmVhZHdvcmQodV9pbnQgYWRkcmVzcykKLXsKLQlyZXR1cm4oKigodV9pbnQgKilhZGRyZXNzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9wcmludGFkZHIodV9pbnQgYWRkcmVzcykKLXsKLQlwcmludGYoIjB4JTA4eCIsIGFkZHJlc3MpOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7Ci0JdmFfbGlzdCBhcDsKLQl2YV9zdGFydChhcCwgZm10KTsKLQl2cHJpbnRmKGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBkaXNhc21faW50ZXJmYWNlX3QgZGlzYXNzZW1ibGVfZGkgPSB7Ci0JZGlzYXNzZW1ibGVfcmVhZHdvcmQsIGRpc2Fzc2VtYmxlX3ByaW50YWRkciwgZGlzYXNzZW1ibGVfcHJpbnRmCi19OwotCi12b2lkCi1kaXNhc3NlbWJsZSh1X2ludCBhZGRyZXNzKQotewotCi0JKHZvaWQpZGlzYXNtKCZkaXNhc3NlbWJsZV9kaSwgYWRkcmVzcywgMCk7Ci19Ci0KLS8qIEVuZCBvZiBkaXNhc3NlbS5jICovCmRpZmYgLS1naXQgYS9saWJhY2MvdGVzdHMvZGlzYXNzZW0uaCBiL2xpYmFjYy90ZXN0cy9kaXNhc3NlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc0N2NkLi4wMDAwMDAwCi0tLSBhL2xpYmFjYy90ZXN0cy9kaXNhc3NlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoJJE5ldEJTRDogZGlzYXNzZW0uaCx2IDEuNCAyMDAxLzAzLzA0IDA0OjE1OjU4IG1hdHQgRXhwICQJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcgTWFyayBCcmluaWNvbWJlLgotICogQ29weXJpZ2h0IChjKSAxOTk3IENhdXNhbGl0eSBMaW1pdGVkLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgTWFyayBCcmluaWNvbWJlLgotICogNC4gVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgbm9yIHRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogRGVmaW5lIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIHJlcXVpcmVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCi0gKgotICogJEZyZWVCU0Q6IC9yZXBvbWFuL3IvbmN2cy9zcmMvc3lzL2FybS9pbmNsdWRlL2Rpc2Fzc2VtLmgsdiAxLjIgMjAwNS8wMS8wNSAyMTo1ODo0OCBpbXAgRXhwICQKLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTUFDSElORV9ESVNBU1NFTV9ICi0jZGVmaW5lIEFORFJPSURfTUFDSElORV9ESVNBU1NFTV9ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdV9pbnQJKCpkaV9yZWFkd29yZCkodV9pbnQpOwotCXZvaWQJKCpkaV9wcmludGFkZHIpKHVfaW50KTsJCi0Jdm9pZAkoKmRpX3ByaW50ZikoY29uc3QgY2hhciAqLCAuLi4pOwotfSBkaXNhc21faW50ZXJmYWNlX3Q7Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGNhbGxhYmxlIGZ1bmN0aW9ucyAqLwotCi11X2ludCBkaXNhc20oY29uc3QgZGlzYXNtX2ludGVyZmFjZV90ICosIHVfaW50LCBpbnQpOwotdm9pZCBkaXNhc3NlbWJsZSh1X2ludCk7Ci0KLSNpZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhQU5EUk9JRF9NQUNISU5FX0RJU0FTU0VNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy9tYWluLmNwcCBiL2xpYmFjYy90ZXN0cy9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlMzg2Zi4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAqIEFuZHJvaWQgIkFsbW9zdCIgQyBDb21waWxlci4KLSAqIFRoaXMgaXMgYSBjb21waWxlciBmb3IgYSBzbWFsbCBzdWJzZXQgb2YgdGhlIEMgbGFuZ3VhZ2UsIGludGVuZGVkIGZvciB1c2UKLSAqIGluIHNjcmlwdGluZyBlbnZpcm9ubWVudHMgd2hlcmUgc3BlZWQgYW5kIG1lbW9yeSBmb290cHJpbnQgYXJlIGltcG9ydGFudC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgdXBvbiB0aGUgInVub2JmdXNjYXRlZCIgdmVyc2lvbiBvZiB0aGUKLSAqIE9iZnVzY2F0ZWQgVGlueSBDIGNvbXBpbGVyLCBzZWUgdGhlIGZpbGUgTElDRU5TRSBmb3IgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWYgZGVmaW5lZChfX2FybV9fKQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fYXJtX18pCi0jZGVmaW5lIFBST1ZJREVfQVJNX0RJU0FTU0VNQkxZCi0jZW5kaWYKLQotI2lmZGVmIFBST1ZJREVfQVJNX0RJU0FTU0VNQkxZCi0jaW5jbHVkZSAiZGlzYXNzZW0uaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8YWNjL2FjYy5oPgotCi0KLXR5cGVkZWYgaW50ICgqTWFpblB0cikoaW50LCBjaGFyKiopOwotLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0IGNhbiBlYXNpbHkgYmUgc2V0IGJ5IGJyZWFrcG9pbnQgaW4gZ2RiLgotaW50IHJ1bihNYWluUHRyIG1haW5GdW5jLCBpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICByZXR1cm4gbWFpbkZ1bmMoYXJnYywgYXJndik7Ci19Ci0KLUFDQ3ZvaWQqIHN5bWJvbExvb2t1cChBQ0N2b2lkKiBwQ29udGV4dCwgY29uc3QgQUNDY2hhciogbmFtZSkgewotICAgIHJldHVybiAoQUNDdm9pZCopIGRsc3ltKFJUTERfREVGQVVMVCwgbmFtZSk7Ci19Ci0KLSNpZmRlZiBQUk9WSURFX0FSTV9ESVNBU1NFTUJMWQotCi1zdGF0aWMgRklMRSogZGlzYXNtT3V0OwotCi1zdGF0aWMgdV9pbnQKLWRpc2Fzc2VtYmxlX3JlYWR3b3JkKHVfaW50IGFkZHJlc3MpCi17Ci0gICAgcmV0dXJuKCooKHVfaW50ICopYWRkcmVzcykpOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfcHJpbnRhZGRyKHVfaW50IGFkZHJlc3MpCi17Ci0gICAgZnByaW50ZihkaXNhc21PdXQsICIweCUwOHgiLCBhZGRyZXNzKTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikgewotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgdmZwcmludGYoZGlzYXNtT3V0LCBmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi1zdGF0aWMgaW50IGRpc2Fzc2VtYmxlKEFDQ3NjcmlwdCogc2NyaXB0LCBGSUxFKiBvdXQpIHsKLSAgICBkaXNhc21PdXQgPSBvdXQ7Ci0gICAgZGlzYXNtX2ludGVyZmFjZV90ICBkaTsKLSAgICBkaS5kaV9yZWFkd29yZCA9IGRpc2Fzc2VtYmxlX3JlYWR3b3JkOwotICAgIGRpLmRpX3ByaW50YWRkciA9IGRpc2Fzc2VtYmxlX3ByaW50YWRkcjsKLSAgICBkaS5kaV9wcmludGYgPSBkaXNhc3NlbWJsZV9wcmludGY7Ci0KLSAgICBBQ0N2b2lkKiBiYXNlOwotICAgIEFDQ3NpemVpIGxlbmd0aDsKLQotICAgIGFjY0dldFByb2dyYW1CaW5hcnkoc2NyaXB0LCAmYmFzZSwgJmxlbmd0aCk7Ci0gICAgdW5zaWduZWQgbG9uZyogcEJhc2UgPSAodW5zaWduZWQgbG9uZyopIGJhc2U7Ci0gICAgdW5zaWduZWQgbG9uZyogcEVuZCA9ICh1bnNpZ25lZCBsb25nKikgKCgodW5zaWduZWQgY2hhciopIGJhc2UpICsgbGVuZ3RoKTsKLQotICAgIGZvcih1bnNpZ25lZCBsb25nKiBwSW5zdHJ1Y3Rpb24gPSBwQmFzZTsgcEluc3RydWN0aW9uIDwgcEVuZDsgcEluc3RydWN0aW9uKyspIHsKLSAgICAgICAgZnByaW50ZihvdXQsICIlMDh4OiAlMDh4ICAiLCAoaW50KSBwSW5zdHJ1Y3Rpb24sIChpbnQpICpwSW5zdHJ1Y3Rpb24pOwotICAgICAgICA6OmRpc2FzbSgmZGksICh1aW50KSBwSW5zdHJ1Y3Rpb24sIDApOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8vIFBST1ZJREVfQVJNX0RJU0FTU0VNQkxZCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIGNvbnN0IGNoYXIqIGluRmlsZSA9IE5VTEw7Ci0gICAgYm9vbCBwcmludExpc3Rpbmc7Ci0gICAgYm9vbCBydW5SZXN1bHRzID0gZmFsc2U7Ci0gICAgRklMRSogaW4gPSBzdGRpbjsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgIGNoYXIqIGFyZyA9IGFyZ3ZbaV07Ci0gICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFyZ1sxXSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgICAgICBwcmludExpc3RpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdSJzoKLSAgICAgICAgICAgICAgICAgICAgcnVuUmVzdWx0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBmbGFnICVzXG4iLCBhcmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGluRmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpbkZpbGUgPSBhcmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghIGluRmlsZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImlucHV0IGZpbGUgcmVxdWlyZWRcbiIpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgICBpZiAoaW5GaWxlKSB7Ci0gICAgICAgIGluID0gZm9wZW4oaW5GaWxlLCAiciIpOwotICAgICAgICBpZiAoIWluKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGluRmlsZSk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZzZWVrKGluLCAwLCBTRUVLX0VORCk7Ci0gICAgc2l6ZV90IGZpbGVTaXplID0gKHNpemVfdCkgZnRlbGwoaW4pOwotICAgIHJld2luZChpbik7Ci0gICAgQUNDY2hhciogdGV4dCA9IG5ldyBBQ0NjaGFyW2ZpbGVTaXplICsgMV07Ci0gICAgc2l6ZV90IGJ5dGVzUmVhZCA9IGZyZWFkKHRleHQsIDEsIGZpbGVTaXplLCBpbik7Ci0gICAgaWYgKGJ5dGVzUmVhZCAhPSBmaWxlU2l6ZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZWFkIGFsbCBvZiBmaWxlICVzXG4iLCBpbkZpbGUpOwotICAgIH0KLQotICAgIHRleHRbZmlsZVNpemVdID0gJ1wwJzsKLQotICAgIEFDQ3NjcmlwdCogc2NyaXB0ID0gYWNjQ3JlYXRlU2NyaXB0KCk7Ci0KLSAgICBjb25zdCBBQ0NjaGFyKiBzY3JpcHRTb3VyY2VbXSA9IHt0ZXh0fTsKLSAgICBhY2NTY3JpcHRTb3VyY2Uoc2NyaXB0LCAxLCBzY3JpcHRTb3VyY2UsIE5VTEwpOwotICAgIGRlbGV0ZVtdIHRleHQ7Ci0KLSAgICBhY2NSZWdpc3RlclN5bWJvbENhbGxiYWNrKHNjcmlwdCwgc3ltYm9sTG9va3VwLCBOVUxMKTsKLQotICAgIGFjY0NvbXBpbGVTY3JpcHQoc2NyaXB0KTsKLSAgICBpbnQgcmVzdWx0ID0gYWNjR2V0RXJyb3Ioc2NyaXB0KTsKLSAgICBNYWluUHRyIG1haW5Qb2ludGVyID0gMDsKLSAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgICAgQUNDc2l6ZWkgYnVmZmVyTGVuZ3RoOwotICAgICAgICBhY2NHZXRTY3JpcHRJbmZvTG9nKHNjcmlwdCwgMCwgJmJ1ZmZlckxlbmd0aCwgTlVMTCk7Ci0gICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1ZmZlckxlbmd0aCArIDEpOwotICAgICAgICBpZiAoYnVmICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdEluZm9Mb2coc2NyaXB0LCBidWZmZXJMZW5ndGggKyAxLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGJ1Zik7Ci0gICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkuXG4iKTsKLSAgICAgICAgfQotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotCi0gICAgewotICAgICAgICBBQ0NzaXplaSBudW1QcmFnbWFTdHJpbmdzOwotICAgICAgICBhY2NHZXRQcmFnbWFzKHNjcmlwdCwgJm51bVByYWdtYVN0cmluZ3MsIDAsIE5VTEwpOwotICAgICAgICBpZiAobnVtUHJhZ21hU3RyaW5ncykgewotICAgICAgICAgICAgY2hhcioqIHN0cmluZ3MgPSBuZXcgY2hhcipbbnVtUHJhZ21hU3RyaW5nc107Ci0gICAgICAgICAgICBhY2NHZXRQcmFnbWFzKHNjcmlwdCwgTlVMTCwgbnVtUHJhZ21hU3RyaW5ncywgc3RyaW5ncyk7Ci0gICAgICAgICAgICBmb3IoQUNDc2l6ZWkgaSA9IDA7IGkgPCBudW1QcmFnbWFTdHJpbmdzOyBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiNwcmFnbWEgJXMoJXMpXG4iLCBzdHJpbmdzW2ldLCBzdHJpbmdzW2krMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlW10gc3RyaW5nczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcmludExpc3RpbmcpIHsKLSNpZmRlZiBQUk9WSURFX0FSTV9ESVNBU1NFTUJMWQotICAgICAgICBkaXNhc3NlbWJsZShzY3JpcHQsIHN0ZGVycik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBpZiAocnVuUmVzdWx0cykgewotICAgICAgICBhY2NHZXRTY3JpcHRMYWJlbChzY3JpcHQsICJtYWluIiwgKEFDQ3ZvaWQqKikgJiBtYWluUG9pbnRlcik7Ci0KLSAgICAgICAgcmVzdWx0ID0gYWNjR2V0RXJyb3Ioc2NyaXB0KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBBQ0NfTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGZpbmQgbWFpbjogJWRcbiIsIHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOlxuIik7Ci0gICAgICAgICAgICBpbnQgY29kZUFyZ2MgPSBhcmdjIC0gaSArIDE7Ci0gICAgICAgICAgICBjaGFyKiogY29kZUFyZ3YgPSBhcmd2ICsgaSAtIDE7Ci0gICAgICAgICAgICBjb2RlQXJndlswXSA9IChjaGFyKikgKGluRmlsZSA/IGluRmlsZSA6ICJzdGRpbiIpOwotICAgICAgICAgICAgcmVzdWx0ID0gcnVuKG1haW5Qb2ludGVyLCBjb2RlQXJnYywgY29kZUFyZ3YpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZXN1bHQ6ICVkXG4iLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi1leGl0OgotCi0gICAgYWNjRGVsZXRlU2NyaXB0KHNjcmlwdCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL3J1bnRpbWVUZXN0LmNwcCBiL2xpYmFjYy90ZXN0cy9ydW50aW1lVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YmY4NzcuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL3J1bnRpbWVUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogUnVudGltZVRlc3QgZm9yIEFDQyBjb21waWxlci4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWYgZGVmaW5lZChfX2FybV9fKQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhY2MvYWNjLmg+Ci0KLQotdHlwZWRlZiB2b2lkICgqU2NyaXB0UHRyKSgpOwotCi0vLyBUaGlzIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGVhc2lseSBiZSBzZXQgYnkgYnJlYWtwb2ludCBpbiBnZGIuCi12b2lkIHJ1bihTY3JpcHRQdHIgc2NyaXB0Rm4pIHsKLSAgICBzY3JpcHRGbigpOwotfQotCi0vLyBQcml2YXRlIEFQSSBmb3IgZGV2ZWxvcG1lbnQ6Ci0KLWV4dGVybiAiQyIKLXZvaWQgYWNjRGlzYXNzZW1ibGUoQUNDc2NyaXB0KiBzY3JpcHQpOwotCi1pbnQgZ2xvYmFsVmFyOwotCi12b2lkIG9wX2ludChpbnQgYSkgewotICAgIHByaW50Zigib3BfaW50KCVkKVxuIiwgYSk7Ci19Ci0KLXZvaWQgb3BfZmxvYXQxMihmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjLCBmbG9hdCBkLAotICAgICAgICAgICAgICAgIGZsb2F0IGUsIGZsb2F0IGYsIGZsb2F0IGcsIGZsb2F0IGgsCi0gICAgICAgICAgICAgICAgZmxvYXQgaSwgZmxvYXQgaiwgZmxvYXQgaywgZmxvYXQgbCkgewotICAgIHByaW50Zigib3BfZmxvYXQxMiglZywgJWcsICVnLCAlZywgJWcsICVnLCAlZywgJWcsICVnLCAlZywgJWcsICVnKVxuIiwKLSAgICAgICAgICAgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCk7Ci19Ci0KLWNvbnN0IGNoYXIqIHRleHQgPSAidm9pZCBvcF9pbnQoaW50IGEpO1xuIgotICAgICJ2b2lkIG9wX2Zsb2F0MTIoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCxcbiIKLSAgICAiICAgICAgICAgICBmbG9hdCBlLCBmbG9hdCBmLCBmbG9hdCBnLCBmbG9hdCBoLFxuIgotICAgICIgICAgICAgICAgIGZsb2F0IGksIGZsb2F0IGosIGZsb2F0IGssIGZsb2F0IGwpO1xuIgotICAgICJ2b2lkIHNjcmlwdCgpIHtcbiIKLSAgICAiICBnbG9iYWxWYXIgKz0gMztcbiIKLSAgICAiICBvcF9pbnQoMTIzKTtcbiIKLSAgICAiICBvcF9mbG9hdDEyKDEuMCwgMi4wLCAzLjAsIDQuMCwgNS4wLCA2LjAsIDcuMCwgOC4wLCA5LjAsIDEwLjAsIDExLjAsIDEyLjApO1xuIgotICAgICJ9XG4iOwotCi1BQ0N2b2lkKiBzeW1ib2xMb29rdXAoQUNDdm9pZCogcENvbnRleHQsIGNvbnN0IEFDQ2NoYXIqIG5hbWUpIHsKLSAgICBpZiAoc3RyY21wKCJvcF9pbnQiLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAoQUNDdm9pZCopIG9wX2ludDsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcCgib3BfZmxvYXQxMiIsIG5hbWUpID09IDApIHsKLSAgICAgICAgcmV0dXJuIChBQ0N2b2lkKikgb3BfZmxvYXQxMjsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcCgiZ2xvYmFsVmFyIiwgbmFtZSkgPT0gMCkgewotICAgICAgICByZXR1cm4gKEFDQ3ZvaWQqKSAmZ2xvYmFsVmFyOwotICAgIH0KLSAgICByZXR1cm4gKEFDQ3ZvaWQqKSBkbHN5bShSVExEX0RFRkFVTFQsIG5hbWUpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICBBQ0NzY3JpcHQqIHNjcmlwdCA9IGFjY0NyZWF0ZVNjcmlwdCgpOwotCi0gICAgYWNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzY3JpcHQsIHN5bWJvbExvb2t1cCwgTlVMTCk7Ci0KLSAgICBjb25zdCBBQ0NjaGFyKiBzY3JpcHRTb3VyY2VbXSA9IHt0ZXh0fTsKLSAgICBhY2NTY3JpcHRTb3VyY2Uoc2NyaXB0LCAxLCBzY3JpcHRTb3VyY2UsIE5VTEwpOwotCi0gICAgYWNjQ29tcGlsZVNjcmlwdChzY3JpcHQpOwotICAgIGludCByZXN1bHQgPSBhY2NHZXRFcnJvcihzY3JpcHQpOwotICAgIFNjcmlwdFB0ciBzY3JpcHRQb2ludGVyID0gMDsKLSAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgICAgY2hhciBidWZbMTAyNF07Ci0gICAgICAgIGFjY0dldFNjcmlwdEluZm9Mb2coc2NyaXB0LCBzaXplb2YoYnVmKSwgTlVMTCwgYnVmKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGJ1Zik7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEFDQ3NpemVpIG51bVByYWdtYVN0cmluZ3M7Ci0gICAgICAgIGFjY0dldFByYWdtYXMoc2NyaXB0LCAmbnVtUHJhZ21hU3RyaW5ncywgMCwgTlVMTCk7Ci0gICAgICAgIGlmIChudW1QcmFnbWFTdHJpbmdzKSB7Ci0gICAgICAgICAgICBjaGFyKiogc3RyaW5ncyA9IG5ldyBjaGFyKltudW1QcmFnbWFTdHJpbmdzXTsKLSAgICAgICAgICAgIGFjY0dldFByYWdtYXMoc2NyaXB0LCBOVUxMLCBudW1QcmFnbWFTdHJpbmdzLCBzdHJpbmdzKTsKLSAgICAgICAgICAgIGZvcihBQ0NzaXplaSBpID0gMDsgaSA8IG51bVByYWdtYVN0cmluZ3M7IGkgKz0gMikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiI3ByYWdtYSAlcyglcylcbiIsIHN0cmluZ3NbaV0sIHN0cmluZ3NbaSsxXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGVbXSBzdHJpbmdzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYWNjR2V0U2NyaXB0TGFiZWwoc2NyaXB0LCAic2NyaXB0IiwgKEFDQ3ZvaWQqKikgJiBzY3JpcHRQb2ludGVyKTsKLQotICAgIHJlc3VsdCA9IGFjY0dldEVycm9yKHNjcmlwdCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQ0NfTk9fRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZmluZCBzY3JpcHQ6ICVkXG4iLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXhlY3V0aW5nIHNjcmlwdDpcbiIpOwotICAgICAgICBnbG9iYWxWYXIgPSAxNzsKLSAgICAgICAgcnVuKHNjcmlwdFBvaW50ZXIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFmdGVyIHNjcmlwdCBnbG9iYWxWYXIgPSAlZFxuIiwgZ2xvYmFsVmFyKTsKLSAgICB9Ci0KLQotZXhpdDoKLQotICAgIGFjY0RlbGV0ZVNjcmlwdChzY3JpcHQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2xpYmFjYy90ZXN0cy90ZXN0IGIvbGliYWNjL3Rlc3RzL3Rlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmZDY5MTYuLjAwMDAwMDAKLS0tIGEvbGliYWNjL3Rlc3RzL3Rlc3QKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLVNDUklQVF9ESVI9YGRpcm5hbWUgJEJBU0hfU09VUkNFYAotY2QgJFNDUklQVF9ESVIKLXB5dGhvbiB0ZXN0LnB5ICIkQCIKLQpkaWZmIC0tZ2l0IGEvbGliYWNjL3Rlc3RzL3Rlc3QucHkgYi9saWJhY2MvdGVzdHMvdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NDRjNy4uMDAwMDAwMAotLS0gYS9saWJhY2MvdGVzdHMvdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0jCi0jIFRlc3QgdGhlIGFjYyBjb21waWxlcgotCi1pbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLQotZ0FybUluaXRpYWxpemVkID0gRmFsc2UKLWdVc2VBcm0gPSBUcnVlCi1nVXNlWDg2ID0gVHJ1ZQotZ1J1bk9UQ0NPdXRwdXQgPSBUcnVlCi1nQ29tcGlsZU9UQ0NBTlNJID0gVHJ1ZQotCi0KLWRlZiBwYXJzZUFyZ3YoKToKLSAgICBnbG9iYWwgZ1VzZUFybQotICAgIGdsb2JhbCBnVXNlWDg2Ci0gICAgZ2xvYmFsIGdSdW5PVENDT3V0cHV0Ci0gICAgZm9yIGFyZyBpbiBzeXMuYXJndlsxOl06Ci0gICAgICAgIGlmIGFyZyA9PSAiLS1ub2FybSI6Ci0gICAgICAgICAgICBwcmludCAiLS1ub2FybTogbm90IHRlc3RpbmcgQVJNIgotICAgICAgICAgICAgZ1VzZUFybSA9IEZhbHNlCi0gICAgICAgIGVsaWYgYXJnID09ICItLW5veDg2IjoKLSAgICAgICAgICAgIHByaW50ICItLW5veDg2OiBub3QgdGVzdGluZyB4ODYiCi0gICAgICAgICAgICBnVXNlWDg2ID0gRmFsc2UKLSAgICAgICAgZWxpZiBhcmcgPT0gIi0tbm9ydW5vdGNjIjoKLSAgICAgICAgICAgIHByaW50ICItLW5vcnVub3RjYyBkZXRlY3RlZCwgbm90IHJ1bm5pbmcgT1RDQyBvdXRwdXQiCi0gICAgICAgICAgICBnUnVuT1RDQ091dHB1dCA9IEZhbHNlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiVW5rbm93biBwYXJhbWV0ZXI6ICIsIGFyZwotICAgICAgICAgICAgcmFpc2UgIlVua25vd24gcGFyYW1ldGVyIgotICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbMDoxXQotCi1kZWYgY29tcGlsZShhcmdzKToKLSAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihbImFjYyJdICsgYXJncywgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICByZXN1bHQgPSBwcm9jLmNvbW11bmljYXRlKCkKLSAgICByZXR1cm4gcmVzdWx0Ci0KLWRlZiBydW5DbWQoYXJncyk6Ci0gICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKLSAgICByZXN1bHQgPSBwcm9jLmNvbW11bmljYXRlKCkKLSAgICByZXR1cm4gcmVzdWx0WzBdLnN0cmlwKCkKLQotZGVmIHVuYW1lKCk6Ci0gICAgcmV0dXJuIHJ1bkNtZChbInVuYW1lIl0pCi0KLWRlZiB1bmFtZU0oKToKLSAgICByZXR1cm4gcnVuQ21kKFsidW5hbWUiLCAiLW0iXSkKLQotZGVmIHdoaWNoKGl0ZW0pOgotICAgIHJldHVybiBydW5DbWQoWyJ3aGljaCIsIGl0ZW1dKQotCi1kZWYgZmlsZVR5cGUoaXRlbSk6Ci0gICAgcmV0dXJuIHJ1bkNtZChbImZpbGUiLCBpdGVtXSkKLQotZGVmIG91dHB1dENhblJ1bigpOgotICAgIGZ0ID0gZmlsZVR5cGUod2hpY2goImFjYyIpKQotICAgIHJldHVybiBmdC5maW5kKCJFTEYgMzItYml0IExTQiBleGVjdXRhYmxlLCBJbnRlbCA4MDM4NiIpID49IDAKLQotZGVmIGNoZWNrRW52aXJvbm1lbnQoKToKLSAgICBnbG9iYWwgZ1J1bk9UQ0NPdXRwdXQKLSAgICBnbG9iYWwgZ0NvbXBpbGVPVENDQU5TSQotICAgIG9zTmFtZSA9IHVuYW1lKCkKLSAgICBnUnVuT1RDQ091dHB1dCA9IG9zTmFtZSA9PSAiTGludXgiIGFuZCB1bmFtZU0oKSAhPSAieDg2XzY0IiBhbmQgb3V0cHV0Q2FuUnVuKCkKLSAgICAjIE9TWCBkb2Vzbid0IGhhdmUgc3RkaW4vc3Rkb3V0L3N0ZGVyciBhY2Nlc3NpYmxlIHRocm91Z2ggZGxsIGxvYWQgc3ltYm9scywgc28KLSAgICAjIHdlIGNhbid0IGNvbXBpbGUgdGhlIEFOU0kgdmVyc2lvbiBvZiB0aGUgT1RDQyBjb21waWxlciBvbiBPUyBYLgotICAgIGdDb21waWxlT1RDQ0FOU0kgPSBvc05hbWUgPT0gIkxpbnV4IgotCi1kZWYgYWRiKGFyZ3MpOgotICAgIHJldHVybiBydW5DbWQoWyJhZGIiXSArIGFyZ3MpCi0KLWRlZiBzZXR1cEFybSgpOgotICAgIGdsb2JhbCBnQXJtSW5pdGlhbGl6ZWQKLSAgICBpZiBnQXJtSW5pdGlhbGl6ZWQ6Ci0gICAgICAgIHJldHVybgotICAgIHByaW50ICJTZXR0aW5nIHVwIGFybSIKLSAgICBhZGIoWyJyZW1vdW50Il0pCi0gICAgYWRiKFsic2hlbGwiLCAicm0iLCAiL3N5c3RlbS9iaW4vYWNjIl0pCi0gICAgYWRiKFsic2hlbGwiLCAibWtkaXIiLCAiL3N5c3RlbS9iaW4vYWNjZGF0YSJdKQotICAgIGFkYihbInNoZWxsIiwgIm1rZGlyIiwgIi9zeXN0ZW0vYmluL2FjY2RhdGEvZGF0YSJdKQotICAgICMgQ2xlYXIgb3V0IG9sZCBkYXRhIFRPRE86IGhhbmRsZSByZWN1cnNpb24KLSAgICBhZGIoWyJzaGVsbCIsICJybSIsICIvc3lzdGVtL2Jpbi9hY2NkYXRhL2RhdGEvKiJdKQotICAgICMgQ29weSBvdmVyIGRhdGEKLSAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsaygiZGF0YSIpOgotICAgICAgICBmb3IgZCBpbiBkaXJzOgotICAgICAgICAgICAgYWRiKFsic2hlbGwiLCAibWtkaXIiLCBvcy5wYXRoLmpvaW4ocm9vdCwgZCldKQotICAgICAgICBmb3IgZiBpbiBmaWxlczoKLSAgICAgICAgICAgIGFkYihbInB1c2giLCBvcy5wYXRoLmpvaW4ocm9vdCwgZiksIG9zLnBhdGguam9pbigiL3N5c3RlbS9iaW4vYWNjZGF0YSIsIHJvb3QsIGYpXSkKLSAgICAjIENvcHkgb3ZlciBjb21waWxlcgotICAgIGFkYihbInN5bmMiXSkKLSAgICBnQXJtSW5pdGlhbGl6ZWQgPSBUcnVlCi0KLWRlZiBjb21waWxlQXJtKGFyZ3MpOgotICAgIHNldHVwQXJtKCkKLSAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihbImFkYiIsICJzaGVsbCIsICIvc3lzdGVtL2Jpbi9hY2MiXSArIGFyZ3MsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gICAgcmVzdWx0ID0gcHJvYy5jb21tdW5pY2F0ZSgpCi0gICAgcmV0dXJuIHJlc3VsdFswXS5yZXBsYWNlKCJcciIsIiIpCi0KLWRlZiBjb21wYXJlKGEsIGIpOgotICAgIGlmIGEgIT0gYjoKLSAgICAgICAgZmlyc3REaWZmID0gZmlyc3REaWZmZXJlbmNlKGEsIGIpCi0gICAgICAgIHByaW50ICJTdHJpbmdzIGRpZmZlciBhdCBjaGFyYWN0ZXIgJWQuIENvbW1vbjogJXMuIERpZmZlcmVuY2UgJyVzJyAhPSAnJXMnIiAlICgKLSAgICAgICAgICAgIGZpcnN0RGlmZiwgYVswOmZpcnN0RGlmZl0sIHNhZmVBY2Nlc3MoYSwgZmlyc3REaWZmKSwgc2FmZUFjY2VzcyhiLCBmaXJzdERpZmYpKQotCi1kZWYgc2FmZUFjY2VzcyhzLCBpKToKLSAgICBpZiAwIDw9IGkgPCBsZW4ocyk6Ci0gICAgICAgIHJldHVybiBzW2ldCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuICc/JwotCi1kZWYgZmlyc3REaWZmZXJlbmNlKGEsIGIpOgotICAgIGNvbW1vbkxlbiA9IG1pbihsZW4oYSksIGxlbihiKSkKLSAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgY29tbW9uTGVuKToKLSAgICAgICAgaWYgYVtpXSAhPSBiW2ldOgotICAgICAgICAgICAgcmV0dXJuIGkKLSAgICByZXR1cm4gY29tbW9uTGVuCi0KLSMgYTEgYW5kIGEyIGFyZSB0aGUgZXhwZWN0ZWQgc3Rkb3V0IGFuZCBzdGRlcnIuCi0jIGIxIGFuZCBiMiBhcmUgdGhlIGFjdHVhbCBzdGRvdXQgYW5kIHN0ZGVyci4KLSMgQ29tcGFyZSB0aGUgdHdvLCBzZXRzLiBBbGxvdyBhbnkgaW5kaXZpZHVhbCBsaW5lCi0jIHRvIGFwcGVhciBpbiBlaXRoZXIgc3Rkb3V0IG9yIHN0ZGVyci4gVGhpcyBpcyBiZWNhdXNlCi0jIHRoZSB3YXkgd2Ugb2J0YWluIG91dHB1dCBvbiB0aGUgQVJNIGNvbWJpbmVzIGJvdGgKLSMgc3RyZWFtcyBpbnRvIG9uZSBzZXF1ZW5jZS4KLQotZGVmIGNvbXBhcmVPdXB1dChhMSxhMixiMSxiMik6Ci0gICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgdG90YWxMZW4gPSBsZW4oYTEpICsgbGVuKGEyKSArIGxlbihiMSkgKyBsZW4oYjIpCi0gICAgICAgIGExLCBiMSA9IG1hdGNoQ29tbW9uKGExLCBiMSkKLSAgICAgICAgYTEsIGIyID0gbWF0Y2hDb21tb24oYTEsIGIyKQotICAgICAgICBhMiwgYjEgPSBtYXRjaENvbW1vbihhMiwgYjEpCi0gICAgICAgIGEyLCBiMiA9IG1hdGNoQ29tbW9uKGEyLCBiMikKLSAgICAgICAgbmV3VG90YWxMZW4gPSBsZW4oYTEpICsgbGVuKGEyKSArIGxlbihiMSkgKyBsZW4oYjIpCi0gICAgICAgIGlmIG5ld1RvdGFsTGVuID09IDA6Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICBpZiBuZXdUb3RhbExlbiA9PSB0b3RhbExlbjoKLSAgICAgICAgICAgIHByaW50ICJGYWlsZWQgYXQgJWQgJWQgJWQgJWQiICUgKGxlbihhMSksIGxlbihhMiksIGxlbihiMSksIGxlbihiMikpCi0gICAgICAgICAgICBwcmludCAiYTEiLCBhMQotICAgICAgICAgICAgcHJpbnQgImEyIiwgYTIKLSAgICAgICAgICAgIHByaW50ICJiMSIsIGIxCi0gICAgICAgICAgICBwcmludCAiYjIiLCBiMgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLWRlZiBtYXRjaENvbW1vbihhLCBiKToKLSAgICAiIiJSZW1vdmUgY29tbW9uIGl0ZW1zIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhIGFuZCBiLAotICAgICAgIHJldHVybiBqdXN0IHRoZSB0YWlscyB0aGF0IGFyZSBkaWZmZXJlbnQuIiIiCi0gICAgd2hpbGUgbGVuKGEpID4gMCBhbmQgbGVuKGIpID4gMCBhbmQgYVswXSA9PSBiWzBdOgotICAgICAgICBhID0gYVsxOl0KLSAgICAgICAgYiA9IGJbMTpdCi0gICAgcmV0dXJuIGEsIGIKLQotZGVmIHJld3JpdGVQYXRocyhhcmdzKToKLSAgICByZXR1cm4gW3Jld3JpdGVQYXRoKHgpIGZvciB4IGluIGFyZ3NdCi0KLWRlZiByZXdyaXRlUGF0aChwKToKLSAgICAiIiJUYWtlIGEgcGF0aCB0aGF0J3MgY29ycmVjdCBvbiB0aGUgeDg2IGFuZCBjb252ZXJ0IHRvIGEgcGF0aAotICAgICAgIHRoYXQncyBjb3JyZWN0IG9uIEFSTS4iIiIKLSAgICBpZiBwLnN0YXJ0c3dpdGgoImRhdGEvIik6Ci0gICAgICAgIHAgPSAiL3N5c3RlbS9iaW4vYWNjZGF0YS8iICsgcAotICAgIHJldHVybiBwCi0KLWNsYXNzIFRlc3RBQ0ModW5pdHRlc3QuVGVzdENhc2UpOgotCi0gICAgZGVmIGNoZWNrUmVzdWx0KHNlbGYsIG91dCwgZXJyLCBzdGRFcnJSZXN1bHQsIHN0ZE91dFJlc3VsdD0iIik6Ci0gICAgICAgIGExID0gb3V0LnNwbGl0bGluZXMoKQotICAgICAgICBhMiA9IGVyci5zcGxpdGxpbmVzKCkKLSAgICAgICAgYjIgPSBzdGRFcnJSZXN1bHQuc3BsaXRsaW5lcygpCi0gICAgICAgIGIxID0gc3RkT3V0UmVzdWx0LnNwbGl0bGluZXMoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGNvbXBhcmVPdXB1dChhMSxhMixiMSxiMikpCi0KLSAgICBkZWYgY29tcGlsZUNoZWNrKHNlbGYsIGFyZ3MsIHN0ZEVyclJlc3VsdCwgc3RkT3V0UmVzdWx0PSIiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cz1bJ2FybScsICd4ODYnXSk6Ci0gICAgICAgIGdsb2JhbCBnVXNlQXJtCi0gICAgICAgIGdsb2JhbCBnVXNlWDg2Ci0gICAgICAgIHRhcmdldFNldCA9IGZyb3plbnNldCh0YXJnZXRzKQotICAgICAgICBpZiBnVXNlWDg2IGFuZCAneDg2JyBpbiB0YXJnZXRTZXQ6Ci0gICAgICAgICAgICBvdXQsIGVyciA9IGNvbXBpbGUoYXJncykKLSAgICAgICAgICAgIHNlbGYuY2hlY2tSZXN1bHQob3V0LCBlcnIsIHN0ZEVyclJlc3VsdCwgc3RkT3V0UmVzdWx0KQotICAgICAgICBpZiBnVXNlQXJtIGFuZCAnYXJtJyBpbiB0YXJnZXRTZXQ6Ci0gICAgICAgICAgICBvdXQgPSBjb21waWxlQXJtKHJld3JpdGVQYXRocyhhcmdzKSkKLSAgICAgICAgICAgIHNlbGYuY2hlY2tSZXN1bHQob3V0LCAiIiwgc3RkRXJyUmVzdWx0LCBzdGRPdXRSZXN1bHQpCi0KLSAgICBkZWYgY29tcGlsZUNoZWNrQXJtKHNlbGYsIGFyZ3MsIHJlc3VsdCk6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGlsZUFybShhcmdzKSwgcmVzdWx0KQotCi0gICAgZGVmIHRlc3RDb21waWxlUmV0dXJuVmFsKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbImRhdGEvcmV0dXJudmFsLWFuc2kuYyJdLCAiIikKLQotICAgIGRlZiB0ZXN0Q29tcGlsZU9UQ0NBTlNJKHNlbGYpOgotICAgICAgICBnbG9iYWwgZ0NvbXBpbGVPVENDQU5TSQotICAgICAgICBpZiBnQ29tcGlsZU9UQ0NBTlNJOgotICAgICAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyJkYXRhL290Y2MtYW5zaS5jIl0sICIiLCAiIiwgWyd4ODYnXSkKLQotICAgIGRlZiB0ZXN0UnVuUmV0dXJuVmFsKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvcmV0dXJudmFsLWFuc2kuYyJdLAotICAgICAgICAiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6XG5yZXN1bHQ6IDQyXG4iKQotCi0gICAgZGVmIHRlc3RDb250aW51ZShzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2NvbnRpbnVlLmMiXSwKLSAgICAgICAgIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOlxucmVzdWx0OiA0MDBcbiIpCi0KLSAgICBkZWYgdGVzdFN0cmluZ0xpdGVyYWxDb25jYXRlbmF0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvdGVzdFN0cmluZ0NvbmNhdC5jIl0sCi0gICAgICAgICJFeGVjdXRpbmcgY29tcGlsZWQgY29kZTpcbnJlc3VsdDogMTNcbiIsICJIZWxsbywgd29ybGRcbiIpCi0KLSAgICBkZWYgdGVzdFJ1bk9UQ0NBTlNJKHNlbGYpOgotICAgICAgICBnbG9iYWwgZ1J1bk9UQ0NPdXRwdXQKLSAgICAgICAgaWYgZ1J1bk9UQ0NPdXRwdXQ6Ci0gICAgICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvb3RjYy1hbnNpLmMiLCAiZGF0YS9yZXR1cm52YWwuYyJdLAotICAgICAgICAgICAgICAgICJFeGVjdXRpbmcgY29tcGlsZWQgY29kZTpcbm90Y2MtYW5zaS5jOiBBYm91dCB0byBleGVjdXRlIGNvbXBpbGVkIGNvZGU6XG5hdGNjLWFuc2kuYzogcmVzdWx0OiA0MlxucmVzdWx0OiA0MlxuIiwgIiIsCi0gICAgICAgICAgICAgICAgIFsneDg2J10pCi0KLSAgICBkZWYgdGVzdFJ1bk9UQ0NBTlNJMihzZWxmKToKLSAgICAgICAgZ2xvYmFsIGdSdW5PVENDT3V0cHV0Ci0gICAgICAgIGlmIGdSdW5PVENDT3V0cHV0OgotICAgICAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL290Y2MtYW5zaS5jIiwgImRhdGEvb3RjYy5jIiwgImRhdGEvcmV0dXJudmFsLmMiXSwKLSAgICAgICAgICAgICAgICAiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6XG5vdGNjLWFuc2kuYzogQWJvdXQgdG8gZXhlY3V0ZSBjb21waWxlZCBjb2RlOlxub3RjYy5jOiBhYm91dCB0byBleGVjdXRlIGNvbXBpbGVkIGNvZGUuXG5hdGNjLWFuc2kuYzogcmVzdWx0OiA0MlxucmVzdWx0OiA0MlxuIiwgIiIsWyd4ODYnXSkKLQotICAgIGRlZiB0ZXN0UnVuQ29uc3RhbnRzKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvY29uc3RhbnRzLmMiXSwKLSAgICAgICAgICAgICJFeGVjdXRpbmcgY29tcGlsZWQgY29kZTpcbnJlc3VsdDogMTJcbiIsCi0gICAgICAgICAgICAiMCA9IDBcbjAxMCA9IDhcbjB4MTAgPSAxNlxuJ1xcYScgPSA3XG4nXFxiJyA9IDhcbidcXGYnID0gMTJcbidcXG4nID0gMTBcbidcXHInID0gMTNcbidcXHQnID0gOVxuJ1xcdicgPSAxMVxuJ1xcXFwnID0gOTJcbidcXCcnID0gMzlcbiIgKwotICAgICAgICAgICAgIidcXFwiJyA9IDM0XG4nXFw/JyA9IDYzXG4nXFwwJyA9IDBcbidcXDEnID0gMVxuJ1xcMTInID0gMTBcbidcXDEyMycgPSA4M1xuJ1xceDAnID0gMFxuJ1xceDEnID0gMVxuJ1xceDEyJyA9IDE4XG4nXFx4MTIzJyA9IDI5MVxuJ1xceDFmJyA9IDMxXG4nXFx4MUYnID0gMzFcbiIpCi0KLSAgICBkZWYgdGVzdFJ1bkZsb2F0KHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvZmxvYXQuYyJdLAotICAgICAgICAgICAgIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOlxucmVzdWx0OiAwXG4iLAotICAgICAgICAgICAgIiIiQ29uc3RhbnRzOiAwIDAgMCAwLjAxIDAuMDEgMC4xIDEwIDEwIDAuMQotaW50OiAxIGZsb2F0OiAyLjIgZG91YmxlOiAzLjMKLSBmdG9pKDEuNGYpPTEKLSBkdG9pKDIuNCk9MgotIGl0b2YoMyk9MwotIGl0b2QoNCk9NAotZ2xvYmFsczogMSAyIDMgNAotYXJnczogMSAyIDMgNAotbG9jYWxzOiAxIDIgMyA0Ci1jYXN0IHJ2YWw6IDIgNAotY2FzdCBsdmFsOiAxLjEgMiAzLjMgNAotIiIiKQotCi0gICAgZGVmIHRlc3RSdW5GbG9wcyhzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2Zsb3BzLmMiXSwKLSAgICAgICAgICAgICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotcmVzdWx0OiAwIiIiLAotIiIiLTEuMSA9IC0xLjEKLSExLjIgPSAwCi0hMCA9IDEKLWRvdWJsZSBvcCBkb3VibGU6Ci0xICsgMiA9IDMKLTEgLSAyID0gLTEKLTEgKiAyID0gMgotMSAvIDIgPSAwLjUKLWZsb2F0IG9wIGZsb2F0OgotMSArIDIgPSAzCi0xIC0gMiA9IC0xCi0xICogMiA9IDIKLTEgLyAyID0gMC41Ci1kb3VibGUgb3AgZmxvYXQ6Ci0xICsgMiA9IDMKLTEgLSAyID0gLTEKLTEgKiAyID0gMgotMSAvIDIgPSAwLjUKLWRvdWJsZSBvcCBpbnQ6Ci0xICsgMiA9IDMKLTEgLSAyID0gLTEKLTEgKiAyID0gMgotMSAvIDIgPSAwLjUKLWludCBvcCBkb3VibGU6Ci0xICsgMiA9IDMKLTEgLSAyID0gLTEKLTEgKiAyID0gMgotMSAvIDIgPSAwLjUKLWRvdWJsZSBvcCBkb3VibGU6Ci0xIG9wIDI6IDwgMSAgIDw9IDEgICA9PSAwICAgPj0gMCAgID4gMCAgICE9IDEKLTEgb3AgMTogPCAwICAgPD0gMSAgID09IDEgICA+PSAxICAgPiAwICAgIT0gMAotMiBvcCAxOiA8IDAgICA8PSAwICAgPT0gMCAgID49IDEgICA+IDEgICAhPSAxCi1kb3VibGUgb3AgZmxvYXQ6Ci0xIG9wIDI6IDwgMSAgIDw9IDEgICA9PSAwICAgPj0gMCAgID4gMCAgICE9IDEKLTEgb3AgMTogPCAwICAgPD0gMSAgID09IDEgICA+PSAxICAgPiAwICAgIT0gMAotMiBvcCAxOiA8IDAgICA8PSAwICAgPT0gMCAgID49IDEgICA+IDEgICAhPSAxCi1mbG9hdCBvcCBmbG9hdDoKLTEgb3AgMjogPCAxICAgPD0gMSAgID09IDAgICA+PSAwICAgPiAwICAgIT0gMQotMSBvcCAxOiA8IDAgICA8PSAxICAgPT0gMSAgID49IDEgICA+IDAgICAhPSAwCi0yIG9wIDE6IDwgMCAgIDw9IDAgICA9PSAwICAgPj0gMSAgID4gMSAgICE9IDEKLWludCBvcCBkb3VibGU6Ci0xIG9wIDI6IDwgMSAgIDw9IDEgICA9PSAwICAgPj0gMCAgID4gMCAgICE9IDEKLTEgb3AgMTogPCAwICAgPD0gMSAgID09IDEgICA+PSAxICAgPiAwICAgIT0gMAotMiBvcCAxOiA8IDAgICA8PSAwICAgPT0gMCAgID49IDEgICA+IDEgICAhPSAxCi1kb3VibGUgb3AgaW50OgotMSBvcCAyOiA8IDEgICA8PSAxICAgPT0gMCAgID49IDAgICA+IDAgICAhPSAxCi0xIG9wIDE6IDwgMCAgIDw9IDEgICA9PSAxICAgPj0gMSAgID4gMCAgICE9IDAKLTIgb3AgMTogPCAwICAgPD0gMCAgID09IDAgICA+PSAxICAgPiAxICAgIT0gMQotYnJhbmNoaW5nOiAxIDAgMQotdGVzdHBhc3NpOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NmOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NkOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NpOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NmOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NkOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NpOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NmOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NkOiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgotdGVzdHBhc3NpZGY6IDEgMiAzCi0iIiIpCi0gICAgZGVmIHRlc3RDYXN0cyhzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2Nhc3RzLmMiXSwKLSAgICAgICAgICAgICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotcmVzdWx0OiAwIiIiLCAiIiJSZWFkaW5nIGZyb20gYSBwb2ludGVyOiAzIDMKLVdyaXRpbmcgdG8gYSBwb2ludGVyOiA0Ci1UZXN0aW5nIGNhc3RzOiAzIDMgNC41IDQKLVRlc3RpbmcgcmVhZGluZyAoaW50Kik6IDQKLVRlc3Rpbmcgd3JpdGluZyAoaW50Kik6IDggOQotVGVzdGluZyByZWFkaW5nIChjaGFyKik6IDB4NzggMHg1NiAweDM0IDB4MTIKLVRlc3Rpbmcgd3JpdGluZyAoY2hhciopOiAweDg3NjU0MzIxCi1mKDEwKQotRnVuY3Rpb24gcG9pbnRlciByZXN1bHQ6IDcwCi1UZXN0aW5nIHJlYWQvd3JpdGUgKGZsb2F0Kik6IDguOCA5LjkKLVRlc3RpbmcgcmVhZC93cml0ZSAoZG91YmxlKik6IDguOCA5LjkKLSIiIikKLQotICAgIGRlZiB0ZXN0Q2hhcihzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2NoYXIuYyJdLCAiIiJFeGVjdXRpbmcgY29tcGlsZWQgY29kZToKLXJlc3VsdDogMCIiIiwgIiIiYSA9IDk5LCBiID0gNDEKLWdhID0gMTAwLCBnYiA9IDQ0IiIiKQotCi0gICAgZGVmIHRlc3RUeXBlZGVmKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvdHlwZWRlZi5jIl0sICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotcmVzdWx0OiAwIiIiLCAiIiJ4ID0gMwotKDQsIDYpID0gKDEsIDIpICsgKDMsIDQpCi0iIiIpCi0KLSAgICBkZWYgdGVzdFBvaW50ZXJBcml0aG1ldGljKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvcG9pbnRlcnMuYyJdLCAiIiJFeGVjdXRpbmcgY29tcGlsZWQgY29kZToKLXJlc3VsdDogMCIiIiwgIiIiUG9pbnRlciBkaWZmZXJlbmNlOiAxIDQKLVBvaW50ZXIgYWRkaXRpb246IDIKLVBvaW50ZXIgY29tcGFyaXNvbiB0byB6ZXJvOiAwIDAgMQotUG9pbnRlciBjb21wYXJpc29uOiAxIDAgMCAwIDEKLSIiIikKLSAgICBkZWYgdGVzdFJvbGxvMyhzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL3JvbGxvMy5jIl0sICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotcmVzdWx0OiAxMCIiIiwgIiIiIiIiKQotCi0gICAgZGVmIHRlc3RGbG9hdERvdWJsZShzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2Zsb2F0ZG91YmxlLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci1yZXN1bHQ6IDAiIiIsICIiIjAuMDAyIDAuMSAxMCIiIikKLQotICAgIGRlZiB0ZXN0SW5jRGVjKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvaW5jLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci0wCi0xCi0yCi0xCi0xCi0yCi0xCi0wCi1yZXN1bHQ6IDAKLSIiIiwiIiIiIiIpCi0KLSAgICBkZWYgdGVzdElvcHMoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9pb3BzLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci1yZXN1bHQ6IDAiIiIsICIiIkxpdGVyYWxzOiAxIC0xCi0rKwotMAotMQotMgotMwotNAotNQotNgotNwotOAotOQotLS0KLTEwCi05Ci04Ci03Ci02Ci01Ci00Ci0zCi0yCi0xCi0wCi0iIiIpCi0KLSAgICBkZWYgdGVzdEZpbG0oc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9maWxtLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci1yZXN1bHQ6IDAiIiIsICIiInRlc3RpbmcuLi4KLVRvdGFsIGJhZDogMAotIiIiKQotCi0gICAgZGVmIHRlc3RNYWNyb3Moc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9tYWNyb3MuYyJdLCAiIiJFeGVjdXRpbmcgY29tcGlsZWQgY29kZToKLXJlc3VsdDogMCIiIiwgIiIiQSA9IDYKLUEgPSAxMAotIiIiKQotCi0gICAgZGVmIHRlc3Rwb2ludGVyczIoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9wb2ludGVyczIuYyJdLCAiIiJFeGVjdXRpbmcgY29tcGlsZWQgY29kZToKLXJlc3VsdDogMCIiIiwgIiIiYSA9IDAsICpwYSA9IDAKLWEgPSAyLCAqcGEgPSAyCi1hID0gMCwgKnBhID0gMCAqKnBwYSA9IDAKLWEgPSAyLCAqcGEgPSAyICoqcHBhID0gMgotYSA9IDAsICpwYSA9IDAgKipwcGEgPSAwCi1hID0gMiwgKnBhID0gMiAqKnBwYSA9IDIKLSIiIikKLQotICAgIGRlZiB0ZXN0YXNzaWdubWVudG9wKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvYXNzaWdubWVudG9wLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci1yZXN1bHQ6IDAiIiIsICIiIjIgKj0gNSAgMTAKLTIwIC89IDUgIDQKLTE3ICU9IDUgIDIKLTE3ICs9IDUgIDIyCi0xNyAtPSA1ICAxMgotMTc8PD0gMSAgMzQKLTE3Pj49IDEgIDgKLTE3Jj0gMSAgMQotMTdePSAxICAxNgotMTZ8PSAxICAxNwotKmYoKSA9ICpmKCkgKyAxMDsKLWYoKQotZigpCi1hID0gMTAKLSpmKCkgKz0gMTA7Ci1mKCkKLWEgPSAxMAotIiIiKQotCi0gICAgZGVmIHRlc3Rjb21tYShzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2NvbW1hLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci1yZXN1bHQ6IDAiIiIsICIiInN0YXRlbWVudDogMTAKLWlmOiBhID0gMAotd2hpbGU6IGIgPSAxMQotZm9yOiBiID0gMjIKLXJldHVybjogMzAKLWFyZzogMTIKLSIiIikKLQotICAgIGRlZiB0ZXN0QnJhY2tldHMoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9icmFja2V0cy5jIl0sICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotRXJyb3JzOiAwCi0yRCBFcnJvcnM6IDAKLXJlc3VsdDogMAotIiIiLCIiIiIiIikKLQotICAgIGRlZiB0ZXN0U2hvcnQoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9zaG9ydC5jIl0sICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotcmVzdWx0OiAtMgotIiIiLCIiIiIiIikKLQotICAgIGRlZiB0ZXN0QXNzaWdubWVudChzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2Fzc2lnbm1lbnQuYyJdLCAiIiJFeGVjdXRpbmcgY29tcGlsZWQgY29kZToKLXJlc3VsdDogNwotIiIiLCIiIiIiIikKLQotICAgIGRlZiB0ZXN0QXJyYXkoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9hcnJheS5jIl0sICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotbG9jYWxJbnQ6IDMKLWxvY2FsRG91YmxlOiAzIDMKLWdsb2JhbENoYXI6IDMKLWdsb2JhbERvdWJsZTogMwotdGVzdEFyZ3M6IDAgMiA0Ci10ZXN0RGVjYXk6IEhpIQotdGVzdDJEOgotYWJjZGVmZ2hpamRlZmdoaWprbG0KLWRlZmdoaWprbG1naGlqa2xtbm9wCi1naGlqa2xtbm9wamtsbW5vcGFiYwotamtsbW5vcGFiY21ub3BhYmNkZWYKLW1ub3BhYmNkZWZwYWJjZGVmZ2hpCi1wYWJjZGVmZ2hpY2RlZmdoaWprbAotY2RlZmdoaWprbGZnaGlqa2xtbm8KLWZnaGlqa2xtbm9pamtsbW5vcGFiCi1pamtsbW5vcGFibG1ub3BhYmNkZQotbG1ub3BhYmNkZWZnaGlqa2xtbm8KLXJlc3VsdDogMAotIiIiLCIiIiIiIikKLQotICAgIGRlZiB0ZXN0RGVmaW5lcyhzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2RlZmluZXMuYyJdLCAiIiJFeGVjdXRpbmcgY29tcGlsZWQgY29kZToKLXJlc3VsdDogMwotIiIiLCIiIiIiIikKLQotICAgIGRlZiB0ZXN0RnVuY0FyZ3Moc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9mdW5jYXJncy5jIl0sICIiIkV4ZWN1dGluZyBjb21waWxlZCBjb2RlOgotcmVzdWx0OiA0Ci0iIiIsIiIiIiIiKQotCi0gICAgZGVmIHRlc3RCMjA3MTY3MChzZWxmKToKLSAgICAgICAgc2VsZi5jb21waWxlQ2hlY2soWyItUiIsICJkYXRhL2IyMDcxNjcwLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci1yZXN1bHQ6IDEwOTI2MTYxOTIKLSIiIiwiIiIiIiIpCi0KLSAgICBkZWYgdGVzdFN0cnVjdHMoc2VsZik6Ci0gICAgICAgIHNlbGYuY29tcGlsZUNoZWNrKFsiLVIiLCAiZGF0YS9zdHJ1Y3RzLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci10ZXN0Q29weWluZzogMzcgPT0gMzcKLXRlc3RVbmlvbjogMSA9PSAweDNmODAwMDAwCi10ZXN0QXJnczogKDYsIDgsIDEwLCAxMikKLXJlc3VsdDogNgotIiIiLCIiIiIiIikKLQotICAgIGRlZiB0ZXN0QWRkcmVzc09mKHNlbGYpOgotICAgICAgICBzZWxmLmNvbXBpbGVDaGVjayhbIi1SIiwgImRhdGEvYWRkcmVzc09mLmMiXSwgIiIiRXhlY3V0aW5nIGNvbXBpbGVkIGNvZGU6Ci10ZXN0U3RydWN0OiAxMCAxMCAxMAotdGVzdEFycmF5OiAxIDEgMQotcmVzdWx0OiAwCi0iIiIsIiIiIiIiKQotCi1kZWYgbWFpbigpOgotICAgIGNoZWNrRW52aXJvbm1lbnQoKQotICAgIHBhcnNlQXJndigpCi0gICAgdW5pdHRlc3QubWFpbigpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigpCi0KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9BbmRyb2lkLm1rIGIvbGliY3V0aWxzL0FuZHJvaWQubWsKaW5kZXggZThjNzc3NS4uM2I4Y2JiYiAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL0FuZHJvaWQubWsKKysrIGIvbGliY3V0aWxzL0FuZHJvaWQubWsKQEAgLTQ2LDcgKzQ2LDggQEAKIAlwcm9wZXJ0aWVzLmMgXAogCXRocmVhZHMuYyBcCiAJc2NoZWRfcG9saWN5LmMgXAotCWlvc2NoZWRfcG9saWN5LmMKKwlpb3NjaGVkX3BvbGljeS5jIFwKKwlzdHJfcGFybXMuYwogCiBjb21tb25Ib3N0U291cmNlcyA6PSBcCiAgICAgICAgIGFzaG1lbS1ob3N0LmMKQEAgLTEwOSwxNSArMTEwLDIwIEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBsaWJjdXRpbHMKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNvbW1vblNvdXJjZXMpIGFzaG1lbS1kZXYuYyBtcS5jCitMT0NBTF9TUkNfRklMRVMgOj0gJChjb21tb25Tb3VyY2VzKSBhc2htZW0tZGV2LmMgbXEuYyBhbmRyb2lkX3JlYm9vdC5jIHVldmVudC5jCiAKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKLUxPQ0FMX1NSQ19GSUxFUyArPSBtZW1zZXQzMi5TCitMT0NBTF9TUkNfRklMRVMgKz0gYXJjaC1hcm0vbWVtc2V0MzIuUwogZWxzZSAgIyAhYXJtCiBpZmVxICgkKFRBUkdFVF9BUkNIKSxzaCkKIExPQ0FMX1NSQ19GSUxFUyArPSBtZW1vcnkuYyBhdG9taWMtYW5kcm9pZC1zaC5jCiBlbHNlICAjICFzaAoraWZlcSAoJChUQVJHRVRfQVJDSF9WQVJJQU5UKSx4ODYtYXRvbSkKK0xPQ0FMX0NGTEFHUyArPSAtREhBVkVfTUVNU0VUMTYgLURIQVZFX01FTVNFVDMyCitMT0NBTF9TUkNfRklMRVMgKz0gYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQxNi5TIGFyY2gteDg2L2FuZHJvaWRfbWVtc2V0MzIuUyBtZW1vcnkuYworZWxzZSAjICF4ODYtYXRvbQogTE9DQUxfU1JDX0ZJTEVTICs9IG1lbW9yeS5jCitlbmRpZiAjICF4ODYtYXRvbQogZW5kaWYgIyAhc2gKIGVuZGlmICMgIWFybQogCkBAIC0xMzMsNCArMTM5LDEyIEBACiBMT0NBTF9DRkxBR1MgKz0gJCh0YXJnZXRTbXBGbGFnKQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSB0c3Rfc3RyX3Bhcm1zCitMT0NBTF9DRkxBR1MgKz0gLURURVNUX1NUUl9QQVJNUworTE9DQUxfU1JDX0ZJTEVTIDo9IHN0cl9wYXJtcy5jIGhhc2htYXAuYyBtZW1vcnkuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKwogZW5kaWYgIyFzaW0KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hbmRyb2lkX3JlYm9vdC5jIGIvbGliY3V0aWxzL2FuZHJvaWRfcmVib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNzM1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmN1dGlscy9hbmRyb2lkX3JlYm9vdC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3JlYm9vdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CisKKy8qIENoZWNrIHRvIHNlZSBpZiAvcHJvYy9tb3VudHMgY29udGFpbnMgYW55IHdyaXRlYWJsZSBmaWxlc3lzdGVtcworICogYmFja2VkIGJ5IGEgYmxvY2sgZGV2aWNlLgorICogUmV0dXJuIHRydWUgaWYgbm9uZSBmb3VuZCwgZWxzZSByZXR1cm4gZmFsc2UuCisgKi8KK3N0YXRpYyBpbnQgcmVtb3VudF9yb19kb25lKHZvaWQpCit7CisgICAgRklMRSAqZjsKKyAgICBjaGFyIG1vdW50X2RldlsyNTZdOworICAgIGNoYXIgbW91bnRfZGlyWzI1Nl07CisgICAgY2hhciBtb3VudF90eXBlWzI1Nl07CisgICAgY2hhciBtb3VudF9vcHRzWzI1Nl07CisgICAgaW50IG1vdW50X2ZyZXE7CisgICAgaW50IG1vdW50X3Bhc3NubzsKKyAgICBpbnQgbWF0Y2g7CisgICAgaW50IGZvdW5kX3J3X2ZzID0gMDsKKworICAgIGYgPSBmb3BlbigiL3Byb2MvbW91bnRzIiwgInIiKTsKKyAgICBpZiAoISBmKSB7CisgICAgICAgIC8qIElmIHdlIGNhbid0IHJlYWQgL3Byb2MvbW91bnRzLCBqdXN0IGdpdmUgdXAgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZG8geworICAgICAgICBtYXRjaCA9IGZzY2FuZihmLCAiJTI1NXMgJTI1NXMgJTI1NXMgJTI1NXMgJWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1vdW50X2RldiwgbW91bnRfZGlyLCBtb3VudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBtb3VudF9vcHRzLCAmbW91bnRfZnJlcSwgJm1vdW50X3Bhc3Nubyk7CisgICAgICAgIG1vdW50X2RldlsyNTVdID0gMDsKKyAgICAgICAgbW91bnRfZGlyWzI1NV0gPSAwOworICAgICAgICBtb3VudF90eXBlWzI1NV0gPSAwOworICAgICAgICBtb3VudF9vcHRzWzI1NV0gPSAwOworICAgICAgICBpZiAoKG1hdGNoID09IDYpICYmICFzdHJuY21wKG1vdW50X2RldiwgIi9kZXYvYmxvY2siLCAxMCkgJiYgc3Ryc3RyKG1vdW50X29wdHMsICJydyIpKSB7CisgICAgICAgICAgICBmb3VuZF9yd19mcyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKG1hdGNoICE9IEVPRik7CisKKyAgICBmY2xvc2UoZik7CisKKyAgICByZXR1cm4gIWZvdW5kX3J3X2ZzOworfQorCisvKiBSZW1vdW50aW5nIGZpbGVzeXN0ZW1zIHJlYWQtb25seSBpcyBkaWZmaWN1bHQgd2hlbiB0aGVyZSBhcmUgZmlsZXMKKyAqIG9wZW5lZCBmb3Igd3JpdGluZyBvciBwZW5kaW5nIGRlbGV0ZXMgb24gdGhlIGZpbGVzeXN0ZW0uICBUaGVyZSBpcworICogbm8gd2F5IHRvIGZvcmNlIHRoZSByZW1vdW50IHdpdGggdGhlIG1vdW50KDIpIHN5c2NhbGwuICBUaGUgbWFnaWMgc3lzcnEKKyAqICd1JyBjb21tYW5kIGRvZXMgYW4gZW1lcmdlbmN5IHJlbW91bnQgcmVhZC1vbmx5IG9uIGFsbCB3cml0YWJsZSBmaWxlc3lzdGVtcworICogdGhhdCBoYXZlIGEgYmxvY2sgZGV2aWNlIChpLmUuIG5vdCB0bXBmcyBmaWxlc3lzdGVtcykgYnkgY2FsbGluZworICogZW1lcmdlbmN5X3JlbW91bnQoKSwgd2hpY2gga25vd3MgaG93IHRvIGZvcmNlIHRoZSByZW1vdW50IHRvIHJlYWQtb25seS4KKyAqIFVuZm9ydHVuYXRlbHksIHRoYXQgaXMgYXN5bmNocm9ub3VzLCBhbmQganVzdCBzY2hlZHVsZXMgdGhlIHdvcmsgYW5kCisgKiByZXR1cm5zLiAgVGhlIGJlc3Qgd2F5IHRvIGRldGVybWluZSBpZiBpdCBpcyBkb25lIGlzIHRvIHJlYWQgL3Byb2MvbW91bnRzCisgKiByZXBlYXRlZGx5IHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHdyaXRhYmxlIGZpbGVzeXN0ZW1zIG1vdW50ZWQgb24KKyAqIGJsb2NrIGRldmljZXMuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW91bnRfcm8odm9pZCkKK3sKKyAgICBpbnQgZmQsIGNudCA9IDA7CisKKyAgICAvKiBUcmlnZ2VyIHRoZSByZW1vdW50IG9mIHRoZSBmaWxlc3lzdGVtcyBhcyByZWFkLW9ubHksCisgICAgICogd2hpY2ggYWxzbyBtYXJrcyB0aGVtIGNsZWFuLgorICAgICAqLworICAgIGZkID0gb3BlbigiL3Byb2Mvc3lzcnEtdHJpZ2dlciIsIE9fV1JPTkxZKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd3JpdGUoZmQsICJ1IiwgMSk7CisgICAgY2xvc2UoZmQpOworCisKKyAgICAvKiBOb3cgcG9sbCAvcHJvYy9tb3VudHMgdGlsbCBpdCdzIGRvbmUgKi8KKyAgICB3aGlsZSAoIXJlbW91bnRfcm9fZG9uZSgpICYmIChjbnQgPCA1MCkpIHsKKyAgICAgICAgdXNsZWVwKDEwMDAwMCk7CisgICAgICAgIGNudCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworCitpbnQgYW5kcm9pZF9yZWJvb3QoaW50IGNtZCwgaW50IGZsYWdzLCBjaGFyICphcmcpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGZsYWdzICYgQU5EUk9JRF9SQl9GTEFHX05PX1NZTkMpKQorICAgICAgICBzeW5jKCk7CisKKyAgICBpZiAoIShmbGFncyAmIEFORFJPSURfUkJfRkxBR19OT19SRU1PVU5UX1JPKSkKKyAgICAgICAgcmVtb3VudF9ybygpOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1JCX1JFU1RBUlQ6CisgICAgICAgICAgICByZXQgPSByZWJvb3QoUkJfQVVUT0JPT1QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBTkRST0lEX1JCX1BPV0VST0ZGOgorICAgICAgICAgICAgcmV0ID0gcmVib290KFJCX1BPV0VSX09GRik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFORFJPSURfUkJfUkVTVEFSVDI6CisgICAgICAgICAgICByZXQgPSBfX3JlYm9vdChMSU5VWF9SRUJPT1RfTUFHSUMxLCBMSU5VWF9SRUJPT1RfTUFHSUMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUMiwgYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvbWVtc2V0MzIuUyBiL2xpYmN1dGlscy9hcmNoLWFybS9tZW1zZXQzMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJjdXRpbHMvbWVtc2V0MzIuUwpyZW5hbWUgdG8gbGliY3V0aWxzL2FyY2gtYXJtL21lbXNldDMyLlMKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hcmNoLXg4Ni9hbmRyb2lkX21lbXNldDE2LlMgYi9saWJjdXRpbHMvYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQxNi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjA5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjdXRpbHMvYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQxNi5TCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIENvbnRyaWJ1dGVkIGJ5OiBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZiBkZWZpbmVkKFVTRV9TU0UyKQorCisjIGluY2x1ZGUgImNhY2hlX3dyYXBwZXIuUyIKKyMgdW5kZWYgX19pNjg2CisjIGRlZmluZSBVU0VfQVNfQU5EUk9JRAorIyBkZWZpbmUgc3NlMl9tZW1zZXQxNl9hdG9tIGFuZHJvaWRfbWVtc2V0MTYKKyMgaW5jbHVkZSAic3NlMi1tZW1zZXQxNi1hdG9tLlMiCisKKyNlbHNlCisKKyMgaW5jbHVkZSAibWVtc2V0MTYuUyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQzMi5TIGIvbGliY3V0aWxzL2FyY2gteDg2L2FuZHJvaWRfbWVtc2V0MzIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIyZmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL2FyY2gteDg2L2FuZHJvaWRfbWVtc2V0MzIuUwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBDb250cmlidXRlZCBieTogSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisjaWYgZGVmaW5lZChVU0VfU1NFMikKKworIyBpbmNsdWRlICJjYWNoZV93cmFwcGVyLlMiCisjIHVuZGVmIF9faTY4NgorIyBkZWZpbmUgVVNFX0FTX0FORFJPSUQKKyMgZGVmaW5lIHNzZTJfbWVtc2V0MzJfYXRvbSBhbmRyb2lkX21lbXNldDMyCisjIGluY2x1ZGUgInNzZTItbWVtc2V0MzItYXRvbS5TIgorCisjZWxzZQorCisjIGluY2x1ZGUgIm1lbXNldDMyLlMiCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvYXJjaC14ODYvY2FjaGVfd3JhcHBlci5TIGIvbGliY3V0aWxzL2FyY2gteDg2L2NhY2hlX3dyYXBwZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhmZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL2FyY2gteDg2L2NhY2hlX3dyYXBwZXIuUwpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBDb250cmlidXRlZCBieTogSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisvKiBWYWx1ZXMgYXJlIG9wdGltaXplZCBmb3IgQXRvbSAqLworI2RlZmluZSBTSEFSRURfQ0FDSEVfU0laRSAgICAgICAoNTEyKjEwMjQpICAgICAgICAgICAgLyogQXRvbSBMMiBDYWNoZSAqLworI2RlZmluZSBEQVRBX0NBQ0hFX1NJWkUgICAgICAgICAoMjQqMTAyNCkgICAgICAgICAgICAgLyogQXRvbSBMMSBEYXRhIENhY2hlICovCisjZGVmaW5lIFNIQVJFRF9DQUNIRV9TSVpFX0hBTEYgIChTSEFSRURfQ0FDSEVfU0laRSAvIDIpCisjZGVmaW5lIERBVEFfQ0FDSEVfU0laRV9IQUxGICAgIChEQVRBX0NBQ0hFX1NJWkUgLyAyKQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MTYtYXRvbS5TIGIvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MTYtYXRvbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmVjODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjdXRpbHMvYXJjaC14ODYvc3NlMi1tZW1zZXQxNi1hdG9tLlMKQEAgLTAsMCArMSw3MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIENvbnRyaWJ1dGVkIGJ5OiBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgTAorIyBkZWZpbmUgTChsYWJlbCkJLkwjI2xhYmVsCisjZW5kaWYKKworI2lmbmRlZiBBTElHTgorIyBkZWZpbmUgQUxJR04obikJLnAyYWxpZ24gbgorI2VuZGlmCisKKyNpZm5kZWYgY2ZpX3N0YXJ0cHJvYworIyBkZWZpbmUgY2ZpX3N0YXJ0cHJvYwkJCS5jZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBjZmlfZW5kcHJvYworIyBkZWZpbmUgY2ZpX2VuZHByb2MJCQkuY2ZpX2VuZHByb2MKKyNlbmRpZgorCisjaWZuZGVmIGNmaV9yZWxfb2Zmc2V0CisjIGRlZmluZSBjZmlfcmVsX29mZnNldChyZWcsIG9mZikJLmNmaV9yZWxfb2Zmc2V0IHJlZywgb2ZmCisjZW5kaWYKKworI2lmbmRlZiBjZmlfcmVzdG9yZQorIyBkZWZpbmUgY2ZpX3Jlc3RvcmUocmVnKQkJLmNmaV9yZXN0b3JlIHJlZworI2VuZGlmCisKKyNpZm5kZWYgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CisjIGRlZmluZSBjZmlfYWRqdXN0X2NmYV9vZmZzZXQob2ZmKQkuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IG9mZgorI2VuZGlmCisKKyNpZm5kZWYgRU5UUlkKKyMgZGVmaW5lIEVOVFJZKG5hbWUpCQkJXAorCS50eXBlIG5hbWUsICBAZnVuY3Rpb247IAlcCisJLmdsb2JsIG5hbWU7CQkJXAorCS5wMmFsaWduIDQ7CQkJXAorbmFtZToJCQkJCVwKKwljZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBFTkQKKyMgZGVmaW5lIEVORChuYW1lKQkJCVwKKwljZmlfZW5kcHJvYzsJCQlcCisJLnNpemUgbmFtZSwgLi1uYW1lCisjZW5kaWYKKworI2RlZmluZSBDRklfUFVTSChSRUcpCQkJCQkJXAorICBjZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpOwkJCQkJXAorICBjZmlfcmVsX29mZnNldCAoUkVHLCAwKQorCisjZGVmaW5lIENGSV9QT1AoUkVHKQkJCQkJCVwKKyAgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCk7CQkJCQlcCisgIGNmaV9yZXN0b3JlIChSRUcpCisKKyNkZWZpbmUgUFVTSChSRUcpCXB1c2hsIFJFRzsgQ0ZJX1BVU0ggKFJFRykKKyNkZWZpbmUgUE9QKFJFRykJcG9wbCBSRUc7IENGSV9QT1AgKFJFRykKKworI2lmZGVmIFVTRV9BU19CWkVSTzE2CisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgTEVOCQlERVNUKzQKKyNlbHNlCisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgQ0hSCQlERVNUKzQKKyMgZGVmaW5lIExFTgkJQ0hSKzQKKyNlbmRpZgorCisjaWYgMQorIyBkZWZpbmUgU0VUUlROVkFMCisjZWxzZQorIyBkZWZpbmUgU0VUUlROVkFMCW1vdmwgREVTVCglZXNwKSwgJWVheAorI2VuZGlmCisKKyNpZmRlZiBTSEFSRUQKKyMgZGVmaW5lIEVOVFJBTkNFCVBVU0ggKCVlYngpOworIyBkZWZpbmUgUkVUVVJOX0VORAlQT1AgKCVlYngpOyByZXQKKyMgZGVmaW5lIFJFVFVSTgkJUkVUVVJOX0VORDsgQ0ZJX1BVU0ggKCVlYngpCisjIGRlZmluZSBQQVJNUwkJOAkJLyogUHJlc2VydmUgRUJYLiAgKi8KKyMgZGVmaW5lIEpNUFRCTChJLCBCKQlJIC0gQgorCisvKiBMb2FkIGFuIGVudHJ5IGluIGEganVtcCB0YWJsZSBpbnRvIEVCWCBhbmQgYnJhbmNoIHRvIGl0LiAgVEFCTEUgaXMgYQorICAganVtcCB0YWJsZSB3aXRoIHJlbGF0aXZlIG9mZnNldHMuICAgKi8KKyMgZGVmaW5lIEJSQU5DSF9UT19KTVBUQkxfRU5UUlkoVEFCTEUpCQkJCVwKKyAgICAvKiBXZSBmaXJzdCBsb2FkIFBDIGludG8gRUJYLiAgKi8JCQkJXAorICAgIGNhbGwJX19pNjg2LmdldF9wY190aHVuay5ieDsJCQkJXAorICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUganVtcCB0YWJsZS4gICovCQkJXAorICAgIGFkZAkJJChUQUJMRSAtIC4pLCAlZWJ4OwkJCQlcCisgICAgLyogR2V0IHRoZSBlbnRyeSBhbmQgY29udmVydCB0aGUgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZQlcCisgICAgICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCQkJCQlcCisgICAgYWRkCQkoJWVieCwlZWN4LDQpLCAlZWJ4OwkJCQlcCisgICAgLyogV2UgbG9hZGVkIHRoZSBqdW1wIHRhYmxlIGFuZCBhZGp1ZXN0ZWQgRURYLiBHby4gICovCVwKKyAgICBqbXAJCSolZWJ4CisKKwkuc2VjdGlvbgkuZ251LmxpbmtvbmNlLnQuX19pNjg2LmdldF9wY190aHVuay5ieCwiYXgiLEBwcm9nYml0cworCS5nbG9ibAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJLmhpZGRlbglfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJQUxJR04gKDQpCisJLnR5cGUJX19pNjg2LmdldF9wY190aHVuay5ieCxAZnVuY3Rpb24KK19faTY4Ni5nZXRfcGNfdGh1bmsuYng6CisJbW92bAkoJWVzcCksICVlYngKKwlyZXQKKyNlbHNlCisjIGRlZmluZSBFTlRSQU5DRQorIyBkZWZpbmUgUkVUVVJOX0VORAlyZXQKKyMgZGVmaW5lIFJFVFVSTgkJUkVUVVJOX0VORAorIyBkZWZpbmUgUEFSTVMJCTQKKyMgZGVmaW5lIEpNUFRCTChJLCBCKQlJCisKKy8qIEJyYW5jaCB0byBhbiBlbnRyeSBpbiBhIGp1bXAgdGFibGUuICBUQUJMRSBpcyBhIGp1bXAgdGFibGUgd2l0aAorICAgYWJzb2x1dGUgb2Zmc2V0cy4gICovCisjIGRlZmluZSBCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZKFRBQkxFKQkJCQlcCisgICAgam1wCQkqVEFCTEUoLCVlY3gsNCkKKyNlbmRpZgorCisJLnNlY3Rpb24gLnRleHQuc3NlMiwiYXgiLEBwcm9nYml0cworCUFMSUdOICg0KQorRU5UUlkgKHNzZTJfbWVtc2V0MTZfYXRvbSkKKwlFTlRSQU5DRQorCisJbW92bAlMRU4oJWVzcCksICVlY3gKKyNpZmRlZiBVU0VfQVNfQU5EUk9JRAorCXNocgkkMSwgJWVjeAorI2VuZGlmCisjaWZkZWYgVVNFX0FTX0JaRVJPMTYKKwl4b3IJJWVheCwgJWVheAorI2Vsc2UKKwltb3Z6d2wJQ0hSKCVlc3ApLCAlZWF4CisJbW92CSVlYXgsICVlZHgKKwlzaGwJJDE2LCAlZWF4CisJb3IJJWVkeCwgJWVheAorI2VuZGlmCisJbW92bAlERVNUKCVlc3ApLCAlZWR4CisJY21wCSQzMiwgJWVjeAorCWphZQlMKDMyd29yZHNvcm1vcmUpCisKK0wod3JpdGVfbGVzczMyd29yZHMpOgorCWxlYQkoJWVkeCwgJWVjeCwgMiksICVlZHgKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlX2xlc3MzMndvcmRzKSkKKworCisJLnB1c2hzZWN0aW9uIC5yb2RhdGEuc3NlMiwiYSIsQHByb2diaXRzCisJQUxJR04gKDIpCitMKHRhYmxlX2xlc3MzMndvcmRzKToKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8wd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8zd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV80d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV81d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV82d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV83d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV84d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV85d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xMHdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTF3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzEyd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xM3dvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTR3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzE1d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xNndvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTd3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzE4d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xOXdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjB3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzIxd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yMndvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjN3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzI0d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yNXdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjZ3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzI3d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yOHdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjl3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzMwd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8zMXdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLnBvcHNlY3Rpb24KKworCUFMSUdOICg0KQorTCh3cml0ZV8yOHdvcmRzKToKKwltb3ZsCSVlYXgsIC01NiglZWR4KQorCW1vdmwJJWVheCwgLTUyKCVlZHgpCitMKHdyaXRlXzI0d29yZHMpOgorCW1vdmwJJWVheCwgLTQ4KCVlZHgpCisJbW92bAklZWF4LCAtNDQoJWVkeCkKK0wod3JpdGVfMjB3b3Jkcyk6CisJbW92bAklZWF4LCAtNDAoJWVkeCkKKwltb3ZsCSVlYXgsIC0zNiglZWR4KQorTCh3cml0ZV8xNndvcmRzKToKKwltb3ZsCSVlYXgsIC0zMiglZWR4KQorCW1vdmwJJWVheCwgLTI4KCVlZHgpCitMKHdyaXRlXzEyd29yZHMpOgorCW1vdmwJJWVheCwgLTI0KCVlZHgpCisJbW92bAklZWF4LCAtMjAoJWVkeCkKK0wod3JpdGVfOHdvcmRzKToKKwltb3ZsCSVlYXgsIC0xNiglZWR4KQorCW1vdmwJJWVheCwgLTEyKCVlZHgpCitMKHdyaXRlXzR3b3Jkcyk6CisJbW92bAklZWF4LCAtOCglZWR4KQorCW1vdmwJJWVheCwgLTQoJWVkeCkKK0wod3JpdGVfMHdvcmRzKToKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTCh3cml0ZV8yOXdvcmRzKToKKwltb3ZsCSVlYXgsIC01OCglZWR4KQorCW1vdmwJJWVheCwgLTU0KCVlZHgpCitMKHdyaXRlXzI1d29yZHMpOgorCW1vdmwJJWVheCwgLTUwKCVlZHgpCisJbW92bAklZWF4LCAtNDYoJWVkeCkKK0wod3JpdGVfMjF3b3Jkcyk6CisJbW92bAklZWF4LCAtNDIoJWVkeCkKKwltb3ZsCSVlYXgsIC0zOCglZWR4KQorTCh3cml0ZV8xN3dvcmRzKToKKwltb3ZsCSVlYXgsIC0zNCglZWR4KQorCW1vdmwJJWVheCwgLTMwKCVlZHgpCitMKHdyaXRlXzEzd29yZHMpOgorCW1vdmwJJWVheCwgLTI2KCVlZHgpCisJbW92bAklZWF4LCAtMjIoJWVkeCkKK0wod3JpdGVfOXdvcmRzKToKKwltb3ZsCSVlYXgsIC0xOCglZWR4KQorCW1vdmwJJWVheCwgLTE0KCVlZHgpCitMKHdyaXRlXzV3b3Jkcyk6CisJbW92bAklZWF4LCAtMTAoJWVkeCkKKwltb3ZsCSVlYXgsIC02KCVlZHgpCitMKHdyaXRlXzF3b3Jkcyk6CisJbW92CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTCh3cml0ZV8zMHdvcmRzKToKKwltb3ZsCSVlYXgsIC02MCglZWR4KQorCW1vdmwJJWVheCwgLTU2KCVlZHgpCitMKHdyaXRlXzI2d29yZHMpOgorCW1vdmwJJWVheCwgLTUyKCVlZHgpCisJbW92bAklZWF4LCAtNDgoJWVkeCkKK0wod3JpdGVfMjJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNDQoJWVkeCkKKwltb3ZsCSVlYXgsIC00MCglZWR4KQorTCh3cml0ZV8xOHdvcmRzKToKKwltb3ZsCSVlYXgsIC0zNiglZWR4KQorCW1vdmwJJWVheCwgLTMyKCVlZHgpCitMKHdyaXRlXzE0d29yZHMpOgorCW1vdmwJJWVheCwgLTI4KCVlZHgpCisJbW92bAklZWF4LCAtMjQoJWVkeCkKK0wod3JpdGVfMTB3b3Jkcyk6CisJbW92bAklZWF4LCAtMjAoJWVkeCkKKwltb3ZsCSVlYXgsIC0xNiglZWR4KQorTCh3cml0ZV82d29yZHMpOgorCW1vdmwJJWVheCwgLTEyKCVlZHgpCisJbW92bAklZWF4LCAtOCglZWR4KQorTCh3cml0ZV8yd29yZHMpOgorCW1vdmwJJWVheCwgLTQoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTCh3cml0ZV8zMXdvcmRzKToKKwltb3ZsCSVlYXgsIC02MiglZWR4KQorCW1vdmwJJWVheCwgLTU4KCVlZHgpCitMKHdyaXRlXzI3d29yZHMpOgorCW1vdmwJJWVheCwgLTU0KCVlZHgpCisJbW92bAklZWF4LCAtNTAoJWVkeCkKK0wod3JpdGVfMjN3b3Jkcyk6CisJbW92bAklZWF4LCAtNDYoJWVkeCkKKwltb3ZsCSVlYXgsIC00MiglZWR4KQorTCh3cml0ZV8xOXdvcmRzKToKKwltb3ZsCSVlYXgsIC0zOCglZWR4KQorCW1vdmwJJWVheCwgLTM0KCVlZHgpCitMKHdyaXRlXzE1d29yZHMpOgorCW1vdmwJJWVheCwgLTMwKCVlZHgpCisJbW92bAklZWF4LCAtMjYoJWVkeCkKK0wod3JpdGVfMTF3b3Jkcyk6CisJbW92bAklZWF4LCAtMjIoJWVkeCkKKwltb3ZsCSVlYXgsIC0xOCglZWR4KQorTCh3cml0ZV83d29yZHMpOgorCW1vdmwJJWVheCwgLTE0KCVlZHgpCisJbW92bAklZWF4LCAtMTAoJWVkeCkKK0wod3JpdGVfM3dvcmRzKToKKwltb3ZsCSVlYXgsIC02KCVlZHgpCisJbW92dwklYXgsIC0yKCVlZHgpCisJU0VUUlROVkFMCisJUkVUVVJOCisKKwlBTElHTiAoNCkKKworTCgzMndvcmRzb3Jtb3JlKToKKwlzaGwJJDEsICVlY3gKKwl0ZXN0CSQweDAxLCAlZWR4CisJanoJTChhbGlnbmVkMmJ5dGVzKQorCW1vdgklZWF4LCAoJWVkeCkKKwltb3YJJWVheCwgLTQoJWVkeCwgJWVjeCkKKwlzdWIJJDIsICVlY3gKKwlhZGQJJDEsICVlZHgKKwlyb2wJJDgsICVlYXgKK0woYWxpZ25lZDJieXRlcyk6CisjaWZkZWYgVVNFX0FTX0JaRVJPMTYKKwlweG9yCSV4bW0wLCAleG1tMAorI2Vsc2UKKwltb3ZkCSVlYXgsICV4bW0wCisJcHNodWZkCSQwLCAleG1tMCwgJXhtbTAKKyNlbmRpZgorCXRlc3RsCSQweGYsICVlZHgKKwlqeglMKGFsaWduZWRfMTYpCisvKiBFQ1ggPiAzMiBhbmQgRURYIGlzIG5vdCAxNiBieXRlIGFsaWduZWQuICAqLworTChub3RfYWxpZ25lZF8xNik6CisJbW92ZHF1CSV4bW0wLCAoJWVkeCkKKwltb3ZsCSVlZHgsICVlYXgKKwlhbmQJJC0xNiwgJWVkeAorCWFkZAkkMTYsICVlZHgKKwlzdWIJJWVkeCwgJWVheAorCWFkZAklZWF4LCAlZWN4CisJbW92ZAkleG1tMCwgJWVheAorCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTYpOgorCWNtcAkkMTI4LCAlZWN4CisJamFlCUwoMTI4Ynl0ZXNvcm1vcmUpCisKK0woYWxpZ25lZF8xNl9sZXNzMTI4Ynl0ZXMpOgorCWFkZAklZWN4LCAlZWR4CisJc2hyCSQxLCAlZWN4CisJQlJBTkNIX1RPX0pNUFRCTF9FTlRSWSAoTCh0YWJsZV8xNl8xMjhieXRlcykpCisKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmUpOgorI2lmZGVmIFNIQVJFRF9DQUNIRV9TSVpFCisJUFVTSCAoJWVieCkKKwltb3YJJFNIQVJFRF9DQUNIRV9TSVpFLCAlZWJ4CisjZWxzZQorIyBpZmRlZiBTSEFSRUQKKwljYWxsCV9faTY4Ni5nZXRfcGNfdGh1bmsuYngKKwlhZGQJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgJWVieAorCW1vdglfX3g4Nl9zaGFyZWRfY2FjaGVfc2l6ZUBHT1RPRkYoJWVieCksICVlYngKKyMgZWxzZQorCVBVU0ggKCVlYngpCisJbW92CV9feDg2X3NoYXJlZF9jYWNoZV9zaXplLCAlZWJ4CisjIGVuZGlmCisjZW5kaWYKKwljbXAJJWVieCwgJWVjeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX250X3N0YXJ0KQorCisJCisjaWZkZWYgREFUQV9DQUNIRV9TSVpFCisJUE9QICglZWJ4KQorIyBkZWZpbmUgUkVTVE9SRV9FQlhfU1RBVEUgQ0ZJX1BVU0ggKCVlYngpCisJY21wCSREQVRBX0NBQ0hFX1NJWkUsICVlY3gKKyNlbHNlCisjIGlmZGVmIFNIQVJFRAorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFCisJY2FsbAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJYWRkCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8sICVlYngKKwljbXAJX194ODZfZGF0YV9jYWNoZV9zaXplQEdPVE9GRiglZWJ4KSwgJWVjeAorIyBlbHNlCisJUE9QICglZWJ4KQorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFIENGSV9QVVNIICglZWJ4KQorCWNtcAlfX3g4Nl9kYXRhX2NhY2hlX3NpemUsICVlY3gKKyMgZW5kaWYKKyNlbmRpZgorCisJamFlCUwoMTI4Ynl0ZXNfTDJfbm9ybWFsKQorCXN1YmwJJDEyOCwgJWVjeAorTCgxMjhieXRlc29ybW9yZV9ub3JtYWwpOgorCXN1YgkkMTI4LCAlZWN4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlsZWEJMTI4KCVlZHgpLCAlZWR4CisJamIJTCgxMjhieXRlc2xlc3Nfbm9ybWFsKQorCisKKwlzdWIJJDEyOCwgJWVjeAorCW1vdmRxYQkleG1tMCwgKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDEwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDIwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDMwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDQwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDUwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDYwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDcwKCVlZHgpCisJbGVhCTEyOCglZWR4KSwgJWVkeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3Nfbm9ybWFsKToKKwlsZWEJMTI4KCVlY3gpLCAlZWN4CisJYWRkCSVlY3gsICVlZHgKKwlzaHIJJDEsICVlY3gKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc19MMl9ub3JtYWwpOgorCXByZWZldGNodDAJMHgzODAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4M2MwKCVlZHgpCisJc3ViCSQxMjgsICVlY3gKKwltb3ZkcWEJJXhtbTAsICglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgxMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgyMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgzMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg0MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg1MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg2MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg3MCglZWR4KQorCWFkZAkkMTI4LCAlZWR4CisJY21wCSQxMjgsICVlY3ggCQorCWphZQlMKDEyOGJ5dGVzX0wyX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3NfTDJfbm9ybWFsKToKKwlhZGQJJWVjeCwgJWVkeAorCXNocgkkMSwgJWVjeAorCUJSQU5DSF9UT19KTVBUQkxfRU5UUlkgKEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCisJUkVTVE9SRV9FQlhfU1RBVEUKK0woMTI4Ynl0ZXNvcm1vcmVfbnRfc3RhcnQpOgorCXN1YgklZWJ4LCAlZWN4CisJbW92CSVlYngsICVlYXgKKwlhbmQJJDB4N2YsICVlYXgKKwlhZGQJJWVheCwgJWVjeAorCW1vdmQJJXhtbTAsICVlYXgKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmVfc2hhcmVkX2NhY2hlX2xvb3ApOgorCXByZWZldGNodDAJMHgzYzAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4MzgwKCVlZHgpCisJc3ViCSQweDgwLCAlZWJ4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlhZGQJJDB4ODAsICVlZHgKKwljbXAJJDB4ODAsICVlYngKKwlqYWUJTCgxMjhieXRlc29ybW9yZV9zaGFyZWRfY2FjaGVfbG9vcCkKKwljbXAJJDB4ODAsICVlY3gKKwlqYglMKHNoYXJlZF9jYWNoZV9sb29wX2VuZCkKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmVfbnQpOgorCXN1YgkkMHg4MCwgJWVjeAorCW1vdm50ZHEJJXhtbTAsICglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDIwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHgzMCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDUwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHg2MCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4NzAoJWVkeCkKKwlhZGQJJDB4ODAsICVlZHgKKwljbXAJJDB4ODAsICVlY3gKKwlqYWUJTCgxMjhieXRlc29ybW9yZV9udCkKKwlzZmVuY2UKK0woc2hhcmVkX2NhY2hlX2xvb3BfZW5kKToKKyNpZiBkZWZpbmVkIERBVEFfQ0FDSEVfU0laRSB8fCAhZGVmaW5lZCBTSEFSRUQKKwlQT1AgKCVlYngpCisjZW5kaWYKKwlhZGQJJWVjeCwgJWVkeAorCXNocgkkMSwgJWVjeAorCUJSQU5DSF9UT19KTVBUQkxfRU5UUlkgKEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCisKKwkucHVzaHNlY3Rpb24gLnJvZGF0YS5zc2UyLCJhIixAcHJvZ2JpdHMKKwlBTElHTiAoMikKK0wodGFibGVfMTZfMTI4Ynl0ZXMpOgorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8yYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl84Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzE0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzE2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzE4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzIwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzIyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzI0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzI2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzI4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzMwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzMyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzM0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzM2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzM4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQ0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQ2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQ4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzUwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzUyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzU0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzU2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzU4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzYwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzYyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzY0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzY2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzY4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzcwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzcyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzc0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzc2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzc4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzgwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzgyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzg0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzg2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzg4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzkwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzkyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzk0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzk2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzk4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwMGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMDJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTA0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwNmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMDhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTEwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzExMmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMTRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTE2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzExOGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTIyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEyNGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMjZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5wb3BzZWN0aW9uCisKKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzExMmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMTIoJWVkeCkKK0woYWxpZ25lZF8xNl85NmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC05NiglZWR4KQorTChhbGlnbmVkXzE2XzgwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTgwKCVlZHgpCitMKGFsaWduZWRfMTZfNjRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNjQoJWVkeCkKK0woYWxpZ25lZF8xNl80OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC00OCglZWR4KQorTChhbGlnbmVkXzE2XzMyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTMyKCVlZHgpCitMKGFsaWduZWRfMTZfMTZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTYoJWVkeCkKK0woYWxpZ25lZF8xNl8wYnl0ZXMpOgorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMTRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTE0KCVlZHgpCitMKGFsaWduZWRfMTZfOThieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtOTgoJWVkeCkKK0woYWxpZ25lZF8xNl84MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC04MiglZWR4KQorTChhbGlnbmVkXzE2XzY2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTY2KCVlZHgpCitMKGFsaWduZWRfMTZfNTBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNTAoJWVkeCkKK0woYWxpZ25lZF8xNl8zNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0zNCglZWR4KQorTChhbGlnbmVkXzE2XzE4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTE4KCVlZHgpCitMKGFsaWduZWRfMTZfMmJ5dGVzKToKKwltb3Z3CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzExNmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMTYoJWVkeCkKK0woYWxpZ25lZF8xNl8xMDBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTAwKCVlZHgpCitMKGFsaWduZWRfMTZfODRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtODQoJWVkeCkKK0woYWxpZ25lZF8xNl82OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC02OCglZWR4KQorTChhbGlnbmVkXzE2XzUyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTUyKCVlZHgpCitMKGFsaWduZWRfMTZfMzZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMzYoJWVkeCkKK0woYWxpZ25lZF8xNl8yMGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0yMCglZWR4KQorTChhbGlnbmVkXzE2XzRieXRlcyk6CisJbW92bAklZWF4LCAtNCglZWR4KQorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMThieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTE4KCVlZHgpCitMKGFsaWduZWRfMTZfMTAyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEwMiglZWR4KQorTChhbGlnbmVkXzE2Xzg2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTg2KCVlZHgpCitMKGFsaWduZWRfMTZfNzBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNzAoJWVkeCkKK0woYWxpZ25lZF8xNl81NGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC01NCglZWR4KQorTChhbGlnbmVkXzE2XzM4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTM4KCVlZHgpCitMKGFsaWduZWRfMTZfMjJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMjIoJWVkeCkKK0woYWxpZ25lZF8xNl82Ynl0ZXMpOgorCW1vdmwJJWVheCwgLTYoJWVkeCkKKwltb3Z3CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTZfMTIwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEyMCglZWR4KQorTChhbGlnbmVkXzE2XzEwNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMDQoJWVkeCkKK0woYWxpZ25lZF8xNl84OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC04OCglZWR4KQorTChhbGlnbmVkXzE2XzcyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTcyKCVlZHgpCitMKGFsaWduZWRfMTZfNTZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNTYoJWVkeCkKK0woYWxpZ25lZF8xNl80MGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC00MCglZWR4KQorTChhbGlnbmVkXzE2XzI0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTI0KCVlZHgpCitMKGFsaWduZWRfMTZfOGJ5dGVzKToKKwltb3ZxCSV4bW0wLCAtOCglZWR4KQorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMjJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTIyKCVlZHgpCitMKGFsaWduZWRfMTZfMTA2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEwNiglZWR4KQorTChhbGlnbmVkXzE2XzkwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTkwKCVlZHgpCitMKGFsaWduZWRfMTZfNzRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNzQoJWVkeCkKK0woYWxpZ25lZF8xNl81OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC01OCglZWR4KQorTChhbGlnbmVkXzE2XzQyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTQyKCVlZHgpCitMKGFsaWduZWRfMTZfMjZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMjYoJWVkeCkKK0woYWxpZ25lZF8xNl8xMGJ5dGVzKToKKwltb3ZxCSV4bW0wLCAtMTAoJWVkeCkKKwltb3Z3CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTZfMTI0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEyNCglZWR4KQorTChhbGlnbmVkXzE2XzEwOGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMDgoJWVkeCkKK0woYWxpZ25lZF8xNl85MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC05MiglZWR4KQorTChhbGlnbmVkXzE2Xzc2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTc2KCVlZHgpCitMKGFsaWduZWRfMTZfNjBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNjAoJWVkeCkKK0woYWxpZ25lZF8xNl80NGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC00NCglZWR4KQorTChhbGlnbmVkXzE2XzI4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTI4KCVlZHgpCitMKGFsaWduZWRfMTZfMTJieXRlcyk6CisJbW92cQkleG1tMCwgLTEyKCVlZHgpCisJbW92bAklZWF4LCAtNCglZWR4KQorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMjZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTI2KCVlZHgpCitMKGFsaWduZWRfMTZfMTEwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTExMCglZWR4KQorTChhbGlnbmVkXzE2Xzk0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTk0KCVlZHgpCitMKGFsaWduZWRfMTZfNzhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNzgoJWVkeCkKK0woYWxpZ25lZF8xNl82MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC02MiglZWR4KQorTChhbGlnbmVkXzE2XzQ2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTQ2KCVlZHgpCitMKGFsaWduZWRfMTZfMzBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMzAoJWVkeCkKK0woYWxpZ25lZF8xNl8xNGJ5dGVzKToKKwltb3ZxCSV4bW0wLCAtMTQoJWVkeCkKKwltb3ZsCSVlYXgsIC02KCVlZHgpCisJbW92dwklYXgsIC0yKCVlZHgpCisJU0VUUlROVkFMCisJUkVUVVJOCisKK0VORCAoc3NlMl9tZW1zZXQxNl9hdG9tKQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MzItYXRvbS5TIGIvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MzItYXRvbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTI0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjdXRpbHMvYXJjaC14ODYvc3NlMi1tZW1zZXQzMi1hdG9tLlMKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIENvbnRyaWJ1dGVkIGJ5OiBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgTAorIyBkZWZpbmUgTChsYWJlbCkJLkwjI2xhYmVsCisjZW5kaWYKKworI2lmbmRlZiBBTElHTgorIyBkZWZpbmUgQUxJR04obikJLnAyYWxpZ24gbgorI2VuZGlmCisKKyNpZm5kZWYgY2ZpX3N0YXJ0cHJvYworIyBkZWZpbmUgY2ZpX3N0YXJ0cHJvYwkJCS5jZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBjZmlfZW5kcHJvYworIyBkZWZpbmUgY2ZpX2VuZHByb2MJCQkuY2ZpX2VuZHByb2MKKyNlbmRpZgorCisjaWZuZGVmIGNmaV9yZWxfb2Zmc2V0CisjIGRlZmluZSBjZmlfcmVsX29mZnNldChyZWcsIG9mZikJLmNmaV9yZWxfb2Zmc2V0IHJlZywgb2ZmCisjZW5kaWYKKworI2lmbmRlZiBjZmlfcmVzdG9yZQorIyBkZWZpbmUgY2ZpX3Jlc3RvcmUocmVnKQkJLmNmaV9yZXN0b3JlIHJlZworI2VuZGlmCisKKyNpZm5kZWYgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CisjIGRlZmluZSBjZmlfYWRqdXN0X2NmYV9vZmZzZXQob2ZmKQkuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IG9mZgorI2VuZGlmCisKKyNpZm5kZWYgRU5UUlkKKyMgZGVmaW5lIEVOVFJZKG5hbWUpCQkJXAorCS50eXBlIG5hbWUsICBAZnVuY3Rpb247IAlcCisJLmdsb2JsIG5hbWU7CQkJXAorCS5wMmFsaWduIDQ7CQkJXAorbmFtZToJCQkJCVwKKwljZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBFTkQKKyMgZGVmaW5lIEVORChuYW1lKQkJCVwKKwljZmlfZW5kcHJvYzsJCQlcCisJLnNpemUgbmFtZSwgLi1uYW1lCisjZW5kaWYKKworI2RlZmluZSBDRklfUFVTSChSRUcpCQkJCQkJXAorICBjZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpOwkJCQkJXAorICBjZmlfcmVsX29mZnNldCAoUkVHLCAwKQorCisjZGVmaW5lIENGSV9QT1AoUkVHKQkJCQkJCVwKKyAgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCk7CQkJCQlcCisgIGNmaV9yZXN0b3JlIChSRUcpCisKKyNkZWZpbmUgUFVTSChSRUcpCXB1c2hsIFJFRzsgQ0ZJX1BVU0ggKFJFRykKKyNkZWZpbmUgUE9QKFJFRykJcG9wbCBSRUc7IENGSV9QT1AgKFJFRykKKworI2lmZGVmIFVTRV9BU19CWkVSTzMyCisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgTEVOCQlERVNUKzQKKyNlbHNlCisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgRFdEUwkJREVTVCs0CisjIGRlZmluZSBMRU4JCURXRFMrNAorI2VuZGlmCisKKyNpZmRlZiBVU0VfQVNfV01FTVNFVDMyCisjIGRlZmluZSBTRVRSVE5WQUwJbW92bCBERVNUKCVlc3ApLCAlZWF4CisjZWxzZQorIyBkZWZpbmUgU0VUUlROVkFMCisjZW5kaWYKKworI2lmZGVmIFNIQVJFRAorIyBkZWZpbmUgRU5UUkFOQ0UJUFVTSCAoJWVieCk7CisjIGRlZmluZSBSRVRVUk5fRU5ECVBPUCAoJWVieCk7IHJldAorIyBkZWZpbmUgUkVUVVJOCQlSRVRVUk5fRU5EOyBDRklfUFVTSCAoJWVieCkKKyMgZGVmaW5lIFBBUk1TCQk4CQkvKiBQcmVzZXJ2ZSBFQlguICAqLworIyBkZWZpbmUgSk1QVEJMKEksIEIpCUkgLSBCCisKKy8qIExvYWQgYW4gZW50cnkgaW4gYSBqdW1wIHRhYmxlIGludG8gRUJYIGFuZCBicmFuY2ggdG8gaXQuICBUQUJMRSBpcyBhCisgICBqdW1wIHRhYmxlIHdpdGggcmVsYXRpdmUgb2Zmc2V0cy4gICAqLworIyBkZWZpbmUgQlJBTkNIX1RPX0pNUFRCTF9FTlRSWShUQUJMRSkJCQkJXAorICAgIC8qIFdlIGZpcnN0IGxvYWQgUEMgaW50byBFQlguICAqLwkJCQlcCisgICAgY2FsbAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4OwkJCQlcCisgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wIHRhYmxlLiAgKi8JCQlcCisgICAgYWRkCQkkKFRBQkxFIC0gLiksICVlYng7CQkJCVwKKyAgICAvKiBHZXQgdGhlIGVudHJ5IGFuZCBjb252ZXJ0IHRoZSByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlCVwKKyAgICAgICBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8JCQkJCVwKKyAgICBhZGQJCSglZWJ4LCVlY3gsNCksICVlYng7CQkJCVwKKyAgICAvKiBXZSBsb2FkZWQgdGhlIGp1bXAgdGFibGUgYW5kIGFkanVlc3RlZCBFRFguIEdvLiAgKi8JXAorICAgIGptcAkJKiVlYngKKworCS5zZWN0aW9uCS5nbnUubGlua29uY2UudC5fX2k2ODYuZ2V0X3BjX3RodW5rLmJ4LCJheCIsQHByb2diaXRzCisJLmdsb2JsCV9faTY4Ni5nZXRfcGNfdGh1bmsuYngKKwkuaGlkZGVuCV9faTY4Ni5nZXRfcGNfdGh1bmsuYngKKwlBTElHTiAoNCkKKwkudHlwZQlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4LEBmdW5jdGlvbgorX19pNjg2LmdldF9wY190aHVuay5ieDoKKwltb3ZsCSglZXNwKSwgJWVieAorCXJldAorI2Vsc2UKKyMgZGVmaW5lIEVOVFJBTkNFCisjIGRlZmluZSBSRVRVUk5fRU5ECXJldAorIyBkZWZpbmUgUkVUVVJOCQlSRVRVUk5fRU5ECisjIGRlZmluZSBQQVJNUwkJNAorIyBkZWZpbmUgSk1QVEJMKEksIEIpCUkKKworLyogQnJhbmNoIHRvIGFuIGVudHJ5IGluIGEganVtcCB0YWJsZS4gIFRBQkxFIGlzIGEganVtcCB0YWJsZSB3aXRoCisgICBhYnNvbHV0ZSBvZmZzZXRzLiAgKi8KKyMgZGVmaW5lIEJSQU5DSF9UT19KTVBUQkxfRU5UUlkoVEFCTEUpCQkJCVwKKyAgICBqbXAJCSpUQUJMRSgsJWVjeCw0KQorI2VuZGlmCisKKwkuc2VjdGlvbiAudGV4dC5zc2UyLCJheCIsQHByb2diaXRzCisJQUxJR04gKDQpCitFTlRSWSAoc3NlMl9tZW1zZXQzMl9hdG9tKQorCUVOVFJBTkNFCisKKwltb3ZsCUxFTiglZXNwKSwgJWVjeAorI2lmZGVmIFVTRV9BU19BTkRST0lECisJc2hyICAgICAkMiwgJWVjeAorI2VuZGlmCisjaWZkZWYgVVNFX0FTX0JaRVJPMzIKKwl4b3IJJWVheCwgJWVheAorI2Vsc2UKKwltb3YJRFdEUyglZXNwKSwgJWVheAorCW1vdgklZWF4LCAlZWR4CisjZW5kaWYKKwltb3ZsCURFU1QoJWVzcCksICVlZHgKKwljbXAJJDE2LCAlZWN4CisJamFlCUwoMTZkYndvcmRzb3Jtb3JlKQorCitMKHdyaXRlX2xlc3MxNmRid29yZHMpOgorCWxlYQkoJWVkeCwgJWVjeCwgNCksICVlZHgKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCisJLnB1c2hzZWN0aW9uIC5yb2RhdGEuc3NlMiwiYSIsQHByb2diaXRzCisJQUxJR04gKDIpCitMKHRhYmxlX2xlc3MxNmRid29yZHMpOgorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzBkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMmRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzNkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV80ZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfNWRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzZkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV83ZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfOGRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzlkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xMGRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzExZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTJkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xM2Rid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzE0ZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTVkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkucG9wc2VjdGlvbgorCisJQUxJR04gKDQpCitMKHdyaXRlXzE1ZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNjAoJWVkeCkKK0wod3JpdGVfMTRkYndvcmRzKToKKwltb3ZsCSVlYXgsIC01NiglZWR4KQorTCh3cml0ZV8xM2Rid29yZHMpOgorCW1vdmwJJWVheCwgLTUyKCVlZHgpCitMKHdyaXRlXzEyZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNDgoJWVkeCkKK0wod3JpdGVfMTFkYndvcmRzKToKKwltb3ZsCSVlYXgsIC00NCglZWR4KQorTCh3cml0ZV8xMGRid29yZHMpOgorCW1vdmwJJWVheCwgLTQwKCVlZHgpCitMKHdyaXRlXzlkYndvcmRzKToKKwltb3ZsCSVlYXgsIC0zNiglZWR4KQorTCh3cml0ZV84ZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtMzIoJWVkeCkKK0wod3JpdGVfN2Rid29yZHMpOgorCW1vdmwJJWVheCwgLTI4KCVlZHgpCitMKHdyaXRlXzZkYndvcmRzKToKKwltb3ZsCSVlYXgsIC0yNCglZWR4KQorTCh3cml0ZV81ZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtMjAoJWVkeCkKK0wod3JpdGVfNGRid29yZHMpOgorCW1vdmwJJWVheCwgLTE2KCVlZHgpCitMKHdyaXRlXzNkYndvcmRzKToKKwltb3ZsCSVlYXgsIC0xMiglZWR4KQorTCh3cml0ZV8yZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtOCglZWR4KQorTCh3cml0ZV8xZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNCglZWR4KQorTCh3cml0ZV8wZGJ3b3Jkcyk6CisJU0VUUlROVkFMCisJUkVUVVJOCisKKwlBTElHTiAoNCkKK0woMTZkYndvcmRzb3Jtb3JlKToKKwl0ZXN0CSQzLCAlZWR4CisJanoJTChhbGlnbmVkNGJ5dGVzKQorCW1vdgklZWF4LCAoJWVkeCkKKwltb3YJJWVheCwgLTQoJWVkeCwgJWVjeCwgNCkKKwlzdWIJJDEsICVlY3gKKwlyb2wJJDI0LCAlZWF4CisJYWRkCSQxLCAlZWR4CisJdGVzdAkkMywgJWVkeAorCWp6CUwoYWxpZ25lZDRieXRlcykKKwlyb3IJJDgsICVlYXgKKwlhZGQJJDEsICVlZHgKKwl0ZXN0CSQzLCAlZWR4CisJanoJTChhbGlnbmVkNGJ5dGVzKQorCXJvcgkkOCwgJWVheAorCWFkZAkkMSwgJWVkeAorTChhbGlnbmVkNGJ5dGVzKToKKwlzaGwJJDIsICVlY3gKKworI2lmZGVmIFVTRV9BU19CWkVSTzMyCisJcHhvcgkleG1tMCwgJXhtbTAKKyNlbHNlCisJbW92ZAklZWF4LCAleG1tMAorCXBzaHVmZAkkMCwgJXhtbTAsICV4bW0wCisjZW5kaWYKKwl0ZXN0bAkkMHhmLCAlZWR4CisJanoJTChhbGlnbmVkXzE2KQorLyogRUNYID4gMzIgYW5kIEVEWCBpcyBub3QgMTYgYnl0ZSBhbGlnbmVkLiAgKi8KK0wobm90X2FsaWduZWRfMTYpOgorCW1vdmRxdQkleG1tMCwgKCVlZHgpCisJbW92bAklZWR4LCAlZWF4CisJYW5kCSQtMTYsICVlZHgKKwlhZGQJJDE2LCAlZWR4CisJc3ViCSVlZHgsICVlYXgKKwlhZGQJJWVheCwgJWVjeAorCW1vdmQJJXhtbTAsICVlYXgKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNik6CisJY21wCSQxMjgsICVlY3gKKwlqYWUJTCgxMjhieXRlc29ybW9yZSkKKworTChhbGlnbmVkXzE2X2xlc3MxMjhieXRlcyk6CisJYWRkCSVlY3gsICVlZHgKKwlzaHIJJDIsICVlY3gKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc29ybW9yZSk6CisjaWZkZWYgU0hBUkVEX0NBQ0hFX1NJWkUKKwlQVVNIICglZWJ4KQorCW1vdgkkU0hBUkVEX0NBQ0hFX1NJWkUsICVlYngKKyNlbHNlCisjIGlmZGVmIFNIQVJFRAorCWNhbGwJX19pNjg2LmdldF9wY190aHVuay5ieAorCWFkZAkkX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCAlZWJ4CisJbW92CV9feDg2X3NoYXJlZF9jYWNoZV9zaXplQEdPVE9GRiglZWJ4KSwgJWVieAorIyBlbHNlCisJUFVTSCAoJWVieCkKKwltb3YJX194ODZfc2hhcmVkX2NhY2hlX3NpemUsICVlYngKKyMgZW5kaWYKKyNlbmRpZgorCWNtcAklZWJ4LCAlZWN4CisJamFlCUwoMTI4Ynl0ZXNvcm1vcmVfbnRfc3RhcnQpCisJCisjaWZkZWYgREFUQV9DQUNIRV9TSVpFCisJUE9QICglZWJ4KQorIyBkZWZpbmUgUkVTVE9SRV9FQlhfU1RBVEUgQ0ZJX1BVU0ggKCVlYngpCisJY21wCSREQVRBX0NBQ0hFX1NJWkUsICVlY3gKKyNlbHNlCisjIGlmZGVmIFNIQVJFRAorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFCisJY2FsbAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJYWRkCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8sICVlYngKKwljbXAJX194ODZfZGF0YV9jYWNoZV9zaXplQEdPVE9GRiglZWJ4KSwgJWVjeAorIyBlbHNlCisJUE9QICglZWJ4KQorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFIENGSV9QVVNIICglZWJ4KQorCWNtcAlfX3g4Nl9kYXRhX2NhY2hlX3NpemUsICVlY3gKKyMgZW5kaWYKKyNlbmRpZgorCisJamFlCUwoMTI4Ynl0ZXNfTDJfbm9ybWFsKQorCXN1YmwJJDEyOCwgJWVjeAorTCgxMjhieXRlc29ybW9yZV9ub3JtYWwpOgorCXN1YgkkMTI4LCAlZWN4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlsZWEJMTI4KCVlZHgpLCAlZWR4CisJamIJTCgxMjhieXRlc2xlc3Nfbm9ybWFsKQorCisKKwlzdWIJJDEyOCwgJWVjeAorCW1vdmRxYQkleG1tMCwgKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDEwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDIwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDMwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDQwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDUwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDYwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDcwKCVlZHgpCisJbGVhCTEyOCglZWR4KSwgJWVkeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3Nfbm9ybWFsKToKKwlsZWEJMTI4KCVlY3gpLCAlZWN4CisJYWRkCSVlY3gsICVlZHgKKwlzaHIJJDIsICVlY3gKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc19MMl9ub3JtYWwpOgorCXByZWZldGNodDAJMHgzODAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4M2MwKCVlZHgpCisJc3ViCSQxMjgsICVlY3gKKwltb3ZkcWEJJXhtbTAsICglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgxMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgyMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgzMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg0MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg1MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg2MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg3MCglZWR4KQorCWFkZAkkMTI4LCAlZWR4CisJY21wCSQxMjgsICVlY3ggCQorCWphZQlMKDEyOGJ5dGVzX0wyX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3NfTDJfbm9ybWFsKToKKwlhZGQJJWVjeCwgJWVkeAorCXNocgkkMiwgJWVjeAorCUJSQU5DSF9UT19KTVBUQkxfRU5UUlkgKEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCisJUkVTVE9SRV9FQlhfU1RBVEUKK0woMTI4Ynl0ZXNvcm1vcmVfbnRfc3RhcnQpOgorCXN1YgklZWJ4LCAlZWN4CisJbW92CSVlYngsICVlYXgKKwlhbmQJJDB4N2YsICVlYXgKKwlhZGQJJWVheCwgJWVjeAorCW1vdmQJJXhtbTAsICVlYXgKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmVfc2hhcmVkX2NhY2hlX2xvb3ApOgorCXByZWZldGNodDAJMHgzYzAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4MzgwKCVlZHgpCisJc3ViCSQweDgwLCAlZWJ4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlhZGQJJDB4ODAsICVlZHgKKwljbXAJJDB4ODAsICVlYngKKwlqYWUJTCgxMjhieXRlc29ybW9yZV9zaGFyZWRfY2FjaGVfbG9vcCkKKwljbXAJJDB4ODAsICVlY3gKKwlqYglMKHNoYXJlZF9jYWNoZV9sb29wX2VuZCkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc29ybW9yZV9udCk6CisJc3ViCSQweDgwLCAlZWN4CisJbW92bnRkcQkleG1tMCwgKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHgxMCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDMwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHg0MCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDYwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHg3MCglZWR4KQorCWFkZAkkMHg4MCwgJWVkeAorCWNtcAkkMHg4MCwgJWVjeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX250KQorCXNmZW5jZQorTChzaGFyZWRfY2FjaGVfbG9vcF9lbmQpOgorI2lmIGRlZmluZWQgREFUQV9DQUNIRV9TSVpFIHx8ICFkZWZpbmVkIFNIQVJFRAorCVBPUCAoJWVieCkKKyNlbmRpZgorCWFkZAklZWN4LCAlZWR4CisJc2hyCSQyLCAlZWN4CisJQlJBTkNIX1RPX0pNUFRCTF9FTlRSWSAoTCh0YWJsZV8xNl8xMjhieXRlcykpCisKKwkucHVzaHNlY3Rpb24gLnJvZGF0YS5zc2UyLCJhIixAcHJvZ2JpdHMKKwlBTElHTiAoMikKK0wodGFibGVfMTZfMTI4Ynl0ZXMpOgorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl80Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMjRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMjhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMzJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMzZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNDBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNDRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNDhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNTJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNTZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNjRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNjhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNzJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNzZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfODBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfODRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfODhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfOTJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfOTZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTAwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwNGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMDhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTEyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzExNmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTI0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkucG9wc2VjdGlvbgorCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTZfMTEyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTExMiglZWR4KQorTChhbGlnbmVkXzE2Xzk2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTk2KCVlZHgpCitMKGFsaWduZWRfMTZfODBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtODAoJWVkeCkKK0woYWxpZ25lZF8xNl82NGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC02NCglZWR4KQorTChhbGlnbmVkXzE2XzQ4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTQ4KCVlZHgpCitMKGFsaWduZWRfMTZfMzJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMzIoJWVkeCkKK0woYWxpZ25lZF8xNl8xNmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xNiglZWR4KQorTChhbGlnbmVkXzE2XzBieXRlcyk6CisJU0VUUlROVkFMCisJUkVUVVJOCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMTZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTE2KCVlZHgpCitMKGFsaWduZWRfMTZfMTAwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEwMCglZWR4KQorTChhbGlnbmVkXzE2Xzg0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTg0KCVlZHgpCitMKGFsaWduZWRfMTZfNjhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNjgoJWVkeCkKK0woYWxpZ25lZF8xNl81MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC01MiglZWR4KQorTChhbGlnbmVkXzE2XzM2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTM2KCVlZHgpCitMKGFsaWduZWRfMTZfMjBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMjAoJWVkeCkKK0woYWxpZ25lZF8xNl80Ynl0ZXMpOgorCW1vdmwJJWVheCwgLTQoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzEyMGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMjAoJWVkeCkKK0woYWxpZ25lZF8xNl8xMDRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTA0KCVlZHgpCitMKGFsaWduZWRfMTZfODhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtODgoJWVkeCkKK0woYWxpZ25lZF8xNl83MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC03MiglZWR4KQorTChhbGlnbmVkXzE2XzU2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTU2KCVlZHgpCitMKGFsaWduZWRfMTZfNDBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNDAoJWVkeCkKK0woYWxpZ25lZF8xNl8yNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0yNCglZWR4KQorTChhbGlnbmVkXzE2XzhieXRlcyk6CisJbW92cQkleG1tMCwgLTgoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzEyNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMjQoJWVkeCkKK0woYWxpZ25lZF8xNl8xMDhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTA4KCVlZHgpCitMKGFsaWduZWRfMTZfOTJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtOTIoJWVkeCkKK0woYWxpZ25lZF8xNl83NmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC03NiglZWR4KQorTChhbGlnbmVkXzE2XzYwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTYwKCVlZHgpCitMKGFsaWduZWRfMTZfNDRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNDQoJWVkeCkKK0woYWxpZ25lZF8xNl8yOGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0yOCglZWR4KQorTChhbGlnbmVkXzE2XzEyYnl0ZXMpOgorCW1vdnEJJXhtbTAsIC0xMiglZWR4KQorCW1vdmwJJWVheCwgLTQoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworRU5EIChzc2UyX21lbXNldDMyX2F0b20pCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvYXRvbWljLWFuZHJvaWQtc2guYyBiL2xpYmN1dGlscy9hdG9taWMtYW5kcm9pZC1zaC5jCmluZGV4IGY4ZjFmNTcuLjhiYWM2OGEgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9hdG9taWMtYW5kcm9pZC1zaC5jCisrKyBiL2xpYmN1dGlscy9hdG9taWMtYW5kcm9pZC1zaC5jCkBAIC0xMTMsMTggKzExMyw2IEBACiAgICAgcmV0dXJuIG9sZFZhbHVlOwogfQogCi1pbnQzMl90IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfc3dhcChpbnQzMl90IHZhbHVlLCB2b2xhdGlsZSBpbnQzMl90KiBhZGRyKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3dhcCh2YWx1ZSwgYWRkcik7Ci19Ci0KLWludDMyX3QgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zd2FwKGludDMyX3QgdmFsdWUsIHZvbGF0aWxlIGludDMyX3QqIGFkZHIpIHsKLSAgICBpbnQzMl90IG9sZFZhbHVlOwotICAgIGRvIHsKLSAgICAgICAgb2xkVmFsdWUgPSAqYWRkcjsKLSAgICB9IHdoaWxlIChhbmRyb2lkX2F0b21pY19jbXB4Y2hnKG9sZFZhbHVlLCB2YWx1ZSwgYWRkcikpOwotICAgIHJldHVybiBvbGRWYWx1ZTsKLX0KLQogaW50IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfY21weGNoZyhpbnQzMl90IG9sZHZhbHVlLCBpbnQzMl90IG5ld3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50MzJfdCogYWRkcikgewogICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19yZWxlYXNlX2NtcHhjaGcob2xkVmFsdWUsIG5ld1ZhbHVlLCBhZGRyKTsKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9oYXNobWFwLmMgYi9saWJjdXRpbHMvaGFzaG1hcC5jCmluZGV4IGUyOWJjMjQuLjY1NTM5ZWEgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9oYXNobWFwLmMKKysrIGIvbGliY3V0aWxzL2hhc2htYXAuYwpAQCAtMzEwLDEwICszMTAsMTEgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgbWFwLT5idWNrZXRDb3VudDsgaSsrKSB7CiAgICAgICAgIEVudHJ5KiBlbnRyeSA9IG1hcC0+YnVja2V0c1tpXTsKICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEVudHJ5ICpuZXh0ID0gZW50cnktPm5leHQ7CiAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrKGVudHJ5LT5rZXksIGVudHJ5LT52YWx1ZSwgY29udGV4dCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgZW50cnkgPSBuZXh0OwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL21lbW9yeS5jIGIvbGliY3V0aWxzL21lbW9yeS5jCmluZGV4IGVmNmM3ZTYuLjY0ODZiNDUgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9tZW1vcnkuYworKysgYi9saWJjdXRpbHMvbWVtb3J5LmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9tZW1vcnkuaD4KIAorI2lmICFIQVZFX01FTVNFVDE2CiB2b2lkIGFuZHJvaWRfbWVtc2V0MTYodWludDE2X3QqIGRzdCwgdWludDE2X3QgdmFsdWUsIHNpemVfdCBzaXplKQogewogICAgIHNpemUgPj49IDE7CkBAIC0yMyw3ICsyNCw5IEBACiAgICAgICAgICpkc3QrKyA9IHZhbHVlOwogICAgIH0KIH0KKyNlbmRpZgogCisjaWYgIUhBVkVfTUVNU0VUMzIKIHZvaWQgYW5kcm9pZF9tZW1zZXQzMih1aW50MzJfdCogZHN0LCB1aW50MzJfdCB2YWx1ZSwgc2l6ZV90IHNpemUpCiB7CiAgICAgc2l6ZSA+Pj0gMjsKQEAgLTMxLDYgKzM0LDcgQEAKICAgICAgICAgKmRzdCsrID0gdmFsdWU7CiAgICAgfQogfQorI2VuZGlmCiAKICNpZiAhSEFWRV9TVFJMQ1BZCiAvKgpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL3Byb3BlcnRpZXMuYyBiL2xpYmN1dGlscy9wcm9wZXJ0aWVzLmMKaW5kZXggNTQ3Y2M2ZC4uOThmMzU2YiAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL3Byb3BlcnRpZXMuYworKysgYi9saWJjdXRpbHMvcHJvcGVydGllcy5jCkBAIC0zMSw0NyArMzEsOSBAQAogI2RlZmluZSBfUkVBTExZX0lOQ0xVREVfU1lTX19TWVNURU1fUFJPUEVSVElFU19IXwogI2luY2x1ZGUgPHN5cy9fc3lzdGVtX3Byb3BlcnRpZXMuaD4KIAotc3RhdGljIGludCBzZW5kX3Byb3BfbXNnKHByb3BfbXNnICptc2cpCi17Ci0gICAgaW50IHM7Ci0gICAgaW50IHI7Ci0gICAgCi0gICAgcyA9IHNvY2tldF9sb2NhbF9jbGllbnQoUFJPUF9TRVJWSUNFX05BTUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9SRVNFUlZFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0NLX1NUUkVBTSk7Ci0gICAgaWYocyA8IDApIHJldHVybiAtMTsKLSAgICAKLSAgICB3aGlsZSgociA9IHNlbmQocywgbXNnLCBzaXplb2YocHJvcF9tc2cpLCAwKSkgPCAwKSB7Ci0gICAgICAgIGlmKChlcnJubyA9PSBFSU5UUikgfHwgKGVycm5vID09IEVBR0FJTikpIGNvbnRpbnVlOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZihyID09IHNpemVvZihwcm9wX21zZykpIHsKLSAgICAgICAgciA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgciA9IC0xOwotICAgIH0KLQotICAgIGNsb3NlKHMpOwotICAgIHJldHVybiByOwotfQotCiBpbnQgcHJvcGVydHlfc2V0KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0gICAgcHJvcF9tc2cgbXNnOwotICAgIHVuc2lnbmVkIHJlc3A7Ci0KLSAgICBpZihrZXkgPT0gMCkgcmV0dXJuIC0xOwotICAgIGlmKHZhbHVlID09IDApIHZhbHVlID0gIiI7Ci0gICAgCi0gICAgaWYoc3RybGVuKGtleSkgPj0gUFJPUF9OQU1FX01BWCkgcmV0dXJuIC0xOwotICAgIGlmKHN0cmxlbih2YWx1ZSkgPj0gUFJPUF9WQUxVRV9NQVgpIHJldHVybiAtMTsKLSAgICAKLSAgICBtc2cuY21kID0gUFJPUF9NU0dfU0VUUFJPUDsKLSAgICBzdHJjcHkoKGNoYXIqKSBtc2cubmFtZSwga2V5KTsKLSAgICBzdHJjcHkoKGNoYXIqKSBtc2cudmFsdWUsIHZhbHVlKTsKLQotICAgIHJldHVybiBzZW5kX3Byb3BfbXNnKCZtc2cpOworICAgIHJldHVybiBfX3N5c3RlbV9wcm9wZXJ0eV9zZXQoa2V5LCB2YWx1ZSk7CiB9CiAKIGludCBwcm9wZXJ0eV9nZXQoY29uc3QgY2hhciAqa2V5LCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqZGVmYXVsdF92YWx1ZSkKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9zdHJfcGFybXMuYyBiL2xpYmN1dGlscy9zdHJfcGFybXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmExZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL3N0cl9wYXJtcy5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJzdHJfcGFyYW1zIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjZGVmaW5lIF9HTlVfU09VUkNFIDEKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvaGFzaG1hcC5oPgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWVtb3J5Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvc3RyX3Bhcm1zLmg+CisKK3N0cnVjdCBzdHJfcGFybXMgeworICAgIEhhc2htYXAgKm1hcDsKK307CisKKworc3RhdGljIGJvb2wgc3RyX2VxKHZvaWQgKmtleV9hLCB2b2lkICprZXlfYikKK3sKKyAgICByZXR1cm4gIXN0cmNtcCgoY29uc3QgY2hhciAqKWtleV9hLCAoY29uc3QgY2hhciAqKWtleV9iKTsKK30KKworLyogdXNlIGRqYiBoYXNoIHVubGVzcyB3ZSBmaW5kIGl0IGluYWRlcXVhdGUgKi8KK3N0YXRpYyBpbnQgc3RyX2hhc2hfZm4odm9pZCAqc3RyKQoreworICAgIHVpbnQzMl90IGhhc2ggPSA1MzgxOworICAgIGNoYXIgKnA7CisKKyAgICBmb3IgKHAgPSBzdHI7IHAgJiYgKnA7IHArKykKKyAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgKnA7CisgICAgcmV0dXJuIChpbnQpaGFzaDsKK30KKworc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zX2NyZWF0ZSh2b2lkKQoreworICAgIHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtczsKKworICAgIHN0cl9wYXJtcyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN0cl9wYXJtcykpOworICAgIGlmICghc3RyX3Bhcm1zKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHN0cl9wYXJtcy0+bWFwID0gaGFzaG1hcENyZWF0ZSg1LCBzdHJfaGFzaF9mbiwgc3RyX2VxKTsKKyAgICBpZiAoIXN0cl9wYXJtcy0+bWFwKQorICAgICAgICBnb3RvIGVycjsKKworICAgIHJldHVybiBzdHJfcGFybXM7CisKK2VycjoKKyAgICBmcmVlKHN0cl9wYXJtcyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIHJlbW92ZV9wYWlyKHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCit7CisgICAgc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zID0gY29udGV4dDsKKworICAgIGhhc2htYXBSZW1vdmUoc3RyX3Bhcm1zLT5tYXAsIGtleSk7CisgICAgZnJlZShrZXkpOworICAgIGZyZWUodmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIHN0cl9wYXJtc19kZXN0cm95KHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcykKK3sKKyAgICBoYXNobWFwRm9yRWFjaChzdHJfcGFybXMtPm1hcCwgcmVtb3ZlX3BhaXIsIHN0cl9wYXJtcyk7CisgICAgaGFzaG1hcEZyZWUoc3RyX3Bhcm1zLT5tYXApOworICAgIGZyZWUoc3RyX3Bhcm1zKTsKK30KKworc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zX2NyZWF0ZV9zdHIoY29uc3QgY2hhciAqX3N0cmluZykKK3sKKyAgICBzdHJ1Y3Qgc3RyX3Bhcm1zICpzdHJfcGFybXM7CisgICAgY2hhciAqc3RyOworICAgIGNoYXIgKmt2cGFpcjsKKyAgICBjaGFyICp0bXBzdHI7CisgICAgaW50IGl0ZW1zID0gMDsKKworICAgIHN0cl9wYXJtcyA9IHN0cl9wYXJtc19jcmVhdGUoKTsKKyAgICBpZiAoIXN0cl9wYXJtcykKKyAgICAgICAgZ290byBlcnJfY3JlYXRlX3N0cl9wYXJtczsKKworICAgIHN0ciA9IHN0cmR1cChfc3RyaW5nKTsKKyAgICBpZiAoIXN0cikKKyAgICAgICAgZ290byBlcnJfc3RyZHVwOworCisgICAgTE9HVigiJXM6IHNvdXJjZSBzdHJpbmcgPT0gJyVzJ1xuIiwgX19mdW5jX18sIF9zdHJpbmcpOworCisgICAga3ZwYWlyID0gc3RydG9rX3Ioc3RyLCAiOyIsICZ0bXBzdHIpOworICAgIHdoaWxlIChrdnBhaXIgJiYgKmt2cGFpcikgeworICAgICAgICBjaGFyICplcSA9IHN0cmNocihrdnBhaXIsICc9Jyk7IC8qIHdvdWxkIGxvdmUgc3RyY2hybnVsICovCisgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICBjaGFyICprZXk7CisgICAgICAgIHZvaWQgKm9sZF92YWw7CisKKyAgICAgICAgaWYgKGVxID09IGt2cGFpcikKKyAgICAgICAgICAgIGdvdG8gbmV4dF9wYWlyOworCisgICAgICAgIGlmIChlcSkgeworICAgICAgICAgICAga2V5ID0gc3RybmR1cChrdnBhaXIsIGVxIC0ga3ZwYWlyKTsKKyAgICAgICAgICAgIGlmICgqKCsrZXEpKQorICAgICAgICAgICAgICAgIHZhbHVlID0gc3RyZHVwKGVxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cmR1cCgiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBrZXkgPSBzdHJkdXAoa3ZwYWlyKTsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyZHVwKCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIHdlIHJlcGxhY2VkIGEgdmFsdWUsIGZyZWUgaXQgKi8KKyAgICAgICAgb2xkX3ZhbCA9IGhhc2htYXBQdXQoc3RyX3Bhcm1zLT5tYXAsIGtleSwgdmFsdWUpOworICAgICAgICBpZiAob2xkX3ZhbCkKKyAgICAgICAgICAgIGZyZWUob2xkX3ZhbCk7CisKKyAgICAgICAgaXRlbXMrKzsKK25leHRfcGFpcjoKKyAgICAgICAga3ZwYWlyID0gc3RydG9rX3IoTlVMTCwgIjsiLCAmdG1wc3RyKTsKKyAgICB9CisKKyAgICBpZiAoIWl0ZW1zKQorICAgICAgICBMT0dWKCIlczogbm8gaXRlbXMgZm91bmQgaW4gc3RyaW5nXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBmcmVlKHN0cik7CisKKyAgICByZXR1cm4gc3RyX3Bhcm1zOworCitlcnJfc3RyZHVwOgorICAgIHN0cl9wYXJtc19kZXN0cm95KHN0cl9wYXJtcyk7CitlcnJfY3JlYXRlX3N0cl9wYXJtczoKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBzdHJfcGFybXNfZGVsKHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcywgY29uc3QgY2hhciAqa2V5KQoreworICAgIGhhc2htYXBSZW1vdmUoc3RyX3Bhcm1zLT5tYXAsICh2b2lkICopa2V5KTsKK30KKworaW50IHN0cl9wYXJtc19hZGRfc3RyKHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcywgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIHZvaWQgKm9sZF92YWw7CisgICAgY2hhciAqdG1wOworCisgICAgdG1wID0gc3RyZHVwKHZhbHVlKTsKKyAgICBvbGRfdmFsID0gaGFzaG1hcFB1dChzdHJfcGFybXMtPm1hcCwgKHZvaWQgKilrZXksIHRtcCk7CisKKyAgICBpZiAob2xkX3ZhbCkgeworICAgICAgICBmcmVlKG9sZF92YWwpOworICAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRU5PTUVNKSB7CisgICAgICAgIGZyZWUodG1wKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgc3RyX3Bhcm1zX2FkZF9pbnQoc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zLCBjb25zdCBjaGFyICprZXksIGludCB2YWx1ZSkKK3sKKyAgICBjaGFyIHZhbF9zdHJbMTJdOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBzbnByaW50Zih2YWxfc3RyLCBzaXplb2YodmFsX3N0ciksICIlZCIsIHZhbHVlKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICByZXQgPSBzdHJfcGFybXNfYWRkX3N0cihzdHJfcGFybXMsIGtleSwgdmFsX3N0cik7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHN0cl9wYXJtc19hZGRfZmxvYXQoc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zLCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSkKK3sKKyAgICBjaGFyIHZhbF9zdHJbMjNdOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBzbnByaW50Zih2YWxfc3RyLCBzaXplb2YodmFsX3N0ciksICIlLjEwZiIsIHZhbHVlKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICByZXQgPSBzdHJfcGFybXNfYWRkX3N0cihzdHJfcGFybXMsIGtleSwgdmFsX3N0cik7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHN0cl9wYXJtc19nZXRfc3RyKHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcywgY29uc3QgY2hhciAqa2V5LCBjaGFyICp2YWwsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICBjaGFyICp2YWx1ZTsKKworICAgIHZhbHVlID0gaGFzaG1hcEdldChzdHJfcGFybXMtPm1hcCwgKHZvaWQgKilrZXkpOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHN0cmxjcHkodmFsLCB2YWx1ZSwgbGVuKTsKKworICAgIHJldHVybiAtRU5PRU5UOworfQorCitpbnQgc3RyX3Bhcm1zX2dldF9pbnQoc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zLCBjb25zdCBjaGFyICprZXksIGludCAqdmFsKQoreworICAgIGNoYXIgKnZhbHVlOworICAgIGNoYXIgKmVuZDsKKworICAgIHZhbHVlID0gaGFzaG1hcEdldChzdHJfcGFybXMtPm1hcCwgKHZvaWQgKilrZXkpOworICAgIGlmICghdmFsdWUpCisgICAgICAgIHJldHVybiAtRU5PRU5UOworCisgICAgKnZhbCA9IChpbnQpc3RydG9sKHZhbHVlLCAmZW5kLCAwKTsKKyAgICBpZiAoKnZhbHVlICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAtRUlOVkFMOworfQorCitpbnQgc3RyX3Bhcm1zX2dldF9mbG9hdChzdHJ1Y3Qgc3RyX3Bhcm1zICpzdHJfcGFybXMsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICp2YWwpCit7CisgICAgZmxvYXQgb3V0OworICAgIGNoYXIgKnZhbHVlOworICAgIGNoYXIgKmVuZDsKKworICAgIHZhbHVlID0gaGFzaG1hcEdldChzdHJfcGFybXMtPm1hcCwgKHZvaWQgKilrZXkpOworICAgIGlmICghdmFsdWUpCisgICAgICAgIHJldHVybiAtRU5PRU5UOworCisgICAgb3V0ID0gc3RydG9mKHZhbHVlLCAmZW5kKTsKKyAgICBpZiAoKnZhbHVlICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgYm9vbCBjb21iaW5lX3N0cmluZ3Modm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwgdm9pZCAqY29udGV4dCkKK3sKKyAgICBjaGFyICoqb2xkX3N0ciA9IGNvbnRleHQ7CisgICAgY2hhciAqbmV3X3N0cjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gYXNwcmludGYoJm5ld19zdHIsICIlcyVzJXM9JXMiLAorICAgICAgICAgICAgICAgICAgICpvbGRfc3RyID8gKm9sZF9zdHIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAqb2xkX3N0ciA/ICI7IiA6ICIiLAorICAgICAgICAgICAgICAgICAgIChjaGFyICopa2V5LAorICAgICAgICAgICAgICAgICAgIChjaGFyICopdmFsdWUpOworICAgIGlmICgqb2xkX3N0cikKKyAgICAgICAgZnJlZSgqb2xkX3N0cik7CisKKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgKm9sZF9zdHIgPSBuZXdfc3RyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAqb2xkX3N0ciA9IE5VTEw7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitjaGFyICpzdHJfcGFybXNfdG9fc3RyKHN0cnVjdCBzdHJfcGFybXMgKnN0cl9wYXJtcykKK3sKKyAgICBjaGFyICpzdHIgPSBOVUxMOworCisgICAgaWYgKGhhc2htYXBTaXplKHN0cl9wYXJtcy0+bWFwKSA+IDApCisgICAgICAgIGhhc2htYXBGb3JFYWNoKHN0cl9wYXJtcy0+bWFwLCBjb21iaW5lX3N0cmluZ3MsICZzdHIpOworICAgIGVsc2UKKyAgICAgICAgc3RyID0gc3RyZHVwKCIiKTsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgYm9vbCBkdW1wX2VudHJ5KHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCit7CisgICAgTE9HSSgia2V5OiAnJXMnIHZhbHVlOiAnJXMnXG4iLCAoY2hhciAqKWtleSwgKGNoYXIgKil2YWx1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgc3RyX3Bhcm1zX2R1bXAoc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zKQoreworICAgIGhhc2htYXBGb3JFYWNoKHN0cl9wYXJtcy0+bWFwLCBkdW1wX2VudHJ5LCBzdHJfcGFybXMpOworfQorCisjaWZkZWYgVEVTVF9TVFJfUEFSTVMKK3N0YXRpYyB2b2lkIHRlc3Rfc3RyX3Bhcm1zX3N0cihjb25zdCBjaGFyICpzdHIpCit7CisgICAgc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zOworICAgIGNoYXIgKm91dF9zdHI7CisgICAgaW50IHJldDsKKworICAgIHN0cl9wYXJtcyA9IHN0cl9wYXJtc19jcmVhdGVfc3RyKHN0cik7CisgICAgc3RyX3Bhcm1zX2R1bXAoc3RyX3Bhcm1zKTsKKyAgICBvdXRfc3RyID0gc3RyX3Bhcm1zX3RvX3N0cihzdHJfcGFybXMpOworICAgIHN0cl9wYXJtc19kZXN0cm95KHN0cl9wYXJtcyk7CisgICAgTE9HSSgiJXM6ICclcycgc3RyaW5naWZpZWQgaXMgJyVzJyIsIF9fZnVuY19fLCBzdHIsIG91dF9zdHIpOworICAgIGZyZWUob3V0X3N0cik7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgc3RydWN0IHN0cl9wYXJtcyAqc3RyX3Bhcm1zOworCisgICAgdGVzdF9zdHJfcGFybXNfc3RyKCIiKTsKKyAgICB0ZXN0X3N0cl9wYXJtc19zdHIoIjsiKTsKKyAgICB0ZXN0X3N0cl9wYXJtc19zdHIoIj0iKTsKKyAgICB0ZXN0X3N0cl9wYXJtc19zdHIoIj07Iik7CisgICAgdGVzdF9zdHJfcGFybXNfc3RyKCI9YmFyIik7CisgICAgdGVzdF9zdHJfcGFybXNfc3RyKCI9YmFyOyIpOworICAgIHRlc3Rfc3RyX3Bhcm1zX3N0cigiZm9vPSIpOworICAgIHRlc3Rfc3RyX3Bhcm1zX3N0cigiZm9vPTsiKTsKKyAgICB0ZXN0X3N0cl9wYXJtc19zdHIoImZvbz1iYXIiKTsKKyAgICB0ZXN0X3N0cl9wYXJtc19zdHIoImZvbz1iYXI7Iik7CisgICAgdGVzdF9zdHJfcGFybXNfc3RyKCJmb289YmFyO2JheiIpOworICAgIHRlc3Rfc3RyX3Bhcm1zX3N0cigiZm9vPWJhcjtiYXo9Iik7CisgICAgdGVzdF9zdHJfcGFybXNfc3RyKCJmb289YmFyO2Jhej1iYXQiKTsKKyAgICB0ZXN0X3N0cl9wYXJtc19zdHIoImZvbz1iYXI7YmF6PWJhdDsiKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvdWV2ZW50LmMgYi9saWJjdXRpbHMvdWV2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzM2MwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmN1dGlscy91ZXZlbnQuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy91ZXZlbnQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisvKioKKyAqIExpa2UgcmVjdigpLCBidXQgY2hlY2tzIHRoYXQgbWVzc2FnZXMgYWN0dWFsbHkgb3JpZ2luYXRlIGZyb20gdGhlIGtlcm5lbC4KKyAqLworc3NpemVfdCB1ZXZlbnRfY2hlY2tlZF9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICAgIHN0cnVjdCBpb3ZlYyBpb3YgPSB7IGJ1ZmZlciwgbGVuZ3RoIH07CisgICAgc3RydWN0IHNvY2thZGRyX25sIGFkZHI7CisgICAgY2hhciBjb250cm9sW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB1Y3JlZCkpXTsKKyAgICBzdHJ1Y3QgbXNnaGRyIGhkciA9IHsKKyAgICAgICAgJmFkZHIsCisgICAgICAgIHNpemVvZihhZGRyKSwKKyAgICAgICAgJmlvdiwKKyAgICAgICAgMSwKKyAgICAgICAgY29udHJvbCwKKyAgICAgICAgc2l6ZW9mKGNvbnRyb2wpLAorICAgICAgICAwLAorICAgIH07CisKKyAgICBzc2l6ZV90IG4gPSByZWN2bXNnKHNvY2tldCwgJmhkciwgMCk7CisgICAgaWYgKG4gPD0gMCkgeworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBpZiAoYWRkci5ubF9ncm91cHMgPT0gMCB8fCBhZGRyLm5sX3BpZCAhPSAwKSB7CisgICAgICAgIC8qIGlnbm9yaW5nIG5vbi1rZXJuZWwgb3IgdW5pY2FzdCBuZXRsaW5rIG1lc3NhZ2UgKi8KKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc3RydWN0IGNtc2doZHIgKmNtc2cgPSBDTVNHX0ZJUlNUSERSKCZoZHIpOworICAgIGlmIChjbXNnID09IE5VTEwgfHwgY21zZy0+Y21zZ190eXBlICE9IFNDTV9DUkVERU5USUFMUykgeworICAgICAgICAvKiBpZ25vcmluZyBuZXRsaW5rIG1lc3NhZ2Ugd2l0aCBubyBzZW5kZXIgY3JlZGVudGlhbHMgKi8KKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc3RydWN0IHVjcmVkICpjcmVkID0gKHN0cnVjdCB1Y3JlZCAqKUNNU0dfREFUQShjbXNnKTsKKyAgICBpZiAoY3JlZC0+dWlkICE9IDApIHsKKyAgICAgICAgLyogaWdub3JpbmcgbmV0bGluayBtZXNzYWdlIGZyb20gbm9uLXJvb3QgdXNlciAqLworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKKworb3V0OgorICAgIC8qIGNsZWFyIHJlc2lkdWFsIHBvdGVudGlhbGx5IG1hbGljaW91cyBkYXRhICovCisgICAgYnplcm8oYnVmZmVyLCBsZW5ndGgpOworICAgIGVycm5vID0gRUlPOworICAgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2xpYmRpc2tjb25maWcvQW5kcm9pZC5tayBiL2xpYmRpc2tjb25maWcvQW5kcm9pZC5tawppbmRleCAxZDBlY2I0Li5jODg3OTU1IDEwMDY0NAotLS0gYS9saWJkaXNrY29uZmlnL0FuZHJvaWQubWsKKysrIGIvbGliZGlza2NvbmZpZy9BbmRyb2lkLm1rCkBAIC0zLDE3ICszLDI1IEBACiAKIGlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCiAKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAorY29tbW9uU291cmNlcyA6PSBcCiAJZGlza2NvbmZpZy5jIFwKIAlkaXNrdXRpbHMuYyBcCiAJd3JpdGVfbHN0LmMgXAogCWNvbmZpZ19tYnIuYwogCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNvbW1vblNvdXJjZXMpCiBMT0NBTF9NT0RVTEUgOj0gbGliZGlza2NvbmZpZwogTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmxvZyBsaWJjCi0KIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAoraWZlcSAoJChIT1NUX09TKSxsaW51eCkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY29tbW9uU291cmNlcykKK0xPQ0FMX01PRFVMRSA6PSBsaWJkaXNrY29uZmlnX2hvc3QKK0xPQ0FMX1NZU1RFTV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscworTE9DQUxfQ0ZMQUdTIDo9IC1PMiAtZyAtVyAtV2FsbCAtV2Vycm9yIC1EX0xBUkdFRklMRTY0X1NPVVJDRQoraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCitlbmRpZiAjIEhPU1RfT1MgPT0gbGludXgKKwogZW5kaWYgICMgISBUQVJHRVRfU0lNVUxBVE9SCmRpZmYgLS1naXQgYS9saWJsb2cvbG9nZF93cml0ZS5jIGIvbGlibG9nL2xvZ2Rfd3JpdGUuYwppbmRleCA5OTIzYmJhLi5hMGE3NTNiIDEwMDY0NAotLS0gYS9saWJsb2cvbG9nZF93cml0ZS5jCisrKyBiL2xpYmxvZy9sb2dkX3dyaXRlLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqIHRoZSBzaW11bGF0b3IgcmF0aGVyIHRoYW4gYSBkZXNrdG9wIHRvb2wgYW5kIHdhbnQgdG8gdXNlIHRoZSBkZXZpY2UuCiAgKi8KIHN0YXRpYyBlbnVtIHsKLSAgICBrTG9nVW5pbml0aWFsaXplZCwga0xvZ05vdEF2YWlsYWJsZSwga0xvZ0F2YWlsYWJsZSAKKyAgICBrTG9nVW5pbml0aWFsaXplZCwga0xvZ05vdEF2YWlsYWJsZSwga0xvZ0F2YWlsYWJsZQogfSBnX2xvZ19zdGF0dXMgPSBrTG9nVW5pbml0aWFsaXplZDsKIGludCBfX2FuZHJvaWRfbG9nX2Rldl9hdmFpbGFibGUodm9pZCkKIHsKQEAgLTE4OSw3ICsxODksNyBAQAogCiBpbnQgX19hbmRyb2lkX2xvZ192cHJpbnQoaW50IHByaW8sIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQogewotICAgIGNoYXIgYnVmW0xPR19CVUZfU0laRV07ICAgIAorICAgIGNoYXIgYnVmW0xPR19CVUZfU0laRV07CiAKICAgICB2c25wcmludGYoYnVmLCBMT0dfQlVGX1NJWkUsIGZtdCwgYXApOwogCkBAIC0yMjMsMTIgKzIyMywyMyBAQAogdm9pZCBfX2FuZHJvaWRfbG9nX2Fzc2VydChjb25zdCBjaGFyICpjb25kLCBjb25zdCBjaGFyICp0YWcsCiAJCQkgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewotICAgIHZhX2xpc3QgYXA7Ci0gICAgY2hhciBidWZbTE9HX0JVRl9TSVpFXTsgICAgCisgICAgY2hhciBidWZbTE9HX0JVRl9TSVpFXTsKIAotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZzbnByaW50ZihidWYsIExPR19CVUZfU0laRSwgZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKKyAgICBpZiAoZm10KSB7CisgICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgICAgICB2c25wcmludGYoYnVmLCBMT0dfQlVGX1NJWkUsIGZtdCwgYXApOworICAgICAgICB2YV9lbmQoYXApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE1zZyBub3QgcHJvdmlkZWQsIGxvZyBjb25kaXRpb24uICBOLkIuIERvIG5vdCB1c2UgY29uZCBkaXJlY3RseSBhcworICAgICAgICAgKiBmb3JtYXQgc3RyaW5nIGFzIGl0IGNvdWxkIGNvbnRhaW4gc3B1cmlvdXMgJyUnIHN5bnRheCAoZS5nLgorICAgICAgICAgKiAiJWQiIGluICJibG9ja3MlZGV2cyA9PSAwIikuCisgICAgICAgICAqLworICAgICAgICBpZiAoY29uZCkKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgTE9HX0JVRl9TSVpFLCAiQXNzZXJ0aW9uIGZhaWxlZDogJXMiLCBjb25kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgIlVuc3BlY2lmaWVkIGFzc2VydGlvbiBmYWlsZWQiKTsKKyAgICB9CiAKICAgICBfX2FuZHJvaWRfbG9nX3dyaXRlKEFORFJPSURfTE9HX0ZBVEFMLCB0YWcsIGJ1Zik7CiAKZGlmZiAtLWdpdCBhL2xpYm5ldHV0aWxzL2RoY3BfdXRpbHMuYyBiL2xpYm5ldHV0aWxzL2RoY3BfdXRpbHMuYwppbmRleCBkYzcxYmFiLi41OTkxZWE4IDEwMDY0NAotLS0gYS9saWJuZXR1dGlscy9kaGNwX3V0aWxzLmMKKysrIGIvbGlibmV0dXRpbHMvZGhjcF91dGlscy5jCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KQEAgLTI4LDkgKzI5LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyIERBRU1PTl9QUk9QX05BTUVbXSAgID0gImluaXQuc3ZjLmRoY3BjZCI7CiBzdGF0aWMgY29uc3QgY2hhciBIT1NUTkFNRV9QUk9QX05BTUVbXSA9ICJuZXQuaG9zdG5hbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgREhDUF9QUk9QX05BTUVfUFJFRklYW10gID0gImRoY3AiOwotc3RhdGljIGNvbnN0IGNoYXIgREFFTU9OX05BTUVfUkVORVdbXSAgPSAiaXByZW5ldyI7Ci1zdGF0aWMgY29uc3QgaW50ICBOQVBfVElNRSA9IDE7ICAgLyogd2FpdCBmb3IgMSBzZWNvbmQgYXQgYSB0aW1lICovCitzdGF0aWMgY29uc3QgaW50IE5BUF9USU1FID0gMjAwOyAgIC8qIHdhaXQgZm9yIDIwMG1zIGF0IGEgdGltZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gcG9sbGluZyBmb3IgcHJvcGVydHkgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciBEQUVNT05fTkFNRV9SRU5FV1tdICA9ICJpcHJlbmV3IjsKIHN0YXRpYyBjaGFyIGVycm1zZ1sxMDBdOwogCiAvKgpAQCAtNDIsMTQgKzQzLDE0IEBACiBzdGF0aWMgaW50IHdhaXRfZm9yX3Byb3BlcnR5KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlc2lyZWRfdmFsdWUsIGludCBtYXh3YWl0KQogewogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHsnXDAnfTsKLSAgICBpbnQgbWF4bmFwcyA9IG1heHdhaXQgLyBOQVBfVElNRTsKKyAgICBpbnQgbWF4bmFwcyA9IChtYXh3YWl0ICogMTAwMCkgLyBOQVBfVElNRTsKIAogICAgIGlmIChtYXhuYXBzIDwgMSkgewogICAgICAgICBtYXhuYXBzID0gMTsKICAgICB9CiAKICAgICB3aGlsZSAobWF4bmFwcy0tID4gMCkgewotICAgICAgICB1c2xlZXAoMTAwMDAwMCk7CisgICAgICAgIHVzbGVlcChOQVBfVElNRSAqIDEwMDApOwogICAgICAgICBpZiAocHJvcGVydHlfZ2V0KG5hbWUsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICAgICAgaWYgKGRlc2lyZWRfdmFsdWUgPT0gTlVMTCB8fCAKICAgICAgICAgICAgICAgICAgICAgc3RyY21wKHZhbHVlLCBkZXNpcmVkX3ZhbHVlKSA9PSAwKSB7CkBAIC02MCw2MCArNjEsNzQgQEAKICAgICByZXR1cm4gLTE7IC8qIGZhaWx1cmUgKi8KIH0KIAotc3RhdGljIHZvaWQgZmlsbF9pcF9pbmZvKGNvbnN0IGNoYXIgKmludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqaXBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpnYXRld2F5LAotICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICptYXNrLAotICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpkbnMxLAotICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpkbnMyLAotICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpzZXJ2ZXIsCitzdGF0aWMgaW50IGZpbGxfaXBfaW5mbyhjb25zdCBjaGFyICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICppcGFkZHIsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICpnYXRld2F5LAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnByZWZpeExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRuczEsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICpkbnMyLAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqc2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICpsZWFzZSkKIHsKICAgICBjaGFyIHByb3BfbmFtZVtQUk9QRVJUWV9LRVlfTUFYXTsKICAgICBjaGFyIHByb3BfdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOwotICAgIGluX2FkZHJfdCBpYWRkcjsKIAogICAgIHNucHJpbnRmKHByb3BfbmFtZSwgc2l6ZW9mKHByb3BfbmFtZSksICIlcy4lcy5pcGFkZHJlc3MiLCBESENQX1BST1BfTkFNRV9QUkVGSVgsIGludGVyZmFjZSk7Ci0gICAgaWYgKHByb3BlcnR5X2dldChwcm9wX25hbWUsIHByb3BfdmFsdWUsIE5VTEwpICYmIGluZXRfYXRvbihwcm9wX3ZhbHVlLCAmYWRkcikpIHsKLSAgICAgICAgKmlwYWRkciA9IGFkZHIuc19hZGRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICppcGFkZHIgPSAwOwotICAgIH0KKyAgICBwcm9wZXJ0eV9nZXQocHJvcF9uYW1lLCBpcGFkZHIsIE5VTEwpOworCiAgICAgc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzLiVzLmdhdGV3YXkiLCBESENQX1BST1BfTkFNRV9QUkVGSVgsIGludGVyZmFjZSk7Ci0gICAgaWYgKHByb3BlcnR5X2dldChwcm9wX25hbWUsIHByb3BfdmFsdWUsIE5VTEwpICYmIGluZXRfYXRvbihwcm9wX3ZhbHVlLCAmYWRkcikpIHsKLSAgICAgICAgKmdhdGV3YXkgPSBhZGRyLnNfYWRkcjsKLSAgICB9IGVsc2UgewotICAgICAgICAqZ2F0ZXdheSA9IDA7CisgICAgcHJvcGVydHlfZ2V0KHByb3BfbmFtZSwgZ2F0ZXdheSwgTlVMTCk7CisKKyAgICBzbnByaW50Zihwcm9wX25hbWUsIHNpemVvZihwcm9wX25hbWUpLCAiJXMuJXMuc2VydmVyIiwgREhDUF9QUk9QX05BTUVfUFJFRklYLCBpbnRlcmZhY2UpOworICAgIHByb3BlcnR5X2dldChwcm9wX25hbWUsIHNlcnZlciwgTlVMTCk7CisKKyAgICAvL1RPRE86IEhhbmRsZSBJUHY2IHdoZW4gd2UgY2hhbmdlIHN5c3RlbSBwcm9wZXJ0eSB1c2FnZQorICAgIGlmIChzdHJjbXAoZ2F0ZXdheSwgIjAuMC4wLjAiKSA9PSAwKSB7CisgICAgICAgIC8vREhDUCBzZXJ2ZXIgaXMgb3VyIGJlc3QgYmV0IGFzIGdhdGV3YXkKKyAgICAgICAgc3RybmNweShnYXRld2F5LCBzZXJ2ZXIsIFBST1BFUlRZX1ZBTFVFX01BWCk7CiAgICAgfQorCiAgICAgc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzLiVzLm1hc2siLCBESENQX1BST1BfTkFNRV9QUkVGSVgsIGludGVyZmFjZSk7Ci0gICAgaWYgKHByb3BlcnR5X2dldChwcm9wX25hbWUsIHByb3BfdmFsdWUsIE5VTEwpICYmIGluZXRfYXRvbihwcm9wX3ZhbHVlLCAmYWRkcikpIHsKLSAgICAgICAgKm1hc2sgPSBhZGRyLnNfYWRkcjsKLSAgICB9IGVsc2UgewotICAgICAgICAqbWFzayA9IDA7CisgICAgaWYgKHByb3BlcnR5X2dldChwcm9wX25hbWUsIHByb3BfdmFsdWUsIE5VTEwpKSB7CisgICAgICAgIGludCBwOworICAgICAgICAvLyB0aGlzIGNvbnZlcnNpb24gaXMgdjQgb25seSwgYnV0IHRoaXMgZGhjcCBjbGllbnQgaXMgdjQgb25seSBhbnl3YXkKKyAgICAgICAgaW5fYWRkcl90IG1hc2sgPSBudG9obChpbmV0X2FkZHIocHJvcF92YWx1ZSkpOworICAgICAgICAvLyBDaGVjayBuZXRtYXNrIGlzIGEgdmFsaWQgSVAgYWRkcmVzcy4gIG50b2hsIGdpdmVzIE5PTkUgcmVzcG9uc2UgKGFsbCAxJ3MpIGZvcgorICAgICAgICAvLyBub24gMjU1LjI1NS4yNTUuMjU1IGlucHV0cy4gIGlmIHdlIGdldCB0aGF0IHZhbHVlIGNoZWNrIGlmIGl0IGlzIGxlZ2l0Li4KKyAgICAgICAgaWYgKG1hc2sgPT0gSU5BRERSX05PTkUgJiYgc3RyY21wKHByb3BfdmFsdWUsICIyNTUuMjU1LjI1NS4yNTUiKSAhPSAwKSB7CisgICAgICAgICAgICBzbnByaW50ZihlcnJtc2csIHNpemVvZihlcnJtc2cpLCAiREhDUCBnYXZlIGludmFsaWQgbmV0IG1hc2sgJXMiLCBwcm9wX3ZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHAgPSAwOyBwIDwgMzI7IHArKykgeworICAgICAgICAgICAgaWYgKG1hc2sgPT0gMCkgYnJlYWs7CisgICAgICAgICAgICAvLyBjaGVjayBmb3Igbm9uLWNvbnRpZ3VvdXMgbmV0bWFzaywgZS5nLiwgMjU1LjI1NC4yNTUuMAorICAgICAgICAgICAgaWYgKChtYXNrICYgMHg4MDAwMDAwMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGVycm1zZywgc2l6ZW9mKGVycm1zZyksICJESENQIGdhdmUgaW52YWxpZCBuZXQgbWFzayAlcyIsIHByb3BfdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hc2sgPSBtYXNrIDw8IDE7CisgICAgICAgIH0KKyAgICAgICAgKnByZWZpeExlbmd0aCA9IHA7CiAgICAgfQogICAgIHNucHJpbnRmKHByb3BfbmFtZSwgc2l6ZW9mKHByb3BfbmFtZSksICIlcy4lcy5kbnMxIiwgREhDUF9QUk9QX05BTUVfUFJFRklYLCBpbnRlcmZhY2UpOwotICAgIGlmIChwcm9wZXJ0eV9nZXQocHJvcF9uYW1lLCBwcm9wX3ZhbHVlLCBOVUxMKSAmJiBpbmV0X2F0b24ocHJvcF92YWx1ZSwgJmFkZHIpKSB7Ci0gICAgICAgICpkbnMxID0gYWRkci5zX2FkZHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmRuczEgPSAwOwotICAgIH0KKyAgICBwcm9wZXJ0eV9nZXQocHJvcF9uYW1lLCBkbnMxLCBOVUxMKTsKKwogICAgIHNucHJpbnRmKHByb3BfbmFtZSwgc2l6ZW9mKHByb3BfbmFtZSksICIlcy4lcy5kbnMyIiwgREhDUF9QUk9QX05BTUVfUFJFRklYLCBpbnRlcmZhY2UpOwotICAgIGlmIChwcm9wZXJ0eV9nZXQocHJvcF9uYW1lLCBwcm9wX3ZhbHVlLCBOVUxMKSAmJiBpbmV0X2F0b24ocHJvcF92YWx1ZSwgJmFkZHIpKSB7Ci0gICAgICAgICpkbnMyID0gYWRkci5zX2FkZHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmRuczIgPSAwOwotICAgIH0KLSAgICBzbnByaW50Zihwcm9wX25hbWUsIHNpemVvZihwcm9wX25hbWUpLCAiJXMuJXMuc2VydmVyIiwgREhDUF9QUk9QX05BTUVfUFJFRklYLCBpbnRlcmZhY2UpOwotICAgIGlmIChwcm9wZXJ0eV9nZXQocHJvcF9uYW1lLCBwcm9wX3ZhbHVlLCBOVUxMKSAmJiBpbmV0X2F0b24ocHJvcF92YWx1ZSwgJmFkZHIpKSB7Ci0gICAgICAgICpzZXJ2ZXIgPSBhZGRyLnNfYWRkcjsKLSAgICB9IGVsc2UgewotICAgICAgICAqc2VydmVyID0gMDsKLSAgICB9CisgICAgcHJvcGVydHlfZ2V0KHByb3BfbmFtZSwgZG5zMiwgTlVMTCk7CisKICAgICBzbnByaW50Zihwcm9wX25hbWUsIHNpemVvZihwcm9wX25hbWUpLCAiJXMuJXMubGVhc2V0aW1lIiwgREhDUF9QUk9QX05BTUVfUFJFRklYLCBpbnRlcmZhY2UpOwogICAgIGlmIChwcm9wZXJ0eV9nZXQocHJvcF9uYW1lLCBwcm9wX3ZhbHVlLCBOVUxMKSkgewogICAgICAgICAqbGVhc2UgPSBhdG9sKHByb3BfdmFsdWUpOwogICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWRkcl90b19zdHJpbmcoaW5fYWRkcl90IGFkZHIpCit7CisgICAgc3RydWN0IGluX2FkZHIgaW5fYWRkcjsKKworICAgIGluX2FkZHIuc19hZGRyID0gYWRkcjsKKyAgICByZXR1cm4gaW5ldF9udG9hKGluX2FkZHIpOwogfQogCiAvKgpAQCAtMTIxLDEyICsxMzYsMTIgQEAKICAqIGNvbmZpZ3VyaW5nIHRoZSBpbnRlcmZhY2UuCiAgKi8KIGludCBkaGNwX2RvX3JlcXVlc3QoY29uc3QgY2hhciAqaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmlwYWRkciwKLSAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpnYXRld2F5LAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKm1hc2ssCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZG5zMSwKLSAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpkbnMyLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqaXBhZGRyLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpnYXRld2F5LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcHJlZml4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpkbnMxLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpkbnMyLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqbGVhc2UpCiB7CiAgICAgY2hhciByZXN1bHRfcHJvcF9uYW1lW1BST1BFUlRZX0tFWV9NQVhdOwpAQCAtMTcyLDcgKzE4NywxOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmIChzdHJjbXAocHJvcF92YWx1ZSwgIm9rIikgPT0gMCkgewotICAgICAgICBmaWxsX2lwX2luZm8oaW50ZXJmYWNlLCBpcGFkZHIsIGdhdGV3YXksIG1hc2ssIGRuczEsIGRuczIsIHNlcnZlciwgbGVhc2UpOworICAgICAgICBjaGFyIGRuc19wcm9wX25hbWVbUFJPUEVSVFlfS0VZX01BWF07CisgICAgICAgIGlmIChmaWxsX2lwX2luZm8oaW50ZXJmYWNlLCBpcGFkZHIsIGdhdGV3YXksIHByZWZpeExlbmd0aCwgZG5zMSwgZG5zMiwgc2VydmVyLCBsZWFzZSkKKyAgICAgICAgICAgICAgICA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogY29weSBkbnMgZGF0YSB0byBzeXN0ZW0gcHJvcGVydGllcyAtIFRPRE8gLSByZW1vdmUgdGhpcyBhZnRlciB3ZSBoYXZlIGFzeW5jCisgICAgICAgICAqIG5vdGlmaWNhdGlvbiBvZiByZW5ld2FsJ3MgKi8KKyAgICAgICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczEiLCBpbnRlcmZhY2UpOworICAgICAgICBwcm9wZXJ0eV9zZXQoZG5zX3Byb3BfbmFtZSwgKmRuczEgPyBpcGFkZHJfdG9fc3RyaW5nKCpkbnMxKSA6ICIiKTsKKyAgICAgICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczIiLCBpbnRlcmZhY2UpOworICAgICAgICBwcm9wZXJ0eV9zZXQoZG5zX3Byb3BfbmFtZSwgKmRuczIgPyBpcGFkZHJfdG9fc3RyaW5nKCpkbnMyKSA6ICIiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc25wcmludGYoZXJybXNnLCBzaXplb2YoZXJybXNnKSwgIkRIQ1AgcmVzdWx0IHdhcyAlcyIsIHByb3BfdmFsdWUpOwpAQCAtMjg2LDQgKzMxMiw0IEBACiAgICAgICAgIHNucHJpbnRmKGVycm1zZywgc2l6ZW9mKGVycm1zZyksICJESENQIFJlbmV3IHJlc3VsdCB3YXMgJXMiLCBwcm9wX3ZhbHVlKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWJuZXR1dGlscy9kaGNwY2xpZW50LmMgYi9saWJuZXR1dGlscy9kaGNwY2xpZW50LmMKaW5kZXggNjc1NWJhMS4uNTAzOWUyNiAxMDA2NDQKLS0tIGEvbGlibmV0dXRpbHMvZGhjcGNsaWVudC5jCisrKyBiL2xpYm5ldHV0aWxzL2RoY3BjbGllbnQuYwpAQCAtMzYsOCArMzYsOCBAQAogCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAKKyNpbmNsdWRlIDxuZXR1dGlscy9pZmMuaD4KICNpbmNsdWRlICJkaGNwbXNnLmgiCi0jaW5jbHVkZSAiaWZjX3V0aWxzLmgiCiAjaW5jbHVkZSAicGFja2V0LmgiCiAKICNkZWZpbmUgVkVSQk9TRSAyCkBAIC04NSwxOCArODUsMTYgQEAKIC8vICAgIGV4aXQoMSk7CiB9CiAKLWNvbnN0IGNoYXIgKmlwYWRkcih1aW50MzJfdCBhZGRyKQorY29uc3QgY2hhciAqaXBhZGRyKGluX2FkZHJfdCBhZGRyKQogewotICAgIHN0YXRpYyBjaGFyIGJ1ZlszMl07CisgICAgc3RydWN0IGluX2FkZHIgaW5fYWRkcjsKIAotICAgIHNwcmludGYoYnVmLCIlZC4lZC4lZC4lZCIsCi0gICAgICAgICAgICBhZGRyICYgMjU1LAotICAgICAgICAgICAgKChhZGRyID4+IDgpICYgMjU1KSwKLSAgICAgICAgICAgICgoYWRkciA+PiAxNikgJiAyNTUpLAotICAgICAgICAgICAgKGFkZHIgPj4gMjQpKTsKLSAgICByZXR1cm4gYnVmOworICAgIGluX2FkZHIuc19hZGRyID0gYWRkcjsKKyAgICByZXR1cm4gaW5ldF9udG9hKGluX2FkZHIpOwogfQogCitleHRlcm4gaW50IGlwdjROZXRtYXNrVG9QcmVmaXhMZW5ndGgoaW5fYWRkcl90IG1hc2spOworCiB0eXBlZGVmIHN0cnVjdCBkaGNwX2luZm8gZGhjcF9pbmZvOwogCiBzdHJ1Y3QgZGhjcF9pbmZvIHsKQEAgLTEwNCw3ICsxMDIsNyBAQAogCiAgICAgdWludDMyX3QgaXBhZGRyOwogICAgIHVpbnQzMl90IGdhdGV3YXk7Ci0gICAgdWludDMyX3QgbmV0bWFzazsKKyAgICB1aW50MzJfdCBwcmVmaXhMZW5ndGg7CiAKICAgICB1aW50MzJfdCBkbnMxOwogICAgIHVpbnQzMl90IGRuczI7CkBAIC0xMTUsNDQgKzExMywyNCBAQAogCiBkaGNwX2luZm8gbGFzdF9nb29kX2luZm87CiAKLXZvaWQgZ2V0X2RoY3BfaW5mbyh1aW50MzJfdCAqaXBhZGRyLCB1aW50MzJfdCAqZ2F0ZXdheSwgdWludDMyX3QgKm1hc2ssCit2b2lkIGdldF9kaGNwX2luZm8odWludDMyX3QgKmlwYWRkciwgdWludDMyX3QgKmdhdGV3YXksIHVpbnQzMl90ICpwcmVmaXhMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRuczEsIHVpbnQzMl90ICpkbnMyLCB1aW50MzJfdCAqc2VydmVyLAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsZWFzZSkKIHsKICAgICAqaXBhZGRyID0gbGFzdF9nb29kX2luZm8uaXBhZGRyOwogICAgICpnYXRld2F5ID0gbGFzdF9nb29kX2luZm8uZ2F0ZXdheTsKLSAgICAqbWFzayA9IGxhc3RfZ29vZF9pbmZvLm5ldG1hc2s7CisgICAgKnByZWZpeExlbmd0aCA9IGxhc3RfZ29vZF9pbmZvLnByZWZpeExlbmd0aDsKICAgICAqZG5zMSA9IGxhc3RfZ29vZF9pbmZvLmRuczE7CiAgICAgKmRuczIgPSBsYXN0X2dvb2RfaW5mby5kbnMyOwogICAgICpzZXJ2ZXIgPSBsYXN0X2dvb2RfaW5mby5zZXJ2ZXJhZGRyOwogICAgICpsZWFzZSA9IGxhc3RfZ29vZF9pbmZvLmxlYXNlOwogfQogCi1zdGF0aWMgaW50IGlmY19jb25maWd1cmUoY29uc3QgY2hhciAqaWZuYW1lLCBkaGNwX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGRoY3BfY29uZmlndXJlKGNvbnN0IGNoYXIgKmlmbmFtZSwgZGhjcF9pbmZvICppbmZvKQogewotICAgIGNoYXIgZG5zX3Byb3BfbmFtZVtQUk9QRVJUWV9LRVlfTUFYXTsKLQotICAgIGlmIChpZmNfc2V0X2FkZHIoaWZuYW1lLCBpbmZvLT5pcGFkZHIpKSB7Ci0gICAgICAgIHByaW50ZXJyKCJmYWlsZWQgdG8gc2V0IGlwYWRkciAlczogJXNcbiIsIGlwYWRkcihpbmZvLT5pcGFkZHIpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChpZmNfc2V0X21hc2soaWZuYW1lLCBpbmZvLT5uZXRtYXNrKSkgewotICAgICAgICBwcmludGVycigiZmFpbGVkIHRvIHNldCBuZXRtYXNrICVzOiAlc1xuIiwgaXBhZGRyKGluZm8tPm5ldG1hc2spLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChpZmNfY3JlYXRlX2RlZmF1bHRfcm91dGUoaWZuYW1lLCBpbmZvLT5nYXRld2F5KSkgewotICAgICAgICBwcmludGVycigiZmFpbGVkIHRvIHNldCBkZWZhdWx0IHJvdXRlICVzOiAlc1xuIiwgaXBhZGRyKGluZm8tPmdhdGV3YXkpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczEiLCBpZm5hbWUpOwotICAgIHByb3BlcnR5X3NldChkbnNfcHJvcF9uYW1lLCBpbmZvLT5kbnMxID8gaXBhZGRyKGluZm8tPmRuczEpIDogIiIpOwotICAgIHNucHJpbnRmKGRuc19wcm9wX25hbWUsIHNpemVvZihkbnNfcHJvcF9uYW1lKSwgIm5ldC4lcy5kbnMyIiwgaWZuYW1lKTsKLSAgICBwcm9wZXJ0eV9zZXQoZG5zX3Byb3BfbmFtZSwgaW5mby0+ZG5zMiA/IGlwYWRkcihpbmZvLT5kbnMyKSA6ICIiKTsKLQogICAgIGxhc3RfZ29vZF9pbmZvID0gKmluZm87Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gaWZjX2NvbmZpZ3VyZShpZm5hbWUsIGluZm8tPmlwYWRkciwgaW5mby0+cHJlZml4TGVuZ3RoLCBpbmZvLT5nYXRld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmRuczEsIGluZm8tPmRuczIpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqZGhjcF90eXBlX3RvX25hbWUodWludDMyX3QgdHlwZSkKQEAgLTE3Nyw4ICsxNTUsNyBAQAogICAgICAgICAgICAgZGhjcF90eXBlX3RvX25hbWUoaW5mby0+dHlwZSksIGluZm8tPnR5cGUpOwogICAgIHN0cmNweShhZGRyLCBpcGFkZHIoaW5mby0+aXBhZGRyKSk7CiAgICAgc3RyY3B5KGd3YXksIGlwYWRkcihpbmZvLT5nYXRld2F5KSk7Ci0gICAgc3RyY3B5KG1hc2ssIGlwYWRkcihpbmZvLT5uZXRtYXNrKSk7Ci0gICAgTE9HRCgiaXAgJXMgZ3cgJXMgbWFzayAlcyIsIGFkZHIsIGd3YXksIG1hc2spOworICAgIExPR0QoImlwICVzIGd3ICVzIHByZWZpeExlbmd0aCAlZCIsIGFkZHIsIGd3YXksIGluZm8tPnByZWZpeExlbmd0aCk7CiAgICAgaWYgKGluZm8tPmRuczEpIExPR0QoImRuczE6ICVzIiwgaXBhZGRyKGluZm8tPmRuczEpKTsKICAgICBpZiAoaW5mby0+ZG5zMikgTE9HRCgiZG5zMjogJXMiLCBpcGFkZHIoaW5mby0+ZG5zMikpOwogICAgIExPR0QoInNlcnZlciAlcywgbGVhc2UgJWQgc2Vjb25kcyIsCkBAIC0yMjAsNyArMTk3LDcgQEAKICAgICAgICAgfQogICAgICAgICBzd2l0Y2gob3B0KSB7CiAgICAgICAgIGNhc2UgT1BUX1NVQk5FVF9NQVNLOgotICAgICAgICAgICAgaWYgKG9wdGxlbiA+PSA0KSBtZW1jcHkoJmluZm8tPm5ldG1hc2ssIHgsIDQpOworICAgICAgICAgICAgaWYgKG9wdGxlbiA+PSA0KSBpbmZvLT5wcmVmaXhMZW5ndGggPSBpcHY0TmV0bWFza1RvUHJlZml4TGVuZ3RoKChpbnQpeCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBPUFRfR0FURVdBWToKICAgICAgICAgICAgIGlmIChvcHRsZW4gPj0gNCkgbWVtY3B5KCZpbmZvLT5nYXRld2F5LCB4LCA0KTsKQEAgLTQ0OSw3ICs0MjYsNyBAQAogICAgICAgICAgICAgICAgIHByaW50ZXJyKCJ0aW1lZCBvdXRcbiIpOwogICAgICAgICAgICAgICAgIGlmICggaW5mby50eXBlID09IERIQ1BPRkZFUiApIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcnIoIm5vIGFja25vd2xlZGdlbWVudCBmcm9tIERIQ1Agc2VydmVyXG5jb25maWd1cmluZyAlcyB3aXRoIG9mZmVyZWQgcGFyYW1ldGVyc1xuIiwgaWZuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmY19jb25maWd1cmUoaWZuYW1lLCAmaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaGNwX2NvbmZpZ3VyZShpZm5hbWUsICZpbmZvKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZXJybm8gPSBFVElNRTsKICAgICAgICAgICAgICAgICBjbG9zZShzKTsKQEAgLTUzMCw3ICs1MDcsNyBAQAogICAgICAgICAgICAgaWYgKGluZm8udHlwZSA9PSBESENQQUNLKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRlcnIoImNvbmZpZ3VyaW5nICVzXG4iLCBpZm5hbWUpOwogICAgICAgICAgICAgICAgIGNsb3NlKHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBpZmNfY29uZmlndXJlKGlmbmFtZSwgJmluZm8pOworICAgICAgICAgICAgICAgIHJldHVybiBkaGNwX2NvbmZpZ3VyZShpZm5hbWUsICZpbmZvKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby50eXBlID09IERIQ1BOQUspIHsKICAgICAgICAgICAgICAgICBwcmludGVycigiY29uZmlndXJhdGlvbiByZXF1ZXN0IGRlbmllZFxuIik7CiAgICAgICAgICAgICAgICAgY2xvc2Uocyk7CmRpZmYgLS1naXQgYS9saWJuZXR1dGlscy9pZmNfdXRpbHMuYyBiL2xpYm5ldHV0aWxzL2lmY191dGlscy5jCmluZGV4IGJkZTMzNmYuLjJlM2RmMDAgMTAwNjQ0Ci0tLSBhL2xpYm5ldHV0aWxzL2lmY191dGlscy5jCisrKyBiL2xpYm5ldHV0aWxzL2lmY191dGlscy5jCkBAIC0yNSwxMCArMjUsMTUgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Nl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KIAogI2lmZGVmIEFORFJPSUQKQEAgLTQzLDkgKzQ4LDM3IEBACiAjZW5kaWYKIAogc3RhdGljIGludCBpZmNfY3RsX3NvY2sgPSAtMTsKK3N0YXRpYyBpbnQgaWZjX2N0bF9zb2NrNiA9IC0xOwogdm9pZCBwcmludGVycihjaGFyICpmbXQsIC4uLik7CiAKLXN0YXRpYyBjb25zdCBjaGFyICppcGFkZHJfdG9fc3RyaW5nKHVpbnQzMl90IGFkZHIpCitpbl9hZGRyX3QgcHJlZml4TGVuZ3RoVG9JcHY0TmV0bWFzayhpbnQgcHJlZml4X2xlbmd0aCkKK3sKKyAgICBpbl9hZGRyX3QgbWFzayA9IDA7CisKKyAgICAvLyBDOTkgKDYuNS43KTogc2hpZnRzIG9mIDMyIGJpdHMgaGF2ZSB1bmRlZmluZWQgcmVzdWx0cworICAgIGlmIChwcmVmaXhfbGVuZ3RoIDw9IDAgfHwgcHJlZml4X2xlbmd0aCA+IDMyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG1hc2sgPSB+bWFzayA8PCAoMzIgLSBwcmVmaXhfbGVuZ3RoKTsKKyAgICBtYXNrID0gaHRvbmwobWFzayk7CisKKyAgICByZXR1cm4gbWFzazsKK30KKworaW50IGlwdjROZXRtYXNrVG9QcmVmaXhMZW5ndGgoaW5fYWRkcl90IG1hc2spCit7CisgICAgbWFzayA9IG50b2hsKG1hc2spOworICAgIGludCBwcmVmaXhMZW5ndGggPSAwOworICAgIHVpbnQzMl90IG0gPSAodWludDMyX3QpbWFzazsKKyAgICB3aGlsZSAobSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgcHJlZml4TGVuZ3RoKys7CisgICAgICAgIG0gPSBtIDw8IDE7CisgICAgfQorICAgIHJldHVybiBwcmVmaXhMZW5ndGg7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFkZHJfdG9fc3RyaW5nKGluX2FkZHJfdCBhZGRyKQogewogICAgIHN0cnVjdCBpbl9hZGRyIGluX2FkZHI7CiAKQEAgLTY0LDYgKzk3LDE3IEBACiAgICAgcmV0dXJuIGlmY19jdGxfc29jayA8IDAgPyAtMSA6IDA7CiB9CiAKK2ludCBpZmNfaW5pdDYodm9pZCkKK3sKKyAgICBpZiAoaWZjX2N0bF9zb2NrNiA9PSAtMSkgeworICAgICAgICBpZmNfY3RsX3NvY2s2ID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKyAgICAgICAgaWYgKGlmY19jdGxfc29jazYgPCAwKSB7CisgICAgICAgICAgICBwcmludGVycigic29ja2V0KCkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaWZjX2N0bF9zb2NrNiA8IDAgPyAtMSA6IDA7Cit9CisKIHZvaWQgaWZjX2Nsb3NlKHZvaWQpCiB7CiAgICAgaWYgKGlmY19jdGxfc29jayAhPSAtMSkgewpAQCAtNzIsNiArMTE2LDE0IEBACiAgICAgfQogfQogCit2b2lkIGlmY19jbG9zZTYodm9pZCkKK3sKKyAgICBpZiAoaWZjX2N0bF9zb2NrNiAhPSAtMSkgeworICAgICAgICAodm9pZCljbG9zZShpZmNfY3RsX3NvY2s2KTsKKyAgICAgICAgaWZjX2N0bF9zb2NrNiA9IC0xOworICAgIH0KK30KKwogc3RhdGljIHZvaWQgaWZjX2luaXRfaWZyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBpZnJlcSAqaWZyKQogewogICAgIG1lbXNldChpZnIsIDAsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKQEAgLTg4LDcgKzE0MCw3IEBACiAgICAgciA9IGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ0dJRkhXQUREUiwgJmlmcik7CiAgICAgaWYociA8IDApIHJldHVybiAtMTsKIAotICAgIG1lbWNweShwdHIsICZpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCA2KTsKKyAgICBtZW1jcHkocHRyLCAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOwogICAgIHJldHVybiAwOyAgICAKIH0KIApAQCAtMTAyLDcgKzE1NCw3IEBACiAgICAgaWYociA8IDApIHJldHVybiAtMTsKIAogICAgICppZl9pbmRleHAgPSBpZnIuaWZyX2lmaW5kZXg7Ci0gICAgcmV0dXJuIDA7ICAgIAorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGlmY19zZXRfZmxhZ3MoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgc2V0LCB1bnNpZ25lZCBjbHIpCkBAIC0xMzksMjEgKzE5MSw2MiBAQAogCiAgICAgaWZjX2luaXRfaWZyKG5hbWUsICZpZnIpOwogICAgIGluaXRfc29ja2FkZHJfaW4oJmlmci5pZnJfYWRkciwgYWRkcik7Ci0gICAgCisKICAgICByZXR1cm4gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DU0lGQUREUiwgJmlmcik7CiB9CiAKK2ludCBpZmNfc2V0X2h3YWRkcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpwdHIpCit7CisgICAgaW50IHI7CisgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICBpZmNfaW5pdF9pZnIobmFtZSwgJmlmcik7CisKKyAgICBpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgbWVtY3B5KCZpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBwdHIsIEVUSF9BTEVOKTsKKyAgICByZXR1cm4gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DU0lGSFdBRERSLCAmaWZyKTsKK30KKwogaW50IGlmY19zZXRfbWFzayhjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgbWFzaykKIHsKICAgICBzdHJ1Y3QgaWZyZXEgaWZyOwogCiAgICAgaWZjX2luaXRfaWZyKG5hbWUsICZpZnIpOwogICAgIGluaXRfc29ja2FkZHJfaW4oJmlmci5pZnJfYWRkciwgbWFzayk7Ci0gICAgCisKICAgICByZXR1cm4gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DU0lGTkVUTUFTSywgJmlmcik7CiB9CiAKLWludCBpZmNfZ2V0X2luZm8oY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90ICphZGRyLCBpbl9hZGRyX3QgKm1hc2ssIHVuc2lnbmVkICpmbGFncykKK2ludCBpZmNfc2V0X3ByZWZpeExlbmd0aChjb25zdCBjaGFyICpuYW1lLCBpbnQgcHJlZml4TGVuZ3RoKQoreworICAgIHN0cnVjdCBpZnJlcSBpZnI7CisgICAgLy8gVE9ETyAtIHN1cHBvcnQgaXB2NgorICAgIGlmIChwcmVmaXhMZW5ndGggPiAzMiB8fCBwcmVmaXhMZW5ndGggPCAwKSByZXR1cm4gLTE7CisKKyAgICBpbl9hZGRyX3QgbWFzayA9IHByZWZpeExlbmd0aFRvSXB2NE5ldG1hc2socHJlZml4TGVuZ3RoKTsKKyAgICBpZmNfaW5pdF9pZnIobmFtZSwgJmlmcik7CisgICAgaW5pdF9zb2NrYWRkcl9pbigmaWZyLmlmcl9hZGRyLCBtYXNrKTsKKworICAgIHJldHVybiBpb2N0bChpZmNfY3RsX3NvY2ssIFNJT0NTSUZORVRNQVNLLCAmaWZyKTsKK30KKworaW50IGlmY19nZXRfYWRkcihjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgKmFkZHIpCit7CisgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmY19pbml0X2lmcihuYW1lLCAmaWZyKTsKKyAgICBpZiAoYWRkciAhPSBOVUxMKSB7CisgICAgICAgIHJldCA9IGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ0dJRkFERFIsICZpZnIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgKmFkZHIgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmFkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopICZpZnIuaWZyX2FkZHIpLT5zaW5fYWRkci5zX2FkZHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGlmY19nZXRfaW5mbyhjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgKmFkZHIsIGludCAqcHJlZml4TGVuZ3RoLCB1bnNpZ25lZCAqZmxhZ3MpCiB7CiAgICAgc3RydWN0IGlmcmVxIGlmcjsKICAgICBpZmNfaW5pdF9pZnIobmFtZSwgJmlmcik7CkBAIC0xNjUsMTIgKzI1OCwxMyBAQAogICAgICAgICAgICAgKmFkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopICZpZnIuaWZyX2FkZHIpLT5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgaWYgKG1hc2sgIT0gTlVMTCkgeworCisgICAgaWYgKHByZWZpeExlbmd0aCAhPSBOVUxMKSB7CiAgICAgICAgIGlmKGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ0dJRk5FVE1BU0ssICZpZnIpIDwgMCkgewotICAgICAgICAgICAgKm1hc2sgPSAwOworICAgICAgICAgICAgKnByZWZpeExlbmd0aCA9IDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqbWFzayA9ICgoc3RydWN0IHNvY2thZGRyX2luKikgJmlmci5pZnJfYWRkciktPnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICAgICAgICpwcmVmaXhMZW5ndGggPSBpcHY0TmV0bWFza1RvUHJlZml4TGVuZ3RoKChpbnQpCisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luKikgJmlmci5pZnJfYWRkciktPnNpbl9hZGRyLnNfYWRkcik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4NSw0NSArMjc5LDYwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLQotaW50IGlmY19jcmVhdGVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcikKLXsKLSAgICBzdHJ1Y3QgcnRlbnRyeSBydDsKLQotICAgIG1lbXNldCgmcnQsIDAsIHNpemVvZihydCkpOwotICAgIAotICAgIHJ0LnJ0X2RzdC5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQIHwgUlRGX0dBVEVXQVk7Ci0gICAgcnQucnRfZGV2ID0gKHZvaWQqKSBuYW1lOwotICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dlbm1hc2ssIDApOwotICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dhdGV3YXksIGFkZHIpOwotICAgIAotICAgIHJldHVybiBpb2N0bChpZmNfY3RsX3NvY2ssIFNJT0NBRERSVCwgJnJ0KTsKLX0KLQotaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcikKK2ludCBpZmNfYWN0X29uX2lwdjRfcm91dGUoaW50IGFjdGlvbiwgY29uc3QgY2hhciAqaWZuYW1lLCBzdHJ1Y3QgaW5fYWRkciBkc3QsIGludCBwcmVmaXhfbGVuZ3RoLAorICAgICAgc3RydWN0IGluX2FkZHIgZ3cpCiB7CiAgICAgc3RydWN0IHJ0ZW50cnkgcnQ7CiAgICAgaW50IHJlc3VsdDsKKyAgICBpbl9hZGRyX3QgbmV0bWFzazsKIAogICAgIG1lbXNldCgmcnQsIDAsIHNpemVvZihydCkpOwotICAgIAorCiAgICAgcnQucnRfZHN0LnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgcnQucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfSE9TVDsKLSAgICBydC5ydF9kZXYgPSAodm9pZCopIG5hbWU7Ci0gICAgaW5pdF9zb2NrYWRkcl9pbigmcnQucnRfZHN0LCBhZGRyKTsKLSAgICBpbml0X3NvY2thZGRyX2luKCZydC5ydF9nZW5tYXNrLCAwKTsKLSAgICBpbml0X3NvY2thZGRyX2luKCZydC5ydF9nYXRld2F5LCAwKTsKLSAgICAKKyAgICBydC5ydF9kZXYgPSAodm9pZCopIGlmbmFtZTsKKworICAgIG5ldG1hc2sgPSBwcmVmaXhMZW5ndGhUb0lwdjROZXRtYXNrKHByZWZpeF9sZW5ndGgpOworICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dlbm1hc2ssIG5ldG1hc2spOworICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2RzdCwgZHN0LnNfYWRkcik7CisgICAgcnQucnRfZmxhZ3MgPSBSVEZfVVA7CisKKyAgICBpZiAocHJlZml4X2xlbmd0aCA9PSAzMikgeworICAgICAgICBydC5ydF9mbGFncyB8PSBSVEZfSE9TVDsKKyAgICB9CisKKyAgICBpZiAoZ3cuc19hZGRyICE9IDApIHsKKyAgICAgICAgcnQucnRfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisgICAgICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dhdGV3YXksIGd3LnNfYWRkcik7CisgICAgfQorCiAgICAgaWZjX2luaXQoKTsKLSAgICByZXN1bHQgPSBpb2N0bChpZmNfY3RsX3NvY2ssIFNJT0NBRERSVCwgJnJ0KTsKLSAgICBpZiAocmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFRVhJU1QpIHsKLSAgICAgICAgcmVzdWx0ID0gMDsKKworICAgIGlmIChpZmNfY3RsX3NvY2sgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmVzdWx0ID0gaW9jdGwoaWZjX2N0bF9zb2NrLCBhY3Rpb24sICZydCk7CisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVFWElTVCkgeworICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKKyAgICAgICAgfQogICAgIH0KICAgICBpZmNfY2xvc2UoKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitpbnQgaWZjX2NyZWF0ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBndykKK3sKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbl9kc3QsIGluX2d3OworCisgICAgaW5fZHN0LnNfYWRkciA9IDA7CisgICAgaW5fZ3cuc19hZGRyID0gZ3c7CisKKyAgICByZXR1cm4gaWZjX2FjdF9vbl9yb3V0ZShTSU9DQUREUlQsIG5hbWUsIGluX2RzdCwgMCwgaW5fZ3cpOworfQorCiBpbnQgaWZjX2VuYWJsZShjb25zdCBjaGFyICppZm5hbWUpCiB7CiAgICAgaW50IHJlc3VsdDsKQEAgLTIzNiwxMSArMzQ1LDIwIEBACiAKIGludCBpZmNfZGlzYWJsZShjb25zdCBjaGFyICppZm5hbWUpCiB7CisgICAgdW5zaWduZWQgYWRkciwgY291bnQ7CiAgICAgaW50IHJlc3VsdDsKIAogICAgIGlmY19pbml0KCk7CiAgICAgcmVzdWx0ID0gaWZjX2Rvd24oaWZuYW1lKTsKKwogICAgIGlmY19zZXRfYWRkcihpZm5hbWUsIDApOworICAgIGZvciAoY291bnQ9MCwgYWRkcj0xOygoYWRkciAhPSAwKSAmJiAoY291bnQgPCAyNTUpKTsgY291bnQrKykgeworICAgICAgIGlmIChpZmNfZ2V0X2FkZHIoaWZuYW1lLCAmYWRkcikgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgaWYgKGFkZHIpCisgICAgICAgICAgaWZjX3NldF9hZGRyKGlmbmFtZSwgMCk7CisgICAgfQorCiAgICAgaWZjX2Nsb3NlKCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTI0OCwxNyArMzY2LDM0IEBACiBpbnQgaWZjX3Jlc2V0X2Nvbm5lY3Rpb25zKGNvbnN0IGNoYXIgKmlmbmFtZSkKIHsKICNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICBpbnQgcmVzdWx0OworICAgIGludCByZXN1bHQsIHN1Y2Nlc3M7CiAgICAgaW5fYWRkcl90IG15YWRkcjsKICAgICBzdHJ1Y3QgaWZyZXEgaWZyOworICAgIHN0cnVjdCBpbjZfaWZyZXEgaWZyNjsKIAorICAgIC8qIElQdjQuIENsZWFyIGNvbm5lY3Rpb25zIG9uIHRoZSBJUCBhZGRyZXNzLiAqLwogICAgIGlmY19pbml0KCk7CiAgICAgaWZjX2dldF9pbmZvKGlmbmFtZSwgJm15YWRkciwgTlVMTCwgTlVMTCk7CiAgICAgaWZjX2luaXRfaWZyKGlmbmFtZSwgJmlmcik7CiAgICAgaW5pdF9zb2NrYWRkcl9pbigmaWZyLmlmcl9hZGRyLCBteWFkZHIpOwogICAgIHJlc3VsdCA9IGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ0tJTExBRERSLCAgJmlmcik7CiAgICAgaWZjX2Nsb3NlKCk7Ci0gICAgCisKKyAgICAvKgorICAgICAqIElQdjYuIE9uIExpbnV4LCB3aGVuIGFuIGludGVyZmFjZSBnb2VzIGRvd24gaXQgbG9zZXMgYWxsIGl0cyBJUHY2CisgICAgICogYWRkcmVzc2VzLCBzbyB3ZSBkb24ndCBrbm93IHdoaWNoIGNvbm5lY3Rpb25zIGJlbG9uZ2VkIHRvIHRoYXQgaW50ZXJmYWNlCisgICAgICogU28gd2UgY2xlYXIgYWxsIHVudXNlZCBJUHY2IGNvbm5lY3Rpb25zIG9uIHRoZSBkZXZpY2UgYnkgc3BlY2lmeWluZyBhbgorICAgICAqIGVtcHR5IElQdjYgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBpZmNfaW5pdDYoKTsKKyAgICAvLyBUaGlzIGltcGxpY2l0bHkgc3BlY2lmaWVzIGFuIGFkZHJlc3Mgb2YgOjosIGkuZS4sIGtpbGwgYWxsIElQdjYgc29ja2V0cy4KKyAgICBtZW1zZXQoJmlmcjYsIDAsIHNpemVvZihpZnI2KSk7CisgICAgc3VjY2VzcyA9IGlvY3RsKGlmY19jdGxfc29jazYsIFNJT0NLSUxMQUREUiwgICZpZnI2KTsKKyAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgcmVzdWx0ID0gc3VjY2VzczsKKyAgICB9CisgICAgaWZjX2Nsb3NlNigpOworCiAgICAgcmV0dXJuIHJlc3VsdDsKICNlbHNlCiAgICAgcmV0dXJuIDA7CkBAIC0zMTQsNjcgKzQ0OSw2IEBACiB9CiAKIC8qCi0gKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlZmF1bHQgZ2F0ZXdheQotICoKLSAqIFRPRE86IGZhY3RvciBvdXQgY29tbW9uIGNvZGUgZnJvbSB0aGlzIGFuZCByZW1vdmVfaG9zdF9yb3V0ZXMoKQotICogc28gdGhhdCB3ZSBvbmx5IHNjYW4gL3Byb2MvbmV0L3JvdXRlIGluIG9uZSBwbGFjZS4KLSAqLwotaW50IGlmY19nZXRfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUpCi17Ci0gICAgY2hhciBuYW1lWzY0XTsKLSAgICBpbl9hZGRyX3QgZGVzdCwgZ3dheSwgbWFzazsKLSAgICBpbnQgZmxhZ3MsIHJlZmNudCwgdXNlLCBtZXRyaWMsIG10dSwgd2luLCBpcnR0OwotICAgIGludCByZXN1bHQ7Ci0gICAgRklMRSAqZnA7Ci0KLSAgICBmcCA9IGZvcGVuKCIvcHJvYy9uZXQvcm91dGUiLCAiciIpOwotICAgIGlmIChmcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvKiBTa2lwIHRoZSBoZWFkZXIgbGluZSAqLwotICAgIGlmIChmc2NhbmYoZnAsICIlKlteXG5dXG4iKSA8IDApIHsKLSAgICAgICAgZmNsb3NlKGZwKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmY19pbml0KCk7Ci0gICAgcmVzdWx0ID0gMDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGludCBucmVhZCA9IGZzY2FuZihmcCwgIiU2M3MlWCVYJVglZCVkJWQlWCVkJWQlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICZkZXN0LCAmZ3dheSwgJmZsYWdzLCAmcmVmY250LCAmdXNlLCAmbWV0cmljLCAmbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtdHUsICZ3aW4sICZpcnR0KTsKLSAgICAgICAgaWYgKG5yZWFkICE9IDExKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGZsYWdzICYgKFJURl9VUHxSVEZfR0FURVdBWSkpID09IChSVEZfVVB8UlRGX0dBVEVXQVkpCi0gICAgICAgICAgICAgICAgJiYgZGVzdCA9PSAwCi0gICAgICAgICAgICAgICAgJiYgc3RyY21wKGlmbmFtZSwgbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gZ3dheTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGZjbG9zZShmcCk7Ci0gICAgaWZjX2Nsb3NlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIFNldHMgdGhlIHNwZWNpZmllZCBnYXRld2F5IGFzIHRoZSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLgotICovCi1pbnQgaWZjX3NldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgaW5fYWRkcl90IGdhdGV3YXkpCi17Ci0gICAgc3RydWN0IGluX2FkZHIgYWRkcjsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWZjX2luaXQoKTsKLSAgICBhZGRyLnNfYWRkciA9IGdhdGV3YXk7Ci0gICAgaWYgKChyZXN1bHQgPSBpZmNfY3JlYXRlX2RlZmF1bHRfcm91dGUoaWZuYW1lLCBnYXRld2F5KSkgPCAwKSB7Ci0gICAgICAgIExPR0QoImZhaWxlZCB0byBhZGQgJXMgYXMgZGVmYXVsdCByb3V0ZSBmb3IgJXM6ICVzIiwKLSAgICAgICAgICAgICBpbmV0X250b2EoYWRkciksIGlmbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgaWZjX2Nsb3NlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKICAqIFJlbW92ZXMgdGhlIGRlZmF1bHQgcm91dGUgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuCiAgKi8KIGludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKQpAQCAtMzk3LDcgKzQ3MSw3IEBACiBpbnQKIGlmY19jb25maWd1cmUoY29uc3QgY2hhciAqaWZuYW1lLAogICAgICAgICBpbl9hZGRyX3QgYWRkcmVzcywKLSAgICAgICAgaW5fYWRkcl90IG5ldG1hc2ssCisgICAgICAgIHVpbnQzMl90IHByZWZpeExlbmd0aCwKICAgICAgICAgaW5fYWRkcl90IGdhdGV3YXksCiAgICAgICAgIGluX2FkZHJfdCBkbnMxLAogICAgICAgICBpbl9hZGRyX3QgZG5zMikgewpAQCAtNDE2LDggKzQ5MCw4IEBACiAgICAgICAgIGlmY19jbG9zZSgpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChpZmNfc2V0X21hc2soaWZuYW1lLCBuZXRtYXNrKSkgewotICAgICAgICBwcmludGVycigiZmFpbGVkIHRvIHNldCBuZXRtYXNrICVzOiAlc1xuIiwgaXBhZGRyX3RvX3N0cmluZyhuZXRtYXNrKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBpZiAoaWZjX3NldF9wcmVmaXhMZW5ndGgoaWZuYW1lLCBwcmVmaXhMZW5ndGgpKSB7CisgICAgICAgIHByaW50ZXJyKCJmYWlsZWQgdG8gc2V0IHByZWZpeExlbmd0aCAlZDogJXNcbiIsIHByZWZpeExlbmd0aCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgaWZjX2Nsb3NlKCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC00MjksMTAgKzUwMywxMzYgQEAKIAogICAgIGlmY19jbG9zZSgpOwogCi0gICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAiZGhjcC4lcy5kbnMxIiwgaWZuYW1lKTsKKyAgICBzbnByaW50ZihkbnNfcHJvcF9uYW1lLCBzaXplb2YoZG5zX3Byb3BfbmFtZSksICJuZXQuJXMuZG5zMSIsIGlmbmFtZSk7CiAgICAgcHJvcGVydHlfc2V0KGRuc19wcm9wX25hbWUsIGRuczEgPyBpcGFkZHJfdG9fc3RyaW5nKGRuczEpIDogIiIpOwotICAgIHNucHJpbnRmKGRuc19wcm9wX25hbWUsIHNpemVvZihkbnNfcHJvcF9uYW1lKSwgImRoY3AuJXMuZG5zMiIsIGlmbmFtZSk7CisgICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczIiLCBpZm5hbWUpOwogICAgIHByb3BlcnR5X3NldChkbnNfcHJvcF9uYW1lLCBkbnMyID8gaXBhZGRyX3RvX3N0cmluZyhkbnMyKSA6ICIiKTsKIAogICAgIHJldHVybiAwOwogfQorCitpbnQgaWZjX2FjdF9vbl9pcHY2X3JvdXRlKGludCBhY3Rpb24sIGNvbnN0IGNoYXIgKmlmbmFtZSwgc3RydWN0IGluNl9hZGRyIGRzdCwgaW50IHByZWZpeF9sZW5ndGgsCisgICAgICBzdHJ1Y3QgaW42X2FkZHIgZ3cpCit7CisgICAgc3RydWN0IGluNl9ydG1zZyBydG1zZzsKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBpZmluZGV4OworCisgICAgbWVtc2V0KCZydG1zZywgMCwgc2l6ZW9mKHJ0bXNnKSk7CisKKyAgICBpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoaWZuYW1lKTsKKyAgICBpZiAoaWZpbmRleCA9PSAwKSB7CisgICAgICAgIHByaW50ZXJyKCJpZl9uYW1ldG9pbmRleCgpIGZhaWxlZDogaW50ZXJmYWNlICVzXG4iLCBpZm5hbWUpOworICAgICAgICByZXR1cm4gLUVOWElPOworICAgIH0KKworICAgIHJ0bXNnLnJ0bXNnX2lmaW5kZXggPSBpZmluZGV4OworICAgIHJ0bXNnLnJ0bXNnX2RzdCA9IGRzdDsKKyAgICBydG1zZy5ydG1zZ19kc3RfbGVuID0gcHJlZml4X2xlbmd0aDsKKyAgICBydG1zZy5ydG1zZ19mbGFncyA9IFJURl9VUDsKKworICAgIGlmIChwcmVmaXhfbGVuZ3RoID09IDEyOCkgeworICAgICAgICBydG1zZy5ydG1zZ19mbGFncyB8PSBSVEZfSE9TVDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKCZndywgJmluNmFkZHJfYW55LCBzaXplb2YoaW42YWRkcl9hbnkpKSkgeworICAgICAgICBydG1zZy5ydG1zZ19mbGFncyB8PSBSVEZfR0FURVdBWTsKKyAgICAgICAgcnRtc2cucnRtc2dfZ2F0ZXdheSA9IGd3OworICAgIH0KKworICAgIGlmY19pbml0NigpOworCisgICAgaWYgKGlmY19jdGxfc29jazYgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmVzdWx0ID0gaW9jdGwoaWZjX2N0bF9zb2NrNiwgYWN0aW9uLCAmcnRtc2cpOworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFRVhJU1QpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSAtZXJybm87CisgICAgICAgIH0KKyAgICB9CisgICAgaWZjX2Nsb3NlNigpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBpZmNfYWN0X29uX3JvdXRlKGludCBhY3Rpb24sIGNvbnN0IGNoYXIgKmlmbmFtZSwgY29uc3QgY2hhciAqZHN0LCBpbnQgcHJlZml4X2xlbmd0aCwKKyAgICAgICAgY29uc3QgY2hhciAqZ3cpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGlwdjRfZHN0LCBpcHY0X2d3OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgaXB2Nl9kc3QsIGlwdjZfZ3c7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWRkcl9haSwgKmd3X2FpOworCisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgLyogQWxsb3cgSVB2NCBvciBJUHY2ICovCisgICAgaGludHMuYWlfZmxhZ3MgPSBBSV9OVU1FUklDSE9TVDsKKworICAgIHJldCA9IGdldGFkZHJpbmZvKGRzdCwgTlVMTCwgJmhpbnRzLCAmYWRkcl9haSk7CisKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgcHJpbnRlcnIoImdldGFkZHJpbmZvIGZhaWxlZDogaW52YWxpZCBhZGRyZXNzICVzXG4iLCBkc3QpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoZ3cgPT0gTlVMTCB8fCAoc3RybGVuKGd3KSA9PSAwKSkgeworICAgICAgICBpZiAoYWRkcl9haS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgICBndyA9ICI6OiI7CisgICAgICAgIH0gZWxzZSBpZiAoYWRkcl9haS0+YWlfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgICAgICAgIGd3ID0gIjAuMC4wLjAiOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoYWRkcl9haS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSAmJiAocHJlZml4X2xlbmd0aCA8IDAgfHwgcHJlZml4X2xlbmd0aCA+IDEyOCkpIHx8CisgICAgICAgICAgICAoKGFkZHJfYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUKSAmJiAocHJlZml4X2xlbmd0aCA8IDAgfHwgcHJlZml4X2xlbmd0aCA+IDMyKSkpIHsKKyAgICAgICAgcHJpbnRlcnIoImlmY19hZGRfcm91dGU6IGludmFsaWQgcHJlZml4IGxlbmd0aCIpOworICAgICAgICBmcmVlYWRkcmluZm8oYWRkcl9haSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldCA9IGdldGFkZHJpbmZvKGd3LCBOVUxMLCAmaGludHMsICZnd19haSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHByaW50ZXJyKCJnZXRhZGRyaW5mbyBmYWlsZWQ6IGludmFsaWQgZ2F0ZXdheSAlc1xuIiwgZ3cpOworICAgICAgICBmcmVlYWRkcmluZm8oYWRkcl9haSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChhZGRyX2FpLT5haV9mYW1pbHkgIT0gZ3dfYWktPmFpX2ZhbWlseSkgeworICAgICAgICBwcmludGVycigiaWZjX2FkZF9yb3V0ZTogZGlmZmVyZW50IGFkZHJlc3MgZmFtaWxpZXM6ICVzIGFuZCAlc1xuIiwgZHN0LCBndyk7CisgICAgICAgIGZyZWVhZGRyaW5mbyhhZGRyX2FpKTsKKyAgICAgICAgZnJlZWFkZHJpbmZvKGd3X2FpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGFkZHJfYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICBtZW1jcHkoJmlwdjZfZHN0LCBhZGRyX2FpLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworICAgICAgICBtZW1jcHkoJmlwdjZfZ3csIGd3X2FpLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworICAgICAgICByZXQgPSBpZmNfYWN0X29uX2lwdjZfcm91dGUoYWN0aW9uLCBpZm5hbWUsIGlwdjZfZHN0LnNpbjZfYWRkciwKKyAgICAgICAgICAgICAgICBwcmVmaXhfbGVuZ3RoLCBpcHY2X2d3LnNpbjZfYWRkcik7CisgICAgfSBlbHNlIGlmIChhZGRyX2FpLT5haV9mYW1pbHkgPT0gQUZfSU5FVCkgeworICAgICAgICBtZW1jcHkoJmlwdjRfZHN0LCBhZGRyX2FpLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisgICAgICAgIG1lbWNweSgmaXB2NF9ndywgZ3dfYWktPmFpX2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICAgICAgcmV0ID0gaWZjX2FjdF9vbl9pcHY0X3JvdXRlKGFjdGlvbiwgaWZuYW1lLCBpcHY0X2RzdC5zaW5fYWRkciwKKyAgICAgICAgICAgICAgICBwcmVmaXhfbGVuZ3RoLCBpcHY0X2d3LnNpbl9hZGRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGVycigiaWZjX2FkZF9yb3V0ZTogZ2V0YWRkcmluZm8gcmV0dXJuZWQgdW4gc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5ICVkXG4iLAorICAgICAgICAgICAgICAgICAgYWRkcl9haS0+YWlfZmFtaWx5KTsKKyAgICAgICAgcmV0ID0gLUVBRk5PU1VQUE9SVDsKKyAgICB9CisKKyAgICBmcmVlYWRkcmluZm8oYWRkcl9haSk7CisgICAgZnJlZWFkZHJpbmZvKGd3X2FpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgaWZjX2FkZF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIGNvbnN0IGNoYXIgKmRzdCwgaW50IHByZWZpeF9sZW5ndGgsIGNvbnN0IGNoYXIgKmd3KQoreworICAgIHJldHVybiBpZmNfYWN0X29uX3JvdXRlKFNJT0NBRERSVCwgaWZuYW1lLCBkc3QsIHByZWZpeF9sZW5ndGgsIGd3KTsKK30KKworaW50IGlmY19yZW1vdmVfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCBjb25zdCBjaGFyKmRzdCwgaW50IHByZWZpeF9sZW5ndGgsIGNvbnN0IGNoYXIgKmd3KQoreworICAgIHJldHVybiBpZmNfYWN0X29uX3JvdXRlKFNJT0NERUxSVCwgaWZuYW1lLCBkc3QsIHByZWZpeF9sZW5ndGgsIGd3KTsKK30KZGlmZiAtLWdpdCBhL2xpYm5ldHV0aWxzL2lmY191dGlscy5oIGIvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yjg3NDcuLjAwMDAwMDAKLS0tIGEvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0lGQ19VVElMU19IXwotI2RlZmluZSBfSUZDX1VUSUxTX0hfCi0KLWludCBpZmNfaW5pdCh2b2lkKTsKLQotaW50IGlmY19nZXRfaWZpbmRleChjb25zdCBjaGFyICpuYW1lLCBpbnQgKmlmX2luZGV4cCk7Ci1pbnQgaWZjX2dldF9od2FkZHIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHRyKTsKLQotaW50IGlmY191cChjb25zdCBjaGFyICpuYW1lKTsKLWludCBpZmNfZG93bihjb25zdCBjaGFyICpuYW1lKTsKLQotaW50IGlmY19zZXRfYWRkcihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBhZGRyKTsKLWludCBpZmNfc2V0X21hc2soY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbWFzayk7Ci0KLWludCBpZmNfY3JlYXRlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgYWRkcik7Ci0KLWludCBpZmNfZ2V0X2luZm8oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgKmFkZHIsIHVuc2lnbmVkICptYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9BbmRyb2lkLm1rIGIvbGlicGl4ZWxmbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggNjQ5MWQyNC4uZWQyYWI1ZSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvbGlicGl4ZWxmbGluZ2VyL0FuZHJvaWQubWsKQEAgLTIsMTcgKzIsNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKICMKLSMgQVJNdjYgc3BlY2lmaWMgb2JqZWN0cwotIwotCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCi1MT0NBTF9BU0ZMQUdTIDo9IC1tYXJjaD1hcm12NgotTE9DQUxfU1JDX0ZJTEVTIDo9IHJvdGF0ZTkwQ1dfNHg0XzE2djYuUwotTE9DQUxfTU9EVUxFIDo9IGxpYnBpeGVsZmxpbmdlcl9hcm12NgotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotZW5kaWYKLQotIwogIyBDL0MrKyBhbmQgQVJNdjUgb2JqZWN0cwogIwogCkBAIC03NywxMCArNjYsNiBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9sZWdhY3kKIExPQ0FMX0NGTEFHUyArPSAtRFdJVEhfTElCX0hBUkRXQVJFCiBlbmRpZgotCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCi1MT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnBpeGVsZmxpbmdlcl9hcm12NgotZW5kaWYKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogIwpAQCAtOTEsOSArNzYsNiBAQAogTE9DQUxfTU9EVUxFOj0gbGlicGl4ZWxmbGluZ2VyX3N0YXRpYwogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoUElYRUxGTElOR0VSX1NSQ19GSUxFUykKIExPQ0FMX0NGTEFHUyA6PSAkKFBJWEVMRkxJTkdFUl9DRkxBR1MpIAotaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQotTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJwaXhlbGZsaW5nZXJfYXJtdjYKLWVuZGlmCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKIApkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5jcHAgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmNwcAppbmRleCBkMzcyMGMzLi40NzI2YTA4IDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmNwcAorKysgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmNwcApAQCAtMzM0LDcgKzMzNCw3IEBACiAKIHZvaWQgQVJNQXNzZW1ibGVyOjpTVE0oaW50IGNjLCBpbnQgZGlyLAogICAgICAgICBpbnQgUm4sIGludCBXLCB1aW50MzJfdCByZWdfbGlzdCkKLXsgICAvLyAgICAgICAgICAgICAgICAgICAgRkEgRUEgRkQgRUQgICAgICBJQiBJQSBEQiBEQQoreyAgIC8vICAgICAgICAgICAgICAgICAgICBFRCBGRCBFQSBGQSAgICAgIElCIElBIERCIERBCiAgICAgY29uc3QgdWludDhfdCBQWzhdID0geyAwLCAxLCAwLCAxLCAgICAgIDEsIDAsIDEsIDAgfTsKICAgICBjb25zdCB1aW50OF90IFVbOF0gPSB7IDAsIDAsIDEsIDEsICAgICAgMSwgMSwgMCwgMCB9OwogICAgICptUEMrKyA9IChjYzw8MjgpIHwgKDQ8PDI1KSB8ICh1aW50MzJfdChQW2Rpcl0pPDwyNCkgfApAQCAtNDMzLDYgKzQzMywxNiBAQAogewogICAgICptUEMrKyA9IChjYzw8MjgpIHwgMHg2Q0YwMDcwIHwgKFJkPDwxMikgfCAoKHJvdGF0ZSA+PiAzKSA8PCAxMCkgfCBSbTsKIH0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIEJpdCBtYW5pcHVsYXRpb24gKEFSTXY3KyBvbmx5KS4uLgorI2VuZGlmCisKKy8vIEJpdCBtYW5pcHVsYXRpb24gKEFSTXY3KyBvbmx5KS4uLgordm9pZCBBUk1Bc3NlbWJsZXI6OlVCRlgoaW50IGNjLCBpbnQgUmQsIGludCBSbiwgaW50IGxzYiwgaW50IHdpZHRoKQoreworICAgICptUEMrKyA9IChjYzw8MjgpIHwgMHg3RTAwMDAwIHwgKCh3aWR0aC0xKTw8MTYpIHwgKFJkPDwxMikgfCAobHNiPDw3KSB8IDB4NTAgfCBSbjsKK30KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5oIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5oCmluZGV4IGE2NjdjYjUuLmU3ZjAzOGEgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXIuaAorKysgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmgKQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBTTUxBVyhpbnQgY2MsIGludCB5LAogICAgICAgICAgICAgICAgIGludCBSZCwgaW50IFJtLCBpbnQgUnMsIGludCBSbik7CiAgICAgdmlydHVhbCB2b2lkIFVYVEIxNihpbnQgY2MsIGludCBSZCwgaW50IFJtLCBpbnQgcm90YXRlKTsKKyAgICB2aXJ0dWFsIHZvaWQgVUJGWChpbnQgY2MsIGludCBSZCwgaW50IFJuLCBpbnQgbHNiLCBpbnQgd2lkdGgpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgIEFSTUFzc2VtYmxlcihjb25zdCBBUk1Bc3NlbWJsZXImIHJocyk7CmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVySW50ZXJmYWNlLmggYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVySW50ZXJmYWNlLmgKaW5kZXggZmY2YWYyYS4uNzk2MzQyYSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlckludGVyZmFjZS5oCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJJbnRlcmZhY2UuaApAQCAtMjA2LDYgKzIwNiw5IEBACiAgICAgLy8gYnl0ZS9oYWxmIHdvcmQgZXh0cmFjdC4uLgogICAgIHZpcnR1YWwgdm9pZCBVWFRCMTYoaW50IGNjLCBpbnQgUmQsIGludCBSbSwgaW50IHJvdGF0ZSkgPSAwOwogCisgICAgLy8gYml0IG1hbmlwdWxhdGlvbi4uLgorICAgIHZpcnR1YWwgdm9pZCBVQkZYKGludCBjYywgaW50IFJkLCBpbnQgUm4sIGludCBsc2IsIGludCB3aWR0aCkgPSAwOworCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBjb252ZW5pZW5jZS4uLgogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuY3BwIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmNwcAppbmRleCA3YzQyMmRiLi5jNTdkN2RhIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuY3BwCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJQcm94eS5jcHAKQEAgLTE5OSw1ICsxOTksOSBAQAogICAgIG1UYXJnZXQtPlVYVEIxNihjYywgUmQsIFJtLCByb3RhdGUpOwogfQogCit2b2lkIEFSTUFzc2VtYmxlclByb3h5OjpVQkZYKGludCBjYywgaW50IFJkLCBpbnQgUm4sIGludCBsc2IsIGludCB3aWR0aCkgeworICAgIG1UYXJnZXQtPlVCRlgoY2MsIFJkLCBSbiwgbHNiLCB3aWR0aCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJQcm94eS5oIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmgKaW5kZXggOTEzNGNjZS4uOGM3ZjI3MCAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmgKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmgKQEAgLTExNSw2ICsxMTUsNyBAQAogICAgICAgICAgICAgICAgIGludCBSZCwgaW50IFJtLCBpbnQgUnMsIGludCBSbik7CiAKICAgICB2aXJ0dWFsIHZvaWQgVVhUQjE2KGludCBjYywgaW50IFJkLCBpbnQgUm0sIGludCByb3RhdGUpOworICAgIHZpcnR1YWwgdm9pZCBVQkZYKGludCBjYywgaW50IFJkLCBpbnQgUm4sIGludCBsc2IsIGludCB3aWR0aCk7CiAKIHByaXZhdGU6CiAgICAgQVJNQXNzZW1ibGVySW50ZXJmYWNlKiAgbVRhcmdldDsKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9kaXNhc3NlbS5jIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2Rpc2Fzc2VtLmMKaW5kZXggYzE3ZjNlYy4uYWViODAzNCAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2Rpc2Fzc2VtLmMKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2Rpc2Fzc2VtLmMKQEAgLTgxLDYgKzgxLDggQEAKICAqIGcgLSAybmQgZnAgb3BlcmFuZCAocmVnaXN0ZXIpIChiaXRzIDE2LTE4KQogICogaCAtIDNyZCBmcCBvcGVyYW5kIChyZWdpc3Rlci9pbW1lZGlhdGUpIChiaXRzIDAtNCkKICAqIGogLSB4dGIgcm90YXRlIGxpdGVyYWwgKGJpdHMgMTAtMTEpCisgKiBpIC0gYmZ4IGxzYiBsaXRlcmFsIChiaXRzIDctMTEpCisgKiB3IC0gYmZ4IHdpZHRoIGxpdGVyYWwgKGJpdHMgMTYtMjApCiAgKiBiIC0gYnJhbmNoIGFkZHJlc3MKICAqIHQgLSB0aHVtYiBicmFuY2ggYWRkcmVzcyAoYml0cyAyNCwgMC0yMykKICAqIGsgLSBicmVha3BvaW50IGNvbW1lbnQgKGJpdHMgMC0zLCA4LTE5KQpAQCAtMTI0LDYgKzEyNiw3IEBACiAgICAgeyAweDBmZTAwMGYwLCAweDAwYTAwMDkwLCAidW1sYWwiLAkiU2RubXMiIH0sCiAgICAgeyAweDBmZTAwMGYwLCAweDAwZTAwMDkwLCAic21sYWwiLAkiU2RubXMiIH0sCiAgICAgeyAweDBmZmYwM2YwLCAweDA2Y2YwMDcwLCAidXh0YjE2IiwgImRtaiIgfSwKKyAgICB7IDB4MGZlMDAwNzAsIDB4MDdlMDAwNTAsICJ1YmZ4IiwgICAiZG1pdyIgfSwKICAgICB7IDB4MGQ3MDAwMDAsIDB4MDQyMDAwMDAsICJzdHJ0IiwJImRhVyIgfSwKICAgICB7IDB4MGQ3MDAwMDAsIDB4MDQzMDAwMDAsICJsZHJ0IiwJImRhVyIgfSwKICAgICB7IDB4MGQ3MDAwMDAsIDB4MDQ2MDAwMDAsICJzdHJidCIsCSJkYVciIH0sCkBAIC00MTIsNiArNDE1LDE0IEBACiAJCWNhc2UgJ2onOgogCQkJZGktPmRpX3ByaW50Zigicm9yICMlZCIsICgoaW5zbiA+PiAxMCkgJiAzKSA8PCAzKTsKIAkJCWJyZWFrOworICAgICAgICAvKiBpIC0gYmZ4IGxzYiBsaXRlcmFsIChiaXRzIDctMTEpICovCisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgZGktPmRpX3ByaW50ZigiIyVkIiwgKGluc24gPj4gNykgJiAzMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogdyAtIGJmeCB3aWR0aCBsaXRlcmFsIChiaXRzIDE2LTIwKSAqLworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIGRpLT5kaV9wcmludGYoIiMlZCIsIDEgKyAoKGluc24gPj4gMTYpICYgMzEpKTsKKyAgICAgICAgICAgIGJyZWFrOwogCQkvKiBiIC0gYnJhbmNoIGFkZHJlc3MgKi8KIAkJY2FzZSAnYic6CiAJCQlicmFuY2ggPSAoKGluc24gPDwgMikgJiAweDAzZmZmZmZmKTsKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9sb2FkX3N0b3JlLmNwcCBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9sb2FkX3N0b3JlLmNwcAppbmRleCA5M2M1ODI1Li5lZDIwYTAwIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvbG9hZF9zdG9yZS5jcHAKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2xvYWRfc3RvcmUuY3BwCkBAIC0xOCw5ICsxOCwxMiBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCiAjaW5jbHVkZSAiY29kZWZsaW5nZXIvR0dMQXNzZW1ibGVyLmgiCiAKKyNpZmRlZiBfX0FSTV9BUkNIX18KKyNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDYgKzExMywyMCBAQAogICAgIGFzc2VydChtYXNrTGVuPD04KTsKICAgICBhc3NlcnQoaCk7CiAgICAgCisjaWYgX19BUk1fQVJDSF9fID49IDcKKyAgICBjb25zdCBpbnQgbWFzayA9ICgxPDxtYXNrTGVuKS0xOworICAgIGlmICgoaCA9PSBiaXRzKSAmJiAhbCAmJiAocyAhPSBkLnJlZykpIHsKKyAgICAgICAgTU9WKEFMLCAwLCBkLnJlZywgcyk7ICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCA9IHBhY2tlZDsKKyAgICB9IGVsc2UgaWYgKChoID09IGJpdHMpICYmIGwpIHsKKyAgICAgICAgTU9WKEFMLCAwLCBkLnJlZywgcmVnX2ltbShzLCBMU1IsIGwpKTsgIC8vIGNvbXBvbmVudCA9IHBhY2tlZCA+PiBsOworICAgIH0gZWxzZSBpZiAoIWwgJiYgaXNWYWxpZEltbWVkaWF0ZShtYXNrKSkgeworICAgICAgICBBTkQoQUwsIDAsIGQucmVnLCBzLCBpbW0obWFzaykpOyAgICAgICAgLy8gY29tcG9uZW50ID0gcGFja2VkICYgbWFzazsKKyAgICB9IGVsc2UgaWYgKCFsICYmIGlzVmFsaWRJbW1lZGlhdGUofm1hc2spKSB7CisgICAgICAgIEJJQyhBTCwgMCwgZC5yZWcsIHMsIGltbSh+bWFzaykpOyAgICAgICAvLyBjb21wb25lbnQgPSBwYWNrZWQgJiBtYXNrOworICAgIH0gZWxzZSB7CisgICAgICAgIFVCRlgoQUwsIGQucmVnLCBzLCBsLCBtYXNrTGVuKTsgICAgICAgICAvLyBjb21wb25lbnQgPSAocGFja2VkICYgbWFzaykgPj4gbDsKKyAgICB9CisjZWxzZQogICAgIGlmIChoICE9IGJpdHMpIHsKICAgICAgICAgY29uc3QgaW50IG1hc2sgPSAoKDE8PG1hc2tMZW4pLTEpIDw8IGw7CiAgICAgICAgIGlmIChpc1ZhbGlkSW1tZWRpYXRlKG1hc2spKSB7CkBAIC0xMzIsNiArMTQ5LDcgQEAKICAgICBpZiAocyAhPSBkLnJlZykgewogICAgICAgICBNT1YoQUwsIDAsIGQucmVnLCBzKTsKICAgICB9CisjZW5kaWYKIAogICAgIGQucyA9IG1hc2tMZW47CiB9CmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29sMzJjYjE2YmxlbmQuUyBiL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCmluZGV4IDE0NTBiZGUuLjE4MzEyNTUgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCkBAIC0xLDIwICsxLDE5IEBACiAvKiBsaWJzL3BpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCi0qKgotKiogKEMpIENPUFlSSUdIVCAyMDA5IEFSTSBMaW1pdGVkLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qKgotKi8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiAgICAgLnRleHQKICAgICAuYWxpZ24KZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZF9uZW9uLlMgYi9saWJwaXhlbGZsaW5nZXIvY29sMzJjYjE2YmxlbmRfbmVvbi5TCmluZGV4IDE3YjBkMDEuLmNiZDU0ZDEgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZF9uZW9uLlMKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kX25lb24uUwpAQCAtMSwyMCArMSwyMCBAQAogLyogbGlicy9waXhlbGZsaW5nZXIvY29sMzJjYjE2YmxlbmRfbmVvbi5TCi0qKgotKiogKEMpIENPUFlSSUdIVCAyMDA5IEFSTSBMaW1pdGVkLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qKgotKi8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiAKICAgICAudGV4dAogICAgIC5hbGlnbgpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL3Jhc3Rlci5jcHAgYi9saWJwaXhlbGZsaW5nZXIvcmFzdGVyLmNwcAppbmRleCBkNzUxMjAyLi4zMmIyYTk3IDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvcmFzdGVyLmNwcAorKysgYi9saWJwaXhlbGZsaW5nZXIvcmFzdGVyLmNwcApAQCAtMTQzLDcgKzE0Myw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1HR0xpbnQgZ2dsQml0Qmx0aShHR0xDb250ZXh0KiBjb24sIGludCB0bXUsIEdHTGludCBjcm9wWzRdLCBHR0xpbnQgd2hlcmVbNF0pCitHR0xpbnQgZ2dsQml0QmxpdChHR0xDb250ZXh0KiBjb24sIGludCB0bXUsIEdHTGludCBjcm9wWzRdLCBHR0xpbnQgd2hlcmVbNF0pCiB7CiAgICAgR0dMX0NPTlRFWFQoYywgKHZvaWQqKWNvbik7CiAKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9zY2FubGluZS5jcHAgYi9saWJwaXhlbGZsaW5nZXIvc2NhbmxpbmUuY3BwCmluZGV4IGEyZjQzZWIuLjhmYmExNDcgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9zY2FubGluZS5jcHAKKysrIGIvbGlicGl4ZWxmbGluZ2VyL3NjYW5saW5lLmNwcApAQCAtMSw2ICsxLDYgQEAKIC8qIGxpYnMvcGl4ZWxmbGluZ2VyL3NjYW5saW5lLmNwcAogKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKiBDb3B5cmlnaHQgMjAwNi0yMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgogKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKQEAgLTU3LDYgKzU3LDExIEBACiAKICNkZWZpbmUgREVCVUdfX0NPREVHRU5fT05MWSAgICAgMAogCisvKiBTZXQgdG8gMSB0byBkdW1wIHRvIHRoZSBsb2cgdGhlIHN0YXRlcyB0aGF0IG5lZWQgYSBuZXcKKyAqIGNvZGUtZ2VuZXJhdGVkIHNjYW5saW5lIGNhbGxiYWNrLCBpLmUuIHRob3NlIHRoYXQgZG9uJ3QKKyAqIGhhdmUgYSBjb3JyZXNwb25kaW5nIHNob3J0Y3V0IGZ1bmN0aW9uLgorICovCisjZGVmaW5lIERFQlVHX05FRURTICAwCiAKICNkZWZpbmUgQVNTRU1CTFlfU0NSQVRDSF9TSVpFICAgMjA0OAogCkBAIC03OSw4ICs4NCwyMSBAQAogc3RhdGljIHZvaWQgc2NhbmxpbmVfcGVyc3BlY3RpdmUoY29udGV4dF90KiBjKTsKIHN0YXRpYyB2b2lkIHNjYW5saW5lX3BlcnNwZWN0aXZlX3NpbmdsZShjb250ZXh0X3QqIGMpOwogc3RhdGljIHZvaWQgc2NhbmxpbmVfdDMyY2IxNmJsZW5kKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2YmxlbmRfZGl0aGVyKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2YmxlbmRfc3JjYShjb250ZXh0X3QqIGMpOworc3RhdGljIHZvaWQgc2NhbmxpbmVfdDMyY2IxNmJsZW5kX2NsYW1wKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2YmxlbmRfY2xhbXBfZGl0aGVyKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2YmxlbmRfY2xhbXBfbW9kKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV94MzJjYjE2YmxlbmRfY2xhbXBfbW9kKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2YmxlbmRfY2xhbXBfbW9kX2RpdGhlcihjb250ZXh0X3QqIGMpOworc3RhdGljIHZvaWQgc2NhbmxpbmVfeDMyY2IxNmJsZW5kX2NsYW1wX21vZF9kaXRoZXIoY29udGV4dF90KiBjKTsKIHN0YXRpYyB2b2lkIHNjYW5saW5lX3QzMmNiMTYoY29udGV4dF90KiBjKTsKK3N0YXRpYyB2b2lkIHNjYW5saW5lX3QzMmNiMTZfZGl0aGVyKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2X2NsYW1wKGNvbnRleHRfdCogYyk7CitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2X2NsYW1wX2RpdGhlcihjb250ZXh0X3QqIGMpOwogc3RhdGljIHZvaWQgc2NhbmxpbmVfY29sMzJjYjE2YmxlbmQoY29udGV4dF90KiBjKTsKK3N0YXRpYyB2b2lkIHNjYW5saW5lX3QxNmNiMTZfY2xhbXAoY29udGV4dF90KiBjKTsKK3N0YXRpYyB2b2lkIHNjYW5saW5lX3QxNmNiMTZibGVuZF9jbGFtcF9tb2QoY29udGV4dF90KiBjKTsKIHN0YXRpYyB2b2lkIHNjYW5saW5lX21lbWNweShjb250ZXh0X3QqIGMpOwogc3RhdGljIHZvaWQgc2NhbmxpbmVfbWVtc2V0OChjb250ZXh0X3QqIGMpOwogc3RhdGljIHZvaWQgc2NhbmxpbmVfbWVtc2V0MTYoY29udGV4dF90KiBjKTsKQEAgLTk5LDYgKzExNywxMyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgIGNvbnZlcnRBYmdyODg4OFRvUmdiNTY1KHVpbnQzMl90ICBwaXgpCit7CisgICAgcmV0dXJuIHVpbnQxNl90KCAoKHBpeCA8PCA4KSAmIDB4ZjgwMCkgfAorICAgICAgICAgICAgICAgICAgICAgICgocGl4ID4+IDUpICYgMHgwN2UwKSB8CisgICAgICAgICAgICAgICAgICAgICAgKChwaXggPj4gMTkpICYgMHgwMDFmKSApOworfQorCiBzdHJ1Y3Qgc2hvcnRjdXRfdCB7CiAgICAgbmVlZHNfZmlsdGVyX3QgIGZpbHRlcjsKICAgICBjb25zdCBjaGFyKiAgICAgZGVzYzsKQEAgLTEwNywxMyArMTMyLDk1IEBACiB9OwogCiAvLyBLZWVwIGluIHN5bmMgd2l0aCBuZWVkcworCisvKiBUbyB1bmRlcnN0YW5kIHRoZSB2YWx1ZXMgaGVyZSwgaGF2ZSBhIGxvb2sgYXQ6CisgKiAgICAgc3lzdGVtL2NvcmUvaW5jbHVkZS9wcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oCisgKgorICogRXNwZWNpYWxseSB0aGUgbGluZXMgZGVmaW5pbmcgYW5kIHVzaW5nIEdHTF9SRVNFUlZFX05FRURTCisgKgorICogUXVpY2sgcmVtaW5kZXJzOgorICogICAtIHRoZSBsYXN0IG5pYmJsZSBvZiB0aGUgZmlyc3QgdmFsdWUgaXMgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBmb3JtYXQuCisgKiAgIC0gdGhlIGxhc3QgbmliYmxlIG9mIHRoZSB0aGlyZCB2YWx1ZSBpcyB0aGUgc291cmNlIHRleHR1cmUgZm9ybWF0CisgKiAgIC0gZm9ybWF0czogND1yZ2I1NjUgMT1hYmdyODg4OCAyPXhiZ3I4ODg4CisgKgorICogSW4gdGhlIGRlc2NyaXB0aW9ucyBiZWxvdzoKKyAqCisgKiAgIFNSQyAgICAgIG1lYW5zIHdlIGNvcHkgdGhlIHNvdXJjZSBwaXhlbHMgdG8gdGhlIGRlc3RpbmF0aW9uCisgKgorICogICBTUkNfT1ZFUiBtZWFucyB3ZSBibGVuZCB0aGUgc291cmNlIHBpeGVscyB0byB0aGUgZGVzdGluYXRpb24KKyAqICAgICAgICAgICAgd2l0aCBkc3RGYWN0b3IgPSAxLXNyY0EsIHNyY0ZhY3Rvcj0xICAocHJlbXVsdGlwbGllZCBzb3VyY2UpLgorICogICAgICAgICAgICBUaGlzIG1vZGUgaXMgb3RoZXJ3aXNlIGNhbGxlZCAnYmxlbmQnLgorICoKKyAqICAgU1JDQV9PVkVSIG1lYW5zIHdlIGJsZW5kIHRoZSBzb3VyY2UgcGl4ZWxzIHRvIHRoZSBkZXN0aW5hdGlvbgorICogICAgICAgICAgICAgd2l0aCBkc3RGYWN0b3I9c3JjQSooMS1zcmNBKSBzcmNGYWN0b3I9c3JjQSAobm9uLXByZW11bCBzb3VyY2UpLgorICogICAgICAgICAgICAgVGhpcyBtb2RlIGlzIG90aGVyd2lzZSBjYWxsZWQgJ2JsZW5kX3NyY2EnCisgKgorICogICBjbGFtcCAgICBtZWFucyB3ZSBmZXRjaCBzb3VyY2UgcGl4ZWxzIGZyb20gYSB0ZXh0dXJlIHdpdGggdS92IGNsYW1waW5nCisgKgorICogICBtb2QgICAgICBtZWFucyB0aGUgc291cmNlIHBpeGVscyBhcmUgbW9kdWxhdGVkIChtdWx0aXBsaWVkKSBieSB0aGUKKyAqICAgICAgICAgICAgYS9yL2cvYiBvZiB0aGUgY3VycmVudCBjb250ZXh0J3MgY29sb3IuIFR5cGljYWxseSB1c2VkIGZvcgorICogICAgICAgICAgICBmYWRlLWluIC8gZmFkZS1vdXQuCisgKgorICogICBkaXRoZXIgICBtZWFucyB3ZSBkaXRoZXIgMzIgYml0IHZhbHVlcyB0byAxNiBiaXRzCisgKi8KIHN0YXRpYyBzaG9ydGN1dF90IHNob3J0Y3V0c1tdID0gewogICAgIHsgeyB7IDB4MDM1MTUxMDQsIDB4MDAwMDAwNzcsIHsgMHgwMDAwMEEwMSwgMHgwMDAwMDAwMCB9IH0sCiAgICAgICAgIHsgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgeyAweEZGRkZGRkZGLCAweDAwMDAwMDNGIH0gfSB9LAotICAgICAgICAiNTY1IGZiLCA4ODg4IHR4LCBibGVuZCIsIHNjYW5saW5lX3QzMmNiMTZibGVuZCwgaW5pdF95X25vb3AgfSwKKyAgICAgICAgIjU2NSBmYiwgODg4OCB0eCwgYmxlbmQgU1JDX09WRVIiLCBzY2FubGluZV90MzJjYjE2YmxlbmQsIGluaXRfeV9ub29wIH0sCiAgICAgeyB7IHsgMHgwMzAxMDEwNCwgMHgwMDAwMDA3NywgeyAweDAwMDAwQTAxLCAweDAwMDAwMDAwIH0gfSwKICAgICAgICAgeyAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCB7IDB4RkZGRkZGRkYsIDB4MDAwMDAwM0YgfSB9IH0sCi0gICAgICAgICI1NjUgZmIsIDg4ODggdHgiLCBzY2FubGluZV90MzJjYjE2LCBpbml0X3lfbm9vcCAgfSwgIAorICAgICAgICAiNTY1IGZiLCA4ODg4IHR4LCBTUkMiLCBzY2FubGluZV90MzJjYjE2LCBpbml0X3lfbm9vcCAgfSwKKyAgICAvKiBzYW1lIGFzIGZpcnN0IGVudHJ5LCBidXQgd2l0aCBkaXRoZXJpbmcgKi8KKyAgICB7IHsgeyAweDAzNTE1MTA0LCAweDAwMDAwMTc3LCB7IDB4MDAwMDBBMDEsIDB4MDAwMDAwMDAgfSB9LAorICAgICAgICB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIHsgMHhGRkZGRkZGRiwgMHgwMDAwMDAzRiB9IH0gfSwKKyAgICAgICAgIjU2NSBmYiwgODg4OCB0eCwgYmxlbmQgU1JDX09WRVIgZGl0aGVyIiwgc2NhbmxpbmVfdDMyY2IxNmJsZW5kX2RpdGhlciwgaW5pdF95X25vb3AgfSwKKyAgICAvKiBzYW1lIGFzIHNlY29uZCBlbnRyeSwgYnV0IHdpdGggZGl0aGVyaW5nICovCisgICAgeyB7IHsgMHgwMzAxMDEwNCwgMHgwMDAwMDE3NywgeyAweDAwMDAwQTAxLCAweDAwMDAwMDAwIH0gfSwKKyAgICAgICAgeyAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCB7IDB4RkZGRkZGRkYsIDB4MDAwMDAwM0YgfSB9IH0sCisgICAgICAgICI1NjUgZmIsIDg4ODggdHgsIFNSQyBkaXRoZXIiLCBzY2FubGluZV90MzJjYjE2X2RpdGhlciwgaW5pdF95X25vb3AgIH0sCisgICAgLyogdGhpcyBpcyB1c2VkIGR1cmluZyB0aGUgYm9vdCBhbmltYXRpb24gLSBDSEVBVDogaWdub3JlIGRpdGhlcmluZyAqLworICAgIHsgeyB7IDB4MDM1NDU0MDQsIDB4MDAwMDAwNzcsIHsgMHgwMDAwMEEwMSwgMHgwMDAwMDAwMCB9IH0sCisgICAgICAgIHsgMHhGRkZGRkZGRiwgMHhGRkZGRkVGRiwgeyAweEZGRkZGRkZGLCAweDAwMDAwMDNGIH0gfSB9LAorICAgICAgICAiNTY1IGZiLCA4ODg4IHR4LCBibGVuZCBkc3Q6T05FX01JTlVTX1NSQ0Egc3JjOlNSQ0EiLCBzY2FubGluZV90MzJjYjE2YmxlbmRfc3JjYSwgaW5pdF95X25vb3AgfSwKKyAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGFyYml0cmFyeSB0ZXh0dXJlIGNvb3JkaW5hdGVzICh0aGluayBzY2FsaW5nKSAqLworICAgIHsgeyB7IDB4MDM1MTUxMDQsIDB4MDAwMDAwNzcsIHsgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCB9IH0sCisgICAgICAgIHsgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgeyAweEZGRkZGRkZGLCAweDAwMDAwMDNGIH0gfSB9LAorICAgICAgICAiNTY1IGZiLCA4ODg4IHR4LCBTUkNfT1ZFUiBjbGFtcCIsIHNjYW5saW5lX3QzMmNiMTZibGVuZF9jbGFtcCwgaW5pdF95IH0sCisgICAgeyB7IHsgMHgwMzUxNTEwNCwgMHgwMDAwMDE3NywgeyAweDAwMDAwMDAxLCAweDAwMDAwMDAwIH0gfSwKKyAgICAgICAgeyAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCB7IDB4RkZGRkZGRkYsIDB4MDAwMDAwM0YgfSB9IH0sCisgICAgICAgICI1NjUgZmIsIDg4ODggdHgsIFNSQ19PVkVSIGNsYW1wIGRpdGhlciIsIHNjYW5saW5lX3QzMmNiMTZibGVuZF9jbGFtcF9kaXRoZXIsIGluaXRfeSB9LAorICAgIC8qIGFub3RoZXIgY2FzZSB1c2VkIGR1cmluZyBlbXVsYXRpb24gKi8KKyAgICB7IHsgeyAweDAzNTE1MTA0LCAweDAwMDAwMDc3LCB7IDB4MDAwMDEwMDEsIDB4MDAwMDAwMDAgfSB9LAorICAgICAgICB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIHsgMHhGRkZGRkZGRiwgMHgwMDAwMDAzRiB9IH0gfSwKKyAgICAgICAgIjU2NSBmYiwgODg4OCB0eCwgU1JDX09WRVIgY2xhbXAgbW9kdWxhdGUiLCBzY2FubGluZV90MzJjYjE2YmxlbmRfY2xhbXBfbW9kLCBpbml0X3kgfSwKKyAgICAvKiBhbmQgdGhpcyAqLworICAgIHsgeyB7IDB4MDM1MTUxMDQsIDB4MDAwMDAwNzcsIHsgMHgwMDAwMTAwMiwgMHgwMDAwMDAwMCB9IH0sCisgICAgICAgIHsgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgeyAweEZGRkZGRkZGLCAweDAwMDAwMDNGIH0gfSB9LAorICAgICAgICAiNTY1IGZiLCB4ODg4IHR4LCBTUkNfT1ZFUiBjbGFtcCBtb2R1bGF0ZSIsIHNjYW5saW5lX3gzMmNiMTZibGVuZF9jbGFtcF9tb2QsIGluaXRfeSB9LAorICAgIHsgeyB7IDB4MDM1MTUxMDQsIDB4MDAwMDAxNzcsIHsgMHgwMDAwMTAwMSwgMHgwMDAwMDAwMCB9IH0sCisgICAgICAgIHsgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgeyAweEZGRkZGRkZGLCAweDAwMDAwMDNGIH0gfSB9LAorICAgICAgICAiNTY1IGZiLCA4ODg4IHR4LCBTUkNfT1ZFUiBjbGFtcCBtb2R1bGF0ZSBkaXRoZXIiLCBzY2FubGluZV90MzJjYjE2YmxlbmRfY2xhbXBfbW9kX2RpdGhlciwgaW5pdF95IH0sCisgICAgeyB7IHsgMHgwMzUxNTEwNCwgMHgwMDAwMDE3NywgeyAweDAwMDAxMDAyLCAweDAwMDAwMDAwIH0gfSwKKyAgICAgICAgeyAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCB7IDB4RkZGRkZGRkYsIDB4MDAwMDAwM0YgfSB9IH0sCisgICAgICAgICI1NjUgZmIsIHg4ODggdHgsIFNSQ19PVkVSIGNsYW1wIG1vZHVsYXRlIGRpdGhlciIsIHNjYW5saW5lX3gzMmNiMTZibGVuZF9jbGFtcF9tb2RfZGl0aGVyLCBpbml0X3kgfSwKKyAgICB7IHsgeyAweDAzMDEwMTA0LCAweDAwMDAwMDc3LCB7IDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAgfSB9LAorICAgICAgICB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIHsgMHhGRkZGRkZGRiwgMHgwMDAwMDAzRiB9IH0gfSwKKyAgICAgICAgIjU2NSBmYiwgODg4OCB0eCwgU1JDIGNsYW1wIiwgc2NhbmxpbmVfdDMyY2IxNl9jbGFtcCwgaW5pdF95ICB9LAorICAgIHsgeyB7IDB4MDMwMTAxMDQsIDB4MDAwMDAwNzcsIHsgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCB9IH0sCisgICAgICAgIHsgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgeyAweEZGRkZGRkZGLCAweDAwMDAwMDNGIH0gfSB9LAorICAgICAgICAiNTY1IGZiLCB4ODg4IHR4LCBTUkMgY2xhbXAiLCBzY2FubGluZV90MzJjYjE2X2NsYW1wLCBpbml0X3kgIH0sCisgICAgeyB7IHsgMHgwMzAxMDEwNCwgMHgwMDAwMDE3NywgeyAweDAwMDAwMDAxLCAweDAwMDAwMDAwIH0gfSwKKyAgICAgICAgeyAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCB7IDB4RkZGRkZGRkYsIDB4MDAwMDAwM0YgfSB9IH0sCisgICAgICAgICI1NjUgZmIsIDg4ODggdHgsIFNSQyBjbGFtcCBkaXRoZXIiLCBzY2FubGluZV90MzJjYjE2X2NsYW1wX2RpdGhlciwgaW5pdF95ICB9LAorICAgIHsgeyB7IDB4MDMwMTAxMDQsIDB4MDAwMDAxNzcsIHsgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCB9IH0sCisgICAgICAgIHsgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgeyAweEZGRkZGRkZGLCAweDAwMDAwMDNGIH0gfSB9LAorICAgICAgICAiNTY1IGZiLCB4ODg4IHR4LCBTUkMgY2xhbXAgZGl0aGVyIiwgc2NhbmxpbmVfdDMyY2IxNl9jbGFtcF9kaXRoZXIsIGluaXRfeSAgfSwKKyAgICB7IHsgeyAweDAzMDEwMTA0LCAweDAwMDAwMDc3LCB7IDB4MDAwMDAwMDQsIDB4MDAwMDAwMDAgfSB9LAorICAgICAgICB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIHsgMHhGRkZGRkZGRiwgMHgwMDAwMDAzRiB9IH0gfSwKKyAgICAgICAgIjU2NSBmYiwgNTY1IHR4LCBTUkMgY2xhbXAiLCBzY2FubGluZV90MTZjYjE2X2NsYW1wLCBpbml0X3kgIH0sCisgICAgeyB7IHsgMHgwMzUxNTEwNCwgMHgwMDAwMDA3NywgeyAweDAwMDAxMDA0LCAweDAwMDAwMDAwIH0gfSwKKyAgICAgICAgeyAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCB7IDB4RkZGRkZGRkYsIDB4MDAwMDAwM0YgfSB9IH0sCisgICAgICAgICI1NjUgZmIsIDU2NSB0eCwgU1JDX09WRVIgY2xhbXAiLCBzY2FubGluZV90MTZjYjE2YmxlbmRfY2xhbXBfbW9kLCBpbml0X3kgIH0sCiAgICAgeyB7IHsgMHgwMzUxNTEwNCwgMHgwMDAwMDA3NywgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKICAgICAgICAgeyAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYgfSB9IH0sCiAgICAgICAgICI1NjUgZmIsIDg4ODggZml4ZWQgY29sb3IiLCBzY2FubGluZV9jb2wzMmNiMTZibGVuZCwgaW5pdF95X3BhY2tlZCAgfSwgIApAQCAtMjQzLDYgKzM1MCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisjaWZkZWYgREVCVUdfTkVFRFMKKyAgICBMT0dJKCJOZWVkczogbj0weCUwOHggcD0weCUwOHggdDA9MHglMDh4IHQxPTB4JTA4eCIsCisgICAgICAgICBjLT5zdGF0ZS5uZWVkcy5uLCBjLT5zdGF0ZS5uZWVkcy5wLAorICAgICAgICAgYy0+c3RhdGUubmVlZHMudFswXSwgYy0+c3RhdGUubmVlZHMudFsxXSk7CisjZW5kaWYKKwogI2VuZGlmIC8vIERFQlVHX19DT0RFR0VOX09OTFkKIAogICAgIGMtPmluaXRfeSA9IGluaXRfeTsKQEAgLTc5Nyw2ICs5MTAsNjc4IEBACiAjcHJhZ21hIG1hcmsgU2NhbmxpbmUKICNlbmRpZgogCisvKiBVc2VkIHRvIHBhcnNlIGEgMzItYml0IHNvdXJjZSB0ZXh0dXJlIGxpbmVhcmx5LiBVc2FnZSBpczoKKyAqCisgKiBob3J6X2l0ZXJhdG9yMzIgIGhpKGNvbnRleHQpOworICogd2hpbGUgKC4uLikgeworICogICAgdWludDMyX3QgIHNyY19waXhlbCA9IGhpLmdldF9waXhlbDMyKCk7CisgKiAgICAuLi4KKyAqIH0KKyAqCisgKiBVc2Ugb25seSBmb3Igb25lLXRvLW9uZSB0ZXh0dXJlIG1hcHBpbmcuCisgKi8KK3N0cnVjdCBob3J6X2l0ZXJhdG9yMzIgeworICAgIGhvcnpfaXRlcmF0b3IzMihjb250ZXh0X3QqIGMpIHsKKyAgICAgICAgY29uc3QgaW50IHggPSBjLT5pdGVyYXRvcnMueGw7CisgICAgICAgIGNvbnN0IGludCB5ID0gYy0+aXRlcmF0b3JzLnk7CisgICAgICAgIHRleHR1cmVfdCYgdHggPSBjLT5zdGF0ZS50ZXh0dXJlWzBdOworICAgICAgICBjb25zdCBpbnQzMl90IHUgPSAodHguc2hhZGUuaXMwPj4xNikgKyB4OworICAgICAgICBjb25zdCBpbnQzMl90IHYgPSAodHguc2hhZGUuaXQwPj4xNikgKyB5OworICAgICAgICBtX3NyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPih0eC5zdXJmYWNlLmRhdGEpKyh1Kyh0eC5zdXJmYWNlLnN0cmlkZSp2KSk7CisgICAgfQorICAgIHVpbnQzMl90ICBnZXRfcGl4ZWwzMigpIHsKKyAgICAgICAgcmV0dXJuICptX3NyYysrOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICB1aW50MzJfdCogbV9zcmM7Cit9OworCisvKiBBIHZhcmlhbnQgZm9yIDE2LWJpdCBzb3VyY2UgdGV4dHVyZXMuICovCitzdHJ1Y3QgaG9yel9pdGVyYXRvcjE2IHsKKyAgICBob3J6X2l0ZXJhdG9yMTYoY29udGV4dF90KiBjKSB7CisgICAgICAgIGNvbnN0IGludCB4ID0gYy0+aXRlcmF0b3JzLnhsOworICAgICAgICBjb25zdCBpbnQgeSA9IGMtPml0ZXJhdG9ycy55OworICAgICAgICB0ZXh0dXJlX3QmIHR4ID0gYy0+c3RhdGUudGV4dHVyZVswXTsKKyAgICAgICAgY29uc3QgaW50MzJfdCB1ID0gKHR4LnNoYWRlLmlzMD4+MTYpICsgeDsKKyAgICAgICAgY29uc3QgaW50MzJfdCB2ID0gKHR4LnNoYWRlLml0MD4+MTYpICsgeTsKKyAgICAgICAgbV9zcmMgPSByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4odHguc3VyZmFjZS5kYXRhKSsodSsodHguc3VyZmFjZS5zdHJpZGUqdikpOworICAgIH0KKyAgICB1aW50MTZfdCAgZ2V0X3BpeGVsMTYoKSB7CisgICAgICAgIHJldHVybiAqbV9zcmMrKzsKKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgdWludDE2X3QqIG1fc3JjOworfTsKKworLyogQSBjbGFtcCBpdGVyYXRvciBpcyB1c2VkIHRvIGl0ZXJhdGUgaW5zaWRlIGEgdGV4dHVyZSB3aXRoIEdHTF9DTEFNUC4KKyAqIEFmdGVyIGluaXRpYWxpemF0aW9uLCBjYWxsIGdldF9zcmMxNigpIG9yIGdldF9zcmMzMigpIHRvIGdldCB0aGUgY3VycmVudAorICogdGV4dHVyZSBwaXhlbCB2YWx1ZS4KKyAqLworc3RydWN0IGNsYW1wX2l0ZXJhdG9yIHsKKyAgICBjbGFtcF9pdGVyYXRvcihjb250ZXh0X3QqIGMpIHsKKyAgICAgICAgY29uc3QgaW50IHhzID0gYy0+aXRlcmF0b3JzLnhsOworICAgICAgICB0ZXh0dXJlX3QmIHR4ID0gYy0+c3RhdGUudGV4dHVyZVswXTsKKyAgICAgICAgdGV4dHVyZV9pdGVyYXRvcnNfdCYgdGkgPSB0eC5pdGVyYXRvcnM7CisgICAgICAgIG1fcyA9ICh4cyAqIHRpLmRzZHgpICsgdGkueWRzZHk7CisgICAgICAgIG1fdCA9ICh4cyAqIHRpLmR0ZHgpICsgdGkueWR0ZHk7CisgICAgICAgIG1fZHMgPSB0aS5kc2R4OworICAgICAgICBtX2R0ID0gdGkuZHRkeDsKKyAgICAgICAgbV93aWR0aF9tMSA9IHR4LnN1cmZhY2Uud2lkdGggLSAxOworICAgICAgICBtX2hlaWdodF9tMSA9IHR4LnN1cmZhY2UuaGVpZ2h0IC0gMTsKKyAgICAgICAgbV9kYXRhID0gdHguc3VyZmFjZS5kYXRhOworICAgICAgICBtX3N0cmlkZSA9IHR4LnN1cmZhY2Uuc3RyaWRlOworICAgIH0KKyAgICB1aW50MTZfdCBnZXRfcGl4ZWwxNigpIHsKKyAgICAgICAgaW50ICB1LCB2OworICAgICAgICBnZXRfdXYodSwgdik7CisgICAgICAgIHVpbnQxNl90KiBzcmMgPSByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4obV9kYXRhKSArICh1ICsgKG1fc3RyaWRlKnYpKTsKKyAgICAgICAgcmV0dXJuIHNyY1swXTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0X3BpeGVsMzIoKSB7CisgICAgICAgIGludCAgdSwgdjsKKyAgICAgICAgZ2V0X3V2KHUsIHYpOworICAgICAgICB1aW50MzJfdCogc3JjID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KG1fZGF0YSkgKyAodSArIChtX3N0cmlkZSp2KSk7CisgICAgICAgIHJldHVybiBzcmNbMF07CisgICAgfQorcHJpdmF0ZToKKyAgICB2b2lkICAgZ2V0X3V2KGludCYgdSwgaW50JiB2KSB7CisgICAgICAgIGludCAgdXUgPSBtX3MgPj4gMTY7CisgICAgICAgIGludCAgdnYgPSBtX3QgPj4gMTY7CisgICAgICAgIGlmICh1dSA8IDApCisgICAgICAgICAgICB1dSA9IDA7CisgICAgICAgIGlmICh1dSA+IG1fd2lkdGhfbTEpCisgICAgICAgICAgICB1dSA9IG1fd2lkdGhfbTE7CisgICAgICAgIGlmICh2diA8IDApCisgICAgICAgICAgICB2diA9IDA7CisgICAgICAgIGlmICh2diA+IG1faGVpZ2h0X20xKQorICAgICAgICAgICAgdnYgPSBtX2hlaWdodF9tMTsKKyAgICAgICAgdSA9IHV1OworICAgICAgICB2ID0gdnY7CisgICAgICAgIG1fcyArPSBtX2RzOworICAgICAgICBtX3QgKz0gbV9kdDsKKyAgICB9CisKKyAgICBHR0xmaXhlZCAgbV9zLCBtX3Q7CisgICAgR0dMZml4ZWQgIG1fZHMsIG1fZHQ7CisgICAgaW50ICAgICAgIG1fd2lkdGhfbTEsIG1faGVpZ2h0X20xOworICAgIHVpbnQ4X3QqICBtX2RhdGE7CisgICAgaW50ICAgICAgIG1fc3RyaWRlOworfTsKKworLyoKKyAqIFRoZSAnaG9yaXpvbnRhbCBjbGFtcCBpdGVyYXRvcicgdmFyaWFudCBjb3JyZXNwb25kcyB0byB0aGUgY2FzZSB3aGVyZQorICogdGhlICd2JyBjb29yZGluYXRlIGRvZXNuJ3QgY2hhbmdlLiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBvbmUgbXVsdCBhbmQKKyAqIGV4dHJhIGFkZHMgLyBjaGVja3MgcGVyIHBpeGVscywgaWYgdGhlIGJsZW5kaW5nL3Byb2Nlc3Npbmcgb3BlcmF0aW9uIGFmdGVyCisgKiB0aGlzIGlzIHZlcnkgZmFzdC4KKyAqLworc3RhdGljIGludCBpc19jb250ZXh0X2hvcml6b250YWwoY29uc3QgY29udGV4dF90KiBjKSB7CisgICAgcmV0dXJuIChjLT5zdGF0ZS50ZXh0dXJlWzBdLml0ZXJhdG9ycy5kdGR4ID09IDApOworfQorCitzdHJ1Y3QgaG9yel9jbGFtcF9pdGVyYXRvciB7CisgICAgdWludDE2X3QgIGdldF9waXhlbDE2KCkgeworICAgICAgICBpbnQgIHUgPSBtX3MgPj4gMTY7CisgICAgICAgIG1fcyArPSBtX2RzOworICAgICAgICBpZiAodSA8IDApCisgICAgICAgICAgICB1ID0gMDsKKyAgICAgICAgaWYgKHUgPiBtX3dpZHRoX20xKQorICAgICAgICAgICAgdSA9IG1fd2lkdGhfbTE7CisgICAgICAgIGNvbnN0IHVpbnQxNl90KiBzcmMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4obV9kYXRhKTsKKyAgICAgICAgcmV0dXJuIHNyY1t1XTsKKyAgICB9CisgICAgdWludDMyX3QgIGdldF9waXhlbDMyKCkgeworICAgICAgICBpbnQgIHUgPSBtX3MgPj4gMTY7CisgICAgICAgIG1fcyArPSBtX2RzOworICAgICAgICBpZiAodSA8IDApCisgICAgICAgICAgICB1ID0gMDsKKyAgICAgICAgaWYgKHUgPiBtX3dpZHRoX20xKQorICAgICAgICAgICAgdSA9IG1fd2lkdGhfbTE7CisgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4obV9kYXRhKTsKKyAgICAgICAgcmV0dXJuIHNyY1t1XTsKKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0KGNvbnN0IGNvbnRleHRfdCogYywgaW50IHNoaWZ0KTsKKyAgICBHR0xmaXhlZCAgICAgICBtX3M7CisgICAgR0dMZml4ZWQgICAgICAgbV9kczsKKyAgICBpbnQgICAgICAgICAgICBtX3dpZHRoX20xOworICAgIGNvbnN0IHVpbnQ4X3QqIG1fZGF0YTsKK307CisKK3ZvaWQgaG9yel9jbGFtcF9pdGVyYXRvcjo6aW5pdChjb25zdCBjb250ZXh0X3QqIGMsIGludCBzaGlmdCkKK3sKKyAgICBjb25zdCBpbnQgeHMgPSBjLT5pdGVyYXRvcnMueGw7CisgICAgY29uc3QgdGV4dHVyZV90JiB0eCA9IGMtPnN0YXRlLnRleHR1cmVbMF07CisgICAgY29uc3QgdGV4dHVyZV9pdGVyYXRvcnNfdCYgdGkgPSB0eC5pdGVyYXRvcnM7CisgICAgbV9zID0gKHhzICogdGkuZHNkeCkgKyB0aS55ZHNkeTsKKyAgICBtX2RzID0gdGkuZHNkeDsKKyAgICBtX3dpZHRoX20xID0gdHguc3VyZmFjZS53aWR0aC0xOworICAgIG1fZGF0YSA9IHR4LnN1cmZhY2UuZGF0YTsKKworICAgIEdHTGZpeGVkIHQgPSAoeHMgKiB0aS5kdGR4KSArIHRpLnlkdGR5OworICAgIGludCAgICAgIHYgPSB0ID4+IDE2OworICAgIGlmICh2IDwgMCkKKyAgICAgICAgdiA9IDA7CisgICAgZWxzZSBpZiAodiA+PSAoaW50KXR4LnN1cmZhY2UuaGVpZ2h0KQorICAgICAgICB2ID0gKGludCl0eC5zdXJmYWNlLmhlaWdodC0xOworCisgICAgbV9kYXRhICs9ICh0eC5zdXJmYWNlLnN0cmlkZSp2KSA8PCBzaGlmdDsKK30KKworc3RydWN0IGhvcnpfY2xhbXBfaXRlcmF0b3IxNiA6IGhvcnpfY2xhbXBfaXRlcmF0b3IgeworICAgIGhvcnpfY2xhbXBfaXRlcmF0b3IxNihjb25zdCBjb250ZXh0X3QqIGMpIHsKKyAgICAgICAgaW5pdChjLDEpOworICAgIH07Cit9OworCitzdHJ1Y3QgaG9yel9jbGFtcF9pdGVyYXRvcjMyIDogaG9yel9jbGFtcF9pdGVyYXRvciB7CisgICAgaG9yel9jbGFtcF9pdGVyYXRvcjMyKGNvbnRleHRfdCogYykgeworICAgICAgICBpbml0KGMsMik7CisgICAgfTsKK307CisKKy8qIFRoaXMgaXMgdXNlZCB0byBwZXJmb3JtIGRpdGhlcmluZyBvcGVyYXRpb25zLgorICovCitzdHJ1Y3QgZGl0aGVyZXIgeworICAgIGRpdGhlcmVyKGNvbnN0IGNvbnRleHRfdCogYykgeworICAgICAgICBjb25zdCBpbnQgeCA9IGMtPml0ZXJhdG9ycy54bDsKKyAgICAgICAgY29uc3QgaW50IHkgPSBjLT5pdGVyYXRvcnMueTsKKyAgICAgICAgbV9saW5lID0gJmMtPmRpdGhlck1hdHJpeFsgKCh5ICYgR0dMX0RJVEhFUl9NQVNLKTw8R0dMX0RJVEhFUl9PUkRFUl9TSElGVCkgXTsKKyAgICAgICAgbV9pbmRleCA9IHggJiBHR0xfRElUSEVSX01BU0s7CisgICAgfQorICAgIHZvaWQgc3RlcCh2b2lkKSB7CisgICAgICAgIG1faW5kZXgrKzsKKyAgICB9CisgICAgaW50ICBnZXRfdmFsdWUodm9pZCkgeworICAgICAgICBpbnQgcmV0ID0gbV9saW5lW21faW5kZXggJiBHR0xfRElUSEVSX01BU0tdOworICAgICAgICBtX2luZGV4Kys7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHVpbnQxNl90IGFiZ3I4ODg4VG9SZ2I1NjUodWludDMyX3QgcykgeworICAgICAgICB1aW50MzJfdCByID0gcyAmIDB4ZmY7CisgICAgICAgIHVpbnQzMl90IGcgPSAocyA+PiA4KSAmIDB4ZmY7CisgICAgICAgIHVpbnQzMl90IGIgPSAocyA+PiAxNikgJiAweGZmOworICAgICAgICByZXR1cm4gcmdiODg4VG9SZ2I1NjUocixnLGIpOworICAgIH0KKyAgICAvKiBUaGUgZm9sbG93aW5nIGFzc3VtZXMgdGhhdCByL2cvYiBhcmUgaW4gdGhlIDAuLjI1NSByYW5nZSBlYWNoICovCisgICAgdWludDE2X3QgcmdiODg4VG9SZ2I1NjUodWludDMyX3QmIHIsIHVpbnQzMl90JiBnLCB1aW50MzJfdCAmYikgeworICAgICAgICBpbnQgdGhyZXNob2xkID0gZ2V0X3ZhbHVlKCk7CisgICAgICAgIC8qIGRpdGhlciBpbiBvbiBHR0xfRElUSEVSX0JJVFMsIGFuZCBlYWNoIG9mIHIsIGcsIGIgaXMgb24gOCBiaXRzICovCisgICAgICAgIHIgKz0gKHRocmVzaG9sZCA+PiAoR0dMX0RJVEhFUl9CSVRTLTggKzUpKTsKKyAgICAgICAgZyArPSAodGhyZXNob2xkID4+IChHR0xfRElUSEVSX0JJVFMtOCArNikpOworICAgICAgICBiICs9ICh0aHJlc2hvbGQgPj4gKEdHTF9ESVRIRVJfQklUUy04ICs1KSk7CisgICAgICAgIGlmIChyID4gMHhmZikKKyAgICAgICAgICAgIHIgPSAweGZmOworICAgICAgICBpZiAoZyA+IDB4ZmYpCisgICAgICAgICAgICBnID0gMHhmZjsKKyAgICAgICAgaWYgKGIgPiAweGZmKQorICAgICAgICAgICAgYiA9IDB4ZmY7CisgICAgICAgIHJldHVybiB1aW50MTZfdCgoKHIgJiAweGY4KSA8PCA4KSB8ICgoZyAmIDB4ZmMpIDw8IDMpIHwgKGIgPj4gMykpOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBjb25zdCB1aW50OF90KiBtX2xpbmU7CisgICAgaW50ICAgICAgICAgICAgbV9pbmRleDsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gYmxlbmQgKFNSQ19PVkVSKSAzMi1iaXQgc291cmNlIHBpeGVscworICogb250byAxNi1iaXQgZGVzdGluYXRpb24gb25lcy4gVXNhZ2UgaXMgc2ltcGx5OgorICoKKyAqICAgYmxlbmRlci5ibGVuZCg8MzItYml0LXNyYy1waXhlbC12YWx1ZT4sPHB0ci10by0xNi1iaXQtZGVzdC1waXhlbD4pCisgKi8KK3N0cnVjdCBibGVuZGVyXzMydG8xNiB7CisgICAgYmxlbmRlcl8zMnRvMTYoY29udGV4dF90KiBjKSB7IH0KKyAgICB2b2lkIHdyaXRlKHVpbnQzMl90IHMsIHVpbnQxNl90KiBkc3QpIHsKKyAgICAgICAgaWYgKHMgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcyA9IEdHTF9SR0JBX1RPX0hPU1Qocyk7CisgICAgICAgIGludCBzQSA9IChzPj4yNCk7CisgICAgICAgIGlmIChzQSA9PSAweGZmKSB7CisgICAgICAgICAgICAqZHN0ID0gY29udmVydEFiZ3I4ODg4VG9SZ2I1NjUocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZiA9IDB4MTAwIC0gKHNBICsgKHNBPj43KSk7CisgICAgICAgICAgICBpbnQgc1IgPSAocyA+PiAoICAgMykpJjB4MUY7CisgICAgICAgICAgICBpbnQgc0cgPSAocyA+PiAoIDgrMikpJjB4M0Y7CisgICAgICAgICAgICBpbnQgc0IgPSAocyA+PiAoMTYrMykpJjB4MUY7CisgICAgICAgICAgICB1aW50MTZfdCBkID0gKmRzdDsKKyAgICAgICAgICAgIGludCBkUiA9IChkPj4xMSkmMHgxZjsKKyAgICAgICAgICAgIGludCBkRyA9IChkPj41KSYweDNmOworICAgICAgICAgICAgaW50IGRCID0gKGQpJjB4MWY7CisgICAgICAgICAgICBzUiArPSAoZipkUik+Pjg7CisgICAgICAgICAgICBzRyArPSAoZipkRyk+Pjg7CisgICAgICAgICAgICBzQiArPSAoZipkQik+Pjg7CisgICAgICAgICAgICAqZHN0ID0gdWludDE2X3QoKHNSPDwxMSl8KHNHPDw1KXxzQik7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB3cml0ZSh1aW50MzJfdCBzLCB1aW50MTZfdCogZHN0LCBkaXRoZXJlciYgZGkpIHsKKyAgICAgICAgaWYgKHMgPT0gMCkgeworICAgICAgICAgICAgZGkuc3RlcCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHMgPSBHR0xfUkdCQV9UT19IT1NUKHMpOworICAgICAgICBpbnQgc0EgPSAocz4+MjQpOworICAgICAgICBpZiAoc0EgPT0gMHhmZikgeworICAgICAgICAgICAgKmRzdCA9IGRpLmFiZ3I4ODg4VG9SZ2I1NjUocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgdGhyZXNob2xkID0gZGkuZ2V0X3ZhbHVlKCkgPDwgKDggLSBHR0xfRElUSEVSX0JJVFMpOworICAgICAgICAgICAgaW50IGYgPSAweDEwMCAtIChzQSArIChzQT4+NykpOworICAgICAgICAgICAgaW50IHNSID0gKHMgPj4gKCAgIDMpKSYweDFGOworICAgICAgICAgICAgaW50IHNHID0gKHMgPj4gKCA4KzIpKSYweDNGOworICAgICAgICAgICAgaW50IHNCID0gKHMgPj4gKDE2KzMpKSYweDFGOworICAgICAgICAgICAgdWludDE2X3QgZCA9ICpkc3Q7CisgICAgICAgICAgICBpbnQgZFIgPSAoZD4+MTEpJjB4MWY7CisgICAgICAgICAgICBpbnQgZEcgPSAoZD4+NSkmMHgzZjsKKyAgICAgICAgICAgIGludCBkQiA9IChkKSYweDFmOworICAgICAgICAgICAgc1IgPSAoKHNSIDw8IDgpICsgZipkUiArIHRocmVzaG9sZCk+Pjg7CisgICAgICAgICAgICBzRyA9ICgoc0cgPDwgOCkgKyBmKmRHICsgdGhyZXNob2xkKT4+ODsKKyAgICAgICAgICAgIHNCID0gKChzQiA8PCA4KSArIGYqZEIgKyB0aHJlc2hvbGQpPj44OworICAgICAgICAgICAgaWYgKHNSID4gMHgxZikgc1IgPSAweDFmOworICAgICAgICAgICAgaWYgKHNHID4gMHgzZikgc0cgPSAweDNmOworICAgICAgICAgICAgaWYgKHNCID4gMHgxZikgc0IgPSAweDFmOworICAgICAgICAgICAgKmRzdCA9IHVpbnQxNl90KChzUjw8MTEpfChzRzw8NSl8c0IpOworICAgICAgICB9CisgICAgfQorfTsKKworLyogVGhpcyBibGVuZGVyIGRvZXMgdGhlIHNhbWUgZm9yIHRoZSAnYmxlbmRfc3JjYScgb3BlcmF0aW9uLgorICogd2hlcmUgZHN0RmFjdG9yPXNyY0EqKDEtc3JjQSkgc3JjRmFjdG9yPXNyY0EKKyAqLworc3RydWN0IGJsZW5kZXJfMzJ0bzE2X3NyY0EgeworICAgIGJsZW5kZXJfMzJ0bzE2X3NyY0EoY29uc3QgY29udGV4dF90KiBjKSB7IH0KKyAgICB2b2lkIHdyaXRlKHVpbnQzMl90IHMsIHVpbnQxNl90KiBkc3QpIHsKKyAgICAgICAgaWYgKCFzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdWludDE2X3QgZCA9ICpkc3Q7CisgICAgICAgIHMgPSBHR0xfUkdCQV9UT19IT1NUKHMpOworICAgICAgICBpbnQgc1IgPSAocyA+PiAoICAgMykpJjB4MUY7CisgICAgICAgIGludCBzRyA9IChzID4+ICggOCsyKSkmMHgzRjsKKyAgICAgICAgaW50IHNCID0gKHMgPj4gKDE2KzMpKSYweDFGOworICAgICAgICBpbnQgc0EgPSAocz4+MjQpOworICAgICAgICBpbnQgZjEgPSAoc0EgKyAoc0E+PjcpKTsKKyAgICAgICAgaW50IGYyID0gMHgxMDAtZjE7CisgICAgICAgIGludCBkUiA9IChkPj4xMSkmMHgxZjsKKyAgICAgICAgaW50IGRHID0gKGQ+PjUpJjB4M2Y7CisgICAgICAgIGludCBkQiA9IChkKSYweDFmOworICAgICAgICBzUiA9IChmMSpzUiArIGYyKmRSKT4+ODsKKyAgICAgICAgc0cgPSAoZjEqc0cgKyBmMipkRyk+Pjg7CisgICAgICAgIHNCID0gKGYxKnNCICsgZjIqZEIpPj44OworICAgICAgICAqZHN0ID0gdWludDE2X3QoKHNSPDwxMSl8KHNHPDw1KXxzQik7CisgICAgfQorfTsKKworLyogQ29tbW9uIGluaXQgY29kZSB0aGUgbW9kdWxhdGluZyBibGVuZGVycyAqLworc3RydWN0IGJsZW5kZXJfbW9kdWxhdGUgeworICAgIHZvaWQgaW5pdChjb25zdCBjb250ZXh0X3QqIGMpIHsKKyAgICAgICAgY29uc3QgaW50IHIgPSBjLT5pdGVyYXRvcnMueWRyZHkgPj4gKEdHTF9DT0xPUl9CSVRTLTgpOworICAgICAgICBjb25zdCBpbnQgZyA9IGMtPml0ZXJhdG9ycy55ZGdkeSA+PiAoR0dMX0NPTE9SX0JJVFMtOCk7CisgICAgICAgIGNvbnN0IGludCBiID0gYy0+aXRlcmF0b3JzLnlkYmR5ID4+IChHR0xfQ09MT1JfQklUUy04KTsKKyAgICAgICAgY29uc3QgaW50IGEgPSBjLT5pdGVyYXRvcnMueWRhZHkgPj4gKEdHTF9DT0xPUl9CSVRTLTgpOworICAgICAgICBtX3IgPSByICsgKHIgPj4gNyk7CisgICAgICAgIG1fZyA9IGcgKyAoZyA+PiA3KTsKKyAgICAgICAgbV9iID0gYiArIChiID4+IDcpOworICAgICAgICBtX2EgPSBhICsgKGEgPj4gNyk7CisgICAgfQorcHJvdGVjdGVkOgorICAgIGludCBtX3IsIG1fZywgbV9iLCBtX2E7Cit9OworCisvKiBUaGlzIGJsZW5kZXIgZG9lcyBhIG5vcm1hbCBibGVuZCBhZnRlciBtb2R1bGF0aW9uLgorICovCitzdHJ1Y3QgYmxlbmRlcl8zMnRvMTZfbW9kdWxhdGUgOiBibGVuZGVyX21vZHVsYXRlIHsKKyAgICBibGVuZGVyXzMydG8xNl9tb2R1bGF0ZShjb25zdCBjb250ZXh0X3QqIGMpIHsKKyAgICAgICAgaW5pdChjKTsKKyAgICB9CisgICAgdm9pZCB3cml0ZSh1aW50MzJfdCBzLCB1aW50MTZfdCogZHN0KSB7CisgICAgICAgIC8vIGJsZW5kIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAgICAgICAgaWYgKCFzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcyA9IEdHTF9SR0JBX1RPX0hPU1Qocyk7CisKKyAgICAgICAgLyogV2UgbmVlZCB0byBtb2R1bGF0ZSBzICovCisgICAgICAgIHVpbnQzMl90ICBzQSA9IChzID4+IDI0KTsKKyAgICAgICAgdWludDMyX3QgIHNCID0gKHMgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgdWludDMyX3QgIHNHID0gKHMgPj4gOCkgJiAweGZmOworICAgICAgICB1aW50MzJfdCAgc1IgPSBzICYgMHhmZjsKKworICAgICAgICBzQSA9IChzQSptX2EpID4+IDg7CisgICAgICAgIC8qIEtlZXAgUi9HL0Igc2NhbGVkIHRvIDUuOCBvciA2LjggZml4ZWQgZmxvYXQgZm9ybWF0ICovCisgICAgICAgIHNSID0gKHNSKm1fcikgPj4gKDggLSA1KTsKKyAgICAgICAgc0cgPSAoc0cqbV9nKSA+PiAoOCAtIDYpOworICAgICAgICBzQiA9IChzQiptX2IpID4+ICg4IC0gNSk7CisKKyAgICAgICAgLyogTm93IGRvIGEgbm9ybWFsIGJsZW5kICovCisgICAgICAgIGludCBmID0gMHgxMDAgLSAoc0EgKyAoc0E+PjcpKTsKKyAgICAgICAgdWludDE2X3QgZCA9ICpkc3Q7CisgICAgICAgIGludCBkUiA9IChkPj4xMSkmMHgxZjsKKyAgICAgICAgaW50IGRHID0gKGQ+PjUpJjB4M2Y7CisgICAgICAgIGludCBkQiA9IChkKSYweDFmOworICAgICAgICBzUiA9IChzUiArIGYqZFIpPj44OworICAgICAgICBzRyA9IChzRyArIGYqZEcpPj44OworICAgICAgICBzQiA9IChzQiArIGYqZEIpPj44OworICAgICAgICAqZHN0ID0gdWludDE2X3QoKHNSPDwxMSl8KHNHPDw1KXxzQik7CisgICAgfQorICAgIHZvaWQgd3JpdGUodWludDMyX3QgcywgdWludDE2X3QqIGRzdCwgZGl0aGVyZXImIGRpKSB7CisgICAgICAgIC8vIGJsZW5kIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAgICAgICAgaWYgKCFzKSB7CisgICAgICAgICAgICBkaS5zdGVwKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcyA9IEdHTF9SR0JBX1RPX0hPU1Qocyk7CisKKyAgICAgICAgLyogV2UgbmVlZCB0byBtb2R1bGF0ZSBzICovCisgICAgICAgIHVpbnQzMl90ICBzQSA9IChzID4+IDI0KTsKKyAgICAgICAgdWludDMyX3QgIHNCID0gKHMgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgdWludDMyX3QgIHNHID0gKHMgPj4gOCkgJiAweGZmOworICAgICAgICB1aW50MzJfdCAgc1IgPSBzICYgMHhmZjsKKworICAgICAgICBzQSA9IChzQSptX2EpID4+IDg7CisgICAgICAgIC8qIGtlZXAgUi9HL0Igc2NhbGVkIHRvIDUuOCBvciA2LjggZml4ZWQgZmxvYXQgZm9ybWF0ICovCisgICAgICAgIHNSID0gKHNSKm1fcikgPj4gKDggLSA1KTsKKyAgICAgICAgc0cgPSAoc0cqbV9nKSA+PiAoOCAtIDYpOworICAgICAgICBzQiA9IChzQiptX2IpID4+ICg4IC0gNSk7CisKKyAgICAgICAgLyogU2NhbGUgdGhyZXNob2xkIHRvIDAuOCBmaXhlZCBmbG9hdCBmb3JtYXQgKi8KKyAgICAgICAgaW50IHRocmVzaG9sZCA9IGRpLmdldF92YWx1ZSgpIDw8ICg4IC0gR0dMX0RJVEhFUl9CSVRTKTsKKyAgICAgICAgaW50IGYgPSAweDEwMCAtIChzQSArIChzQT4+NykpOworICAgICAgICB1aW50MTZfdCBkID0gKmRzdDsKKyAgICAgICAgaW50IGRSID0gKGQ+PjExKSYweDFmOworICAgICAgICBpbnQgZEcgPSAoZD4+NSkmMHgzZjsKKyAgICAgICAgaW50IGRCID0gKGQpJjB4MWY7CisgICAgICAgIHNSID0gKHNSICsgZipkUiArIHRocmVzaG9sZCk+Pjg7CisgICAgICAgIHNHID0gKHNHICsgZipkRyArIHRocmVzaG9sZCk+Pjg7CisgICAgICAgIHNCID0gKHNCICsgZipkQiArIHRocmVzaG9sZCk+Pjg7CisgICAgICAgIGlmIChzUiA+IDB4MWYpIHNSID0gMHgxZjsKKyAgICAgICAgaWYgKHNHID4gMHgzZikgc0cgPSAweDNmOworICAgICAgICBpZiAoc0IgPiAweDFmKSBzQiA9IDB4MWY7CisgICAgICAgICpkc3QgPSB1aW50MTZfdCgoc1I8PDExKXwoc0c8PDUpfHNCKTsKKyAgICB9Cit9OworCisvKiBzYW1lIGFzIDMydG8xNl9tb2R1bGF0ZSwgZXhjZXB0IHRoYXQgdGhlIGlucHV0IGlzIHhSR0IsIGluc3RlYWQgb2YgQVJHQiAqLworc3RydWN0IGJsZW5kZXJfeDMydG8xNl9tb2R1bGF0ZSA6IGJsZW5kZXJfbW9kdWxhdGUgeworICAgIGJsZW5kZXJfeDMydG8xNl9tb2R1bGF0ZShjb25zdCBjb250ZXh0X3QqIGMpIHsKKyAgICAgICAgaW5pdChjKTsKKyAgICB9CisgICAgdm9pZCB3cml0ZSh1aW50MzJfdCBzLCB1aW50MTZfdCogZHN0KSB7CisgICAgICAgIHMgPSBHR0xfUkdCQV9UT19IT1NUKHMpOworCisgICAgICAgIHVpbnQzMl90ICBzQiA9IChzID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIHVpbnQzMl90ICBzRyA9IChzID4+IDgpICYgMHhmZjsKKyAgICAgICAgdWludDMyX3QgIHNSID0gcyAmIDB4ZmY7CisKKyAgICAgICAgLyogS2VlcCBSL0cvQiBpbiA1Ljggb3IgNi44IGZvcm1hdCAqLworICAgICAgICBzUiA9IChzUiptX3IpID4+ICg4IC0gNSk7CisgICAgICAgIHNHID0gKHNHKm1fZykgPj4gKDggLSA2KTsKKyAgICAgICAgc0IgPSAoc0IqbV9iKSA+PiAoOCAtIDUpOworCisgICAgICAgIGludCBmID0gMHgxMDAgLSBtX2E7CisgICAgICAgIHVpbnQxNl90IGQgPSAqZHN0OworICAgICAgICBpbnQgZFIgPSAoZD4+MTEpJjB4MWY7CisgICAgICAgIGludCBkRyA9IChkPj41KSYweDNmOworICAgICAgICBpbnQgZEIgPSAoZCkmMHgxZjsKKyAgICAgICAgc1IgPSAoc1IgKyBmKmRSKT4+ODsKKyAgICAgICAgc0cgPSAoc0cgKyBmKmRHKT4+ODsKKyAgICAgICAgc0IgPSAoc0IgKyBmKmRCKT4+ODsKKyAgICAgICAgKmRzdCA9IHVpbnQxNl90KChzUjw8MTEpfChzRzw8NSl8c0IpOworICAgIH0KKyAgICB2b2lkIHdyaXRlKHVpbnQzMl90IHMsIHVpbnQxNl90KiBkc3QsIGRpdGhlcmVyJiBkaSkgeworICAgICAgICBzID0gR0dMX1JHQkFfVE9fSE9TVChzKTsKKworICAgICAgICB1aW50MzJfdCAgc0IgPSAocyA+PiAxNikgJiAweGZmOworICAgICAgICB1aW50MzJfdCAgc0cgPSAocyA+PiA4KSAmIDB4ZmY7CisgICAgICAgIHVpbnQzMl90ICBzUiA9IHMgJiAweGZmOworCisgICAgICAgIHNSID0gKHNSKm1fcikgPj4gKDggLSA1KTsKKyAgICAgICAgc0cgPSAoc0cqbV9nKSA+PiAoOCAtIDYpOworICAgICAgICBzQiA9IChzQiptX2IpID4+ICg4IC0gNSk7CisKKyAgICAgICAgLyogTm93IGRvIGEgbm9ybWFsIGJsZW5kICovCisgICAgICAgIGludCB0aHJlc2hvbGQgPSBkaS5nZXRfdmFsdWUoKSA8PCAoOCAtIEdHTF9ESVRIRVJfQklUUyk7CisgICAgICAgIGludCBmID0gMHgxMDAgLSBtX2E7CisgICAgICAgIHVpbnQxNl90IGQgPSAqZHN0OworICAgICAgICBpbnQgZFIgPSAoZD4+MTEpJjB4MWY7CisgICAgICAgIGludCBkRyA9IChkPj41KSYweDNmOworICAgICAgICBpbnQgZEIgPSAoZCkmMHgxZjsKKyAgICAgICAgc1IgPSAoc1IgKyBmKmRSICsgdGhyZXNob2xkKT4+ODsKKyAgICAgICAgc0cgPSAoc0cgKyBmKmRHICsgdGhyZXNob2xkKT4+ODsKKyAgICAgICAgc0IgPSAoc0IgKyBmKmRCICsgdGhyZXNob2xkKT4+ODsKKyAgICAgICAgaWYgKHNSID4gMHgxZikgc1IgPSAweDFmOworICAgICAgICBpZiAoc0cgPiAweDNmKSBzRyA9IDB4M2Y7CisgICAgICAgIGlmIChzQiA+IDB4MWYpIHNCID0gMHgxZjsKKyAgICAgICAgKmRzdCA9IHVpbnQxNl90KChzUjw8MTEpfChzRzw8NSl8c0IpOworICAgIH0KK307CisKKy8qIFNhbWUgYXMgYWJvdmUsIGJ1dCBzb3VyY2UgaXMgMTZiaXQgcmdiNTY1ICovCitzdHJ1Y3QgYmxlbmRlcl8xNnRvMTZfbW9kdWxhdGUgOiBibGVuZGVyX21vZHVsYXRlIHsKKyAgICBibGVuZGVyXzE2dG8xNl9tb2R1bGF0ZShjb25zdCBjb250ZXh0X3QqIGMpIHsKKyAgICAgICAgaW5pdChjKTsKKyAgICB9CisgICAgdm9pZCB3cml0ZSh1aW50MTZfdCBzMTYsIHVpbnQxNl90KiBkc3QpIHsKKyAgICAgICAgdWludDMyX3QgIHMgPSBzMTY7CisKKyAgICAgICAgdWludDMyX3QgIHNSID0gcyA+PiAxMTsKKyAgICAgICAgdWludDMyX3QgIHNHID0gKHMgPj4gNSkgJiAweDNmOworICAgICAgICB1aW50MzJfdCAgc0IgPSBzICYgMHgxZjsKKworICAgICAgICBzUiA9IChzUiptX3IpOworICAgICAgICBzRyA9IChzRyptX2cpOworICAgICAgICBzQiA9IChzQiptX2IpOworCisgICAgICAgIGludCBmID0gMHgxMDAgLSBtX2E7CisgICAgICAgIHVpbnQxNl90IGQgPSAqZHN0OworICAgICAgICBpbnQgZFIgPSAoZD4+MTEpJjB4MWY7CisgICAgICAgIGludCBkRyA9IChkPj41KSYweDNmOworICAgICAgICBpbnQgZEIgPSAoZCkmMHgxZjsKKyAgICAgICAgc1IgPSAoc1IgKyBmKmRSKT4+ODsKKyAgICAgICAgc0cgPSAoc0cgKyBmKmRHKT4+ODsKKyAgICAgICAgc0IgPSAoc0IgKyBmKmRCKT4+ODsKKyAgICAgICAgKmRzdCA9IHVpbnQxNl90KChzUjw8MTEpfChzRzw8NSl8c0IpOworICAgIH0KK307CisKKy8qIFRoaXMgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgYSAxNi1iaXQgZGVzdGluYXRpb24gY29sb3IgYnVmZmVyLgorICogVXNhZ2UgaXM6CisgKgorICogICBkc3RfaXRlcmF0b3IxNiAgZGkoY29udGV4dCk7CisgKiAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgKiAgICAgICA8ZG8gc3R1ZmYgd2l0aCBkZXN0IHBpeGVsIGF0IGRpLmRzdD4KKyAqICAgICAgIGRpLmRzdCsrOworICogICB9CisgKi8KK3N0cnVjdCBkc3RfaXRlcmF0b3IxNiB7CisgICAgZHN0X2l0ZXJhdG9yMTYoY29uc3QgY29udGV4dF90KiBjKSB7CisgICAgICAgIGNvbnN0IGludCB4ID0gYy0+aXRlcmF0b3JzLnhsOworICAgICAgICBjb25zdCBpbnQgd2lkdGggPSBjLT5pdGVyYXRvcnMueHIgLSB4OworICAgICAgICBjb25zdCBpbnQzMl90IHkgPSBjLT5pdGVyYXRvcnMueTsKKyAgICAgICAgY29uc3Qgc3VyZmFjZV90KiBjYiA9ICYoYy0+c3RhdGUuYnVmZmVycy5jb2xvcik7CisgICAgICAgIGNvdW50ID0gd2lkdGg7CisgICAgICAgIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihjYi0+ZGF0YSkgKyAoeCsoY2ItPnN0cmlkZSp5KSk7CisgICAgfQorICAgIGludCAgICAgICAgY291bnQ7CisgICAgdWludDE2X3QqICBkc3Q7Cit9OworCisKK3N0YXRpYyB2b2lkIHNjYW5saW5lX3QzMmNiMTZfY2xhbXAoY29udGV4dF90KiBjKQoreworICAgIGRzdF9pdGVyYXRvcjE2ICBkaShjKTsKKworICAgIGlmIChpc19jb250ZXh0X2hvcml6b250YWwoYykpIHsKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBzaW1wbGUgaG9yaXpvbnRhbCBzY2FsaW5nICovCisgICAgICAgIGhvcnpfY2xhbXBfaXRlcmF0b3IzMiBjaShjKTsKKyAgICAgICAgd2hpbGUgKGRpLmNvdW50LS0pIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHMgPSBjaS5nZXRfcGl4ZWwzMigpOworICAgICAgICAgICAgKmRpLmRzdCsrID0gY29udmVydEFiZ3I4ODg4VG9SZ2I1NjUocyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBHZW5lcmFsIGNhc2UgKi8KKyAgICAgICAgY2xhbXBfaXRlcmF0b3IgY2koYyk7CisgICAgICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzID0gY2kuZ2V0X3BpeGVsMzIoKTsKKyAgICAgICAgICAgICpkaS5kc3QrKyA9IGNvbnZlcnRBYmdyODg4OFRvUmdiNTY1KHMpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzY2FubGluZV90MzJjYjE2X2RpdGhlcihjb250ZXh0X3QqIGMpCit7CisgICAgaG9yel9pdGVyYXRvcjMyIHNpKGMpOworICAgIGRzdF9pdGVyYXRvcjE2ICBkaShjKTsKKyAgICBkaXRoZXJlciAgICAgICAgZGl0aGVyKGMpOworCisgICAgd2hpbGUgKGRpLmNvdW50LS0pIHsKKyAgICAgICAgdWludDMyX3QgcyA9IHNpLmdldF9waXhlbDMyKCk7CisgICAgICAgICpkaS5kc3QrKyA9IGRpdGhlci5hYmdyODg4OFRvUmdiNTY1KHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2NhbmxpbmVfdDMyY2IxNl9jbGFtcF9kaXRoZXIoY29udGV4dF90KiBjKQoreworICAgIGRzdF9pdGVyYXRvcjE2ICBkaShjKTsKKyAgICBkaXRoZXJlciAgICAgICAgZGl0aGVyKGMpOworCisgICAgaWYgKGlzX2NvbnRleHRfaG9yaXpvbnRhbChjKSkgeworICAgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIHNpbXBsZSBob3Jpem9udGFsIHNjYWxpbmcgKi8KKyAgICAgICAgaG9yel9jbGFtcF9pdGVyYXRvcjMyIGNpKGMpOworICAgICAgICB3aGlsZSAoZGkuY291bnQtLSkgeworICAgICAgICAgICAgdWludDMyX3QgcyA9IGNpLmdldF9waXhlbDMyKCk7CisgICAgICAgICAgICAqZGkuZHN0KysgPSBkaXRoZXIuYWJncjg4ODhUb1JnYjU2NShzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEdlbmVyYWwgY2FzZSAqLworICAgICAgICBjbGFtcF9pdGVyYXRvciBjaShjKTsKKyAgICAgICAgd2hpbGUgKGRpLmNvdW50LS0pIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHMgPSBjaS5nZXRfcGl4ZWwzMigpOworICAgICAgICAgICAgKmRpLmRzdCsrID0gZGl0aGVyLmFiZ3I4ODg4VG9SZ2I1NjUocyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNjYW5saW5lX3QzMmNiMTZibGVuZF9kaXRoZXIoY29udGV4dF90KiBjKQoreworICAgIGRzdF9pdGVyYXRvcjE2IGRpKGMpOworICAgIGRpdGhlcmVyICAgICAgIGRpdGhlcihjKTsKKyAgICBibGVuZGVyXzMydG8xNiBibChjKTsKKyAgICBob3J6X2l0ZXJhdG9yMzIgIGhpKGMpOworICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgIHVpbnQzMl90IHMgPSBoaS5nZXRfcGl4ZWwzMigpOworICAgICAgICBibC53cml0ZShzLCBkaS5kc3QsIGRpdGhlcik7CisgICAgICAgIGRpLmRzdCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2NhbmxpbmVfdDMyY2IxNmJsZW5kX2NsYW1wKGNvbnRleHRfdCogYykKK3sKKyAgICBkc3RfaXRlcmF0b3IxNiAgZGkoYyk7CisgICAgYmxlbmRlcl8zMnRvMTYgIGJsKGMpOworCisgICAgaWYgKGlzX2NvbnRleHRfaG9yaXpvbnRhbChjKSkgeworICAgICAgICBob3J6X2NsYW1wX2l0ZXJhdG9yMzIgY2koYyk7CisgICAgICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzID0gY2kuZ2V0X3BpeGVsMzIoKTsKKyAgICAgICAgICAgIGJsLndyaXRlKHMsIGRpLmRzdCk7CisgICAgICAgICAgICBkaS5kc3QrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNsYW1wX2l0ZXJhdG9yIGNpKGMpOworICAgICAgICB3aGlsZSAoZGkuY291bnQtLSkgeworICAgICAgICAgICAgdWludDMyX3QgcyA9IGNpLmdldF9waXhlbDMyKCk7CisgICAgICAgICAgICBibC53cml0ZShzLCBkaS5kc3QpOworICAgICAgICAgICAgZGkuZHN0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNjYW5saW5lX3QzMmNiMTZibGVuZF9jbGFtcF9kaXRoZXIoY29udGV4dF90KiBjKQoreworICAgIGRzdF9pdGVyYXRvcjE2IGRpKGMpOworICAgIGRpdGhlcmVyICAgICAgIGRpdGhlcihjKTsKKyAgICBibGVuZGVyXzMydG8xNiBibChjKTsKKworICAgIGNsYW1wX2l0ZXJhdG9yIGNpKGMpOworICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgIHVpbnQzMl90IHMgPSBjaS5nZXRfcGl4ZWwzMigpOworICAgICAgICBibC53cml0ZShzLCBkaS5kc3QsIGRpdGhlcik7CisgICAgICAgIGRpLmRzdCsrOworICAgIH0KK30KKwordm9pZCBzY2FubGluZV90MzJjYjE2YmxlbmRfY2xhbXBfbW9kKGNvbnRleHRfdCogYykKK3sKKyAgICBkc3RfaXRlcmF0b3IxNiBkaShjKTsKKyAgICBibGVuZGVyXzMydG8xNl9tb2R1bGF0ZSBibChjKTsKKworICAgIGNsYW1wX2l0ZXJhdG9yIGNpKGMpOworICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgIHVpbnQzMl90IHMgPSBjaS5nZXRfcGl4ZWwzMigpOworICAgICAgICBibC53cml0ZShzLCBkaS5kc3QpOworICAgICAgICBkaS5kc3QrKzsKKyAgICB9Cit9CisKK3ZvaWQgc2NhbmxpbmVfdDMyY2IxNmJsZW5kX2NsYW1wX21vZF9kaXRoZXIoY29udGV4dF90KiBjKQoreworICAgIGRzdF9pdGVyYXRvcjE2IGRpKGMpOworICAgIGJsZW5kZXJfMzJ0bzE2X21vZHVsYXRlIGJsKGMpOworICAgIGRpdGhlcmVyIGRpdGhlcihjKTsKKworICAgIGNsYW1wX2l0ZXJhdG9yIGNpKGMpOworICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgIHVpbnQzMl90IHMgPSBjaS5nZXRfcGl4ZWwzMigpOworICAgICAgICBibC53cml0ZShzLCBkaS5kc3QsIGRpdGhlcik7CisgICAgICAgIGRpLmRzdCsrOworICAgIH0KK30KKworLyogVmFyaWFudCBvZiBzY2FubGluZV90MzJjYjE2YmxlbmRfY2xhbXBfbW9kIHdpdGggYSB4UkdCIHRleHR1cmUgKi8KK3ZvaWQgc2NhbmxpbmVfeDMyY2IxNmJsZW5kX2NsYW1wX21vZChjb250ZXh0X3QqIGMpCit7CisgICAgZHN0X2l0ZXJhdG9yMTYgZGkoYyk7CisgICAgYmxlbmRlcl94MzJ0bzE2X21vZHVsYXRlICBibChjKTsKKworICAgIGNsYW1wX2l0ZXJhdG9yIGNpKGMpOworICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgIHVpbnQzMl90IHMgPSBjaS5nZXRfcGl4ZWwzMigpOworICAgICAgICBibC53cml0ZShzLCBkaS5kc3QpOworICAgICAgICBkaS5kc3QrKzsKKyAgICB9Cit9CisKK3ZvaWQgc2NhbmxpbmVfeDMyY2IxNmJsZW5kX2NsYW1wX21vZF9kaXRoZXIoY29udGV4dF90KiBjKQoreworICAgIGRzdF9pdGVyYXRvcjE2IGRpKGMpOworICAgIGJsZW5kZXJfeDMydG8xNl9tb2R1bGF0ZSAgYmwoYyk7CisgICAgZGl0aGVyZXIgZGl0aGVyKGMpOworCisgICAgY2xhbXBfaXRlcmF0b3IgY2koYyk7CisgICAgd2hpbGUgKGRpLmNvdW50LS0pIHsKKyAgICAgICAgdWludDMyX3QgcyA9IGNpLmdldF9waXhlbDMyKCk7CisgICAgICAgIGJsLndyaXRlKHMsIGRpLmRzdCwgZGl0aGVyKTsKKyAgICAgICAgZGkuZHN0Kys7CisgICAgfQorfQorCit2b2lkIHNjYW5saW5lX3QxNmNiMTZfY2xhbXAoY29udGV4dF90KiBjKQoreworICAgIGRzdF9pdGVyYXRvcjE2ICBkaShjKTsKKworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3Igc2ltcGxlIGhvcml6b250YWwgc2NhbGluZyAqLworICAgIGlmIChpc19jb250ZXh0X2hvcml6b250YWwoYykpIHsKKyAgICAgICAgaG9yel9jbGFtcF9pdGVyYXRvcjE2IGNpKGMpOworICAgICAgICB3aGlsZSAoZGkuY291bnQtLSkgeworICAgICAgICAgICAgKmRpLmRzdCsrID0gY2kuZ2V0X3BpeGVsMTYoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNsYW1wX2l0ZXJhdG9yIGNpKGMpOworICAgICAgICB3aGlsZSAoZGkuY291bnQtLSkgeworICAgICAgICAgICAgKmRpLmRzdCsrID0gY2kuZ2V0X3BpeGVsMTYoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgogc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCiBUIGludGVycG9sYXRlKGludCB5LCBUIHYwLCBVIGR2ZHgsIFUgZHZkeSkgewpAQCAtMTMyMiwzMCArMjEwNywyNCBAQAogICAgIGlmIChjdD09MSB8fCB1aW50MzJfdChkc3QpJjIpIHsKIGxhc3Rfb25lOgogICAgICAgICBzID0gR0dMX1JHQkFfVE9fSE9TVCggKnNyYysrICk7Ci0gICAgICAgIHNSID0gKHMgPj4gKCAgIDMpKSYweDFGOwotICAgICAgICBzRyA9IChzID4+ICggOCsyKSkmMHgzRjsKLSAgICAgICAgc0IgPSAocyA+PiAoMTYrMykpJjB4MUY7Ci0gICAgICAgICpkc3QrKyA9IHVpbnQxNl90KChzUjw8MTEpfChzRzw8NSl8c0IpOworICAgICAgICAqZHN0KysgPSBjb252ZXJ0QWJncjg4ODhUb1JnYjU2NShzKTsKICAgICAgICAgY3QtLTsKICAgICB9CiAKICAgICB3aGlsZSAoY3QgPj0gMikgewotICAgICAgICBzID0gR0dMX1JHQkFfVE9fSE9TVCggKnNyYysrICk7Ci0gICAgICAgIHNSID0gKHMgPj4gKCAgIDMpKSYweDFGOwotICAgICAgICBzRyA9IChzID4+ICggOCsyKSkmMHgzRjsKLSAgICAgICAgc0IgPSAocyA+PiAoMTYrMykpJjB4MUY7Ci0gICAgICAgIGQgPSAoc1I8PDExKXwoc0c8PDUpfHNCOwotICAgICAgICAKLSAgICAgICAgcyA9IEdHTF9SR0JBX1RPX0hPU1QoICpzcmMrKyApOwotICAgICAgICBzUiA9IChzID4+ICggICAzKSkmMHgxRjsKLSAgICAgICAgc0cgPSAocyA+PiAoIDgrMikpJjB4M0Y7Ci0gICAgICAgIHNCID0gKHMgPj4gKDE2KzMpKSYweDFGOyAgICAgICAgCi0gICAgICAgIGQgfD0gKChzUjw8MTEpfChzRzw8NSl8c0IpPDwxNjsKLQogI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgotICAgICAgICBkID0gKGQ+PjE2KSB8IChkPDwxNik7Ci0jZW5kaWYKKyAgICAgICAgcyA9IEdHTF9SR0JBX1RPX0hPU1QoICpzcmMrKyApOworICAgICAgICBkID0gY29udmVydEFiZ3I4ODg4VG9SZ2I1NjVfaGkxNihzKTsKIAorICAgICAgICBzID0gR0dMX1JHQkFfVE9fSE9TVCggKnNyYysrICk7CisgICAgICAgIGQgfD0gY29udmVydEFiZ3I4ODg4VG9SZ2I1NjUocyk7CisjZWxzZQorICAgICAgICBzID0gR0dMX1JHQkFfVE9fSE9TVCggKnNyYysrICk7CisgICAgICAgIGQgPSBjb252ZXJ0QWJncjg4ODhUb1JnYjU2NShzKTsKKworICAgICAgICBzID0gR0dMX1JHQkFfVE9fSE9TVCggKnNyYysrICk7CisgICAgICAgIGQgfD0gY29udmVydEFiZ3I4ODg4VG9SZ2I1NjUocykgPDwgMTY7CisjZW5kaWYKICAgICAgICAgKmRzdDMyKysgPSBkOwogICAgICAgICBjdCAtPSAyOwogICAgIH0KQEAgLTEzNTcsNiArMjEzNiw3IEBACiAKIHZvaWQgc2NhbmxpbmVfdDMyY2IxNmJsZW5kKGNvbnRleHRfdCogYykKIHsKKyNpZiAoKEFORFJPSURfQ09ERUdFTiA+PSBBTkRST0lEX0NPREVHRU5fQVNNKSAmJiBkZWZpbmVkKF9fYXJtX18pKQogICAgIGludDMyX3QgeCA9IGMtPml0ZXJhdG9ycy54bDsKICAgICBzaXplX3QgY3QgPSBjLT5pdGVyYXRvcnMueHIgLSB4OwogICAgIGludDMyX3QgeSA9IGMtPml0ZXJhdG9ycy55OwpAQCAtMTM2OCwzMyArMjE0OCw1NSBAQAogICAgIGNvbnN0IGludDMyX3QgdiA9IChjLT5zdGF0ZS50ZXh0dXJlWzBdLnNoYWRlLml0MD4+MTYpICsgeTsKICAgICB1aW50MzJfdCAqc3JjID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHRleC0+ZGF0YSkrKHUrKHRleC0+c3RyaWRlKnYpKTsKIAotI2lmICgoQU5EUk9JRF9DT0RFR0VOID49IEFORFJPSURfQ09ERUdFTl9BU00pICYmIGRlZmluZWQoX19hcm1fXykpCiAgICAgc2NhbmxpbmVfdDMyY2IxNmJsZW5kX2FybShkc3QsIHNyYywgY3QpOwogI2Vsc2UKLSAgICB3aGlsZSAoY3QtLSkgewotICAgICAgICB1aW50MzJfdCBzID0gKnNyYysrOwotICAgICAgICBpZiAoIXMpIHsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDE2X3QgZCA9ICpkc3Q7Ci0gICAgICAgIHMgPSBHR0xfUkdCQV9UT19IT1NUKHMpOwotICAgICAgICBpbnQgc1IgPSAocyA+PiAoICAgMykpJjB4MUY7Ci0gICAgICAgIGludCBzRyA9IChzID4+ICggOCsyKSkmMHgzRjsKLSAgICAgICAgaW50IHNCID0gKHMgPj4gKDE2KzMpKSYweDFGOwotICAgICAgICBpbnQgc0EgPSAocz4+MjQpOwotICAgICAgICBpbnQgZiA9IDB4MTAwIC0gKHNBICsgKHNBPj43KSk7Ci0gICAgICAgIGludCBkUiA9IChkPj4xMSkmMHgxZjsKLSAgICAgICAgaW50IGRHID0gKGQ+PjUpJjB4M2Y7Ci0gICAgICAgIGludCBkQiA9IChkKSYweDFmOwotICAgICAgICBzUiArPSAoZipkUik+Pjg7Ci0gICAgICAgIHNHICs9IChmKmRHKT4+ODsKLSAgICAgICAgc0IgKz0gKGYqZEIpPj44OwotICAgICAgICAqZHN0KysgPSB1aW50MTZfdCgoc1I8PDExKXwoc0c8PDUpfHNCKTsKKyAgICBkc3RfaXRlcmF0b3IxNiAgZGkoYyk7CisgICAgaG9yel9pdGVyYXRvcjMyICBoaShjKTsKKyAgICBibGVuZGVyXzMydG8xNiAgYmwoYyk7CisgICAgd2hpbGUgKGRpLmNvdW50LS0pIHsKKyAgICAgICAgdWludDMyX3QgcyA9IGhpLmdldF9waXhlbDMyKCk7CisgICAgICAgIGJsLndyaXRlKHMsIGRpLmRzdCk7CisgICAgICAgIGRpLmRzdCsrOwogICAgIH0KICNlbmRpZgogfQogCit2b2lkIHNjYW5saW5lX3QzMmNiMTZibGVuZF9zcmNhKGNvbnRleHRfdCogYykKK3sKKyAgICBkc3RfaXRlcmF0b3IxNiAgZGkoYyk7CisgICAgaG9yel9pdGVyYXRvcjMyICBoaShjKTsKKyAgICBibGVuZGVyXzMydG8xNl9zcmNBICBibGVuZGVyKGMpOworCisgICAgd2hpbGUgKGRpLmNvdW50LS0pIHsKKyAgICAgICAgdWludDMyX3QgcyA9IGhpLmdldF9waXhlbDMyKCk7CisgICAgICAgIGJsZW5kZXIud3JpdGUocyxkaS5kc3QpOworICAgICAgICBkaS5kc3QrKzsKKyAgICB9Cit9CisKK3ZvaWQgc2NhbmxpbmVfdDE2Y2IxNmJsZW5kX2NsYW1wX21vZChjb250ZXh0X3QqIGMpCit7CisgICAgY29uc3QgaW50IGEgPSBjLT5pdGVyYXRvcnMueWRhZHkgPj4gKEdHTF9DT0xPUl9CSVRTLTgpOworICAgIGlmIChhID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChhID09IDI1NSkgeworICAgICAgICBzY2FubGluZV90MTZjYjE2X2NsYW1wKGMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHN0X2l0ZXJhdG9yMTYgIGRpKGMpOworICAgIGJsZW5kZXJfMTZ0bzE2X21vZHVsYXRlICBibGVuZGVyKGMpOworICAgIGNsYW1wX2l0ZXJhdG9yICBjaShjKTsKKworICAgIHdoaWxlIChkaS5jb3VudC0tKSB7CisgICAgICAgIHVpbnQxNl90IHMgPSBjaS5nZXRfcGl4ZWwxNigpOworICAgICAgICBibGVuZGVyLndyaXRlKHMsIGRpLmRzdCk7CisgICAgICAgIGRpLmRzdCsrOworICAgIH0KK30KKwogdm9pZCBzY2FubGluZV9tZW1jcHkoY29udGV4dF90KiBjKQogewogICAgIGludDMyX3QgeCA9IGMtPml0ZXJhdG9ycy54bDsKQEAgLTE1MTgsMjYgKzIzMjAsMyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci1leHRlcm4gIkMiIHZvaWQgZ2dsX3Rlc3RfY29kZWdlbih1aW50MzJfdCBuLCB1aW50MzJfdCBwLCB1aW50MzJfdCB0MCwgdWludDMyX3QgdDEpCi17Ci0jaWYgQU5EUk9JRF9BUk1fQ09ERUdFTgotICAgIEdHTENvbnRleHQqIGM7Ci0gICAgZ2dsSW5pdCgmYyk7Ci0gICAgbmVlZHNfdCBuZWVkczsKLSAgICBuZWVkcy5uID0gbjsKLSAgICBuZWVkcy5wID0gcDsKLSAgICBuZWVkcy50WzBdID0gdDA7Ci0gICAgbmVlZHMudFsxXSA9IHQxOwotICAgIHNwPFNjYW5saW5lQXNzZW1ibHk+IGEobmV3IFNjYW5saW5lQXNzZW1ibHkobmVlZHMsIEFTU0VNQkxZX1NDUkFUQ0hfU0laRSkpOwotICAgIEdHTEFzc2VtYmxlciBhc3NlbWJsZXIoIG5ldyBBUk1Bc3NlbWJsZXIoYSkgKTsKLSAgICBpbnQgZXJyID0gYXNzZW1ibGVyLnNjYW5saW5lKG5lZWRzLCAoY29udGV4dF90KiljKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgcHJpbnRmKCJlcnJvciAlMDh4ICglcylcbiIsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgIH0KLSAgICBnZ2xVbmluaXQoYyk7Ci0jZWxzZQotICAgIHByaW50ZigiVGhpcyB0ZXN0IHJ1bnMgb25seSBvbiBBUk1cbiIpOwotI2VuZGlmCi19Ci0KZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL0FuZHJvaWQubWsgYi9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9BbmRyb2lkLm1rCmluZGV4IDFiYzQyMTQuLmFhMzIwZmMgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL0FuZHJvaWQubWsKKysrIGIvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vQW5kcm9pZC5tawpAQCAtMiwxMiArMiwxNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLQljb2RlZ2VuLmNwcAorCWNvZGVnZW4uY3BwLmFybQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJjdXRpbHMgXAogICAgIGxpYnBpeGVsZmxpbmdlcgogCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwlzeXN0ZW0vY29yZS9saWJwaXhlbGZsaW5nZXIKKwogTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtY29kZWdlbgogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vY29kZWdlbi5jcHAgYi9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9jb2RlZ2VuLmNwcAppbmRleCAxODY1ODg4Li45NGUyNDgxIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9jb2RlZ2VuLmNwcAorKysgYi9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9jb2RlZ2VuLmNwcApAQCAtMSw5ICsxLDU0IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotZXh0ZXJuICJDIiB2b2lkIGdnbF90ZXN0X2NvZGVnZW4oCi0gICAgICAgIHVpbnQzMl90IG4sIHVpbnQzMl90IHAsIHVpbnQzMl90IHQwLCB1aW50MzJfdCB0MSk7CisjaW5jbHVkZSAicHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaCIKIAorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgInNjYW5saW5lLmgiCisKKyNpbmNsdWRlICJjb2RlZmxpbmdlci9Db2RlQ2FjaGUuaCIKKyNpbmNsdWRlICJjb2RlZmxpbmdlci9HR0xBc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJjb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXIuaCIKKworI2lmIGRlZmluZWQoX19hcm1fXykKKyMgICBkZWZpbmUgQU5EUk9JRF9BUk1fQ09ERUdFTiAgMQorI2Vsc2UKKyMgICBkZWZpbmUgQU5EUk9JRF9BUk1fQ09ERUdFTiAgMAorI2VuZGlmCisKKyNkZWZpbmUgQVNTRU1CTFlfU0NSQVRDSF9TSVpFICAgMjA0OAorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgU2NhbmxpbmVBc3NlbWJseSA6IHB1YmxpYyBBc3NlbWJseSB7CisgICAgQXNzZW1ibHlLZXk8bmVlZHNfdD4gbUtleTsKK3B1YmxpYzoKKyAgICBTY2FubGluZUFzc2VtYmx5KG5lZWRzX3QgbmVlZHMsIHNpemVfdCBzaXplKQorICAgICAgICA6IEFzc2VtYmx5KHNpemUpLCBtS2V5KG5lZWRzKSB7IH0KKyAgICBjb25zdCBBc3NlbWJseUtleTxuZWVkc190PiYga2V5KCkgY29uc3QgeyByZXR1cm4gbUtleTsgfQorfTsKKworc3RhdGljIHZvaWQgZ2dsX3Rlc3RfY29kZWdlbih1aW50MzJfdCBuLCB1aW50MzJfdCBwLCB1aW50MzJfdCB0MCwgdWludDMyX3QgdDEpCit7CisjaWYgQU5EUk9JRF9BUk1fQ09ERUdFTgorICAgIEdHTENvbnRleHQqIGM7CisgICAgZ2dsSW5pdCgmYyk7CisgICAgbmVlZHNfdCBuZWVkczsKKyAgICBuZWVkcy5uID0gbjsKKyAgICBuZWVkcy5wID0gcDsKKyAgICBuZWVkcy50WzBdID0gdDA7CisgICAgbmVlZHMudFsxXSA9IHQxOworICAgIHNwPFNjYW5saW5lQXNzZW1ibHk+IGEobmV3IFNjYW5saW5lQXNzZW1ibHkobmVlZHMsIEFTU0VNQkxZX1NDUkFUQ0hfU0laRSkpOworICAgIEdHTEFzc2VtYmxlciBhc3NlbWJsZXIoIG5ldyBBUk1Bc3NlbWJsZXIoYSkgKTsKKyAgICBpbnQgZXJyID0gYXNzZW1ibGVyLnNjYW5saW5lKG5lZWRzLCAoY29udGV4dF90KiljKTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgcHJpbnRmKCJlcnJvciAlMDh4ICglcylcbiIsIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgIH0KKyAgICBnZ2xVbmluaXQoYyk7CisjZWxzZQorICAgIHByaW50ZigiVGhpcyB0ZXN0IHJ1bnMgb25seSBvbiBBUk1cbiIpOworI2VuZGlmCit9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKIHsKZGlmZiAtLWdpdCBhL2xpYnN5c3V0aWxzL0FuZHJvaWQubWsgYi9saWJzeXN1dGlscy9BbmRyb2lkLm1rCmluZGV4IGRkMmIzMmQuLjNiMWY2MTggMTAwNjQ0Ci0tLSBhL2xpYnN5c3V0aWxzL0FuZHJvaWQubWsKKysrIGIvbGlic3lzdXRpbHMvQW5kcm9pZC5tawpAQCAtMSwzICsxLDQgQEAKK2lmbmVxICgkKEJVSUxEX1RJTllfQU5EUk9JRCksdHJ1ZSkKIEJVSUxEX0xJQlNZU1VUSUxTIDo9IGZhbHNlCiBpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogICAgIEJVSUxEX0xJQlNZU1VUSUxTIDo9IHRydWUKQEAgLTMzLDMgKzM0LDQgQEAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9zcmMvRnJhbWV3b3JrQ2xpZW50LmNwcCBiL2xpYnN5c3V0aWxzL3NyYy9GcmFtZXdvcmtDbGllbnQuY3BwCmluZGV4IDU2MmRkNjcuLjJmMzcwNTUgMTAwNjQ0Ci0tLSBhL2xpYnN5c3V0aWxzL3NyYy9GcmFtZXdvcmtDbGllbnQuY3BwCisrKyBiL2xpYnN5c3V0aWxzL3NyYy9GcmFtZXdvcmtDbGllbnQuY3BwCkBAIC0xNCwxMyArMTQsMTUgQEAKIH0KIAogaW50IEZyYW1ld29ya0NsaWVudDo6c2VuZE1zZyhjb25zdCBjaGFyICptc2cpIHsKKyAgICBpbnQgcmV0OwogICAgIGlmIChtU29ja2V0IDwgMCkgewogICAgICAgICBlcnJubyA9IEVIT1NUVU5SRUFDSDsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVdyaXRlTXV0ZXgpOwotICAgIGlmICh3cml0ZShtU29ja2V0LCBtc2csIHN0cmxlbihtc2cpICsxKSA8IDApIHsKKyAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUobVNvY2tldCwgbXNnLCBzdHJsZW4obXNnKSArMSkpOworICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIFNMT0dXKCJVbmFibGUgdG8gc2VuZCBtc2cgJyVzJyAoJXMpIiwgbXNnLCBzdHJlcnJvcihlcnJubykpOwogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbVdyaXRlTXV0ZXgpOwpAQCAtMjgsMTMgKzMwLDEzIEBACiB9CiAKIGludCBGcmFtZXdvcmtDbGllbnQ6OnNlbmRNc2coY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICpkYXRhKSB7Ci0gICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgYWxsb2NhKHN0cmxlbihtc2cpICsgc3RybGVuKGRhdGEpICsgMSk7CisgICAgc2l6ZV90IGJ1ZmZsZW4gPSBzdHJsZW4obXNnKSArIHN0cmxlbihkYXRhKSArIDE7CisgICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgYWxsb2NhKGJ1ZmZsZW4pOwogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIGVycm5vID0gLUVOT01FTTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBzdHJjcHkoYnVmZmVyLCBtc2cpOwotICAgIHN0cmNhdChidWZmZXIsIGRhdGEpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgYnVmZmxlbiwgIiVzJXMiLCBtc2csIGRhdGEpOwogICAgIHJldHVybiBzZW5kTXNnKGJ1ZmZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnN5c3V0aWxzL3NyYy9GcmFtZXdvcmtMaXN0ZW5lci5jcHAgYi9saWJzeXN1dGlscy9zcmMvRnJhbWV3b3JrTGlzdGVuZXIuY3BwCmluZGV4IDY0MGI2ZGYuLjM0MTZjZWIgMTAwNjQ0Ci0tLSBhL2xpYnN5c3V0aWxzL3NyYy9GcmFtZXdvcmtMaXN0ZW5lci5jcHAKKysrIGIvbGlic3lzdXRpbHMvc3JjL0ZyYW1ld29ya0xpc3RlbmVyLmNwcApAQCAtMTUsNiArMTUsNyBAQAogICovCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KIAogI2RlZmluZSBMT0dfVEFHICJGcmFtZXdvcmtMaXN0ZW5lciIKIApAQCAtMzMsNyArMzQsOCBAQAogICAgIGNoYXIgYnVmZmVyWzI1NV07CiAgICAgaW50IGxlbjsKIAotICAgIGlmICgobGVuID0gcmVhZChjLT5nZXRTb2NrZXQoKSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtMSkpIDwgMCkgeworICAgIGxlbiA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGMtPmdldFNvY2tldCgpLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSk7CisgICAgaWYgKGxlbiA8IDApIHsKICAgICAgICAgU0xPR0UoInJlYWQoKSBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgaWYgKCFsZW4pCkBAIC00NCw2ICs0Niw3IEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBJTVBPUlRBTlQ6IGRpc3BhdGNoQ29tbWFuZCgpIGV4cGVjdHMgYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nICovCiAgICAgICAgICAgICBkaXNwYXRjaENvbW1hbmQoYywgYnVmZmVyICsgb2Zmc2V0KTsKICAgICAgICAgICAgIG9mZnNldCA9IGkgKyAxOwogICAgICAgICB9CkBAIC02Miw2ICs2NSw3IEBACiAgICAgY2hhciB0bXBbMjU1XTsKICAgICBjaGFyICpwID0gZGF0YTsKICAgICBjaGFyICpxID0gdG1wOworICAgIGNoYXIgKnFsaW1pdCA9IHRtcCArIHNpemVvZih0bXApIC0gMTsKICAgICBib29sIGVzYyA9IGZhbHNlOwogICAgIGJvb2wgcXVvdGUgPSBmYWxzZTsKICAgICBpbnQgazsKQEAgLTcxLDYgKzc1LDggQEAKICAgICB3aGlsZSgqcCkgewogICAgICAgICBpZiAoKnAgPT0gJ1xcJykgewogICAgICAgICAgICAgaWYgKGVzYykgeworICAgICAgICAgICAgICAgIGlmIChxID49IHFsaW1pdCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKICAgICAgICAgICAgICAgICAqcSsrID0gJ1xcJzsKICAgICAgICAgICAgICAgICBlc2MgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZQpAQCAtNzgsMTEgKzg0LDE1IEBACiAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIGlmIChlc2MpIHsKLSAgICAgICAgICAgIGlmICgqcCA9PSAnIicpCisgICAgICAgICAgICBpZiAoKnAgPT0gJyInKSB7CisgICAgICAgICAgICAgICAgaWYgKHEgPj0gcWxpbWl0KQorICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwogICAgICAgICAgICAgICAgICpxKysgPSAnIic7Ci0gICAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnXFwnKQorICAgICAgICAgICAgfSBlbHNlIGlmICgqcCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgaWYgKHEgPj0gcWxpbWl0KQorICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwogICAgICAgICAgICAgICAgICpxKysgPSAnXFwnOwotICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNsaS0+c2VuZE1zZyg1MDAsICJVbnN1cHBvcnRlZCBlc2NhcGUgc2VxdWVuY2UiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgICAgICB9CkBAIC0xMDAsOSArMTEwLDEzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChxID49IHFsaW1pdCkKKyAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7CiAgICAgICAgICpxID0gKnArKzsKICAgICAgICAgaWYgKCFxdW90ZSAmJiAqcSA9PSAnICcpIHsKICAgICAgICAgICAgICpxID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChhcmdjID49IENNRF9BUkdTX01BWCkKKyAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwogICAgICAgICAgICAgYXJndlthcmdjKytdID0gc3RyZHVwKHRtcCk7CiAgICAgICAgICAgICBtZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7CiAgICAgICAgICAgICBxID0gdG1wOwpAQCAtMTExLDYgKzEyNSw5IEBACiAgICAgICAgIHErKzsKICAgICB9CiAKKyAgICAqcSA9ICdcMCc7CisgICAgaWYgKGFyZ2MgPj0gQ01EX0FSR1NfTUFYKQorICAgICAgICBnb3RvIG92ZXJmbG93OwogICAgIGFyZ3ZbYXJnYysrXSA9IHN0cmR1cCh0bXApOwogI2lmIDAKICAgICBmb3IgKGsgPSAwOyBrIDwgYXJnYzsgaysrKSB7CkBAIC0xMjIsNyArMTM5LDcgQEAKICAgICAgICAgY2xpLT5zZW5kTXNnKDUwMCwgIlVuY2xvc2VkIHF1b3RlcyBlcnJvciIsIGZhbHNlKTsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQotICAgIAorCiAgICAgZm9yIChpID0gbUNvbW1hbmRzLT5iZWdpbigpOyBpICE9IG1Db21tYW5kcy0+ZW5kKCk7ICsraSkgewogICAgICAgICBGcmFtZXdvcmtDb21tYW5kICpjID0gKmk7CiAKQEAgLTE0MCw0ICsxNTcsOCBAQAogICAgIGZvciAoaiA9IDA7IGogPCBhcmdjOyBqKyspCiAgICAgICAgIGZyZWUoYXJndltqXSk7CiAgICAgcmV0dXJuOworCitvdmVyZmxvdzoKKyAgICBjbGktPnNlbmRNc2coNTAwLCAiQ29tbWFuZCB0b28gbG9uZyIsIGZhbHNlKTsKKyAgICBnb3RvIG91dDsKIH0KZGlmZiAtLWdpdCBhL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rRXZlbnQuY3BwIGIvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtFdmVudC5jcHAKaW5kZXggYzJiYTY0Ny4uYzhkM2IxZiAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtFdmVudC5jcHAKKysrIGIvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtFdmVudC5jcHAKQEAgLTU2LDUwICs1Niw3OSBAQAogICAgIH0KIH0KIAorLyogSWYgdGhlIHN0cmluZyBiZXR3ZWVuICdzdHInIGFuZCAnZW5kJyBiZWdpbnMgd2l0aCAncHJlZml4bGVuJyBjaGFyYWN0ZXJzCisgKiBmcm9tIHRoZSAncHJlZml4JyBhcnJheSwgdGhlbiByZXR1cm4gJ3N0ciArIHByZWZpeGxlbicsIG90aGVyd2lzZSByZXR1cm4KKyAqIE5VTEwuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKgoraGFzX3ByZWZpeChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGVuZCwgY29uc3QgY2hhciogcHJlZml4LCBzaXplX3QgcHJlZml4bGVuKQoreworICAgIGlmICgoZW5kLXN0cikgPj0gKHB0cmRpZmZfdClwcmVmaXhsZW4gJiYgIW1lbWNtcChzdHIsIHByZWZpeCwgcHJlZml4bGVuKSkKKyAgICAgICAgcmV0dXJuIHN0ciArIHByZWZpeGxlbjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCisvKiBTYW1lIGFzIHN0cmxlbih4KSBmb3IgY29uc3RhbnQgc3RyaW5nIGxpdGVyYWxzIE9OTFkgKi8KKyNkZWZpbmUgQ09OU1RfU1RSTEVOKHgpICAoc2l6ZW9mKHgpLTEpCisKKy8qIENvbnZlbmllbmNlIG1hY3JvIHRvIGNhbGwgaGFzX3ByZWZpeCB3aXRoIGEgY29uc3RhbnQgc3RyaW5nIGxpdGVyYWwgICovCisjZGVmaW5lIEhBU19DT05TVF9QUkVGSVgoc3RyLGVuZCxwcmVmaXgpICBoYXNfcHJlZml4KChzdHIpLChlbmQpLHByZWZpeCxDT05TVF9TVFJMRU4ocHJlZml4KSkKKworCiBib29sIE5ldGxpbmtFdmVudDo6ZGVjb2RlKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpIHsKLSAgICBjaGFyICpzID0gYnVmZmVyOwotICAgIGNoYXIgKmVuZDsKKyAgICBjb25zdCBjaGFyICpzID0gYnVmZmVyOworICAgIGNvbnN0IGNoYXIgKmVuZDsKICAgICBpbnQgcGFyYW1faWR4ID0gMDsKICAgICBpbnQgaTsKICAgICBpbnQgZmlyc3QgPSAxOwogCisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLyogRW5zdXJlIHRoZSBidWZmZXIgaXMgemVyby10ZXJtaW5hdGVkLCB0aGUgY29kZSBiZWxvdyBkZXBlbmRzIG9uIHRoaXMgKi8KKyAgICBidWZmZXJbc2l6ZS0xXSA9ICdcMCc7CisKICAgICBlbmQgPSBzICsgc2l6ZTsKICAgICB3aGlsZSAocyA8IGVuZCkgewogICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgIGNoYXIgKnA7Ci0gICAgICAgICAgICBmb3IgKHAgPSBzOyAqcCAhPSAnQCc7IHArKyk7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICBtUGF0aCA9IHN0cmR1cChwKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgICAgICAgICAvKiBidWZmZXIgaXMgMC10ZXJtaW5hdGVkLCBubyBuZWVkIHRvIGNoZWNrIHAgPCBlbmQgKi8KKyAgICAgICAgICAgIGZvciAocCA9IHM7ICpwICE9ICdAJzsgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEqcCkgeyAvKiBubyAnQCcsIHNob3VsZCBub3QgaGFwcGVuICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGF0aCA9IHN0cmR1cChwKzEpOwogICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFzdHJuY21wKHMsICJBQ1RJT049Iiwgc3RybGVuKCJBQ1RJT049IikpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqYSA9IHMgKyBzdHJsZW4oIkFDVElPTj0iKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGE7CisgICAgICAgICAgICBpZiAoKGEgPSBIQVNfQ09OU1RfUFJFRklYKHMsIGVuZCwgIkFDVElPTj0iKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGEsICJhZGQiKSkKICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbiA9IE5sQWN0aW9uQWRkOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYSwgInJlbW92ZSIpKQogICAgICAgICAgICAgICAgICAgICBtQWN0aW9uID0gTmxBY3Rpb25SZW1vdmU7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhLCAiY2hhbmdlIikpCiAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb24gPSBObEFjdGlvbkNoYW5nZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAocywgIlNFUU5VTT0iLCBzdHJsZW4oIlNFUU5VTT0iKSkpCi0gICAgICAgICAgICAgICAgbVNlcSA9IGF0b2kocyArIHN0cmxlbigiU0VRTlVNPSIpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKHMsICJTVUJTWVNURU09Iiwgc3RybGVuKCJTVUJTWVNURU09IikpKQotICAgICAgICAgICAgICAgIG1TdWJzeXN0ZW0gPSBzdHJkdXAocyArIHN0cmxlbigiU1VCU1lTVEVNPSIpKTsKLSAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGEgPSBIQVNfQ09OU1RfUFJFRklYKHMsIGVuZCwgIlNFUU5VTT0iKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1TZXEgPSBhdG9pKGEpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYSA9IEhBU19DT05TVF9QUkVGSVgocywgZW5kLCAiU1VCU1lTVEVNPSIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVN1YnN5c3RlbSA9IHN0cmR1cChhKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1faWR4IDwgTkxfUEFSQU1TX01BWCkgewogICAgICAgICAgICAgICAgIG1QYXJhbXNbcGFyYW1faWR4KytdID0gc3RyZHVwKHMpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHMrPSBzdHJsZW4ocykgKyAxOworICAgICAgICBzICs9IHN0cmxlbihzKSArIDE7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCiBjb25zdCBjaGFyICpOZXRsaW5rRXZlbnQ6OmZpbmRQYXJhbShjb25zdCBjaGFyICpwYXJhbU5hbWUpIHsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOTF9QQVJBTVNfTUFYOyBpKyspIHsKLSAgICAgICAgaWYgKCFtUGFyYW1zW2ldKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICghc3RybmNtcChtUGFyYW1zW2ldLCBwYXJhbU5hbWUsIHN0cmxlbihwYXJhbU5hbWUpKSkKLSAgICAgICAgICAgIHJldHVybiAmbVBhcmFtc1tpXVtzdHJsZW4ocGFyYW1OYW1lKSArIDFdOworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocGFyYW1OYW1lKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5MX1BBUkFNU19NQVggJiYgbVBhcmFtc1tpXSAhPSBOVUxMOyArK2kpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcHRyID0gbVBhcmFtc1tpXSArIGxlbjsKKyAgICAgICAgaWYgKCFzdHJuY21wKG1QYXJhbXNbaV0sIHBhcmFtTmFtZSwgbGVuKSAmJiAqcHRyID09ICc9JykKKyAgICAgICAgICAgIHJldHVybiArK3B0cjsKICAgICB9CiAKICAgICBTTE9HRSgiTmV0bGlua0V2ZW50OjpGaW5kUGFyYW0oKTogUGFyYW1ldGVyICclcycgbm90IGZvdW5kIiwgcGFyYW1OYW1lKTsKZGlmZiAtLWdpdCBhL2xpYnN5c3V0aWxzL3NyYy9OZXRsaW5rTGlzdGVuZXIuY3BwIGIvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtMaXN0ZW5lci5jcHAKaW5kZXggZmIwODhlMS4uYjI0YTQ1ZSAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtMaXN0ZW5lci5jcHAKKysrIGIvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtMaXN0ZW5lci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJOZXRsaW5rTGlzdGVuZXIiCiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy91ZXZlbnQuaD4KIAogI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtMaXN0ZW5lci5oPgogI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtFdmVudC5oPgpAQCAtMzQsMzQgKzM1LDEzIEBACiB7CiAgICAgaW50IHNvY2tldCA9IGNsaS0+Z2V0U29ja2V0KCk7CiAgICAgc3NpemVfdCBjb3VudDsKLSAgICBjaGFyIGNyZWRfbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB1Y3JlZCkpXTsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgc25sOwotICAgIHN0cnVjdCBpb3ZlYyBpb3YgPSB7bUJ1ZmZlciwgc2l6ZW9mKG1CdWZmZXIpfTsKLSAgICBzdHJ1Y3QgbXNnaGRyIGhkciA9IHsmc25sLCBzaXplb2Yoc25sKSwgJmlvdiwgMSwgY3JlZF9tc2csIHNpemVvZihjcmVkX21zZyksIDB9OwogCi0gICAgaWYgKChjb3VudCA9IHJlY3Ztc2coc29ja2V0LCAmaGRyLCAwKSkgPCAwKSB7CisgICAgY291bnQgPSBURU1QX0ZBSUxVUkVfUkVUUlkodWV2ZW50X2NoZWNrZWRfcmVjdihzb2NrZXQsIG1CdWZmZXIsIHNpemVvZihtQnVmZmVyKSkpOworICAgIGlmIChjb3VudCA8IDApIHsKICAgICAgICAgU0xPR0UoInJlY3Ztc2cgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKChzbmwubmxfZ3JvdXBzICE9IDEpIHx8IChzbmwubmxfcGlkICE9IDApKSB7Ci0gICAgICAgIFNMT0dFKCJpZ25vcmluZyBub24ta2VybmVsIG5ldGxpbmsgbXVsdGljYXN0IG1lc3NhZ2UiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCBjbXNnaGRyICogY21zZyA9IENNU0dfRklSU1RIRFIoJmhkcik7Ci0KLSAgICBpZiAoY21zZyA9PSBOVUxMIHx8IGNtc2ctPmNtc2dfdHlwZSAhPSBTQ01fQ1JFREVOVElBTFMpIHsKLSAgICAgICAgU0xPR0UoImlnbm9yaW5nIG1lc3NhZ2Ugd2l0aCBubyBzZW5kZXIgY3JlZGVudGlhbHMiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCB1Y3JlZCAqIGNyZWQgPSAoc3RydWN0IHVjcmVkICopQ01TR19EQVRBKGNtc2cpOwotICAgIGlmIChjcmVkLT51aWQgIT0gMCkgewotICAgICAgICBTTE9HRSgiaWdub3JpbmcgbWVzc2FnZSBmcm9tIG5vbi1yb290IFVJRCAlZCIsIGNyZWQtPnVpZCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBOZXRsaW5rRXZlbnQgKmV2dCA9IG5ldyBOZXRsaW5rRXZlbnQoKTsKICAgICBpZiAoIWV2dC0+ZGVjb2RlKG1CdWZmZXIsIGNvdW50KSkgewogICAgICAgICBTTE9HRSgiRXJyb3IgZGVjb2RpbmcgTmV0bGlua0V2ZW50Iik7CmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9zcmMvU2VydmljZU1hbmFnZXIuY3BwIGIvbGlic3lzdXRpbHMvc3JjL1NlcnZpY2VNYW5hZ2VyLmNwcAppbmRleCA2MGIxNjFhLi40MWFjMWRkIDEwMDY0NAotLS0gYS9saWJzeXN1dGlscy9zcmMvU2VydmljZU1hbmFnZXIuY3BwCisrKyBiL2xpYnN5c3V0aWxzL3NyYy9TZXJ2aWNlTWFuYWdlci5jcHAKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPHN5c3V0aWxzL1NlcnZpY2VNYW5hZ2VyLmg+CiAKQEAgLTksNyArMTAsMzkgQEAKIFNlcnZpY2VNYW5hZ2VyOjpTZXJ2aWNlTWFuYWdlcigpIHsKIH0KIAorLyogVGhlIHNlcnZpY2UgbmFtZSBzaG91bGQgbm90IGV4Y2VlZCBTRVJWSUNFX05BTUVfTUFYIHRvIGF2b2lkCisgKiBzb21lIHdlaXJkIHRoaW5ncy4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdDoKKyAqCisgKiAtIFN0YXJ0aW5nIGEgc2VydmljZSBpcyBkb25lIGJ5IHdyaXRpbmcgaXRzIG5hbWUgdG8gdGhlICJjdGwuc3RhcnQiCisgKiAgIHN5c3RlbSBwcm9wZXJ0eS4gVGhpcyB0cmlnZ2VycyB0aGUgaW5pdCBkYWVtb24gdG8gYWN0dWFsbHkgc3RhcnQKKyAqICAgdGhlIHNlcnZpY2UgZm9yIHVzLgorICoKKyAqIC0gU3RvcHBpbmcgdGhlIHNlcnZpY2UgaXMgZG9uZSBieSB3cml0aW5nIGl0cyBuYW1lIHRvICJjdGwuc3RvcCIKKyAqICAgaW4gYSBzaW1pbGFyIHdheS4KKyAqCisgKiAtIFJlYWRpbmcgdGhlIHN0YXR1cyBvZiBhIHNlcnZpY2UgaXMgZG9uZSBieSByZWFkaW5nIHRoZSBwcm9wZXJ0eQorICogICBuYW1lZCAiaW5pdC5zdmMuPG5hbWU+IgorICoKKyAqIElmIHN0cmxlbig8bmFtZT4pID4gKFBST1BFUlRZX0tFWV9NQVgtMSktOSwgdGhlbiB5b3UgY2FuIHN0YXJ0L3N0b3AKKyAqIHRoZSBzZXJ2aWNlIGJ5IHdyaXRpbmcgdG8gY3RsLnN0YXJ0L3N0b3AsIGJ1dCB5b3Ugd29uJ3QgYmUgYWJsZSB0bworICogcmVhZCBpdHMgc3RhdGUgZHVlIHRvIHRoZSB0cnVuY2F0aW9uIG9mICJpbml0LnN2Yy48bmFtZT4iIGludG8gYQorICogemVyby10ZXJtaW5hdGVkIGJ1ZmZlciBvZiBQUk9QRVJUWV9LRVlfTUFYIGNoYXJhY3RlcnMuCisgKi8KKyNkZWZpbmUgU0VSVklDRV9OQU1FX01BWCAgKFBST1BFUlRZX0tFWV9NQVgtMTApCisKKy8qIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGEgc2VydmljZSB0byBzdGFydCBvciBzdG9wLAorICogaW4gbWljcm8tc2Vjb25kcyAocmVhbGx5IGFuIGFwcHJveGltYXRpb24pICovCisjZGVmaW5lICBTTEVFUF9NQVhfVVNFQyAgICAgMjAwMDAwMCAgLyogMiBzZWNvbmRzICovCisKKy8qIFRoZSBtaW5pbWFsIHNsZWVwaW5nIGludGVydmFsIGJldHdlZW4gY2hlY2tpbmcgZm9yIHRoZSBzZXJ2aWNlJ3Mgc3RhdGUKKyAqIHdoZW4gbG9vcGluZyBmb3IgU0xFRVBfTUFYX1VTRUMgKi8KKyNkZWZpbmUgIFNMRUVQX01JTl9VU0VDICAgICAgMjAwMDAwICAvKiAyMDAgbXNlYyAqLworCiBpbnQgU2VydmljZU1hbmFnZXI6OnN0YXJ0KGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpZiAoc3RybGVuKG5hbWUpID4gU0VSVklDRV9OQU1FX01BWCkgeworICAgICAgICBTTE9HRSgiU2VydmljZSBuYW1lICclcycgaXMgdG9vIGxvbmciLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlmIChpc1J1bm5pbmcobmFtZSkpIHsKICAgICAgICAgU0xPR1coIlNlcnZpY2UgJyVzJyBpcyBhbHJlYWR5IHJ1bm5pbmciLCBuYW1lKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xOCwxMyArNTEsMTQgQEAKICAgICBTTE9HRCgiU3RhcnRpbmcgc2VydmljZSAnJXMnIiwgbmFtZSk7CiAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCBuYW1lKTsKIAotICAgIGludCBjb3VudCA9IDIwMDsKLSAgICB3aGlsZShjb3VudC0tKSB7Ci0gICAgICAgIHNjaGVkX3lpZWxkKCk7CisgICAgaW50IGNvdW50ID0gU0xFRVBfTUFYX1VTRUM7CisgICAgd2hpbGUoY291bnQgPiAwKSB7CisgICAgICAgIHVzbGVlcChTTEVFUF9NSU5fVVNFQyk7CisgICAgICAgIGNvdW50IC09IFNMRUVQX01JTl9VU0VDOwogICAgICAgICBpZiAoaXNSdW5uaW5nKG5hbWUpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmICghY291bnQpIHsKKyAgICBpZiAoY291bnQgPD0gMCkgewogICAgICAgICBTTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNlcnZpY2UgJyVzJyB0byBzdGFydCIsIG5hbWUpOwogICAgICAgICBlcnJubyA9IEVUSU1FRE9VVDsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMzQsNiArNjgsMTAgQEAKIH0KIAogaW50IFNlcnZpY2VNYW5hZ2VyOjpzdG9wKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpZiAoc3RybGVuKG5hbWUpID4gU0VSVklDRV9OQU1FX01BWCkgeworICAgICAgICBTTE9HRSgiU2VydmljZSBuYW1lICclcycgaXMgdG9vIGxvbmciLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlmICghaXNSdW5uaW5nKG5hbWUpKSB7CiAgICAgICAgIFNMT0dXKCJTZXJ2aWNlICclcycgaXMgYWxyZWFkeSBzdG9wcGVkIiwgbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtNDIsMjggKzgwLDMzIEBACiAgICAgU0xPR0QoIlN0b3BwaW5nIHNlcnZpY2UgJyVzJyIsIG5hbWUpOwogICAgIHByb3BlcnR5X3NldCgiY3RsLnN0b3AiLCBuYW1lKTsKIAotICAgIGludCBjb3VudCA9IDIwMDsKLSAgICB3aGlsZShjb3VudC0tKSB7Ci0gICAgICAgIHNjaGVkX3lpZWxkKCk7CisgICAgaW50IGNvdW50ID0gU0xFRVBfTUFYX1VTRUM7CisgICAgd2hpbGUoY291bnQgPiAwKSB7CisgICAgICAgIHVzbGVlcChTTEVFUF9NSU5fVVNFQyk7CisgICAgICAgIGNvdW50IC09IFNMRUVQX01JTl9VU0VDOwogICAgICAgICBpZiAoIWlzUnVubmluZyhuYW1lKSkKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmICghY291bnQpIHsKKyAgICBpZiAoY291bnQgPD0gMCkgewogICAgICAgICBTTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNlcnZpY2UgJyVzJyB0byBzdG9wIiwgbmFtZSk7CiAgICAgICAgIGVycm5vID0gRVRJTUVET1VUOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIFNMT0dEKCJTdWNlc3NmdWxseSBzdG9wcGVkICclcyciLCBuYW1lKTsKKyAgICBTTE9HRCgiU3VjY2Vzc2Z1bGx5IHN0b3BwZWQgJyVzJyIsIG5hbWUpOwogICAgIHJldHVybiAwOwogfQogCiBib29sIFNlcnZpY2VNYW5hZ2VyOjppc1J1bm5pbmcoY29uc3QgY2hhciAqbmFtZSkgewogICAgIGNoYXIgcHJvcFZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGNoYXIgcHJvcE5hbWVbMjU1XTsKKyAgICBjaGFyIHByb3BOYW1lW1BST1BFUlRZX0tFWV9NQVhdOworICAgIGludCAgcmV0OwogCi0gICAgc25wcmludGYocHJvcE5hbWUsIHNpemVvZihwcm9wVmFsKSwgImluaXQuc3ZjLiVzIiwgbmFtZSk7Ci0KKyAgICByZXQgPSBzbnByaW50Zihwcm9wTmFtZSwgc2l6ZW9mKHByb3BOYW1lKSwgImluaXQuc3ZjLiVzIiwgbmFtZSk7CisgICAgaWYgKHJldCA+IChpbnQpc2l6ZW9mKHByb3BOYW1lKS0xKSB7CisgICAgICAgIFNMT0dEKCJTZXJ2aWNlIG5hbWUgJyVzJyBpcyB0b28gbG9uZyIsIG5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCiAgICAgaWYgKHByb3BlcnR5X2dldChwcm9wTmFtZSwgcHJvcFZhbCwgTlVMTCkpIHsKICAgICAgICAgaWYgKCFzdHJjbXAocHJvcFZhbCwgInJ1bm5pbmciKSkKZGlmZiAtLWdpdCBhL2xpYnN5c3V0aWxzL3NyYy9Tb2NrZXRDbGllbnQuY3BwIGIvbGlic3lzdXRpbHMvc3JjL1NvY2tldENsaWVudC5jcHAKaW5kZXggOGU1ZjE1NC4uOTBjYTUyZSAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvc3JjL1NvY2tldENsaWVudC5jcHAKKysrIGIvbGlic3lzdXRpbHMvc3JjL1NvY2tldENsaWVudC5jcHAKQEAgLTE1LDggKzE1LDEwIEBACiAgICAgICAgICwgbVBpZCgtMSkKICAgICAgICAgLCBtVWlkKC0xKQogICAgICAgICAsIG1HaWQoLTEpCisgICAgICAgICwgbVJlZkNvdW50KDEpCiB7CiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZtV3JpdGVNdXRleCwgTlVMTCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtUmVmQ291bnRNdXRleCwgTlVMTCk7CiAKICAgICBzdHJ1Y3QgdWNyZWQgY3JlZHM7CiAgICAgc29ja2xlbl90IHN6Q3JlZHMgPSBzaXplb2YoY3JlZHMpOwpAQCAtMzIsMTQgKzM0LDI0IEBACiAKIGludCBTb2NrZXRDbGllbnQ6OnNlbmRNc2coaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgYm9vbCBhZGRFcnJubykgewogICAgIGNoYXIgKmJ1ZjsKKyAgICBjb25zdCBjaGFyKiBhcmc7CisgICAgY29uc3QgY2hhciogZm10OworICAgIGNoYXIgdG1wWzFdOworICAgIGludCAgbGVuOwogCiAgICAgaWYgKGFkZEVycm5vKSB7Ci0gICAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYShzdHJsZW4obXNnKSArIHN0cmxlbihzdHJlcnJvcihlcnJubykpICsgOCk7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJS4zZCAlcyAoJXMpIiwgY29kZSwgbXNnLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBmbXQgPSAiJS4zZCAlcyAoJXMpIjsKKyAgICAgICAgYXJnID0gc3RyZXJyb3IoZXJybm8pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYShzdHJsZW4obXNnKSArIHN0cmxlbigiWFhYICIpKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlLjNkICVzIiwgY29kZSwgbXNnKTsKKyAgICAgICAgZm10ID0gIiUuM2QgJXMiOworICAgICAgICBhcmcgPSBOVUxMOwogICAgIH0KKyAgICAvKiBNZWFzdXJlIGxlbmd0aCBvZiByZXF1aXJlZCBidWZmZXIgKi8KKyAgICBsZW4gPSBzbnByaW50Zih0bXAsIHNpemVvZiB0bXAsIGZtdCwgY29kZSwgbXNnLCBhcmcpOworICAgIC8qIEFsbG9jYXRlIGluIHRoZSBzdGFjaywgdGhlbiB3cml0ZSB0byBpdCAqLworICAgIGJ1ZiA9IChjaGFyKilhbGxvY2EobGVuKzEpOworICAgIHNucHJpbnRmKGJ1ZiwgbGVuKzEsIGZtdCwgY29kZSwgbXNnLCBhcmcpOworICAgIC8qIFNlbmQgdGhlIHplcm8tdGVybWluYXRlZCBtZXNzYWdlICovCiAgICAgcmV0dXJuIHNlbmRNc2coYnVmKTsKIH0KIApAQCAtNTAsMjUgKzYyLDY1IEBACiAgICAgfQogCiAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSBpbmNsdWRpbmcgbnVsbCBjaGFyYWN0ZXIKKyAgICBpZiAoc2VuZERhdGEobXNnLCBzdHJsZW4obXNnKSArIDEpICE9IDApIHsKKyAgICAgICAgU0xPR1coIlVuYWJsZSB0byBzZW5kIG1zZyAnJXMnIiwgbXNnKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IFNvY2tldENsaWVudDo6c2VuZERhdGEoY29uc3Qgdm9pZCogZGF0YSwgaW50IGxlbikgewogICAgIGludCByYyA9IDA7Ci0gICAgY29uc3QgY2hhciAqcCA9IG1zZzsKLSAgICBpbnQgYnJ0dyA9IHN0cmxlbihtc2cpICsgMTsKKyAgICBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKSBkYXRhOworICAgIGludCBicnR3ID0gbGVuOworCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVdyaXRlTXV0ZXgpOwotICAgIHdoaWxlKGJydHcpIHsKLSAgICAgICAgaWYgKChyYyA9IHdyaXRlKG1Tb2NrZXQscCwgYnJ0dykpIDwgMCkgewotICAgICAgICAgICAgU0xPR1coIlVuYWJsZSB0byBzZW5kIG1zZyAnJXMnICglcykiLCBtc2csIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbVdyaXRlTXV0ZXgpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKCFyYykgeworICAgIHdoaWxlIChicnR3ID4gMCkgeworICAgICAgICByYyA9IHdyaXRlKG1Tb2NrZXQsIHAsIGJydHcpOworICAgICAgICBpZiAocmMgPiAwKSB7CisgICAgICAgICAgICBwICs9IHJjOworICAgICAgICAgICAgYnJ0dyAtPSByYzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJjIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtV3JpdGVNdXRleCk7CisgICAgICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgICAgICBTTE9HVygiMCBsZW5ndGggd3JpdGUgOigiKTsKICAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1Xcml0ZU11dGV4KTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNMT0dXKCJ3cml0ZSBlcnJvciAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgfQotICAgICAgICBwICs9IHJjOwotICAgICAgICBicnR3IC09IHJjOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtV3JpdGVNdXRleCk7CiAgICAgcmV0dXJuIDA7CiB9CisKK3ZvaWQgU29ja2V0Q2xpZW50OjppbmNSZWYoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtUmVmQ291bnRNdXRleCk7CisgICAgbVJlZkNvdW50Kys7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1SZWZDb3VudE11dGV4KTsKK30KKworYm9vbCBTb2NrZXRDbGllbnQ6OmRlY1JlZigpIHsKKyAgICBib29sIGRlbGV0ZVNlbGYgPSBmYWxzZTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1SZWZDb3VudE11dGV4KTsKKyAgICBtUmVmQ291bnQtLTsKKyAgICBpZiAobVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgZGVsZXRlU2VsZiA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtUmVmQ291bnQgPCAwKSB7CisgICAgICAgIFNMT0dFKCJTb2NrZXRDbGllbnQgcmVmY291bnQgd2VudCBuZWdhdGl2ZSEiKTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1SZWZDb3VudE11dGV4KTsKKyAgICBpZiAoZGVsZXRlU2VsZikgeworICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisgICAgcmV0dXJuIGRlbGV0ZVNlbGY7Cit9CmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9zcmMvU29ja2V0TGlzdGVuZXIuY3BwIGIvbGlic3lzdXRpbHMvc3JjL1NvY2tldExpc3RlbmVyLmNwcAppbmRleCAxYmMwNmRiLi5mY2FkNjI0IDEwMDY0NAotLS0gYS9saWJzeXN1dGlscy9zcmMvU29ja2V0TGlzdGVuZXIuY3BwCisrKyBiL2xpYnN5c3V0aWxzL3NyYy9Tb2NrZXRMaXN0ZW5lci5jcHAKQEAgLTU0LDggKzU0LDggQEAKICAgICAgICAgY2xvc2UobUN0cmxQaXBlWzFdKTsKICAgICB9CiAgICAgU29ja2V0Q2xpZW50Q29sbGVjdGlvbjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IG1DbGllbnRzLT5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgZGVsZXRlICgqaXQpOworICAgIGZvciAoaXQgPSBtQ2xpZW50cy0+YmVnaW4oKTsgaXQgIT0gbUNsaWVudHMtPmVuZCgpOykgeworICAgICAgICAoKml0KS0+ZGVjUmVmKCk7CiAgICAgICAgIGl0ID0gbUNsaWVudHMtPmVyYXNlKGl0KTsKICAgICB9CiAgICAgZGVsZXRlIG1DbGllbnRzOwpAQCAtOTYsOCArOTYsMTAgQEAKIAogaW50IFNvY2tldExpc3RlbmVyOjpzdG9wTGlzdGVuZXIoKSB7CiAgICAgY2hhciBjID0gMDsKKyAgICBpbnQgIHJjOwogCi0gICAgaWYgKHdyaXRlKG1DdHJsUGlwZVsxXSwgJmMsIDEpICE9IDEpIHsKKyAgICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShtQ3RybFBpcGVbMV0sICZjLCAxKSk7CisgICAgaWYgKHJjICE9IDEpIHsKICAgICAgICAgU0xPR0UoIkVycm9yIHdyaXRpbmcgdG8gY29udHJvbCBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTE4LDcgKzEyMCw3IEBACiAgICAgfQogCiAgICAgU29ja2V0Q2xpZW50Q29sbGVjdGlvbjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IG1DbGllbnRzLT5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy0+ZW5kKCk7ICsraXQpIHsKKyAgICBmb3IgKGl0ID0gbUNsaWVudHMtPmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLT5lbmQoKTspIHsKICAgICAgICAgZGVsZXRlICgqaXQpOwogICAgICAgICBpdCA9IG1DbGllbnRzLT5lcmFzZShpdCk7CiAgICAgfQpAQCAtMTM1LDExICsxMzcsMTMgQEAKIAogdm9pZCBTb2NrZXRMaXN0ZW5lcjo6cnVuTGlzdGVuZXIoKSB7CiAKKyAgICBTb2NrZXRDbGllbnRDb2xsZWN0aW9uICpwZW5kaW5nTGlzdCA9IG5ldyBTb2NrZXRDbGllbnRDb2xsZWN0aW9uKCk7CisKICAgICB3aGlsZSgxKSB7CiAgICAgICAgIFNvY2tldENsaWVudENvbGxlY3Rpb246Oml0ZXJhdG9yIGl0OwogICAgICAgICBmZF9zZXQgcmVhZF9mZHM7CiAgICAgICAgIGludCByYyA9IDA7Ci0gICAgICAgIGludCBtYXggPSAwOworICAgICAgICBpbnQgbWF4ID0gLTE7CiAKICAgICAgICAgRkRfWkVSTygmcmVhZF9mZHMpOwogCkBAIC0xNTQsMTMgKzE1OCwxNiBAQAogCiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUNsaWVudHNMb2NrKTsKICAgICAgICAgZm9yIChpdCA9IG1DbGllbnRzLT5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIEZEX1NFVCgoKml0KS0+Z2V0U29ja2V0KCksICZyZWFkX2Zkcyk7Ci0gICAgICAgICAgICBpZiAoKCppdCktPmdldFNvY2tldCgpID4gbWF4KQotICAgICAgICAgICAgICAgIG1heCA9ICgqaXQpLT5nZXRTb2NrZXQoKTsKKyAgICAgICAgICAgIGludCBmZCA9ICgqaXQpLT5nZXRTb2NrZXQoKTsKKyAgICAgICAgICAgIEZEX1NFVChmZCwgJnJlYWRfZmRzKTsKKyAgICAgICAgICAgIGlmIChmZCA+IG1heCkKKyAgICAgICAgICAgICAgICBtYXggPSBmZDsKICAgICAgICAgfQogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNsaWVudHNMb2NrKTsKIAogICAgICAgICBpZiAoKHJjID0gc2VsZWN0KG1heCArIDEsICZyZWFkX2ZkcywgTlVMTCwgTlVMTCwgTlVMTCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgU0xPR0UoInNlbGVjdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTcxLDEwICsxNzgsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBpZiAobUxpc3RlbiAmJiBGRF9JU1NFVChtU29jaywgJnJlYWRfZmRzKSkgewogICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyIGFkZHI7Ci0gICAgICAgICAgICBzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgICAgICAgIHNvY2tsZW5fdCBhbGVuOwogICAgICAgICAgICAgaW50IGM7CiAKLSAgICAgICAgICAgIGlmICgoYyA9IGFjY2VwdChtU29jaywgJmFkZHIsICZhbGVuKSkgPCAwKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYWxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgICAgICAgICAgICBjID0gYWNjZXB0KG1Tb2NrLCAmYWRkciwgJmFsZW4pOworICAgICAgICAgICAgfSB3aGlsZSAoYyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgICAgICAgaWYgKGMgPCAwKSB7CiAgICAgICAgICAgICAgICAgU0xPR0UoImFjY2VwdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xODQsMjcgKzE5NSw0NiBAQAogICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1DbGllbnRzTG9jayk7CiAgICAgICAgIH0KIAotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1DbGllbnRzTG9jayk7Ci0gICAgICAgICAgICBmb3IgKGl0ID0gbUNsaWVudHMtPmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLT5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIGludCBmZCA9ICgqaXQpLT5nZXRTb2NrZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoRkRfSVNTRVQoZmQsICZyZWFkX2ZkcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1DbGllbnRzTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb25EYXRhQXZhaWxhYmxlKCppdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUNsaWVudHNMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IG1DbGllbnRzLT5lcmFzZShpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNsaWVudHNMb2NrKTsKKyAgICAgICAgLyogQWRkIGFsbCBhY3RpdmUgY2xpZW50cyB0byB0aGUgcGVuZGluZyBsaXN0IGZpcnN0ICovCisgICAgICAgIHBlbmRpbmdMaXN0LT5jbGVhcigpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1DbGllbnRzTG9jayk7CisgICAgICAgIGZvciAoaXQgPSBtQ2xpZW50cy0+YmVnaW4oKTsgaXQgIT0gbUNsaWVudHMtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpbnQgZmQgPSAoKml0KS0+Z2V0U29ja2V0KCk7CisgICAgICAgICAgICBpZiAoRkRfSVNTRVQoZmQsICZyZWFkX2ZkcykpIHsKKyAgICAgICAgICAgICAgICBwZW5kaW5nTGlzdC0+cHVzaF9iYWNrKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1DbGllbnRzTG9jayk7CisKKyAgICAgICAgLyogUHJvY2VzcyB0aGUgcGVuZGluZyBsaXN0LCBzaW5jZSBpdCBpcyBvd25lZCBieSB0aGUgdGhyZWFkLAorICAgICAgICAgKiB0aGVyZSBpcyBubyBuZWVkIHRvIGxvY2sgaXQgKi8KKyAgICAgICAgd2hpbGUgKCFwZW5kaW5nTGlzdC0+ZW1wdHkoKSkgeworICAgICAgICAgICAgLyogUG9wIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGxpc3QgKi8KKyAgICAgICAgICAgIGl0ID0gcGVuZGluZ0xpc3QtPmJlZ2luKCk7CisgICAgICAgICAgICBTb2NrZXRDbGllbnQqIGMgPSAqaXQ7CisgICAgICAgICAgICBwZW5kaW5nTGlzdC0+ZXJhc2UoaXQpOworICAgICAgICAgICAgLyogUHJvY2VzcyBpdCwgaWYgZmFsc2UgaXMgcmV0dXJuZWQgYW5kIG91ciBzb2NrZXRzIGFyZQorICAgICAgICAgICAgICogY29ubmVjdGlvbi1iYXNlZCwgcmVtb3ZlIGFuZCBkZXN0cm95IGl0ICovCisgICAgICAgICAgICBpZiAoIW9uRGF0YUF2YWlsYWJsZShjKSAmJiBtTGlzdGVuKSB7CisgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoZSBjbGllbnQgZnJvbSBvdXIgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1DbGllbnRzTG9jayk7CisgICAgICAgICAgICAgICAgZm9yIChpdCA9IG1DbGllbnRzLT5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCppdCA9PSBjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50cy0+ZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRkRfQ0xSKGZkLCAmcmVhZF9mZHMpOwotICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1DbGllbnRzTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNsaWVudHNMb2NrKTsKKyAgICAgICAgICAgICAgICAvKiBEZXN0cm95IHRoZSBjbGllbnQgKi8KKyAgICAgICAgICAgICAgICBpbnQgc29ja2V0ID0gYy0+Z2V0U29ja2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKGMtPmRlY1JlZigpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6ICdjJyBpcyBkZWxldGVkIG1lbW9yeSBhdCB0aGlzIHBvaW50LgorICAgICAgICAgICAgICAgICAgICBjbG9zZShzb2NrZXQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtQ2xpZW50c0xvY2spOwotICAgICAgICB9IHdoaWxlICgwKTsKKyAgICAgICAgfQogICAgIH0KKyAgICBkZWxldGUgcGVuZGluZ0xpc3Q7CiB9CiAKIHZvaWQgU29ja2V0TGlzdGVuZXI6OnNlbmRCcm9hZGNhc3QoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgYm9vbCBhZGRFcnJubykgewpkaWZmIC0tZ2l0IGEvbGlidXNiaG9zdC9BbmRyb2lkLm1rIGIvbGlidXNiaG9zdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjRlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1c2Job3N0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKG15LWRpcikKKworIyBTdGF0aWMgbGlicmFyeSBmb3IgTGludXggaG9zdAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IGxpYnVzYmhvc3QKK0xPQ0FMX1NSQ19GSUxFUyA6PSB1c2Job3N0LmMKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCisKK2VuZGlmCisKKyMgU2hhcmVkIGxpYnJhcnkgZm9yIHRhcmdldAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IGxpYnVzYmhvc3QKK0xPQ0FMX1NSQ19GSUxFUyA6PSB1c2Job3N0LmMKKworTE9DQUxfQ0ZMQUdTIDo9IC1nIC1EVVNFX0xJQkxPRworCisjIG5lZWRlZCBmb3IgbG9nY2F0CitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ1c2Job3N0L3VzYmhvc3QuYyBiL2xpYnVzYmhvc3QvdXNiaG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzk2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1c2Job3N0L3VzYmhvc3QuYwpAQCAtMCwwICsxLDU4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgREVCVUcgMQorI2lmIERFQlVHCisKKyNpZmRlZiBVU0VfTElCTE9HCisjZGVmaW5lIExPR19UQUcgInVzYmhvc3QiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisjZGVmaW5lIEQgTE9HRAorI2Vsc2UKKyNkZWZpbmUgRCBwcmludGYKKyNlbmRpZgorCisjZWxzZQorI2RlZmluZSBEKC4uLikKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lub3RpZnkuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJ1c2Job3N0L3VzYmhvc3QuaCIKKworI2RlZmluZSBVU0JfRlNfRElSICIvZGV2L2J1cy91c2IiCisjZGVmaW5lIFVTQl9GU19JRF9TQ0FOTkVSICAgIi9kZXYvYnVzL3VzYi8lZC8lZCIKKyNkZWZpbmUgVVNCX0ZTX0lEX0ZPUk1BVCAgICAiL2Rldi9idXMvdXNiLyUwM2QvJTAzZCIKKworLy8gRnJvbSBkcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKy8vIEkgZG9uJ3Qga25vdyB3aHkgdGhpcyBpc24ndCBpbiBhIGtlcm5lbCBoZWFkZXIKKyNkZWZpbmUgTUFYX1VTQkZTX0JVRkZFUl9TSVpFICAgMTYzODQKKworc3RydWN0IHVzYl9ob3N0X2NvbnRleHQgeworICAgIGludCBmZDsKK307CisKK3N0cnVjdCB1c2JfZGV2aWNlIHsKKyAgICBjaGFyIGRldl9uYW1lWzY0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2NbNDA5Nl07CisgICAgaW50IGRlc2NfbGVuZ3RoOworICAgIGludCBmZDsKKyAgICBpbnQgd3JpdGVhYmxlOworfTsKKworc3RhdGljIGlubGluZSBpbnQgYmFkbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIHdoaWxlKCpuYW1lKSB7CisgICAgICAgIGlmKCFpc2RpZ2l0KCpuYW1lKyspKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybnMgdHJ1ZSBpZiBvbmUgb2YgdGhlIGNhbGxiYWNrcyBpbmRpY2F0ZXMgd2UgYXJlIGRvbmUgKi8KK3N0YXRpYyBpbnQgZmluZF9leGlzdGluZ19kZXZpY2VzKHVzYl9kZXZpY2VfYWRkZWRfY2IgYWRkZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9yZW1vdmVkX2NiIHJlbW92ZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgY2hhciBidXNuYW1lWzMyXSwgZGV2bmFtZVszMl07CisgICAgRElSICpidXNkaXIgLCAqZGV2ZGlyIDsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkZTsKKyAgICBpbnQgZG9uZSA9IDA7CisKKyAgICBidXNkaXIgPSBvcGVuZGlyKFVTQl9GU19ESVIpOworICAgIGlmKGJ1c2RpciA9PSAwKSByZXR1cm4gMTsKKworICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGJ1c2RpcikpICE9IDAgJiYgIWRvbmUpIHsKKyAgICAgICAgaWYoYmFkbmFtZShkZS0+ZF9uYW1lKSkgY29udGludWU7CisKKyAgICAgICAgc25wcmludGYoYnVzbmFtZSwgc2l6ZW9mIGJ1c25hbWUsICIlcy8lcyIsIFVTQl9GU19ESVIsIGRlLT5kX25hbWUpOworICAgICAgICBkZXZkaXIgPSBvcGVuZGlyKGJ1c25hbWUpOworICAgICAgICBpZihkZXZkaXIgPT0gMCkgY29udGludWU7CisKKyAgICAgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZGV2ZGlyKSkgJiYgIWRvbmUpIHsKKyAgICAgICAgICAgIGlmKGJhZG5hbWUoZGUtPmRfbmFtZSkpIGNvbnRpbnVlOworCisgICAgICAgICAgICBzbnByaW50ZihkZXZuYW1lLCBzaXplb2YgZGV2bmFtZSwgIiVzLyVzIiwgYnVzbmFtZSwgZGUtPmRfbmFtZSk7CisgICAgICAgICAgICBkb25lID0gYWRkZWRfY2IoZGV2bmFtZSwgY2xpZW50X2RhdGEpOworICAgICAgICB9IC8vIGVuZCBvZiBkZXZkaXIgd2hpbGUKKyAgICAgICAgY2xvc2VkaXIoZGV2ZGlyKTsKKyAgICB9IC8vZW5kIG9mIGJ1c2RpciB3aGlsZQorICAgIGNsb3NlZGlyKGJ1c2Rpcik7CisKKyAgICByZXR1cm4gZG9uZTsKK30KKworc3RydWN0IHVzYl9ob3N0X2NvbnRleHQgKnVzYl9ob3N0X2luaXQoKQoreworICAgIHN0cnVjdCB1c2JfaG9zdF9jb250ZXh0ICpjb250ZXh0ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCkpOworICAgIGlmICghY29udGV4dCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnkgaW4gdXNiX2hvc3RfY29udGV4dFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb250ZXh0LT5mZCA9IGlub3RpZnlfaW5pdCgpOworICAgIGlmIChjb250ZXh0LT5mZCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbm90aWZ5X2luaXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZnJlZShjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBjb250ZXh0OworfQorCit2b2lkIHVzYl9ob3N0X2NsZWFudXAoc3RydWN0IHVzYl9ob3N0X2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgY2xvc2UoY29udGV4dC0+ZmQpOworICAgIGZyZWUoY29udGV4dCk7Cit9CisKK3ZvaWQgdXNiX2hvc3RfcnVuKHN0cnVjdCB1c2JfaG9zdF9jb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9hZGRlZF9jYiBhZGRlZF9jYiwKKyAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfcmVtb3ZlZF9jYiByZW1vdmVkX2NiLAorICAgICAgICAgICAgICAgICAgdXNiX2Rpc2NvdmVyeV9kb25lX2NiIGRpc2NvdmVyeV9kb25lX2NiLAorICAgICAgICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgc3RydWN0IGlub3RpZnlfZXZlbnQqIGV2ZW50OworICAgIGNoYXIgZXZlbnRfYnVmWzUxMl07CisgICAgY2hhciBwYXRoWzEwMF07CisgICAgaW50IGksIHJldCwgZG9uZSA9IDA7CisgICAgaW50IHdkLCB3ZHNbMTBdOworICAgIGludCB3ZF9jb3VudCA9IHNpemVvZih3ZHMpIC8gc2l6ZW9mKHdkc1swXSk7CisKKyAgICBEKCJDcmVhdGVkIGRldmljZSBkaXNjb3ZlcnkgdGhyZWFkXG4iKTsKKworICAgIC8qIHdhdGNoIGZvciBmaWxlcyBhZGRlZCBhbmQgZGVsZXRlZCB3aXRoaW4gVVNCX0ZTX0RJUiAqLworICAgIG1lbXNldCh3ZHMsIDAsIHNpemVvZih3ZHMpKTsKKyAgICAvKiB3YXRjaCB0aGUgcm9vdCBmb3IgbmV3IHN1YmRpcmVjdG9yaWVzICovCisgICAgd2RzWzBdID0gaW5vdGlmeV9hZGRfd2F0Y2goY29udGV4dC0+ZmQsIFVTQl9GU19ESVIsIElOX0NSRUFURSB8IElOX0RFTEVURSk7CisgICAgaWYgKHdkc1swXSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbm90aWZ5X2FkZF93YXRjaCBmYWlsZWRcbiIpOworICAgICAgICBpZiAoZGlzY292ZXJ5X2RvbmVfY2IpCisgICAgICAgICAgICBkaXNjb3ZlcnlfZG9uZV9jYihjbGllbnRfZGF0YSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiB3YXRjaCBleGlzdGluZyBzdWJkaXJlY3RvcmllcyBvZiBVU0JfRlNfRElSICovCisgICAgZm9yIChpID0gMTsgaSA8IHdkX2NvdW50OyBpKyspIHsKKyAgICAgICAgc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvJTAzZCIsIFVTQl9GU19ESVIsIGkpOworICAgICAgICByZXQgPSBpbm90aWZ5X2FkZF93YXRjaChjb250ZXh0LT5mZCwgcGF0aCwgSU5fQ1JFQVRFIHwgSU5fREVMRVRFKTsKKyAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICB3ZHNbaV0gPSByZXQ7CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIGV4aXN0aW5nIGRldmljZXMgZmlyc3QsIGFmdGVyIHdlIGhhdmUgaW5vdGlmeSBzZXQgdXAgKi8KKyAgICBkb25lID0gZmluZF9leGlzdGluZ19kZXZpY2VzKGFkZGVkX2NiLCByZW1vdmVkX2NiLCBjbGllbnRfZGF0YSk7CisgICAgaWYgKGRpc2NvdmVyeV9kb25lX2NiKQorICAgICAgICBkb25lIHw9IGRpc2NvdmVyeV9kb25lX2NiKGNsaWVudF9kYXRhKTsKKworICAgIHdoaWxlICghZG9uZSkgeworICAgICAgICByZXQgPSByZWFkKGNvbnRleHQtPmZkLCBldmVudF9idWYsIHNpemVvZihldmVudF9idWYpKTsKKyAgICAgICAgaWYgKHJldCA+PSAoaW50KXNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkpIHsKKyAgICAgICAgICAgIGV2ZW50ID0gKHN0cnVjdCBpbm90aWZ5X2V2ZW50ICopZXZlbnRfYnVmOworICAgICAgICAgICAgd2QgPSBldmVudC0+d2Q7CisgICAgICAgICAgICBpZiAod2QgPT0gd2RzWzBdKSB7CisgICAgICAgICAgICAgICAgaSA9IGF0b2koZXZlbnQtPm5hbWUpOworICAgICAgICAgICAgICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLyVzIiwgVVNCX0ZTX0RJUiwgZXZlbnQtPm5hbWUpOworICAgICAgICAgICAgICAgIEQoIm5ldyBzdWJkaXJlY3RvcnkgJXM6IGluZGV4OiAlZFxuIiwgcGF0aCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIGkgPCB3ZF9jb3VudCkgeworICAgICAgICAgICAgICAgIHJldCA9IGlub3RpZnlfYWRkX3dhdGNoKGNvbnRleHQtPmZkLCBwYXRoLCBJTl9DUkVBVEUgfCBJTl9ERUxFVEUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPiAwKQorICAgICAgICAgICAgICAgICAgICB3ZHNbaV0gPSByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgd2RfY291bnQgJiYgIWRvbmU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QgPT0gd2RzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy8lMDNkLyVzIiwgVVNCX0ZTX0RJUiwgaSwgZXZlbnQtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LT5tYXNrID09IElOX0NSRUFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQoIm5ldyBkZXZpY2UgJXNcbiIsIHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBhZGRlZF9jYihwYXRoLCBjbGllbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tYXNrID09IElOX0RFTEVURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQoImdvbmUgZGV2aWNlICVzXG4iLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gcmVtb3ZlZF9jYihwYXRoLCBjbGllbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2aWNlX29wZW4oY29uc3QgY2hhciAqZGV2X25hbWUpCit7CisgICAgaW50IGZkLCBkaWRfcmV0cnkgPSAwLCB3cml0ZWFibGUgPSAxOworCisgICAgRCgidXNiX2RldmljZV9vcGVuICVzXG4iLCBkZXZfbmFtZSk7CisKK3JldHJ5OgorICAgIGZkID0gb3BlbihkZXZfbmFtZSwgT19SRFdSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIC8qIGlmIHdlIGZhaWwsIHNlZSBpZiBoYXZlIHJlYWQtb25seSBhY2Nlc3MgKi8KKyAgICAgICAgZmQgPSBvcGVuKGRldl9uYW1lLCBPX1JET05MWSk7CisgICAgICAgIEQoInVzYl9kZXZpY2Vfb3BlbiBvcGVuIHJldHVybmVkICVkIGVycm5vICVkXG4iLCBmZCwgZXJybm8pOworICAgICAgICBpZiAoZmQgPCAwICYmIChlcnJubyA9PSBFQUNDRVMgfHwgZXJybm8gPT0gRU5PRU5UKSAmJiAhZGlkX3JldHJ5KSB7CisgICAgICAgICAgICAvKiB3b3JrIGFyb3VuZCByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGlub3RpZnkgYW5kIHBlcm1pc3Npb25zIG1hbmFnZW1lbnQgKi8KKyAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgZGlkX3JldHJ5ID0gMTsKKyAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHdyaXRlYWJsZSA9IDA7CisgICAgICAgIEQoIlsgdXNiIG9wZW4gcmVhZC1vbmx5ICVzIGZkID0gJWRdXG4iLCBkZXZfbmFtZSwgZmQpOworICAgIH0KKworICAgIHN0cnVjdCB1c2JfZGV2aWNlKiByZXN1bHQgPSB1c2JfZGV2aWNlX25ldyhkZXZfbmFtZSwgZmQpOworICAgIGlmIChyZXN1bHQpCisgICAgICAgIHJlc3VsdC0+d3JpdGVhYmxlID0gd3JpdGVhYmxlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgdXNiX2RldmljZV9jbG9zZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlKQoreworICAgIGNsb3NlKGRldmljZS0+ZmQpOworICAgIGZyZWUoZGV2aWNlKTsKK30KKworc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXZpY2VfbmV3KGNvbnN0IGNoYXIgKmRldl9uYW1lLCBpbnQgZmQpCit7CisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHVzYl9kZXZpY2UpKTsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgRCgidXNiX2RldmljZV9uZXcgJXMgZmQ6ICVkXG4iLCBkZXZfbmFtZSwgZmQpOworCisgICAgaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgbGVuZ3RoID0gcmVhZChmZCwgZGV2aWNlLT5kZXNjLCBzaXplb2YoZGV2aWNlLT5kZXNjKSk7CisgICAgRCgidXNiX2RldmljZV9uZXcgcmVhZCByZXR1cm5lZCAlZCBlcnJubyAlZFxuIiwgbGVuZ3RoLCBlcnJubyk7CisgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgc3RybmNweShkZXZpY2UtPmRldl9uYW1lLCBkZXZfbmFtZSwgc2l6ZW9mKGRldmljZS0+ZGV2X25hbWUpIC0gMSk7CisgICAgZGV2aWNlLT5mZCA9IGZkOworICAgIGRldmljZS0+ZGVzY19sZW5ndGggPSBsZW5ndGg7CisgICAgLy8gYXNzdW1lIHdlIGFyZSB3cml0ZWFibGUsIHNpbmNlIHVzYl9kZXZpY2VfZ2V0X2ZkIHdpbGwgb25seSByZXR1cm4gd3JpdGVhYmxlIGZkcworICAgIGRldmljZS0+d3JpdGVhYmxlID0gMTsKKyAgICByZXR1cm4gZGV2aWNlOworCitmYWlsZWQ6CisgICAgY2xvc2UoZmQpOworICAgIGZyZWUoZGV2aWNlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB1c2JfZGV2aWNlX3Jlb3Blbl93cml0ZWFibGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlLT53cml0ZWFibGUpCisgICAgICAgIHJldHVybiAxOworCisgICAgaW50IGZkID0gb3BlbihkZXZpY2UtPmRldl9uYW1lLCBPX1JEV1IpOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGRldmljZS0+ZmQpOworICAgICAgICBkZXZpY2UtPmZkID0gZmQ7CisgICAgICAgIGRldmljZS0+d3JpdGVhYmxlID0gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIEQoInVzYl9kZXZpY2VfcmVvcGVuX3dyaXRlYWJsZSBmYWlsZWQgZXJybm8gJWRcbiIsIGVycm5vKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYl9kZXZpY2VfZ2V0X2ZkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UpCit7CisgICAgaWYgKCF1c2JfZGV2aWNlX3Jlb3Blbl93cml0ZWFibGUoZGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBkZXZpY2UtPmZkOworfQorCitjb25zdCBjaGFyKiB1c2JfZGV2aWNlX2dldF9uYW1lKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UpCit7CisgICAgcmV0dXJuIGRldmljZS0+ZGV2X25hbWU7Cit9CisKK2ludCB1c2JfZGV2aWNlX2dldF91bmlxdWVfaWQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBpbnQgYnVzID0gMCwgZGV2ID0gMDsKKyAgICBzc2NhbmYoZGV2aWNlLT5kZXZfbmFtZSwgVVNCX0ZTX0lEX1NDQU5ORVIsICZidXMsICZkZXYpOworICAgIHJldHVybiBidXMgKiAxMDAwICsgZGV2OworfQorCitpbnQgdXNiX2RldmljZV9nZXRfdW5pcXVlX2lkX2Zyb21fbmFtZShjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGludCBidXMgPSAwLCBkZXYgPSAwOworICAgIHNzY2FuZihuYW1lLCBVU0JfRlNfSURfU0NBTk5FUiwgJmJ1cywgJmRldik7CisgICAgcmV0dXJuIGJ1cyAqIDEwMDAgKyBkZXY7Cit9CisKK2NoYXIqIHVzYl9kZXZpY2VfZ2V0X25hbWVfZnJvbV91bmlxdWVfaWQoaW50IGlkKQoreworICAgIGludCBidXMgPSBpZCAvIDEwMDA7CisgICAgaW50IGRldiA9IGlkICUgMTAwMDsKKyAgICBjaGFyKiByZXN1bHQgPSAoY2hhciAqKWNhbGxvYygxLCBzdHJsZW4oVVNCX0ZTX0lEX0ZPUk1BVCkpOworICAgIHNucHJpbnRmKHJlc3VsdCwgc3RybGVuKFVTQl9GU19JRF9GT1JNQVQpIC0gMSwgVVNCX0ZTX0lEX0ZPUk1BVCwgYnVzLCBkZXYpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQxNl90IHVzYl9kZXZpY2VfZ2V0X3ZlbmRvcl9pZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlKQoreworICAgIHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IqIGRlc2MgPSAoc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciopZGV2aWNlLT5kZXNjOworICAgIHJldHVybiBfX2xlMTZfdG9fY3B1KGRlc2MtPmlkVmVuZG9yKTsKK30KKwordWludDE2X3QgdXNiX2RldmljZV9nZXRfcHJvZHVjdF9pZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlKQoreworICAgIHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IqIGRlc2MgPSAoc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciopZGV2aWNlLT5kZXNjOworICAgIHJldHVybiBfX2xlMTZfdG9fY3B1KGRlc2MtPmlkUHJvZHVjdCk7Cit9CisKK2NvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IqIHVzYl9kZXZpY2VfZ2V0X2RldmljZV9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UpCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yKilkZXZpY2UtPmRlc2M7Cit9CisKK2NoYXIqIHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBpbnQgaWQpCit7CisgICAgY2hhciBzdHJpbmdbMjU2XTsKKyAgICBfX3UxNiBidWZmZXJbMTI4XTsKKyAgICBfX3UxNiBsYW5ndWFnZXNbMTI4XTsKKyAgICBpbnQgaSwgcmVzdWx0OworICAgIGludCBsYW5ndWFnZUNvdW50ID0gMDsKKworICAgIHN0cmluZ1swXSA9IDA7CisgICAgbWVtc2V0KGxhbmd1YWdlcywgMCwgc2l6ZW9mKGxhbmd1YWdlcykpOworCisgICAgLy8gcmVhZCBsaXN0IG9mIHN1cHBvcnRlZCBsYW5ndWFnZXMKKyAgICByZXN1bHQgPSB1c2JfZGV2aWNlX2NvbnRyb2xfdHJhbnNmZXIoZGV2aWNlLAorICAgICAgICAgICAgVVNCX0RJUl9JTnxVU0JfVFlQRV9TVEFOREFSRHxVU0JfUkVDSVBfREVWSUNFLCBVU0JfUkVRX0dFVF9ERVNDUklQVE9SLAorICAgICAgICAgICAgKFVTQl9EVF9TVFJJTkcgPDwgOCkgfCAwLCAwLCBsYW5ndWFnZXMsIHNpemVvZihsYW5ndWFnZXMpLCAwKTsKKyAgICBpZiAocmVzdWx0ID4gMCkKKyAgICAgICAgbGFuZ3VhZ2VDb3VudCA9IChyZXN1bHQgLSAyKSAvIDI7CisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IGxhbmd1YWdlQ291bnQ7IGkrKykgeworICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgICAgICAgcmVzdWx0ID0gdXNiX2RldmljZV9jb250cm9sX3RyYW5zZmVyKGRldmljZSwKKyAgICAgICAgICAgICAgICBVU0JfRElSX0lOfFVTQl9UWVBFX1NUQU5EQVJEfFVTQl9SRUNJUF9ERVZJQ0UsIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1IsCisgICAgICAgICAgICAgICAgKFVTQl9EVF9TVFJJTkcgPDwgOCkgfCBpZCwgbGFuZ3VhZ2VzW2ldLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAwKTsKKyAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgLy8gc2tpcCBmaXJzdCB3b3JkLCBhbmQgY29weSB0aGUgcmVzdCB0byB0aGUgc3RyaW5nLCBjaGFuZ2luZyBzaG9ydHMgdG8gYnl0ZXMuCisgICAgICAgICAgICByZXN1bHQgLz0gMjsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByZXN1bHQ7IGkrKykKKyAgICAgICAgICAgICAgICBzdHJpbmdbaSAtIDFdID0gYnVmZmVyW2ldOworICAgICAgICAgICAgc3RyaW5nW2kgLSAxXSA9IDA7CisgICAgICAgICAgICByZXR1cm4gc3RyZHVwKHN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworY2hhciogdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXNjID0gKHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKilkZXZpY2UtPmRlc2M7CisKKyAgICBpZiAoZGVzYy0+aU1hbnVmYWN0dXJlcikKKyAgICAgICAgcmV0dXJuIHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhkZXZpY2UsIGRlc2MtPmlNYW51ZmFjdHVyZXIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIqIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlKQoreworICAgIHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKmRlc2MgPSAoc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciAqKWRldmljZS0+ZGVzYzsKKworICAgIGlmIChkZXNjLT5pUHJvZHVjdCkKKyAgICAgICAgcmV0dXJuIHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhkZXZpY2UsIGRlc2MtPmlQcm9kdWN0KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCitjaGFyKiB1c2JfZGV2aWNlX2dldF9zZXJpYWwoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXNjID0gKHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKilkZXZpY2UtPmRlc2M7CisKKyAgICBpZiAoZGVzYy0+aVNlcmlhbE51bWJlcikKKyAgICAgICAgcmV0dXJuIHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhkZXZpY2UsIGRlc2MtPmlTZXJpYWxOdW1iZXIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCB1c2JfZGV2aWNlX2lzX3dyaXRlYWJsZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlKQoreworICAgIHJldHVybiBkZXZpY2UtPndyaXRlYWJsZTsKK30KKwordm9pZCB1c2JfZGVzY3JpcHRvcl9pdGVyX2luaXQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSwgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2l0ZXIgKml0ZXIpCit7CisgICAgaXRlci0+Y29uZmlnID0gZGV2aWNlLT5kZXNjOworICAgIGl0ZXItPmNvbmZpZ19lbmQgPSBkZXZpY2UtPmRlc2MgKyBkZXZpY2UtPmRlc2NfbGVuZ3RoOworICAgIGl0ZXItPmN1cnJfZGVzYyA9IGRldmljZS0+ZGVzYzsKK30KKworc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyICppdGVyKQoreworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIqIG5leHQ7CisgICAgaWYgKGl0ZXItPmN1cnJfZGVzYyA+PSBpdGVyLT5jb25maWdfZW5kKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXh0ID0gKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIqKWl0ZXItPmN1cnJfZGVzYzsKKyAgICBpdGVyLT5jdXJyX2Rlc2MgKz0gbmV4dC0+Ykxlbmd0aDsKKyAgICByZXR1cm4gbmV4dDsKK30KKworaW50IHVzYl9kZXZpY2VfY2xhaW1faW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBpbnRlcmZhY2UpCit7CisgICAgcmV0dXJuIGlvY3RsKGRldmljZS0+ZmQsIFVTQkRFVkZTX0NMQUlNSU5URVJGQUNFLCAmaW50ZXJmYWNlKTsKK30KKworaW50IHVzYl9kZXZpY2VfcmVsZWFzZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgaW50IGludGVyZmFjZSkKK3sKKyAgICByZXR1cm4gaW9jdGwoZGV2aWNlLT5mZCwgVVNCREVWRlNfUkVMRUFTRUlOVEVSRkFDRSwgJmludGVyZmFjZSk7Cit9CisKK2ludCB1c2JfZGV2aWNlX2Nvbm5lY3Rfa2VybmVsX2RyaXZlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLAorICAgICAgICB1bnNpZ25lZCBpbnQgaW50ZXJmYWNlLCBpbnQgY29ubmVjdCkKK3sKKyAgICBzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwgY3RsOworCisgICAgY3RsLmlmbm8gPSBpbnRlcmZhY2U7CisgICAgY3RsLmlvY3RsX2NvZGUgPSAoY29ubmVjdCA/IFVTQkRFVkZTX0NPTk5FQ1QgOiBVU0JERVZGU19ESVNDT05ORUNUKTsKKyAgICBjdGwuZGF0YSA9IE5VTEw7CisgICAgcmV0dXJuIGlvY3RsKGRldmljZS0+ZmQsIFVTQkRFVkZTX0lPQ1RMLCAmY3RsKTsKK30KKworaW50IHVzYl9kZXZpY2VfY29udHJvbF90cmFuc2ZlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworICAgIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgIGN0cmw7CisKKyAgICAvLyB0aGlzIHVzdWFsbHkgcmVxdWlyZXMgcmVhZC93cml0ZSBwZXJtaXNzaW9uCisgICAgaWYgKCF1c2JfZGV2aWNlX3Jlb3Blbl93cml0ZWFibGUoZGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbWVtc2V0KCZjdHJsLCAwLCBzaXplb2YoY3RybCkpOworICAgIGN0cmwuYlJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CisgICAgY3RybC5iUmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgY3RybC53VmFsdWUgPSB2YWx1ZTsKKyAgICBjdHJsLndJbmRleCA9IGluZGV4OworICAgIGN0cmwud0xlbmd0aCA9IGxlbmd0aDsKKyAgICBjdHJsLmRhdGEgPSBidWZmZXI7CisgICAgY3RybC50aW1lb3V0ID0gdGltZW91dDsKKyAgICByZXR1cm4gaW9jdGwoZGV2aWNlLT5mZCwgVVNCREVWRlNfQ09OVFJPTCwgJmN0cmwpOworfQorCitpbnQgdXNiX2RldmljZV9idWxrX3RyYW5zZmVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworICAgIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIgIGN0cmw7CisKKyAgICAvLyBuZWVkIHRvIGxpbWl0IHJlcXVlc3Qgc2l6ZSB0byBhdm9pZCBFSU5WQUwKKyAgICBpZiAobGVuZ3RoID4gTUFYX1VTQkZTX0JVRkZFUl9TSVpFKQorICAgICAgICBsZW5ndGggPSBNQVhfVVNCRlNfQlVGRkVSX1NJWkU7CisKKyAgICBtZW1zZXQoJmN0cmwsIDAsIHNpemVvZihjdHJsKSk7CisgICAgY3RybC5lcCA9IGVuZHBvaW50OworICAgIGN0cmwubGVuID0gbGVuZ3RoOworICAgIGN0cmwuZGF0YSA9IGJ1ZmZlcjsKKyAgICBjdHJsLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIHJldHVybiBpb2N0bChkZXZpY2UtPmZkLCBVU0JERVZGU19CVUxLLCAmY3RybCk7Cit9CisKK3N0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3JlcXVlc3RfbmV3KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisgICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfZGVzYykKK3sKKyAgICBzdHJ1Y3QgdXNiZGV2ZnNfdXJiICp1cmIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c2JkZXZmc191cmIpKTsKKyAgICBpZiAoIXVyYikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoKGVwX2Rlc2MtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKQorICAgICAgICB1cmItPnR5cGUgPSBVU0JERVZGU19VUkJfVFlQRV9CVUxLOworICAgIGVsc2UgaWYgKChlcF9kZXNjLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorICAgICAgICB1cmItPnR5cGUgPSBVU0JERVZGU19VUkJfVFlQRV9JTlRFUlJVUFQ7CisgICAgZWxzZSB7CisgICAgICAgIEQoIlVuc3VwcG9ydGVkIGVuZHBvaW50IHR5cGUgJWQiLCBlcF9kZXNjLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSyk7CisgICAgICAgIGZyZWUodXJiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHVyYi0+ZW5kcG9pbnQgPSBlcF9kZXNjLT5iRW5kcG9pbnRBZGRyZXNzOworCisgICAgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c2JfcmVxdWVzdCkpOworICAgIGlmICghcmVxKSB7CisgICAgICAgIGZyZWUodXJiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVxLT5kZXYgPSBkZXY7CisgICAgcmVxLT5tYXhfcGFja2V0X3NpemUgPSBfX2xlMTZfdG9fY3B1KGVwX2Rlc2MtPndNYXhQYWNrZXRTaXplKTsKKyAgICByZXEtPnByaXZhdGVfZGF0YSA9IHVyYjsKKyAgICByZXEtPmVuZHBvaW50ID0gdXJiLT5lbmRwb2ludDsKKyAgICB1cmItPnVzZXJjb250ZXh0ID0gcmVxOworCisgICAgcmV0dXJuIHJlcTsKK30KKwordm9pZCB1c2JfcmVxdWVzdF9mcmVlKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworICAgIGZyZWUocmVxLT5wcml2YXRlX2RhdGEpOworICAgIGZyZWUocmVxKTsKK30KKworaW50IHVzYl9yZXF1ZXN0X3F1ZXVlKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworICAgIHN0cnVjdCB1c2JkZXZmc191cmIgKnVyYiA9IChzdHJ1Y3QgdXNiZGV2ZnNfdXJiKilyZXEtPnByaXZhdGVfZGF0YTsKKyAgICBpbnQgcmVzOworCisgICAgdXJiLT5zdGF0dXMgPSAtMTsKKyAgICB1cmItPmJ1ZmZlciA9IHJlcS0+YnVmZmVyOworICAgIC8vIG5lZWQgdG8gbGltaXQgcmVxdWVzdCBzaXplIHRvIGF2b2lkIEVJTlZBTAorICAgIGlmIChyZXEtPmJ1ZmZlcl9sZW5ndGggPiBNQVhfVVNCRlNfQlVGRkVSX1NJWkUpCisgICAgICAgIHVyYi0+YnVmZmVyX2xlbmd0aCA9IE1BWF9VU0JGU19CVUZGRVJfU0laRTsKKyAgICBlbHNlCisgICAgICAgIHVyYi0+YnVmZmVyX2xlbmd0aCA9IHJlcS0+YnVmZmVyX2xlbmd0aDsKKworICAgIGRvIHsKKyAgICAgICAgcmVzID0gaW9jdGwocmVxLT5kZXYtPmZkLCBVU0JERVZGU19TVUJNSVRVUkIsIHVyYik7CisgICAgfSB3aGlsZSgocmVzIDwgMCkgJiYgKGVycm5vID09IEVJTlRSKSk7CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXF1ZXN0X3dhaXQoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZGV2ZnNfdXJiICp1cmIgPSBOVUxMOworICAgIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gTlVMTDsKKyAgICBpbnQgcmVzOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IHJlcyA9IGlvY3RsKGRldi0+ZmQsIFVTQkRFVkZTX1JFQVBVUkIsICZ1cmIpOworICAgICAgICBEKCJVU0JERVZGU19SRUFQVVJCIHJldHVybmVkICVkXG4iLCByZXMpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgaWYoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEQoIlsgcmVhcCB1cmIgLSBlcnJvciBdXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRCgiWyB1cmIgQCVwIHN0YXR1cyA9ICVkLCBhY3R1YWwgPSAlZCBdXG4iLAorICAgICAgICAgICAgICAgIHVyYiwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisgICAgICAgICAgICByZXEgPSAoc3RydWN0IHVzYl9yZXF1ZXN0Kil1cmItPnVzZXJjb250ZXh0OworICAgICAgICAgICAgcmVxLT5hY3R1YWxfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVxOworfQorCitpbnQgdXNiX3JlcXVlc3RfY2FuY2VsKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworICAgIHN0cnVjdCB1c2JkZXZmc191cmIgKnVyYiA9ICgoc3RydWN0IHVzYmRldmZzX3VyYiopcmVxLT5wcml2YXRlX2RhdGEpOworICAgIHJldHVybiBpb2N0bChyZXEtPmRldi0+ZmQsIFVTQkRFVkZTX0RJU0NBUkRVUkIsICZ1cmIpOworfQorCmRpZmYgLS1naXQgYS9sb2djYXQvZXZlbnQubG9ndGFncyBiL2xvZ2NhdC9ldmVudC5sb2d0YWdzCmluZGV4IDAwODNjNTcuLjJlODE0ZmYgMTAwNjQ0Ci0tLSBhL2xvZ2NhdC9ldmVudC5sb2d0YWdzCisrKyBiL2xvZ2NhdC9ldmVudC5sb2d0YWdzCkBAIC02Myw0NyArNjMsNyBAQAogIyBaeWdvdGVJbml0IGNsYXNzIHByZWxvYWRpbmcgZW5kczoKIDMwMzAgYm9vdF9wcm9ncmVzc19wcmVsb2FkX2VuZCAodGltZXwyfDMpCiAKLSMgZHZtX2djX2luZm86IExJU1QgKExPTkcsIExPTkcsIExPTkcpCi0jCi0jIEZpcnN0IExPTkc6Ci0jCi0jICAgIFs2M10gICAgMQotIyAgICBbNjItMjRdIEFTQ0lJIHByb2Nlc3MgaWRlbnRpZmllcgotIyAgICBbMjMtMTJdIEdDIHRpbWUgaW4gbXMKLSMgICAgWzExLSAwXSBCeXRlcyBmcmVlZAotIwotIyBTZWNvbmQgTE9ORyAoYWdncmVnYXRlZCBoZWFwIGluZm8pOgotIwotIyAgICBbNjMtNjJdIDEwCi0jICAgIFs2MS02MF0gUmVzZXJ2ZWQ7IG11c3QgYmUgemVybwotIyAgICBbNTktNDhdIE9iamVjdHMgZnJlZWQKLSMgICAgWzQ3LTM2XSBBY3R1YWwgc2l6ZSAoY3VycmVudCBmb290cHJpbnQpCi0jICAgIFszNS0yNF0gQWxsb3dlZCBzaXplIChjdXJyZW50IGhhcmQgbWF4KQotIyAgICBbMjMtMTJdIE9iamVjdHMgYWxsb2NhdGVkCi0jICAgIFsxMS0gMF0gQnl0ZXMgYWxsb2NhdGVkCi0jCi0jIFRoaXJkIExPTkcgKHp5Z290ZSBoZWFwIGluZm8pOgotIwotIyAgICBbNjMtNjJdIDExCi0jICAgIFs2MS02MF0gUmVzZXJ2ZWQ7IG11c3QgYmUgemVybwotIyAgICBbNTktNDhdIFNvZnQgbGltaXQKLSMgICAgWzQ3LTM2XSBBY3R1YWwgc2l6ZSAoY3VycmVudCBmb290cHJpbnQpCi0jICAgIFszNS0yNF0gQWxsb3dlZCBzaXplIChjdXJyZW50IGhhcmQgbWF4KQotIyAgICBbMjMtMTJdIE9iamVjdHMgYWxsb2NhdGVkCi0jICAgIFsxMS0gMF0gQnl0ZXMgYWxsb2NhdGVkCi0jCi0jIEZvdXJ0aCBMT05HOgotIwotIyAgICBbNjMtNDhdIFJlc2VydmVkOyBtdXN0IGJlIHplcm8KLSMgICAgWzQ3LTM2XSBkbG1hbGxvY0Zvb3RwcmludAotIyAgICBbMzUtMjRdIG1hbGxpbmZvOiB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UKLSMgICAgWzIzLTEyXSBFeHRlcm5hbCBieXRlIGxpbWl0Ci0jICAgIFsxMS0gMF0gRXh0ZXJuYWwgYnl0ZXMgYWxsb2NhdGVkCi0jCi0jIFNlZSBIZWFwRGVidWcuYwotIwotMjAwMDEgZHZtX2djX2luZm8gKGN1c3RvbXwyKSwoY3VzdG9tfDIpLChjdXN0b218MiksKGN1c3RvbXwyKQotMjAwMDIgZHZtX2djX21hZHZpc2VfaW5mbyAodG90YWx8MXwyKSwoenlnb3RlfDF8MikKKyMgRGFsdmlrIFZNCiAyMDAwMyBkdm1fbG9ja19zYW1wbGUgKHByb2Nlc3N8MyksKG1haW58MXw1KSwodGhyZWFkfDMpLCh0aW1lfDF8MyksKGZpbGV8MyksKGxpbmV8MXw1KSwob3duZXJmaWxlfDMpLChvd25lcmxpbmV8MXw1KSwoc2FtcGxlX3BlcmNlbnR8MXw2KQogCiA3NTAwMCBzcWxpdGVfbWVtX2FsYXJtX2N1cnJlbnQgKGN1cnJlbnR8MXwyKQpAQCAtMTE1LDMxICs3NSwyMCBAQAogNTAwMDAgbWVudV9pdGVtX3NlbGVjdGVkIChNZW51IHR5cGUgd2hlcmUgMCBpcyBvcHRpb25zIGFuZCAxIGlzIGNvbnRleHR8MXw1KSwoTWVudSBpdGVtIHRpdGxlfDMpCiA1MDAwMSBtZW51X29wZW5lZCAoTWVudSB0eXBlIHdoZXJlIDAgaXMgb3B0aW9ucyBhbmQgMSBpcyBjb250ZXh0fDF8NSkKIAotIyBXaS1GaSBuZXR3b3JrIHN0YXRlIGNoYW5nZWQ6Ci0jIFszMS0gNl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSMgWyA1LSAwXSBEZXRhaWxlZCBzdGF0ZSBvcmRpbmFsIChhcyBkZWZpbmVkIGJ5IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUpCi01MDAyMSB3aWZpX25ldHdvcmtfc3RhdGVfY2hhbmdlZCAobmV0d29ya19zdGF0ZXwxfDUpCi0KLSMgV2ktRmkgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2VkOgotIyBbMzEtIDZdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0jIFsgNS0gMF0gU3VwcGxpY2FudCBzdGF0ZSBvcmRpbmFsIChhcyBkZWZpbmVkIGJ5IFN1cHBsaWNhbnRTdGF0ZSkKLTUwMDIyIHdpZmlfc3VwcGxpY2FudF9zdGF0ZV9jaGFuZ2VkIChzdXBwbGljYW50X3N0YXRlfDF8NSkKLQotIyBXaS1GaSBkcml2ZXIgc3RhdGUgY2hhbmdlZDoKLSMgWzMxLSAxXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotIyBbIDAtIDBdIERyaXZlciBzdGFydCAoMSkgb3Igc3RvcHBlZCAoMCkKLTUwMDIzIHdpZmlfZHJpdmVyX3N0YXRlX2NoYW5nZWQgKGRyaXZlcl9zdGF0ZXwxfDUpCi0KLSMgV2ktRmkgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RhdGUgY2hhbmdlZDoKLSMgWzMxLSAxXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotIyBbIDAtIDBdIEludGVyZmFjZSBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCAoMSkgb3IgZmFpbGVkICgwKQotNTAwMjQgd2lmaV9pbnRlcmZhY2VfY29uZmlndXJhdGlvbl9zdGF0ZV9jaGFuZ2VkIChJUF9jb25maWd1cmF0aW9ufDF8NSkKLQotIyBXaS1GaSBzdXBwbGljYW50IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoKLSMgWzMxLSAyXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotIyBbIDEtIDBdIENvbm5lY3RlZCB0byBzdXBwbGljYW50ICgxKSBvciBkaXNjb25uZWN0ZWQgZnJvbSBzdXBwbGljYW50ICgwKSwKLSMgICAgICAgICBvciBzdXBwbGljYW50IGRpZWQgKDIpCi01MDAyNSB3aWZpX3N1cHBsaWNhbnRfY29ubmVjdGlvbl9zdGF0ZV9jaGFuZ2VkIChjb25uZWN0ZWR8MXw1KQorIyBIU00gd2lmaSBzdGF0ZSBjaGFuZ2UKKyMgSGllcmFyY2hpY2FsIHN0YXRlIGNsYXNzIG5hbWUgKGFzIGRlZmluZWQgaW4gV2lmaVN0YXRlVHJhY2tlci5qYXZhKQorIyBMb2dnZWQgb24gZXZlcnkgc3RhdGUgY2hhbmdlIGluIHRoZSBoaWVyYXJjaGljYWwgc3RhdGUgbWFjaGluZQorNTAwMjEgd2lmaV9zdGF0ZV9jaGFuZ2VkICh3aWZpX3N0YXRlfDMpCisjIEhTTSB3aWZpIGV2ZW50CisjIFszMS0xNl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyMgWzE1IC0gMF0gSFNNIGV2ZW50IChhcyBkZWZpbmVkIGluIFdpZmlTdGF0ZVRyYWNrZXIuamF2YSkKKyMgTG9nZ2VkIHdoZW4gYW4gZXZlbnQgaXMgaGFuZGxlZCBpbiBhIGhpZXJhcmNoaWNhbCBzdGF0ZQorNTAwMjIgd2lmaV9ldmVudF9oYW5kbGVkICh3aWZpX2V2ZW50fDF8NSkKKyMgU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UKKyMgWzMxLTEzXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorIyBbOCAtIDBdIFN1cHBsaWNhbnQgc3RhdGUgKGFzIGRlZmluZWQgaW4gU3VwcGxpY2FudFN0YXRlLmphdmEpCisjIExvZ2dlZCB3aGVuIHRoZSBzdXBwbGljYW50IHN3aXRjaGVzIHRvIGEgbmV3IHN0YXRlCis1MDAyMyB3aWZpX3N1cHBsaWNhbnRfc3RhdGVfY2hhbmdlZCAoc3VwcGxpY2FudF9zdGF0ZXwxfDUpCiAKICMgRG8gbm90IGNoYW5nZSB0aGVzZSBuYW1lcyB3aXRob3V0IHVwZGF0aW5nIHRhZyBpbjoKICMvL2RldmljZS9kYWx2aWsvbGliY29yZS9sdW5pL3NyYy9tYWluL25hdGl2ZS9vcmdfYXBhY2hlX2hhcm1vbnlfbHVuaV9wbGF0Zm9ybV9PU05ldHdvcmtTeXN0ZW0uYwpkaWZmIC0tZ2l0IGEvbG9nY2F0L2xvZ2NhdC5jcHAgYi9sb2djYXQvbG9nY2F0LmNwcAppbmRleCA1YWNkZjc3Li45NmI2OGVmIDEwMDY0NAotLS0gYS9sb2djYXQvbG9nY2F0LmNwcAorKysgYi9sb2djYXQvbG9nY2F0LmNwcApAQCAtNDAyLDggKzQwMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICIgIC1kICAgICAgICAgICAgICBkdW1wIHRoZSBsb2cgYW5kIHRoZW4gZXhpdCAoZG9uJ3QgYmxvY2spXG4iCiAgICAgICAgICAgICAgICAgICAgICIgIC10IDxjb3VudD4gICAgICBwcmludCBvbmx5IHRoZSBtb3N0IHJlY2VudCA8Y291bnQ+IGxpbmVzIChpbXBsaWVzIC1kKVxuIgogICAgICAgICAgICAgICAgICAgICAiICAtZyAgICAgICAgICAgICAgZ2V0IHRoZSBzaXplIG9mIHRoZSBsb2cncyByaW5nIGJ1ZmZlciBhbmQgZXhpdFxuIgotICAgICAgICAgICAgICAgICAgICAiICAtYiA8YnVmZmVyPiAgICAgcmVxdWVzdCBhbHRlcm5hdGUgcmluZyBidWZmZXJcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICgnbWFpbicgKGRlZmF1bHQpLCAncmFkaW8nLCAnZXZlbnRzJylcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgLWIgPGJ1ZmZlcj4gICAgIFJlcXVlc3QgYWx0ZXJuYXRlIHJpbmcgYnVmZmVyLCAnbWFpbicsICdzeXN0ZW0nLCAncmFkaW8nXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICBvciAnZXZlbnRzJy4gTXVsdGlwbGUgLWIgcGFyYW1ldGVycyBhcmUgYWxsb3dlZCBhbmQgdGhlXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICByZXN1bHRzIGFyZSBpbnRlcmxlYXZlZC4gVGhlIGRlZmF1bHQgaXMgLWIgbWFpbiAtYiBzeXN0ZW0uXG4iCiAgICAgICAgICAgICAgICAgICAgICIgIC1CICAgICAgICAgICAgICBvdXRwdXQgdGhlIGxvZyBpbiBiaW5hcnkiKTsKIAogCmRpZmYgLS1naXQgYS9ta2Jvb3RpbWcvQW5kcm9pZC5tayBiL21rYm9vdGltZy9BbmRyb2lkLm1rCmluZGV4IDE4ZjBmZjMuLjJhOTdjMjYgMTAwNjQ0Ci0tLSBhL21rYm9vdGltZy9BbmRyb2lkLm1rCisrKyBiL21rYm9vdGltZy9BbmRyb2lkLm1rCkBAIC05LDQgKzksNCBAQAogCiBpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQogCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWQsJChMT0NBTF9CVUlMVF9NT0RVTEUpKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRpc3RfZmlsZXMsJChMT0NBTF9CVUlMVF9NT0RVTEUpKQpkaWZmIC0tZ2l0IGEvbWtzaC9BbmRyb2lkLm1rIGIvbWtzaC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1M2I4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgwqkgMjAxMAorIwlUaG9yc3RlbiBHbGFzZXIgPHQuZ2xhc2VyQHRhcmVudC5kZT4KKyMgVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIG1rc2guCisKK0xPQ0FMX1BBVEg6PQkJJChjYWxsIG15LWRpcikKKworCisjIC9zeXN0ZW0vZXRjL21rc2hyYworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0JCW1rc2hyYworTE9DQUxfTU9EVUxFX1RBR1M6PQlzaGVsbF9ta3NoCitMT0NBTF9NT0RVTEVfQ0xBU1M6PQlFVEMKK0xPQ0FMX01PRFVMRV9QQVRIOj0JJChUQVJHRVRfT1VUKS9ldGMKK0xPQ0FMX1NSQ19GSUxFUzo9CSQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisKKyMgL3N5c3RlbS9iaW4vbWtzaAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0JCW1rc2gKK0xPQ0FMX01PRFVMRV9UQUdTOj0Jc2hlbGxfbWtzaAorCisjIG1rc2ggc291cmNlIGZpbGVzCitMT0NBTF9TUkNfRklMRVM6PQlzcmMvbGFsbG9jLmMgc3JjL2VkaXQuYyBzcmMvZXZhbC5jIHNyYy9leGVjLmMgXAorCQkJc3JjL2V4cHIuYyBzcmMvZnVuY3MuYyBzcmMvaGlzdHJhcC5jIHNyYy9qb2JzLmMgXAorCQkJc3JjL2xleC5jIHNyYy9tYWluLmMgc3JjL21pc2MuYyBzcmMvc2hmLmMgXAorCQkJc3JjL3N5bi5jIHNyYy90cmVlLmMgc3JjL3Zhci5jCisKK0xPQ0FMX1NZU1RFTV9TSEFSRURfTElCUkFSSUVTOj0gbGliYworCitMT0NBTF9DX0lOQ0xVREVTOj0JJChMT0NBTF9QQVRIKS9zcmMKKyMgYWRkaXRpb25hbCBmbGFncyBmaXJzdCwgdGhlbiBmcm9tIE1ha2VmcmFnLmluYzogQ0ZMQUdTLCBDUFBGTEFHUworTE9DQUxfQ0ZMQUdTOj0JCS1ETUtTSF9ERUZBVUxUX0VYRUNTSEVMTD1cIi9zeXN0ZW0vYmluL3NoXCIgXAorCQkJLURNS1NIX0RFRkFVTFRfVE1QRElSPVwiL3NxbGl0ZV9zdG10X2pvdXJuYWxzXCIgXAorCQkJLURNS1NIUkNfUEFUSD1cIi9zeXN0ZW0vZXRjL21rc2hyY1wiIFwKKwkJCS1md3JhcHYgXAorCQkJLURNS1NIX0FTU1VNRV9VVEY4PTAgLURNS1NIX05PUFdOQU0gXAorCQkJLURfR05VX1NPVVJDRSBcCisJCQktREhBVkVfQVRUUklCVVRFX0JPVU5ERUQ9MCAtREhBVkVfQVRUUklCVVRFX0ZPUk1BVD0xIFwKKwkJCS1ESEFWRV9BVFRSSUJVVEVfTk9OTlVMTD0xIC1ESEFWRV9BVFRSSUJVVEVfTk9SRVRVUk49MSBcCisJCQktREhBVkVfQVRUUklCVVRFX1VOVVNFRD0xIC1ESEFWRV9BVFRSSUJVVEVfVVNFRD0xIFwKKwkJCS1ESEFWRV9TWVNfUEFSQU1fSD0xIC1ESEFWRV9TWVNfTUtERVZfSD0wIFwKKwkJCS1ESEFWRV9TWVNfTU1BTl9IPTEgLURIQVZFX1NZU19TWVNNQUNST1NfSD0xIFwKKwkJCS1ESEFWRV9HUlBfSD0xIC1ESEFWRV9MSUJHRU5fSD0xIC1ESEFWRV9MSUJVVElMX0g9MCBcCisJCQktREhBVkVfUEFUSFNfSD0xIC1ESEFWRV9TVERCT09MX0g9MSAtREhBVkVfU1RESU5UX0g9MSBcCisJCQktREhBVkVfU1RSSU5HU19IPTEgLURIQVZFX1VMSU1JVF9IPTAgLURIQVZFX1ZBTFVFU19IPTAgXAorCQkJLURIQVZFX0NBTl9JTlRUWVBFUz0xIC1ESEFWRV9DQU5fVUNCSU5UUz0xIFwKKwkJCS1ESEFWRV9DQU5fSU5UOFRZUEU9MSAtREhBVkVfQ0FOX1VDQklOVDg9MSBcCisJCQktREhBVkVfUkxJTV9UPTEgLURIQVZFX1NJR19UPTEgLURIQVZFX1NZU19TSUdOQU1FPTEgXAorCQkJLURIQVZFX1NZU19TSUdMSVNUPTEgLURIQVZFX1NUUlNJR05BTD0wIFwKKwkJCS1ESEFWRV9HRVRSVVNBR0U9MSAtREhBVkVfS0lMTFBHPTEgLURIQVZFX01LTk9EPTAgXAorCQkJLURIQVZFX01LU1RFTVA9MSAtREhBVkVfTklDRT0xIC1ESEFWRV9SRVZPS0U9MCBcCisJCQktREhBVkVfU0VUTE9DQUxFX0NUWVBFPTAgLURIQVZFX0xBTkdJTkZPX0NPREVTRVQ9MCBcCisJCQktREhBVkVfU0VUTU9ERT0xIC1ESEFWRV9TRVRSRVNVR0lEPTEgXAorCQkJLURIQVZFX1NFVEdST1VQUz0xIC1ESEFWRV9TVFJDQVNFU1RSPTEgXAorCQkJLURIQVZFX1NUUkxDUFk9MSAtREhBVkVfRkxPQ0tfREVDTD0xIFwKKwkJCS1ESEFWRV9SRVZPS0VfREVDTD0xIC1ESEFWRV9TWVNfU0lHTElTVF9ERUNMPTEgXAorCQkJLURIQVZFX1BFUlNJU1RFTlRfSElTVE9SWT0wCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbGliYWNjL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvbWtzaC9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliYWNjL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCnJlbmFtZSB0byBta3NoL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCmRpZmYgLS1naXQgYS9ta3NoL05PVElDRSBiL21rc2gvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDA2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL05PVElDRQpAQCAtMCwwICsxLDIxIEBACitta3NoIGlzIGNvdmVyZWQgYnkgVGhlIE1pck9TIExpY2VuY2U6CisKKy8qLQorICogQ29weXJpZ2h0IMKpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW7igJAKKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQg4oCcQVMgSVPigJ0gYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbuKAmXMgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KZGlmZiAtLWdpdCBhL21rc2gvbWttZi5zaCBiL21rc2gvbWttZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQwNDMyCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9ta21mLnNoCkBAIC0wLDAgKzEsMTI0IEBACisjIENvcHlyaWdodCDCqSAyMDEwCisjCVRob3JzdGVuIEdsYXNlciA8dC5nbGFzZXJAdGFyZW50LmRlPgorIyBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgbWtzaC4KKyMtCisjIEhlbHBlciBzY3JpcHQgdG8gbGV0IHNyYy9CdWlsZC5zaCBnZW5lcmF0ZSBNYWtlZnJhZy5pbmMKKyMgd2hpY2ggd2UgaW4gdHVybiB1c2UgaW4gdGhlIG1hbnVhbCBjcmVhdGlvbiBvZiBBbmRyb2lkLm1rCisjCisjIFRoaXMgc2NyaXB0IGlzIHN1cHBvc2VkIHRvIGJlIHJ1biBmcm9tL2luc2lkZSBBT1NQIGJ5IHRoZQorIyBwb3J0ZXIgb2YgbWtzaCB0byBBbmRyb2lkIChhbmQgb25seSBtYW51YWxseSkuCisKK2NkICIkKGRpcm5hbWUgIiQwIikiCitzcmNkaXI9JChwd2QpCitybSAtcmYgdG1wCitta2RpciB0bXAKK2NkIC4uLy4uLy4uCithb3NwZGlyPSQocHdkKQorY2QgJHNyY2Rpci90bXAKKworYWRkdmFyKCkgeworCV92bj0kMTsgc2hpZnQKKworCWV2YWwgJF92bj1cIlwkJF92biAnJCoiJworfQorCitDRkxBR1M9CitDUFBGTEFHUz0KK0xERkxBR1M9CitMSUJTPQorCisjIFRoZSBkZWZpbml0aW9ucyBiZWxvdyB3ZXJlIGdlbmVyYXRlZCBieSBleGFtaW5pbmcgdGhlCisjIG91dHB1dCBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjIG1ha2Ugc2hvd2NvbW1hbmRzIG91dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL3N5c3RlbS9iaW4vbWtzaCAyPiYxIHwgdGVlIGxvZworIworIyBUaGV5IGFyZSBvbmx5IHVzZWQgdG8gbGV0IEJ1aWxkLnNoIGZpbmQgdGhlIGNvbXBpbGVyLCBoZWFkZXIKKyMgZmlsZXMsIGxpbmtlciBhbmQgbGlicmFyaWVzIHRvIGdlbmVyYXRlIE1ha2VmcmFnLmluYyAoc2ltaWxhcgorIyB0byB3aGF0IEdOVSBhdXRvdG9vbHPigJkgY29uZmlndXJlIHNjcmlwdHMgZG8pLCBhbmQgbmV2ZXIgdXNlZAorIyBkdXJpbmcgdGhlIHJlYWwgYnVpbGQgcHJvY2Vzcy4gV2UgbmVlZCB0aGlzIHRvIHBvcnQgbWtzaCB0bworIyB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhbmQgaXQgaXMgY3J1Y2lhbCB0aGVzZSBhcmUgYXMgY2xvc2UgYXMKKyMgcG9zc2libGUgdG8gdGhlIHZhbHVlcyB1c2VkIGxhdGVyLiAoWW91IGFsc28gbXVzdCBleGFtcGxlIHRoZQorIyByZXN1bHRzIGdhdGhlcmVkIGZyb20gTWFrZWZyYWcuaW5jIHRvIHNlZSB0aGV5IGFyZSB0aGUgc2FtZQorIyBhY3Jvc3MgYWxsIEFuZHJvaWQgcGxhdGZvcm1zLCBvciBhZGQgYXBwcm9wcmlhdGUgaWZkZWZzLikKKyMgU2luY2Ugd2Ugbm8gbG9uZ2VyIHVzZSB0aGUgTkRLLCB0aGUgQU9TUCBoYXMgdG8gaGF2ZSBiZWVuCisjIGJ1aWx0IGJlZm9yZSB1c2luZyB0aGlzIHNjcmlwdCAodGFyZ2V0dGluZyBnZW5lcmljL2VtdWxhdG9yKS4KKworQ0M9JGFvc3BkaXIvcHJlYnVpbHQvbGludXgteDg2L3Rvb2xjaGFpbi9hcm0tZWFiaS00LjQuMC9iaW4vYXJtLWVhYmktZ2NjCithZGR2YXIgQ1BQRkxBR1MgLUkkYW9zcGRpci9zeXN0ZW0vY29yZS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2hhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvc3lzdGVtL2NvcmUvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9oYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2hhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2hhcmR3YXJlL3JpbC9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2RhbHZpay9saWJuYXRpdmVoZWxwZXIvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9mcmFtZXdvcmtzL2Jhc2Uvb3BlbmdsL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvZXh0ZXJuYWwvc2tpYS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJjL2FyY2gtYXJtL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYmMvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYmMva2VybmVsL2NvbW1vbiBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGliYy9rZXJuZWwvYXJjaC1hcm0gXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYm0vaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGlibS9pbmNsdWRlL2FyY2gvYXJtIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJ0aHJlYWRfZGIvaW5jbHVkZSBcCisgICAgLURfX0FSTV9BUkNIXzVfXyAtRF9fQVJNX0FSQ0hfNVRfXyAtRF9fQVJNX0FSQ0hfNUVfXyAtRF9fQVJNX0FSQ0hfNVRFX18gXAorICAgIC1JJGFvc3BkaXIvc3lzdGVtL2NvcmUvaW5jbHVkZS9hcmNoL2xpbnV4LWFybS8gXAorICAgIC1pbmNsdWRlICRhb3NwZGlyL3N5c3RlbS9jb3JlL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vQW5kcm9pZENvbmZpZy5oIFwKKyAgICAtREFORFJPSUQgLUROREVCVUcgLVVERUJVRworYWRkdmFyIENGTEFHUyAtZm5vLWV4Y2VwdGlvbnMgLVduby1tdWx0aWNoYXIgLW1zb2Z0LWZsb2F0IC1mcGljIFwKKyAgICAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mdW53aW5kLXRhYmxlcyAtZnN0YWNrLXByb3RlY3RvciAtZm5vLXNob3J0LWVudW1zIFwKKyAgICAtbWFyY2g9YXJtdjV0ZSAtbXR1bmU9eHNjYWxlIC1tdGh1bWItaW50ZXJ3b3JrIC1mbWVzc2FnZS1sZW5ndGg9MCBcCisgICAgLVcgLVdhbGwgLVduby11bnVzZWQgLVdpbml0LXNlbGYgLVdwb2ludGVyLWFyaXRoIC1XZXJyb3I9cmV0dXJuLXR5cGUgXAorICAgIC1XZXJyb3I9bm9uLXZpcnR1YWwtZHRvciAtV2Vycm9yPWFkZHJlc3MgLVdlcnJvcj1zZXF1ZW5jZS1wb2ludCBcCisgICAgLVdzdHJpY3QtYWxpYXNpbmc9MiAtZmlubGluZS1mdW5jdGlvbnMgLWZuby1pbmxpbmUtZnVuY3Rpb25zLWNhbGxlZC1vbmNlIFwKKyAgICAtZmdjc2UtYWZ0ZXItcmVsb2FkIC1mcmVydW4tY3NlLWFmdGVyLWxvb3AgLWZyZW5hbWUtcmVnaXN0ZXJzIC1tdGh1bWIgXAorICAgIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZmlubGluZS1saW1pdD02NAorYWRkdmFyIExERkxBR1MgLW5vc3RkbGliIC1CZHluYW1pYyAtV2wsLVQsJGFvc3BkaXIvYnVpbGQvY29yZS9hcm1lbGYueCBcCisgICAgLVdsLC1keW5hbWljLWxpbmtlciwvc3lzdGVtL2Jpbi9saW5rZXIgLVdsLC0tZ2Mtc2VjdGlvbnMgXAorICAgIC1XbCwteixub2NvcHlyZWxvYyAtV2wsLS1uby11bmRlZmluZWQgXAorICAgICRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9saWIvY3J0YmVnaW5fZHluYW1pYy5vCithZGR2YXIgTElCUyAtTCRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9saWIgXAorICAgIC1XbCwtcnBhdGgtbGluaz0kYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliIC1sYyBcCisgICAgJGFvc3BkaXIvcHJlYnVpbHQvbGludXgteDg2L3Rvb2xjaGFpbi9hcm0tZWFiaS00LjQuMC9iaW4vLi4vbGliL2djYy9hcm0tZWFiaS80LjQuMC9pbnRlcndvcmsvbGliZ2NjLmEgXAorICAgICRhb3NwZGlyL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL29iai9saWIvY3J0ZW5kX2FuZHJvaWQubworCisKKyMjIyBPdmVycmlkZSBmbGFncworIyBXZSBkb27igJl0IGV2ZW4gKnN1cHBvcnQqIFVURi04IGJ5IGRlZmF1bHQg4pi5CithZGR2YXIgQ1BQRkxBR1MgLURNS1NIX0FTU1VNRV9VVEY4PTAKKyMgTm8gZ2V0cHduYW0oKSBjYWxscyAoYWZmZWN0cyAiY2QgfnVzZXJuYW1lLyIgb25seSkKK2FkZHZhciBDUFBGTEFHUyAtRE1LU0hfTk9QV05BTQorIyBDb21waWxlIGFuIGV4dHJhIHNtYWxsIG1rc2ggKG9wdGlvbmFsKQorI2FkZHZhciBDUFBGTEFHUyAtRE1LU0hfU01BTEwKKyMgTGVhdmUgb3V0IHRoZSB1bGltaXQgYnVpbHRpbgorI2FkZHZhciBDUFBGTEFHUyAtRE1LU0hfTk9fTElNSVRTCisKKyMgU2V0IHRhcmdldCBwbGF0Zm9ybQorVEFSR0VUX09TPUxpbnV4CisjIEJ1aWxkaW5nIHdpdGggLXN0ZD1jOTkgb3IgLXN0ZD1nbnU5OSBjbGFzaGVzIHdpdGggQmlvbmljIGhlYWRlcnMKK0hBVkVfQ0FOX1NUREc5OT0wCitIQVZFX0NBTl9TVERDOTk9MAorZXhwb3J0IEhBVkVfQ0FOX1NUREc5OSBIQVZFX0NBTl9TVERDOTkKKworIyBBbmRyb2lkLXg4NiBkb2VzIG5vdCBoYXZlIGhlbHBlciBmdW5jdGlvbnMgZm9yIFByb1BvbGljZSBTU1AKKyMgYW5kIEFPU1AgYWRkcyB0aGUgZmxhZ3MgYnkgaXRzZWxmIChzYW1lIGZvciB3YXJuaW5nIGZsYWdzKQorSEFWRV9DQU5fRk5PU1RSSUNUQUxJQVNJTkc9MAorSEFWRV9DQU5fRlNUQUNLUFJPVEVDVE9SQUxMPTAKK0hBVkVfQ0FOX1dBTEw9MAorZXhwb3J0IEhBVkVfQ0FOX0ZOT1NUUklDVEFMSUFTSU5HIEhBVkVfQ0FOX0ZTVEFDS1BST1RFQ1RPUkFMTCBIQVZFX0NBTl9XQUxMCisKKyMgZGlzYWJsZSB0aGUgbWtub2QoOCkgYnVpbHQtaW4gdG8gZ2V0IHJpZCBvZiBuZWVkaW5nIHNldG1vZGUuYworSEFWRV9NS05PRD0wOyBleHBvcnQgSEFWRV9NS05PRAorCisjIGV2ZW4gdGhlIGlkZWEgb2YgcGVyc2lzdGVudCBoaXN0b3J5IG9uIGEgcGhvbmUgaXMgZnVubnkKK0hBVkVfUEVSU0lTVEVOVF9ISVNUT1JZPTA7IGV4cG9ydCBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCisjIC4uLiBhbmQgcnVuIGl0IQorZXhwb3J0IENDIENQUEZMQUdTIENGTEFHUyBMREZMQUdTIExJQlMgVEFSR0VUX09TCitzaCAuLi9zcmMvQnVpbGQuc2ggLU0KK3J2PSQ/Cit0ZXN0IHgwID0geCIkcnYiICYmIG12IC1mIE1ha2VmcmFnLmluYyAuLi8KK2NkIC4uCitybSAtcmYgdG1wCitleGl0ICRydgpkaWZmIC0tZ2l0IGEvbWtzaC9ta3NocmMgYi9ta3NoL21rc2hyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGE1ZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9ta3NocmMKQEAgLTAsMCArMSwyOSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTAKKyMJVGhvcnN0ZW4gR2xhc2VyIDx0LmdsYXNlckB0YXJlbnQuZGU+CisjIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBta3NoLgorIy0KKyMgTWluaW1hbCAvc3lzdGVtL2V0Yy9ta3NocmMgZm9yIEFuZHJvaWQKKworOiAke1RFUk06PXZ0MTAwfSAke0hPTUU6PS9kYXRhfSAke01LU0g6PS9zeXN0ZW0vYmluL3NofSAke0hPU1ROQU1FOj1hbmRyb2lkfQorOiAke1NIRUxMOj0kTUtTSH0gJHtVU0VSOj0kKHR5cGVzZXQgeD0kKGlkKTsgeD0ke3gjKlwofTsgcHJpbnQgLXIgLS0gJHt4JSVcKSp9KX0KK2lmICgoIFVTRVJfSUQgKSk7IHRoZW4gUFMxPSckJzsgZWxzZSBQUzE9JyMnOyBmaQorZnVuY3Rpb24gcHJlY21kIHsKKwl0eXBlc2V0IGU9JD8KKworCSgoIGUgKSkgJiYgcHJpbnQgLW4gIiRlfCIKK30KK1BTMT0nJChwcmVjbWQpJFVTRVJAJEhPU1ROQU1FOiR7UFdEOi0/fSAnIiRQUzEgIgorZXhwb3J0IEhPTUUgSE9TVE5BTUUgTUtTSCBQUzEgU0hFTEwgVEVSTSBVU0VSCithbGlhcyBsPSdscycKK2FsaWFzIGxhPSdsIC1hJworYWxpYXMgbGw9J2wgLWwnCithbGlhcyBsbz0nbCAtYSAtbCcKKworZm9yIHAgaW4gfi8uYmluOyBkbworCVtbIC1kICRwLy4gXV0gfHwgY29udGludWUKKwlbWyA6JFBBVEg6ID0gKjokcDoqIF1dIHx8IFBBVEg9JHA6JFBBVEgKK2RvbmUKKwordW5zZXQgcAorCis6IHBsYWNlIGN1c3RvbWlzYXRpb25zIGFib3ZlIHRoaXMgbGluZQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvMDAtTk9URS50eHQgYi9ta3NoL3NyYy8wMC1OT1RFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTFkNTQxCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvMDAtTk9URS50eHQKQEAgLTAsMCArMSwyMiBAQAorVGhpcyBpcyBta3NoIGZyb20gQW5vbkNWUyBvbiAyMDEwLTA4LTI0IHdpdGggdGhlCitmb2xsb3dpbmcgZmlsZXMgcmVtb3ZlZDoKK+KAoiBNYWtlZmlsZQorICAobm90IHBhcnQgb2YgcmVndWxhciBta3NoIHJlbGVhc2VzIGFueXdheSkKK+KAoiBkb3QubWtzaHJjCisgIChub3QgbmVlZGVkLCB3ZSB1c2Ugb3VyIG93biBmb3IgQW5kcm9pZCkKK+KAoiBta3NoLjEKKyAgKG1hbnBhZ2U7IGFsc28gYXZhaWxhYmxlIGZyb20gdGhlIHdlYikKK+KAoiBzZXRtb2RlLmMKKyAgKG5vdCBuZWVkZWQsIHdlIGRvbuKAmXQgdXNlIHRoZSBta25vZCBidWlsdGluKQor4oCiIHN0cmxjcHkuYworICAobm90IG5lZWRlZCwgYmlvbmljIHByb3ZpZGVzIHRoaXMpCisKK1RoZSBtYW51YWwgcGFnZSBjYW4gYmUgZG93bmxvYWRlZCBhcyBQREYgKElTTyBBNCBwYXBlcikgZnJvbQoraHR0cHM6Ly93d3cubWlyYnNkLm9yZy9NaXJPUy9kaXN0L21pci9ta3NoL21rc2gucGRmIG9yIHJlYWQKK29ubGluZSBhdCBodHRwczovL3d3dy5taXJic2Qub3JnL21hbjEvbWtzaCAoSFRNTCkuCisKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyBhcmUgZG9uZSB0byBjb2RlIGluIHRoaXMgc3ViZGlyZWN0b3J5CithdCB0aGUgbW9tZW50Ogor4oCiIGNoZWNrLnQgbWFpbi5zaDogcmVtb3ZlIHRoZSAnc3RvcCcgYWxpYXMgdG8gJ2tpbGwgLVNUT1AnCisgIHNpbmNlIEFuZHJvaWQgaGFzIGEgYnVpbHQgaW4gc3RvcCBjb21tYW5kIHRoYXQgdGhlIGFsaWFzCisgIG92ZXJyaWRlcywgY2F1c2luZyBwcm9ibGVtcyB3aXRoIHRlc3RpbmcgdG9vbHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9CdWlsZC5zaCBiL21rc2gvc3JjL0J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGIxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9CdWlsZC5zaApAQCAtMCwwICsxLDE2MDAgQEAKKyMhL2Jpbi9zaAorc3JjdmVyc2lvbj0nJE1pck9TOiBzcmMvYmluL21rc2gvQnVpbGQuc2gsdiAxLjQ1OSAyMDEwLzA4LzI0IDE1OjQ2OjA2IHRnIEV4cCAkJworIy0KKyMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisjCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyMKKyMgUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisjIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorIyBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyMgbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisjIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisjCisjIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworIyB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyMgaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisjIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorIyBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyMgb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisjIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorIyBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorIy0KKyMgUGVvcGxlIGFuYWx5c2luZyB0aGUgb3V0cHV0IG11c3Qgd2hpdGVsaXN0IGNvbmZ0ZXN0LmMgZm9yIGFueSBraW5kCisjIG9mIGNvbXBpbGVyIHdhcm5pbmcgY2hlY2tzIChtaXJ0b2NvbmYgaXMgYnkgZGVzaWduIG5vdCBxdWlldCkuCisjCisjIEVudmlyb25tZW50IHVzZWQ6CUNDIENGTEFHUyBDUFBGTEFHUyBMREZMQUdTIExJQlMgTk9XQVJOIE5ST0ZGCisjCQkJVEFSR0VUX09TIFRBUkdFVF9PU1JFVgorIyBGZWF0dXJlIHNlbGVjdG9yczoJVVNFX1BSSU5URl9CVUlMVElOCisjIENQUEZMQUdTIHJlY29nbmlzZWQ6CU1LU0hfQVNTVU1FX1VURjggTUtTSF9CSU5TSFJFRFVDRUQgTUtTSF9DTFNfU1RSSU5HCisjCQkJTUtTSF9DT05TRVJWQVRJVkVfRkRTIE1LU0hfTUlETklHSFRCU0QwMUFTSF9DT01QQVQKKyMJCQlNS1NIX05PUFdOQU0gTUtTSF9OT19MSU1JVFMgTUtTSF9TTUFMTCBNS1NIX1NfTk9WSQorIwkJCU1LU0hfVU5FTVBMT1lFRCBNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMIE1LU0hSQ19QQVRICisjCQkJTUtTSF9ERUZBVUxUX1RNUERJUiBNS1NIX0NMUlRPRU9MX1NUUklORyBNS1NIX0E0UEIKKworTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKKwordigpIHsKKwkkZSAiJCoiCisJZXZhbCAiJEAiCit9CisKK3Z2KCkgeworCV9jPSQxCisJc2hpZnQKKwkkZSAiXCQgJCoiIDI+JjEKKwlldmFsICIkQCIgPnZ2Lm91dCAyPiYxCisJc2VkICJzB14HJHtfY30gByIgPHZ2Lm91dAorfQorCit2cSgpIHsKKwlldmFsICIkQCIKK30KKworcm1mKCkgeworCWZvciBfZiBpbiAiJEAiOyBkbworCQljYXNlICR7X2Z9IGluCisJCW1rc2guMSkgOzsKKwkJKikgcm0gLWYgIiR7X2Z9IiA7OworCQllc2FjCisJZG9uZQorfQorCitpZiB0ZXN0IC1kIC91c3IveHBnNC9iaW4vLiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkjIFNvbGFyaXM6IHNvbWUgb2YgdGhlIHRvb2xzIGhhdmUgd2VpcmQgYmVoYXZpb3VyLCB1c2UgcG9ydGFibGUgb25lcworCVBBVEg9L3Vzci94cGc0L2JpbjokUEFUSAorCWV4cG9ydCBQQVRICitmaQorCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3h9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJZW11bGF0ZSBzaAorCU5VTExDTUQ9OgorZmkKKworYWxsdT1RV0VSVFlVSU9QQVNERkdISktMWlhDVkJOTQorYWxsbD1xd2VydHl1aW9wYXNkZmdoamtsenhjdmJubQorYWxsbj0wMTIzNDU2Nzg5CithbGxzPV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitubD0nCisnCit0Y2ZuPW5vCitiaT0KK3VpPQorYW89CitmeD0KK21lPWBiYXNlbmFtZSAiJDAiYAorb3JpZ19DRkxBR1M9JENGTEFHUworcGhhc2U9eAorb2xkaXNoX2VkPXN0ZG91dC1lZCxuby1zdGRlcnItZWQKKworaWYgdGVzdCAtdCAxOyB0aGVuCisJYmk9JxtbMW0nCisJdWk9JxtbNG0nCisJYW89JxtbMG0nCitmaQorCit1cHBlcigpIHsKKwllY2hvIDoiJEAiIHwgc2VkICdzL146Ly8nIHwgdHIgJGFsbGwgJGFsbHUKK30KKworIyBjbGVhbiB1cCBhZnRlciBhY190ZXN0cnVuKCkKK2FjX3Rlc3Rkb25lKCkgeworCWV2YWwgSEFWRV8kZnU9JGZ2CisJZnI9bm8KKwl0ZXN0IDAgPSAkZnYgfHwgZnI9eWVzCisJJGUgIiRiaT09PiAkZmQuLi4kYW8gJHVpJGZyJGFvJGZ4IgorCWZ4PQorfQorCisjIGFjX2NhY2hlIGxhYmVsOiBzZXRzIGYsIGZ1LCBmdj89MAorYWNfY2FjaGUoKSB7CisJZj0kMQorCWZ1PWB1cHBlciAkZmAKKwlldmFsIGZ2PVwkSEFWRV8kZnUKKwljYXNlICRmdiBpbgorCTB8MSkKKwkJZng9JyAoY2FjaGVkKScKKwkJcmV0dXJuIDAKKwkJOzsKKwllc2FjCisJZnY9MAorCXJldHVybiAxCit9CisKKyMgYWNfdGVzdGluaXQgbGFiZWwgWyFdIGNoZWNraWZbIV0wIFtzZXRsYWJlbGlmY2hlY2tpc1shXTBdIHVzZXJvdXRwdXQKKyMgcmV0dXJucyAxIGlmIHZhbHVlIHdhcyBjYWNoZWQvaW1wbGllZCwgMCBvdGhlcndpc2U6IGNhbGwgYWNfdGVzdGRvbmUKK2FjX3Rlc3Rpbml0KCkgeworCWlmIGFjX2NhY2hlICQxOyB0aGVuCisJCXRlc3QgeCIkMiIgPSB4IiEiICYmIHNoaWZ0CisJCXRlc3QgeCIkMiIgPSB4IiIgfHwgc2hpZnQKKwkJZmQ9JHszLSRmfQorCQlhY190ZXN0ZG9uZQorCQlyZXR1cm4gMQorCWZpCisJZmM9MAorCWlmIHRlc3QgeCIkMiIgPSB4IiI7IHRoZW4KKwkJZnQ9MQorCWVsc2UKKwkJaWYgdGVzdCB4IiQyIiA9IHgiISI7IHRoZW4KKwkJCWZjPTEKKwkJCXNoaWZ0CisJCWZpCisJCWV2YWwgZnQ9XCRIQVZFX2B1cHBlciAkMmAKKwkJc2hpZnQKKwlmaQorCWZkPSR7My0kZn0KKwlpZiB0ZXN0ICRmYyA9ICIkZnQiOyB0aGVuCisJCWZ2PSQyCisJCWZ4PScgKGltcGxpZWQpJworCQlhY190ZXN0ZG9uZQorCQlyZXR1cm4gMQorCWZpCisJJGUgLi4uICRmZAorCXJldHVybiAwCit9CisKKyMgcGlwZSAuYyB8IGFjX3Rlc3Rbbl0gWyFdIGxhYmVsIFshXSBjaGVja2lmWyFdMCBbc2V0bGFiZWxpZmNoZWNraXNbIV0wXSB1c2Vyb3V0cHV0CithY190ZXN0bigpIHsKKwlpZiB0ZXN0IHgiJDEiID0geCIhIjsgdGhlbgorCQlmcj0xCisJCXNoaWZ0CisJZWxzZQorCQlmcj0wCisJZmkKKwlhY190ZXN0aW5pdCAiJEAiIHx8IHJldHVybgorCWNhdCA+Y29uZnRlc3QuYworCXZ2ICddJyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gY29uZnRlc3QuYyAkTElCUyAkY2NwciIKKwl0ZXN0ICR0Y2ZuID0gbm8gJiYgdGVzdCAtZiBhLm91dCAmJiB0Y2ZuPWEub3V0CisJdGVzdCAkdGNmbiA9IG5vICYmIHRlc3QgLWYgYS5leGUgJiYgdGNmbj1hLmV4ZQorCXRlc3QgJHRjZm4gPSBubyAmJiB0ZXN0IC1mIGNvbmZ0ZXN0ICYmIHRjZm49Y29uZnRlc3QKKwlpZiB0ZXN0IC1mICR0Y2ZuOyB0aGVuCisJCXRlc3QgMSA9ICRmciB8fCBmdj0xCisJZWxzZQorCQl0ZXN0IDAgPSAkZnIgfHwgZnY9MQorCWZpCisJdnNjYW49CisJaWYgdGVzdCAkcGhhc2UgPSB1OyB0aGVuCisJCXRlc3QgJGN0ID0gZ2NjICYmIHZzY2FuPSd1bnJlY29nbmlbc3pdZWQnCisJCXRlc3QgJGN0ID0gaHBjYyAmJiB2c2Nhbj0ndW5zdXBwb3J0ZWQnCisJCXRlc3QgJGN0ID0gcGNjICYmIHZzY2FuPSd1bnN1cHBvcnRlZCcKKwkJdGVzdCAkY3QgPSBzdW5wcm8gJiYgdnNjYW49Jy1lIGlnbm9yZWQgLWUgdHVybmVkLm9mZicKKwlmaQorCXRlc3QgLW4gIiR2c2NhbiIgJiYgZ3JlcCAkdnNjYW4gdnYub3V0ID4vZGV2L251bGwgMj4mMSAmJiBmdj0kZnIKKwlybWYgY29uZnRlc3QuYyBjb25mdGVzdC5vICR7dGNmbn0qIHZ2Lm91dAorCWFjX3Rlc3Rkb25lCit9CisKKyMgYWNfaWZjcHAgY3BwZXhwciBbIV0gbGFiZWwgWyFdIGNoZWNraWZbIV0wIFtzZXRsYWJlbGlmY2hlY2tpc1shXTBdIHVzZXJvdXRwdXQKK2FjX2lmY3BwKCkgeworCWV4cHI9JDE7IHNoaWZ0CisJYWNfdGVzdG4gIiRAIiA8PC1FT0YKKwkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKAorCQkjJGV4cHIKKwkJICAgIDAKKwkJI2Vsc2UKKwkJLyogZm9yY2UgYSBmYWlsdXJlOiBleHByIGlzIGZhbHNlICovCisJCSAgICB0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKQorCQkjZW5kaWYKKwkJICAgICk7IH0KK0VPRgorCXRlc3QgeCIkMSIgPSB4IiEiICYmIHNoaWZ0CisJZj0kMQorCWZ1PWB1cHBlciAkZmAKKwlldmFsIGZ2PVwkSEFWRV8kZnUKKwl0ZXN0IHgiJGZ2IiA9IHgiMSIKK30KKworYWNfY3BwZmxhZ3MoKSB7CisJdGVzdCB4IiQxIiA9IHgiIiB8fCBmdT0kMQorCWZ2PSQyCisJdGVzdCB4IiQyIiA9IHgiIiAmJiBldmFsIGZ2PVwkSEFWRV8kZnUKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV8kZnU9JGZ2IgorfQorCithY190ZXN0KCkgeworCWFjX3Rlc3RuICIkQCIKKwlhY19jcHBmbGFncworfQorCisjIGFjX2ZsYWdzIFstXSBhZGQgdmFybmFtZSBmbGFncyBbdGV4dF0KK2FjX2ZsYWdzKCkgeworCWlmIHRlc3QgeCIkMSIgPSB4Ii0iOyB0aGVuCisJCXNoaWZ0CisJCWhmPTEKKwllbHNlCisJCWhmPTAKKwlmaQorCWZhPSQxCisJdm49JDIKKwlmPSQzCisJZnQ9JDQKKwl0ZXN0IHgiJGZ0IiA9IHgiIiAmJiBmdD0iaWYgJGYgY2FuIGJlIHVzZWQiCisJc2F2ZV9DRkxBR1M9JENGTEFHUworCUNGTEFHUz0iJENGTEFHUyAkZiIKKwlpZiB0ZXN0IDEgPSAkaGY7IHRoZW4KKwkJYWNfdGVzdG4gY2FuXyR2biAnJyAiJGZ0IgorCWVsc2UKKwkJYWNfdGVzdG4gY2FuXyR2biAnJyAiJGZ0IiA8PC0nRU9GJworCQkJLyogZXZpbCBhcG8nc3Ryb3BoIGluIGNvbW1lbnQgdGVzdCAqLworCQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9CisJCUVPRgorCWZpCisJZXZhbCBmdj1cJEhBVkVfQ0FOX2B1cHBlciAkdm5gCisJdGVzdCAxMSA9ICRmYSRmdiB8fCBDRkxBR1M9JHNhdmVfQ0ZMQUdTCit9CisKKyMgYWNfaGVhZGVyIFshXSBoZWFkZXIgW3ByZXJlcSAuLi5dCithY19oZWFkZXIoKSB7CisJaWYgdGVzdCB4IiQxIiA9IHgiISI7IHRoZW4KKwkJbmE9MQorCQlzaGlmdAorCWVsc2UKKwkJbmE9MAorCWZpCisJaGY9JDE7IHNoaWZ0CisJaHY9YGVjaG8gIiRoZiIgfCB0ciAtZCAnXDAxMlwwMTUnIHwgdHIgLWMgJGFsbGwkYWxsdSRhbGxuICRhbGxzYAorCWZvciBpCisJZG8KKwkJZWNobyAiI2luY2x1ZGUgPCRpPiIgPj54CisJZG9uZQorCWVjaG8gIiNpbmNsdWRlIDwkaGY+IiA+PngKKwllY2hvICdpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0nID4+eAorCWFjX3Rlc3RuICIkaHYiICIiICI8JGhmPiIgPHgKKwlybWYgeAorCXRlc3QgMSA9ICRuYSB8fCBhY19jcHBmbGFncworfQorCithZGRzcmNzKCkgeworCWlmIHRlc3QgeCIkMSIgPSB4IiEiOyB0aGVuCisJCWZyPTAKKwkJc2hpZnQKKwllbHNlCisJCWZyPTEKKwlmaQorCWV2YWwgaT1cJCQxCisJdGVzdCAkZnIgPSAiJGkiICYmIGNhc2UgIiAkU1JDUyAiIGluCisJKlwgJDJcICopCTs7CisJKikJCVNSQ1M9IiRTUkNTICQyIiA7OworCWVzYWMKK30KKworCitpZiB0ZXN0IC1kIG1rc2ggfHwgdGVzdCAtZCBta3NoLmV4ZTsgdGhlbgorCWVjaG8gIiRtZTogRXJyb3I6IC4vbWtzaCBpcyBhIGRpcmVjdG9yeSEiID4mMgorCWV4aXQgMQorZmkKK3JtZiBhLmV4ZSogYS5vdXQqIGNvbmZ0ZXN0LmMgKmNvcmUgbGZ0IG1rc2gqIG5vICouYmMgKi5sbCAqLm8gXAorICAgIFJlYnVpbGQuc2ggc2lnbmFtZXMuaW5jIHRlc3Quc2ggeCB2di5vdXQKKworY3VyZGlyPWBwd2RgIHNyY2Rpcj1gZGlybmFtZSAiJDAiYCBjaGVja19jYXRlZ29yaWVzPQordGVzdCAtbiAiJGRpcm5hbWUiIHx8IGRpcm5hbWU9LgorZHN0dmVyc2lvbj1gc2VkIC1uICcvZGVmaW5lIE1LU0hfVkVSU0lPTi9zL14uKiJcKC4qXCkiLiokL1wxL3AnICRzcmNkaXIvc2guaGAKKworZT1lY2hvCityPTAKK2VxPTAKK3BtPTAKK2NtPW5vcm1hbAorb3B0ZmxhZ3M9LXN0ZC1jb21waWxlLW9wdHMKK2xhc3Q9CisKK2ZvciBpCitkbworCWNhc2UgJGxhc3Q6JGkgaW4KKwljOmNvbWJpbmV8YzpkcmFnb25lZ2d8YzpsbHZtKQorCQljbT0kaQorCQlsYXN0PQorCQk7OworCWM6KikKKwkJZWNobyAiJG1lOiBVbmtub3duIG9wdGlvbiAtYyAnJGknISIgPiYyCisJCWV4aXQgMQorCQk7OworCW86KikKKwkJb3B0ZmxhZ3M9JGkKKwkJbGFzdD0KKwkJOzsKKwk6LWMpCisJCWxhc3Q9YworCQk7OworCTotY29tYmluZSkKKwkJY209Y29tYmluZQorCQllY2hvICIkbWU6IFdhcm5pbmc6ICckaScgaXMgZGVwcmVjYXRlZCwgdXNlICctYyBjb21iaW5lJyBpbnN0ZWFkISIgPiYyCisJCTs7CisJOi1nKQorCQkjIGNoZWNrZXIsIGRlYnVnLCB2YWxncmluZCBidWlsZAorCQlDUFBGTEFHUz0iJENQUEZMQUdTIC1EREVCVUciCisJCUNGTEFHUz0iJENGTEFHUyAtZzMgLWZuby1idWlsdGluIgorCQk7OworCTotaikKKwkJcG09MQorCQk7OworCTotbGx2bSkKKwkJY209bGx2bQorCQlvcHRmbGFncz0tc3RkLWNvbXBpbGUtb3B0cworCQllY2hvICIkbWU6IFdhcm5pbmc6ICckaScgaXMgZGVwcmVjYXRlZCwgdXNlICctYyBsbHZtIC1PJyBpbnN0ZWFkISIgPiYyCisJCTs7CisJOi1sbHZtPSopCisJCWNtPWxsdm0KKwkJb3B0ZmxhZ3M9YGVjaG8gIngkaSIgfCBzZWQgJ3MvXngtbGx2bT0vLydgCisJCWVjaG8gIiRtZTogV2FybmluZzogJyRpJyBpcyBkZXByZWNhdGVkLCB1c2UgJy1jIGxsdm0gLW8gJGxsdm0nIGluc3RlYWQhIiA+JjIKKwkJOzsKKwk6LU0pCisJCWNtPW1ha2VmaWxlCisJCTs7CisJOi1PKQorCQlvcHRmbGFncz0tc3RkLWNvbXBpbGUtb3B0cworCQk7OworCTotbykKKwkJbGFzdD1vCisJCTs7CisJOi1RKQorCQllcT0xCisJCTs7CisJOi1yKQorCQlyPTEKKwkJOzsKKwk6LXYpCisJCWVjaG8gIkJ1aWxkLnNoICRzcmN2ZXJzaW9uIgorCQllY2hvICJmb3IgbWtzaCAkZHN0dmVyc2lvbiIKKwkJZXhpdCAwCisJCTs7CisJOiopCisJCWVjaG8gIiRtZTogVW5rbm93biBvcHRpb24gJyRpJyEiID4mMgorCQlleGl0IDEKKwkJOzsKKwkqKQorCQllY2hvICIkbWU6IFVua25vd24gb3B0aW9uIC0nJGxhc3QnICckaSchIiA+JjIKKwkJZXhpdCAxCisJCTs7CisJZXNhYworZG9uZQoraWYgdGVzdCAtbiAiJGxhc3QiOyB0aGVuCisJZWNobyAiJG1lOiBPcHRpb24gLSckbGFzdCcgbm90IGZvbGxvd2VkIGJ5IGFyZ3VtZW50ISIgPiYyCisJZXhpdCAxCitmaQorCitTUkNTPSJsYWxsb2MuYyBlZGl0LmMgZXZhbC5jIGV4ZWMuYyBleHByLmMgZnVuY3MuYyBoaXN0cmFwLmMiCitTUkNTPSIkU1JDUyBqb2JzLmMgbGV4LmMgbWFpbi5jIG1pc2MuYyBzaGYuYyBzeW4uYyB0cmVlLmMgdmFyLmMiCisKK2lmIHRlc3QgeCIkc3JjZGlyIiA9IHgiLiI7IHRoZW4KKwlDUFBGTEFHUz0iLUkuICRDUFBGTEFHUyIKK2Vsc2UKKwlDUFBGTEFHUz0iLUkuIC1JJyRzcmNkaXInICRDUFBGTEFHUyIKK2ZpCisKK3Rlc3QgeCIkVEFSR0VUX09TIiA9IHgiIiAmJiBUQVJHRVRfT1M9YHVuYW1lIC1zIDI+L2Rldi9udWxsIHx8IHVuYW1lYAorb3N3YXJuPQorY2NwYz0tV2MsCitjY3BsPS1XbCwKK3RzdHM9CitjY3ByPSd8fCBmb3IgX2YgaW4gJHt0Y2ZufSo7IGRvIHRlc3QgeCIke19mfSIgPSB4Im1rc2guMSIgfHwgcm0gLWYgIiR7X2Z9IjsgZG9uZScKKworIyBDb25maWd1cmF0aW9uIGRlcGVuZGluZyBvbiBPUyByZXZpc2lvbiwgb24gT1NlcyB0aGF0IG5lZWQgdGhlbQorY2FzZSAkVEFSR0VUX09TIGluCitRTlgpCisJdGVzdCB4IiRUQVJHRVRfT1NSRVYiID0geCIiICYmIFRBUkdFVF9PU1JFVj1gdW5hbWUgLXJgCisJOzsKK2VzYWMKKworIyBDb25maWd1cmF0aW9uIGRlcGVuZGluZyBvbiBPUyBuYW1lCitjYXNlICRUQVJHRVRfT1MgaW4KK0FJWCkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0FMTF9TT1VSQ0UiCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK0JlT1MpCisJb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJworCTs7CitCU0QvT1MpCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK0NZR1dJTiopCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK0RhcndpbikKKwk7OworRHJhZ29uRmx5KQorCTs7CitGcmVlQlNEKQorCTs7CitHTlUpCisJIyBkZWZpbmUgTk9fUEFUSF9NQVggdG8gdXNlIEh1cmQtb25seSBmdW5jdGlvbnMKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UgLUROT19QQVRIX01BWCIKKwk7OworR05VL2tGcmVlQlNEKQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfR05VX1NPVVJDRSIKKwk7OworSGFpa3UpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1LU0hfQVNTVU1FX1VURjgiCisJOzsKK0hQLVVYKQorCTs7CitJbnRlcml4KQorCWNjcGM9Jy1YICcKKwljY3BsPSctWSAnCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9BTExfU09VUkNFIgorCTogJHtMSUJTPSctbGNyeXB0J30KKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworSVJJWCopCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK0xpbnV4KQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfR05VX1NPVVJDRSIKKwk6ICR7SEFWRV9SRVZPS0U9MH0KKwk7OworTWlkbmlnaHRCU0QpCisJOzsKK01pbml4KQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX1VORU1QTE9ZRUQgLURNS1NIX0NPTlNFUlZBVElWRV9GRFMiCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9QT1NJWF9TT1VSQ0UgLURfUE9TSVhfMV9TT1VSQ0U9MiAtRF9NSU5JWCIKKwlvbGRpc2hfZWQ9bm8tc3RkZXJyLWVkCQkjIC91c3IvYmluL2VkKCEpIGlzIGJyb2tlbgorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitNaXJCU0QpCisJOzsKK05ldEJTRCkKKwk7OworT3BlbkJTRCkKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworT1NGMSkKKwlIQVZFX1NJR19UPTAJIyBpbmNvbXBhdGlibGUKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX09TRl9TT1VSQ0UgLURfUE9TSVhfQ19TT1VSQ0U9MjAwMTEyTCIKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX1hPUEVOX1NPVVJDRT02MDAgLURfWE9QRU5fU09VUkNFX0VYVEVOREVEIgorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitQbGFuOSkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX1BPU0lYX1NPVVJDRSAtRF9MSU1JVFNfRVhURU5TSU9OIgorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfQlNEX0VYVEVOU0lPTiAtRF9TVVNWMl9TT1VSQ0UiCisJb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJworCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX0FTU1VNRV9VVEY4IC1ETUtTSF9VTkVNUExPWUVEIgorCTs7CitQVzMyKikKKwlIQVZFX1NJR19UPTAJIyBpbmNvbXBhdGlibGUKKwlvc3dhcm49JyBhbmQgd2lsbCBjdXJyZW50bHkgbm90IHdvcmsnCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK1FOWCkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX19OT19FWFRfUU5YIgorCWNhc2UgJFRBUkdFVF9PU1JFViBpbgorCVswMTIzNDVdLip8Ni5bMDEyM10uKnw2LjQuWzAxXSkKKwkJb2xkaXNoX2VkPW5vLXN0ZGVyci1lZAkJIyBvbGRpc2ggL2Jpbi9lZCBpcyBicm9rZW4KKwkJOzsKKwllc2FjCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK1N1bk9TKQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfQlNEX1NPVVJDRSAtRF9fRVhURU5TSU9OU19fIgorCTs7CitzeWxsYWJsZSkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UiCisJb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJworCTs7CitVTFRSSVgpCisJOiAke0NDPWNjIC1ZUE9TSVh9CisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHNzaXplX3Q9aW50IgorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitVV0lOKikKKwljY3BjPSctWWMsJworCWNjcGw9Jy1ZbCwnCisJdHN0cz0iIDM8Pi9kZXYvdHR5IgorCW9zd2Fybj0iOyBpdCB3aWxsIGNvbXBpbGUsIGJ1dCB0aGUgdGFyZ2V0IgorCW9zd2Fybj0iJG9zd2FybiR7bmx9cGxhdGZvcm0gaXRzZWxmIGlzIHZlcnkgZmxha2V5L3VucmVsaWFibGUiCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKKyopCisJb3N3YXJuPSc7IGl0IG1heSBvciBtYXkgbm90IHdvcmsnCisJOzsKK2VzYWMKKworOiAke0NDPWNjfSAke05ST0ZGPW5yb2ZmfQordGVzdCAwID0gJHIgJiYgZWNobyB8ICROUk9GRiAtdiAyPiYxIHwgZ3JlcCBHTlUgPi9kZXYvbnVsbCAyPiYxICYmIFwKKyAgICBOUk9GRj0iJE5ST0ZGIC1jIgorCisjIHRoaXMgYWlkcyBtZSBpbiB0cmFjaW5nIEZUQkZTZW4gd2l0aG91dCBhY2Nlc3MgdG8gdGhlIGJ1aWxkZAorJGUgIkhpIGZyb20kYW8gJGJpJHNyY3ZlcnNpb24kYW8gb246IgorY2FzZSAkVEFSR0VUX09TIGluCitEYXJ3aW4pCisJdnYgJ3wnICJod3ByZWZzIG1hY2hpbmVfdHlwZSBvc190eXBlIG9zX2NsYXNzID4mMiIKKwl2diAnfCcgInVuYW1lIC1hID4mMiIKKwk7OworSVJJWCopCisJdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCisJdnYgJ3wnICJoaW52IC12ID4mMiIKKwk7OworT1NGMSkKKwl2diAnfCcgInVuYW1lIC1hID4mMiIKKwl2diAnfCcgIi91c3Ivc2Jpbi9zaXplciAtdiA+JjIiCisJOzsKKyopCisJdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCisJOzsKK2VzYWMKK3Rlc3QgLXogIiRvc3dhcm4iIHx8IGVjaG8gPiYyICIKK1dhcm5pbmc6IG1rc2ggaGFzIG5vdCB5ZXQgYmVlbiBwb3J0ZWQgdG8gb3IgdGVzdGVkIG9uIHlvdXIKK29wZXJhdGluZyBzeXN0ZW0gJyRUQVJHRVRfT1MnJG9zd2Fybi4gSWYgeW91IGNhbiBwcm92aWRlCithIHNoZWxsIGFjY291bnQgdG8gdGhlIGRldmVsb3BlciwgdGhpcyBtYXkgaW1wcm92ZTsgcGxlYXNlCitkcm9wIHVzIGEgc3VjY2VzcyBvciBmYWlsdXJlIG5vdGljZSBvciBldmVuIHNlbmQgaW4gZGlmZnMuCisiCiskZSAiJGJpJG1lOiBCdWlsZGluZyB0aGUgTWlyQlNEIEtvcm4gU2hlbGwkYW8gJHVpJGRzdHZlcnNpb24kYW8iCisKKyMKKyMgQmVnaW4gb2YgbWlydG9jb25mIGNoZWNrcworIworJGUgJGJpJG1lOiBTY2FubmluZyBmb3IgZnVuY3Rpb25zLi4uIHBsZWFzZSBpZ25vcmUgYW55IGVycm9ycy4kYW8KKworIworIyBDb21waWxlcjogd2hpY2ggb25lPworIworIyBub3RlczoKKyMgLSBJQ0MgZGVmaW5lcyBfX0dOVUNfXyB0b28KKyMgLSBHQ0MgZGVmaW5lcyBfX2hwdXggdG9vCisjIC0gTExWTStjbGFuZyBkZWZpbmVzIF9fR05VQ19fIHRvbworIyAtIG53Y2MgZGVmaW5lcyBfX0dOVUNfXyB0b28KK0NQUD0iJENDIC1FIgorJGUgLi4uIHdoaWNoIGNvbXBpbGVyIHNlZW1zIHRvIGJlIHVzZWQKK2NhdCA+Y29uZnRlc3QuYyA8PCdFT0YnCisjaWYgZGVmaW5lZChfX0lDQykgfHwgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorY3Q9aWNjCisjZWxpZiBkZWZpbmVkKF9feGxDX18pIHx8IGRlZmluZWQoX19JQk1DX18pCitjdD14bGMKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykKK2N0PXN1bnBybworI2VsaWYgZGVmaW5lZChfX0FDS19fKQorY3Q9YWNrCisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKK2N0PWJjYworI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKK2N0PXdhdGNvbQorI2VsaWYgZGVmaW5lZChfX01XRVJLU19fKQorY3Q9bWV0cm93ZXJrcworI2VsaWYgZGVmaW5lZChfX0hQX2NjKQorY3Q9aHBjYworI2VsaWYgZGVmaW5lZChfX0RFQ0MpIHx8IChkZWZpbmVkKF9fb3NmX18pICYmICFkZWZpbmVkKF9fR05VQ19fKSkKK2N0PWRlYworI2VsaWYgZGVmaW5lZChfX1BHSSkKK2N0PXBnaQorI2VsaWYgZGVmaW5lZChfX0RNQ19fKQorY3Q9ZG1jCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorY3Q9bXNjCisjZWxpZiBkZWZpbmVkKF9fQURTUEJMQUNLRklOX18pIHx8IGRlZmluZWQoX19BRFNQVFNfXykgfHwgZGVmaW5lZChfX0FEU1AyMTAwMF9fKQorY3Q9YWRzcAorI2VsaWYgZGVmaW5lZChfX0lBUl9TWVNURU1TX0lDQ19fKQorY3Q9aWFyCisjZWxpZiBkZWZpbmVkKFNEQ0MpCitjdD1zZGNjCisjZWxpZiBkZWZpbmVkKF9fUENDX18pCitjdD1wY2MKKyNlbGlmIGRlZmluZWQoX19UZW5EUkFfXykKK2N0PXRlbmRyYQorI2VsaWYgZGVmaW5lZChfX1RJTllDX18pCitjdD10Y2MKKyNlbGlmIGRlZmluZWQoX19sbHZtX18pICYmIGRlZmluZWQoX19jbGFuZ19fKQorY3Q9Y2xhbmcKKyNlbGlmIGRlZmluZWQoX19OV0NDX18pCitjdD1ud2NjCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorY3Q9Z2NjCisjZWxpZiBkZWZpbmVkKF9DT01QSUxFUl9WRVJTSU9OKQorY3Q9bWlwc3BybworI2VsaWYgZGVmaW5lZChfX3NnaSkKK2N0PW1pcHNwcm8KKyNlbGlmIGRlZmluZWQoX19ocHV4KSB8fCBkZWZpbmVkKF9faHB1YSkKK2N0PWhwY2MKKyNlbGlmIGRlZmluZWQoX191bHRyaXgpCitjdD11Y29kZQorI2Vsc2UKK2N0PXVua25vd24KKyNlbmRpZgorRU9GCitjdD11bmtub3duCit2diAnXScgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiBjb25mdGVzdC5jIHwgZ3JlcCBjdD0gfCB0ciAtZCBcXFxcMDE1ID54Igorc2VkICdzL14vWyAvJyB4CitldmFsIGBjYXQgeGAKK3JtZiB4IHZ2Lm91dAorZWNobyAnaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9JyA+Y29uZnRlc3QuYworY2FzZSAkY3QgaW4KK2FjaykKKwkjIHdvcmsgYXJvdW5kICJ0aGUgZmFtb3VzIEFDSyBjb25zdCBidWciCisJQ1BQRkxBR1M9Ii1EY29uc3Q9ICRDUFBGTEFHUyIKKwk7OworYWRzcCkKKwllY2hvID4mMiAnV2FybmluZzogQW5hbG9nIERldmljZXMgQysrIGNvbXBpbGVyIGZvciBCbGFja2ZpbiwgVGlnZXJTSEFSQworICAgIGFuZCBTSEFSQyAoMjEwMDApIERTUHMgZGV0ZWN0ZWQuIFRoaXMgY29tcGlsZXIgaGFzIG5vdCB5ZXQKKyAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKKyAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJworCTs7CitiY2MpCisJZWNobyA+JjIgIldhcm5pbmc6IEJvcmxhbmQgQysrIEJ1aWxkZXIgZGV0ZWN0ZWQuIFRoaXMgY29tcGlsZXIgbWlnaHQKKyAgICBwcm9kdWNlIGJyb2tlbiBleGVjdXRhYmxlcy4gQ29udGludWUgYXQgeW91ciBvd24gcmlzaywKKyAgICBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4iCisJOzsKK2NsYW5nKQorCSMgZG9lcyBub3Qgd29yayB3aXRoIGN1cnJlbnQgImNjYyIgY29tcGlsZXIgZHJpdmVyCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdmVyc2lvbiIKKwkjIHRoaXMgd29ya3MsIGZvciBub3cKKwl2diAnfCcgIiR7Q0xBTkctY2xhbmd9IC12ZXJzaW9uIgorCSMgZW5zdXJlIGNvbXBpbGVyIGFuZCBsaW5rZXIgYXJlIGluIHN5bmMgdW5sZXNzIG92ZXJyaWRkZW4KKwljYXNlICRDQ0NfQ0M6JENDQ19MRCBpbgorCToqKQk7OworCSo6KQlDQ0NfTEQ9JENDQ19DQzsgZXhwb3J0IENDQ19MRCA7OworCWVzYWMKKwk7OworZGVjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLVYiCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtV2wsLVYgY29uZnRlc3QuYyAkTElCUyIKKwk7OworZG1jKQorCWVjaG8gPiYyICJXYXJuaW5nOiBEaWdpdGFsIE1hcnMgQ29tcGlsZXIgZGV0ZWN0ZWQuIFdoZW4gcnVubmluZyB1bmRlciIKKwllY2hvID4mMiAiICAgIFVXSU4sIG1rc2ggdGVuZHMgdG8gYmUgdW5zdGFibGUgZHVlIHRvIHRoZSBsaW1pdGF0aW9ucyIKKwllY2hvID4mMiAiICAgIG9mIHRoaXMgcGxhdGZvcm0uIENvbnRpbnVlIGF0IHlvdXIgb3duIHJpc2ssIgorCWVjaG8gPiYyICIgICAgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuIgorCTs7CitnY2MpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtdiBjb25mdGVzdC5jICRMSUJTIgorCXZ2ICd8JyAnZWNobyBgJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgXAorCSAgICAtZHVtcG1hY2hpbmVgIGdjY2AkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiBcCisJICAgICRMSUJTIC1kdW1wdmVyc2lvbmAnCisJOzsKK2hwY2MpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtViBjb25mdGVzdC5jICRMSUJTIgorCTs7CitpYXIpCisJZWNobyA+JjIgJ1dhcm5pbmc6IElBUiBTeXN0ZW1zIChodHRwOi8vd3d3Lmlhci5jb20pIGNvbXBpbGVyIGZvciBlbWJlZGRlZAorICAgIHN5c3RlbXMgZGV0ZWN0ZWQuIFRoaXMgdW5zdXBwb3J0ZWQgY29tcGlsZXIgaGFzIG5vdCB5ZXQKKyAgICBiZWVuIHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1rc2guIENvbnRpbnVlIGF0IHlvdXIKKyAgICBvd24gcmlzaywgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuJworCTs7CitpY2MpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtViIKKwk7OworbWV0cm93ZXJrcykKKwllY2hvID4mMiAnV2FybmluZzogTWV0cm93ZXJrcyBDIGNvbXBpbGVyIGRldGVjdGVkLiBUaGlzIGhhcyBub3QgeWV0CisgICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCisgICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKKwk7OworbWlwc3BybykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12ZXJzaW9uIgorCTs7Cittc2MpCisJY2Nwcj0JCSMgZXJyb3JsZXZlbHMgYXJlIG5vdCByZWxpYWJsZQorCWNhc2UgJFRBUkdFVF9PUyBpbgorCUludGVyaXgpCisJCWlmIFtbIC1uICRDODlfQ09NUElMRVIgXV07IHRoZW4KKwkJCUM4OV9DT01QSUxFUj1gbnRwYXRoMnBvc2l4IC1jICIkQzg5X0NPTVBJTEVSImAKKwkJZWxzZQorCQkJQzg5X0NPTVBJTEVSPUNMLkVYRQorCQlmaQorCQlpZiBbWyAtbiAkQzg5X0xJTktFUiBdXTsgdGhlbgorCQkJQzg5X0xJTktFUj1gbnRwYXRoMnBvc2l4IC1jICIkQzg5X0xJTktFUiJgCisJCWVsc2UKKwkJCUM4OV9MSU5LRVI9TElOSy5FWEUKKwkJZmkKKwkJdnYgJ3wnICIkQzg5X0NPTVBJTEVSIC9IRUxQID4mMiIKKwkJdnYgJ3wnICIkQzg5X0xJTktFUiAvTElOSyA+JjIiCisJCTs7CisJZXNhYworCTs7Citud2NjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXZlcnNpb24iCisJOzsKK3BjYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12IgorCTs7CitwZ2kpCisJZWNobyA+JjIgJ1dhcm5pbmc6IFBHSSBkZXRlY3RlZC4gVGhpcyB1bmtub3duIGNvbXBpbGVyIGhhcyBub3QgeWV0CisgICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCisgICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKKwk7Oworc2RjYykKKwllY2hvID4mMiAnV2FybmluZzogc2RjYyAoaHR0cDovL3NkY2Muc291cmNlZm9yZ2UubmV0KSwgdGhlIHNtYWxsIGRldmljZXMKKyAgICBDIGNvbXBpbGVyIGZvciBlbWJlZGRlZCBzeXN0ZW1zIGRldGVjdGVkLiBUaGlzIGhhcyBub3QgeWV0CisgICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCisgICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKKwk7Oworc3VucHJvKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLVYgY29uZnRlc3QuYyAkTElCUyIKKwk7OwordGNjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXYiCisJOzsKK3RlbmRyYSkKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1WIDI+JjEgfCBcCisJICAgIGZncmVwIC1pIC1lIHZlcnNpb24gLWUgcmVsZWFzZSIKKwk7OwordWNvZGUpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtViIKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIC1XbCwtViBjb25mdGVzdC5jICRMSUJTIgorCTs7Cit3YXRjb20pCisJZWNobyA+JjIgJ1dhcm5pbmc6IFdhdGNvbSBDIENvbXBpbGVyIGRldGVjdGVkLiBUaGlzIGNvbXBpbGVyIGhhcyBub3QgeWV0CisgICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCisgICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKKwk7OworeGxjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXF2ZXJzaW9uPXZlcmJvc2UiCisJdnYgJ3wnICJsZCAtViIKKwk7OworKikKKwljdD11bmtub3duCisJOzsKK2VzYWMKK2Nhc2UgJGNtIGluCitkcmFnb25lZ2d8bGx2bSkKKwl2diAnfCcgImxsYyAtdmVyc2lvbiIKKwk7OworZXNhYworJGUgIiRiaT09PiB3aGljaCBjb21waWxlciBzZWVtcyB0byBiZSB1c2VkLi4uJGFvICR1aSRjdCRhbyIKK3JtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm8gY29uZnRlc3QgYS5vdXQqIGEuZXhlKiB2di5vdXQKKworIworIyBDb21waWxlcjogd29ya3MgYXMtaXMsIHdpdGggLVduby1lcnJvciBhbmQgLVdlcnJvcgorIworc2F2ZV9OT1dBUk49JE5PV0FSTgorTk9XQVJOPQorRE9XQVJOPQorYWNfZmxhZ3MgMCBjb21waWxlcl93b3JrcyAnJyAnaWYgdGhlIGNvbXBpbGVyIHdvcmtzJwordGVzdCAxID0gJEhBVkVfQ0FOX0NPTVBJTEVSX1dPUktTIHx8IGV4aXQgMQorSEFWRV9DT01QSUxFUl9LTk9XTj0wCit0ZXN0ICRjdCA9IHVua25vd24gfHwgSEFWRV9DT01QSUxFUl9LTk9XTj0xCitpZiBhY19pZmNwcCAnaWYgMCcgY29tcGlsZXJfZmFpbHMgJycgXAorICAgICdpZiB0aGUgY29tcGlsZXIgZG9lcyBub3QgZmFpbCBjb3JyZWN0bHknOyB0aGVuCisJc2F2ZV9DRkxBR1M9JENGTEFHUworCTogJHtIQVZFX0NBTl9ERUxFWEU9eH0KKwlpZiB0ZXN0ICRjdCA9IGRtYzsgdGhlbgorCQlDRkxBR1M9IiRDRkxBR1MgJHtjY3BsfS9ERUxFWEVDVVRBQkxFIgorCQlhY190ZXN0biBjYW5fZGVsZXhlIGNvbXBpbGVyX2ZhaWxzIDAgJ2ZvciB0aGUgL0RFTEVYRUNVVEFCTEUgbGlua2VyIG9wdGlvbicgPDwtRU9GCisJCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KKwkJRU9GCisJZWxpZiB0ZXN0ICRjdCA9IGRlYzsgdGhlbgorCQlDRkxBR1M9IiRDRkxBR1MgJHtjY3BsfS1ub25fc2hhcmVkIgorCQlhY190ZXN0biBjYW5fZGVsZXhlIGNvbXBpbGVyX2ZhaWxzIDAgJ2ZvciB0aGUgLW5vbl9zaGFyZWQgbGlua2VyIG9wdGlvbicgPDwtRU9GCisJCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KKwkJRU9GCisJZWxzZQorCQlleGl0IDEKKwlmaQorCXRlc3QgMSA9ICRIQVZFX0NBTl9ERUxFWEUgfHwgQ0ZMQUdTPSRzYXZlX0NGTEFHUworCWFjX3Rlc3RuIGNvbXBpbGVyX3N0aWxsX2ZhaWxzICcnICdpZiB0aGUgY29tcGlsZXIgc3RpbGwgZG9lcyBub3QgZmFpbCBjb3JyZWN0bHknIDw8LUVPRgorCUVPRgorCXRlc3QgMSA9ICRIQVZFX0NPTVBJTEVSX1NUSUxMX0ZBSUxTICYmIGV4aXQgMQorZmkKK2lmIGFjX2lmY3BwICdpZmRlZiBfX1RJTllDX18nIGNvdWxkYmVfdGNjICchJyBjb21waWxlcl9rbm93biAwIFwKKyAgICAnaWYgdGhpcyBjb3VsZCBiZSB0Y2MnOyB0aGVuCisJY3Q9dGNjCisJQ1BQPSdjcHAgLURfX1RJTllDX18nCitmaQorCitpZiB0ZXN0ICRjdCA9IHN1bnBybzsgdGhlbgorCXRlc3QgeCIkc2F2ZV9OT1dBUk4iID0geCIiICYmIHNhdmVfTk9XQVJOPSctZXJyd2Fybj0lbm9uZScKKwlhY19mbGFncyAwIGVycndhcm5ub25lICIkc2F2ZV9OT1dBUk4iCisJdGVzdCAxID0gJEhBVkVfQ0FOX0VSUldBUk5OT05FIHx8IHNhdmVfTk9XQVJOPQorCWFjX2ZsYWdzIDAgZXJyd2FybmFsbCAiLWVycndhcm49JWFsbCIKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fRVJSV0FSTkFMTCAmJiBET1dBUk49Ii1lcnJ3YXJuPSVhbGwiCitlbGlmIHRlc3QgJGN0ID0gaHBjYzsgdGhlbgorCXNhdmVfTk9XQVJOPQorCURPV0FSTj0rV2UKK2VsaWYgdGVzdCAkY3QgPSBtaXBzcHJvOyB0aGVuCisJc2F2ZV9OT1dBUk49CisJRE9XQVJOPSItZGlhZ19lcnJvciAxLTEwMDAwIgorZWxpZiB0ZXN0ICRjdCA9IG1zYzsgdGhlbgorCXNhdmVfTk9XQVJOPSIke2NjcGN9L3ciCisJRE9XQVJOPSIke2NjcGN9L1dYIgorZWxpZiB0ZXN0ICRjdCA9IGRtYzsgdGhlbgorCXNhdmVfTk9XQVJOPSIke2NjcGN9LXciCisJRE9XQVJOPSIke2NjcGN9LXd4IgorZWxpZiB0ZXN0ICRjdCA9IGJjYzsgdGhlbgorCXNhdmVfTk9XQVJOPSIke2NjcGN9LXciCisJRE9XQVJOPSIke2NjcGN9LXchIgorZWxpZiB0ZXN0ICRjdCA9IGRlYzsgdGhlbgorCTogLW1zZ18qIGZsYWdzIG5vdCB1c2VkIHlldCwgb3IgaXMgLXcyIGNvcnJlY3Q/CitlbGlmIHRlc3QgJGN0ID0geGxjOyB0aGVuCisJc2F2ZV9OT1dBUk49LXFmbGFnPWk6ZQorCURPV0FSTj0tcWZsYWc9aTppCitlbGlmIHRlc3QgJGN0ID0gdGVuZHJhOyB0aGVuCisJc2F2ZV9OT1dBUk49LXcKK2VsaWYgdGVzdCAkY3QgPSB1Y29kZTsgdGhlbgorCXNhdmVfTk9XQVJOPQorCURPV0FSTj0tdzIKK2Vsc2UKKwl0ZXN0IHgiJHNhdmVfTk9XQVJOIiA9IHgiIiAmJiBzYXZlX05PV0FSTj0tV25vLWVycm9yCisJYWNfZmxhZ3MgMCB3bm9lcnJvciAiJHNhdmVfTk9XQVJOIgorCXRlc3QgMSA9ICRIQVZFX0NBTl9XTk9FUlJPUiB8fCBzYXZlX05PV0FSTj0KKwlhY19mbGFncyAwIHdlcnJvciAtV2Vycm9yCisJdGVzdCAxID0gJEhBVkVfQ0FOX1dFUlJPUiAmJiBET1dBUk49LVdlcnJvcgorZmkKKwordGVzdCAkY3QgPSBpY2MgJiYgRE9XQVJOPSIkRE9XQVJOIC13ZDE0MTkiCitOT1dBUk49JHNhdmVfTk9XQVJOCisKKyMKKyMgQ29tcGlsZXI6IGV4dHJhIGZsYWdzICgtTzIgLWYqIC1XKiBldGMuKQorIworaT1gZWNobyA6IiRvcmlnX0NGTEFHUyIgfCBzZWQgJ3MvXjovLycgfCB0ciAtYyAtZCAkYWxsbCRhbGx1JGFsbG5gCisjIG9wdGltaXNhdGlvbjogb25seSBpZiBvcmlnX0NGTEFHUyBpcyBlbXB0eQordGVzdCB4IiRpIiA9IHgiIiAmJiBpZiB0ZXN0ICRjdCA9IHN1bnBybzsgdGhlbgorCWNhdCA+eCA8PC0nRU9GJworCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0KKwkJI2RlZmluZSBfX0lEU1RSSU5HX0NPTkNBVChsLHApCV9fTElOVEVEX18gIyMgbCAjIyBfICMjIHAKKwkJI2RlZmluZSBfX0lEU1RSSU5HX0VYUEFORChsLHApCV9fSURTVFJJTkdfQ09OQ0FUKGwscCkKKwkJI2RlZmluZSBwYWQJCQl2b2lkIF9fSURTVFJJTkdfRVhQQU5EKF9fTElORV9fLHgpKHZvaWQpIHsgfQorCUVPRgorCXllcyBwYWQgfCBoZWFkIC1uIDI1NiA+PngKKwlhY19mbGFncyAtIDEgb3R3byAteE8yIDx4CisJcm1mIHgKK2VsaWYgdGVzdCAkY3QgPSBocGNjOyB0aGVuCisJcGhhc2U9dQorCWFjX2ZsYWdzIDEgb3R3byArTzIKKwlwaGFzZT14CitlbGlmIHRlc3QgJGN0ID0geGxjOyB0aGVuCisJYWNfZmxhZ3MgMSBvdGhyZWUgIi1PMyAtcXN0cmljdCIKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fT1RIUkVFIHx8IGFjX2ZsYWdzIDEgb3R3byAtTzIKK2VsaWYgdGVzdCAkY3QgPSB0Y2MgfHwgdGVzdCAkY3QgPSB0ZW5kcmE7IHRoZW4KKwk6IG5vIHNwZWNpYWwgb3B0aW1pc2F0aW9uCitlbHNlCisJYWNfZmxhZ3MgMSBvdHdvIC1PMgorCXRlc3QgMSA9ICRIQVZFX0NBTl9PVFdPIHx8IGFjX2ZsYWdzIDEgb3B0aW1pc2UgLU8KK2ZpCisjIG90aGVyIGZsYWdzOiBqdXN0IGFkZCB0aGVtIGlmIHRoZXkgYXJlIHN1cHBvcnRlZAoraT0wCitpZiB0ZXN0ICRjdCA9IGdjYzsgdGhlbgorCSMgVGhlIGZvbGxvd2luZyB0ZXN0cyBydW4gd2l0aCAtV2Vycm9yIChnY2Mgb25seSkgaWYgcG9zc2libGUKKwlOT1dBUk49JERPV0FSTjsgcGhhc2U9dQorCWFjX2ZsYWdzIDEgZm5vc3RyaWN0YWxpYXNpbmcgLWZuby1zdHJpY3QtYWxpYXNpbmcKKwlhY19mbGFncyAxIGZzdGFja3Byb3RlY3RvcmFsbCAtZnN0YWNrLXByb3RlY3Rvci1hbGwKKwlhY19mbGFncyAxIGZ3cmFwdiAtZndyYXB2CisJdGVzdCAkY20gPSBjb21iaW5lICYmIGFjX2ZsYWdzIDAgY29tYmluZSBcCisJICAgICctZndob2xlLXByb2dyYW0gLS1jb21iaW5lJyBcCisJICAgICdpZiBnY2Mgc3VwcG9ydHMgLWZ3aG9sZS1wcm9ncmFtIC0tY29tYmluZScKKwlpPTEKK2VsaWYgdGVzdCAkY3QgPSBpY2M7IHRoZW4KKwlhY19mbGFncyAxIGZub2J1aWx0aW5zZXRtb2RlIC1mbm8tYnVpbHRpbi1zZXRtb2RlCisJYWNfZmxhZ3MgMSBmbm9zdHJpY3RhbGlhc2luZyAtZm5vLXN0cmljdC1hbGlhc2luZworCWFjX2ZsYWdzIDEgZnN0YWNrc2VjdXJpdHljaGVjayAtZnN0YWNrLXNlY3VyaXR5LWNoZWNrCisJaT0xCitlbGlmIHRlc3QgJGN0ID0gc3VucHJvOyB0aGVuCisJcGhhc2U9dQorCWFjX2ZsYWdzIDEgdiAtdgorCWFjX2ZsYWdzIDEgeGM5OSAteGM5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OScKKwlhY19mbGFncyAxIGlwbyAteGlwbyAnZm9yIGNyb3NzLW1vZHVsZSBvcHRpbWlzYXRpb24nCisJcGhhc2U9eAorZWxpZiB0ZXN0ICRjdCA9IGhwY2M7IHRoZW4KKwlwaGFzZT11CisJYWNfZmxhZ3MgMSBhZ2NjIC1BZ2NjICdmb3Igc3VwcG9ydCBvZiBHQ0MgZXh0ZW5zaW9ucycKKwlhY19mbGFncyAxIGFjOTkgLUFDOTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTknCisJcGhhc2U9eAorZWxpZiB0ZXN0ICRjdCA9IGRlYzsgdGhlbgorCWFjX2ZsYWdzIDAgdmVyYiAtdmVyYm9zZQorCWFjX2ZsYWdzIDEgcm9kYXRhIC1yZWFkb25seV9zdHJpbmdzCitlbGlmIHRlc3QgJGN0ID0gZG1jOyB0aGVuCisJYWNfZmxhZ3MgMSBkZWNsICIke2NjcGN9LXIiICdmb3Igc3RyaWN0IHByb3RvdHlwZSBjaGVja3MnCisJYWNfZmxhZ3MgMSBzY2hrICIke2NjcGN9LXMiICdmb3Igc3RhY2sgb3ZlcmZsb3cgY2hlY2tpbmcnCitlbGlmIHRlc3QgJGN0ID0gYmNjOyB0aGVuCisJYWNfZmxhZ3MgMSBzdHJwb29sICIke2NjcGN9LWQiICdpZiBzdHJpbmcgcG9vbGluZyBjYW4gYmUgZW5hYmxlZCcKK2VsaWYgdGVzdCAkY3QgPSBtaXBzcHJvOyB0aGVuCisJYWNfZmxhZ3MgMSB4Yzk5IC1jOTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTknCisJYWNfZmxhZ3MgMSBmdWxsd2FybiAtZnVsbHdhcm4gJ2ZvciByZW1hcmsgb3V0cHV0IHN1cHBvcnQnCitlbGlmIHRlc3QgJGN0ID0gbXNjOyB0aGVuCisJYWNfZmxhZ3MgMSBzdHJwb29sICIke2NjcGN9L0dGIiAnaWYgc3RyaW5nIHBvb2xpbmcgY2FuIGJlIGVuYWJsZWQnCisJZWNobyAnaW50IG1haW4odm9pZCkgeyBjaGFyIHRlc3RbNjRdID0gIiI7IHJldHVybiAoKnRlc3QpOyB9JyA+eAorCWFjX2ZsYWdzIC0gMSBzdGFja29uICIke2NjcGN9L0daIiAnaWYgc3RhY2sgY2hlY2tzIGNhbiBiZSBlbmFibGVkJyA8eAorCWFjX2ZsYWdzIC0gMSBzdGNrYWxsICIke2NjcGN9L0dlIiAnc3RhY2sgY2hlY2tzIGZvciBhbGwgZnVuY3Rpb25zJyA8eAorCWFjX2ZsYWdzIC0gMSBzZWN1Y2hrICIke2NjcGN9L0dTIiAnZm9yIGNvbXBpbGVyIHNlY3VyaXR5IGNoZWNrcycgPHgKKwlybWYgeAorCWFjX2ZsYWdzIDEgd2FsbCAiJHtjY3BjfS9XYWxsIiAndG8gZW5hYmxlIGFsbCB3YXJuaW5ncycKKwlhY19mbGFncyAxIHdwNjQgIiR7Y2NwY30vV3A2NCIgJ3RvIGVuYWJsZSA2NC1iaXQgd2FybmluZ3MnCitlbGlmIHRlc3QgJGN0ID0geGxjOyB0aGVuCisJYWNfZmxhZ3MgMSB4OTkgLXFsYW5nbHZsPWV4dGM5OQorCXRlc3QgMSA9ICRIQVZFX0NBTl9YOTkgfHwgYWNfZmxhZ3MgMSBjOTkgLXFsYW5nbHZsPXN0ZGM5OQorCWFjX2ZsYWdzIDEgcm9kYXRhICItcXJvIC1xcm9jb25zdCAtcXJvcHRyIgorCWFjX2ZsYWdzIDEgcnRjaGVjayAtcWNoZWNrPWFsbAorCWFjX2ZsYWdzIDEgcnRjaGtjIC1xZXh0Y2hrCisJYWNfZmxhZ3MgMSB3Zm9ybWF0ICItcWZvcm1hdD1hbGwgLXFmb3JtYXQ9bm96bG4iCisJI2FjX2ZsYWdzIDEgd3A2NCAtcXdhcm42NAkjIHRvbyB2ZXJib3NlIGZvciBub3cKK2VsaWYgdGVzdCAkY3QgPSB0ZW5kcmE7IHRoZW4KKwlhY19mbGFncyAwIHlzeXN0ZW0gLVlzeXN0ZW0KKwl0ZXN0IDEgPSAkSEFWRV9DQU5fWVNZU1RFTSAmJiBDUFBGTEFHUz0iLVlzeXN0ZW0gJENQUEZMQUdTIgorCWFjX2ZsYWdzIDEgZXh0YW5zaSAtWGEKK2VsaWYgdGVzdCAkY3QgPSB0Y2M7IHRoZW4KKwlhY19mbGFncyAxIGJvdW5kc2NoayAtYgorZWxpZiB0ZXN0ICRjdCA9IGNsYW5nOyB0aGVuCisJaT0xCitlbGlmIHRlc3QgJGN0ID0gbndjYzsgdGhlbgorCWk9MQorCSNicm9rZW4jIGFjX2ZsYWdzIDEgc3NwIC1zdGFja3Byb3RlY3QKK2ZpCisjIGZsYWdzIGNvbW1vbiB0byBhIHN1YnNldCBvZiBjb21waWxlcnMgKHJ1biB3aXRoIC1XZXJyb3Igb24gZ2NjKQoraWYgdGVzdCAxID0gJGk7IHRoZW4KKwlhY19mbGFncyAxIHN0ZGc5OSAtc3RkPWdudTk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5ICsgR0NDIGV4dGVuc2lvbnMnCisJdGVzdCAxID0gJEhBVkVfQ0FOX1NUREc5OSB8fCBcCisJICAgIGFjX2ZsYWdzIDEgc3RkYzk5IC1zdGQ9Yzk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5JworCWFjX2ZsYWdzIDEgd2FsbCAtV2FsbAorZmkKK3BoYXNlPXgKKworIyBUaGUgZm9sbG93aW5nIHRlc3RzIHJ1biB3aXRoIC1XZXJyb3Igb3Igc2ltaWxhciAoYWxsIGNvbXBpbGVycykgaWYgcG9zc2libGUKK05PV0FSTj0kRE9XQVJOCit0ZXN0ICRjdCA9IHBjYyAmJiBwaGFzZT11CisKKyMKKyMgQ29tcGlsZXI6IGNoZWNrIGZvciBzdHVmZiB0aGF0IG9ubHkgZ2VuZXJhdGVzIHdhcm5pbmdzCisjCithY190ZXN0IGF0dHJpYnV0ZV9ib3VuZGVkICcnICdmb3IgX19hdHRyaWJ1dGVfXygoYm91bmRlZCkpJyA8PC0nRU9GJworCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQorCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KKwkjZWxzZQorCSNpbmNsdWRlIDxzdHJpbmcuaD4KKwkjdW5kZWYgX19hdHRyaWJ1dGVfXworCWludCB4Y29weShjb25zdCB2b2lkICosIHZvaWQgKiwgc2l6ZV90KQorCSAgICBfX2F0dHJpYnV0ZV9fKChib3VuZGVkIChidWZmZXIsIDEsIDMpKSkKKwkgICAgX19hdHRyaWJ1dGVfXygoYm91bmRlZCAoYnVmZmVyLCAyLCAzKSkpOworCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKHhjb3B5KGF2WzBdLCBhdlstLWFjXSwgMSkpOyB9CisJaW50IHhjb3B5KGNvbnN0IHZvaWQgKnMsIHZvaWQgKmQsIHNpemVfdCBuKSB7CisJCW1lbW1vdmUoZCwgcywgbik7IHJldHVybiAoKGludCluKTsKKwl9CisJI2VuZGlmCitFT0YKK2FjX3Rlc3QgYXR0cmlidXRlX2Zvcm1hdCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKGZvcm1hdCkpJyA8PC0nRU9GJworCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQorCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KKwkjZWxzZQorCSNpbmNsdWRlIDxzdGRpby5oPgorCSN1bmRlZiBfX2F0dHJpYnV0ZV9fCisJI3VuZGVmIHByaW50ZgorCWV4dGVybiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKHByaW50ZigiJXMlZCIsICphdiwgYWMpKTsgfQorCSNlbmRpZgorRU9GCithY190ZXN0IGF0dHJpYnV0ZV9ub25udWxsICcnICdmb3IgX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpJyA8PC0nRU9GJworCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQorCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KKwkjZWxzZQorCWludCBmb28oY2hhciAqczEsIGNoYXIgKnMyKSBfX2F0dHJpYnV0ZV9fKChub25udWxsKSk7CisJaW50IGJhcihjaGFyICpzMSwgY2hhciAqczIpIF9fYXR0cmlidXRlX18oKG5vbm51bGwgKDEsIDIpKSk7CisJaW50IGJheihjaGFyICpzKSBfX2F0dHJpYnV0ZV9fKChub25udWxsICgxKSkpOworCWludCBmb28oY2hhciAqczEsIGNoYXIgKnMyKSB7IHJldHVybiAoYmFyKHMyLCBzMSkpOyB9CisJaW50IGJhcihjaGFyICpzMSwgY2hhciAqczIpIHsgcmV0dXJuIChiYXooczEpIC0gYmF6KHMyKSk7IH0KKwlpbnQgYmF6KGNoYXIgKnMpIHsgcmV0dXJuICgqcyk7IH0KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKGFjID09IGZvbyhhdlswXSwgYXZbYWMtMV0pKTsgfQorCSNlbmRpZgorRU9GCithY190ZXN0IGF0dHJpYnV0ZV9ub3JldHVybiAnJyAnZm9yIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSknIDw8LSdFT0YnCisJI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCisJLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQorCSNlbHNlCisJI2luY2x1ZGUgPHN0ZGxpYi5oPgorCSN1bmRlZiBfX2F0dHJpYnV0ZV9fCisJdm9pZCBmbm9yZCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCWludCBtYWluKHZvaWQpIHsgZm5vcmQoKTsgfQorCXZvaWQgZm5vcmQodm9pZCkgeyBleGl0KDApOyB9CisJI2VuZGlmCitFT0YKK2FjX3Rlc3QgYXR0cmlidXRlX3VudXNlZCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKHVudXNlZCkpJyA8PC0nRU9GJworCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQorCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KKwkjZWxzZQorCWludCBtYWluKGludCBhYyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgY2hhciAqKmF2CisJICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKSB7IHJldHVybiAoMCk7IH0KKwkjZW5kaWYKK0VPRgorYWNfdGVzdCBhdHRyaWJ1dGVfdXNlZCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKHVzZWQpKScgPDwtJ0VPRicKKwkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKKwkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9CisJI2Vsc2UKKwlzdGF0aWMgY29uc3QgY2hhciBmbm9yZFtdIF9fYXR0cmlidXRlX18oKHVzZWQpKSA9ICI0MiI7CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9CisJI2VuZGlmCitFT0YKKworIyBFbmQgb2YgdGVzdHMgcnVuIHdpdGggLVdlcnJvcgorTk9XQVJOPSRzYXZlX05PV0FSTgorcGhhc2U9eAorCisjCisjIG1rc2g6IGZsYXZvdXJzIChmdWxsL3NtYWxsIG1rc2gsIG9taXQgY2VydGFpbiBzdHVmZikKKyMKK2lmIGFjX2lmY3BwICdpZmRlZiBNS1NIX1NNQUxMJyBpc3NldF9NS1NIX1NNQUxMICcnIFwKKyAgICAiaWYgYSByZWR1Y2VkLWZlYXR1cmUgbWtzaCBpcyByZXF1ZXN0ZWQiOyB0aGVuCisJI1hYWCB0aGlzIHN1Y2tzOyBmaXggaXQgZm9yICphbGwqIGNvbXBpbGVycworCWNhc2UgJGN0IGluCisJY2xhbmd8aWNjfG53Y2MpCisJCWFjX2ZsYWdzIDEgZm5vaW5saW5lIC1mbm8taW5saW5lCisJCTs7CisJZ2NjKQorCQlOT1dBUk49JERPV0FSTjsgcGhhc2U9dQorCQlhY19mbGFncyAxIGZub2lubGluZSAtZm5vLWlubGluZQorCQlOT1dBUk49JHNhdmVfTk9XQVJOOyBwaGFzZT14CisJCTs7CisJc3VucHJvKQorCQlhY19mbGFncyAxIGZub2lubGluZSAteGlubGluZT0KKwkJOzsKKwl4bGMpCisJCWFjX2ZsYWdzIDEgZm5vaW5saW5lIC1xbm9pbmxpbmUKKwkJOzsKKwllc2FjCisKKwk6ICR7SEFWRV9NS05PRD0wfQorCTogJHtIQVZFX05JQ0U9MH0KKwk6ICR7SEFWRV9SRVZPS0U9MH0KKwk6ICR7SEFWRV9QRVJTSVNURU5UX0hJU1RPUlk9MH0KKwljaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLHNta3NoCisJSEFWRV9JU1NFVF9NS1NIX0NPTlNFUlZBVElWRV9GRFM9MQkjIGZyb20gc2guaAorZmkKK2FjX2lmY3BwICdpZmRlZiBNS1NIX0JJTlNIUkVEVUNFRCcgaXNzZXRfTUtTSF9CSU5TSFJFRFVDRUQgJycgXAorICAgICJpZiBhIHJlZHVjZWQtZmVhdHVyZSBzaCBpcyByZXF1ZXN0ZWQiICYmIFwKKyAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLGJpbnNoCithY19pZmNwcCAnaWZkZWYgTUtTSF9VTkVNUExPWUVEJyBpc3NldF9NS1NIX1VORU1QTE9ZRUQgJycgXAorICAgICJpZiBta3NoIHdpbGwgYmUgYnVpbHQgd2l0aG91dCBqb2IgY29udHJvbCIgJiYgXAorICAgIGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsYXJnZQorYWNfaWZjcHAgJ2lmZGVmIE1LU0hfQVNTVU1FX1VURjgnIGlzc2V0X01LU0hfQVNTVU1FX1VURjggJycgXAorICAgICdpZiB0aGUgZGVmYXVsdCBVVEYtOCBtb2RlIGlzIHNwZWNpZmllZCcgJiYgOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CithY19pZmNwcCAnaWZkZWYgTUtTSF9DT05TRVJWQVRJVkVfRkRTJyBpc3NldF9NS1NIX0NPTlNFUlZBVElWRV9GRFMgJycgXAorICAgICdpZiB0cmFkaXRpb25hbC9jb25zZXJ2YXRpdmUgZmQgdXNlIGlzIHJlcXVlc3RlZCcgJiYgXAorICAgIGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsY29udmZkcworCisjCisjIEVudmlyb25tZW50OiBoZWFkZXJzCisjCithY19oZWFkZXIgc3lzL3BhcmFtLmgKK2FjX2hlYWRlciBzeXMvbWtkZXYuaCBzeXMvdHlwZXMuaAorYWNfaGVhZGVyIHN5cy9tbWFuLmggc3lzL3R5cGVzLmgKK2FjX2hlYWRlciBzeXMvc3lzbWFjcm9zLmgKK2FjX2hlYWRlciBncnAuaCBzeXMvdHlwZXMuaAorYWNfaGVhZGVyIGxpYmdlbi5oCithY19oZWFkZXIgbGlidXRpbC5oIHN5cy90eXBlcy5oCithY19oZWFkZXIgcGF0aHMuaAorYWNfaGVhZGVyIHN0ZGJvb2wuaAorYWNfaGVhZGVyIHN0ZGludC5oIHN0ZGFyZy5oCithY19oZWFkZXIgc3RyaW5ncy5oIHN5cy90eXBlcy5oCithY19oZWFkZXIgdWxpbWl0Lmggc3lzL3R5cGVzLmgKK2FjX2hlYWRlciB2YWx1ZXMuaAorCisjCisjIEVudmlyb25tZW50OiBkZWZpbml0aW9ucworIworZWNobyAnI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLyogY2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDJeNjMtMSBjb3JyZWN0bHksIHRoeCBGU0YgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpMSA8PCA2MikgLSAxICsgKChvZmZfdCkxIDw8IDYyKSkKK2ludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMSAmJgorICAgIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKSA/IDEgOiAtMV07CitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoMCk7IH0nID5sZnQuYworYWNfdGVzdG4gY2FuX2xmcyAnJyAiZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCIgPGxmdC5jCitzYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IgorYWNfdGVzdG4gY2FuX2xmc19zdXMgJyEnIGNhbl9sZnMgMCAiLi4uIHdpdGggLURfRklMRV9PRkZTRVRfQklUUz02NCIgPGxmdC5jCitpZiB0ZXN0IDAgPSAkSEFWRV9DQU5fTEZTX1NVUzsgdGhlbgorCUNQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyAtRF9MQVJHRV9GSUxFUz0xIgorCWFjX3Rlc3RuIGNhbl9sZnNfYWl4ICchJyBjYW5fbGZzIDAgIi4uLiB3aXRoIC1EX0xBUkdFX0ZJTEVTPTEiIDxsZnQuYworCXRlc3QgMSA9ICRIQVZFX0NBTl9MRlNfQUlYIHx8IENQUEZMQUdTPSRzYXZlX0NQUEZMQUdTCitmaQorcm1mIGxmdCoJIyBlbmQgb2YgbGFyZ2UgZmlsZSBzdXBwb3J0IHRlc3QKKworIworIyBFbnZpcm9ubWVudDogdHlwZXMKKyMKK2FjX3Rlc3QgY2FuX2ludHR5cGVzICchJyBzdGRpbnRfaCAxICJmb3Igc3RhbmRhcmQgMzItYml0IGludGVnZXIgdHlwZXMiIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1aW50MzJfdCkocHRyZGlmZl90KSphdiArIChpbnQzMl90KWFjKTsgfQorRU9GCithY190ZXN0IGNhbl91Y2JpbnRzICchJyBjYW5faW50dHlwZXMgMSAiZm9yIFVDQiAzMi1iaXQgaW50ZWdlciB0eXBlcyIgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoKHVfaW50MzJfdCkocHRyZGlmZl90KSphdiArIChpbnQzMl90KWFjKTsgfQorRU9GCithY190ZXN0IGNhbl9pbnQ4dHlwZSAnIScgc3RkaW50X2ggMSAiZm9yIHN0YW5kYXJkIDgtYml0IGludGVnZXIgdHlwZSIgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoKHVpbnQ4X3QpKHB0cmRpZmZfdClhdlthY10pOyB9CitFT0YKK2FjX3Rlc3QgY2FuX3VjYmludDggJyEnIGNhbl9pbnQ4dHlwZSAxICJmb3IgVUNCIDgtYml0IGludGVnZXIgdHlwZSIgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqKmF2KSB7IHJldHVybiAoKHVfaW50OF90KShwdHJkaWZmX3QpYXZbYWNdKTsgfQorRU9GCisKK2FjX3Rlc3QgcmxpbV90IDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzeXMvdGltZS5oPgorCSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHJsaW1fdCkwKTsgfQorRU9GCisKKyMgb25seSB0ZXN0bjogYWRkZWQgbGF0ZXIgYmVsb3cKK2FjX3Rlc3RuIHNpZ190IDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzaWduYWwuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkoc2lnX3Qpa2lsbCgwLDApKTsgfQorRU9GCisKK2FjX3Rlc3RuIHNpZ2hhbmRsZXJfdCAnIScgc2lnX3QgMCA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c2lnbmFsLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHNpZ2hhbmRsZXJfdClraWxsKDAsMCkpOyB9CitFT0YKK2lmIHRlc3QgMSA9ICRIQVZFX1NJR0hBTkRMRVJfVDsgdGhlbgorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURzaWdfdD1zaWdoYW5kbGVyX3QiCisJSEFWRV9TSUdfVD0xCitmaQorCithY190ZXN0biBfX3NpZ2hhbmRsZXJfdCAnIScgc2lnX3QgMCA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c2lnbmFsLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKF9fc2lnaGFuZGxlcl90KWtpbGwoMCwwKSk7IH0KK0VPRgoraWYgdGVzdCAxID0gJEhBVkVfX19TSUdIQU5ETEVSX1Q7IHRoZW4KKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec2lnX3Q9X19zaWdoYW5kbGVyX3QiCisJSEFWRV9TSUdfVD0xCitmaQorCit0ZXN0IDEgPSAkSEFWRV9TSUdfVCB8fCBDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec2lnX3Q9bm9zaWdfdCIKK2FjX2NwcGZsYWdzIFNJR19UCisKKyMKKyMgRW52aXJvbm1lbnQ6IHNpZ25hbHMKKyMKK3Rlc3QgeCJOZXRCU0QiID0geCIkVEFSR0VUX09TIiAmJiAkZSBJZ25vcmUgdGhlIGNvbXBhdGliaWxpdHkgd2FybmluZy4KKworZm9yIHdoYXQgaW4gbmFtZSBsaXN0OyBkbworCXV3aGF0PWB1cHBlciAkd2hhdGAKKwlhY190ZXN0biBzeXNfc2lnJHdoYXQgJycgInRoZSBzeXNfc2lnJHt3aGF0fVtdIGFycmF5IiA8PC1FT0YKKwkJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19zaWcke3doYXR9W107CisJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChzeXNfc2lnJHt3aGF0fVswXVswXSk7IH0KKwlFT0YKKwlhY190ZXN0biBfc3lzX3NpZyR3aGF0ICchJyBzeXNfc2lnJHdoYXQgMCAidGhlIF9zeXNfc2lnJHt3aGF0fVtdIGFycmF5IiA8PC1FT0YKKwkJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IF9zeXNfc2lnJHt3aGF0fVtdOworCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoX3N5c19zaWcke3doYXR9WzBdWzBdKTsgfQorCUVPRgorCWlmIGV2YWwgInRlc3QgMSA9IFwkSEFWRV9fU1lTX1NJRyR1d2hhdCI7IHRoZW4KKwkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHN5c19zaWckd2hhdD1fc3lzX3NpZyR3aGF0IgorCQlldmFsICJIQVZFX1NZU19TSUckdXdoYXQ9MSIKKwlmaQorCWFjX2NwcGZsYWdzIFNZU19TSUckdXdoYXQKK2RvbmUKKworYWNfdGVzdCBzdHJzaWduYWwgJyEnIHN5c19zaWdsaXN0IDAgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3RyaW5nLmg+CisJI2luY2x1ZGUgPHNpZ25hbC5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChzdHJzaWduYWwoMSlbMF0pOyB9CitFT0YKKworIworIyBFbnZpcm9ubWVudDogbGlicmFyeSBmdW5jdGlvbnMKKyMKK2FjX3Rlc3RuIGZsb2NrX2V4ICcnICdmbG9jayBhbmQgbW1hcCcgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN5cy9maWxlLmg+CisJI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisJI2luY2x1ZGUgPGZjbnRsLmg+CisJI2luY2x1ZGUgPHN0ZGxpYi5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgodm9pZCAqKW1tYXAoTlVMTCwgKHNpemVfdClmbG9jaygwLCBMT0NLX0VYKSwKKwkgICAgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgMCwgKG9mZl90KTApID09ICh2b2lkICopTlVMTCA/IDEgOgorCSAgICBtdW5tYXAoTlVMTCwgMCkpOyB9CitFT0YKKworYWNfdGVzdCBnZXRydXNhZ2UgPDwtJ0VPRicKKwkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQorCSNpbmNsdWRlICJzaC5oIgorCWludCBtYWluKHZvaWQpIHsKKwkJc3RydWN0IHJ1c2FnZSBydTsKKwkJcmV0dXJuIChnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydSkgKworCQkgICAgZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJnJ1KSk7CisJfQorRU9GCisKK2FjX3Rlc3Qga2lsbHBnIDw8LSdFT0YnCisJI2luY2x1ZGUgPHNpZ25hbC5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKGF2WzBdW2tpbGxwZygxMjMsIGFjKV0pOyB9CitFT0YKKworYWNfdGVzdCBta25vZCAnJyAnaWYgdG8gdXNlIG1rbm9kKCksIG1ha2VkZXYoKSBhbmQgZnJpZW5kcycgPDwtJ0VPRicKKwkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQorCSNpbmNsdWRlICJzaC5oIgorCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeworCQlkZXZfdCBkdjsKKwkJZHYgPSBtYWtlZGV2KCh1bnNpZ25lZCBpbnQpYWMsICh1bnNpZ25lZCBpbnQpYXZbMF1bMF0pOworCQlyZXR1cm4gKG1rbm9kKGF2WzBdLCAobW9kZV90KTAsIGR2KSA/IChpbnQpbWFqb3IoZHYpIDoKKwkJICAgIChpbnQpbWlub3IoZHYpKTsKKwl9CitFT0YKKworYWNfdGVzdCBta3N0ZW1wIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN0ZGxpYi5oPgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQgbWFpbih2b2lkKSB7IGNoYXIgdG1wbFtdID0gIlgiOyByZXR1cm4gKG1rc3RlbXAodG1wbCkpOyB9CitFT0YKKworYWNfdGVzdCBuaWNlIDw8LSdFT0YnCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChuaWNlKDQpKTsgfQorRU9GCisKK2FjX3Rlc3QgcmV2b2tlIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpZiBIQVZFX0xJQlVUSUxfSAorCSNpbmNsdWRlIDxsaWJ1dGlsLmg+CisJI2VuZGlmCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKGFjICsgcmV2b2tlKGF2WzBdKSk7IH0KK0VPRgorCithY190ZXN0IHNldGxvY2FsZV9jdHlwZSAnJyAnc2V0bG9jYWxlKExDX0NUWVBFLCAiIiknIDw8LSdFT0YnCisJI2luY2x1ZGUgPGxvY2FsZS5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KSh2b2lkICopc2V0bG9jYWxlKExDX0NUWVBFLCAiIikpOyB9CitFT0YKKworYWNfdGVzdCBsYW5naW5mb19jb2Rlc2V0IHNldGxvY2FsZV9jdHlwZSAwICdubF9sYW5naW5mbyhDT0RFU0VUKScgPDwtJ0VPRicKKwkjaW5jbHVkZSA8bGFuZ2luZm8uaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkodm9pZCAqKW5sX2xhbmdpbmZvKENPREVTRVQpKTsgfQorRU9GCisKK2FjX3Rlc3Qgc2V0bW9kZSBta25vZCAxIDw8LSdFT0YnCisJLyogWFhYIGltYWtlIHN0eWxlICovCisJLyogWFhYIGNvbmRpdGlvbnMgY29ycmVjdD8gKi8KKwkjaWYgZGVmaW5lZChfX01TVkNSVF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisJLyogZm9yY2UgYSBmYWlsdXJlOiBXaW4zMiBzZXRtb2RlKCkgaXMgbm90IHdoYXQgd2Ugd2FudC4uLiAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KKwkjZWxzZQorCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7IHJldHVybiAoZ2V0bW9kZShzZXRtb2RlKGF2WzBdKSwKKwkgICAgKG1vZGVfdClhYykpOyB9CisJI2VuZGlmCitFT0YKKworYWNfdGVzdCBzZXRyZXN1Z2lkIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHNldHJlc3VpZCgwLDAsMCk7IHJldHVybiAoc2V0cmVzZ2lkKDAsMCwwKSk7IH0KK0VPRgorCithY190ZXN0IHNldGdyb3VwcyBzZXRyZXN1Z2lkIDAgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2lmIEhBVkVfR1JQX0gKKwkjaW5jbHVkZSA8Z3JwLmg+CisJI2VuZGlmCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludCBtYWluKHZvaWQpIHsgZ2lkX3QgZ2lkID0gMDsgcmV0dXJuIChzZXRncm91cHMoMCwgJmdpZCkpOyB9CitFT0YKKworYWNfdGVzdCBzdHJjYXNlc3RyIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwkjaW5jbHVkZSA8c3RyaW5nLmg+CisJI2lmIEhBVkVfU1RSSU5HU19ICisJI2luY2x1ZGUgPHN0cmluZ3MuaD4KKwkjZW5kaWYKKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsKKwkJcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHZvaWQgKilzdHJjYXNlc3RyKCphdiwgYXZbYWNdKSk7CisJfQorRU9GCisKK2FjX3Rlc3Qgc3RybGNweSA8PC0nRU9GJworCSNpbmNsdWRlIDxzdHJpbmcuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuIChzdHJsY3B5KCphdiwgYXZbMV0sCisJICAgIChzaXplX3QpYWMpKTsgfQorRU9GCisKKyMKKyMgY2hlY2sgaGVhZGVycyBmb3IgZGVjbGFyYXRpb25zCisjCitzYXZlX0NDPSRDQzsgc2F2ZV9MREZMQUdTPSRMREZMQUdTOyBzYXZlX0xJQlM9JExJQlMKK0NDPSIkQ0MgLWMgLW8gJHRjZm4iOyBMREZMQUdTPTsgTElCUz0KK2FjX3Rlc3QgJyEnIGZsb2NrX2RlY2wgZmxvY2tfZXggMSAnaWYgZmxvY2soKSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlY2xhcmVkJyA8PC0nRU9GJworCSNkZWZpbmUgTUtTSF9JTkNMVURFU19PTkxZCisJI2luY2x1ZGUgInNoLmgiCisJbG9uZyBmbG9jayh2b2lkKTsJCS8qIHRoaXMgY2xhc2hlcyBpZiBkZWZpbmVkIGJlZm9yZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KWZsb2NrKCkpOyB9CitFT0YKK2FjX3Rlc3QgJyEnIHJldm9rZV9kZWNsIHJldm9rZSAxICdpZiByZXZva2UoKSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlY2xhcmVkJyA8PC0nRU9GJworCSNkZWZpbmUgTUtTSF9JTkNMVURFU19PTkxZCisJI2luY2x1ZGUgInNoLmgiCisJbG9uZyByZXZva2Uodm9pZCk7CQkvKiB0aGlzIGNsYXNoZXMgaWYgZGVmaW5lZCBiZWZvcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludClyZXZva2UoKSk7IH0KK0VPRgorYWNfdGVzdCBzeXNfc2lnbGlzdF9kZWNsIHN5c19zaWdsaXN0IDEgJ2lmIHN5c19zaWdsaXN0W10gZG9lcyBub3QgbmVlZCB0byBiZSBkZWNsYXJlZCcgPDwtJ0VPRicKKwkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQorCSNpbmNsdWRlICJzaC5oIgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuIChzeXNfc2lnbGlzdFswXVswXSk7IH0KK0VPRgorQ0M9JHNhdmVfQ0M7IExERkxBR1M9JHNhdmVfTERGTEFHUzsgTElCUz0kc2F2ZV9MSUJTCisKKyMKKyMgb3RoZXIgY2hlY2tzCisjCitmZD0naWYgdG8gdXNlIHBlcnNpc3RlbnQgaGlzdG9yeScKK2FjX2NhY2hlIFBFUlNJU1RFTlRfSElTVE9SWSB8fCB0ZXN0IDAgPSAkSEFWRV9GTE9DS19FWCB8fCBmdj0xCit0ZXN0IDEgPSAkZnYgfHwgY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxuby1oaXN0ZmlsZQorYWNfdGVzdGRvbmUKK2FjX2NwcGZsYWdzCisKKyMKKyMgQ29tcGlsZXI6IFByYWVwcm9jZXNzb3IgKG9ubHkgaWYgbmVlZGVkKQorIwordGVzdCAwID0gJEhBVkVfU1lTX1NJR05BTUUgJiYgaWYgYWNfdGVzdGluaXQgY3BwX2RkICcnIFwKKyAgICAnY2hlY2tpbmcgaWYgdGhlIEMgUHJlcHJvY2Vzc29yIHN1cHBvcnRzIC1kRCc7IHRoZW4KKwllY2hvICcjZGVmaW5lIGZvbyBiYXInID5jb25mdGVzdC5jCisJdnYgJ10nICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gLWREIGNvbmZ0ZXN0LmMgPngiCisJZ3JlcCAnI2RlZmluZSBmb28gYmFyJyB4ID4vZGV2L251bGwgMj4mMSAmJiBmdj0xCisJcm1mIGNvbmZ0ZXN0LmMgeCB2di5vdXQKKwlhY190ZXN0ZG9uZQorZmkKKworIworIyBFbmQgb2YgbWlydG9jb25mIGNoZWNrcworIworJGUgLi4uIGRvbmUuCisKKyMgU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBoYXZlIGFuY2llbnQgdmVyc2lvbnMgb2YgZWQoMSkgd3JpdGluZworIyB0aGUgY2hhcmFjdGVyIGNvdW50IHRvIHN0YW5kYXJkIG91dHB1dDsgY29wZSBmb3IgdGhhdAorZWNobyB3cSA+eAorZWQgeCA8eCAyPi9kZXYvbnVsbCB8IGdyZXAgMyA+L2Rldi9udWxsIDI+JjEgJiYgXAorICAgIGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsJG9sZGlzaF9lZAorcm1mIHggdnYub3V0CisKK2lmIHRlc3QgMCA9ICRIQVZFX1NZU19TSUdOQU1FOyB0aGVuCisJaWYgdGVzdCAxID0gJEhBVkVfQ1BQX0REOyB0aGVuCisJCSRlIEdlbmVyYXRpbmcgbGlzdCBvZiBzaWduYWwgbmFtZXMuLi4KKwllbHNlCisJCSRlIE5vIGxpc3Qgb2Ygc2lnbmFsIG5hbWVzIGF2YWlsYWJsZSB2aWEgY3BwLiBGYWxsaW5nIGJhY2suLi4KKwlmaQorCXNpZ3NlZW49OgorCWVjaG8gJyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZm5kZWYgTlNJRworI2lmIGRlZmluZWQoX05TSUcpCisjZGVmaW5lIE5TSUcgX05TSUcKKyNlbGlmIGRlZmluZWQoU0lHTUFYKQorI2RlZmluZSBOU0lHIChTSUdNQVgrMSkKKyNlbmRpZgorI2VuZGlmCitta3NoX2NmZzogTlNJRycgPmNvbmZ0ZXN0LmMKKwlOU0lHPWB2cSAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIGNvbmZ0ZXN0LmMiIHwgXAorCSAgICBncmVwIG1rc2hfY2ZnOiB8IHNlZCAncy9ebWtzaF9jZmc6WwkgXSpcKFswLTl4ICgpKy1dKlwpLiokL1wxLydgCisJY2FzZSAkTlNJRyBpbgorCSpbXCBcKFwpKy1dKikgTlNJRz1gYXdrICJCRUdJTiB7IHByaW50ICROU0lHIH0iYCA7OworCWVzYWMKKwlwcmludGY9cHJpbnRmCisJKHByaW50ZiBoYWxsbykgPi9kZXYvbnVsbCAyPiYxIHx8IHByaW50Zj1lY2hvCisJdGVzdCAkcHJpbnRmID0gZWNobyB8fCBOU0lHPWBwcmludGYgJWQgIiROU0lHIiAyPi9kZXYvbnVsbGAKKwkkcHJpbnRmICJOU0lHPSROU0lHIC4uLiAiCisJc2lncz0iQUJSVCBBTFJNIEJVUyBDSExEIENMRCBDT05UIERJTCBFTVQgRlBFIEhVUCBJTEwgSU5GTyBJTlQgSU8gSU9UIgorCXNpZ3M9IiRzaWdzIEtJTEwgTE9TVCBQSVBFIFBST0YgUFdSIFFVSVQgUkVTViBTQUsgU0VHViBTVE9QIFNZUyBURVJNIgorCXNpZ3M9IiRzaWdzIFRSQVAgVFNUUCBUVElOIFRUT1UgVVJHIFVTUjEgVVNSMiBWVEFMUk0gV0lOQ0ggWENQVSBYRlNaIgorCXRlc3QgMSA9ICRIQVZFX0NQUF9ERCAmJiB0ZXN0ICROU0lHIC1ndCAxICYmIHNpZ3M9IiRzaWdzICJgdnEgXAorCSAgICAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIC1kRCBjb25mdGVzdC5jIiB8IFwKKwkgICAgZ3JlcCAnWwkgXVNJR1tBLVowLTldKlsJIF0nIHwgXAorCSAgICBzZWQgJ3MvXlwoLipbCSBdU0lHXClcKFtBLVowLTldKlwpXChbCSBdLipcKSQvXDIvJyB8IHNvcnRgCisJdGVzdCAkTlNJRyAtZ3QgMSB8fCBzaWdzPQorCWZvciBuYW1lIGluICRzaWdzOyBkbworCQllY2hvICcjaW5jbHVkZSA8c2lnbmFsLmg+JyA+Y29uZnRlc3QuYworCQllY2hvIG1rc2hfY2ZnOiBTSUckbmFtZSA+PmNvbmZ0ZXN0LmMKKwkJdnEgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiBjb25mdGVzdC5jIiB8IFwKKwkJICAgIGdyZXAgbWtzaF9jZmc6IHwgXAorCQkgICAgc2VkICdzL15ta3NoX2NmZzpbCSBdKlwoWzAtOXhdKlwpLiokL1wxOickbmFtZS8KKwlkb25lIHwgZ3JlcCAtdiAnXjonIHwgd2hpbGUgSUZTPTogcmVhZCBuciBuYW1lOyBkbworCQl0ZXN0ICRwcmludGYgPSBlY2hvIHx8IG5yPWBwcmludGYgJWQgIiRuciIgMj4vZGV2L251bGxgCisJCXRlc3QgJG5yIC1ndCAwICYmIHRlc3QgJG5yIC1sZSAkTlNJRyB8fCBjb250aW51ZQorCQljYXNlICRzaWdzZWVuIGluCisJCSo6JG5yOiopIDs7CisJCSopCWVjaG8gIgkJeyBcIiRuYW1lXCIsICRuciB9LCIKKwkJCXNpZ3NlZW49JHNpZ3NlZW4kbnI6CisJCQkkcHJpbnRmICIkbmFtZT0kbnIgIiA+JjIKKwkJCTs7CisJCWVzYWMKKwlkb25lIDI+JjEgPnNpZ25hbWVzLmluYworCXJtZiBjb25mdGVzdC5jCisJJGUgZG9uZS4KK2ZpCisKK2FkZHNyY3MgJyEnIEhBVkVfU0VUTU9ERSBzZXRtb2RlLmMKK2FkZHNyY3MgJyEnIEhBVkVfU1RSTENQWSBzdHJsY3B5LmMKK2FkZHNyY3MgVVNFX1BSSU5URl9CVUlMVElOIHByaW50Zi5jCit0ZXN0IDEgPSAiJFVTRV9QUklOVEZfQlVJTFRJTiIgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRE1LU0hfUFJJTlRGX0JVSUxUSU4iCit0ZXN0IDAgPSAiJEhBVkVfU0VUTU9ERSIgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfQ09ORklHX0ggLURDT05GSUdfSF9GSUxFTkFNRT1cXFwic2guaFxcXCIiCit0ZXN0IDEgPSAiJEhBVkVfQ0FOX1ZFUkIiICYmIENGTEFHUz0iJENGTEFHUyAtdmVyYm9zZSIKKworJGUgJGJpJG1lOiBGaW5pc2hlZCBjb25maWd1cmF0aW9uIHRlc3RpbmcsIG5vdyBwcm9kdWNpbmcgb3V0cHV0LiRhbworCitmaWxlcz0KK29ianM9CitzcD0KK2Nhc2UgJGN1cmRpciBpbgorKlwgKikJZWNobyAiIyEuL21rc2giID50ZXN0LnNoIDs7CisqKQllY2hvICIjISRjdXJkaXIvbWtzaCIgPnRlc3Quc2ggOzsKK2VzYWMKK2NhdCA+PnRlc3Quc2ggPDwtRU9GCisJTENfQUxMPUMgUEFUSD0nJFBBVEgnOyBleHBvcnQgTENfQUxMIFBBVEgKKwl0ZXN0IC1uICJcJEtTSF9WRVJTSU9OIiB8fCBleGl0IDEKKwljaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzCisJcHJpbnQgVGVzdGluZyBta3NoIGZvciBjb25mb3JtYW5jZToKKwlmZ3JlcCBNaXJPUzogJyRzcmNkaXIvY2hlY2sudCcKKwlmZ3JlcCBNSVJCU0QgJyRzcmNkaXIvY2hlY2sudCcKKwlwcmludCAiVGhpcyBzaGVsbCBpcyBhY3R1YWxseTpcXG5cXHRcJEtTSF9WRVJTSU9OIgorCXByaW50ICd0ZXN0LnNoIGJ1aWx0IGZvciBta3NoICRkc3R2ZXJzaW9uJworCWNzdHI9J1wkb3MgPSBkZWZpbmVkIFwkXk8gPyBcJF5PIDogInVua25vd24iOycKKwljc3RyPSJcJGNzdHIiJ3ByaW50IFwkb3MgLiAiLCBQZXJsIHZlcnNpb24gIiAuIFwkXTsnCisJZm9yIHBlcmxpIGluIFwkUEVSTCBwZXJsNSBwZXJsIG5vOyBkbworCQlbWyBcJHBlcmxpID0gbm8gXV0gJiYgZXhpdCAxCisJCXBlcmxvcz1cJChcJHBlcmxpIC1lICJcJGNzdHIiKSAyPiYtIHx8IGNvbnRpbnVlCisJCXByaW50ICJQZXJsIGludGVycHJldGVyICdcJHBlcmxpJyBydW5uaW5nIG9uICdcJHBlcmxvcyciCisJCVtbIC1uIFwkcGVybG9zIF1dICYmIGJyZWFrCisJZG9uZQorCWV4ZWMgXCRwZXJsaSAnJHNyY2Rpci9jaGVjay5wbCcgLXMgJyRzcmNkaXIvY2hlY2sudCcgLXAgJyRjdXJkaXIvbWtzaCcgXCR7Y2hlY2tfY2F0ZWdvcmllczorLUN9IFwke2NoZWNrX2NhdGVnb3JpZXMjLH0gXCQqJHRzdHMKK0VPRgorY2htb2QgNzU1IHRlc3Quc2gKK3Rlc3QgJEhBVkVfQ0FOX0NPTUJJTkUkY20gPSAwY29tYmluZSAmJiBjbT1ub3JtYWwKK2lmIHRlc3QgJGNtID0gbGx2bTsgdGhlbgorCWVtaXRiYz0iLWVtaXQtbGx2bSAtYyIKK2VsaWYgdGVzdCAkY20gPSBkcmFnb25lZ2c7IHRoZW4KKwllbWl0YmM9Ii1TIC1mbHRvIgorZWxzZQorCWVtaXRiYz0tYworZmkKK2VjaG8gc2V0IC14ID5SZWJ1aWxkLnNoCitmb3IgZmlsZSBpbiAkU1JDUzsgZG8KKwlvcD1gZWNobyB4IiRmaWxlIiB8IHNlZCAncy9eeFwoLipcKVwuYyQvXDEuLydgCisJdGVzdCAtZiAkZmlsZSB8fCBmaWxlPSRzcmNkaXIvJGZpbGUKKwlmaWxlcz0iJGZpbGVzJHNwJGZpbGUiCisJc3A9JyAnCisJZWNobyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRlbWl0YmMgJGZpbGUgfHwgZXhpdCAxIiA+PlJlYnVpbGQuc2gKKwlpZiB0ZXN0ICRjbSA9IGRyYWdvbmVnZzsgdGhlbgorCQllY2hvICJtdiAke29wfXMgJHtvcH1sbCIgPj5SZWJ1aWxkLnNoCisJCWVjaG8gImxsdm0tYXMgJHtvcH1sbCB8fCBleGl0IDEiID4+UmVidWlsZC5zaAorCQlvYmpzPSIkb2JqcyRzcCR7b3B9YmMiCisJZWxzZQorCQlvYmpzPSIkb2JqcyRzcCR7b3B9byIKKwlmaQorZG9uZQorY2FzZSAkY20gaW4KK2RyYWdvbmVnZ3xsbHZtKQorCWVjaG8gInJtIC1mIG1rc2gucyIgPj5SZWJ1aWxkLnNoCisJZWNobyAibGx2bS1saW5rIC1vIC0gJG9ianMgfCBvcHQgJG9wdGZsYWdzIHwgbGxjIC1vIG1rc2gucyIgPj5SZWJ1aWxkLnNoCisJbG9ianM9bWtzaC5zCisJOzsKKyopCisJbG9ianM9JG9ianMKKwk7OworZXNhYworY2FzZSAkdGNmbiBpbgorYS5leGUpCW1rc2hleGU9bWtzaC5leGUgOzsKKyopCW1rc2hleGU9bWtzaCA7OworZXNhYworZWNobyB0Y2ZuPSRta3NoZXhlID4+UmVidWlsZC5zaAorZWNobyAiJENDICRDRkxBR1MgJExERkxBR1MgLW8gXCR0Y2ZuICRsb2JqcyAkTElCUyAkY2NwciIgPj5SZWJ1aWxkLnNoCitlY2hvICd0ZXN0IC1mICR0Y2ZuIHx8IGV4aXQgMTsgc2l6ZSAkdGNmbicgPj5SZWJ1aWxkLnNoCitpZiB0ZXN0ICRjbSA9IG1ha2VmaWxlOyB0aGVuCisJZXh0cmFzPSdlbWFjc2ZuLmggc2guaCBzaF9mbGFncy5oIHZhcl9zcGVjLmgnCisJdGVzdCAwID0gJEhBVkVfU1lTX1NJR05BTUUgJiYgZXh0cmFzPSIkZXh0cmFzIHNpZ25hbWVzLmluYyIKKwljYXQgPk1ha2VmcmFnLmluYyA8PEVPRgorIyBNYWtlZmlsZSBmcmFnbWVudCBmb3IgYnVpbGRpbmcgbWtzaCAkZHN0dmVyc2lvbgorCitQUk9HPQkJJG1rc2hleGUKK01BTj0JCW1rc2guMQorU1JDUz0JCSRTUkNTCitTUkNTX0ZQPQkkZmlsZXMKK09CSlNfQlA9CSRvYmpzCitJTkRTUkNTPQkkZXh0cmFzCitOT05TUkNTX0lOU1Q9CWRvdC5ta3NocmMgXCQoTUFOKQorTk9OU1JDU19OT0lOU1Q9CUJ1aWxkLnNoIE1ha2VmaWxlIFJlYnVpbGQuc2ggY2hlY2sucGwgY2hlY2sudCB0ZXN0LnNoCitDQz0JCSRDQworQ0ZMQUdTPQkJJENGTEFHUworQ1BQRkxBR1M9CSRDUFBGTEFHUworTERGTEFHUz0JJExERkxBR1MKK0xJQlM9CQkkTElCUworCisjIG5vdCBCU0QgbWFrZSBvbmx5OgorI1ZQQVRIPQkJJHNyY2RpcgorI2FsbDogXCQoUFJPRykKKyNcJChQUk9HKTogXCQoT0JKU19CUCkKKyMJXCQoQ0MpIFwkKENGTEFHUykgXCQoTERGTEFHUykgLW8gXCRAIFwkKE9CSlNfQlApIFwkKExJQlMpCisjXCQoT0JKU19CUCk6IFwkKFNSQ1NfRlApIFwkKE5PTlNSQ1MpCisjLmMubzoKKyMJXCQoQ0MpIFwkKENGTEFHUykgXCQoQ1BQRkxBR1MpIC1jIFwkPAorCisjIGZvciBhbGwgbWFrZSB2YXJpYW50czoKKyNSRUdSRVNTX0ZMQUdTPQktdgorI3JlZ3Jlc3M6CisjCS4vdGVzdC5zaCBcJChSRUdSRVNTX0ZMQUdTKQorCisjIGZvciBCU0QgbWFrZSBvbmx5OgorIy5QQVRIOiAkc3JjZGlyCisjLmluY2x1ZGUgPGJzZC5wcm9nLm1rPgorRU9GCisJJGUKKwkkZSBHZW5lcmF0ZWQgTWFrZWZyYWcuaW5jIHN1Y2Nlc3NmdWxseS4KKwlleGl0IDAKK2ZpCitpZiB0ZXN0ICRjbSA9IGNvbWJpbmU7IHRoZW4KKwlvYmpzPSItbyAkbWtzaGV4ZSIKKwlmb3IgZmlsZSBpbiAkU1JDUzsgZG8KKwkJdGVzdCAtZiAkZmlsZSB8fCBmaWxlPSRzcmNkaXIvJGZpbGUKKwkJb2Jqcz0iJG9ianMgJGZpbGUiCisJZG9uZQorCWVtaXRiYz0iLWZ3aG9sZS1wcm9ncmFtIC0tY29tYmluZSIKKwl2ICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJGVtaXRiYyAkb2JqcyAkTElCUyAkY2NwciIKK2VsaWYgdGVzdCAxID0gJHBtOyB0aGVuCisJZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCisJCXRlc3QgLWYgJGZpbGUgfHwgZmlsZT0kc3JjZGlyLyRmaWxlCisJCXYgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkZW1pdGJjICRmaWxlIiAmCisJZG9uZQorCXdhaXQKK2Vsc2UKKwlmb3IgZmlsZSBpbiAkU1JDUzsgZG8KKwkJdGVzdCAkY20gPSBkcmFnb25lZ2cgJiYgXAorCQkgICAgb3A9YGVjaG8geCIkZmlsZSIgfCBzZWQgJ3MvXnhcKC4qXClcLmMkL1wxLi8nYAorCQl0ZXN0IC1mICRmaWxlIHx8IGZpbGU9JHNyY2Rpci8kZmlsZQorCQl2ICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJGVtaXRiYyAkZmlsZSIgfHwgZXhpdCAxCisJCWlmIHRlc3QgJGNtID0gZHJhZ29uZWdnOyB0aGVuCisJCQl2ICJtdiAke29wfXMgJHtvcH1sbCIKKwkJCXYgImxsdm0tYXMgJHtvcH1sbCIgfHwgZXhpdCAxCisJCWZpCisJZG9uZQorZmkKK2Nhc2UgJGNtIGluCitkcmFnb25lZ2d8bGx2bSkKKwlybWYgbWtzaC5zCisJdiAibGx2bS1saW5rIC1vIC0gJG9ianMgfCBvcHQgJG9wdGZsYWdzIHwgbGxjIC1vIG1rc2gucyIKKwk7OworZXNhYwordGNmbj0kbWtzaGV4ZQordGVzdCAkY20gPSBjb21iaW5lIHx8IHYgIiRDQyAkQ0ZMQUdTICRMREZMQUdTIC1vICR0Y2ZuICRsb2JqcyAkTElCUyAkY2NwciIKK3Rlc3QgLWYgJHRjZm4gfHwgZXhpdCAxCit0ZXN0IDEgPSAkciB8fCB2ICIkTlJPRkYgLW1kb2MgPCckc3JjZGlyL21rc2guMScgPm1rc2guY2F0MSIgfHwgXAorICAgIHJtZiBta3NoLmNhdDEKK3Rlc3QgMCA9ICRlcSAmJiB2IHNpemUgJHRjZm4KK2k9aW5zdGFsbAordGVzdCAtZiAvdXNyL3VjYi8kaSAmJiBpPS91c3IvdWNiLyRpCit0ZXN0IDEgPSAkZXEgJiYgZT06CiskZQorJGUgSW5zdGFsbGluZyB0aGUgc2hlbGw6CiskZSAiIyAkaSAtYyAtcyAtbyByb290IC1nIGJpbiAtbSA1NTUgbWtzaCAvYmluL21rc2giCiskZSAiIyBncmVwIC14IC9iaW4vbWtzaCAvZXRjL3NoZWxscyA+L2Rldi9udWxsIHx8IGVjaG8gL2Jpbi9ta3NoID4+L2V0Yy9zaGVsbHMiCiskZSAiIyAkaSAtYyAtbyByb290IC1nIGJpbiAtbSA0NDQgZG90Lm1rc2hyYyAvdXNyL3NoYXJlL2RvYy9ta3NoL2V4YW1wbGVzLyIKKyRlCiskZSBJbnN0YWxsaW5nIHRoZSBtYW51YWw6CitpZiB0ZXN0IC1mIG1rc2guY2F0MTsgdGhlbgorCSRlICIjICRpIC1jIC1vIHJvb3QgLWcgYmluIC1tIDQ0NCBta3NoLmNhdDEiIFwKKwkgICAgIi91c3Ivc2hhcmUvbWFuL2NhdDEvbWtzaC4wIgorCSRlIG9yCitmaQorJGUgIiMgJGkgLWMgLW8gcm9vdCAtZyBiaW4gLW0gNDQ0IG1rc2guMSAvdXNyL3NoYXJlL21hbi9tYW4xL21rc2guMSIKKyRlCiskZSBSdW4gdGhlIHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZTogLi90ZXN0LnNoCiskZSBQbGVhc2UgYWxzbyByZWFkIHRoZSBzYW1wbGUgZmlsZSBkb3QubWtzaHJjIGFuZCB0aGUgZmluZSBtYW51YWwuCitleGl0IDAKZGlmZiAtLWdpdCBhL21rc2gvc3JjL2NoZWNrLnBsIGIvbWtzaC9zcmMvY2hlY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5M2U5NQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2NoZWNrLnBsCkBAIC0wLDAgKzEsMTI0MSBAQAorIyAkTWlyT1M6IHNyYy9iaW4vbWtzaC9jaGVjay5wbCx2IDEuMjMgMjAwOS8wNi8xMCAxODoxMjo0MyB0ZyBSZWwgJAorIyAkT3BlbkJTRDogdGgsdiAxLjEzIDIwMDYvMDUvMTggMjE6Mjc6MjMgbWlvZCBFeHAgJAorIy0KKyMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5CisjCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyMKKyMgUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisjIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorIyBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyMgbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisjIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisjCisjIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworIyB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyMgaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisjIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorIyBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyMgb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisjIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorIyBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorIy0KKyMgRXhhbXBsZSB0ZXN0OgorIwkJbmFtZTogYS10ZXN0CisjCQlkZXNjcmlwdGlvbjoKKyMJCQlhIHRlc3QgdG8gc2hvdyBob3cgdGVzdHMgYXJlIGRvbmUKKyMJCWFyZ3VtZW50czogIS14IS1mIQorIwkJc3RkaW46CisjCQkJZWNobyAtbiAqCisjCQkJZmFsc2UKKyMJCWV4cGVjdGVkLXN0ZG91dDogIQorIwkJCSoKKyMJCWV4cGVjdGVkLXN0ZGVycjoKKyMJCQkrIGVjaG8gLW4gKgorIwkJCSsgZmFsc2UKKyMJCWV4cGVjdGVkLWV4aXQ6IDEKKyMJCS0tLQorIwlUaGlzIHJ1bnMgdGhlIHRlc3QtcHJvZ3JhbSAoZWcsIG1rc2gpIHdpdGggdGhlIGFyZ3VtZW50cyAteCBhbmQgLWYsCisjCXN0YW5kYXJkIGlucHV0IGlzIGEgZmlsZSBjb250YWluaW5nICJlY2hvIGhpKlxuZmFsc2VcbiIuIFRoZSBwcm9ncmFtCisjCWlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgImhpKiIgKG5vIHRyYWlsaW5nIG5ld2xpbmUpIG9uIHN0YW5kYXJkIG91dHB1dCwKKyMJIisgZWNobyBoaSpcbitmYWxzZVxuIiBvbiBzdGFuZGFyZCBlcnJvciwgYW5kIGFuIGV4aXQgY29kZSBvZiAxLgorIworIworIyBGb3JtYXQgb2YgdGVzdCBmaWxlczoKKyMgLSBibGFuayBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAjIGFyZSBpZ25vcmVkCisjIC0gYSB0ZXN0IGZpbGUgY29udGFpbnMgYSBzZXJpZXMgb2YgdGVzdHMKKyMgLSBhIHRlc3QgaXMgYSBzZXJpZXMgb2YgdGFnOnZhbHVlIHBhaXJzIGVuZGVkIHdpdGggYSAiLS0tIiBsaW5lCisjICAgKGxlYWRpbmcvdHJhaWxpbmcgc3BhY2VzIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBmaXJzdCBsaW5lIG9mIHZhbHVlKQorIyAtIHRlc3QgdGFncyBhcmU6CisjCVRhZwkJCUZsYWcJRGVzY3JpcHRpb24KKyMJLS0tLS0JCQktLS0tCS0tLS0tLS0tLS0tCisjCW5hbWUJCQlyCVRoZSBuYW1lIG9mIHRoZSB0ZXN0OyBzaG91bGQgYmUgdW5pcXVlCisjCWRlc2NyaXB0aW9uCQltCVdoYXQgdGVzdCBkb2VzCisjCWFyZ3VtZW50cwkJTQlBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcHJvZ3JhbTsKKyMJCQkJCWRlZmF1bHQgaXMgbm8gYXJndW1lbnRzLgorIwlzY3JpcHQJCQltCVZhbHVlIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIHdoaWNoCisjCQkJCQlpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2dyYW0KKyMJCQkJCShhZnRlciB0aGUgYXJndW1lbnRzIGFyZ3VtZW50cykKKyMJc3RkaW4JCQltCVZhbHVlIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIHdoaWNoIGlzCisjCQkJCQl1c2VkIGFzIHN0YW5kYXJkLWlucHV0IGZvciB0aGUgcHJvZ3JhbTsKKyMJCQkJCWRlZmF1bHQgaXMgdG8gdXNlIC9kZXYvbnVsbC4KKyMJcGVybC1zZXR1cAkJbQlWYWx1ZSBpcyBhIHBlcmwgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkCisjCQkJCQlqdXN0IGJlZm9yZSB0aGUgdGVzdCBpcyBydW4uIFRyeSB0bworIwkJCQkJYXZvaWQgdXNpbmcgdGhpcy4uLgorIwlwZXJsLWNsZWFudXAJCW0JVmFsdWUgaXMgYSBwZXJsIHNjcmlwdCB3aGljaCBpcyBleGVjdXRlZAorIwkJCQkJanVzdCBhZnRlciB0aGUgdGVzdCBpcyBydW4uIFRyeSB0bworIwkJCQkJYXZvaWQgdXNpbmcgdGhpcy4uLgorIwllbnYtc2V0dXAJCU0JVmFsdWUgaXMgYSBsaXN0IG9mIE5BTUU9VkFMVUUgZWxlbWVudHMKKyMJCQkJCXdoaWNoIGFyZSBwdXQgaW4gdGhlIGVudmlyb25tZW50IGJlZm9yZQorIwkJCQkJdGhlIHRlc3QgaXMgcnVuLiBJZiB0aGUgPVZBTFVFIGlzCisjCQkJCQltaXNzaW5nLCBOQU1FIGlzIHJlbW92ZWQgZnJvbSB0aGUKKyMJCQkJCWVudmlyb25tZW50LiBQcm9ncmFtcyBhcmUgcnVuIHdpdGgKKyMJCQkJCXRoZSBmb2xsb3dpbmcgbWluaW1hbCBlbnZpcm9ubWVudDoKKyMJCQkJCSAgICBIT01FLCBMRF9MSUJSQVJZX1BBVEgsIExPQ1BBVEgsCisjCQkJCQkgICAgTE9HTkFNRSwgUEFUSCwgU0hFTEwsIFVTRVIKKyMJCQkJCSh2YWx1ZXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgb2YKKyMJCQkJCXRoZSB0ZXN0IGhhcm5lc3MpLgorIwkJCQkJRU5WIGlzIHNldCB0byAvbm9uZXhpc3RhbnQuCisjCQkJCQlfX3Byb2duYW1lIGlzIHNldCB0byB0aGUgLXAgYXJndW1lbnQuCisjCQkJCQlfX3BlcmxuYW1lIGlzIHNldCB0byAkXlggKHBlcmxleGUpLgorIwlmaWxlLXNldHVwCQltcHMJVXNlZCB0byBjcmVhdGUgZmlsZXMsIGRpcmVjdG9yaWVzCisjCQkJCQlhbmQgc3ltbGlua3MuIEZpcnN0IHdvcmQgaXMgZWl0aGVyCisjCQkJCQlmaWxlLCBkaXIgb3Igc3ltbGluazsgc2Vjb25kIHdvcmQgaXMKKyMJCQkJCXBlcm1pc3Npb25zOyB0aGlzIGlzIGZvbGxvd2VkIGJ5IGEKKyMJCQkJCXF1b3RlZCB3b3JkIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlCisjCQkJCQlmaWxlOyB0aGUgZW5kLXF1b3RlIHNob3VsZCBiZSBmb2xsb3dlZAorIwkJCQkJYnkgYSBuZXdsaW5lLCB0aGVuIHRoZSBmaWxlIGRhdGEKKyMJCQkJCShpZiBhbnkpLiBUaGUgZmlyc3Qgd29yZCBtYXkgYmUKKyMJCQkJCXByZWNlZGVkIGJ5IGEgISB0byBzdHJpcCB0aGUgdHJhaWxpbmcKKyMJCQkJCW5ld2xpbmUgaW4gYSBzeW1saW5rLgorIwlmaWxlLXJlc3VsdAkJbXBzCVVzZWQgdG8gdmVyaWZ5IGEgZmlsZSwgc3ltbGluayBvcgorIwkJCQkJZGlyZWN0b3J5IGlzIGNyZWF0ZWQgY29ycmVjdGx5LgorIwkJCQkJVGhlIGZpcnN0IHdvcmQgaXMgZWl0aGVyCisjCQkJCQlmaWxlLCBkaXIgb3Igc3ltbGluazsgc2Vjb25kIHdvcmQgaXMKKyMJCQkJCWV4cGVjdGVkIHBlcm1pc3Npb25zOyB0aGlyZCB3b3JkCisjCQkJCQlpcyB1c2VyLWlkOyBmb3VydGggaXMgZ3JvdXAtaWQ7CisjCQkJCQlmaWZ0aCBpcyAiZXhhY3QiIG9yICJwYXR0ZXJuIgorIwkJCQkJaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGNvbnRlbnRzCisjCQkJCQl3aGljaCBmb2xsb3cgaXMgdG8gYmUgbWF0Y2hlZCBleGFjdGx5CisjCQkJCQlvciBpZiBpdCBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyMJCQkJCVRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgcXVvdGVkIG5hbWUKKyMJCQkJCW9mIHRoZSBmaWxlIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQuCisjCQkJCQlUaGUgZW5kLXF1b3RlIHNob3VsZCBiZSBmb2xsb3dlZAorIwkJCQkJYnkgYSBuZXdsaW5lLCB0aGVuIHRoZSBmaWxlIGRhdGEKKyMJCQkJCShpZiBhbnkpLiBUaGUgZmlyc3Qgd29yZCBtYXkgYmUKKyMJCQkJCXByZWNlZGVkIGJ5IGEgISB0byBzdHJpcCB0aGUgdHJhaWxpbmcKKyMJCQkJCW5ld2xpbmUgaW4gdGhlIGZpbGUgY29udGVudHMuCisjCQkJCQlUaGUgcGVybWlzc2lvbnMsIHVzZXIgYW5kIGdyb3VwIGZpZWxkcworIwkJCQkJbWF5IGJlICogbWVhbmluZyBhY2NlcHQgYW55IHZhbHVlLgorIwl0aW1lLWxpbWl0CQkJVGltZSBsaW1pdCAtIHRoZSBwcm9ncmFtIGlzIHNlbnQgYQorIwkJCQkJU0lHS0lMTCBOIHNlY29uZHMuIERlZmF1bHQgaXMgbm8KKyMJCQkJCWxpbWl0LgorIwlleHBlY3RlZC1mYWlsCQkJJ3llcycgaWYgdGhlIHRlc3QgaXMgZXhwZWN0ZWQgdG8gZmFpbC4KKyMJZXhwZWN0ZWQtZXhpdAkJCWV4cGVjdGVkIGV4aXQgY29kZS4gQ2FuIGJlIGEgbnVtYmVyLAorIwkJCQkJb3IgYSBDIGV4cHJlc3Npb24gdXNpbmcgdGhlIHZhcmlhYmxlcworIwkJCQkJZSwgcyBhbmQgdyAoZXhpdCBjb2RlLCB0ZXJtaW5hdGlvbgorIwkJCQkJc2lnbmFsLCBhbmQgc3RhdHVzIGNvZGUpLgorIwlleHBlY3RlZC1zdGRvdXQJCW0JV2hhdCB0aGUgdGVzdCBzaG91bGQgZ2VuZXJhdGUgb24gc3Rkb3V0OworIwkJCQkJZGVmYXVsdCBpcyB0byBleHBlY3Qgbm8gb3V0cHV0LgorIwlleHBlY3RlZC1zdGRvdXQtcGF0dGVybgltCUEgcGVybCBwYXR0ZXJuIHdoaWNoIG1hdGNoZXMgdGhlCisjCQkJCQlleHBlY3RlZCBvdXRwdXQuCisjCWV4cGVjdGVkLXN0ZGVycgkJbQlXaGF0IHRoZSB0ZXN0IHNob3VsZCBnZW5lcmF0ZSBvbiBzdGRlcnI7CisjCQkJCQlkZWZhdWx0IGlzIHRvIGV4cGVjdCBubyBvdXRwdXQuCisjCWV4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuCW0JQSBwZXJsIHBhdHRlcm4gd2hpY2ggbWF0Y2hlcyB0aGUKKyMJCQkJCWV4cGVjdGVkIHN0YW5kYXJkIGVycm9yLgorIwljYXRlZ29yeQkJbQlTcGVjaWZ5IGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YKKyMJCQkJCSdjYXRlZ29yaWVzJyBvZiBwcm9ncmFtIHRoYXQgdGhlIHRlc3QKKyMJCQkJCWlzIHRvIGJlIHJ1biBmb3IuIEEgY2F0ZWdvcnkgY2FuIGJlCisjCQkJCQluZWdhdGVkIGJ5IHByZWZpeGluZyB0aGUgbmFtZSB3aXRoIGEgIS4KKyMJCQkJCVRoZSBpZGVhIGlzIHRoYXQgc29tZSB0ZXN0cyBpbiBhCisjCQkJCQl0ZXN0IHN1aXRlIG1heSBhcHBseSB0byBhIHBhcnRpY3VsYXIKKyMJCQkJCXByb2dyYW0gdmVyc2lvbiBhbmQgc2hvdWxkbid0IGJlIHJ1bgorIwkJCQkJb24gb3RoZXIgdmVyc2lvbnMuIFRoZSBjYXRlZ29yeShzKSBvZgorIwkJCQkJdGhlIHByb2dyYW0gYmVpbmcgdGVzdGVkIGNhbiBiZQorIwkJCQkJc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisjCQkJCQlPbmUgY2F0ZWdvcnkgb3M6WFhYIGlzIHByZWRlZmluZWQKKyMJCQkJCShYWFggaXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmFtZSwKKyMJCQkJCWVnLCBsaW51eCwgZGVjX29zZikuCisjIEZsYWcgbWVhbmluZ3M6CisjCXIJdGFnIGlzIHJlcXVpcmVkIChlZywgYSB0ZXN0IG11c3QgaGF2ZSBhIG5hbWUgdGFnKS4KKyMJbQl2YWx1ZSBjYW4gYmUgbXVsdGlwbGUgbGluZXMuIExpbmVzIG11c3QgYmUgcHJlZml4ZWQgd2l0aAorIwkJYSB0YWIuIElmIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBpbml0aWFsIHRhZzp2YWx1ZSBsaW5lIGlzCisjCQkJLSBlbXB0eTogdGhlIGluaXRpYWwgYmxhbmsgbGluZSBpcyBzdHJpcHBlZC4KKyMJCQktIGEgbG9uZSAhOiB0aGUgbGFzdCBuZXdsaW5lIGluIHRoZSB2YWx1ZSBpcyBzdHJpcHBlZDsKKyMJTQl2YWx1ZSBjYW4gYmUgbXVsdGlwbGUgbGluZXMgKHByZWZpeGVkIGJ5IGEgdGFiKSBhbmQgY29uc2lzdHMKKyMJCW9mIG11bHRpcGxlIGZpZWxkcywgZGVsaW1pdGVkIGJ5IGEgZmllbGQgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyMJCVRoZSB2YWx1ZSBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCB0aGUgZi1zLWMuCisjCXAJdGFnIHRha2VzIHBhcmFtZXRlcnMgKHVzZWQgd2l0aCBtKS4KKyMJcwl0YWcgY2FuIGJlIHVzZWQgc2V2ZXJhbCB0aW1lcy4KKwordXNlIFBPU0lYIHF3KEVJTlRSKTsKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBDb25maWc7CisKKyRvcyA9IGRlZmluZWQgJF5PID8gJF5PIDogJ3Vua25vd24nOworCisoJHByb2cgPSAkMCkgPX4gcyMuKi8jIzsKKworJFVzYWdlID0gPDxFT0YgOworVXNhZ2U6ICRwcm9nIFstcyB0ZXN0LXNldF0gWy1DIGNhdGVnb3J5XSBbLXAgcHJvZ10gWy12XSBbLWUgZT12XSBuYW1lIC4uLgorCS1wIHAJVXNlIHAgYXMgdGhlIHByb2dyYW0gdG8gdGVzdAorCS1DIGMJU3BlY2lmeSB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2F0ZWdvcmllcyB0aGUgcHJvZ3JhbQorCQliZWxvbmdzIHRvIChzZWUgY2F0ZWdvcnkgZmllbGQpLgorCS1zIHMJUmVhZCB0ZXN0cyBmcm9tIGZpbGUgczsgaWYgcyBpcyBhIGRpcmVjdG9yeSwgaXQgaXMgcmVjdXJzaXZlbHkKKwkJc2NhbmVkIGZvciB0ZXN0IGZpbGVzICh3aGljaCBlbmQgaW4gLnQpLgorCS10IHQJVXNlIHQgYXMgZGVmYXVsdCB0aW1lIGxpbWl0IGZvciB0ZXN0cyAoZGVmYXVsdCBpcyB1bmxpbWl0ZWQpCisJLVAJcHJvZ3JhbSAoLXApIHN0cmluZyBoYXMgbXVsdGlwbGUgd29yZHMsIGFuZCB0aGUgcHJvZ3JhbSBpcyBpbgorCQl0aGUgcGF0aCAoa2x1ZGdlIG9wdGlvbikKKwktdglWZXJib3NlIG1vZGU6IHByaW50IHJlYXNvbiB0ZXN0IGZhaWxlZC4KKwktZSBlPXYJU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBlIHRvIHYgZm9yIGFsbCB0ZXN0cworCQkoaWYgbm8gPXYgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IHZhbHVlIGlzIHVzZWQpCisJCU9ubHkgb25lIC1lIG9wdGlvbiBjYW4gYmUgZ2l2ZW4gYXQgdGhlIG1vbWVudCwgc2FkbHkuCisJbmFtZQlzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QocykgdG8gcnVuOyBpZiBub25lIGFyZQorCQlzcGVjaWZpZWQsIGFsbCB0ZXN0cyBhcmUgcnVuLgorRU9GCisKKyMgU2VlIGNvbW1lbnQgYWJvdmUgZm9yIGZsYWcgbWVhbmluZ3MKKyV0ZXN0X2ZpZWxkcyA9ICgKKwknbmFtZScsCQkJCSdyJywKKwknZGVzY3JpcHRpb24nLAkJCSdtJywKKwknYXJndW1lbnRzJywJCQknTScsCisJJ3NjcmlwdCcsCQkJJ20nLAorCSdzdGRpbicsCQkJJ20nLAorCSdwZXJsLXNldHVwJywJCQknbScsCisJJ3BlcmwtY2xlYW51cCcsCQkJJ20nLAorCSdlbnYtc2V0dXAnLAkJCSdNJywKKwknZmlsZS1zZXR1cCcsCQkJJ21wcycsCisJJ2ZpbGUtcmVzdWx0JywJCQknbXBzJywKKwkndGltZS1saW1pdCcsCQkJJycsCisJJ2V4cGVjdGVkLWZhaWwnLAkJJycsCisJJ2V4cGVjdGVkLWV4aXQnLAkJJycsCisJJ2V4cGVjdGVkLXN0ZG91dCcsCQknbScsCisJJ2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuJywJJ20nLAorCSdleHBlY3RlZC1zdGRlcnInLAkJJ20nLAorCSdleHBlY3RlZC1zdGRlcnItcGF0dGVybicsCSdtJywKKwknY2F0ZWdvcnknLAkJCSdtJywKKwkpOworIyBGaWxsZWQgaW4gYnkgcmVhZF90ZXN0KCkKKyVpbnRlcm5hbF90ZXN0X2ZpZWxkcyA9ICgKKwknOmZ1bGwtbmFtZScsIDEsCQkjIGZpbGU6bmFtZQorCSc6bG9uZy1uYW1lJywgMSwJCSMgZGlyL2ZpbGU6bGluZW5vOm5hbWUKKwkpOworCisjIENhdGVnb3JpZXMgb2YgdGhlIHByb2dyYW0gdW5kZXIgdGVzdC4gUHJvdmlkZSB0aGUgY3VycmVudAorIyBvcyBieSBkZWZhdWx0LgorJWNhdGVnb3JpZXMgPSAoCisJIm9zOiRvcyIsICcxJworCSk7CisKKyR0ZW1wcyA9ICIvdG1wL3J0cyQkIjsKKyR0ZW1waSA9ICIvdG1wL3J0aSQkIjsKKyR0ZW1wbyA9ICIvdG1wL3J0byQkIjsKKyR0ZW1wZSA9ICIvdG1wL3J0ZSQkIjsKKyR0ZW1wZGlyID0gIi90bXAvcnRkJCQiOworCiskbmZhaWxlZCA9IDA7CiskbnhmYWlsZWQgPSAwOworJG5wYXNzZWQgPSAwOworJG54cGFzc2VkID0gMDsKKworJWtub3duX3Rlc3RzID0gKCk7CisKK2lmICghZ2V0b3B0cygnQzpwOlBzOnQ6dmU6JykpIHsKKyAgICBwcmludCBTVERFUlIgJFVzYWdlOworICAgIGV4aXQgMTsKK30KKworZGllICIkcHJvZzogbm8gcHJvZ3JhbSBzcGVjaWZpZWQgKHVzZSAtcClcbiIgaWYgIWRlZmluZWQgJG9wdF9wOworZGllICIkcHJvZzogbm8gdGVzdCBzZXQgc3BlY2lmaWVkICh1c2UgLXMpXG4iIGlmICFkZWZpbmVkICRvcHRfczsKKyR0ZXN0X3Byb2cgPSAkb3B0X3A7CiskdmVyYm9zZSA9IGRlZmluZWQgJG9wdF92ICYmICRvcHRfdjsKKyR0ZXN0X3NldCA9ICRvcHRfczsKK2lmIChkZWZpbmVkICRvcHRfdCkgeworICAgIGRpZSAiJHByb2c6IGJhZCAtdCBhcmd1bWVudCAoc2hvdWxkIGJlIG51bWJlciA+IDApOiAkb3B0X3RcbiIKKwlpZiAkb3B0X3QgIX4gL15cZCskLyB8fCAkb3B0X3QgPD0gMDsKKyAgICAkZGVmYXVsdF90aW1lX2xpbWl0ID0gJG9wdF90OworfQorJHByb2dyYW1fa2x1ZGdlID0gZGVmaW5lZCAkb3B0X1AgPyAkb3B0X1AgOiAwOworCitpZiAoZGVmaW5lZCAkb3B0X0MpIHsKKyAgICBmb3JlYWNoICRjIChzcGxpdCgnLCcsICRvcHRfQykpIHsKKwkkYyA9fiBzL1xzKy8vOworCWRpZSAiJHByb2c6IGNhdGVnb3JpZXMgY2FuJ3QgYmUgbmVnYXRlZCBvbiB0aGUgY29tbWFuZCBsaW5lXG4iCisJICAgIGlmICgkYyA9fiAvXiEvKTsKKwkkY2F0ZWdvcmllc3skY30gPSAxOworICAgIH0KK30KKworIyBOb3RlIHdoaWNoIHRlc3RzIGFyZSB0byBiZSBydW4uCislZG9fdGVzdCA9ICgpOworZ3JlcCgkZG9fdGVzdHskX30gPSAxLCBAQVJHVik7CiskYWxsX3Rlc3RzID0gQEFSR1YgPT0gMDsKKworIyBTZXQgdXAgYSB2ZXJ5IG1pbmltYWwgZW52aXJvbm1lbnQKKyVuZXdfZW52ID0gKCk7Citmb3JlYWNoICRlbnYgKCgnSE9NRScsICdMRF9MSUJSQVJZX1BBVEgnLCAnTE9DUEFUSCcsICdMT0dOQU1FJywKKyAgJ1BBVEgnLCAnU0hFTEwnLCAnVVNFUicpKSB7CisgICAgJG5ld19lbnZ7JGVudn0gPSAkRU5WeyRlbnZ9IGlmIGRlZmluZWQgJEVOVnskZW52fTsKK30KKyRuZXdfZW52eydFTlYnfSA9ICcvbm9uZXhpc3RhbnQnOworaWYgKCgkb3MgZXEgJ1ZNUycpIHx8ICgkQ29uZmlne3BlcmxwYXRofSA9fiBtLyRDb25maWd7X2V4ZX0kL2kpKSB7CisJJG5ld19lbnZ7J19fcGVybG5hbWUnfSA9ICRDb25maWd7cGVybHBhdGh9OworfSBlbHNlIHsKKwkkbmV3X2VudnsnX19wZXJsbmFtZSd9ID0gJENvbmZpZ3twZXJscGF0aH0gLiAkQ29uZmlne19leGV9OworfQoraWYgKGRlZmluZWQgJG9wdF9lKSB7CisgICAgIyBYWFggbmVlZCBhIHdheSB0byBhbGxvdyBtYW55IC1lIGFyZ3VtZW50cy4uLgorICAgIGlmICgkb3B0X2UgPX4gL14oW2EtekEtWl9dXHcqKSh8PSguKikpJC8pIHsKKwkkbmV3X2VudnskMX0gPSAkMiBlcSAnJyA/ICRFTlZ7JDF9IDogJDM7CisgICAgfSBlbHNlIHsKKwlkaWUgIiQwOiBiYWQgLWUgYXJndW1lbnQ6ICRvcHRfZVxuIjsKKyAgICB9Cit9Cislb2xkX2VudiA9ICVFTlY7CisKK2RpZSAiJHByb2c6IGNvdWxkbid0IG1ha2UgZGlyZWN0b3J5ICR0ZW1wZGlyIC0gJCFcbiIgaWYgIW1rZGlyKCR0ZW1wZGlyLCAwNzc3KTsKKworY2hvcCgkcHdkID0gYHB3ZCAyPi9kZXYvbnVsbGApOworZGllICIkcHJvZzogY291bGRuJ3QgZ2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiIgaWYgJHB3ZCBlcSAnJzsKK2RpZSAiJHByb2c6IGNvdWxkbid0IGNkIHRvICRwd2QgLSAkIVxuIiBpZiAhY2hkaXIoJHB3ZCk7CisKK2lmICghJHByb2dyYW1fa2x1ZGdlKSB7CisgICAgJHRlc3RfcHJvZyA9ICIkcHdkLyR0ZXN0X3Byb2ciIGlmIHN1YnN0cigkdGVzdF9wcm9nLCAwLCAxKSBuZSAnLyc7CisgICAgZGllICIkcHJvZzogJHRlc3RfcHJvZyBpcyBub3QgZXhlY3V0YWJsZSAtIGJ5ZVxuIgorCWlmICghIC14ICR0ZXN0X3Byb2cgJiYgJG9zIG5lICdvczInKTsKK30KKworQHRyYXBfc2lncyA9ICgnVEVSTScsICdRVUlUJywgJ0lOVCcsICdQSVBFJywgJ0hVUCcpOworQFNJR3tAdHJhcF9zaWdzfSA9ICgnY2xlYW51cF9leGl0JykgeCBAdHJhcF9zaWdzOworJGNoaWxkX2tpbGxfb2sgPSAwOworJFNJR3snQUxSTSd9ID0gJ2NhdGNoX3NpZ2Fscm0nOworCiskfCA9IDE7CisKK2lmICgtZCAkdGVzdF9zZXQpIHsKKyAgICAkZmlsZV9wcmVmaXhfc2tpcCA9IGxlbmd0aCgkdGVzdF9zZXQpICsgMTsKKyAgICAkcmV0ID0gJnByb2Nlc3NfdGVzdF9kaXIoJHRlc3Rfc2V0KTsKK30gZWxzZSB7CisgICAgJGZpbGVfcHJlZml4X3NraXAgPSAwOworICAgICRyZXQgPSAmcHJvY2Vzc190ZXN0X2ZpbGUoJHRlc3Rfc2V0KTsKK30KKyZjbGVhbnVwX2V4aXQoKSBpZiAhZGVmaW5lZCAkcmV0OworCiskdG90X2ZhaWxlZCA9ICRuZmFpbGVkICsgJG54ZmFpbGVkOworJHRvdF9wYXNzZWQgPSAkbnBhc3NlZCArICRueHBhc3NlZDsKK2lmICgkdG90X2ZhaWxlZCB8fCAkdG90X3Bhc3NlZCkgeworICAgIHByaW50ICJUb3RhbCBmYWlsZWQ6ICR0b3RfZmFpbGVkIjsKKyAgICBwcmludCAiICgkbnhmYWlsZWQgdW5leHBlY3RlZCkiIGlmICRueGZhaWxlZDsKKyAgICBwcmludCAiIChhcyBleHBlY3RlZCkiIGlmICRuZmFpbGVkICYmICEkbnhmYWlsZWQ7CisgICAgcHJpbnQgIlxuVG90YWwgcGFzc2VkOiAkdG90X3Bhc3NlZCI7CisgICAgcHJpbnQgIiAoJG54cGFzc2VkIHVuZXhwZWN0ZWQpIiBpZiAkbnhwYXNzZWQ7CisgICAgcHJpbnQgIlxuIjsKK30KKworJmNsZWFudXBfZXhpdCgnb2snKTsKKworc3ViCitjbGVhbnVwX2V4aXQKK3sKKyAgICBsb2NhbCgkc2lnLCAkZXhpdGNvZGUpID0gKCcnLCAxKTsKKworICAgIGlmICgkX1swXSBlcSAnb2snKSB7CisJJGV4aXRjb2RlID0gMDsKKyAgICB9IGVsc2lmICgkX1swXSBuZSAnJykgeworCSRzaWcgPSAkX1swXTsKKyAgICB9CisKKyAgICB1bmxpbmsoJHRlbXBpLCAkdGVtcG8sICR0ZW1wZSwgJHRlbXBzKTsKKyAgICAmc2NydWJfZGlyKCR0ZW1wZGlyKSBpZiBkZWZpbmVkICR0ZW1wZGlyOworICAgIHJtZGlyKCR0ZW1wZGlyKSBpZiBkZWZpbmVkICR0ZW1wZGlyOworCisgICAgaWYgKCRzaWcpIHsKKwkkU0lHeyRzaWd9ID0gJ0RFRkFVTFQnOworCWtpbGwgJHNpZywgJCQ7CisJcmV0dXJuOworICAgIH0KKyAgICBleGl0ICRleGl0Y29kZTsKK30KKworc3ViCitjYXRjaF9zaWdhbHJtCit7CisgICAgJFNJR3snQUxSTSd9ID0gJ2NhdGNoX3NpZ2Fscm0nOworICAgIGtpbGwoOSwgJGNoaWxkX3BpZCkgaWYgJGNoaWxkX2tpbGxfb2s7CisgICAgJGNoaWxkX2tpbGxlZCA9IDE7Cit9CisKK3N1YgorcHJvY2Vzc190ZXN0X2RpcgoreworICAgIGxvY2FsKCRkaXIpID0gQF87CisgICAgbG9jYWwoJHJldCwgJGZpbGUpOworICAgIGxvY2FsKEB0b2RvKSA9ICgpOworCisgICAgaWYgKCFvcGVuZGlyKERJUiwgJGRpcikpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjYW4ndCBvcGVuIGRpcmVjdG9yeSAkZGlyIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICB3aGlsZSAoZGVmaW5lZCAoJGZpbGUgPSByZWFkZGlyKERJUikpKSB7CisJcHVzaChAdG9kbywgJGZpbGUpIGlmICRmaWxlID1+IC9eW14uXS4qXC50JC87CisgICAgfQorICAgIGNsb3NlZGlyKERJUik7CisKKyAgICBmb3JlYWNoICRmaWxlIChAdG9kbykgeworCSRmaWxlID0gIiRkaXIvJGZpbGUiOworCWlmICgtZCAkZmlsZSkgeworCSAgICAkcmV0ID0gJnByb2Nlc3NfdGVzdF9kaXIoJGZpbGUpOworCX0gZWxzaWYgKC1mIF8pIHsKKwkgICAgJHJldCA9ICZwcm9jZXNzX3Rlc3RfZmlsZSgkZmlsZSk7CisJfQorCWxhc3QgaWYgIWRlZmluZWQgJHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gJHJldDsKK30KKworc3ViCitwcm9jZXNzX3Rlc3RfZmlsZQoreworICAgIGxvY2FsKCRmaWxlKSA9IEBfOworICAgIGxvY2FsKCRyZXQpOworCisgICAgaWYgKCFvcGVuKElOLCAkZmlsZSkpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjYW4ndCBvcGVuICRmaWxlIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBiaW5tb2RlKElOKTsKKyAgICB3aGlsZSAoMSkgeworCSRyZXQgPSAmcmVhZF90ZXN0KCRmaWxlLCBJTiwgKnRlc3QpOworCWxhc3QgaWYgIWRlZmluZWQgJHJldCB8fCAhJHJldDsKKwluZXh0IGlmICEkYWxsX3Rlc3RzICYmICEkZG9fdGVzdHskdGVzdHsnbmFtZSd9fTsKKwluZXh0IGlmICEmY2F0ZWdvcnlfY2hlY2soKnRlc3QpOworCSRyZXQgPSAmcnVuX3Rlc3QoKnRlc3QpOworCWxhc3QgaWYgIWRlZmluZWQgJHJldDsKKyAgICB9CisgICAgY2xvc2UoSU4pOworCisgICAgcmV0dXJuICRyZXQ7Cit9CisKK3N1YgorcnVuX3Rlc3QKK3sKKyAgICBsb2NhbCgqdGVzdCkgPSBAXzsKKyAgICBsb2NhbCgkbmFtZSkgPSAkdGVzdHsnOmZ1bGwtbmFtZSd9OworCisgICAgaWYgKGRlZmluZWQgJHRlc3R7J3N0ZGluJ30pIHsKKwlyZXR1cm4gdW5kZWYgaWYgISZ3cml0ZV9maWxlKCR0ZW1waSwgJHRlc3R7J3N0ZGluJ30pOworCSRpZmlsZSA9ICR0ZW1waTsKKyAgICB9IGVsc2UgeworCSRpZmlsZSA9ICcvZGV2L251bGwnOworICAgIH0KKworICAgIGlmIChkZWZpbmVkICR0ZXN0eydzY3JpcHQnfSkgeworCXJldHVybiB1bmRlZiBpZiAhJndyaXRlX2ZpbGUoJHRlbXBzLCAkdGVzdHsnc2NyaXB0J30pOworICAgIH0KKworICAgIHJldHVybiB1bmRlZiBpZiAhJnNjcnViX2RpcigkdGVtcGRpcik7CisKKyAgICBpZiAoIWNoZGlyKCR0ZW1wZGlyKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IGNkIHRvICR0ZW1wZGlyIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKworICAgIGlmIChkZWZpbmVkICR0ZXN0eydmaWxlLXNldHVwJ30pIHsKKwlsb2NhbCgkaSk7CisJbG9jYWwoJHR5cGUsICRwZXJtLCAkcmVzdCwgJGMsICRsZW4sICRuYW1lKTsKKworCWZvciAoJGkgPSAwOyAkaSA8ICR0ZXN0eydmaWxlLXNldHVwJ307ICRpKyspIHsKKwkgICAgJHZhbCA9ICR0ZXN0eyJmaWxlLXNldHVwOiRpIn07CisKKwkgICAgIyBmb3JtYXQgaXM6IHR5cGUgcGVybSAibmFtZSIKKwkgICAgKCR0eXBlLCAkcGVybSwgJHJlc3QpID0KKwkJc3BsaXQoJyAnLCAkdmFsLCAzKTsKKwkgICAgJGMgPSBzdWJzdHIoJHJlc3QsIDAsIDEpOworCSAgICAkbGVuID0gaW5kZXgoJHJlc3QsICRjLCAxKSAtIDE7CisJICAgICRuYW1lID0gc3Vic3RyKCRyZXN0LCAxLCAkbGVuKTsKKwkgICAgJHJlc3QgPSBzdWJzdHIoJHJlc3QsIDIgKyAkbGVuKTsKKwkgICAgJHBlcm0gPSBvY3QoJHBlcm0pIGlmICRwZXJtID1+IC9eXGQrJC87CisJICAgIGlmICgkdHlwZSBlcSAnZmlsZScpIHsKKwkJcmV0dXJuIHVuZGVmIGlmICEmd3JpdGVfZmlsZSgkbmFtZSwgJHJlc3QpOworCQlpZiAoIWNobW9kKCRwZXJtLCAkbmFtZSkpIHsKKwkJICAgIHByaW50IFNUREVSUgorCQkgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjYW4ndCBjaG1vZCAkcGVybSAkbmFtZSAtICQhXG4iOworCQkgICAgcmV0dXJuIHVuZGVmOworCQl9CisJICAgIH0gZWxzaWYgKCR0eXBlIGVxICdkaXInKSB7CisJCWlmICghbWtkaXIoJG5hbWUsICRwZXJtKSkgeworCQkgICAgcHJpbnQgU1RERVJSCisJCSAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNhbid0IG1rZGlyICRwZXJtICRuYW1lIC0gJCFcbiI7CisJCSAgICByZXR1cm4gdW5kZWY7CisJCX0KKwkgICAgfSBlbHNpZiAoJHR5cGUgZXEgJ3N5bWxpbmsnKSB7CisJCWxvY2FsKCRvdW1hc2spID0gdW1hc2soJHBlcm0pOworCQlsb2NhbCgkcmV0KSA9IHN5bWxpbmsoJHJlc3QsICRuYW1lKTsKKwkJdW1hc2soJG91bWFzayk7CisJCWlmICghJHJldCkgeworCQkgICAgcHJpbnQgU1RERVJSCisJICAgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjb3VsZG4ndCBjcmVhdGUgc3ltbGluayAkbmFtZSAtICQhXG4iOworCQkgICAgcmV0dXJuIHVuZGVmOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHRlc3R7J3Blcmwtc2V0dXAnfSkgeworCWV2YWwgJHRlc3R7J3Blcmwtc2V0dXAnfTsKKwlpZiAoJEAgbmUgJycpIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBlcnJvciBydW5uaW5nIHBlcmwtc2V0dXAgLSAkQFxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKyAgICB9CisKKyAgICAkcGlkID0gZm9yazsKKyAgICBpZiAoIWRlZmluZWQgJHBpZCkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGNhbid0IGZvcmsgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGlmICghJHBpZCkgeworCUBTSUd7QHRyYXBfc2lnc30gPSAoJ0RFRkFVTFQnKSB4IEB0cmFwX3NpZ3M7CisJJFNJR3snQUxSTSd9ID0gJ0RFRkFVTFQnOworCWlmIChkZWZpbmVkICR0ZXN0eydlbnYtc2V0dXAnfSkgeworCSAgICBsb2NhbCgkdmFyLCAkdmFsLCAkaSk7CisKKwkgICAgZm9yZWFjaCAkdmFyIChzcGxpdChzdWJzdHIoJHRlc3R7J2Vudi1zZXR1cCd9LCAwLCAxKSwKKwkJJHRlc3R7J2Vudi1zZXR1cCd9KSkKKwkgICAgeworCQkkaSA9IGluZGV4KCR2YXIsICc9Jyk7CisJCW5leHQgaWYgJGkgPT0gMCB8fCAkdmFyIGVxICcnOworCQlpZiAoJGkgPCAwKSB7CisJCSAgICBkZWxldGUgJG5ld19lbnZ7JHZhcn07CisJCX0gZWxzZSB7CisJCSAgICAkbmV3X2VudntzdWJzdHIoJHZhciwgMCwgJGkpfSA9IHN1YnN0cigkdmFyLCAkaSArIDEpOworCQl9CisJICAgIH0KKwl9CisJaWYgKCFvcGVuKFNURElOLCAiPCAkaWZpbGUiKSkgeworCQlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBvcGVuICRpZmlsZSBpbiBjaGlsZCAtICQhXG4iOworCQlraWxsKCdURVJNJywgJCQpOworCX0KKwliaW5tb2RlKFNURElOKTsKKwlpZiAoIW9wZW4oU1RET1VULCAiPiAkdGVtcG8iKSkgeworCQlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBvcGVuICR0ZW1wbyBpbiBjaGlsZCAtICQhXG4iOworCQlraWxsKCdURVJNJywgJCQpOworCX0KKwliaW5tb2RlKFNURE9VVCk7CisJaWYgKCFvcGVuKFNUREVSUiwgIj4gJHRlbXBlIikpIHsKKwkJcHJpbnQgU1RET1VUICIkcHJvZzogY291bGRuJ3Qgb3BlbiAkdGVtcGUgaW4gY2hpbGQgLSAkIVxuIjsKKwkJa2lsbCgnVEVSTScsICQkKTsKKwl9CisJYmlubW9kZShTVERFUlIpOworCWlmICgkcHJvZ3JhbV9rbHVkZ2UpIHsKKwkgICAgQGFyZ3YgPSBzcGxpdCgnICcsICR0ZXN0X3Byb2cpOworCX0gZWxzZSB7CisJICAgIEBhcmd2ID0gKCR0ZXN0X3Byb2cpOworCX0KKwlpZiAoZGVmaW5lZCAkdGVzdHsnYXJndW1lbnRzJ30pIHsKKwkJcHVzaChAYXJndiwKKwkJICAgICBzcGxpdChzdWJzdHIoJHRlc3R7J2FyZ3VtZW50cyd9LCAwLCAxKSwKKwkJCSAgIHN1YnN0cigkdGVzdHsnYXJndW1lbnRzJ30sIDEpKSk7CisJfQorCXB1c2goQGFyZ3YsICR0ZW1wcykgaWYgZGVmaW5lZCAkdGVzdHsnc2NyaXB0J307CisKKwkjWFhYIHJlYWxwYXRoaXNlLCB1c2Ugd2hpY2gvd2hlbmNlIC1wLCBvciBzdGguIGxpa2UgdGhhdAorCSNYWFggaWYgISRwcm9ncmFtX2tsdWRnZSwgd2UgZ2V0IGJ5IHdpdGggbm90IGRvaW5nIGl0IGZvciBub3cgdGhvCisJJG5ld19lbnZ7J19fcHJvZ25hbWUnfSA9ICRhcmd2WzBdOworCisJIyBUaGUgZm9sbG93aW5nIGRvZXNuJ3Qgd29yayB3aXRoIHBlcmw1Li4uICBOZWVkIHRvIGRvIGl0IGV4cGxpY2l0bHkgLSB5dWNrLgorCSMlRU5WID0gJW5ld19lbnY7CisJZm9yZWFjaCAkayAoa2V5cyglRU5WKSkgeworCSAgICBkZWxldGUgJEVOVnska307CisJfQorCSRFTlZ7JGt9ID0gJHYgd2hpbGUgKCRrLCR2KSA9IGVhY2ggJW5ld19lbnY7CisKKwlleGVjIHsgJGFyZ3ZbMF0gfSBAYXJndjsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBleGVjdXRlICR0ZXN0X3Byb2cgLSAkIVxuIjsKKwlraWxsKCdURVJNJywgJCQpOworCWV4aXQoOTUpOworICAgIH0KKyAgICAkY2hpbGRfcGlkID0gJHBpZDsKKyAgICAkY2hpbGRfa2lsbGVkID0gMDsKKyAgICAkY2hpbGRfa2lsbF9vayA9IDE7CisgICAgYWxhcm0oJHRlc3R7J3RpbWUtbGltaXQnfSkgaWYgZGVmaW5lZCAkdGVzdHsndGltZS1saW1pdCd9OworICAgIHdoaWxlICgxKSB7CisJJHhwaWQgPSB3YWl0cGlkKCRwaWQsIDApOworCSRjaGlsZF9raWxsX29rID0gMDsKKwlpZiAoJHhwaWQgPCAwKSB7CisJICAgIG5leHQgaWYgJCEgPT0gRUlOVFI7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6IGVycm9yIHdhaXRpbmcgZm9yIGNoaWxkIC0gJCFcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisJbGFzdDsKKyAgICB9CisgICAgJHN0YXR1cyA9ICQ/OworICAgIGFsYXJtKDApIGlmIGRlZmluZWQgJHRlc3R7J3RpbWUtbGltaXQnfTsKKworICAgICRmYWlsZWQgPSAwOworICAgICR3aHkgPSAnJzsKKworICAgIGlmICgkY2hpbGRfa2lsbGVkKSB7CisJJGZhaWxlZCA9IDE7CisJJHdoeSAuPSAiXHR0ZXN0IHRpbWVkIG91dCAobGltaXQgb2YgJHRlc3R7J3RpbWUtbGltaXQnfSBzZWNvbmRzKVxuIjsKKyAgICB9CisKKyAgICAkcmV0ID0gJmV2YWxfZXhpdCgkdGVzdHsnbG9uZy1uYW1lJ30sICRzdGF0dXMsICR0ZXN0eydleHBlY3RlZC1leGl0J30pOworICAgIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCAkcmV0OworICAgIGlmICghJHJldCkgeworCWxvY2FsKCRleHBsKTsKKworCSRmYWlsZWQgPSAxOworCWlmICgoJHN0YXR1cyAmIDB4ZmYpID09IDB4N2YpIHsKKwkgICAgJGV4cGwgPSAic3RvcHBlZCI7CisJfSBlbHNpZiAoKCRzdGF0dXMgJiAweGZmKSkgeworCSAgICAkZXhwbCA9ICJzaWduYWwgIiAuICgkc3RhdHVzICYgMHg3Zik7CisJfSBlbHNlIHsKKwkgICAgJGV4cGwgPSAiZXhpdC1jb2RlICIgLiAoKCRzdGF0dXMgPj4gOCkgJiAweGZmKTsKKwl9CisJJHdoeSAuPQorCSJcdHVuZXhwZWN0ZWQgZXhpdCBzdGF0dXMgJHN0YXR1cyAoJGV4cGwpLCBleHBlY3RlZCAkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9XG4iOworICAgIH0KKworICAgICR0bXAgPSAmY2hlY2tfb3V0cHV0KCR0ZXN0eydsb25nLW5hbWUnfSwgJHRlbXBvLCAnc3Rkb3V0JywKKwkJJHRlc3R7J2V4cGVjdGVkLXN0ZG91dCd9LCAkdGVzdHsnZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm4nfSk7CisgICAgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkICR0bXA7CisgICAgaWYgKCR0bXAgbmUgJycpIHsKKwkkZmFpbGVkID0gMTsKKwkkd2h5IC49ICR0bXA7CisgICAgfQorCisgICAgJHRtcCA9ICZjaGVja19vdXRwdXQoJHRlc3R7J2xvbmctbmFtZSd9LCAkdGVtcGUsICdzdGRlcnInLAorCQkkdGVzdHsnZXhwZWN0ZWQtc3RkZXJyJ30sICR0ZXN0eydleHBlY3RlZC1zdGRlcnItcGF0dGVybid9KTsKKyAgICByZXR1cm4gdW5kZWYgaWYgIWRlZmluZWQgJHRtcDsKKyAgICBpZiAoJHRtcCBuZSAnJykgeworCSRmYWlsZWQgPSAxOworCSR3aHkgLj0gJHRtcDsKKyAgICB9CisKKyAgICAkdG1wID0gJmNoZWNrX2ZpbGVfcmVzdWx0KCp0ZXN0KTsKKyAgICByZXR1cm4gdW5kZWYgaWYgIWRlZmluZWQgJHRtcDsKKyAgICBpZiAoJHRtcCBuZSAnJykgeworCSRmYWlsZWQgPSAxOworCSR3aHkgLj0gJHRtcDsKKyAgICB9CisKKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsncGVybC1jbGVhbnVwJ30pIHsKKwlldmFsICR0ZXN0eydwZXJsLWNsZWFudXAnfTsKKwlpZiAoJEAgbmUgJycpIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBlcnJvciBydW5uaW5nIHBlcmwtY2xlYW51cCAtICRAXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorICAgIH0KKworICAgIGlmICghY2hkaXIoJHB3ZCkpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBjZCB0byAkcHdkIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKworICAgIGlmICgkZmFpbGVkKSB7CisJaWYgKCEkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9KSB7CisJICAgIHByaW50ICJGQUlMICRuYW1lXG4iOworCSAgICAkbnhmYWlsZWQrKzsKKwl9IGVsc2UgeworCSAgICBwcmludCAiZmFpbCAkbmFtZSAoYXMgZXhwZWN0ZWQpXG4iOworCSAgICAkbmZhaWxlZCsrOworCX0KKwkkd2h5ID0gIlx0RGVzY3JpcHRpb24iCisJCS4gJndyYXBfbGluZXMoJHRlc3R7J2Rlc2NyaXB0aW9uJ30sICIgKG1pc3NpbmcpXG4iKQorCQkuICR3aHk7CisgICAgfSBlbHNpZiAoJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSkgeworCXByaW50ICJQQVNTICRuYW1lICh1bmV4cGVjdGVkbHkpXG4iOworCSRueHBhc3NlZCsrOworICAgIH0gZWxzZSB7CisJcHJpbnQgInBhc3MgJG5hbWVcbiI7CisJJG5wYXNzZWQrKzsKKyAgICB9CisgICAgcHJpbnQgJHdoeSBpZiAkdmVyYm9zZTsKKyAgICByZXR1cm4gMDsKK30KKworc3ViCitjYXRlZ29yeV9jaGVjaworeworICAgIGxvY2FsKCp0ZXN0KSA9IEBfOworICAgIGxvY2FsKCRjKTsKKworICAgIHJldHVybiAxIGlmICghZGVmaW5lZCAkdGVzdHsnY2F0ZWdvcnknfSk7CisgICAgbG9jYWwoJG9rKSA9IDA7CisgICAgZm9yZWFjaCAkYyAoc3BsaXQoJywnLCAkdGVzdHsnY2F0ZWdvcnknfSkpIHsKKwkkYyA9fiBzL1xzKy8vOworCWlmICgkYyA9fiAvXiEvKSB7CisJICAgICRjID0gJCc7CisJICAgIHJldHVybiAwIGlmIChkZWZpbmVkICRjYXRlZ29yaWVzeyRjfSk7CisJICAgICRvayA9IDE7CisJfSBlbHNlIHsKKwkgICAgJG9rID0gMSBpZiAoZGVmaW5lZCAkY2F0ZWdvcmllc3skY30pOworCX0KKyAgICB9CisgICAgcmV0dXJuICRvazsKK30KKworc3ViCitzY3J1Yl9kaXIKK3sKKyAgICBsb2NhbCgkZGlyKSA9IEBfOworICAgIGxvY2FsKEB0b2RvKSA9ICgpOworICAgIGxvY2FsKCRmaWxlKTsKKworICAgIGlmICghb3BlbmRpcihESVIsICRkaXIpKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3Qgb3BlbiBkaXJlY3RvcnkgJGRpciAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgd2hpbGUgKGRlZmluZWQgKCRmaWxlID0gcmVhZGRpcihESVIpKSkgeworCXB1c2goQHRvZG8sICRmaWxlKSBpZiAkZmlsZSBuZSAnLicgJiYgJGZpbGUgbmUgJy4uJzsKKyAgICB9CisgICAgY2xvc2VkaXIoRElSKTsKKyAgICBmb3JlYWNoICRmaWxlIChAdG9kbykgeworCSRmaWxlID0gIiRkaXIvJGZpbGUiOworCWlmICgtZCAkZmlsZSkgeworCSAgICByZXR1cm4gdW5kZWYgaWYgISZzY3J1Yl9kaXIoJGZpbGUpOworCSAgICBpZiAoIXJtZGlyKCRmaWxlKSkgeworCQlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBybWRpciAkZmlsZSAtICQhXG4iOworCQlyZXR1cm4gdW5kZWY7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoIXVubGluaygkZmlsZSkpIHsKKwkJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3QgdW5saW5rICRmaWxlIC0gJCFcbiI7CisJCXJldHVybiB1bmRlZjsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N1Ygord3JpdGVfZmlsZQoreworICAgIGxvY2FsKCRmaWxlLCAkc3RyKSA9IEBfOworCisgICAgaWYgKCFvcGVuKFRFTVAsICI+ICRmaWxlIikpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjYW4ndCBvcGVuICRmaWxlIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBiaW5tb2RlKFRFTVApOworICAgIHByaW50IFRFTVAgJHN0cjsKKyAgICBpZiAoIWNsb3NlKFRFTVApKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogZXJyb3Igd3JpdGluZyAkZmlsZSAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N1YgorY2hlY2tfb3V0cHV0Cit7CisgICAgbG9jYWwoJG5hbWUsICRmaWxlLCAkd2hhdCwgJGV4cGVjdCwgJGV4cGVjdF9wYXQpID0gQF87CisgICAgbG9jYWwoJGdvdCkgPSAnJzsKKyAgICBsb2NhbCgkd2h5KSA9ICcnOworICAgIGxvY2FsKCRyZXQpOworCisgICAgaWYgKCFvcGVuKFRFTVAsICI8ICRmaWxlIikpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiRuYW1lKCR3aGF0KTogY291bGRuJ3Qgb3BlbiAkZmlsZSBhZnRlciBydW5uaW5nIHByb2dyYW0gLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGJpbm1vZGUoVEVNUCk7CisgICAgd2hpbGUgKDxURU1QPikgeworCSRnb3QgLj0gJF87CisgICAgfQorICAgIGNsb3NlKFRFTVApOworICAgIHJldHVybiBjb21wYXJlX291dHB1dCgkbmFtZSwgJHdoYXQsICRleHBlY3QsICRleHBlY3RfcGF0LCAkZ290KTsKK30KKworc3ViCitjb21wYXJlX291dHB1dAoreworICAgIGxvY2FsKCRuYW1lLCAkd2hhdCwgJGV4cGVjdCwgJGV4cGVjdF9wYXQsICRnb3QpID0gQF87CisgICAgbG9jYWwoJHdoeSkgPSAnJzsKKworICAgIGlmIChkZWZpbmVkICRleHBlY3RfcGF0KSB7CisJJF8gPSAkZ290OworCSRyZXQgPSBldmFsICIkZXhwZWN0X3BhdCI7CisJaWYgKCRAIG5lICcnKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JG5hbWUoJHdoYXQpOiBlcnJvciBldmFsdWF0aW5nICR3aGF0IHBhdHRlcm46ICRleHBlY3RfcGF0IC0gJEBcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisJaWYgKCEkcmV0KSB7CisJICAgICR3aHkgPSAiXHR1bmV4cGVjdGVkICR3aGF0IC0gd2FudGVkIHBhdHRlcm4iOworCSAgICAkd2h5IC49ICZ3cmFwX2xpbmVzKCRleHBlY3RfcGF0KTsKKwkgICAgJHdoeSAuPSAiXHRnb3QiOworCSAgICAkd2h5IC49ICZ3cmFwX2xpbmVzKCRnb3QpOworCX0KKyAgICB9IGVsc2UgeworCSRleHBlY3QgPSAnJyBpZiAhZGVmaW5lZCAkZXhwZWN0OworCWlmICgkZ290IG5lICRleHBlY3QpIHsKKwkgICAgJHdoeSAuPSAiXHR1bmV4cGVjdGVkICR3aGF0IC0gIiAuICZmaXJzdF9kaWZmKCRleHBlY3QsICRnb3QpIC4gIlxuIjsKKwkgICAgJHdoeSAuPSAiXHR3YW50ZWQiOworCSAgICAkd2h5IC49ICZ3cmFwX2xpbmVzKCRleHBlY3QpOworCSAgICAkd2h5IC49ICJcdGdvdCI7CisJICAgICR3aHkgLj0gJndyYXBfbGluZXMoJGdvdCk7CisJfQorICAgIH0KKyAgICByZXR1cm4gJHdoeTsKK30KKworc3ViCit3cmFwX2xpbmVzCit7CisgICAgbG9jYWwoJHN0ciwgJGVtcHR5KSA9IEBfOworICAgIGxvY2FsKCRub25sKSA9IHN1YnN0cigkc3RyLCAtMSwgMSkgbmUgIlxuIjsKKworICAgIHJldHVybiAoZGVmaW5lZCAkZW1wdHkgPyAkZW1wdHkgOiAiIG5vdGhpbmdcbiIpIGlmICRzdHIgZXEgJyc7CisgICAgc3Vic3RyKCRzdHIsIDAsIDApID0gIjpcbiI7CisgICAgJHN0ciA9fiBzL1xuL1xuXHRcdC9nOworICAgIGlmICgkbm9ubCkgeworCSRzdHIgLj0gIlxuXHRbaW5jb21wbGV0ZSBsYXN0IGxpbmVdXG4iOworICAgIH0gZWxzZSB7CisJY2hvcCgkc3RyKTsKKwljaG9wKCRzdHIpOworICAgIH0KKyAgICByZXR1cm4gJHN0cjsKK30KKworc3ViCitmaXJzdF9kaWZmCit7CisgICAgbG9jYWwoJGV4cCwgJGdvdCkgPSBAXzsKKyAgICBsb2NhbCgkbGluZW5vLCAkY2hhcikgPSAoMSwgMSk7CisgICAgbG9jYWwoJGksICRleHBfbGVuLCAkZ290X2xlbik7CisgICAgbG9jYWwoJGNlLCAkY2cpOworCisgICAgJGV4cF9sZW4gPSBsZW5ndGgoJGV4cCk7CisgICAgJGdvdF9sZW4gPSBsZW5ndGgoJGdvdCk7CisgICAgaWYgKCRleHBfbGVuICE9ICRnb3RfbGVuKSB7CisJaWYgKCRleHBfbGVuIDwgJGdvdF9sZW4pIHsKKwkgICAgaWYgKHN1YnN0cigkZ290LCAwLCAkZXhwX2xlbikgZXEgJGV4cCkgeworCQlyZXR1cm4gImdvdCB0b28gbXVjaCBvdXRwdXQiOworCSAgICB9CisJfSBlbHNpZiAoc3Vic3RyKCRleHAsIDAsICRnb3RfbGVuKSBlcSAkZ290KSB7CisJICAgIHJldHVybiAiZ290IHRvbyBsaXR0bGUgb3V0cHV0IjsKKwl9CisgICAgfQorICAgIGZvciAoJGkgPSAwOyAkaSA8ICRleHBfbGVuOyAkaSsrKSB7CisJJGNlID0gc3Vic3RyKCRleHAsICRpLCAxKTsKKwkkY2cgPSBzdWJzdHIoJGdvdCwgJGksIDEpOworCWxhc3QgaWYgJGNlIG5lICRjZzsKKwkkY2hhcisrOworCWlmICgkY2UgZXEgIlxuIikgeworCSAgICAkbGluZW5vKys7CisJICAgICRjaGFyID0gMTsKKwl9CisgICAgfQorICAgIHJldHVybiAiZmlyc3QgZGlmZmVyZW5jZTogbGluZSAkbGluZW5vLCBjaGFyICRjaGFyICh3YW50ZWQgJyIKKwkuICZmb3JtYXRfY2hhcigkY2UpIC4gIicsIGdvdCAnIgorCS4gJmZvcm1hdF9jaGFyKCRjZykgLiAiJyI7Cit9CisKK3N1YgorZm9ybWF0X2NoYXIKK3sKKyAgICBsb2NhbCgkY2gsICRzKTsKKworICAgICRjaCA9IG9yZCgkX1swXSk7CisgICAgaWYgKCRjaCA9PSAxMCkgeworCXJldHVybiAnXG4nOworICAgIH0gZWxzaWYgKCRjaCA9PSAxMykgeworCXJldHVybiAnXHInOworICAgIH0gZWxzaWYgKCRjaCA9PSA4KSB7CisJcmV0dXJuICdcYic7CisgICAgfSBlbHNpZiAoJGNoID09IDkpIHsKKwlyZXR1cm4gJ1x0JzsKKyAgICB9IGVsc2lmICgkY2ggPiAxMjcpIHsKKwkkY2ggLT0gMTI3OworCSRzID0gIk0tIjsKKyAgICB9IGVsc2UgeworCSRzID0gJyc7CisgICAgfQorICAgIGlmICgkY2ggPCAzMikgeworCSRzIC49ICdeJzsKKwkkY2ggKz0gb3JkKCdAJyk7CisgICAgfSBlbHNpZiAoJGNoID09IDEyNykgeworCXJldHVybiAkcyAuICJePyI7CisgICAgfQorICAgIHJldHVybiAkcyAuIHNwcmludGYoIiVjIiwgJGNoKTsKK30KKworc3ViCitldmFsX2V4aXQKK3sKKyAgICBsb2NhbCgkbmFtZSwgJHN0YXR1cywgJGV4cGVjdCkgPSBAXzsKKyAgICBsb2NhbCgkZXhwcik7CisgICAgbG9jYWwoJHcsICRlLCAkcykgPSAoJHN0YXR1cywgKCRzdGF0dXMgPj4gOCkgJiAweGZmLCAkc3RhdHVzICYgMHg3Zik7CisKKyAgICAkZSA9IC0xMDAwIGlmICRzdGF0dXMgJiAweGZmOworICAgICRzID0gLTEwMDAgaWYgJHMgPT0gMHg3ZjsKKyAgICBpZiAoIWRlZmluZWQgJGV4cGVjdCkgeworCSRleHByID0gJyR3ID09IDAnOworICAgIH0gZWxzaWYgKCRleHBlY3QgPX4gL14ofC0pXGQrJC8pIHsKKwkkZXhwciA9ICJcJGUgPT0gJGV4cGVjdCI7CisgICAgfSBlbHNlIHsKKwkkZXhwciA9ICRleHBlY3Q7CisJJGV4cHIgPX4gcy9cYihbd3NlXSlcYi9cJCQxL2c7CisJJGV4cHIgPX4gcy9cYihTSUdbQS1aMC05XSspXGIvJiQxL2c7CisgICAgfQorICAgICR3ID0gZXZhbCAkZXhwcjsKKyAgICBpZiAoJEAgbmUgJycpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGJhZCBleHBlY3RlZC1leGl0IGV4cHJlc3Npb246ICRleHBlY3QgKCRAKVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIHJldHVybiAkdzsKK30KKworc3ViCityZWFkX3Rlc3QKK3sKKyAgICBsb2NhbCgkZmlsZSwgJGluLCAqdGVzdCkgPSBAXzsKKyAgICBsb2NhbCgkZmllbGQsICR2YWwsICRmbGFncywgJGRvX2Nob3AsICRuZWVkX3JlZG8sICRzdGFydF9saW5lbm8pOworICAgIGxvY2FsKCVjbnQsICRzZmllbGQpOworCisgICAgJXRlc3QgPSAoKTsKKyAgICAlY250ID0gKCk7CisgICAgd2hpbGUgKDwkaW4+KSB7CisJbmV4dCBpZiAvXlxzKiQvOworCW5leHQgaWYgL14gKiMvOworCWxhc3QgaWYgL15ccyotLS1ccyokLzsKKwkkc3RhcnRfbGluZW5vID0gJC4gaWYgIWRlZmluZWQgJHN0YXJ0X2xpbmVubzsKKwlpZiAoIS9eKFstXHddKyk6XHMqKHxcU3xcUy4qXFMpXHMqJC8pIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokZmlsZTokLjogdW5yZWNvZ25pc2VkIGxpbmVcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisJKCRmaWVsZCwgJHZhbCkgPSAoJDEsICQyKTsKKwkkc2ZpZWxkID0gJGZpZWxkOworCSRmbGFncyA9ICR0ZXN0X2ZpZWxkc3skZmllbGR9OworCWlmICghZGVmaW5lZCAkZmxhZ3MpIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokZmlsZTokLjogdW5yZWNvZ25pc2VkIGZpZWxkIFwiJGZpZWxkXCJcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisJaWYgKCRmbGFncyA9fiAvcy8pIHsKKwkgICAgbG9jYWwoJGNudCkgPSAkY250eyRmaWVsZH0rKzsKKwkgICAgJHRlc3R7JGZpZWxkfSA9ICRjbnR7JGZpZWxkfTsKKwkgICAgJGNudCA9IDAgaWYgJGNudCBlcSAnJzsKKwkgICAgJHNmaWVsZCAuPSAiOiRjbnQiOworCX0gZWxzaWYgKGRlZmluZWQgJHRlc3R7JGZpZWxkfSkgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiRmaWxlOiQuOiBtdWx0aXBsZSBcIiRmaWVsZFwiIGZpZWxkc1xuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKwkkZG9fY2hvcCA9ICRmbGFncyAhfiAvbS87CisJJG5lZWRfcmVkbyA9IDA7CisJaWYgKCR2YWwgZXEgJycgfHwgJHZhbCBlcSAnIScgfHwgJGZsYWdzID1+IC9wLykgeworCSAgICBpZiAoJGZsYWdzID1+IC9bTW1dLykgeworCQlpZiAoJGZsYWdzID1+IC9wLykgeworCQkgICAgaWYgKCR2YWwgPX4gL14hLykgeworCQkJJGRvX2Nob3AgPSAxOworCQkJJHZhbCA9ICQnOworCQkgICAgfSBlbHNlIHsKKwkJCSRkb19jaG9wID0gMDsKKwkJICAgIH0KKwkJICAgIGlmICgkdmFsIGVxICcnKSB7CisJCQlwcmludCBTVERFUlIKKwkJIiRwcm9nOiRmaWxlOiQuOiBubyBwYXJhbWV0ZXJzIGdpdmVuIGZvciBmaWVsZCBcIiRmaWVsZFwiXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgaWYgKCR2YWwgZXEgJyEnKSB7CisJCQkkZG9fY2hvcCA9IDE7CisJCSAgICB9CisJCSAgICAkdmFsID0gJyc7CisJCX0KKwkJd2hpbGUgKDwkaW4+KSB7CisJCSAgICBsYXN0IGlmICEvXlx0LzsKKwkJICAgICR2YWwgLj0gJCc7CisJCX0KKwkJY2hvcCAkdmFsIGlmICRkb19jaG9wOworCQkkZG9fY2hvcCA9IDE7CisJCSRuZWVkX3JlZG8gPSAxOworCisJCSMgU3ludGF4IGNoZWNrIG9uIGZpZWxkcyB0aGF0IGNhbiBzZXZlcmFsIGluc3RhbmNlcworCQkjIChjYW4gZ2l2ZSB1c2VmdWwgbGluZSBudW1iZXJzIHRoaXMgd2F5KQorCisJCWlmICgkZmllbGQgZXEgJ2ZpbGUtc2V0dXAnKSB7CisJCSAgICBsb2NhbCgkdHlwZSwgJHBlcm0sICRyZXN0LCAkYywgJGxlbiwgJG5hbWUpOworCisJCSAgICAjIGZvcm1hdCBpczogdHlwZSBwZXJtICJuYW1lIgorCQkgICAgaWYgKCR2YWwgIX4gL15bIFx0XSooXFMrKVsgXHRdKyhcUyspWyBcdF0rKFteIFx0XS4qKS8pIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgcGFyYW1ldGVyIGxpbmUgZm9yIGZpbGUtc2V0dXAgZmllbGRcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICAoJHR5cGUsICRwZXJtLCAkcmVzdCkgPSAoJDEsICQyLCAkMyk7CisJCSAgICBpZiAoJHR5cGUgIX4gL14oZmlsZXxkaXJ8c3ltbGluaykkLykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBmaWxlIHR5cGUgZm9yIGZpbGUtc2V0dXA6ICR0eXBlXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgaWYgKCRwZXJtICF+IC9eXGQrJC8pIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgcGVybWlzc2lvbnMgZm9yIGZpbGUtc2V0dXA6ICR0eXBlXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgJGMgPSBzdWJzdHIoJHJlc3QsIDAsIDEpOworCQkgICAgaWYgKCgkbGVuID0gaW5kZXgoJHJlc3QsICRjLCAxKSAtIDEpIDw9IDApIHsKKwkJCXByaW50IFNUREVSUgorICAgICIkcHJvZzokZmlsZTokLjogbWlzc2luZyBlbmQgcXVvdGUgZm9yIGZpbGUgbmFtZSBpbiBmaWxlLXNldHVwOiAkcmVzdFxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgICRuYW1lID0gc3Vic3RyKCRyZXN0LCAxLCAkbGVuKTsKKwkJICAgIGlmICgkbmFtZSA9fiAvXlwvLyB8fCAkbmFtZSA9fiAvKF58XC8pXC5cLihcL3wkKS8pIHsKKwkJCSMgTm90ZTogdGhpcyBpcyBub3QgYSBzZWN1cml0eSB0aGluZyAtIGp1c3QgYSBzYW5pdHkKKwkJCSMgY2hlY2sgLSBhIHRlc3QgY2FuIHN0aWxsIHVzZSBzeW1saW5rcyB0byBnZXQgYXQgZmlsZXMKKwkJCSMgb3V0c2lkZSB0aGUgdGVzdCBkaXJlY3RvcnkuCisJCQlwcmludCBTVERFUlIKKyIkcHJvZzokZmlsZTokLjogZmlsZSBuYW1lIGluIGZpbGUtc2V0dXAgaXMgYWJzb2x1dGUgb3IgY29udGFpbnMgLi46ICRuYW1lXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQl9CisJCWlmICgkZmllbGQgZXEgJ2ZpbGUtcmVzdWx0JykgeworCQkgICAgbG9jYWwoJHR5cGUsICRwZXJtLCAkdWlkLCAkZ2lkLCAkbWF0Y2hUeXBlLAorCQkJICAkcmVzdCwgJGMsICRsZW4sICRuYW1lKTsKKworCQkgICAgIyBmb3JtYXQgaXM6IHR5cGUgcGVybSB1aWQgZ2lkIG1hdGNoVHlwZSAibmFtZSIKKwkJICAgIGlmICgkdmFsICF+IC9eXHMqKFxTKylccysoXFMrKVxzKyhcUyspXHMrKFxTKylccysoXFMrKVxzKyhcUy4qKS8pIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgcGFyYW1ldGVyIGxpbmUgZm9yIGZpbGUtcmVzdWx0IGZpZWxkXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgKCR0eXBlLCAkcGVybSwgJHVpZCwgJGdpZCwgJG1hdGNoVHlwZSwgJHJlc3QpCisJCQk9ICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2KTsKKwkJICAgIGlmICgkdHlwZSAhfiAvXihmaWxlfGRpcnxzeW1saW5rKSQvKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIGZpbGUgdHlwZSBmb3IgZmlsZS1yZXN1bHQ6ICR0eXBlXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgaWYgKCRwZXJtICF+IC9eXGQrJC8gJiYgJHBlcm0gbmUgJyonKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHBlcm1pc3Npb25zIGZvciBmaWxlLXJlc3VsdDogJHBlcm1cbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICBpZiAoJHVpZCAhfiAvXlxkKyQvICYmICR1aWQgbmUgJyonKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHVzZXItaWQgZm9yIGZpbGUtcmVzdWx0OiAkdWlkXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgaWYgKCRnaWQgIX4gL15cZCskLyAmJiAkZ2lkIG5lICcqJykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBncm91cC1pZCBmb3IgZmlsZS1yZXN1bHQ6ICRnaWRcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICBpZiAoJG1hdGNoVHlwZSAhfiAvXihleGFjdHxwYXR0ZXJuKSQvKSB7CisJCQlwcmludCBTVERFUlIKKwkJIiRwcm9nOiRmaWxlOiQuOiBiYWQgbWF0Y2ggdHlwZSBmb3IgZmlsZS1yZXN1bHQ6ICRtYXRjaFR5cGVcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICAkYyA9IHN1YnN0cigkcmVzdCwgMCwgMSk7CisJCSAgICBpZiAoKCRsZW4gPSBpbmRleCgkcmVzdCwgJGMsIDEpIC0gMSkgPD0gMCkgeworCQkJcHJpbnQgU1RERVJSCisgICAgIiRwcm9nOiRmaWxlOiQuOiBtaXNzaW5nIGVuZCBxdW90ZSBmb3IgZmlsZSBuYW1lIGluIGZpbGUtcmVzdWx0OiAkcmVzdFxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgICRuYW1lID0gc3Vic3RyKCRyZXN0LCAxLCAkbGVuKTsKKwkJICAgIGlmICgkbmFtZSA9fiAvXlwvLyB8fCAkbmFtZSA9fiAvKF58XC8pXC5cLihcL3wkKS8pIHsKKwkJCSMgTm90ZTogdGhpcyBpcyBub3QgYSBzZWN1cml0eSB0aGluZyAtIGp1c3QgYSBzYW5pdHkKKwkJCSMgY2hlY2sgLSBhIHRlc3QgY2FuIHN0aWxsIHVzZSBzeW1saW5rcyB0byBnZXQgYXQgZmlsZXMKKwkJCSMgb3V0c2lkZSB0aGUgdGVzdCBkaXJlY3RvcnkuCisJCQlwcmludCBTVERFUlIKKyIkcHJvZzokZmlsZTokLjogZmlsZSBuYW1lIGluIGZpbGUtcmVzdWx0IGlzIGFic29sdXRlIG9yIGNvbnRhaW5zIC4uOiAkbmFtZVxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2lmICgkdmFsIGVxICcnKSB7CisJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBubyB2YWx1ZSBnaXZlbiBmb3IgZmllbGQgXCIkZmllbGRcIlxuIjsKKwkJcmV0dXJuIHVuZGVmOworCSAgICB9CisJfQorCSR2YWwgLj0gIlxuIiBpZiAhJGRvX2Nob3A7CisJJHRlc3R7JHNmaWVsZH0gPSAkdmFsOworCXJlZG8gaWYgJG5lZWRfcmVkbzsKKyAgICB9CisgICAgaWYgKCRfIGVxICcnKSB7CisJaWYgKCV0ZXN0KSB7CisJICAgIHByaW50IFNUREVSUgorCSAgICAgICIkcHJvZzokZmlsZTokc3RhcnRfbGluZW5vOiBlbmQtb2YtZmlsZSB3aGlsZSByZWFkaW5nIHRlc3RcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgd2hpbGUgKCgkZmllbGQsICR2YWwpID0gZWFjaCAldGVzdF9maWVsZHMpIHsKKwlpZiAoJHZhbCA9fiAvci8gJiYgIWRlZmluZWQgJHRlc3R7JGZpZWxkfSkgeworCSAgICBwcmludCBTVERFUlIKKwkgICAgICAiJHByb2c6JGZpbGU6JHN0YXJ0X2xpbmVubzogcmVxdWlyZWQgZmllbGQgXCIkZmllbGRcIiBtaXNzaW5nXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorICAgIH0KKworICAgICR0ZXN0eyc6ZnVsbC1uYW1lJ30gPSBzdWJzdHIoJGZpbGUsICRmaWxlX3ByZWZpeF9za2lwKSAuICI6JHRlc3R7J25hbWUnfSI7CisgICAgJHRlc3R7Jzpsb25nLW5hbWUnfSA9ICIkZmlsZTokc3RhcnRfbGluZW5vOiR0ZXN0eyduYW1lJ30iOworCisgICAgIyBTeW50YXggY2hlY2sgb24gc3BlY2lmaWMgZmllbGRzCisgICAgaWYgKGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSkgeworCWlmICgkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9ICF+IC9eKHllc3xubykkLykgeworCSAgICBwcmludCBTVERFUlIKKwkgICAgICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogYmFkIHZhbHVlIGZvciBleHBlY3RlZC1mYWlsIGZpZWxkXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorCSR0ZXN0eydleHBlY3RlZC1mYWlsJ30gPSAkMSBlcSAneWVzJzsKKyAgICB9IGVsc2UgeworCSR0ZXN0eydleHBlY3RlZC1mYWlsJ30gPSAwOworICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnYXJndW1lbnRzJ30pIHsKKwlsb2NhbCgkZmlyc3RjKSA9IHN1YnN0cigkdGVzdHsnYXJndW1lbnRzJ30sIDAsIDEpOworCisJaWYgKHN1YnN0cigkdGVzdHsnYXJndW1lbnRzJ30sIC0xLCAxKSBuZSAkZmlyc3RjKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogYXJndW1lbnRzIGZpZWxkIGRvZXNuJ3Qgc3RhcnQgYW5kIGVuZCB3aXRoIHRoZSBzYW1lIGNoYXJhY3RlclxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKyAgICB9CisgICAgaWYgKGRlZmluZWQgJHRlc3R7J2Vudi1zZXR1cCd9KSB7CisJbG9jYWwoJGZpcnN0YykgPSBzdWJzdHIoJHRlc3R7J2Vudi1zZXR1cCd9LCAwLCAxKTsKKworCWlmIChzdWJzdHIoJHRlc3R7J2Vudi1zZXR1cCd9LCAtMSwgMSkgbmUgJGZpcnN0YykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGVudi1zZXR1cCBmaWVsZCBkb2Vzbid0IHN0YXJ0IGFuZCBlbmQgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisgICAgfQorICAgIGlmIChkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1leGl0J30pIHsKKwlsb2NhbCgkdmFsKSA9ICR0ZXN0eydleHBlY3RlZC1leGl0J307CisKKwlpZiAoJHZhbCA9fiAvXih8LSlcZCskLykgeworCSAgICBpZiAoJHZhbCA8IDAgfHwgJHZhbCA+IDI1NSkgeworCQlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGV4cGVjdGVkLWV4aXQgdmFsdWUgJHZhbCBub3QgaW4gMC4uMjU1XG4iOworCQlyZXR1cm4gdW5kZWY7CisJICAgIH0KKwl9IGVsc2lmICgkdmFsICF+IC9eKFtcczw+Ky09KiVcLyZ8ISgpXXxcYlt3c2VdXGJ8XGJTSUdbQS1aMC05XStcYikrJC8pIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBiYWQgZXhwZWN0ZWQtZXhpdCBleHByZXNzaW9uOiAkdmFsXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorICAgIH0gZWxzZSB7CisJJHRlc3R7J2V4cGVjdGVkLWV4aXQnfSA9IDA7CisgICAgfQorICAgIGlmIChkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1zdGRvdXQnfQorCSYmIGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuJ30pCisgICAgeworCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY2FuJ3QgdXNlIGJvdGggZXhwZWN0ZWQtc3Rkb3V0IGFuZCBleHBlY3RlZC1zdGRvdXQtcGF0dGVyblxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGlmIChkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1zdGRlcnInfQorCSYmIGRlZmluZWQgJHRlc3R7J2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuJ30pCisgICAgeworCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY2FuJ3QgdXNlIGJvdGggZXhwZWN0ZWQtc3RkZXJyIGFuZCBleHBlY3RlZC1zdGRlcnItcGF0dGVyblxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGlmIChkZWZpbmVkICR0ZXN0eyd0aW1lLWxpbWl0J30pIHsKKwlpZiAoJHRlc3R7J3RpbWUtbGltaXQnfSAhfiAvXlxkKyQvIHx8ICR0ZXN0eyd0aW1lLWxpbWl0J30gPT0gMCkgeworCSAgICBwcmludCBTVERFUlIKKwkgICAgICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogYmFkIHZhbHVlIGZvciB0aW1lLWxpbWl0IGZpZWxkXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorICAgIH0gZWxzaWYgKGRlZmluZWQgJGRlZmF1bHRfdGltZV9saW1pdCkgeworCSR0ZXN0eyd0aW1lLWxpbWl0J30gPSAkZGVmYXVsdF90aW1lX2xpbWl0OworICAgIH0KKworICAgIGlmIChkZWZpbmVkICRrbm93bl90ZXN0c3skdGVzdHsnbmFtZSd9fSkgeworCXByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogd2FybmluZzogZHVwbGljYXRlIHRlc3QgbmFtZSAke3Rlc3R7J25hbWUnfX1cbiI7CisgICAgfQorICAgICRrbm93bl90ZXN0c3skdGVzdHsnbmFtZSd9fSA9IDE7CisKKyAgICByZXR1cm4gMTsKK30KKworc3ViCit0dHlfbXNnCit7CisgICAgbG9jYWwoJG1zZykgPSBAXzsKKworICAgIG9wZW4oVFRZLCAiPiAvZGV2L3R0eSIpIHx8IHJldHVybiAwOworICAgIHByaW50IFRUWSAkbXNnOworICAgIGNsb3NlKFRUWSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N1YgorbmV2ZXJfY2FsbGVkX2Z1bmNzCit7CisJcmV0dXJuIDA7CisJJnR0eV9tc2coImhpXG4iKTsKKwkmbmV2ZXJfY2FsbGVkX2Z1bmNzKCk7CisJJmNhdGNoX3NpZ2Fscm0oKTsKKwkkb2xkX2VudnsnZm9vJ30gPSAnYmFyJzsKKwkkaW50ZXJuYWxfdGVzdF9maWVsZHN7J2Zvbyd9ID0gJ2Jhcic7Cit9CisKK3N1YgorY2hlY2tfZmlsZV9yZXN1bHQKK3sKKyAgICBsb2NhbCgqdGVzdCkgPSBAXzsKKworICAgIHJldHVybiAnJyBpZiAoIWRlZmluZWQgJHRlc3R7J2ZpbGUtcmVzdWx0J30pOworCisgICAgbG9jYWwoJHdoeSkgPSAnJzsKKyAgICBsb2NhbCgkaSk7CisgICAgbG9jYWwoJHR5cGUsICRwZXJtLCAkdWlkLCAkZ2lkLCAkcmVzdCwgJGMsICRsZW4sICRuYW1lKTsKKyAgICBsb2NhbChAc3RidWYpOworCisgICAgZm9yICgkaSA9IDA7ICRpIDwgJHRlc3R7J2ZpbGUtcmVzdWx0J307ICRpKyspIHsKKwkkdmFsID0gJHRlc3R7ImZpbGUtcmVzdWx0OiRpIn07CisKKwkjIGZvcm1hdCBpczogdHlwZSBwZXJtICJuYW1lIgorCSgkdHlwZSwgJHBlcm0sICR1aWQsICRnaWQsICRtYXRjaFR5cGUsICRyZXN0KSA9CisJICAgIHNwbGl0KCcgJywgJHZhbCwgNik7CisJJGMgPSBzdWJzdHIoJHJlc3QsIDAsIDEpOworCSRsZW4gPSBpbmRleCgkcmVzdCwgJGMsIDEpIC0gMTsKKwkkbmFtZSA9IHN1YnN0cigkcmVzdCwgMSwgJGxlbik7CisJJHJlc3QgPSBzdWJzdHIoJHJlc3QsIDIgKyAkbGVuKTsKKwkkcGVybSA9IG9jdCgkcGVybSkgaWYgJHBlcm0gPX4gL15cZCskLzsKKworCUBzdGJ1ZiA9IGxzdGF0KCRuYW1lKTsKKwlpZiAoIUBzdGJ1ZikgeworCSAgICAkd2h5IC49ICJcdGV4cGVjdGVkICR0eXBlIFwiJG5hbWVcIiBub3QgY3JlYXRlZFxuIjsKKwkgICAgbmV4dDsKKwl9CisJaWYgKCRwZXJtIG5lICcqJyAmJiAoJHN0YnVmWzJdICYgMDc3NzcpICE9ICRwZXJtKSB7CisJICAgICR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGhhcyB1bmV4cGVjdGVkIHBlcm1pc3Npb25zXG4iOworCSAgICAkd2h5IC49IHNwcmludGYoIlx0XHRleHBlY3RlZCAwJW8sIGZvdW5kIDAlb1xuIiwKKwkJICAgICRwZXJtLCAkc3RidWZbMl0gJiAwNzc3Nyk7CisJfQorCWlmICgkdWlkIG5lICcqJyAmJiAkc3RidWZbNF0gIT0gJHVpZCkgeworCSAgICAkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBoYXMgdW5leHBlY3RlZCB1c2VyLWlkXG4iOworCSAgICAkd2h5IC49IHNwcmludGYoIlx0XHRleHBlY3RlZCAlZCwgZm91bmQgJWRcbiIsCisJCSAgICAkdWlkLCAkc3RidWZbNF0pOworCX0KKwlpZiAoJGdpZCBuZSAnKicgJiYgJHN0YnVmWzVdICE9ICRnaWQpIHsKKwkgICAgJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaGFzIHVuZXhwZWN0ZWQgZ3JvdXAtaWRcbiI7CisJICAgICR3aHkgLj0gc3ByaW50ZigiXHRcdGV4cGVjdGVkICVkLCBmb3VuZCAlZFxuIiwKKwkJICAgICRnaWQsICRzdGJ1Zls1XSk7CisJfQorCisJaWYgKCR0eXBlIGVxICdmaWxlJykgeworCSAgICBpZiAoLWwgXyB8fCAhIC1mIF8pIHsKKwkJJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaXMgbm90IGEgcmVndWxhciBmaWxlXG4iOworCSAgICB9IGVsc2UgeworCQlsb2NhbCAkdG1wID0gJmNoZWNrX291dHB1dCgkdGVzdHsnbG9uZy1uYW1lJ30sICRuYW1lLAorCQkJICAgICIkdHlwZSBjb250ZW50cyBpbiBcIiRuYW1lXCIiLAorCQkJICAgICRtYXRjaFR5cGUgZXEgJ2V4YWN0JyA/ICRyZXN0IDogdW5kZWYKKwkJCSAgICAkbWF0Y2hUeXBlIGVxICdwYXR0ZXJuJyA/ICRyZXN0IDogdW5kZWYpOworCQlyZXR1cm4gdW5kZWYgaWYgKCFkZWZpbmVkICR0bXApOworCQkkd2h5IC49ICR0bXA7CisJICAgIH0KKwl9IGVsc2lmICgkdHlwZSBlcSAnZGlyJykgeworCSAgICBpZiAoJHJlc3QgIX4gL15ccyokLykgeworCQlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGZpbGUtcmVzdWx0IHRlc3QgZm9yIGRpcmVjdG9yeSAkbmFtZSBzaG91bGQgbm90IGhhdmUgY29udGVudCBzcGVjaWZpZWRcbiI7CisJCXJldHVybiB1bmRlZjsKKwkgICAgfQorCSAgICBpZiAoLWwgXyB8fCAhIC1kIF8pIHsKKwkJJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaXMgbm90IGEgZGlyZWN0b3J5XG4iOworCSAgICB9CisJfSBlbHNpZiAoJHR5cGUgZXEgJ3N5bWxpbmsnKSB7CisJICAgIGlmICghLWwgXykgeworCQkkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBpcyBub3QgYSBzeW1saW5rXG4iOworCSAgICB9IGVsc2UgeworCQlsb2NhbCAkY29udGVudCA9IHJlYWRsaW5rKCRuYW1lKTsKKwkJaWYgKCFkZWZpbmVkICRjb250ZW50KSB7CisJCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGZpbGUtcmVzdWx0IHRlc3QgZm9yICR0eXBlICRuYW1lIGZhaWxlZCAtIGNvdWxkIG5vdCByZWFkbGluayAtICQhXG4iOworCQkgICAgcmV0dXJuIHVuZGVmOworCQl9CisJCWxvY2FsICR0bXAgPSAmY29tcGFyZV9vdXRwdXQoJHRlc3R7J2xvbmctbmFtZSd9LAorCQkJICAgICIkdHlwZSBjb250ZW50cyBpbiBcIiRuYW1lXCIiLAorCQkJICAgICRtYXRjaFR5cGUgZXEgJ2V4YWN0JyA/ICRyZXN0IDogdW5kZWYKKwkJCSAgICAkbWF0Y2hUeXBlIGVxICdwYXR0ZXJuJyA/ICRyZXN0IDogdW5kZWYpOworCQlyZXR1cm4gdW5kZWYgaWYgKCFkZWZpbmVkICR0bXApOworCQkkd2h5IC49ICR0bXA7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuICR3aHk7Cit9CisKK3N1YgorSEVMUF9NRVNTQUdFCit7CisgICAgcHJpbnQgU1RERVJSICRVc2FnZTsKKyAgICBleGl0IDA7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9jaGVjay50IGIvbWtzaC9zcmMvY2hlY2sudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU4Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvY2hlY2sudApAQCAtMCwwICsxLDc0NDMgQEAKKyMgJE1pck9TOiBzcmMvYmluL21rc2gvY2hlY2sudCx2IDEuMzg4IDIwMTAvMDgvMjQgMTU6NDc6NDQgdGcgRXhwICQKKyMgJE9wZW5CU0Q6IGJrc2wtbmwudCx2IDEuMiAyMDAxLzAxLzI4IDIzOjA0OjU2IG5pa2xhcyBFeHAgJAorIyAkT3BlbkJTRDogaGlzdG9yeS50LHYgMS41IDIwMDEvMDEvMjggMjM6MDQ6NTYgbmlrbGFzIEV4cCAkCisjICRPcGVuQlNEOiByZWFkLnQsdiAxLjMgMjAwMy8wMy8xMCAwMzo0ODoxNiBkYXZpZCBFeHAgJAorIy0KKyMgQ29weXJpZ2h0IMKpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyMJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorIworIyBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyMgYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisjIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVu4oCQCisjIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorIyBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorIworIyBUaGlzIHdvcmsgaXMgcHJvdmlkZWQg4oCcQVMgSVPigJ0gYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisjIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorIyBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyMgbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisjIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorIyBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyMgZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisjIG9mIHNhaWQgcGVyc29u4oCZcyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyMtCisjIFlvdSBtYXkgYWxzbyB3YW50IHRvIHRlc3QgSUZTIHdpdGggdGhlIHNjcmlwdCBhdAorIyBodHRwOi8vd3d3LnJlc2VhcmNoLmF0dC5jb20vfmdzZi9wdWJsaWMvaWZzLnNoCisKK2V4cGVjdGVkLXN0ZG91dDoKKwlAKCMpTUlSQlNEIEtTSCBSMzkgMjAxMC8wOC8yNAorZGVzY3JpcHRpb246CisJQ2hlY2sgdmVyc2lvbiBvZiBzaGVsbC4KK3N0ZGluOgorCWVjaG8gJEtTSF9WRVJTSU9OCituYW1lOiBLU0hfVkVSU0lPTgorLS0tCituYW1lOiBzZWxmdGVzdC0xCitkZXNjcmlwdGlvbjoKKwlSZWdyZXNzaW9uIHRlc3Qgc2VsZi10ZXN0aW5nCitzdGRpbjoKKwllY2hvICR7Zm9vOi1iYXp9CitleHBlY3RlZC1zdGRvdXQ6CisJYmF6CistLS0KK25hbWU6IHNlbGZ0ZXN0LTIKK2Rlc2NyaXB0aW9uOgorCVJlZ3Jlc3Npb24gdGVzdCBzZWxmLXRlc3RpbmcKK2Vudi1zZXR1cDogIWZvbz1iYXIhCitzdGRpbjoKKwllY2hvICR7Zm9vOi1iYXp9CitleHBlY3RlZC1zdGRvdXQ6CisJYmFyCistLS0KK25hbWU6IHNlbGZ0ZXN0LTMKK2Rlc2NyaXB0aW9uOgorCVJlZ3Jlc3Npb24gdGVzdCBzZWxmLXRlc3RpbmcKK2Vudi1zZXR1cDogIUVOVj1mbm9yZCEKK3N0ZGluOgorCWVjaG8gIjwkRU5WPiIKK2V4cGVjdGVkLXN0ZG91dDoKKwk8Zm5vcmQ+CistLS0KK25hbWU6IHNlbGZ0ZXN0LWVudgorZGVzY3JpcHRpb246CisJSnVzdCBvdXRwdXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgKGFsd2F5cyBmYWlscykKK2NhdGVnb3J5OiBkaXNhYmxlZAorc3RkaW46CisJc2V0CistLS0KK25hbWU6IGFsaWFzLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KK3N0ZGluOgorCWFsaWFzIGZvb0Jhcj1mb29CYXIKKwlmb29CYXIKKwlleGl0IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9mb29CYXIuKm5vdCBmb3VuZC4qLworLS0tCituYW1lOiBhbGlhcy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC9hdm9pZGVkIGluIGFsaWFzZXMuCitzdGRpbjoKKwlhbGlhcyBmb29CYXI9YmFyRm9vCisJYWxpYXMgYmFyRm9vPWZvb0JhcgorCWZvb0JhcgorCWJhckZvbworCWV4aXQgMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL2Zvb0Jhci4qbm90IGZvdW5kLipcbi4qYmFyRm9vLipub3QgZm91bmQvCistLS0KK25hbWU6IGFsaWFzLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KK3N0ZGluOgorCWFsaWFzIEVjaG89J2VjaG8gJworCWFsaWFzIGZvb0Jhcj1iYXJGb28KKwlhbGlhcyBiYXJGb289Zm9vQmFyCisJRWNobyBmb29CYXIKKwl1bmFsaWFzIGJhckZvbworCUVjaG8gZm9vQmFyCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vQmFyCisJYmFyRm9vCistLS0KK25hbWU6IGFsaWFzLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGlzbid0IGRvbmUgb24ga2V5d29yZHMgKGluIGtleXdvcmQKKwlwb3N0aXRpb25zKS4KK3N0ZGluOgorCWFsaWFzIEVjaG89J2VjaG8gJworCWFsaWFzIHdoaWxlPVdoaWxlCisJd2hpbGUgZmFsc2U7IGRvIGVjaG8gaGkgOyBkb25lCisJRWNobyB3aGlsZQorZXhwZWN0ZWQtc3Rkb3V0OgorCVdoaWxlCistLS0KK25hbWU6IGFsaWFzLTUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGRvbmUgYWZ0ZXIgYWxpYXMgd2l0aCB0cmFpbGluZyBzcGFjZS4KK3N0ZGluOgorCWFsaWFzIEVjaG89J2VjaG8gJworCWFsaWFzIGZvbz0nYmFyIHN0dWZmICcKKwlhbGlhcyBiYXI9J0JhcjEgQmFyMiAnCisJYWxpYXMgc3R1ZmY9J1N0dWZmJworCWFsaWFzIGJsYWg9J0JsYWgnCisJRWNobyBmb28gYmxhaAorZXhwZWN0ZWQtc3Rkb3V0OgorCUJhcjEgQmFyMiBTdHVmZiBCbGFoCistLS0KK25hbWU6IGFsaWFzLTYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIGRvbmUgYWZ0ZXIgYWxpYXMgd2l0aCB0cmFpbGluZyBzcGFjZS4KK3N0ZGluOgorCWFsaWFzIEVjaG89J2VjaG8gJworCWFsaWFzIGZvbz0nYmFyIGJhcicKKwlhbGlhcyBiYXI9J0JhciAnCisJYWxpYXMgYmxhaD1CbGFoCisJRWNobyBmb28gYmxhaAorZXhwZWN0ZWQtc3Rkb3V0OgorCUJhciBCYXIgQmxhaAorLS0tCituYW1lOiBhbGlhcy03CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFsaWFzIGV4cGFuc2lvbiBkb25lIGFmdGVyIGFsaWFzIHdpdGggdHJhaWxpbmcgc3BhY2UKKwlhZnRlciBhIGtleXdvcmQuCitzdGRpbjoKKwlhbGlhcyBYPSdjYXNlICcKKwlhbGlhcyBZPVoKKwlYIFkgaW4gJ1knKSBlY2hvIGlzIHkgOzsgWikgZWNobyBpcyB6IDsgZXNhYworZXhwZWN0ZWQtc3Rkb3V0OgorCWlzIHoKKy0tLQorbmFtZTogYWxpYXMtOAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBuZXdsaW5lcyBpbiBhbiBhbGlhcyBkb24ndCBjYXVzZSB0aGUgY29tbWFuZCB0byBiZSBsb3N0Lgorc3RkaW46CisJYWxpYXMgZm9vPScKKwkKKwkKKwllY2hvIGhpCisJCisJCisJCisJZWNobyB0aGVyZQorCQorCQorCScKKwlmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCXRoZXJlCistLS0KK25hbWU6IGFsaWFzLTkKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KKwlUaGlzIGNoZWNrIGZhaWxzIGZvciBzbG93IG1hY2hpbmVzIG9yIEN5Z3dpbiwgcmFpc2UKKwl0aGUgdGltZS1saW1pdCBjbGF1c2UgKGUuZy4gdG8gNykgaWYgdGhpcyBvY2N1cnMuCit0aW1lLWxpbWl0OiAzCitzdGRpbjoKKwllY2hvIC1uID50ZgorCWFsaWFzIGxzPWxzCisJbHMKKwllY2hvICQobHMpCisJZXhpdCAwCitleHBlY3RlZC1zdGRvdXQ6CisJdGYKKwl0ZgorLS0tCituYW1lOiBhbGlhcy0xMAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgorCVJlZ3Jlc3Npb24sIGludHJvZHVjZWQgZHVyaW5nIGFuIG9sZCBidWdmaXguCitzdGRpbjoKKwlhbGlhcyBmb289J3ByaW50IGhlbGxvICcKKwlhbGlhcyBiYXI9J2ZvbyB3b3JsZCcKKwllY2hvICQoYmFyKQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhlbGxvIHdvcmxkCistLS0KK25hbWU6IGFyaXRoLWxhenktMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBvbmx5IG9uZSBzaWRlIG9mIHRlcm5hcnkgb3BlcmF0b3IgaXMgZXZhbHVhdGVkCitzdGRpbjoKKwl4PWkrPTIKKwl5PWorPTIKKwl0eXBlc2V0IC1pIGk9MSBqPTEKKwllY2hvICQoKDEgPyAyMCA6ICh4Kz0yKSkpCisJZWNobyAkaSwkeAorCWVjaG8gJCgoMCA/ICh5Kz0yKSA6IDMwKSkKKwllY2hvICRqLCR5CitleHBlY3RlZC1zdGRvdXQ6CisJMjAKKwkxLGkrPTIKKwkzMAorCTEsais9MgorLS0tCituYW1lOiBhcml0aC1sYXp5LTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYXNzaWdubWVudHMgbm90IGRvbmUgb24gbm9uLWV2YWx1YXRlZCBzaWRlIG9mIHRlcm5hcnkKKwlvcGVyYXRvcgorc3RkaW46CisJeD1pKz0yCisJeT1qKz0yCisJdHlwZXNldCAtaSBpPTEgaj0xCisJZWNobyAkKCgxID8gMjAgOiAoeCs9MikpKQorCWVjaG8gJGksJHgKKwllY2hvICQoKDAgPyAoeSs9MikgOiAzMCkpCisJZWNobyAkaSwkeQorZXhwZWN0ZWQtc3Rkb3V0OgorCTIwCisJMSxpKz0yCisJMzAKKwkxLGorPTIKKy0tLQorbmFtZTogYXJpdGgtbGF6eS0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFzc2lnbm1lbnRzIG5vdCBkb25lIG9uIG5vbi1ldmFsdWF0ZWQgc2lkZSBvZiB0ZXJuYXJ5CisJb3BlcmF0b3IgYW5kIHRoaXMgY29uc3RydWN0IGlzIHBhcnNlZCBjb3JyZWN0bHkgKERlYmlhbiAjNDQ1NjUxKQorc3RkaW46CisJeD00CisJeT0kKCgwID8geD0xIDogMikpCisJZWNobyA9ICR4ICR5ID0KK2V4cGVjdGVkLXN0ZG91dDoKKwk9IDQgMiA9CistLS0KK25hbWU6IGFyaXRoLXRlcm5hcnktcHJlYy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBwcmVjZWRlbmNlIG9mIHRlcm5hcnkgb3BlcmF0b3IgdnMgYXNzaWdubWVudAorc3RkaW46CisJdHlwZXNldCAtaSB4PTIKKwl5PSQoKDEgPyAyMCA6IHgrPTIpKQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLio6LioxIFw/IDIwIDogeFwrPTIuKmx2YWx1ZS4qXG4kLworLS0tCituYW1lOiBhcml0aC10ZXJuYXJ5LXByZWMtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgcHJlY2VkZW5jZSBvZiB0ZXJuYXJ5IG9wZXJhdG9yIHZzIGFzc2lnbm1lbnQKK3N0ZGluOgorCXR5cGVzZXQgLWkgeD0yCisJZWNobyAkKCgwID8geCs9MiA6IDIwKSkKK2V4cGVjdGVkLXN0ZG91dDoKKwkyMAorLS0tCituYW1lOiBhcml0aC1kaXYtYXNzb2MtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgYXNzb2NpYXRpdml0eSBvZiBkaXZpc2lvbiBvcGVyYXRvcgorc3RkaW46CisJZWNobyAkKCgyMCAvIDIgLyAyKSkKK2V4cGVjdGVkLXN0ZG91dDoKKwk1CistLS0KK25hbWU6IGFyaXRoLWFzc29wLWFzc29jLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGFzc29jaWF0aXZpdHkgb2YgYXNzaWdubWVudC1vcGVyYXRvciBvcGVyYXRvcgorc3RkaW46CisJdHlwZXNldCAtaSBpPTEgaj0yIGs9MworCWVjaG8gJCgoaSArPSBqICs9IGspKQorCWVjaG8gJGksJGosJGsKK2V4cGVjdGVkLXN0ZG91dDoKKwk2CisJNiw1LDMKKy0tLQorbmFtZTogYXJpdGgtdW5zaWduZWQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgdW5zaWduZWQgYXJpdGhtZXRpY3Mgd29yaworc3RkaW46CisJIyBzaWduZWQgdnMgdW5zaWduZWQKKwllY2hvIHgxICQoKC0xKSkgJCgoIy0xKSkKKwkjIGNhbGN1bGF0aW5nCisJdHlwZXNldCAtaSB2cworCXR5cGVzZXQgLVVpIHZ1CisJdnM9NDEyMzQ1Njc4OTsgdnU9NDEyMzQ1Njc4OQorCWVjaG8geDIgJHZzICR2dQorCSgoIHZzICU9IDIxNDc0ODM2NDcgKSkKKwkoKCB2dSAlPSAyMTQ3NDgzNjQ3ICkpCisJZWNobyB4MyAkdnMgJHZ1CisJdnM9NDEyMzQ1Njc4OTsgdnU9NDEyMzQ1Njc4OQorCSgoICMgdnMgJT0gMjE0NzQ4MzY0NyApKQorCSgoICMgdnUgJT0gMjE0NzQ4MzY0NyApKQorCWVjaG8geDQgJHZzICR2dQorCSMgbWFrZSBzdXJlIHRoZSBjYWxjdWxhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdW5zaWduZWQgZmxhZworCXZzPTQxMjM0NTY3ODk7IHZ1PTQxMjM0NTY3ODkKKwllY2hvIHg1ICR2cyAkdnUKKwkjIHNob3J0IGZvcm0KKwllY2hvIHg2ICQoKCMgdnMgJSAyMTQ3NDgzNjQ3KSkgJCgoIyB2dSAlIDIxNDc0ODM2NDcpKQorCSMgYXJyYXkgcmVmcworCXNldCAtQSB2YQorCXZhWzE5NzU5NzMxNDJdPXJpZ2h0CisJdmFbNDEyMzQ1Njc4OV09d3JvbmcKKwllY2hvIHg3ICR7dmFbIzQxMjM0NTY3ODklMjE0NzQ4MzY0N119CitleHBlY3RlZC1zdGRvdXQ6CisJeDEgLTEgNDI5NDk2NzI5NQorCXgyIC0xNzE1MTA1MDcgNDEyMzQ1Njc4OQorCXgzIC0xNzE1MTA1MDcgNDEyMzQ1Njc4OQorCXg0IDE5NzU5NzMxNDIgMTk3NTk3MzE0MgorCXg1IC0xNzE1MTA1MDcgNDEyMzQ1Njc4OQorCXg2IDE5NzU5NzMxNDIgMTk3NTk3MzE0MgorCXg3IHJpZ2h0CistLS0KK25hbWU6IGFyaXRoLWxpbWl0MzItMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYXJpdGhtZXRpY3MgYXJlIDMyIGJpdAorc3RkaW46CisJIyBzaWduZWQgdnMgdW5zaWduZWQKKwllY2hvIHgxICQoKC0xKSkgJCgoIy0xKSkKKwkjIGNhbGN1bGF0aW5nCisJdHlwZXNldCAtaSB2cworCXR5cGVzZXQgLVVpIHZ1CisJdnM9MjE0NzQ4MzY0NzsgdnU9MjE0NzQ4MzY0NworCWVjaG8geDIgJHZzICR2dQorCWxldCB2cysrIHZ1KysKKwllY2hvIHgzICR2cyAkdnUKKwl2cz00Mjk0OTY3Mjk1OyB2dT00Mjk0OTY3Mjk1CisJZWNobyB4NCAkdnMgJHZ1CisJbGV0IHZzKysgdnUrKworCWVjaG8geDUgJHZzICR2dQorCWxldCB2cysrIHZ1KysKKwllY2hvIHg2ICR2cyAkdnUKK2V4cGVjdGVkLXN0ZG91dDoKKwl4MSAtMSA0Mjk0OTY3Mjk1CisJeDIgMjE0NzQ4MzY0NyAyMTQ3NDgzNjQ3CisJeDMgLTIxNDc0ODM2NDggMjE0NzQ4MzY0OAorCXg0IC0xIDQyOTQ5NjcyOTUKKwl4NSAwIDAKKwl4NiAxIDEKKy0tLQorbmFtZTogYmtzbC1ubC1pZ24tMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBub3QgY29sbGFzcGVkIGFmdGVyICMKK3N0ZGluOgorCWVjaG8gaGkgI3RoZXJlIFwKKwllY2hvIGZvbGtzCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwlmb2xrcworLS0tCituYW1lOiBia3NsLW5sLWlnbi0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIG5vdCBjb2xsYXNwZWQgaW5zaWRlIHNpbmdsZSBxdW90ZXMKK3N0ZGluOgorCWVjaG8gJ2hpIFwKKwl0aGVyZScKKwllY2hvIGZvbGtzCitleHBlY3RlZC1zdGRvdXQ6CisJaGkgXAorCXRoZXJlCisJZm9sa3MKKy0tLQorbmFtZTogYmtzbC1ubC1pZ24tMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBub3QgY29sbGFzcGVkIGluc2lkZSBzaW5nbGUgcXVvdGVzCitzdGRpbjoKKwljYXQgPDwgXEVPRgorCWhpIFwKKwl0aGVyZQorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpIFwKKwl0aGVyZQorLS0tCituYW1lOiBia3NsLW5sLWlnbi00CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpbnRlcmFjdGlvbiBvZiBhbGlhc2VzLCBzaW5nbGUgcXVvdGVzIGFuZCBoZXJlLWRvY3VtZW50cworCXdpdGggYmFja3NsYXNoLW5ld2xpbmUKKwkoZG9uJ3Qga25vdyB3aGF0IFBPU0lYIGhhcyB0byBzYXkgYWJvdXQgdGhpcykKK3N0ZGluOgorCWE9MgorCWFsaWFzIHg9J2VjaG8gaGkKKwljYXQgPDwgIkVPRiIKKwlmb29cCisJYmFyCisJc29tZScKKwl4CisJbW9yZVwKKwlzdHVmZiRhCisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwlmb29cCisJYmFyCisJc29tZQorCW1vcmVcCisJc3R1ZmYkYQorLS0tCituYW1lOiBia3NsLW5sLWlnbi01CitkZXNjcmlwdGlvbjoKKwlDaGVjayB3aGF0IGhhcHBlbnMgd2l0aCBiYWNrc2xhc2ggYXQgZW5kIG9mIGlucHV0CisJKHRoZSBvbGQgQm91cm5lIHNoZWxsIHRyYXNoZXMgdGhlbTsgc28gZG8gd2UpCitzdGRpbjogIQorCWVjaG8gYGVjaG8gZm9vXFxgYmFyCisJZWNobyBoaVwKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb29iYXIKKwloaQorLS0tCisjCisjIFBsYWNlcyBcbmV3bGluZSBzaG91bGQgYmUgY29sbGFwc2VkCisjCituYW1lOiBia3NsLW5sLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGJlZm9yZSwgaW4gdGhlIG1pZGRsZSBvZiwgYW5kCisJYWZ0ZXIgd29yZHMKK3N0ZGluOgorCSAJIAlcCisJCQkgZWNobyBoaVwKKwlUaGVyZSwgXAorCWZvbGtzCitleHBlY3RlZC1zdGRvdXQ6CisJaGlUaGVyZSwgZm9sa3MKKy0tLQorbmFtZTogYmtzbC1ubC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiAkIHNlcXVlbmNlcworCShrc2g5MyBmYWlscyB0aGlzKQorc3RkaW46CisJYT0xMgorCWFiPTE5CisJZWNobyAkXAorCWEKKwllY2hvICRhXAorCWIKKwllY2hvICRcCisJe2F9CisJZWNobyAke2FcCisJYn0KKwllY2hvICR7YWJcCisJfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTEyCisJMTkKKwkxMgorCTE5CisJMTkKKy0tLQorbmFtZTogYmtzbC1ubC0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiAkKC4uKSBhbmQgYC4uLmAgc2VxdWVuY2VzCisJKGtzaDkzIGZhaWxzIHRoaXMpCitzdGRpbjoKKwllY2hvICRcCisJKGVjaG8gZm9vYmFyMSkKKwllY2hvICQoXAorCWVjaG8gZm9vYmFyMikKKwllY2hvICQoZWNobyBmb29cCisJYmFyMykKKwllY2hvICQoZWNobyBmb29iYXI0XAorCSkKKwllY2hvIGAKKwllY2hvIHN0dWZmMWAKKwllY2hvIGBlY2hvIHN0XAorCXVmZjJgCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vYmFyMQorCWZvb2JhcjIKKwlmb29iYXIzCisJZm9vYmFyNAorCXN0dWZmMQorCXN0dWZmMgorLS0tCituYW1lOiBia3NsLW5sLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluICQoKC4uKSkgc2VxdWVuY2VzCisJKGtzaDkzIGZhaWxzIHRoaXMpCitzdGRpbjoKKwllY2hvICRcCisJKCgxKzIpKQorCWVjaG8gJChcCisJKDErMiszKSkKKwllY2hvICQoKFwKKwkxKzIrMys0KSkKKwllY2hvICQoKDErXAorCTIrMys0KzUpKQorCWVjaG8gJCgoMSsyKzMrNCs1KzYpXAorCSkKK2V4cGVjdGVkLXN0ZG91dDoKKwkzCisJNgorCTEwCisJMTUKKwkyMQorLS0tCituYW1lOiBia3NsLW5sLTUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluIGRvdWJsZSBxdW90ZWQgc3RyaW5ncworc3RkaW46CisJZWNobyAiXAorCWhpIgorCWVjaG8gImZvb1wKKwliYXIiCisJZWNobyAiZm9sa3NcCisJIgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJZm9vYmFyCisJZm9sa3MKKy0tLQorbmFtZTogYmtzbC1ubC02CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiBoZXJlIGRvY3VtZW50IGRlbGltaXRlcnMKKwkoa3NoOTMgZmFpbHMgc2Vjb25kIHBhcnQgb2YgdGhpcykKK3N0ZGluOgorCWE9MTIKKwljYXQgPDwgRU9cCisJRgorCWE9JGEKKwlmb29cCisJYmFyCisJRU9GCisJY2F0IDw8IEVfT19GCisJZm9vCisJRV9PX1wKKwlGCisJZWNobyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJYT0xMgorCWZvb2JhcgorCWZvbworCWRvbmUKKy0tLQorbmFtZTogYmtzbC1ubC03CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiBkb3VibGUtcXVvdGVkIGhlcmUtZG9jdW1lbnQKKwlkZWxpbWl0ZXIuCitzdGRpbjoKKwlhPTEyCisJY2F0IDw8ICJFT1wKKwlGIgorCWE9JGEKKwlmb29cCisJYmFyCisJRU9GCisJZWNobyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJYT0kYQorCWZvb1wKKwliYXIKKwlkb25lCistLS0KK25hbWU6IGJrc2wtbmwtOAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gdmFyaW91cyAyKyBjaGFyYWN0ZXIgdG9rZW5zCisJZGVsaW1pdGVyLgorCShrc2g5MyBmYWlscyB0aGlzKQorc3RkaW46CisJZWNobyBoaSAmXAorCSYgZWNobyB0aGVyZQorCWVjaG8gZm9vIHxcCisJfCBlY2hvIGJhcgorCWNhdCA8XAorCTwgRU9GCisJc3R1ZmYKKwlFT0YKKwljYXQgPFwKKwk8XAorCS0gRU9GCisJCW1vcmUgc3R1ZmYKKwlFT0YKKwljYXQgPDxcCisJRU9GCisJYWJjZGVmCisJRU9GCisJZWNobyBoaSA+XAorCT4gL2Rldi9udWxsCisJZWNobyAkPworCWk9MQorCWNhc2UgJGkgaW4KKwkoXAorCXh8XAorCTFcCisJKSBlY2hvIGhpO1wKKwk7CisJKCopIGVjaG8gb29wcworCWVzYWMKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCXRoZXJlCisJZm9vCisJc3R1ZmYKKwltb3JlIHN0dWZmCisJYWJjZGVmCisJMAorCWhpCistLS0KK25hbWU6IGJrc2wtbmwtOQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcIGF0IHRoZSBlbmQgb2YgYW4gYWxpYXMgaXMgY29sbGFwc2VkIHdoZW4gZm9sbG93ZWQKKwlieSBhIG5ld2xpbmUKKwkoZG9uJ3Qga25vdyB3aGF0IFBPU0lYIGhhcyB0byBzYXkgYWJvdXQgdGhpcykKK3N0ZGluOgorCWFsaWFzIHg9J2VjaG8gaGlcJworCXgKKwllY2hvIHRoZXJlCitleHBlY3RlZC1zdGRvdXQ6CisJaGllY2hvIHRoZXJlCistLS0KK25hbWU6IGJrc2wtbmwtMTAKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaW4gYSBrZXl3b3JkIGlzIGNvbGxhcHNlZAorc3RkaW46CisJaVwKKwlmIHRydWU7IHRoZW5cCisJIGVjaG8gcGFzczsgZWxcCisJc2UgZWNobyBmYWlsOyBmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCXBhc3MKKy0tLQorIworIyBQbGFjZXMgXG5ld2xpbmUgc2hvdWxkIGJlIGNvbGxhcHNlZCAoa3NoIGV4dGVuc2lvbnMpCisjCituYW1lOiBia3NsLW5sLWtzaC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhcHNlZCBpbiBleHRlbmRlZCBnbG9iYmluZworCShrc2g5MyBmYWlscyB0aGlzKQorc3RkaW46CisJeHh4PWZvbworCWNhc2UgJHh4eCBpbgorCShmKlwKKwkoXAorCW9cCisJKVwKKwkpIGVjaG8gb2sgOzsKKwkqKSBlY2hvIGJhZAorCWVzYWMKK2V4cGVjdGVkLXN0ZG91dDoKKwlvaworLS0tCituYW1lOiBia3NsLW5sLWtzaC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhcHNlZCBpbiAoKC4uLikpIGV4cHJlc3Npb25zCisJKGtzaDkzIGZhaWxzIHRoaXMpCitzdGRpbjoKKwlpPTEKKwkoXAorCShcCisJaT1pKzJcCisJKVwKKwkpCisJZWNobyAkaQorZXhwZWN0ZWQtc3Rkb3V0OgorCTMKKy0tLQorbmFtZTogYnJlYWstMQorZGVzY3JpcHRpb246CisJU2VlIGlmIGJyZWFrIGJyZWFrcyBvdXQgb2YgbG9vcHMKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBicmVhazsgZWNobyBiYWQtJGk7IGRvbmUKKwllY2hvIGVuZC0xCisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrIDE7IGVjaG8gYmFkLSRpOyBkb25lCisJZWNobyBlbmQtMgorCWZvciBpIGluIGEgYiBjOyBkbworCSAgICBmb3IgaiBpbiB4IHkgejsgZG8KKwkJZWNobyAkaTokagorCQlicmVhaworCQllY2hvIGJhZC0kaQorCSAgICBkb25lCisJICAgIGVjaG8gZW5kLSRpCisJZG9uZQorCWVjaG8gZW5kLTMKK2V4cGVjdGVkLXN0ZG91dDoKKwlhCisJZW5kLTEKKwlhCisJZW5kLTIKKwlhOngKKwllbmQtYQorCWI6eAorCWVuZC1iCisJYzp4CisJZW5kLWMKKwllbmQtMworLS0tCituYW1lOiBicmVhay0yCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgYnJlYWsgYnJlYWtzIG91dCBvZiBuZXN0ZWQgbG9vcHMKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbworCSAgICBmb3IgaiBpbiB4IHkgejsgZG8KKwkJZWNobyAkaTokagorCQlicmVhayAyCisJCWVjaG8gYmFkLSRpCisJICAgIGRvbmUKKwkgICAgZWNobyBlbmQtJGkKKwlkb25lCisJZWNobyBlbmQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhOngKKwllbmQKKy0tLQorbmFtZTogYnJlYWstMworZGVzY3JpcHRpb246CisJV2hhdCBpZiBicmVhayB1c2VkIG91dHNpZGUgb2YgYW55IGxvb3BzCisJKGtzaDg4LGtzaDkzIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUpCitzdGRpbjoKKwlicmVhaworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qYnJlYWsuKi8KKy0tLQorbmFtZTogYnJlYWstNAorZGVzY3JpcHRpb246CisJV2hhdCBpZiBicmVhayBOIHVzZWQgd2hlbiBvbmx5IE4tMSBsb29wcworCShrc2g4OCxrc2g5MyBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlKQorc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrIDI7IGVjaG8gYmFkLSRpOyBkb25lCisJZWNobyBlbmQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhCisJZW5kCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLipicmVhay4qLworLS0tCituYW1lOiBicmVhay01CitkZXNjcmlwdGlvbjoKKwlFcnJvciBpZiBicmVhayBhcmd1bWVudCBpc24ndCBhIG51bWJlcgorc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGJyZWFrIGFiYzsgZWNobyBtb3JlLSRpOyBkb25lCisJZWNobyBlbmQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKmJyZWFrLiovCistLS0KK25hbWU6IGNvbnRpbnVlLTEKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiBjb250aW51ZSBjb250aW51ZXMgbG9vcHMKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZTsgZWNobyBiYWQtJGkgOyBkb25lCisJZWNobyBlbmQtMQorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZSAxOyBlY2hvIGJhZC0kaTsgZG9uZQorCWVjaG8gZW5kLTIKKwlmb3IgaSBpbiBhIGIgYzsgZG8KKwkgICAgZm9yIGogaW4geCB5IHo7IGRvCisJCWVjaG8gJGk6JGoKKwkJY29udGludWUKKwkJZWNobyBiYWQtJGktJGoKKwkgICAgZG9uZQorCSAgICBlY2hvIGVuZC0kaQorCWRvbmUKKwllY2hvIGVuZC0zCitleHBlY3RlZC1zdGRvdXQ6CisJYQorCWIKKwljCisJZW5kLTEKKwlhCisJYgorCWMKKwllbmQtMgorCWE6eAorCWE6eQorCWE6egorCWVuZC1hCisJYjp4CisJYjp5CisJYjp6CisJZW5kLWIKKwljOngKKwljOnkKKwljOnoKKwllbmQtYworCWVuZC0zCistLS0KK25hbWU6IGNvbnRpbnVlLTIKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiBjb250aW51ZSBicmVha3Mgb3V0IG9mIG5lc3RlZCBsb29wcworc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvCisJICAgIGZvciBqIGluIHggeSB6OyBkbworCQllY2hvICRpOiRqCisJCWNvbnRpbnVlIDIKKwkJZWNobyBiYWQtJGktJGoKKwkgICAgZG9uZQorCSAgICBlY2hvIGVuZC0kaQorCWRvbmUKKwllY2hvIGVuZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWE6eAorCWI6eAorCWM6eAorCWVuZAorLS0tCituYW1lOiBjb250aW51ZS0zCitkZXNjcmlwdGlvbjoKKwlXaGF0IGlmIGNvbnRpbnVlIHVzZWQgb3V0c2lkZSBvZiBhbnkgbG9vcHMKKwkoa3NoODgsa3NoOTMgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZSkKK3N0ZGluOgorCWNvbnRpbnVlCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLipjb250aW51ZS4qLworLS0tCituYW1lOiBjb250aW51ZS00CitkZXNjcmlwdGlvbjoKKwlXaGF0IGlmIGNvbnRpbnVlIE4gdXNlZCB3aGVuIG9ubHkgTi0xIGxvb3BzCisJKGtzaDg4LGtzaDkzIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUpCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgY29udGludWUgMjsgZWNobyBiYWQtJGk7IGRvbmUKKwllY2hvIGVuZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWEKKwliCisJYworCWVuZAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qY29udGludWUuKi8KKy0tLQorbmFtZTogY29udGludWUtNQorZGVzY3JpcHRpb246CisJRXJyb3IgaWYgY29udGludWUgYXJndW1lbnQgaXNuJ3QgYSBudW1iZXIKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBjb250aW51ZSBhYmM7IGVjaG8gbW9yZS0kaTsgZG9uZQorCWVjaG8gZW5kCitleHBlY3RlZC1zdGRvdXQ6CisJYQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLipjb250aW51ZS4qLworLS0tCituYW1lOiBjZC1oaXN0b3J5CitkZXNjcmlwdGlvbjoKKwlUZXN0IHNvbWVvbmUncyBDRCBoaXN0b3J5IHBhY2thZ2UgKHVzZXMgYXJyYXlzKQorc3RkaW46CisJIyBnbyB0byBrbm93biBwbGFjZSBiZWZvcmUgZG9pbmcgYW55dGhpbmcKKwljZCAvCisJCisJYWxpYXMgY2Q9X2NkCisJZnVuY3Rpb24gX2NkCisJeworCQl0eXBlc2V0IC1pIGNkbGVuIGkKKwkJdHlwZXNldCB0CisJCisJCWlmIFsgJCMgLWVxIDAgXQorCQl0aGVuCisJCQlzZXQgLS0gJEhPTUUKKwkJZmkKKwkKKwkJaWYgWyAiJENESElTVEZJTEUiIC1hIC1yICIkQ0RISVNURklMRSIgXSAjIGlmIGRpcmVjdG9yeSBoaXN0b3J5IGV4aXN0cworCQl0aGVuCisJCQl0eXBlc2V0IENESElTVAorCQkJaT0tMQorCQkJd2hpbGUgcmVhZCAtciB0CQkJIyByZWFkIGRpcmVjdG9yeSBoaXN0b3J5IGZpbGUKKwkJCWRvCisJCQkJQ0RISVNUW2k9aSsxXT0kdAorCQkJZG9uZSA8JENESElTVEZJTEUKKwkJZmkKKwkKKwkJaWYgWyAiJHtDREhJU1RbMF19IiAhPSAiJFBXRCIgLWEgIiRQV0QiICE9ICIiIF0KKwkJdGhlbgorCQkJX2NkaW5zCQkJCSMgaW5zZXJ0ICRQV0QgaW50byBjZCBoaXN0b3J5CisJCWZpCisJCisJCWNkbGVuPSR7I0NESElTVFsqXX0JCQkjIG51bWJlciBvZiBlbGVtZW50cyBpbiBoaXN0b3J5CisJCisJCWNhc2UgIiRAIiBpbgorCQktKQkJCQkJIyBjZCB0byBuZXcgZGlyCisJCQlpZiBbICIkT0xEUFdEIiA9ICIiIF0gJiYgKChjZGxlbj4xKSkKKwkJCXRoZW4KKwkJCQkncHJpbnQnICR7Q0RISVNUWzFdfQorCQkJCSdjZCcgJHtDREhJU1RbMV19CisJCQkJX3B3ZAorCQkJZWxzZQorCQkJCSdjZCcgJEAKKwkJCQlfcHdkCisJCQlmaQorCQkJOzsKKwkJLWwpCQkJCQkjIHByaW50IGRpcmVjdG9yeSBsaXN0CisJCQl0eXBlc2V0IC1SMyBudW0KKwkJCSgoaT1jZGxlbikpCisJCQl3aGlsZSAoKChpPWktMSk+PTApKQorCQkJZG8KKwkJCQludW09JGkKKwkJCQkncHJpbnQnICIkbnVtICR7Q0RISVNUW2ldfSIKKwkJCWRvbmUKKwkJCXJldHVybgorCQkJOzsKKwkJLVswLTldfC1bMC05XVswLTldKQkJCSMgY2QgdG8gZGlyIGluIGxpc3QKKwkJCWlmICgoKGk9JHsxIy19KTxjZGxlbikpCisJCQl0aGVuCisJCQkJJ3ByaW50JyAke0NESElTVFtpXX0KKwkJCQknY2QnICR7Q0RISVNUW2ldfQorCQkJCV9wd2QKKwkJCWVsc2UKKwkJCQknY2QnICRACisJCQkJX3B3ZAorCQkJZmkKKwkJCTs7CisJCS0qKQkJCQkJIyBjZCB0byBtYXRjaGVkIGRpciBpbiBsaXN0CisJCQl0PSR7MSMtfQorCQkJaT0xCisJCQl3aGlsZSAoKGk8Y2RsZW4pKQorCQkJZG8KKwkJCQljYXNlICR7Q0RISVNUW2ldfSBpbgorCQkJCSokdCopCisJCQkJCSdwcmludCcgJHtDREhJU1RbaV19CisJCQkJCSdjZCcgJHtDREhJU1RbaV19CisJCQkJCV9wd2QKKwkJCQkJYnJlYWsKKwkJCQkJOzsKKwkJCQllc2FjCisJCQkJKChpPWkrMSkpCisJCQlkb25lCisJCQlpZiAoKGk+PWNkbGVuKSkKKwkJCXRoZW4KKwkJCQknY2QnICRACisJCQkJX3B3ZAorCQkJZmkKKwkJCTs7CisJCSopCQkJCQkjIGNkIHRvIG5ldyBkaXIKKwkJCSdjZCcgJEAKKwkJCV9wd2QKKwkJCTs7CisJCWVzYWMKKwkKKwkJX2NkaW5zCQkJCQkjIGluc2VydCAkUFdEIGludG8gY2QgaGlzdG9yeQorCQorCQlpZiBbICIkQ0RISVNURklMRSIgXQorCQl0aGVuCisJCQljZGxlbj0keyNDREhJU1RbKl19CQkjIG51bWJlciBvZiBlbGVtZW50cyBpbiBoaXN0b3J5CisJCisJCQlpPTAKKwkJCXdoaWxlICgoaTxjZGxlbikpCisJCQlkbworCQkJCSdwcmludCcgLXIgJHtDREhJU1RbaV19CSMgdXBkYXRlIGRpcmVjdG9yeSBoaXN0b3J5CisJCQkJKChpPWkrMSkpCisJCQlkb25lID4kQ0RISVNURklMRQorCQlmaQorCX0KKwkKKwlmdW5jdGlvbiBfY2RpbnMJCQkJCSMgaW5zZXJ0ICRQV0QgaW50byBjZCBoaXN0b3J5CisJewkJCQkJCSMgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgYnkgX2NkCisJCXR5cGVzZXQgLWkgaQorCQorCQkoKGk9MCkpCisJCXdoaWxlICgoaTwkeyNDREhJU1RbKl19KSkJCSMgc2VlIGlmIGRpciBpcyBhbHJlYWR5IGluIGxpc3QKKwkJZG8KKwkJCWlmIFsgIiR7Q0RISVNUWyRpXX0iID0gIiRQV0QiIF0KKwkJCXRoZW4KKwkJCQlicmVhaworCQkJZmkKKwkJCSgoaT1pKzEpKQorCQlkb25lCisJCisJCWlmICgoaT4yMikpCQkJCSMgbGltaXQgbWF4IHNpemUgb2YgbGlzdAorCQl0aGVuCisJCQlpPTIyCisJCWZpCisJCisJCXdoaWxlICgoKGk9aS0xKT49MCkpCQkJIyBidW1wIG9sZCBkaXJzIGluIGxpc3QKKwkJZG8KKwkJCUNESElTVFtpKzFdPSR7Q0RISVNUW2ldfQorCQlkb25lCisJCisJCUNESElTVFswXT0kUFdECQkJCSMgaW5zZXJ0IG5ldyBkaXJlY3RvcnkgaW4gbGlzdAorCX0KKwkKKwkKKwlmdW5jdGlvbiBfcHdkCisJeworCQlpZiBbIC1uICIkRUNEIiBdCisJCXRoZW4KKwkJCXB3ZCAxPiY2CisJCWZpCisJfQorCSMgU3RhcnQgb2YgdGVzdAorCWNkIC90bXAKKwljZCAvYmluCisJY2QgL2V0YworCWNkIC0KKwljZCAtMgorCWNkIC1sCitleHBlY3RlZC1zdGRvdXQ6CisJL2JpbgorCS90bXAKKwkgIDMgLworCSAgMiAvZXRjCisJICAxIC9iaW4KKwkgIDAgL3RtcAorLS0tCituYW1lOiBlbnYtcHJvbXB0CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHByb21wdCBub3QgcHJpbnRlZCB3aGVuIHByb2Nlc3NpbmcgRU5WCitlbnYtc2V0dXA6ICFFTlY9Li9mb28hCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZm9vIgorCVhYWD1fCisJUFMxPVgKKwlmYWxzZSAmJiBlY2hvIGhtbW0KK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJZWNobyBoaSR7WFhYfXRoZXJlCitleHBlY3RlZC1zdGRvdXQ6CisJaGlfdGhlcmUKK2V4cGVjdGVkLXN0ZGVycjogIQorCVhYCistLS0KK25hbWU6IGV4cGFuZC11Z2x5CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHdlaXJkICR7Zm9vK2Jhcn0gY29uc3RydWN0cyBhcmUgcGFyc2VkIGNvcnJlY3RseQorc3RkaW46CisJKGVjaG8gMSAke0lGUysnfSd6fSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxCisJKGVjaG8gMiAiJHtJRlMrJ30nen0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIKKwkoZWNobyAzICJmb28gJHtJRlMrJ2Jhcn0gYmF6IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzCisJKGVjaG8gLW4gJzQgJzsgcHJpbnRmICclc1xuJyAiZm9vICR7SUZTKyJiICAgYyJ9IGJheiIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNAorCShlY2hvIC1uICc1ICc7IHByaW50ZiAnJXNcbicgImZvbyAke0lGUytiICAgY30gYmF6IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA1CisJKGVjaG8gNiAke0lGUysifSJ6fSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA2CisJKGVjaG8gNyAiJHtJRlMrIn0ien0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDcKKwkoZWNobyA4ICIke0lGUytcIn1cInp9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA4CisJKGVjaG8gOSAiJHtJRlMrXCJcfVwien0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDkKKwkoZWNobyAxMCBmb28gJHtJRlMrJ2Jhcn0gYmF6J30pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTAKKwkoZWNobyAxMSAiJChlY2hvICIke0lGUysnfSd6fSIpIikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMQorCShlY2hvIDEyICIkKGVjaG8gJHtJRlMrJ30nen0pIikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxMgorCShlY2hvIDEzICR7SUZTK1x9en0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTMKKwkoZWNobyAxNCAiJHtJRlMrXH16fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTQKKwl1PXg7IChlY2hvIC1uICcxNSAnOyBwcmludGYgJzwlcz4gJyAiZm9vICR7SUZTK2EiYiR1eyB7Int7XH1ifSBjICR7SUZTK2R7fX0gYmFyIiAke0lGUy1le319IGJhejsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE1CisJbD10OyAoZWNobyAxNiAke0lGUytoYGVjaG8gLW4gaSAke0lGUyskbH1oYGVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTYKKwlsPXQ7IChlY2hvIDE3ICR7SUZTK2gkKGVjaG8gLW4gaSAke0lGUyskbH1oKWVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTcKKwlsPXQ7IChlY2hvIDE4ICIke0lGUytoYGVjaG8gLW4gaSAke0lGUyskbH1oYGVyZX0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE4CisJbD10OyAoZWNobyAxOSAiJHtJRlMraCQoZWNobyAtbiBpICR7SUZTKyRsfWgpZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTkKKwlsPXQ7IChlY2hvIDIwICR7SUZTK2hgZWNobyAtbiBpICIke0lGUyskbH0iaGBlcmV9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIwCisJbD10OyAoZWNobyAyMSAke0lGUytoJChlY2hvIC1uIGkgIiR7SUZTKyRsfSJoKWVyZX0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjEKKwlsPXQ7IChlY2hvIDIyICIke0lGUytoYGVjaG8gLW4gaSAiJHtJRlMrJGx9ImhgZXJlfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjIKKwlsPXQ7IChlY2hvIDIzICIke0lGUytoJChlY2hvIC1uIGkgIiR7SUZTKyRsfSJoKWVyZX0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIzCisJa2V5PXZhbHVlOyAoZWNobyAtbiAnMjQgJzsgcHJpbnRmICclc1xuJyAiJHtJRlMrJyRrZXknfSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjQKKwlrZXk9dmFsdWU7IChlY2hvIC1uICcyNSAnOyBwcmludGYgJyVzXG4nICIke0lGUysiJyRrZXknIn0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI1CSMga3NoOTM6IOKAnCcka2V5J+KAnQorCWtleT12YWx1ZTsgKGVjaG8gLW4gJzI2ICc7IHByaW50ZiAnJXNcbicgJHtJRlMrJyRrZXknfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyNgorCWtleT12YWx1ZTsgKGVjaG8gLW4gJzI3ICc7IHByaW50ZiAnJXNcbicgJHtJRlMrIicka2V5JyJ9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI3CisJKGVjaG8gLW4gJzI4ICc7IHByaW50ZiAnJXNcbicgIiR7SUZTKyInInggfiB4J30neCInfSJ4fSIgIycpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjgKKwl1PXg7IChlY2hvIC1uICcyOSAnOyBwcmludGYgJzwlcz4gJyBmb28gJHtJRlMrYSJiJHV7IHsieyB7XH1ifSBjICR7SUZTK2R7fX0gYmFyICR7SUZTLWV7fX0gYmF6OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjkKKwkoZWNobyAtbiAnMzAgJzsgcHJpbnRmICc8JXM+ICcgJHtJRlMrZm9vICdiXAorCWFyJyBiYXp9OyBlY2hvIC4pIDI+Ji0gfHwgKGVjaG8gZmFpbGVkIGluIDMwOyBlY2hvIGZhaWxlZCBpbiAzMSkKKwkoZWNobyAtbiAnMzIgJzsgcHJpbnRmICc8JXM+ICcgJHtJRlMrZm9vICJiXAorCWFyIiBiYXp9OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzIKKwkoZWNobyAtbiAnMzMgJzsgcHJpbnRmICc8JXM+ICcgIiR7SUZTK2ZvbyAnYlwKKwlhcicgYmF6fSI7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzMworCShlY2hvIC1uICczNCAnOyBwcmludGYgJzwlcz4gJyAiJHtJRlMrZm9vICJiXAorCWFyIiBiYXp9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM0CisJKGVjaG8gLW4gJzM1ICc7IHByaW50ZiAnPCVzPiAnICR7dj1hXCBifSB4ICR7dj1jXCBkfTsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM1CisJKGVjaG8gLW4gJzM2ICc7IHByaW50ZiAnPCVzPiAnICIke3Y9YVwgYn0iIHggIiR7dj1jXCBkfSI7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzNgorCShlY2hvIC1uICczNyAnOyBwcmludGYgJzwlcz4gJyAke3YtYVwgYn0geCAke3YtY1wgZH07IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzNworCShlY2hvIDM4ICR7SUZTK3gnYSd5fSAvICIke0lGUyt4J2EneX0iIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzgKKwlmb289IngnYSd5IjsgKGVjaG8gMzkgJHtmb28lKidhJyp9IC8gIiR7Zm9vJSonYScqfSIgLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzOQorCWZvbz0iYSBiIGMiOyAoZWNobyAtbiAnNDAgJzsgcHJpbnRmICc8JXM+ICcgIiR7Zm9vI2F9IjsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDQwCitleHBlY3RlZC1zdGRvdXQ6CisJMSB9egorCTIgJyd6fQorCTMgZm9vICdiYXIgYmF6CisJNCBmb28gYiAgIGMgYmF6CisJNSBmb28gYiAgIGMgYmF6CisJNiB9egorCTcgfXoKKwk4ICIien0KKwk5ICJ9InoKKwkxMCBmb28gYmFyfSBiYXoKKwkxMSAnJ3p9CisJMTIgfXoKKwkxMyB9egorCTE0IH16CisJMTUgPGZvbyBhYnh7IHt7e31iIGMgZHt9IGJhcj4gPH0+IDxiYXo+IC4KKwkxNiBoaSB0aGVyZQorCTE3IGhpIHRoZXJlCisJMTggaGkgdGhlcmUKKwkxOSBoaSB0aGVyZQorCTIwIGhpIHRoZXJlCisJMjEgaGkgdGhlcmUKKwkyMiBoaSB0aGVyZQorCTIzIGhpIHRoZXJlCisJMjQgJ3ZhbHVlJworCTI1ICd2YWx1ZScKKwkyNiAka2V5CisJMjcgJ3ZhbHVlJworCTI4ICd4IH4geCcneH0ieH0iICMKKwkyOSA8Zm9vPiA8YWJ4eyB7ez4gPHt9Yj4gPGM+IDxke30+IDxiYXI+IDx9PiA8YmF6PiAuCisJMzAgPGZvbz4gPGJcCisJYXI+IDxiYXo+IC4KKwkzMiA8Zm9vPiA8YmFyPiA8YmF6PiAuCisJMzMgPGZvbyAnYmFyJyBiYXo+IC4KKwkzNCA8Zm9vIGJhciBiYXo+IC4KKwkzNSA8YT4gPGI+IDx4PiA8YT4gPGI+IC4KKwkzNiA8YVwgYj4gPHg+IDxhXCBiPiAuCisJMzcgPGEgYj4gPHg+IDxjIGQ+IC4KKwkzOCB4YXkgLyB4J2EneSAuCisJMzkgeCcgLyB4JyAuCisJNDAgPCBiIGM+IC4KKy0tLQorbmFtZTogZXhwYW5kLXVuZ2xvYi1kYmxxCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlZ3VsYXIgIiR7Zm9vK2Jhcn0iIGNvbnN0cnVjdHMgYXJlIHBhcnNlZCBjb3JyZWN0bHkKK3N0ZGluOgorCXU9eAorCXRsX25vcm0oKSB7CisJCXY9JDIKKwkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgorCQkoZWNobyAiJDEgcGx1cyBub3JtIGZvbyAke3YrJ2Jhcid9IGJheiIpCisJCShlY2hvICIkMSBkYXNoIG5vcm0gZm9vICR7di0nYmFyJ30gYmF6IikKKwkJKGVjaG8gIiQxIGVxYWwgbm9ybSBmb28gJHt2PSdiYXInfSBiYXoiKQorCQkoZWNobyAiJDEgcXN0biBub3JtIGZvbyAke3Y/J2Jhcid9IGJheiIpIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgcXN0biBub3JtIC0+IGVycm9yIgorCQkoZWNobyAiJDEgUExVUyBub3JtIGZvbyAke3Y6KydiYXInfSBiYXoiKQorCQkoZWNobyAiJDEgREFTSCBub3JtIGZvbyAke3Y6LSdiYXInfSBiYXoiKQorCQkoZWNobyAiJDEgRVFBTCBub3JtIGZvbyAke3Y6PSdiYXInfSBiYXoiKQorCQkoZWNobyAiJDEgUVNUTiBub3JtIGZvbyAke3Y6PydiYXInfSBiYXoiKSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIFFTVE4gbm9ybSAtPiBlcnJvciIKKwl9CisJdGxfcGFyZW4oKSB7CisJCXY9JDIKKwkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgorCQkoZWNobyAiJDEgcGx1cyBwYXJuIGZvbyAke3YrKGJhcil9IGJheiIpCisJCShlY2hvICIkMSBkYXNoIHBhcm4gZm9vICR7di0oYmFyKX0gYmF6IikKKwkJKGVjaG8gIiQxIGVxYWwgcGFybiBmb28gJHt2PShiYXIpfSBiYXoiKQorCQkoZWNobyAiJDEgcXN0biBwYXJuIGZvbyAke3Y/KGJhcil9IGJheiIpIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgcXN0biBwYXJuIC0+IGVycm9yIgorCQkoZWNobyAiJDEgUExVUyBwYXJuIGZvbyAke3Y6KyhiYXIpfSBiYXoiKQorCQkoZWNobyAiJDEgREFTSCBwYXJuIGZvbyAke3Y6LShiYXIpfSBiYXoiKQorCQkoZWNobyAiJDEgRVFBTCBwYXJuIGZvbyAke3Y6PShiYXIpfSBiYXoiKQorCQkoZWNobyAiJDEgUVNUTiBwYXJuIGZvbyAke3Y6PyhiYXIpfSBiYXoiKSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIFFTVE4gcGFybiAtPiBlcnJvciIKKwl9CisJdGxfYnJhY2UoKSB7CisJCXY9JDIKKwkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgorCQkoZWNobyAiJDEgcGx1cyBicmFjIGZvbyAke3YrYSR1e3t7XH1ifSBjICR7ditke319IGJheiIpCisJCShlY2hvICIkMSBkYXNoIGJyYWMgZm9vICR7di1hJHV7e3tcfWJ9IGMgJHt2LWR7fX0gYmF6IikKKwkJKGVjaG8gIiQxIGVxYWwgYnJhYyBmb28gJHt2PWEkdXt7e1x9Yn0gYyAke3Y9ZHt9fSBiYXoiKQorCQkoZWNobyAiJDEgcXN0biBicmFjIGZvbyAke3Y/YSR1e3t7XH1ifSBjICR7dj9ke319IGJheiIpIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgcXN0biBicmFjIC0+IGVycm9yIgorCQkoZWNobyAiJDEgUExVUyBicmFjIGZvbyAke3Y6K2EkdXt7e1x9Yn0gYyAke3Y6K2R7fX0gYmF6IikKKwkJKGVjaG8gIiQxIERBU0ggYnJhYyBmb28gJHt2Oi1hJHV7e3tcfWJ9IGMgJHt2Oi1ke319IGJheiIpCisJCShlY2hvICIkMSBFUUFMIGJyYWMgZm9vICR7djo9YSR1e3t7XH1ifSBjICR7djo9ZHt9fSBiYXoiKQorCQkoZWNobyAiJDEgUVNUTiBicmFjIGZvbyAke3Y6P2EkdXt7e1x9Yn0gYyAke3Y6P2R7fX0gYmF6IikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBRU1ROIGJyYWMgLT4gZXJyb3IiCisJfQorCXRsX25vcm0gMSAtCisJdGxfbm9ybSAyICcnCisJdGxfbm9ybSAzIHgKKwl0bF9wYXJlbiA0IC0KKwl0bF9wYXJlbiA1ICcnCisJdGxfcGFyZW4gNiB4CisJdGxfYnJhY2UgNyAtCisJdGxfYnJhY2UgOCAnJworCXRsX2JyYWNlIDkgeAorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgcGx1cyBub3JtIGZvbyAgYmF6CisJMSBkYXNoIG5vcm0gZm9vICdiYXInIGJhegorCTEgZXFhbCBub3JtIGZvbyAnYmFyJyBiYXoKKwkxIHFzdG4gbm9ybSAtPiBlcnJvcgorCTEgUExVUyBub3JtIGZvbyAgYmF6CisJMSBEQVNIIG5vcm0gZm9vICdiYXInIGJhegorCTEgRVFBTCBub3JtIGZvbyAnYmFyJyBiYXoKKwkxIFFTVE4gbm9ybSAtPiBlcnJvcgorCTIgcGx1cyBub3JtIGZvbyAnYmFyJyBiYXoKKwkyIGRhc2ggbm9ybSBmb28gIGJhegorCTIgZXFhbCBub3JtIGZvbyAgYmF6CisJMiBxc3RuIG5vcm0gZm9vICBiYXoKKwkyIFBMVVMgbm9ybSBmb28gIGJhegorCTIgREFTSCBub3JtIGZvbyAnYmFyJyBiYXoKKwkyIEVRQUwgbm9ybSBmb28gJ2JhcicgYmF6CisJMiBRU1ROIG5vcm0gLT4gZXJyb3IKKwkzIHBsdXMgbm9ybSBmb28gJ2JhcicgYmF6CisJMyBkYXNoIG5vcm0gZm9vIHggYmF6CisJMyBlcWFsIG5vcm0gZm9vIHggYmF6CisJMyBxc3RuIG5vcm0gZm9vIHggYmF6CisJMyBQTFVTIG5vcm0gZm9vICdiYXInIGJhegorCTMgREFTSCBub3JtIGZvbyB4IGJhegorCTMgRVFBTCBub3JtIGZvbyB4IGJhegorCTMgUVNUTiBub3JtIGZvbyB4IGJhegorCTQgcGx1cyBwYXJuIGZvbyAgYmF6CisJNCBkYXNoIHBhcm4gZm9vIChiYXIpIGJhegorCTQgZXFhbCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IHFzdG4gcGFybiAtPiBlcnJvcgorCTQgUExVUyBwYXJuIGZvbyAgYmF6CisJNCBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegorCTQgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IFFTVE4gcGFybiAtPiBlcnJvcgorCTUgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKKwk1IGRhc2ggcGFybiBmb28gIGJhegorCTUgZXFhbCBwYXJuIGZvbyAgYmF6CisJNSBxc3RuIHBhcm4gZm9vICBiYXoKKwk1IFBMVVMgcGFybiBmb28gIGJhegorCTUgREFTSCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk1IEVRQUwgcGFybiBmb28gKGJhcikgYmF6CisJNSBRU1ROIHBhcm4gLT4gZXJyb3IKKwk2IHBsdXMgcGFybiBmb28gKGJhcikgYmF6CisJNiBkYXNoIHBhcm4gZm9vIHggYmF6CisJNiBlcWFsIHBhcm4gZm9vIHggYmF6CisJNiBxc3RuIHBhcm4gZm9vIHggYmF6CisJNiBQTFVTIHBhcm4gZm9vIChiYXIpIGJhegorCTYgREFTSCBwYXJuIGZvbyB4IGJhegorCTYgRVFBTCBwYXJuIGZvbyB4IGJhegorCTYgUVNUTiBwYXJuIGZvbyB4IGJhegorCTcgcGx1cyBicmFjIGZvbyAgYyB9IGJhegorCTcgZGFzaCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTcgZXFhbCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6CisJNyBxc3RuIGJyYWMgLT4gZXJyb3IKKwk3IFBMVVMgYnJhYyBmb28gIGMgfSBiYXoKKwk3IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk3IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegorCTcgUVNUTiBicmFjIC0+IGVycm9yCisJOCBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOCBkYXNoIGJyYWMgZm9vICBjIH0gYmF6CisJOCBlcWFsIGJyYWMgZm9vICBjIH0gYmF6CisJOCBxc3RuIGJyYWMgZm9vICBjIH0gYmF6CisJOCBQTFVTIGJyYWMgZm9vICBjIH0gYmF6CisJOCBEQVNIIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOCBFUUFMIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKKwk4IFFTVE4gYnJhYyAtPiBlcnJvcgorCTkgcGx1cyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTkgZGFzaCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBlcWFsIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IHFzdG4gYnJhYyBmb28geCBjIHh9IGJhegorCTkgUExVUyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTkgREFTSCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBFUUFMIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IFFTVE4gYnJhYyBmb28geCBjIHh9IGJhegorLS0tCituYW1lOiBleHBhbmQtdW5nbG9iLXVucQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZWd1bGFyICR7Zm9vK2Jhcn0gY29uc3RydWN0cyBhcmUgcGFyc2VkIGNvcnJlY3RseQorc3RkaW46CisJdT14CisJdGxfbm9ybSgpIHsKKwkJdj0kMgorCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2CisJCShlY2hvICQxIHBsdXMgbm9ybSBmb28gJHt2KydiYXInfSBiYXopCisJCShlY2hvICQxIGRhc2ggbm9ybSBmb28gJHt2LSdiYXInfSBiYXopCisJCShlY2hvICQxIGVxYWwgbm9ybSBmb28gJHt2PSdiYXInfSBiYXopCisJCShlY2hvICQxIHFzdG4gbm9ybSBmb28gJHt2PydiYXInfSBiYXopIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgcXN0biBub3JtIC0+IGVycm9yIgorCQkoZWNobyAkMSBQTFVTIG5vcm0gZm9vICR7djorJ2Jhcid9IGJheikKKwkJKGVjaG8gJDEgREFTSCBub3JtIGZvbyAke3Y6LSdiYXInfSBiYXopCisJCShlY2hvICQxIEVRQUwgbm9ybSBmb28gJHt2Oj0nYmFyJ30gYmF6KQorCQkoZWNobyAkMSBRU1ROIG5vcm0gZm9vICR7djo/J2Jhcid9IGJheikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBRU1ROIG5vcm0gLT4gZXJyb3IiCisJfQorCXRsX3BhcmVuKCkgeworCQl2PSQyCisJCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKKwkJKGVjaG8gJDEgcGx1cyBwYXJuIGZvbyAke3YrXChiYXInKSd9IGJheikKKwkJKGVjaG8gJDEgZGFzaCBwYXJuIGZvbyAke3YtXChiYXInKSd9IGJheikKKwkJKGVjaG8gJDEgZXFhbCBwYXJuIGZvbyAke3Y9XChiYXInKSd9IGJheikKKwkJKGVjaG8gJDEgcXN0biBwYXJuIGZvbyAke3Y/XChiYXInKSd9IGJheikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBxc3RuIHBhcm4gLT4gZXJyb3IiCisJCShlY2hvICQxIFBMVVMgcGFybiBmb28gJHt2OitcKGJhcicpJ30gYmF6KQorCQkoZWNobyAkMSBEQVNIIHBhcm4gZm9vICR7djotXChiYXInKSd9IGJheikKKwkJKGVjaG8gJDEgRVFBTCBwYXJuIGZvbyAke3Y6PVwoYmFyJyknfSBiYXopCisJCShlY2hvICQxIFFTVE4gcGFybiBmb28gJHt2Oj9cKGJhcicpJ30gYmF6KSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIFFTVE4gcGFybiAtPiBlcnJvciIKKwl9CisJdGxfYnJhY2UoKSB7CisJCXY9JDIKKwkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgorCQkoZWNobyAkMSBwbHVzIGJyYWMgZm9vICR7dithJHV7e3tcfWJ9IGMgJHt2K2R7fX0gYmF6KQorCQkoZWNobyAkMSBkYXNoIGJyYWMgZm9vICR7di1hJHV7e3tcfWJ9IGMgJHt2LWR7fX0gYmF6KQorCQkoZWNobyAkMSBlcWFsIGJyYWMgZm9vICR7dj1hJHV7e3tcfWJ9IGMgJHt2PWR7fX0gYmF6KQorCQkoZWNobyAkMSBxc3RuIGJyYWMgZm9vICR7dj9hJHV7e3tcfWJ9IGMgJHt2P2R7fX0gYmF6KSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIHFzdG4gYnJhYyAtPiBlcnJvciIKKwkJKGVjaG8gJDEgUExVUyBicmFjIGZvbyAke3Y6K2EkdXt7e1x9Yn0gYyAke3Y6K2R7fX0gYmF6KQorCQkoZWNobyAkMSBEQVNIIGJyYWMgZm9vICR7djotYSR1e3t7XH1ifSBjICR7djotZHt9fSBiYXopCisJCShlY2hvICQxIEVRQUwgYnJhYyBmb28gJHt2Oj1hJHV7e3tcfWJ9IGMgJHt2Oj1ke319IGJheikKKwkJKGVjaG8gJDEgUVNUTiBicmFjIGZvbyAke3Y6P2EkdXt7e1x9Yn0gYyAke3Y6P2R7fX0gYmF6KSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIFFTVE4gYnJhYyAtPiBlcnJvciIKKwl9CisJdGxfbm9ybSAxIC0KKwl0bF9ub3JtIDIgJycKKwl0bF9ub3JtIDMgeAorCXRsX3BhcmVuIDQgLQorCXRsX3BhcmVuIDUgJycKKwl0bF9wYXJlbiA2IHgKKwl0bF9icmFjZSA3IC0KKwl0bF9icmFjZSA4ICcnCisJdGxfYnJhY2UgOSB4CitleHBlY3RlZC1zdGRvdXQ6CisJMSBwbHVzIG5vcm0gZm9vIGJhegorCTEgZGFzaCBub3JtIGZvbyBiYXIgYmF6CisJMSBlcWFsIG5vcm0gZm9vIGJhciBiYXoKKwkxIHFzdG4gbm9ybSAtPiBlcnJvcgorCTEgUExVUyBub3JtIGZvbyBiYXoKKwkxIERBU0ggbm9ybSBmb28gYmFyIGJhegorCTEgRVFBTCBub3JtIGZvbyBiYXIgYmF6CisJMSBRU1ROIG5vcm0gLT4gZXJyb3IKKwkyIHBsdXMgbm9ybSBmb28gYmFyIGJhegorCTIgZGFzaCBub3JtIGZvbyBiYXoKKwkyIGVxYWwgbm9ybSBmb28gYmF6CisJMiBxc3RuIG5vcm0gZm9vIGJhegorCTIgUExVUyBub3JtIGZvbyBiYXoKKwkyIERBU0ggbm9ybSBmb28gYmFyIGJhegorCTIgRVFBTCBub3JtIGZvbyBiYXIgYmF6CisJMiBRU1ROIG5vcm0gLT4gZXJyb3IKKwkzIHBsdXMgbm9ybSBmb28gYmFyIGJhegorCTMgZGFzaCBub3JtIGZvbyB4IGJhegorCTMgZXFhbCBub3JtIGZvbyB4IGJhegorCTMgcXN0biBub3JtIGZvbyB4IGJhegorCTMgUExVUyBub3JtIGZvbyBiYXIgYmF6CisJMyBEQVNIIG5vcm0gZm9vIHggYmF6CisJMyBFUUFMIG5vcm0gZm9vIHggYmF6CisJMyBRU1ROIG5vcm0gZm9vIHggYmF6CisJNCBwbHVzIHBhcm4gZm9vIGJhegorCTQgZGFzaCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IGVxYWwgcGFybiBmb28gKGJhcikgYmF6CisJNCBxc3RuIHBhcm4gLT4gZXJyb3IKKwk0IFBMVVMgcGFybiBmb28gYmF6CisJNCBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegorCTQgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IFFTVE4gcGFybiAtPiBlcnJvcgorCTUgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKKwk1IGRhc2ggcGFybiBmb28gYmF6CisJNSBlcWFsIHBhcm4gZm9vIGJhegorCTUgcXN0biBwYXJuIGZvbyBiYXoKKwk1IFBMVVMgcGFybiBmb28gYmF6CisJNSBEQVNIIHBhcm4gZm9vIChiYXIpIGJhegorCTUgRVFBTCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk1IFFTVE4gcGFybiAtPiBlcnJvcgorCTYgcGx1cyBwYXJuIGZvbyAoYmFyKSBiYXoKKwk2IGRhc2ggcGFybiBmb28geCBiYXoKKwk2IGVxYWwgcGFybiBmb28geCBiYXoKKwk2IHFzdG4gcGFybiBmb28geCBiYXoKKwk2IFBMVVMgcGFybiBmb28gKGJhcikgYmF6CisJNiBEQVNIIHBhcm4gZm9vIHggYmF6CisJNiBFUUFMIHBhcm4gZm9vIHggYmF6CisJNiBRU1ROIHBhcm4gZm9vIHggYmF6CisJNyBwbHVzIGJyYWMgZm9vIGMgfSBiYXoKKwk3IGRhc2ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk3IGVxYWwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegorCTcgcXN0biBicmFjIC0+IGVycm9yCisJNyBQTFVTIGJyYWMgZm9vIGMgfSBiYXoKKwk3IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk3IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegorCTcgUVNUTiBicmFjIC0+IGVycm9yCisJOCBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOCBkYXNoIGJyYWMgZm9vIGMgfSBiYXoKKwk4IGVxYWwgYnJhYyBmb28gYyB9IGJhegorCTggcXN0biBicmFjIGZvbyBjIH0gYmF6CisJOCBQTFVTIGJyYWMgZm9vIGMgfSBiYXoKKwk4IERBU0ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk4IEVRQUwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegorCTggUVNUTiBicmFjIC0+IGVycm9yCisJOSBwbHVzIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOSBkYXNoIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IGVxYWwgYnJhYyBmb28geCBjIHh9IGJhegorCTkgcXN0biBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBQTFVTIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOSBEQVNIIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IEVRQUwgYnJhYyBmb28geCBjIHh9IGJhegorCTkgUVNUTiBicmFjIGZvbyB4IGMgeH0gYmF6CistLS0KK25hbWU6IGVnbG9iLWJhZC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGdsb2JiaW5nIGlzbid0IGRvbmUgd2hlbiBnbG9iIGhhcyBzeW50YXggZXJyb3IKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN4IgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3oiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYmJjIgorc3RkaW46CisJZWNobyAhKFsqKSoKKwllY2hvICsoYXxiWykqCitleHBlY3RlZC1zdGRvdXQ6CisJIShbKikqCisJKyhhfGJbKSoKKy0tLQorbmFtZTogZWdsb2ItYmFkLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZ2xvYmJpbmcgaXNuJ3QgZG9uZSB3aGVuIGdsb2IgaGFzIHN5bnRheCBlcnJvcgorCShBVCZUIGtzaCBmYWlscyB0aGlzIHRlc3QpCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeCIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN6IgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImJiYyIKK3N0ZGluOgorCWVjaG8gW2EqKF0qKXoKK2V4cGVjdGVkLXN0ZG91dDoKKwlbYSooXSopegorLS0tCituYW1lOiBlZ2xvYi1pbmZpbml0ZS1wbHVzCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHNoZWxsIGRvZXNuJ3QgZ28gaW50byBpbmZpbml0ZSBsb29wIGV4cGFuZGluZyArKC4uLikKKwlleHByZXNzaW9ucy4KK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCit0aW1lLWxpbWl0OiAzCitzdGRpbjoKKwllY2hvICsoKWMKKwllY2hvICsoKXgKKwllY2hvICsoKiljCisJZWNobyArKCopeAorZXhwZWN0ZWQtc3Rkb3V0OgorCSsoKWMKKwkrKCl4CisJYWJjCisJKygqKXgKKy0tLQorbmFtZTogZWdsb2Itc3Vic3QtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBlZ2xvYmJpbmcgaXNuJ3QgZG9uZSBvbiBzdWJzdGl0dXRpb24gcmVzdWx0cworZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKK3N0ZGluOgorCXg9J0AoKiknCisJZWNobyAkeAorZXhwZWN0ZWQtc3Rkb3V0OgorCUAoKikKKy0tLQorbmFtZTogZWdsb2Itbm9tYXRjaC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2gKK3N0ZGluOgorCWVjaG8gMTogbm8tZmlsZSsoYXxiKXN0dWZmCisJZWNobyAyOiBuby1maWxlKyhhKihjKXxiKXN0dWZmCisJZWNobyAzOiBuby1maWxlKygoKChjKSkpfGIpc3R1ZmYKK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiBuby1maWxlKyhhfGIpc3R1ZmYKKwkyOiBuby1maWxlKyhhKihjKXxiKXN0dWZmCisJMzogbm8tZmlsZSsoKCgoYykpKXxiKXN0dWZmCistLS0KK25hbWU6IGVnbG9iLW1hdGNoLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHBhdHRlcm4gbWF0Y2hlcyBjb3JyZWN0bHkKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmQiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWNkIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYWMiCitzdGRpbjoKKwllY2hvIDE6IGErKGJ8YylkCisJZWNobyAyOiBhIShAKGJ8QikpZAorCWVjaG8gMzogKihhKGJ8YykpCQkjICguLi58Li4uKSBjYW4gYmUgdXNlZCB3aXRoaW4gWCguLikKKwllY2hvIDQ6IGFbYiooZm9vfGJhcildZAkJIyBwYXR0ZXJucyBub3Qgc3BlY2lhbCBpbnNpZGUgWy4uLl0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiBhYmQgYWNkCisJMjogYWNkCisJMzogYWJhYworCTQ6IGFiZAorLS0tCituYW1lOiBlZ2xvYi1jYXNlLTEKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSBuZWdhdGlvbiB0ZXN0cworc3RkaW46CisJY2FzZSBmb28gaW4gIShmb298YmFyKSkgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYworCWNhc2UgYmFyIGluICEoZm9vfGJhcikpIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKK2V4cGVjdGVkLXN0ZG91dDoKKwlubworCW5vCistLS0KK25hbWU6IGVnbG9iLWNhc2UtMgorZGVzY3JpcHRpb246CisJU2ltcGxlIGtsZWVuZSB0ZXN0cworc3RkaW46CisJY2FzZSBmb28gaW4gKihhfGJbKSkgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYworCWNhc2UgZm9vIGluICooYXxiWyl8ZiopIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKKwljYXNlICcqKGF8YlspJyBpbiAqKGF8YlspKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCitleHBlY3RlZC1zdGRvdXQ6CisJbm8KKwl5ZXMKKwl5ZXMKKy0tLQorbmFtZTogZWdsb2ItdHJpbS0xCitkZXNjcmlwdGlvbjoKKwlFZ2xvYmJpbmcgaW4gdHJpbSBleHByZXNzaW9ucy4uLgorCShBVCZUIGtzaCBmYWlscyB0aGlzIC0gZG9jcyBzYXkgIyBtYXRjaGVzIHNob3J0ZXN0IHN0cmluZywgIyMgbWF0Y2hlcworCWxvbmdlc3QuLi4pCitzdGRpbjoKKwl4PWFiY2RlZgorCWVjaG8gMTogJHt4I2F8YWJjfQorCWVjaG8gMjogJHt4IyNhfGFiY30KKwllY2hvIDM6ICR7eCVkZWZ8Zn0KKwllY2hvIDQ6ICR7eCUlZnxkZWZ9CitleHBlY3RlZC1zdGRvdXQ6CisJMTogYmNkZWYKKwkyOiBkZWYKKwkzOiBhYmNkZQorCTQ6IGFiYworLS0tCituYW1lOiBlZ2xvYi10cmltLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGVnbG9iYmluZyB3b3JrcyBpbiB0cmltcy4uLgorc3RkaW46CisJeD1hYmNkZWYKKwllY2hvIDE6ICR7eCMqKGF8YiljZH0KKwllY2hvIDI6ICIke3gjKihhfGIpY2R9IgorCWVjaG8gMzogJHt4IyIqKGF8YiljZCJ9CisJZWNobyA0OiAke3gjYShifGMpfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IGVmCisJMjogZWYKKwkzOiBhYmNkZWYKKwk0OiBjZGVmCistLS0KK25hbWU6IGVnbG9iLXN1YnN0cnBsLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGVnbG9iYmluZyB3b3JrcyBpbiBzdWJzdHMuLi4gYW5kIHRoZXkgd29yayBhdCBhbGwKK3N0ZGluOgorCVtbIC1uICRCQVNIX1ZFUlNJT04gXV0gJiYgc2hvcHQgLXMgZXh0Z2xvYgorCXg9MTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwl5PXh5egorCWVjaG8gMTogJHt4LzJ9CisJZWNobyAyOiAke3gvLzJ9CisJZWNobyAzOiAke3gvKygyKX0KKwllY2hvIDQ6ICR7eC8vKygyKX0KKwllY2hvIDU6ICR7eC8yLzR9CisJZWNobyA2OiAke3gvLzIvNH0KKwllY2hvIDc6ICR7eC8rKDIpLzR9CisJZWNobyA4OiAke3gvLysoMikvNH0KKwllY2hvIDk6ICR7eC9iL2MvZS9mfQorCWVjaG8gMTA6ICR7eC9iXC9jL2UvZn0KKwllY2hvIDExOiAke3gvYlwvYy9lXC9mfQorCWVjaG8gMTI6ICR7eC9iXC9jL2VcXC9mfQorCWVjaG8gMTM6ICR7eC9iXFwvYy9lXFwvZn0KKwllY2hvIDE0OiAke3gvL2IvYy9lL2Z9CisJZWNobyAxNTogJHt4Ly9iXC9jL2UvZn0KKwllY2hvIDE2OiAke3gvL2JcL2MvZVwvZn0KKwllY2hvIDE3OiAke3gvL2JcL2MvZVxcL2Z9CisJZWNobyAxODogJHt4Ly9iXFwvYy9lXFwvZn0KKwllY2hvIDE5OiAke3gvYlwvKlwvYy94fQorCWVjaG8gMjA6ICR7eC9cLy8ufQorCWVjaG8gMjE6ICR7eC8vXC8vLn0KKwllY2hvIDIyOiAke3gvLy8ufQorCWVjaG8gMjM6ICR7eC8vIzEvOX0KKwllY2hvIDI0OiAke3gvLyUxLzl9CisJZWNobyAyNTogJHt4Ly9cJTEvOX0KKwllY2hvIDI2OiAke3gvL1xcJTEvOX0KKwllY2hvIDI3OiAke3gvL1xhLzl9CisJZWNobyAyODogJHt4Ly9cXGEvOX0KKwllY2hvIDI5OiAke3gvMi8keX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiAxMjIzMjFfYWIvY2RlX2IvY18xMjIxCisJMjogMTMxX2FiL2NkZV9iL2NfMTEKKwkzOiAxMzIxX2FiL2NkZV9iL2NfMTIyMQorCTQ6IDEzMV9hYi9jZGVfYi9jXzExCisJNTogMTQyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwk2OiAxNDQ0MzQxX2FiL2NkZV9iL2NfMTQ0MQorCTc6IDE0MzIxX2FiL2NkZV9iL2NfMTIyMQorCTg6IDE0MzQxX2FiL2NkZV9iL2NfMTQxCisJOTogMTIyMjMyMV9hYy9lL2YvY2RlX2IvY18xMjIxCisJMTA6IDEyMjIzMjFfYWUvZmRlX2IvY18xMjIxCisJMTE6IDEyMjIzMjFfYWUvZmRlX2IvY18xMjIxCisJMTI6IDEyMjIzMjFfYWVcL2ZkZV9iL2NfMTIyMQorCTEzOiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCTE0OiAxMjIyMzIxX2FjL2UvZi9jZGVfYy9lL2YvY18xMjIxCisJMTU6IDEyMjIzMjFfYWUvZmRlX2UvZl8xMjIxCisJMTY6IDEyMjIzMjFfYWUvZmRlX2UvZl8xMjIxCisJMTc6IDEyMjIzMjFfYWVcL2ZkZV9lXC9mXzEyMjEKKwkxODogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwkxOTogMTIyMjMyMV9heF8xMjIxCisJMjA6IDEyMjIzMjFfYWIuY2RlX2IvY18xMjIxCisJMjE6IDEyMjIzMjFfYWIuY2RlX2IuY18xMjIxCisJMjI6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCisJMjM6IDkyMjIzMjFfYWIvY2RlX2IvY18xMjIxCisJMjQ6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjI5CisJMjU6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjI5CisJMjY6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCisJMjc6IDEyMjIzMjFfOWIvY2RlX2IvY18xMjIxCisJMjg6IDEyMjIzMjFfOWIvY2RlX2IvY18xMjIxCisJMjk6IDF4eXoyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKy0tLQorbmFtZTogZWdsb2Itc3Vic3RycGwtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgYW5jaG9yZWQgc3Vic3RyaW5nIHJlcGxhY2VtZW50IHdvcmtzLCBjb3JuZXIgY2FzZXMKK3N0ZGluOgorCWZvbz0xMjMKKwllY2hvIDE6ICR7Zm9vLyMveH0KKwllY2hvIDI6ICR7Zm9vLyUveH0KKwllY2hvIDM6ICR7Zm9vLyMvfQorCWVjaG8gNDogJHtmb28vI30KKwllY2hvIDU6ICR7Zm9vLyUvfQorCWVjaG8gNjogJHtmb28vJX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiB4MTIzCisJMjogMTIzeAorCTM6IDEyMworCTQ6IDEyMworCTU6IDEyMworCTY6IDEyMworLS0tCituYW1lOiBlZ2xvYi1zdWJzdHJwbC0zYQorZGVzY3JpcHRpb246CisJQ2hlY2sgc3Vic3RyaW5nIHJlcGxhY2VtZW50IHdvcmtzIHdpdGggdmFyaWFibGVzIGFuZCBzbGFzaGVzLCB0b28KK3N0ZGluOgorCXBmeD0vaG9tZS91c2VyCisJd2Q9L2hvbWUvdXNlci90bXAKKwllY2hvICIke3dkLyMkcGZ4L359IgorCWVjaG8gIiR7d2QvI1wkcGZ4L359IgorCWVjaG8gIiR7d2QvIyIkcGZ4Ii9+fSIKKwllY2hvICIke3dkLyMnJHBmeCcvfn0iCisJZWNobyAiJHt3ZC8jIlwkcGZ4Ii9+fSIKKwllY2hvICIke3dkLyMnXCRwZngnL359IgorZXhwZWN0ZWQtc3Rkb3V0OgorCX4vdG1wCisJL2hvbWUvdXNlci90bXAKKwl+L3RtcAorCS9ob21lL3VzZXIvdG1wCisJL2hvbWUvdXNlci90bXAKKwkvaG9tZS91c2VyL3RtcAorLS0tCituYW1lOiBlZ2xvYi1zdWJzdHJwbC0zYgorZGVzY3JpcHRpb246CisJTW9yZSBvZiB0aGlzLCBiYXNoIGZhaWxzIGl0IChiYXNoNCBwYXNzZXMpCitzdGRpbjoKKwlwZng9L2hvbWUvdXNlcgorCXdkPS9ob21lL3VzZXIvdG1wCisJZWNobyAiJHt3ZC8jJChlY2hvIC9ob21lL3VzZXIpL359IgorCWVjaG8gIiR7d2QvIyIkKGVjaG8gL2hvbWUvdXNlcikiL359IgorCWVjaG8gIiR7d2QvIyckKGVjaG8gL2hvbWUvdXNlciknL359IgorZXhwZWN0ZWQtc3Rkb3V0OgorCX4vdG1wCisJfi90bXAKKwkvaG9tZS91c2VyL3RtcAorLS0tCituYW1lOiBlZ2xvYi1zdWJzdHJwbC0zYworZGVzY3JpcHRpb246CisJRXZlbiBtb3JlIHdlaXJkIGNhc2VzCitzdGRpbjoKKwlwZng9L2hvbWUvdXNlcgorCXdkPSckcGZ4L3RtcCcKKwllY2hvIDE6ICR7d2QvIyRwZngvfn0KKwllY2hvIDI6ICR7d2QvI1wkcGZ4L359CisJZWNobyAzOiAke3dkLyMiJHBmeCIvfn0KKwllY2hvIDQ6ICR7d2QvIyckcGZ4Jy9+fQorCWVjaG8gNTogJHt3ZC8jIlwkcGZ4Ii9+fQorCWVjaG8gNjogJHt3ZC8jJ1wkcGZ4Jy9+fQorCXRzPSdhL2JhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCknCisJdHA9YS9iCisJdHI9Yy9kCisJW1sgLW4gJEJBU0hfVkVSU0lPTiBdXSAmJiBzaG9wdCAtcyBleHRnbG9iCisJZWNobyA3OiAke3RzL2FcL2IvJHRyfQorCWVjaG8gODogJHt0cy9hXC9iL1wkdHJ9CisJZWNobyA5OiAke3RzLyR0cC8kdHJ9CisJZWNobyAxMDogJHt0cy9cJHRwLyR0cn0KKwllY2hvIDExOiAke3RzL1xcJHRwLyR0cn0KKwllY2hvIDEyOiAke3RzLyR0cC9jL2R9CisJZWNobyAxMzogJHt0cy8kdHAvY1wvZH0KKwllY2hvIDE0OiAke3RzLyR0cC9jXFwvZH0KKwllY2hvIDE1OiAke3RzLysoYVwvYikvJHRyfQorCWVjaG8gMTY6ICR7dHMvKyhhXC9iKS9cJHRyfQorCWVjaG8gMTc6ICR7dHMvKygkdHApLyR0cn0KKwllY2hvIDE4OiAke3RzLysoJHRwKS9jL2R9CisJZWNobyAxOTogJHt0cy8rKCR0cCkvY1wvZH0KKwllY2hvIDI1OiAke3RzLy9hXC9iLyR0cn0KKwllY2hvIDI2OiAke3RzLy9hXC9iL1wkdHJ9CisJZWNobyAyNzogJHt0cy8vJHRwLyR0cn0KKwllY2hvIDI4OiAke3RzLy8kdHAvYy9kfQorCWVjaG8gMjk6ICR7dHMvLyR0cC9jXC9kfQorCWVjaG8gMzA6ICR7dHMvLysoYVwvYikvJHRyfQorCWVjaG8gMzE6ICR7dHMvLysoYVwvYikvXCR0cn0KKwllY2hvIDMyOiAke3RzLy8rKCR0cCkvJHRyfQorCWVjaG8gMzM6ICR7dHMvLysoJHRwKS9jL2R9CisJZWNobyAzNDogJHt0cy8vKygkdHApL2NcL2R9CisJdHA9IisoJHRwKSIKKwllY2hvIDQwOiAke3RzLyR0cC8kdHJ9CisJZWNobyA0MTogJHt0cy8vJHRwLyR0cn0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiAkcGZ4L3RtcAorCTI6IH4vdG1wCisJMzogJHBmeC90bXAKKwk0OiB+L3RtcAorCTU6IH4vdG1wCisJNjogfi90bXAKKwk3OiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwk4OiAkdHJhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwk5OiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxMDogYS9iYS9iYy9kJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTE6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTEyOiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxMzogYy9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTQ6IGNcL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxNTogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTY6ICR0ciR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTE3OiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxODogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTk6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTI1OiBjL2RjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwkyNjogJHRyJHRyJHRwJHRwXyR0ciR0cF8qKCR0cilfKigkdHApCisJMjc6IGMvZGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTI4OiBjL2RjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwkyOTogYy9kYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJMzA6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTMxOiAkdHIkdHAkdHBfJHRyJHRwXyooJHRyKV8qKCR0cCkKKwkzMjogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJMzM6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTM0OiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwk0MDogYS9iYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJNDE6IGEvYmEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorIwlUaGlzIGlzIHdoYXQgR05VIGJhc2ggZG9lczoKKyMJNDA6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorIwk0MTogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCistLS0KK25hbWU6IGVnbG9iLXV0ZjgtMQorZGVzY3JpcHRpb246CisJVVRGLTggbW9kZSBkaWZmZXJlbmNlcyBmb3IgZWdsb2JiaW5nCitzdGRpbjoKKwlzPWJsw7ZkCisJc2V0ICtVCisJcHJpbnQgMTogJHtzJT8/P30gLgorCXByaW50IDI6ICR7cy9iPz8/ZC94fSAuCisJc2V0IC1VCisJcHJpbnQgMzogJHtzJT8/P30gLgorCXByaW50IDQ6ICR7cy9iPz9kL3h9IC4KKwl4PW7DtgorCXByaW50IDU6ICR7eCU/fSAke3glJT99IC4KKwl4PcOkaAorCXByaW50IDY6ICR7eCM/fSAke3gjIz99IC4KKwl4PYGCCisJcHJpbnQgNzogJHt4JT99ICR7eCUlP30gLgorCXg9bcOkgAorCXByaW50IDg6ICR7eCU/fSAke3glJT99IC4KKwl4PeS9lQorCXByaW50IDk6ICR7eCU/fSAke3glJT99IC4KK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiBibCAuCisJMjogeCAuCisJMzogYiAuCisJNDogeCAuCisJNTogbiBuIC4KKwk2OiBoIGggLgorCTc6IIEggSAuCisJODogbcOkIG3DpCAuCisJOTogLgorLS0tCituYW1lOiBnbG9iLWJhZC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGdsb2JiaW5nIGlzbid0IGRvbmUgd2hlbiBnbG9iIGhhcyBzeW50YXggZXJyb3IKK2ZpbGUtc2V0dXA6IGRpciA3NTUgIlt4IgorZmlsZS1zZXR1cDogZmlsZSA2NDQgIlt4L2ZvbyIKK3N0ZGluOgorCWVjaG8gWyoKKwllY2hvICpbeAorCWVjaG8gW3gvKgorZXhwZWN0ZWQtc3Rkb3V0OgorCVsqCisJKlt4CisJW3gvZm9vCistLS0KK25hbWU6IGdsb2ItYmFkLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc3ltYm9saWMgbGlua3MgYXJlbid0IHN0YXQoKSdkCitmaWxlLXNldHVwOiBkaXIgNzU1ICJkaXIiCitmaWxlLXNldHVwOiBzeW1saW5rIDY0NCAiZGlyL2FiYyIKKwlub24tZXhpc3RlbnQtZmlsZQorc3RkaW46CisJZWNobyBkKi8qCisJZWNobyBkKi9hYmMKK2V4cGVjdGVkLXN0ZG91dDoKKwlkaXIvYWJjCisJZGlyL2FiYworLS0tCituYW1lOiBnbG9iLXJhbmdlLTEKK2Rlc2NyaXB0aW9uOgorCVRlc3QgcmFuZ2UgbWF0Y2hpbmcKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIuYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImJiYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJjYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiLWJjIgorc3RkaW46CisJZWNobyBbYWItXSoKKwllY2hvIFstYWJdKgorCWVjaG8gWyEtYWJdKgorCWVjaG8gWyFhYl0qCisJZWNobyBbXWFiXSoKK2V4cGVjdGVkLXN0ZG91dDoKKwktYmMgYWJjIGJiYworCS1iYyBhYmMgYmJjCisJY2JjCisJLWJjIGNiYworCWFiYyBiYmMKKy0tLQorbmFtZTogZ2xvYi1yYW5nZS0yCitkZXNjcmlwdGlvbjoKKwlUZXN0IHJhbmdlIG1hdGNoaW5nCisJKEFUJlQga3NoIGZhaWxzIHRoaXM7IFBPU0lYIHNheXMgaW52YWxpZCkKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCitzdGRpbjoKKwllY2hvIFthLS1dKgorZXhwZWN0ZWQtc3Rkb3V0OgorCVthLS1dKgorLS0tCituYW1lOiBnbG9iLXJhbmdlLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZ2xvYmJpbmcgbWF0Y2hlcyB0aGUgcmlnaHQgdGhpbmdzLi4uCisjIGJyZWFrcyBvbiBNYWMgT1NYIChIRlMrIG5vbi1zdGFuZGFyZCBVbmljb2RlIGNhbm9uaWNhbCBkZWNvbXBvc2l0aW9uKQorY2F0ZWdvcnk6ICFvczpkYXJ3aW4KK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhwmMiCitzdGRpbjoKKwllY2hvIGFbwS3aXSoKK2V4cGVjdGVkLXN0ZG91dDoKKwlhwmMKKy0tLQorbmFtZTogZ2xvYi1yYW5nZS00CitkZXNjcmlwdGlvbjoKKwlSZXN1bHRzIHVuc3BlY2lmaWVkIGFjY29yZGluZyB0byBQT1NJWAorZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5iYyIKK3N0ZGluOgorCWVjaG8gW2EuXSoKK2V4cGVjdGVkLXN0ZG91dDoKKwlbYS5dKgorLS0tCituYW1lOiBnbG9iLXJhbmdlLTUKK2Rlc2NyaXB0aW9uOgorCVJlc3VsdHMgdW5zcGVjaWZpZWQgYWNjb3JkaW5nIHRvIFBPU0lYCisJKEFUJlQga3NoIHRyZWF0cyB0aGlzIGxpa2UgW2EtY2MtZV0qKQorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJiYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiY2JjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImRiYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJlYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiLWJjIgorc3RkaW46CisJZWNobyBbYS1jLWVdKgorZXhwZWN0ZWQtc3Rkb3V0OgorCS1iYyBhYmMgYmJjIGNiYyBlYmMKKy0tLQorbmFtZTogaGVyZWRvYy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBvcmRlcmluZy9jb250ZW50IG9mIHJlZHVuZGVudCBoZXJlIGRvY3VtZW50cy4KK3N0ZGluOgorCWNhdCA8PCBFT0YxIDw8IEVPRjIKKwloaQorCUVPRjEKKwl0aGVyZQorCUVPRjIKK2V4cGVjdGVkLXN0ZG91dDoKKwl0aGVyZQorLS0tCituYW1lOiBoZXJlZG9jLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHF1b3RlZCBoZXJlLWRvYyBpcyBwcm90ZWN0ZWQuCitzdGRpbjoKKwlhPWZvbworCWNhdCA8PCAnRU9GJworCWhpXAorCXRoZXJlJGEKKwlzdHVmZgorCUVPXAorCUYKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwloaVwKKwl0aGVyZSRhCisJc3R1ZmYKKwlFT1wKKwlGCistLS0KK25hbWU6IGhlcmVkb2MtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBuZXdsaW5lIGlzbid0IG5lZWRlZCBhZnRlciBoZXJlZG9jLWRlbGltaXRlciBtYXJrZXIuCitzdGRpbjogIQorCWNhdCA8PCBFT0YKKwloaQorCXRoZXJlCisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwl0aGVyZQorLS0tCituYW1lOiBoZXJlZG9jLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYW4gZXJyb3Igb2NjdXJzIGlmIHRoZSBoZXJlZG9jLWRlbGltaXRlciBpcyBtaXNzaW5nLgorc3RkaW46ICEKKwljYXQgPDwgRU9GCisJaGkKKwl0aGVyZQorZXhwZWN0ZWQtZXhpdDogZSA+IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLiovCistLS0KK25hbWU6IGhlcmVkb2MtNQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBiYWNrc2xhc2ggcXVvdGVzIGEgJCwgYCBhbmQgXCBhbmQga2lsbHMgYSBcbmV3bGluZQorc3RkaW46CisJYT1CQUQKKwliPW9rCisJY2F0IDw8IEVPRgorCWhcJHthfWkKKwloXFwke2J9aQorCXRoXGBlY2hvIG5vdC1ydW5cYGVyZQorCXRoXFxgZWNobyBpcy1ydW5gZXJlCisJZm9sXFxrcworCW1vcmVcXAorCWxhc3QgXAorCWxpbmUKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwloJHthfWkKKwloXG9raQorCXRoYGVjaG8gbm90LXJ1bmBlcmUKKwl0aFxpcy1ydW5lcmUKKwlmb2xca3MKKwltb3JlXAorCWxhc3QgbGluZQorLS0tCituYW1lOiBoZXJlZG9jLTYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaW4gaW5pdGlhbCBoZXJlLWRlbGltIHdvcmQgZG9lc24ndCBpbXBseQorCWEgcXVvdGVkIGhlcmUtZG9jLgorc3RkaW46CisJYT1pCisJY2F0IDw8IEVPXAorCUYKKwloJGEKKwl0aGVyZQorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJdGhlcmUKKy0tLQorbmFtZTogaGVyZWRvYy03CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGRvdWJsZSBxdW90ZWQgJCBleHByZXNzaW9ucyBpbiBoZXJlIGRlbGltaXRlcnMgYXJlCisJbm90IGV4cGFuZGVkIGFuZCBtYXRjaCB0aGUgZGVsaW1pdGVyLgorCVBPU0lYIHNheXMgb25seSBxdW90ZSByZW1vdmFsIGlzIGFwcGxpZWQgdG8gdGhlIGRlbGltaXRlci4KK3N0ZGluOgorCWE9YgorCWNhdCA8PCAiRSRhIgorCWhpCisJaCRhCisJaGIKKwlFJGEKKwllY2hvIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWgkYQorCWhiCisJZG9uZQorLS0tCituYW1lOiBoZXJlZG9jLTgKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZG91YmxlIHF1b3RlZCBlc2NhcGVkICQgZXhwcmVzc2lvbnMgaW4gaGVyZQorCWRlbGltaXRlcnMgYXJlIG5vdCBleHBhbmRlZCBhbmQgbWF0Y2ggdGhlIGRlbGltaXRlci4KKwlQT1NJWCBzYXlzIG9ubHkgcXVvdGUgcmVtb3ZhbCBpcyBhcHBsaWVkIHRvIHRoZSBkZWxpbWl0ZXIKKwkoXCBjb3VudHMgYXMgYSBxdW90ZSkuCitzdGRpbjoKKwlhPWIKKwljYXQgPDwgIkVcJGEiCisJaGkKKwloJGEKKwloXCRhCisJaGIKKwloXGIKKwlFJGEKKwllY2hvIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWgkYQorCWhcJGEKKwloYgorCWhcYgorCWRvbmUKKy0tLQorbmFtZTogaGVyZWRvYy05YQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlIHN0cmluZ3Mgd29yay4KK3N0ZGluOgorCWJhcj0iYmFyCisJCWJheiIKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDxmb28KKwkiJF9fcHJvZ25hbWUiIC1jICJ0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDxmb28iCisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8IiRiYXIiCisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8JyRiYXInCisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8XCRiYXIKKwl0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbSA8PDwtZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJc2JiCisJc2JiCisJb25lCisJCW9ubQorCSRvbmUKKwkkb25lCisJLXNiYgorLS0tCituYW1lOiBoZXJlZG9jLTliCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGEgY29ybmVyIGNhc2Ugb2YgaGVyZSBzdHJpbmdzIHdvcmtzIGxpa2UgYmFzaAorc3RkaW46CisJZm5vcmQ9NDIKKwliYXI9ImJhcgorCQkgXCRmbm9yZCBiYXoiCisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8JGJhcgorZXhwZWN0ZWQtc3Rkb3V0OgorCW9uZSAkc2FiZXEgb25tCitjYXRlZ29yeTogYmFzaAorLS0tCituYW1lOiBoZXJlZG9jLTljCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGEgY29ybmVyIGNhc2Ugb2YgaGVyZSBzdHJpbmdzIHdvcmtzIGxpa2Uga3NoOTMsIHpzaAorc3RkaW46CisJZm5vcmQ9NDIKKwliYXI9ImJhcgorCQkgXCRmbm9yZCBiYXoiCisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8JGJhcgorZXhwZWN0ZWQtc3Rkb3V0OgorCW9uZQorCQkgJHNhYmVxIG9ubQorLS0tCituYW1lOiBoZXJlZG9jLTlkCitkZXNjcmlwdGlvbjoKKwlDaGVjayBhbm90aGVyIGNvcm5lciBjYXNlIG9mIGhlcmUgc3RyaW5ncworc3RkaW46CisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8IGJhcgorZXhwZWN0ZWQtc3Rkb3V0OgorCW9uZQorLS0tCituYW1lOiBoZXJlZG9jLXF1b3RpbmctdW5zdWJzdAorZGVzY3JpcHRpb246CisJQ2hlY2sgZm9yIGNvcnJlY3QgaGFuZGxpbmcgb2YgcXVvdGVkIGNoYXJhY3RlcnMgaW4KKwloZXJlIGRvY3VtZW50cyB3aXRob3V0IHN1YnN0aXR1dGlvbiAobWFya2VyIGlzIHF1b3RlZCkuCitzdGRpbjoKKwlmb289YmFyCisJY2F0IDw8LSdFT0YnCisJCXggIiBcIiBcIFxcICQgXCQgYGVjaG8gYmF6YCBcYGVjaG8gYmF6XGAgJGZvbyBcJGZvbyB4CisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJeCAiIFwiIFwgXFwgJCBcJCBgZWNobyBiYXpgIFxgZWNobyBiYXpcYCAkZm9vIFwkZm9vIHgKKy0tLQorbmFtZTogaGVyZWRvYy1xdW90aW5nLXN1YnN0CitkZXNjcmlwdGlvbjoKKwlDaGVjayBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiBxdW90ZWQgY2hhcmFjdGVycyBpbgorCWhlcmUgZG9jdW1lbnRzIHdpdGggc3Vic3RpdHV0aW9uIChtYXJrZXIgaXMgbm90IHF1b3RlZCkuCitzdGRpbjoKKwlmb289YmFyCisJY2F0IDw8LUVPRgorCQl4ICIgXCIgXCBcXCAkIFwkIGBlY2hvIGJhemAgXGBlY2hvIGJhelxgICRmb28gXCRmb28geAorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCXggIiBcIiBcIFwgJCAkIGJheiBgZWNobyBiYXpgIGJhciAkZm9vIHgKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgorCUhlcmVkb2MgaW4gc2ltcGxlIGNvbW1hbmQuCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCWV2YWwgJworCQljYXQgPDwtIEVPRgorCQloaQorCQlFT0YKKwkJZm9yIGkgaW4gYSBiIDsgZG8KKwkJCWNhdCA8PC0gRU9GCisJCQltb3JlCisJCQlFT0YKKwkJZG9uZQorCSAgICAnICYKKwlzbGVlcCAxCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwltb3JlCisJbW9yZQorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgorCUhlcmVkb2MgaW4gZnVuY3Rpb24sIG11bHRpcGxlIGNhbGxzIHRvIGZ1bmN0aW9uLgorc3RkaW46CisJVE1QRElSPSRQV0QKKwlldmFsICcKKwkJZm9vKCkgeworCQkJY2F0IDw8LSBFT0YKKwkJCWhpCisJCQlFT0YKKwkJfQorCQlmb28KKwkJZm9vCisJICAgICcgJgorCXNsZWVwIDEKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWhpCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCisJSGVyZWRvYyBpbiBmdW5jdGlvbiBpbiBsb29wLCBtdWx0aXBsZSBjYWxscyB0byBmdW5jdGlvbi4KK3N0ZGluOgorCVRNUERJUj0kUFdECisJZXZhbCAnCisJCWZvbygpIHsKKwkJCWNhdCA8PC0gRU9GCisJCQloaQorCQkJRU9GCisJCX0KKwkJZm9yIGkgaW4gYSBiOyBkbworCQkJZm9vCisJCQlmb28oKSB7CisJCQkJY2F0IDw8LSBFT0YKKwkJCQlmb2xrcyAkaQorCQkJCUVPRgorCQkJfQorCQlkb25lCisJCWZvbworCSAgICAnICYKKwlzbGVlcCAxCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwlmb2xrcyBiCisJZm9sa3MgYgorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgorCUJhY2tncm91bmRlZCBzaW1wbGUgY29tbWFuZCB3aXRoIGhlcmUgZG9jCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCWV2YWwgJworCQljYXQgPDwtIEVPRiAmCisJCWhpCisJCUVPRgorCSAgICAnICYKKwlzbGVlcCAxCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS01CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KKwlCYWNrZ3JvdW5kZWQgc3Vic2hlbGwgY29tbWFuZCB3aXRoIGhlcmUgZG9jCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCWV2YWwgJworCSAgICAgICgKKwkJc2xlZXAgMQkjIHNvIHBhcmVudCBleGl0cworCQllY2hvIEEKKwkJY2F0IDw8LSBFT0YKKwkJaGkKKwkJRU9GCisJCWVjaG8gQgorCSAgICAgICkgJgorCSAgICAnICYKKwlzbGVlcCAyCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJQQorCWhpCisJQgorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgorCUhlcmVkb2MgaW4gcGlwZWxpbmUuCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCWV2YWwgJworCQljYXQgPDwtIEVPRiB8IHNlZCAicy9oaS9ISS8iCisJCWhpCisJCUVPRgorCSAgICAnICYKKwlzbGVlcCAxCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJSEkKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS03CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KKwlIZXJlZG9jIGluIGJhY2tncm91bmRlZCBwaXBlbGluZS4KK3N0ZGluOgorCVRNUERJUj0kUFdECisJZXZhbCAnCisJCWNhdCA8PC0gRU9GIHwgc2VkICdzL2hpL0hJLycgJgorCQloaQorCQlFT0YKKwkgICAgJyAmCisJc2xlZXAgMQorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCUhJCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtOAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vCisJbGF0ZS4gSGVyZWRvYyBpbiBmdW5jdGlvbiwgYmFja2dyb3VuZGVkIGNhbGwgdG8gZnVuY3Rpb24uCisJVGhpcyBjaGVjayBjYW4gZmFpbCBvbiBzbG93IG1hY2hpbmVzICg8MTAwIE1IeiksIG9yIEN5Z3dpbiwKKwl0aGF0J3Mgbm9ybWFsLgorc3RkaW46CisJVE1QRElSPSRQV0QKKwkjIEJhY2tncm91bmQgZXZhbCBzbyBtYWluIHNoZWxsIGRvZXNuJ3QgZG8gcGFyc2luZworCWV2YWwgJworCQlmb28oKSB7CisJCQljYXQgPDwtIEVPRgorCQkJaGkKKwkJCUVPRgorCQl9CisJCWZvbworCQkjIHNsZWVwIHNvIGV2YWwgY2FuIGRpZQorCQkoc2xlZXAgMTsgZm9vKSAmCisJCShzbGVlcCAxOyBmb28pICYKKwkJZm9vCisJICAgICcgJgorCXNsZWVwIDIKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWhpCisJaGkKKwloaQorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGlzdG9yeS1iYXNpYworZGVzY3JpcHRpb246CisJU2VlIGlmIHdlIGNhbiB0ZXN0IGhpc3RvcnkgYXQgYWxsCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGhpCisJZmMgLWwKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCTEJZWNobyBoaQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZHVwcworZGVzY3JpcHRpb246CisJVmVyaWZ5IGR1cGxpY2F0ZXMgYW5kIHNwYWNlcyBhcmUgbm90IGVudGVyZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gaGkKKwkgZWNobyB5bworCWVjaG8gaGkKKwlmYyAtbAorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJeW8KKwloaQorCTEJZWNobyBoaQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktdW5saW5rCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBicm9rZW4gSElTVEZJTEVzIGRvIG5vdCBjYXVzZSB0cm91YmxlCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1mb28vaGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorZmlsZS1zZXR1cDogZGlyIDc1NSAiZm9vIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImZvby9oaXN0LmZpbGUiCisJc29tZXRleHQKK3RpbWUtbGltaXQ6IDUKK3Blcmwtc2V0dXA6IGNobW9kKDA1NTUsICJmb28iKTsKK3N0ZGluOgorCWVjaG8gaGkKKwlmYyAtbAorCWNobW9kIDA3NTUgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwkxCWVjaG8gaGkKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8oLipjYW5ub3QgdW5saW5rIEhJU1RGSUxFLipcbik/WCokLworLS0tCituYW1lOiBoaXN0b3J5LWUtbWludXMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgbW9yZSByZWNlbnQgY29tbWFuZCBpcyBleGVjdXRlZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBoaQorCWVjaG8gdGhlcmUKKwlmYyAtZSAtCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwl0aGVyZQorCXRoZXJlCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyB0aGVyZVxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWUtbWludXMtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZXBlYXRlZCBjb21tYW5kIGlzIHByaW50ZWQgYmVmb3JlIGNvbW1hbmQKKwlpcyByZS1leGVjdXRlZC4KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWV4ZWMgMj4mMQorCWVjaG8gaGkKKwllY2hvIHRoZXJlCisJZmMgLWUgLQorZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm46CisJL1gqaGlcblgqdGhlcmVcblgqZWNobyB0aGVyZVxudGhlcmVcblgqLworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZS1taW51cy0zCitkZXNjcmlwdGlvbjoKKwlmYyAtZSAtIGZhaWxzIHdoZW4gdGhlcmUgaXMgbm8gaGlzdG9yeQorCShrc2g5MyBoYXMgYSBidWcgdGhhdCBjYXVzZXMgdGhpcyB0byBmYWlsKQorCShrc2g4OCBsb29wcyBvbiB0aGlzKQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZmMgLWUgLQorCWVjaG8gb2sKK2V4cGVjdGVkLXN0ZG91dDoKKwlvaworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKi4qOi4qaGlzdG9yeS4qXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZS1taW51cy00CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiAiZmMgLWUgLSIgY29tbWFuZCBvdXRwdXQgZ29lcyB0byBzdGRvdXQuCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYworCWZjIC1lIC0gfCAocmVhZCB4OyBlY2hvICJBICR4IikKKwllY2hvIG9rCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjCisJQSBhYmMKKwlvaworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gYWJjXG5YKi8KKy0tLQorbmFtZTogaGlzdG9yeS1lLW1pbnVzLTUKK2Rlc2NyaXB0aW9uOgorCWZjIGlzIHJlcGxhY2VkIGluIGhpc3RvcnkgYnkgbmV3IGNvbW1hbmQuCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwllY2hvIGdoaSBqa2wKKwk6CisJZmMgLWUgLSBlY2hvCisJZmMgLWwgMiA1CitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCWdoaSBqa2wKKwlnaGkgamtsCisJMgllY2hvIGdoaSBqa2wKKwkzCToKKwk0CWVjaG8gZ2hpIGprbAorCTUJZmMgLWwgMiA1CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBnaGkgamtsXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC0xCitkZXNjcmlwdGlvbjoKKwlMaXN0IGxpc3RzIGNvcnJlY3QgcmFuZ2UKKwkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZmMgLWwgLS0gLTIKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwkyCWVjaG8gbGluZSAyCisJMwllY2hvIGxpbmUgMworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC0yCitkZXNjcmlwdGlvbjoKKwlMaXN0cyBvbGRlc3QgaGlzdG9yeSBpZiBnaXZlbiBwcmUtaGlzdG9yaWMgbnVtYmVyCisJKGtzaDkzIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyB0aGlzIHRvIGZhaWwpCisJKGtzaDg4IGZhaWxzICdjYXVzZSBpdCBsaXN0cyB0aGUgZmMgY29tbWFuZCkKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWZjIC1sIC0tIC00MAorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCTEJZWNobyBsaW5lIDEKKwkyCWVjaG8gbGluZSAyCisJMwllY2hvIGxpbmUgMworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC0zCitkZXNjcmlwdGlvbjoKKwlDYW4gZ2l2ZSBudW1iZXIgJ29wdGlvbnMnIHRvIGZjCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWZjIC1sIC0zIC0yCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJMgllY2hvIGxpbmUgMgorCTMJZWNobyBsaW5lIDMKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3QtNAorZGVzY3JpcHRpb246CisJLTEgcmVmZXJzIHRvIHByZXZpb3VzIGNvbW1hbmQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZmMgLWwgLTEgLTEKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwk0CWVjaG8gbGluZSA0CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LTUKK2Rlc2NyaXB0aW9uOgorCUxpc3QgY29tbWFuZCBzdGF5cyBpbiBoaXN0b3J5Cithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWZjIC1sIC0xIC0xCisJZmMgLWwgLTIgLTEKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwk0CWVjaG8gbGluZSA0CisJNAllY2hvIGxpbmUgNAorCTUJZmMgLWwgLTEgLTEKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3QtNgorZGVzY3JpcHRpb246CisJSElTVFNJWkUgbGltaXRzIGFib3V0IG9mIGhpc3Rvcnkga2VwdC4KKwkoa3NoODggZmFpbHMgJ2NhdXNlIGl0IGxpc3RzIHRoZSBmYyBjb21tYW5kKQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIUhJU1RTSVpFPTMhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWVjaG8gbGluZSA1CisJZmMgLWwKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwlsaW5lIDUKKwk0CWVjaG8gbGluZSA0CisJNQllY2hvIGxpbmUgNQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC03CitkZXNjcmlwdGlvbjoKKwlmYyBhbGxvd3MgdG9vIG9sZC9uZXcgZXJyb3JzIGluIHJhbmdlIHNwZWNpZmljYXRpb24KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSFISVNUU0laRT0zIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwllY2hvIGxpbmUgNQorCWZjIC1sIDEgMzAKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwlsaW5lIDUKKwk0CWVjaG8gbGluZSA0CisJNQllY2hvIGxpbmUgNQorCTYJZmMgLWwgMSAzMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC1yLTEKK2Rlc2NyaXB0aW9uOgorCXRlc3QgLXIgZmxhZyBpbiBoaXN0b3J5Cithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWVjaG8gbGluZSA1CisJZmMgLWwgLXIgMiA0CitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJbGluZSA1CisJNAllY2hvIGxpbmUgNAorCTMJZWNobyBsaW5lIDMKKwkyCWVjaG8gbGluZSAyCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LXItMgorZGVzY3JpcHRpb246CisJSWYgZmlyc3QgaXMgbmV3ZXIgdGhhbiBsYXN0LCAtciBpcyBpbXBsaWVkLgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwllY2hvIGxpbmUgNQorCWZjIC1sIDQgMgorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCWxpbmUgNQorCTQJZWNobyBsaW5lIDQKKwkzCWVjaG8gbGluZSAzCisJMgllY2hvIGxpbmUgMgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC1yLTMKK2Rlc2NyaXB0aW9uOgorCUlmIGZpcnN0IGlzIG5ld2VyIHRoYW4gbGFzdCwgLXIgaXMgY2FuY2VsbGVkLgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwllY2hvIGxpbmUgNQorCWZjIC1sIC1yIDQgMgorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCWxpbmUgNQorCTIJZWNobyBsaW5lIDIKKwkzCWVjaG8gbGluZSAzCisJNAllY2hvIGxpbmUgNAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3Rvcnktc3Vic3QtMQorZGVzY3JpcHRpb246CisJQmFzaWMgc3Vic3RpdHV0aW9uCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwllY2hvIGdoaSBqa2wKKwlmYyAtZSAtIGFiYz1BQiAnZWNobyBhJworZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwlnaGkgamtsCisJQUIgZGVmCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBBQiBkZWZcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1zdWJzdC0yCitkZXNjcmlwdGlvbjoKKwlEb2VzIHN1YnN0IGZpbmQgcHJldmlvdXMgY29tbWFuZD8KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWVjaG8gZ2hpIGprbAorCWZjIC1lIC0gamtsPVhZWlFSVCAnZWNobyBnJworZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwlnaGkgamtsCisJZ2hpIFhZWlFSVAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gZ2hpIFhZWlFSVFxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LXN1YnN0LTMKK2Rlc2NyaXB0aW9uOgorCURvZXMgc3Vic3QgZmluZCBwcmV2aW91cyBjb21tYW5kIHdoZW4gbm8gYXJndW1lbnRzIGdpdmVuCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwllY2hvIGdoaSBqa2wKKwlmYyAtZSAtIGprbD1YWVpRUlQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJZ2hpIGprbAorCWdoaSBYWVpRUlQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIGdoaSBYWVpRUlRcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1zdWJzdC00CitkZXNjcmlwdGlvbjoKKwlHbG9iYWwgc3Vic3RpdHV0aW9ucyB3b3JrCisJKGtzaDg4IGFuZCBrc2g5MyBkbyBub3QgaGF2ZSAtZyBvcHRpb24pCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYgYXNqaiBzYWRqaGFzZGpoIGFzZGpoYXNkCisJZmMgLWUgLSAtZyBhPUZvb0JBUgorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYgYXNqaiBzYWRqaGFzZGpoIGFzZGpoYXNkCisJRm9vQkFSYmMgZGVmIEZvb0JBUnNqaiBzRm9vQkFSZGpoRm9vQkFSc2RqaCBGb29CQVJzZGpoRm9vQkFSc2QKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIEZvb0JBUmJjIGRlZiBGb29CQVJzamogc0Zvb0JBUmRqaEZvb0JBUnNkamggRm9vQkFSc2RqaEZvb0JBUnNkXG5YKiQvCistLS0KK25hbWU6IGhpc3Rvcnktc3Vic3QtNQorZGVzY3JpcHRpb246CisJTWFrZSBzdXJlIHNlYXJjaGVzIGRvbid0IGZpbmQgY3VycmVudCAoZmMpIGNvbW1hbmQKKwkoa3NoODgva3NoOTMgZG9uJ3QgaGF2ZSB0aGUgPyBwcmVmaXggdGhpbmcgc28gdGhleSBmYWlsIHRoaXMgdGVzdCkKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWVjaG8gZ2hpIGprbAorCWZjIC1lIC0gYWJjPUFCIFw/YWJjCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCWdoaSBqa2wKKwlBQiBkZWYKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIEFCIGRlZlxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWVkLTEtb2xkCitkZXNjcmlwdGlvbjoKKwlCYXNpYyAoZWQpIGVkaXRpbmcgd29ya3MgKGFzc3VtZXMgeW91IGhhdmUgZ2VuZXJpYyBlZCBlZGl0b3IKKwl0aGF0IHByaW50cyBubyBwcm9tcHRzKS4gVGhpcyBpcyBmb3Igb2xkaXNoIGVkKDEpIHdoaWNoIHdyaXRlCisJdGhlIGNoYXJhY3RlciBjb3VudCB0byBzdGRvdXQuCitjYXRlZ29yeTogc3Rkb3V0LWVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwlmYyBlY2hvCisJcy9hYmMvRk9PQkFSLworCXcKKwlxCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCTEzCisJMTYKKwlGT09CQVIgZGVmCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBGT09CQVIgZGVmXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZWQtMi1vbGQKK2Rlc2NyaXB0aW9uOgorCUNvcnJlY3QgY29tbWFuZCBpcyBlZGl0ZWQgd2hlbiBudW1iZXIgZ2l2ZW4KK2NhdGVnb3J5OiBzdGRvdXQtZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIgaXMgaGVyZQorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwlmYyAyCisJcy9pcyBoZXJlL2lzIGNoYW5nZWQvCisJdworCXEKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIgaXMgaGVyZQorCWxpbmUgMworCWxpbmUgNAorCTIwCisJMjMKKwlsaW5lIDIgaXMgY2hhbmdlZAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gbGluZSAyIGlzIGNoYW5nZWRcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lZC0zLW9sZAorZGVzY3JpcHRpb246CisJTmV3bHkgY3JlYXRlZCBtdWx0aSBsaW5lIGNvbW1hbmRzIHNob3cgdXAgYXMgc2luZ2xlIGNvbW1hbmQKKwlpbiBoaXN0b3J5LgorCShOT1RFOiBhZGp1c3RlZCBmb3IgQ09NUExFWCBISVNUT1JZIGNvbXBpbGUgdGltZSBvcHRpb24pCisJKGtzaDg4IGZhaWxzICdjYXVzZSBpdCBsaXN0cyB0aGUgZmMgY29tbWFuZCkKK2NhdGVnb3J5OiBzdGRvdXQtZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gYWJjIGRlZgorCWZjIGVjaG8KKwlzL2FiYy9GT09CQVIvCisJJGEKKwllY2hvIGEgbmV3IGxpbmUKKwkuCisJdworCXEKKwlmYyAtbAorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwkxMworCTMyCisJRk9PQkFSIGRlZgorCWEgbmV3IGxpbmUKKwkxCWVjaG8gYWJjIGRlZgorCTIJZWNobyBGT09CQVIgZGVmCisJMwllY2hvIGEgbmV3IGxpbmUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIEZPT0JBUiBkZWZcbmVjaG8gYSBuZXcgbGluZVxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWVkLTEKK2Rlc2NyaXB0aW9uOgorCUJhc2ljIChlZCkgZWRpdGluZyB3b3JrcyAoYXNzdW1lcyB5b3UgaGF2ZSBnZW5lcmljIGVkIGVkaXRvcgorCXRoYXQgcHJpbnRzIG5vIHByb21wdHMpLiBUaGlzIGlzIGZvciBuZXdpc2ggZWQoMSkgYW5kIHN0ZGVyci4KK2NhdGVnb3J5OiAhbm8tc3RkZXJyLWVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwlmYyBlY2hvCisJcy9hYmMvRk9PQkFSLworCXcKKwlxCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCUZPT0JBUiBkZWYKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCoxM1xuMTZcbmVjaG8gRk9PQkFSIGRlZlxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWVkLTIKK2Rlc2NyaXB0aW9uOgorCUNvcnJlY3QgY29tbWFuZCBpcyBlZGl0ZWQgd2hlbiBudW1iZXIgZ2l2ZW4KK2NhdGVnb3J5OiAhbm8tc3RkZXJyLWVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyIGlzIGhlcmUKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZmMgMgorCXMvaXMgaGVyZS9pcyBjaGFuZ2VkLworCXcKKwlxCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyIGlzIGhlcmUKKwlsaW5lIDMKKwlsaW5lIDQKKwlsaW5lIDIgaXMgY2hhbmdlZAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKjIwXG4yM1xuZWNobyBsaW5lIDIgaXMgY2hhbmdlZFxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWVkLTMKK2Rlc2NyaXB0aW9uOgorCU5ld2x5IGNyZWF0ZWQgbXVsdGkgbGluZSBjb21tYW5kcyBzaG93IHVwIGFzIHNpbmdsZSBjb21tYW5kCisJaW4gaGlzdG9yeS4KK2NhdGVnb3J5OiAhbm8tc3RkZXJyLWVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwlmYyBlY2hvCisJcy9hYmMvRk9PQkFSLworCSRhCisJZWNobyBhIG5ldyBsaW5lCisJLgorCXcKKwlxCisJZmMgLWwKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJRk9PQkFSIGRlZgorCWEgbmV3IGxpbmUKKwkxCWVjaG8gYWJjIGRlZgorCTIJZWNobyBGT09CQVIgZGVmCisJMwllY2hvIGEgbmV3IGxpbmUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCoxM1xuMzJcbmVjaG8gRk9PQkFSIGRlZlxuZWNobyBhIG5ldyBsaW5lXG5YKiQvCistLS0KK25hbWU6IElGUy1zcGFjZS0xCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgZGVmYXVsdCBJRlMKK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJc2V0IC0tIEEgQiBDCisJc2hvd2FyZ3MgMSAkKgorCXNob3dhcmdzIDIgIiQqIgorCXNob3dhcmdzIDMgJEAKKwlzaG93YXJncyA0ICIkQCIKK2V4cGVjdGVkLXN0ZG91dDoKKwkgPDE+IDxBPiA8Qj4gPEM+CisJIDwyPiA8QSBCIEM+CisJIDwzPiA8QT4gPEI+IDxDPgorCSA8ND4gPEE+IDxCPiA8Qz4KKy0tLQorbmFtZTogSUZTLWNvbG9uLTEKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9Ogorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9OgorCXNldCAtLSBBIEIgQworCXNob3dhcmdzIDEgJCoKKwlzaG93YXJncyAyICIkKiIKKwlzaG93YXJncyAzICRACisJc2hvd2FyZ3MgNCAiJEAiCitleHBlY3RlZC1zdGRvdXQ6CisJIDwxPiA8QT4gPEI+IDxDPgorCSA8Mj4gPEE6QjpDPgorCSA8Mz4gPEE+IDxCPiA8Qz4KKwkgPDQ+IDxBPiA8Qj4gPEM+CistLS0KK25hbWU6IElGUy1udWxsLTEKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9IiIKK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPSIiCisJc2V0IC0tIEEgQiBDCisJc2hvd2FyZ3MgMSAkKgorCXNob3dhcmdzIDIgIiQqIgorCXNob3dhcmdzIDMgJEAKKwlzaG93YXJncyA0ICIkQCIKK2V4cGVjdGVkLXN0ZG91dDoKKwkgPDE+IDxBIEIgQz4KKwkgPDI+IDxBQkM+CisJIDwzPiA8QSBCIEM+CisJIDw0PiA8QSBCIEM+CistLS0KK25hbWU6IElGUy1zcGFjZS1jb2xvbi0xCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46CitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz0iJElGUzoiCisJc2V0IC0tCisJc2hvd2FyZ3MgMSAkKgorCXNob3dhcmdzIDIgIiQqIgorCXNob3dhcmdzIDMgJEAKKwlzaG93YXJncyA0ICIkQCIKKwlzaG93YXJncyA1IDogIiRAIgorZXhwZWN0ZWQtc3Rkb3V0OgorCSA8MT4KKwkgPDI+IDw+CisJIDwzPgorCSA8ND4KKwkgPDU+IDw6PgorLS0tCituYW1lOiBJRlMtc3BhY2UtY29sb24tMgorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+OgorCUFUJlQga3NoIGZhaWxzIHRoaXMsIFBPU0lYIHNheXMgdGhlIHRlc3QgaXMgY29ycmVjdC4KK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPSIkSUZTOiIKKwlzZXQgLS0KKwlzaG93YXJncyA6IiRAIgorZXhwZWN0ZWQtc3Rkb3V0OgorCSA8Oj4KKy0tLQorbmFtZTogSUZTLXNwYWNlLWNvbG9uLTMKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKKwlwZGtzaCBmYWlscyBib3RoIG9mIHRoZXNlIHRlc3RzCisJbm90IHN1cmUgd2hldGhlciAjMiBpcyBjb3JyZWN0CitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz0iJElGUzoiCisJeD0KKwlzZXQgLS0KKwlzaG93YXJncyAiJHgkQCIgMQorCXNob3dhcmdzICIkQCR4IiAyCitleHBlY3RlZC1mYWlsOiB5ZXMKK2V4cGVjdGVkLXN0ZG91dDoKKwkgPD4gPDE+CisJIDw+IDwyPgorLS0tCituYW1lOiBJRlMtc3BhY2UtY29sb24tNAorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+Ogorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9IiRJRlM6IgorCXNldCAtLQorCXNob3dhcmdzICIkQCRAIgorZXhwZWN0ZWQtc3Rkb3V0OgorCQorLS0tCituYW1lOiBJRlMtc3BhY2UtY29sb24tNQorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+OgorCURvbid0IGtub3cgd2hhdCBQT1NJWCB0aGlua3Mgb2YgdGhpcy4gIEFUJlQga3NoIGRvZXMgbm90IGRvIHRoaXMuCitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz0iJElGUzoiCisJc2V0IC0tCisJc2hvd2FyZ3MgIiR7QDotfSIKK2V4cGVjdGVkLXN0ZG91dDoKKwkgPD4KKy0tLQorbmFtZTogSUZTLXN1YnN0LTEKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPSIkSUZTOiIKKwl4PSI6YjogOiIKKwllY2hvIC1uICcxOic7IGZvciBpIGluICR4IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KKwllY2hvIC1uICcyOic7IGZvciBpIGluIDpiOjogOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobworCXNob3dhcmdzIDMgJHgKKwlzaG93YXJncyA0IDpiOjoKKwl4PSJhOmI6IgorCWVjaG8gLW4gJzU6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobworCXNob3dhcmdzIDYgJHgKKwl4PSJhOjpjIgorCWVjaG8gLW4gJzc6JzsgZm9yIGkgaW4gJHggOyBkbyBlY2hvIC1uICIgWyRpXSIgOyBkb25lIDsgZWNobworCXNob3dhcmdzIDggJHgKKwllY2hvIC1uICc5Oic7IGZvciBpIGluICR7Rk9PLWBlY2hvIC1uIGg6aWB0aDplcmV9IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KKwlzaG93YXJncyAxMCAke0ZPTy1gZWNobyAtbiBoOmlgdGg6ZXJlfQorCXNob3dhcmdzIDExICIke0ZPTy1gZWNobyAtbiBoOmlgdGg6ZXJlfSIKKwl4PSIgQSA6ICBCOjpEIgorCWVjaG8gLW4gJzEyOic7IGZvciBpIGluICR4IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KKwlzaG93YXJncyAxMyAkeAorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IFtdIFtiXSBbXQorCTI6IFs6Yjo6XQorCSA8Mz4gPD4gPGI+IDw+CisJIDw0PiA8OmI6Oj4KKwk1OiBbYV0gW2JdCisJIDw2PiA8YT4gPGI+CisJNzogW2FdIFtdIFtjXQorCSA8OD4gPGE+IDw+IDxjPgorCTk6IFtoXSBbaXRoXSBbZXJlXQorCSA8MTA+IDxoPiA8aXRoPiA8ZXJlPgorCSA8MTE+IDxoOml0aDplcmU+CisJMTI6IFtBXSBbQl0gW10gW0RdCisJIDwxMz4gPEE+IDxCPiA8PiA8RD4KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLWVyci0xCitkZXNjcmlwdGlvbjoKKwlDYW4ndCBoYXZlIDAgYmFzZSAoY2F1c2VzIHNoZWxsIHRvIGV4aXQpCitleHBlY3RlZC1leGl0OiBlICE9IDAKK3N0ZGluOgorCXR5cGVzZXQgLWkgaQorCWk9MworCWk9MCM0CisJZWNobyAkaQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL14uKjouKjAjNC4qXG4kLworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtZXJyLTIKK2Rlc2NyaXB0aW9uOgorCUNhbid0IGhhdmUgbXVsdGlwbGUgYmFzZXMgaW4gYSAnY29uc3RhbnQnIChjYXVzZXMgc2hlbGwgdG8gZXhpdCkKKwkoa3NoODggZmFpbHMgdGhpcyB0ZXN0KQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitzdGRpbjoKKwl0eXBlc2V0IC1pIGkKKwlpPTMKKwlpPTIjMTEwIzExCisJZWNobyAkaQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL14uKjouKjIjMTEwIzExLipcbiQvCistLS0KK25hbWU6IGludGVnZXItYmFzZS1lcnItMworZGVzY3JpcHRpb246CisJU3ludGF4IGVycm9ycyBpbiBleHByZXNzaW9ucyBhbmQgZWZmZWN0cyBvbiBiYXNlcworCShpbnRlcmFjdGl2ZSBzbyBlcnJvcnMgZG9uJ3QgY2F1c2UgZXhpdHMpCisJKGtzaDg4IGZhaWxzIHRoaXMgdGVzdCAtIHNoZWxsIGV4aXRzLCBldmVuIHdpdGggLWkpCithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCVBTMT0gIyBtaW5pbWlzZSBwcm9tcHQgaGFzc2xlcworCXR5cGVzZXQgLWk0IGE9MTAKKwl0eXBlc2V0IC1pIGE9MisKKwllY2hvICRhCisJdHlwZXNldCAtaTQgYT0xMAorCXR5cGVzZXQgLWkyIGE9MisKKwllY2hvICRhCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXihbI1wkXSApPy4qOi4qMisuKlxuLio6LioyKy4qXG4kLworZXhwZWN0ZWQtc3Rkb3V0OgorCTQjMjIKKwk0IzIyCistLS0KK25hbWU6IGludGVnZXItYmFzZS1lcnItNAorZGVzY3JpcHRpb246CisJQXJlIGludmFsaWQgZGlnaXRzIChhY2NvcmRpbmcgdG8gYmFzZSkgZXJyb3JzPworCShrc2g5MyBmYWlscyB0aGlzIHRlc3QpCitleHBlY3RlZC1leGl0OiBlICE9IDAKK3N0ZGluOgorCXR5cGVzZXQgLWkgaTsKKwlpPTMjNAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL14oWyNcJF0gKT8uKjouKjMjNC4qXG4kLworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtMQorZGVzY3JpcHRpb246CisJTWlzc2luZyBudW1iZXIgYWZ0ZXIgYmFzZSBpcyB0cmVhdGVkIGFzIDAuCitzdGRpbjoKKwl0eXBlc2V0IC1pIGkKKwlpPTMKKwlpPTIjCisJZWNobyAkaQorZXhwZWN0ZWQtc3Rkb3V0OgorCTAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrICdzdGlja3luZXNzJyBvZiBiYXNlIGluIHZhcmlvdXMgc2l0dWF0aW9ucworc3RkaW46CisJdHlwZXNldCAtaSBpPTgKKwllY2hvICRpCisJZWNobyAtLS0tLS0tLS0tIEEKKwl0eXBlc2V0IC1pNCBqPTgKKwllY2hvICRqCisJZWNobyAtLS0tLS0tLS0tIEIKKwl0eXBlc2V0IC1pIGs9OAorCXR5cGVzZXQgLWk0IGs9OAorCWVjaG8gJGsKKwllY2hvIC0tLS0tLS0tLS0gQworCXR5cGVzZXQgLWk0IGwKKwlsPTMjMTAKKwllY2hvICRsCisJZWNobyAtLS0tLS0tLS0tIEQKKwl0eXBlc2V0IC1pIG0KKwltPTMjMTAKKwllY2hvICRtCisJZWNobyAtLS0tLS0tLS0tIEUKKwluPTIjMTEKKwl0eXBlc2V0IC1pIG4KKwllY2hvICRuCisJbj0xMAorCWVjaG8gJG4KKwllY2hvIC0tLS0tLS0tLS0gRgorCXR5cGVzZXQgLWk4IG89MTIKKwl0eXBlc2V0IC1pNCBvCisJZWNobyAkbworCWVjaG8gLS0tLS0tLS0tLSBHCisJdHlwZXNldCAtaSBwCisJbGV0IHA9OCMxMgorCWVjaG8gJHAKK2V4cGVjdGVkLXN0ZG91dDoKKwk4CisJLS0tLS0tLS0tLSBBCisJNCMyMAorCS0tLS0tLS0tLS0gQgorCTQjMjAKKwktLS0tLS0tLS0tIEMKKwk0IzMKKwktLS0tLS0tLS0tIEQKKwkzIzEwCisJLS0tLS0tLS0tLSBFCisJMiMxMQorCTIjMTAxMAorCS0tLS0tLS0tLS0gRgorCTQjMzAKKwktLS0tLS0tLS0tIEcKKwk4IzEyCistLS0KK25hbWU6IGludGVnZXItYmFzZS0zCitkZXNjcmlwdGlvbjoKKwlNb3JlIGJhc2UgcGFyc2luZyAoaG1tIGRvZXNuJ3QgdGVzdCBtdWNoLi4pCitzdGRpbjoKKwl0eXBlc2V0IC1pIGFhCisJYWE9MSsxMiMxMCsyCisJZWNobyAkYWEKKwl0eXBlc2V0IC1pIGJiCisJYmI9MSskYWEKKwllY2hvICRiYgorCXR5cGVzZXQgLWkgYmIKKwliYj0kYWEKKwllY2hvICRiYgorCXR5cGVzZXQgLWkgY2MKKwljYz0kYWEKKwllY2hvICRjYworZXhwZWN0ZWQtc3Rkb3V0OgorCTE1CisJMTYKKwkxNQorCTE1CistLS0KK25hbWU6IGludGVnZXItYmFzZS00CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoaW5ncyBub3QgZGVjbGFyZWQgYXMgaW50ZWdlcnMgYXJlIG5vdCBtYWRlIGludGVnZXJzLAorCWFsc28sIGNoZWNrIGlmIGJhc2UgaXMgbm90IHJlc2V0IGJ5IC1pIHdpdGggbm8gYXJndW1lbnRzLgorCShrc2g5MyBmYWlscyAtIHByaW50cyAxMCMyMCAtIGdvIGZpZ3VyZSkKK3N0ZGluOgorCXh4PTIwCisJbGV0IHh4PTEwCisJdHlwZXNldCAtaSB8IGdyZXAgJ154eD0nCisJdHlwZXNldCAtaTQgYT0xMAorCXR5cGVzZXQgLWkgYT0yMAorCWVjaG8gJGEKK2V4cGVjdGVkLXN0ZG91dDoKKwk0IzExMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtNQorZGVzY3JpcHRpb246CisJTW9yZSBiYXNlIHN0dWZmCitzdGRpbjoKKwl0eXBlc2V0IC1pNCBhPTMjMTAKKwllY2hvICRhCisJZWNobyAtLQorCXR5cGVzZXQgLWkgaj0zCisJaj0nfjMnCisJZWNobyAkagorCWVjaG8gLS0KKwl0eXBlc2V0IC1pIGs9MQorCXhbaz1rKzFdPTMKKwllY2hvICRrCisJZWNobyAtLQorCXR5cGVzZXQgLWkgbAorCWZvciBsIGluIDEgMiszIDQ7IGRvIGVjaG8gJGw7IGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwk0IzMKKwktLQorCS00CisJLS0KKwkyCisJLS0KKwkxCisJNQorCTQKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLTYKK2Rlc2NyaXB0aW9uOgorCUV2ZW4gbW9yZSBiYXNlIHN0dWZmCisJKGtzaDkzIGZhaWxzIHRoaXMgdGVzdCAtIHByaW50cyAwKQorc3RkaW46CisJdHlwZXNldCAtaTcgaQorCWk9CisJZWNobyAkaQorZXhwZWN0ZWQtc3Rkb3V0OgorCTcjMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtNworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBub24taW50ZWdlciBwYXJhbWV0ZXJzIGRvbid0IGdldCBiYXNlcyBhc3NpZ25lZAorc3RkaW46CisJZWNobyAkKCggenogPSA4IzEwMCApKQorCWVjaG8gJHp6CitleHBlY3RlZC1zdGRvdXQ6CisJNjQKKwk2NAorLS0tCituYW1lOiBsaW5lbm8tc3RkaW4KK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiAkTElORU5PIGlzIHVwZGF0ZWQgYW5kIGNhbiBiZSBtb2RpZmllZC4KK3N0ZGluOgorCWVjaG8gQSAkTElORU5PCisJZWNobyBCICRMSU5FTk8KKwlMSU5FTk89MjAKKwllY2hvIEMgJExJTkVOTworZXhwZWN0ZWQtc3Rkb3V0OgorCUEgMQorCUIgMgorCUMgMjAKKy0tLQorbmFtZTogbGluZW5vLWluYworZGVzY3JpcHRpb246CisJU2VlIGlmICRMSU5FTk8gaXMgc2V0IGZvciAuJ2QgZmlsZXMuCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZG90ZmlsZSIKKwllY2hvIGRvdCBBICRMSU5FTk8KKwllY2hvIGRvdCBCICRMSU5FTk8KKwlMSU5FTk89MjAKKwllY2hvIGRvdCBDICRMSU5FTk8KK3N0ZGluOgorCWVjaG8gQSAkTElORU5PCisJZWNobyBCICRMSU5FTk8KKwkuIC4vZG90ZmlsZQorZXhwZWN0ZWQtc3Rkb3V0OgorCUEgMQorCUIgMgorCWRvdCBBIDEKKwlkb3QgQiAyCisJZG90IEMgMjAKKy0tLQorbmFtZTogbGluZW5vLWZ1bmMKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiAkTElORU5PIGlzIHNldCBmb3IgY29tbWFuZHMgaW4gYSBmdW5jdGlvbi4KK3N0ZGluOgorCWVjaG8gQSAkTElORU5PCisJZWNobyBCICRMSU5FTk8KKwliYXIoKSB7CisJICAgIGVjaG8gZnVuYyBBICRMSU5FTk8KKwkgICAgZWNobyBmdW5jIEIgJExJTkVOTworCX0KKwliYXIKKwllY2hvIEMgJExJTkVOTworZXhwZWN0ZWQtc3Rkb3V0OgorCUEgMQorCUIgMgorCWZ1bmMgQSA0CisJZnVuYyBCIDUKKwlDIDgKKy0tLQorbmFtZTogbGluZW5vLXVuc2V0CitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgdW5zZXR0aW5nIExJTkVOTyBtYWtlcyBpdCBub24tbWFnaWMuCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZG90ZmlsZSIKKwllY2hvIGRvdCBBICRMSU5FTk8KKwllY2hvIGRvdCBCICRMSU5FTk8KK3N0ZGluOgorCXVuc2V0IExJTkVOTworCWVjaG8gQSAkTElORU5PCisJZWNobyBCICRMSU5FTk8KKwliYXIoKSB7CisJICAgIGVjaG8gZnVuYyBBICRMSU5FTk8KKwkgICAgZWNobyBmdW5jIEIgJExJTkVOTworCX0KKwliYXIKKwkuIC4vZG90ZmlsZQorCWVjaG8gQyAkTElORU5PCitleHBlY3RlZC1zdGRvdXQ6CisJQQorCUIKKwlmdW5jIEEKKwlmdW5jIEIKKwlkb3QgQQorCWRvdCBCCisJQworLS0tCituYW1lOiBsaW5lbm8tdW5zZXQtdXNlCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgdW5zZXR0aW5nIExJTkVOTyBtYWtlcyBpdCBub24tbWFnaWMgZXZlbgorCXdoZW4gaXQgaXMgcmUtdXNlZC4KK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJkb3RmaWxlIgorCWVjaG8gZG90IEEgJExJTkVOTworCWVjaG8gZG90IEIgJExJTkVOTworc3RkaW46CisJdW5zZXQgTElORU5PCisJTElORU5PPTMKKwllY2hvIEEgJExJTkVOTworCWVjaG8gQiAkTElORU5PCisJYmFyKCkgeworCSAgICBlY2hvIGZ1bmMgQSAkTElORU5PCisJICAgIGVjaG8gZnVuYyBCICRMSU5FTk8KKwl9CisJYmFyCisJLiAuL2RvdGZpbGUKKwllY2hvIEMgJExJTkVOTworZXhwZWN0ZWQtc3Rkb3V0OgorCUEgMworCUIgMworCWZ1bmMgQSAzCisJZnVuYyBCIDMKKwlkb3QgQSAzCisJZG90IEIgMworCUMgMworLS0tCituYW1lOiBsaW5lbm8tdHJhcAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgTElORU5PIGlzIHRyYWNrZWQgaW4gdHJhcHMKK3N0ZGluOgorCWZhaWwoKSB7CisJCWVjaG8gImxpbmUgPCQxPiIKKwkJZXhpdCAxCisJfQorCXRyYXAgJ2ZhaWwgJExJTkVOTycgSU5UIEVSUgorCWZhbHNlCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSA8Nj4KK2V4cGVjdGVkLWV4aXQ6IDEKKy0tLQorbmFtZTogcmVhZC1JRlMtMQorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIGRlZmF1bHQgSUZTCitzdGRpbjoKKwllY2hvICJBIEIgIiA+IElOCisJdW5zZXQgeCB5IHoKKwlyZWFkIHggeSB6IDwgSU4KKwllY2hvIDE6ICJ4WyR4XSB5WyR5XSB6WyR6XSIKKwllY2hvIDFhOiAke3oteiBub3Qgc2V0fQorCXJlYWQgeCA8IElOCisJZWNobyAyOiAieFskeF0iCitleHBlY3RlZC1zdGRvdXQ6CisJMTogeFtBXSB5W0JdIHpbXQorCTFhOgorCTI6IHhbQSBCXQorLS0tCituYW1lOiByZWFkLWtzaC0xCitkZXNjcmlwdGlvbjoKKwlJZiBubyB2YXIgc3BlY2lmaWVkLCBSRVBMWSBpcyB1c2VkCitzdGRpbjoKKwllY2hvICJhYmMiID4gSU4KKwlyZWFkIDwgSU4KKwllY2hvICJbJFJFUExZXSI7CitleHBlY3RlZC1zdGRvdXQ6CisJW2FiY10KKy0tLQorbmFtZTogcmVncmVzc2lvbi0xCitkZXNjcmlwdGlvbjoKKwlMZXggYXJyYXkgY29kZSBoYWQgcHJvYmxlbXMgd2l0aCB0aGlzLgorc3RkaW46CisJZWNobyBmb29bCisJbj1iYXIKKwllY2hvICJoaVsgJG4gXT0xIgorZXhwZWN0ZWQtc3Rkb3V0OgorCWZvb1sKKwloaVsgYmFyIF09MQorLS0tCituYW1lOiByZWdyZXNzaW9uLTIKK2Rlc2NyaXB0aW9uOgorCVdoZW4gUEFUSCBpcyBzZXQgYmVmb3JlIHJ1bm5pbmcgYSBjb21tYW5kLCB0aGUgbmV3IHBhdGggaXMKKwlub3QgdXNlZCBpbiBkb2luZyB0aGUgcGF0aCBzZWFyY2gKKwkJJCBlY2hvIGVjaG8gaGkgPiAvdG1wL3EgOyBjaG1vZCBhK3J4IC90bXAvcQorCQkkIFBBVEg9L3RtcCBxCisJCXE6IG5vdCBmb3VuZAorCQkkCisJaW4gY29tZXhlYygpIHRoZSB0d28gbGluZXMKKwkJd2hpbGUgKCp2cCAhPSBOVUxMKQorCQkJKHZvaWQpIHR5cGVzZXQoKnZwKyssIHh4eCwgMCk7CisJbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgdGhlIHN3aXRjaCB0byBiZWZvcmUgZmluZGNvbSgpIGlzCisJY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyB3aWxsIGJyZWFrLgorc3RkaW46CisJOiAke1BXRDotYHB3ZCAyPiAvZGV2L251bGxgfQorCTogJHtQV0Q6PyJQV0Qgbm90IHNldCAtIGNhbid0IGRvIHRlc3QifQorCW1rZGlyIFkKKwljYXQgPiBZL3h4eHNjcmlwdCA8PCBFT0YKKwkjIS9iaW4vc2gKKwkjIE5lZWQgdG8gcmVzdG9yZSBwYXRoIHNvIGVjaG8gY2FuIGJlIGZvdW5kIChzb21lIHNoZWxscyBkb24ndCBoYXZlCisJIyBpdCBhcyBhIGJ1aWx0LWluKQorCVBBVEg9XCRPTERQQVRICisJZWNobyBoaQorCWV4aXQgMAorCUVPRgorCWNobW9kIGErcnggWS94eHhzY3JpcHQKKwlleHBvcnQgT0xEUEFUSD0iJFBBVEgiCisJUEFUSD0kUFdEL1kgeHh4c2NyaXB0CisJZXhpdCAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNgorZGVzY3JpcHRpb246CisJUGFyc2luZyBvZiAkKC4uKSBleHByZXNzaW9ucyBpcyBub24tb3B0aW1hbC4gIEl0IGlzCisJaW1wb3NzaWJsZSB0byBoYXZlIGFueSBwYXJlbnRoZXNlcyBpbnNpZGUgdGhlIGV4cHJlc3Npb24uCisJSS5lLiwKKwkJJCBrc2ggLWMgJ2VjaG8gJChlY2hvIFwoICknCisJCW5vIGNsb3NpbmcgcXVvdGUKKwkJJCBrc2ggLWMgJ2VjaG8gJChlY2hvICIoIiApJworCQlubyBjbG9zaW5nIHF1b3RlCisJCSQKKwlUaGUgc29sdXRpb24gaXMgdG8gaGFjayB0aGUgcGFyc2luZyBjbG9kZSBpbiBsZXguYywgdGhlCisJcXVlc3Rpb24gaXMgaG93IHRvIGhhY2sgaXQ6IHNob3VsZCBhbnkgcGFyZW50aGVzZXMgYmUKKwllc2NhcGVkIGJ5IGEgYmFja3NsYXNoLCBvciBzaG91bGQgcmVjdXJzaXZlIHBhcnNpbmcgYmUgZG9uZQorCShzbyBxdW90ZXMgY291bGQgYWxzbyBiZSB1c2VkIHRvIGhpZGUgaGVtKS4gIFRoZSBmb3JtZXIgaXMKKwllYXNpZXIsIHRoZSBsYXRlciBiZXR0ZXIuLi4KK3N0ZGluOgorCWVjaG8gJChlY2hvIFwoKQorZXhwZWN0ZWQtc3Rkb3V0OgorCSgKKy0tLQorbmFtZTogcmVncmVzc2lvbi05CitkZXNjcmlwdGlvbjoKKwlDb250aW51ZSBpbiBhIGZvciBsb29wIGRvZXMgbm90IHdvcmsgcmlnaHQ6CisJCWZvciBpIGluIGEgYiBjIDsgZG8KKwkJCWlmIFsgJGkgPSBiIF0gOyB0aGVuCisJCQkJY29udGludWUKKwkJCWZpCisJCQllY2hvICRpCisJCWRvbmUKKwlQcmludHMgYSBmb3JldmVyLi4uCitzdGRpbjoKKwlmaXJzdD15ZXMKKwlmb3IgaSBpbiBhIGIgYyA7IGRvCisJCWlmIFsgJGkgPSBiIF0gOyB0aGVuCisJCQlpZiBbICRmaXJzdCA9IG5vIF0gOyB0aGVuCisJCQkJZWNobyAnY29udGludWUgaW4gZm9yIGxvb3AgYnJva2VuJworCQkJCWJyZWFrCSMgaG9wZSBicmVhayBpc24ndCBicm9rZW4gdG9vIDotKQorCQkJZmkKKwkJCWZpcnN0PW5vCisJCQljb250aW51ZQorCQlmaQorCWRvbmUKKwllY2hvIGJ5ZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWJ5ZQorLS0tCituYW1lOiByZWdyZXNzaW9uLTEwCitkZXNjcmlwdGlvbjoKKwlUaGUgZm9sbG93aW5nOgorCQlzZXQgLS0gYGZhbHNlYAorCQllY2hvICQ/CisJc2hvdWxkIHByaW50IDAgYWNjb3JkaW5nIHRvIFBPU0lYIChkYXNoLCBiYXNoLCBrc2g5MywgcG9zaCkKKwlidXQgbm90IDAgYWNjb3JkaW5nIHRvIHRoZSBnZXRvcHQoMSkgbWFudWFsIHBhZ2UsIGtzaDg4LCBhbmQKKwlCb3VybmUgc2ggKHN1Y2ggYXMgL2Jpbi9zaCBvbiBTb2xhcmlzKS4KKwlJbiBta3NoIFIzOWIsIHdlIGhvbm91ciBQT1NJWCBleGNlcHQgd2hlbiAtbyBzaCBpcyBzZXQuCitzdGRpbjoKKwlzaG93ZigpIHsKKwkJW1sgLW8gcG9zaXggXV07IEZQT1NJWD0kKCgxLSQ/KSkKKwkJW1sgLW8gc2ggXV07IEZTSD0kKCgxLSQ/KSkKKwkJZWNobyAtbiAiRlBPU0lYPSRGUE9TSVggRlNIPSRGU0ggIgorCX0KKwlzZXQgK28gcG9zaXggK28gc2gKKwlzaG93ZgorCXNldCAtLSBgZmFsc2VgCisJZWNobyBydj0kPworCXNldCAtbyBzaAorCXNob3dmCisJc2V0IC0tIGBmYWxzZWAKKwllY2hvIHJ2PSQ/CisJc2V0IC1vIHBvc2l4CisJc2hvd2YKKwlzZXQgLS0gYGZhbHNlYAorCWVjaG8gcnY9JD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlGUE9TSVg9MCBGU0g9MCBydj0wCisJRlBPU0lYPTAgRlNIPTEgcnY9MQorCUZQT1NJWD0xIEZTSD0wIHJ2PTAKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xMQorZGVzY3JpcHRpb246CisJVGhlIGZvbGxvd2luZzoKKwkJeD0vZm9vL2Jhci9ibGFoCisJCWVjaG8gJHt4IyMqL30KKwlzaG91bGQgZWNobyBibGFoIGJ1dCBvbiBzb21lIG1hY2hpbmVzIGVjaG9zIC9mb28vYmFyL2JsYWguCitzdGRpbjoKKwl4PS9mb28vYmFyL2JsYWgKKwllY2hvICR7eCMjKi99CitleHBlY3RlZC1zdGRvdXQ6CisJYmxhaAorLS0tCituYW1lOiByZWdyZXNzaW9uLTEyCitkZXNjcmlwdGlvbjoKKwlCb3RoIG9mIHRoZSBmb2xsb3dpbmcgZWNob3MgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQgdW5kZXIgc2gva3NoLmF0dDoKKwkJIyEvYmluL3NoCisJCXg9ImZvbwliYXIiCisJCWVjaG8gImBlY2hvIFwiJHhcImAiCisJCWVjaG8gImBlY2hvICIkeCJgIgorCXBka3NoIHByb2R1Y2VzIGRpZmZlcmVudCBvdXRwdXQgZm9yIHRoZSBmb3JtZXIgKGZvbyBpbnN0ZWFkIG9mIGZvb1x0YmFyKQorc3RkaW46CisJeD0iZm9vCWJhciIKKwllY2hvICJgZWNobyBcIiR4XCJgIgorCWVjaG8gImBlY2hvICIkeCJgIgorZXhwZWN0ZWQtc3Rkb3V0OgorCWZvbwliYXIKKwlmb28JYmFyCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTMKK2Rlc2NyaXB0aW9uOgorCVRoZSBmb2xsb3dpbmcgY29tbWFuZCBoYW5ncyBmb3JldmVyOgorCQkkICg6IDsgY2F0IC9ldGMvdGVybWNhcCkgfCBzbGVlcCAyCisJVGhpcyBpcyBiZWNhdXNlIHRoZSBzaGVsbCBmb3JrcyBhIHNoZWxsIHRvIHJ1biB0aGUgKC4uKSBjb21tYW5kCisJYW5kIHRoaXMgc2hlbGwgaGFzIHRoZSBwaXBlIG9wZW4uICBXaGVuIHRoZSBzbGVlcCBkaWVzLCB0aGUgY2F0CisJZG9lc24ndCBnZXQgYSBTSUdQSVBFICdjYXVzZSBhIHByb2Nlc3MgKGllLCB0aGUgc2Vjb25kIHNoZWxsKQorCXN0aWxsIGhhcyB0aGUgcGlwZSBvcGVuLgorCQorCU5PVEU6IHRoaXMgdGVzdCBwcm92b2tlcyBhIGJpemFycmUgYnVnIGluIGtzaDkzIChzaGVsbCBzdGFydHMgcmVhZGluZworCSAgICAgIGNvbW1hbmRzIGZyb20gL2V0Yy90ZXJtY2FwLi4pCit0aW1lLWxpbWl0OiAxMAorc3RkaW46CisJZWNobyBBIGxpbmUgb2YgdGV4dCB0aGF0IHdpbGwgYmUgZHVwbGljYXRlZCBxdWl0ZSBhIG51bWJlciBvZiB0aW1lcy4+IHQxCisJY2F0IHQxIHQxIHQxIHQxICB0MSB0MSB0MSB0MSAgdDEgdDEgdDEgdDEgIHQxIHQxIHQxIHQxICA+IHQyCisJY2F0IHQyIHQyIHQyIHQyICB0MiB0MiB0MiB0MiAgdDIgdDIgdDIgdDIgIHQyIHQyIHQyIHQyICA+IHQxCisJY2F0IHQxIHQxIHQxIHQxID4gdDIKKwkoOiA7IGNhdCB0MiAyPiYtKSB8IHNsZWVwIDEKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xNAorZGVzY3JpcHRpb246CisJVGhlIGNvbW1hbmQKKwkJJCAoZm9vYmFyKSAyPiAvZGV2L251bGwKKwlnZW5lcmF0ZXMgbm8gb3V0cHV0IHVuZGVyIC9iaW4vc2gsIGJ1dCBwZGtzaCBwcm9kdWNlcyB0aGUgZXJyb3IKKwkJZm9vYmFyOiBub3QgZm91bmQKKwlBbHNvLCB0aGUgY29tbWFuZAorCQkkIGZvb2JhciAyPiAvZGV2L251bGwKKwlnZW5lcmF0ZXMgYW4gZXJyb3IgdW5kZXIgL2Jpbi9zaCBhbmQgcGRrc2gsIGJ1dCBBVCZUIGtzaDg4IHByb2R1Y2VzCisJbm8gZXJyb3IgKHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsKS4KK3N0ZGluOgorCSh5b3Uvc2hvdWxkL25vdC9zZWUvdGhpcy9lcnJvci8xKSAyPiAvZGV2L251bGwKKwl5b3Uvc2hvdWxkL25vdC9zZWUvdGhpcy9lcnJvci8yIDI+IC9kZXYvbnVsbAorCXRydWUKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xNQorZGVzY3JpcHRpb246CisJVGhlIGNvbW1hbmQKKwkJJCB3aGVuY2UgZm9vYmFyCisJZ2VuZXJhdGVzIGEgYmxhbmsgbGluZSB1bmRlciBwZGtzaCBhbmQgc2V0cyB0aGUgZXhpdCBzdGF0dXMgdG8gMC4KKwlBVCZUIGtzaDg4IGdlbmVyYXRlcyBubyBvdXRwdXQgYW5kIHNldHMgdGhlIGV4aXQgc3RhdHVzIHRvIDEuICBBbHNvLAorCXRoZSBjb21tYW5kCisJCSQgd2hlbmNlIGZvb2JhciBjYXQKKwlnZW5lcmF0ZXMgbm8gb3V0cHV0IHVuZGVyIEFUJlQga3NoODggKHBka3NoIGdlbmVyYXRlcyBhIGJsYW5rIGxpbmUKKwlhbmQgL2Jpbi9jYXQpLgorc3RkaW46CisJd2hlbmNlIGRvZXMvbm90L2V4aXN0ID4gL2Rldi9udWxsCisJZWNobyAxOiAkPworCWVjaG8gMjogJCh3aGVuY2UgZG9lcy9ub3QvZXhpc3QgfCB3YyAtbCkKKwllY2hvIDM6ICQod2hlbmNlIGRvZXMvbm90L2V4aXN0IGNhdCB8IHdjIC1sKQorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IDEKKwkyOiAwCisJMzogMAorLS0tCituYW1lOiByZWdyZXNzaW9uLTE2CitkZXNjcmlwdGlvbjoKKwkke3ZhciUlZXhwcn0gc2VlbXMgdG8gYmUgYnJva2VuIGluIG1hbnkgcGxhY2VzLiAgT24gdGhlIG1pcHMKKwl0aGUgY29tbWFuZHMKKwkJJCByZWFkIGxpbmUgPCAvZXRjL3Bhc3N3ZAorCQkkIGVjaG8gJGxpbmUKKwkJcm9vdDowOjE6Li4uCisJCSQgZWNobyAke2xpbmUlJToqfQorCQlyb290CisJCSQgZWNobyAkbGluZQorCQlyb290CisJCSQKKwljaGFuZ2UgdGhlIHZhbHVlIG9mIGxpbmUuICBPbiBzdW40cyAmIHBhcywgdGhlIGVjaG8gJHtsaW5lJSU6Kn0gZG9lc24ndAorCXdvcmsuICBIYXZlbid0IGNoZWNrZWQgZWxzZXdoZXJlLi4uCitzY3JpcHQ6CisJcmVhZCB4CisJeT0keAorCWVjaG8gJHt4JSU6Kn0KKwllY2hvICR4CitzdGRpbjoKKwlyb290OmFzZGpoYXNkYXNqaHM6MDoxOlJvb3Q6LzovYmluL3NoCitleHBlY3RlZC1zdGRvdXQ6CisJcm9vdAorCXJvb3Q6YXNkamhhc2Rhc2poczowOjE6Um9vdDovOi9iaW4vc2gKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xNworZGVzY3JpcHRpb246CisJVGhlIGNvbW1hbmQKKwkJLiAvZm9vL2JhcgorCXNob3VsZCBzZXQgdGhlIGV4aXQgc3RhdHVzIHRvIG5vbi16ZXJvIChzaCBhbmQgQVQmVCBrc2g4OCBkbykuCisJWFhYIGRvdGluZyBhIG5vbiBleGlzdGVudCBmaWxlIGlzIGEgZmF0YWwgZXJyb3IgZm9yIGEgc2NyaXB0CitzdGRpbjoKKwkuIGRvZXMvbm90L2V4aXN0CitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLj8vCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTkKK2Rlc2NyaXB0aW9uOgorCUJvdGggb2YgdGhlIGZvbGxvd2luZyBlY2hvcyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSB0aGluZywgYnV0IGRvbid0OgorCQkkIHg9Zm9vL2JhcgorCQkkIGVjaG8gJHt4JS8qfQorCQlmb28KKwkJJCBlY2hvICIke3glLyp9IgorCQlmb28vYmFyCitzdGRpbjoKKwl4PWZvby9iYXIKKwllY2hvICIke3glLyp9IgorZXhwZWN0ZWQtc3Rkb3V0OgorCWZvbworLS0tCituYW1lOiByZWdyZXNzaW9uLTIxCitkZXNjcmlwdGlvbjoKKwliYWNrc2xhc2ggZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCBpbiBjYXNlIGxhYmVsczoKKwkkIHg9Jy14JworCSQgY2FzZSAkeCBpbgorCS1cPykgZWNobyBoaQorCWVzYWMKKwloaQorCSQgeD0nLT8nCisJJCBjYXNlICR4IGluCisJLVxcPykgZWNobyBoaQorCWVzYWMKKwloaQorCSQKK3N0ZGluOgorCWNhc2UgLXggaW4KKwktXD8pCWVjaG8gZmFpbAorCWVzYWMKKy0tLQorbmFtZTogcmVncmVzc2lvbi0yMgorZGVzY3JpcHRpb246CisJUXVvdGluZyBiYWNrcXVvdGVzIGluc2lkZSBiYWNrcXVvdGVzIGRvZXNuJ3Qgd29yazoKKwkkIGVjaG8gYGVjaG8gaGkgXGBlY2hvIHRoZXJlXGAgZm9sa3NgCisJYXNrcyBmb3IgbW9yZSBpbmZvLiAgc2ggYW5kIEFUJlQga3NoODggYm90aCBlY2hvCisJaGkgdGhlcmUgZm9sa3MKK3N0ZGluOgorCWVjaG8gYGVjaG8gaGkgXGBlY2hvIHRoZXJlXGAgZm9sa3NgCitleHBlY3RlZC1zdGRvdXQ6CisJaGkgdGhlcmUgZm9sa3MKKy0tLQorbmFtZTogcmVncmVzc2lvbi0yMworZGVzY3JpcHRpb246CisJKSkgaXMgbm90IHRyZWF0ZWQgYGNvcnJlY3RseSc6CisJICAgICQgKGVjaG8gaGkgOyAoZWNobyB0aGVyZSA7IGVjaG8gZm9sa3MpKQorCSAgICBtaXNzaW5nICgoCisJICAgICQKKwlpbnN0ZWFkIG9mIChhcyBzaCBhbmQga3NoLmF0dCkKKwkgICAgJCAoZWNobyBoaSA7IChlY2hvIHRoZXJlIDsgZWNobyBmb2xrcykpCisJICAgIGhpCisJICAgIHRoZXJlCisJICAgIGZvbGtzCisJICAgICQKK3N0ZGluOgorCSggOiA7ICggOiA7IGVjaG8gaGkpKQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHJlYWRpbmcgc3RkaW4gaW4gYSB3aGlsZSBsb29wLiAgVGhlIHJlYWQgc2hvdWxkIG9ubHkgcmVhZAorCWEgc2luZ2xlIGxpbmUsIG5vdCBhIHdob2xlIHN0ZGlvIGJ1ZmZlcjsgdGhlIGNhdCBzaG91bGQgZ2V0CisJdGhlIHJlc3QuCitzdGRpbjoKKwkoZWNobyBhOyBlY2hvIGIpIHwgd2hpbGUgcmVhZCB4IDsgZG8KKwkgICAgZWNobyAkeAorCSAgICBjYXQgPiAvZGV2L251bGwKKwlkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJYQorLS0tCituYW1lOiByZWdyZXNzaW9uLTI2CitkZXNjcmlwdGlvbjoKKwlDaGVjayByZWFkaW5nIHN0ZGluIGluIGEgd2hpbGUgbG9vcC4gIFRoZSByZWFkIHNob3VsZCByZWFkIGJvdGgKKwlsaW5lcywgbm90IGp1c3QgdGhlIGZpcnN0Lgorc2NyaXB0OgorCWE9CisJd2hpbGUgWyAiJGEiICE9IHh4eCBdIDsgZG8KKwkgICAgbGFzdD0keAorCSAgICByZWFkIHgKKwkgICAgY2F0IC9kZXYvbnVsbCB8IHNlZCAncy94L3kvJworCSAgICBhPXgkYQorCWRvbmUKKwllY2hvICRsYXN0CitzdGRpbjoKKwlhCisJYgorZXhwZWN0ZWQtc3Rkb3V0OgorCWIKKy0tLQorbmFtZTogcmVncmVzc2lvbi0yNworZGVzY3JpcHRpb246CisJVGhlIGNvbW1hbmQKKwkJLiAvZG9lcy9ub3QvZXhpc3QKKwlzaG91bGQgY2F1c2UgYSBzY3JpcHQgdG8gZXhpdC4KK3N0ZGluOgorCS4gZG9lcy9ub3QvZXhpc3QKKwllY2hvIGhpCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvZG9lc1wvbm90XC9leGlzdC8KKy0tLQorbmFtZTogcmVncmVzc2lvbi0yOAorZGVzY3JpcHRpb246CisJdmFyaWFibGUgYXNzaWduZW1lbnRzIG5vdCBkZXRlY3RlZCB3ZWxsCitzdGRpbjoKKwlhLng9MSBlY2hvIGhpCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvYVwueD0xLworLS0tCituYW1lOiByZWdyZXNzaW9uLTI5CitkZXNjcmlwdGlvbjoKKwlhbGlhcyBleHBhbnNpb24gZGlmZmVyZW50IGZyb20gQVQmVCBrc2g4OAorc3RkaW46CisJYWxpYXMgYT0nZm9yICcgYj0naSBpbicKKwlhIGIgaGkgOyBkbyBlY2hvICRpIDsgZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzAKK2Rlc2NyaXB0aW9uOgorCXN0cmFuZ2UgY2hhcmFjdGVycyBhbGxvd2VkIGluc2lkZSAkey4uLn0KK3N0ZGluOgorCWVjaG8gJHthe2J9fQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4/LworLS0tCituYW1lOiByZWdyZXNzaW9uLTMxCitkZXNjcmlwdGlvbjoKKwlEb2VzIHJlYWQgaGFuZGxlIHBhcnRpYWwgbGluZXMgY29ycmVjdGx5CitzY3JpcHQ6CisJYT0gcmV0PQorCXdoaWxlIFsgIiRhIiAhPSB4eHggXSA7IGRvCisJICAgIHJlYWQgeCB5IHoKKwkgICAgcmV0PSQ/CisJICAgIGE9eCRhCisJZG9uZQorCWVjaG8gIlskeF0iCisJZWNobyAkcmV0CitzdGRpbjogIQorCWEgQSBhQQorCWIgQiBCYgorCWMKK2V4cGVjdGVkLXN0ZG91dDoKKwlbY10KKwkxCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzIKK2Rlc2NyaXB0aW9uOgorCURvZXMgcmVhZCBzZXQgdmFyaWFibGVzIHRvIG51bGwgYXQgZW9mPworc2NyaXB0OgorCWE9CisJd2hpbGUgWyAiJGEiICE9IHh4eCBdIDsgZG8KKwkgICAgcmVhZCB4IHkgegorCSAgICBhPXgkYQorCWRvbmUKKwllY2hvIDE6ICR7eC14IG5vdCBzZXR9ICR7eS15IG5vdCBzZXR9ICR7ei16IG5vdCBzZXR9CisJZWNobyAyOiAke3g6K3ggbm90IG51bGx9ICR7eToreSBub3QgbnVsbH0gJHt6Oit6IG5vdCBudWxsfQorc3RkaW46CisJYSBBIEFhCisJYiBCIEJiCitleHBlY3RlZC1zdGRvdXQ6CisJMToKKwkyOgorLS0tCituYW1lOiByZWdyZXNzaW9uLTMzCitkZXNjcmlwdGlvbjoKKwlEb2VzIHVtYXNrIHByaW50IGEgbGVhZGluZyAwIHdoZW4gdW1hc2sgaXMgMyBkaWdpdHM/CitzdGRpbjoKKwl1bWFzayAyMjIKKwl1bWFzaworZXhwZWN0ZWQtc3Rkb3V0OgorCTAyMjIKKy0tLQorbmFtZTogcmVncmVzc2lvbi0zNQorZGVzY3JpcHRpb246CisJVGVtcG9yeSBmaWxlcyB1c2VkIGZvciBoZXJlLWRvY3MgaW4gZnVuY3Rpb25zIGdldCB0cmFzaGVkIGFmdGVyCisJdGhlIGZ1bmN0aW9uIGlzIHBhcnNlZCAoYmVmb3JlIGl0IGlzIGV4ZWN1dGVkKQorc3RkaW46CisJZjEoKSB7CisJCWNhdCA8PC0gRU9GCisJCQlGMQorCQlFT0YKKwkJZjIoKSB7CisJCQljYXQgPDwtIEVPRgorCQkJCUYyCisJCQlFT0YKKwkJfQorCX0KKwlmMQorCWYyCisJdW5zZXQgLWYgZjEKKwlmMgorZXhwZWN0ZWQtc3Rkb3V0OgorCUYxCisJRjIKKwlGMgorLS0tCituYW1lOiByZWdyZXNzaW9uLTM2CitkZXNjcmlwdGlvbjoKKwlDb21tYW5kIHN1YnN0aXR1dGlvbiBicmVha3MgcmVhZGluZyBpbiB3aGlsZSBsb29wCisJKHRlc3QgZnJvbSA8c2pnQHZvaWQuemVuLm96LmF1PikKK3N0ZGluOgorCShlY2hvIGFiY2RlZjsgZWNobzsgZWNobyAxMjMpIHwKKwkgICAgd2hpbGUgcmVhZCBsaW5lCisJICAgIGRvCisJICAgICAgIyB0aGUgZm9sbG93aW5nIGxpbmUgYnJlYWtzIGl0CisJICAgICAgYz1gZWNobyAkbGluZSB8IHdjIC1jYAorCSAgICAgIGVjaG8gJGMKKwkgICAgZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCTcKKwkxCisJNAorLS0tCituYW1lOiByZWdyZXNzaW9uLTM3CitkZXNjcmlwdGlvbjoKKwlNYWNoaW5lcyB3aXRoIGJyb2tlbiB0aW1lcygpIChyZXBvcnRlZCBieSA8c2pnQHZvaWQuemVuLm96LmF1PikKKwl0aW1lIGRvZXMgbm90IHJlcG9ydCBjb3JyZWN0IHJlYWwgdGltZQorc3RkaW46CisJdGltZSBzbGVlcCAxCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogIS9eXHMqMFwuMFtcc1xkXStyZWFsfF5ccypyZWFsW1xzXSswK1wuMC8KKy0tLQorbmFtZTogcmVncmVzc2lvbi0zOAorZGVzY3JpcHRpb246CisJc2V0IC1lIGRvZXNuJ3QgaWdub3JlIGV4aXQgY29kZXMgZm9yIGlmL3doaWxlL3VudGlsLyYmL3x8LyEuCithcmd1bWVudHM6ICEtZSEKK3N0ZGluOgorCWlmIGZhbHNlOyB0aGVuIGVjaG8gaGkgOyBmaQorCWZhbHNlIHx8IHRydWUKKwlmYWxzZSAmJiB0cnVlCisJd2hpbGUgZmFsc2U7IGRvIGVjaG8gaGk7IGRvbmUKKwllY2hvIG9rCitleHBlY3RlZC1zdGRvdXQ6CisJb2sKKy0tLQorbmFtZTogcmVncmVzc2lvbi0zOQorZGVzY3JpcHRpb246CisJc2V0IC1lOiBlcnJvcnMgaW4gY29tbWFuZCBzdWJzdGl0dXRpb25zIGFyZW4ndCBpZ25vcmVkCisJTm90IGNsZWFyIGlmIHRoZXkgc2hvdWxkIGJlIG9yIG5vdC4uLiBiYXNoIHBhc3NlcyBoZXJlCisJdGhpcyBtYXkgYWN0dWFsbHkgYmUgcmVxdWlyZWQgZm9yIG1ha2UsIHNvIGNoYW5nZWQgdGhlCisJdGVzdCB0byBtYWtlIHRoaXMgYW4gbWtzaCBmZWF0dXJlLCBub3QgYSBidWcKK2FyZ3VtZW50czogIS1lIQorc3RkaW46CisJZWNobyBgZmFsc2U7IGVjaG8gaGlgCisjZXhwZWN0ZWQtZmFpbDogeWVzCisjZXhwZWN0ZWQtc3Rkb3V0OgorIwloaQorZXhwZWN0ZWQtc3Rkb3V0OgorCQorLS0tCituYW1lOiByZWdyZXNzaW9uLTQwCitkZXNjcmlwdGlvbjoKKwlUaGlzIHVzZWQgdG8gY2F1c2UgYSBjb3JlIGR1bXAKK2Vudi1zZXR1cDogIVJBTkRPTT0xMiEKK3N0ZGluOgorCWVjaG8gaGkKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorLS0tCituYW1lOiByZWdyZXNzaW9uLTQxCitkZXNjcmlwdGlvbjoKKwlmb28gc2hvdWxkIGJlIHNldCB0byBiYXIgKHNob3VsZCBub3QgYmUgZW1wdHkpCitzdGRpbjoKKwlmb289YAorCWVjaG8gYmFyYAorCWVjaG8gIigkZm9vKSIKK2V4cGVjdGVkLXN0ZG91dDoKKwkoYmFyKQorLS0tCituYW1lOiByZWdyZXNzaW9uLTQyCitkZXNjcmlwdGlvbjoKKwlDYW4ndCB1c2UgY29tbWFuZCBsaW5lIGFzc2lnbm1lbnRzIHRvIGFzc2lnbiByZWFkb25seSBwYXJhbWV0ZXJzLgorc3RkaW46CisJZm9vPWJhcgorCXJlYWRvbmx5IGZvbworCWZvbz1zdHVmZiBlbnYgfCBncmVwICdeZm9vJworZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLipyZWFkICpvbmx5LiovCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDMKK2Rlc2NyaXB0aW9uOgorCUNhbiBzdWJzaGVsbHMgYmUgcHJlZml4ZWQgYnkgcmVkaXJlY3Rpb25zIChoaXN0b3JpY2FsIHNoZWxscyBhbGxvdworCXRoaXMpCitzdGRpbjoKKwk8IC9kZXYvbnVsbCAoc2VkICdzL14vWC8nKQorLS0tCituYW1lOiByZWdyZXNzaW9uLTQ1CitkZXNjcmlwdGlvbjoKKwlQYXJhbWV0ZXIgYXNzaWdubWVudHMgd2l0aCBbXSByZWNvZ25pc2VkIGNvcnJlY3RseQorc3RkaW46CisJRk9PPSpbMTJdCisJQkFSPWFiY1sKKwlNT1JFPVthYmNdCisJSlVOSz1hW2JjCisJZWNobyAiPCRGT08+IgorCWVjaG8gIjwkQkFSPiIKKwllY2hvICI8JE1PUkU+IgorCWVjaG8gIjwkSlVOSz4iCitleHBlY3RlZC1zdGRvdXQ6CisJPCpbMTJdPgorCTxhYmNbPgorCTxbYWJjXT4KKwk8YVtiYz4KKy0tLQorbmFtZTogcmVncmVzc2lvbi00NgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gd29ya3MgaW4gY29tbWFuZCBzdWJzdGl0dXRpb25zIGFuZAorCWF0IHRoZSBlbmQgb2YgZmlsZS4KK3N0ZGluOgorCWFsaWFzIHg9J2VjaG8gaGknCisJRk9PPSJgeGAgIgorCWVjaG8gIlskRk9PXSIKKwl4CitleHBlY3RlZC1zdGRvdXQ6CisJW2hpIF0KKwloaQorLS0tCituYW1lOiByZWdyZXNzaW9uLTQ3CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFsaWFzZXMgYXJlIGZ1bGx5IHJlYWQuCitzdGRpbjoKKwlhbGlhcyB4PSdlY2hvIGhpOworCWVjaG8gdGhlcmUnCisJeAorCWVjaG8gZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJdGhlcmUKKwlkb25lCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDgKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgKGhlcmUgZG9jKSB0ZW1wIGZpbGVzIGFyZSBub3QgbGVmdCBiZWhpbmQgYWZ0ZXIgYW4gZXhlYy4KK3N0ZGluOgorCW1rZGlyIGZvbyB8fCBleGl0IDEKKwlUTVBESVI9JFBXRC9mb28gIiRfX3Byb2duYW1lIiA8PC0gJ0VPRicKKwkJeCgpIHsKKwkJCXNlZCAncy9eL1ggLycgPDwgRV9PX0YKKwkJCWhpCisJCQl0aGVyZQorCQkJZm9sa3MKKwkJCUVfT19GCisJCQllY2hvICJkb25lICgkPykiCisJCX0KKwkJZWNobz1lY2hvOyBbIC14IC9iaW4vZWNobyBdICYmIGVjaG89L2Jpbi9lY2hvCisJCWV4ZWMgJGVjaG8gc3VidGVzdC0xIGhpCisJRU9GCisJZWNobyBzdWJ0ZXN0LTEgZm9vLyoKKwlUTVBESVI9JFBXRC9mb28gIiRfX3Byb2duYW1lIiA8PC0gJ0VPRicKKwkJZWNobz1lY2hvOyBbIC14IC9iaW4vZWNobyBdICYmIGVjaG89L2Jpbi9lY2hvCisJCXNlZCAncy9eL1ggLycgPDwgRV9PX0Y7IGV4ZWMgJGVjaG8gc3VidGVzdC0yIGhpCisJCWEKKwkJZmV3CisJCWxpbmVzCisJCUVfT19GCisJRU9GCisJZWNobyBzdWJ0ZXN0LTIgZm9vLyoKK2V4cGVjdGVkLXN0ZG91dDoKKwlzdWJ0ZXN0LTEgaGkKKwlzdWJ0ZXN0LTEgZm9vLyoKKwlYIGEKKwlYIGZldworCVggbGluZXMKKwlzdWJ0ZXN0LTIgaGkKKwlzdWJ0ZXN0LTIgZm9vLyoKKy0tLQorbmFtZTogcmVncmVzc2lvbi00OQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB1bnNldCBwYXJhbXMgd2l0aCBhdHRyaWJ1dGVzIGFyZSByZXBvcnRlZCBieSBzZXQsIHRob3NlCisJc2FucyBhdHRyaWJ1dGVzIGFyZSBub3QuCitzdGRpbjoKKwl1bnNldCBGT08gQkFSCisJZWNobyBYJEZPTworCWV4cG9ydCBCQVIKKwl0eXBlc2V0IC1pIEJMQUgKKwlzZXQgfCBncmVwIEZPTworCXNldCB8IGdyZXAgQkFSCisJc2V0IHwgZ3JlcCBCTEFICitleHBlY3RlZC1zdGRvdXQ6CisJWAorCUJBUgorCUJMQUgKKy0tLQorbmFtZTogcmVncmVzc2lvbi01MAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbGlhc2VzIGRvIG5vdCB1c2UgY29udGludWF0aW9uIHByb21wdCBhZnRlciB0cmFpbGluZworCXNlbWktY29sb24uCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZW52IgorCVBTMT1ZCisJUFMyPVgKK2Vudi1zZXR1cDogIUVOVj0uL2VudiEKK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJYWxpYXMgZm9vPSdlY2hvIGhpIDsgJworCWZvbworCWZvbyBlY2hvIHRoZXJlCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwloaQorCXRoZXJlCitleHBlY3RlZC1zdGRlcnI6ICEKKwlZWVlZCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc2V0IGFsbG93cyBib3RoICtvIGFuZCAtbyBvcHRpb25zIG9uIHNhbWUgY29tbWFuZCBsaW5lLgorc3RkaW46CisJc2V0IGEgYiBjCisJc2V0IC1vIG5vZ2xvYiArbyBhbGxleHBvcnQKKwllY2hvIEE6ICQqLCAqCitleHBlY3RlZC1zdGRvdXQ6CisJQTogYSBiIGMsICoKKy0tLQorbmFtZTogcmVncmVzc2lvbi01MgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBnbG9iYmluZyB3b3JrcyBpbiBwaXBlbGluZWQgY29tbWFuZHMKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJlbnYiCisJUFMxPVAKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCisJc3R1ZmYKK2Vudi1zZXR1cDogIUVOVj0uL2VudiEKK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJc2VkICdzL14vWCAvJyA8IGFiKgorCWVjaG8gbWFyayAxCisJc2VkICdzL14vWCAvJyA8IGFiKiB8IHNlZCAncy9eL1kgLycKKwllY2hvIG1hcmsgMgorZXhwZWN0ZWQtc3Rkb3V0OgorCVggc3R1ZmYKKwltYXJrIDEKKwlZIFggc3R1ZmYKKwltYXJrIDIKK2V4cGVjdGVkLXN0ZGVycjogIQorCVBQUFBQCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZ2V0b3B0cyB3b3JrcyBpbiBmdW5jdGlvbnMKK3N0ZGluOgorCWJmdW5jKCkgeworCSAgICBlY2hvIGJmdW5jOiBlbnRlciAiKGFyZ3M6ICQqOyBPUFRJTkQ9JE9QVElORCkiCisJICAgIHdoaWxlIGdldG9wdHMgQiBvYzsgZG8KKwkJY2FzZSAkb2MgaW4KKwkJICAoQikKKwkJICAgIGVjaG8gYmZ1bmM6IEIgb3B0aW9uCisJCSAgICA7OworCQkgICgqKQorCQkgICAgZWNobyBiZnVuYzogb2RkIG9wdGlvbiAiKCRvYykiCisJCSAgICA7OworCQllc2FjCisJICAgIGRvbmUKKwkgICAgZWNobyBiZnVuYzogbGVhdmUKKwl9CisJCisJZnVuY3Rpb24ga2Z1bmMgeworCSAgICBlY2hvIGtmdW5jOiBlbnRlciAiKGFyZ3M6ICQqOyBPUFRJTkQ9JE9QVElORCkiCisJICAgIHdoaWxlIGdldG9wdHMgSyBvYzsgZG8KKwkJY2FzZSAkb2MgaW4KKwkJICAoSykKKwkJICAgIGVjaG8ga2Z1bmM6IEsgb3B0aW9uCisJCSAgICA7OworCQkgICgqKQorCQkgICAgZWNobyBiZnVuYzogb2RkIG9wdGlvbiAiKCRvYykiCisJCSAgICA7OworCQllc2FjCisJICAgIGRvbmUKKwkgICAgZWNobyBrZnVuYzogbGVhdmUKKwl9CisJCisJc2V0IC0tIC1mIC1iIC1rIC1sCisJZWNobyAibGluZSAxOiBPUFRJTkQ9JE9QVElORCIKKwlnZXRvcHRzIGtiZmwgb3B0YworCWVjaG8gImxpbmUgMjogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKKwliZnVuYyAtQkJCIGJsYWgKKwllY2hvICJsaW5lIDM6IE9QVElORD0kT1BUSU5EIgorCWdldG9wdHMga2JmbCBvcHRjCisJZWNobyAibGluZSA0OiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgorCWtmdW5jIC1LS0sgYmxhaAorCWVjaG8gImxpbmUgNTogT1BUSU5EPSRPUFRJTkQiCisJZ2V0b3B0cyBrYmZsIG9wdGMKKwllY2hvICJsaW5lIDY6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCisJZWNobworCQorCU9QVElORD0xCisJc2V0IC0tIC1mYmtsCisJZWNobyAibGluZSAxMDogT1BUSU5EPSRPUFRJTkQiCisJZ2V0b3B0cyBrYmZsIG9wdGMKKwllY2hvICJsaW5lIDIwOiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgorCWJmdW5jIC1CQkIgYmxhaAorCWVjaG8gImxpbmUgMzA6IE9QVElORD0kT1BUSU5EIgorCWdldG9wdHMga2JmbCBvcHRjCisJZWNobyAibGluZSA0MDogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKKwlrZnVuYyAtS0tLIGJsYWgKKwllY2hvICJsaW5lIDUwOiBPUFRJTkQ9JE9QVElORCIKKwlnZXRvcHRzIGtiZmwgb3B0YworCWVjaG8gImxpbmUgNjA6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxOiBPUFRJTkQ9MQorCWxpbmUgMjogcmV0PTAsIG9wdGM9ZiwgT1BUSU5EPTIKKwliZnVuYzogZW50ZXIgKGFyZ3M6IC1CQkIgYmxhaDsgT1BUSU5EPTIpCisJYmZ1bmM6IEIgb3B0aW9uCisJYmZ1bmM6IEIgb3B0aW9uCisJYmZ1bmM6IGxlYXZlCisJbGluZSAzOiBPUFRJTkQ9MgorCWxpbmUgNDogcmV0PTAsIG9wdGM9YiwgT1BUSU5EPTMKKwlrZnVuYzogZW50ZXIgKGFyZ3M6IC1LS0sgYmxhaDsgT1BUSU5EPTEpCisJa2Z1bmM6IEsgb3B0aW9uCisJa2Z1bmM6IEsgb3B0aW9uCisJa2Z1bmM6IEsgb3B0aW9uCisJa2Z1bmM6IGxlYXZlCisJbGluZSA1OiBPUFRJTkQ9MworCWxpbmUgNjogcmV0PTAsIG9wdGM9aywgT1BUSU5EPTQKKwkKKwlsaW5lIDEwOiBPUFRJTkQ9MQorCWxpbmUgMjA6IHJldD0wLCBvcHRjPWYsIE9QVElORD0yCisJYmZ1bmM6IGVudGVyIChhcmdzOiAtQkJCIGJsYWg7IE9QVElORD0yKQorCWJmdW5jOiBCIG9wdGlvbgorCWJmdW5jOiBCIG9wdGlvbgorCWJmdW5jOiBsZWF2ZQorCWxpbmUgMzA6IE9QVElORD0yCisJbGluZSA0MDogcmV0PTEsIG9wdGM9PywgT1BUSU5EPTIKKwlrZnVuYzogZW50ZXIgKGFyZ3M6IC1LS0sgYmxhaDsgT1BUSU5EPTEpCisJa2Z1bmM6IEsgb3B0aW9uCisJa2Z1bmM6IEsgb3B0aW9uCisJa2Z1bmM6IEsgb3B0aW9uCisJa2Z1bmM6IGxlYXZlCisJbGluZSA1MDogT1BUSU5EPTIKKwlsaW5lIDYwOiByZXQ9MSwgb3B0Yz0/LCBPUFRJTkQ9MgorLS0tCituYW1lOiByZWdyZXNzaW9uLTU0CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IDsgaXMgbm90IHJlcXVpcmVkIGJlZm9yZSB0aGUgdGhlbiBpbiBpZiAoKCAuLi4gKSkgdGhlbiAuLi4KK3N0ZGluOgorCWlmICgoIDEgKSkgdGhlbgorCSAgICBlY2hvIG9rIGRwYXJlbgorCWZpCisJaWYgW1sgLW4gMSBdXSB0aGVuCisJICAgIGVjaG8gb2sgZGJyYWNrZXRzCisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlvayBkcGFyZW4KKwlvayBkYnJhY2tldHMKKy0tLQorbmFtZTogcmVncmVzc2lvbi01NQorZGVzY3JpcHRpb246CisJQ2hlY2sgJHtmb286JWJhcn0gaXMgYWxsb3dlZCAoa3NoODggYWxsb3dzIGl0Li4uKQorc3RkaW46CisJeD1mb29YYmFyWGJsYWgKKwllY2hvIDEgJHt4JVgqfQorCWVjaG8gMiAke3g6JVgqfQorCWVjaG8gMyAke3glJVgqfQorCWVjaG8gNCAke3g6JSVYKn0KKwllY2hvIDUgJHt4IypYfQorCWVjaG8gNiAke3g6IypYfQorCWVjaG8gNyAke3gjIypYfQorCWVjaG8gOCAke3g6IyMqWH0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxIGZvb1hiYXIKKwkyIGZvb1hiYXIKKwkzIGZvbworCTQgZm9vCisJNSBiYXJYYmxhaAorCTYgYmFyWGJsYWgKKwk3IGJsYWgKKwk4IGJsYWgKKy0tLQorbmFtZTogcmVncmVzc2lvbi01NworZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgdHlwZXNldCBvdXRwdXQgaXMgY29ycmVjdCBmb3IKKwl1bmluaXRpYWxpc2VkIGFycmF5IGVsZW1lbnRzLgorc3RkaW46CisJdHlwZXNldCAtaSB4eHhbNF0KKwllY2hvIEEKKwl0eXBlc2V0IC1pIHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKKwllY2hvIEIKKwl0eXBlc2V0IHwgZ3JlcCB4eHggfCBzZWQgJ3MvXi8gICAgLycKKwkKKwl4eHhbMV09Mis1CisJZWNobyBNCisJdHlwZXNldCAtaSB8IGdyZXAgeHh4IHwgc2VkICdzL14vICAgIC8nCisJZWNobyBOCisJdHlwZXNldCB8IGdyZXAgeHh4IHwgc2VkICdzL14vICAgIC8nCitleHBlY3RlZC1zdGRvdXQ6CisJQQorCSAgICB4eHgKKwlCCisJICAgIHR5cGVzZXQgLWkgeHh4CisJTQorCSAgICB4eHhbMV09NworCU4KKwkgICAgdHlwZXNldCAtaSB4eHgKKy0tLQorbmFtZTogcmVncmVzc2lvbi01OAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgdHJhcCBleGl0IGlzIG9rIChleGl0IG5vdCBtaXN0YWtlbiBmb3Igc2lnbmFsIG5hbWUpCitzdGRpbjoKKwl0cmFwICdlY2hvIGhpJyBleGl0CisJdHJhcCBleGl0IDEKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorLS0tCituYW1lOiByZWdyZXNzaW9uLTU5CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiAkeyNhcnJheVsqXX0gaXMgY2FsY3VsYXRlZCBjb3JyZWN0bHkuCitzdGRpbjoKKwlhWzEyXT1oaQorCWFbOF09dGhlcmUKKwllY2hvICR7I2FbKl19CitleHBlY3RlZC1zdGRvdXQ6CisJMgorLS0tCituYW1lOiByZWdyZXNzaW9uLTYwCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBkZWZhdWx0IGV4aXQgc3RhdHVzIGlzIHByZXZpb3VzIGNvbW1hbmQKK3N0ZGluOgorCSh0cnVlOyBleGl0KQorCWVjaG8gQSAkPworCShmYWxzZTsgZXhpdCkKKwllY2hvIEIgJD8KKwkoIChleGl0IDEwMykgOyBleGl0KQorCWVjaG8gQyAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCUEgMAorCUIgMQorCUMgMTAzCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNjEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEVYSVQgdHJhcCBpcyBleGVjdXRlZCBmb3Igc3ViIHNoZWxscy4KK3N0ZGluOgorCXRyYXAgJ2VjaG8gcGFyZW50IGV4aXQnIEVYSVQKKwllY2hvIHN0YXJ0CisJKGVjaG8gQTsgZWNobyBBIGxhc3QpCisJZWNobyBCCisJKGVjaG8gQzsgdHJhcCAnZWNobyBzdWIgZXhpdCcgRVhJVDsgZWNobyBDIGxhc3QpCisJZWNobyBwYXJlbnQgbGFzdAorZXhwZWN0ZWQtc3Rkb3V0OgorCXN0YXJ0CisJQQorCUEgbGFzdAorCUIKKwlDCisJQyBsYXN0CisJc3ViIGV4aXQKKwlwYXJlbnQgbGFzdAorCXBhcmVudCBleGl0CistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNjIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHRlc3QgLW50Ly1vdCBzdWNjZWVkcyBpZiBzZWNvbmQoZmlyc3QpIGZpbGUgaXMgbWlzc2luZy4KK3N0ZGluOgorCXRvdWNoIGEKKwl0ZXN0IGEgLW50IGIgJiYgZWNobyBudCBPSyB8fCBlY2hvIG50IEJBRAorCXRlc3QgYiAtb3QgYSAmJiBlY2hvIG90IE9LIHx8IGVjaG8gb3QgQkFECitleHBlY3RlZC1zdGRvdXQ6CisJbnQgT0sKKwlvdCBPSworLS0tCituYW1lOiByZWdyZXNzaW9uLTYzCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB0eXBlc2V0LCBleHBvcnQsIGFuZCByZWFkb25seSB3b3JrCitzdGRpbjoKKwl7CisJCWVjaG8gRk5PUkQtMAorCQlGTk9SRF9BPTEKKwkJRk5PUkRfQj0yCisJCUZOT1JEX0M9MworCQlGTk9SRF9EPTQKKwkJRk5PUkRfRT01CisJCUZOT1JEX0Y9NgorCQlGTk9SRF9HPTcKKwkJRk5PUkRfSD04CisJCWludGVnZXIgRk5PUkRfRSBGTk9SRF9GIEZOT1JEX0cgRk5PUkRfSAorCQlleHBvcnQgRk5PUkRfQyBGTk9SRF9EIEZOT1JEX0cgRk5PUkRfSAorCQlyZWFkb25seSBGTk9SRF9CIEZOT1JEX0QgRk5PUkRfRiBGTk9SRF9ICisJCWVjaG8gRk5PUkQtMQorCQlleHBvcnQKKwkJZWNobyBGTk9SRC0yCisJCWV4cG9ydCAtcAorCQllY2hvIEZOT1JELTMKKwkJcmVhZG9ubHkKKwkJZWNobyBGTk9SRC00CisJCXJlYWRvbmx5IC1wCisJCWVjaG8gRk5PUkQtNQorCQl0eXBlc2V0CisJCWVjaG8gRk5PUkQtNgorCQl0eXBlc2V0IC1wCisJCWVjaG8gRk5PUkQtNworCQl0eXBlc2V0IC0KKwkJZWNobyBGTk9SRC04CisJfSB8IGZncmVwIEZOT1JECitleHBlY3RlZC1zdGRvdXQ6CisJRk5PUkQtMAorCUZOT1JELTEKKwlGTk9SRF9DCisJRk5PUkRfRAorCUZOT1JEX0cKKwlGTk9SRF9ICisJRk5PUkQtMgorCWV4cG9ydCBGTk9SRF9DPTMKKwlleHBvcnQgRk5PUkRfRD00CisJZXhwb3J0IEZOT1JEX0c9NworCWV4cG9ydCBGTk9SRF9IPTgKKwlGTk9SRC0zCisJRk5PUkRfQgorCUZOT1JEX0QKKwlGTk9SRF9GCisJRk5PUkRfSAorCUZOT1JELTQKKwlyZWFkb25seSBGTk9SRF9CPTIKKwlyZWFkb25seSBGTk9SRF9EPTQKKwlyZWFkb25seSBGTk9SRF9GPTYKKwlyZWFkb25seSBGTk9SRF9IPTgKKwlGTk9SRC01CisJdHlwZXNldCBGTk9SRF9BCisJdHlwZXNldCAtciBGTk9SRF9CCisJdHlwZXNldCAteCBGTk9SRF9DCisJdHlwZXNldCAteCAtciBGTk9SRF9ECisJdHlwZXNldCAtaSBGTk9SRF9FCisJdHlwZXNldCAtaSAtciBGTk9SRF9GCisJdHlwZXNldCAtaSAteCBGTk9SRF9HCisJdHlwZXNldCAtaSAteCAtciBGTk9SRF9ICisJRk5PUkQtNgorCXR5cGVzZXQgRk5PUkRfQT0xCisJdHlwZXNldCAtciBGTk9SRF9CPTIKKwl0eXBlc2V0IC14IEZOT1JEX0M9MworCXR5cGVzZXQgLXggLXIgRk5PUkRfRD00CisJdHlwZXNldCAtaSBGTk9SRF9FPTUKKwl0eXBlc2V0IC1pIC1yIEZOT1JEX0Y9NgorCXR5cGVzZXQgLWkgLXggRk5PUkRfRz03CisJdHlwZXNldCAtaSAteCAtciBGTk9SRF9IPTgKKwlGTk9SRC03CisJRk5PUkRfQT0xCisJRk5PUkRfQj0yCisJRk5PUkRfQz0zCisJRk5PUkRfRD00CisJRk5PUkRfRT01CisJRk5PUkRfRj02CisJRk5PUkRfRz03CisJRk5PUkRfSD04CisJRk5PUkQtOAorLS0tCituYW1lOiByZWdyZXNzaW9uLTY0CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHdlIGNhbiByZWRlZmluZSBmdW5jdGlvbnMgY2FsbGluZyB0aW1lIGJ1aWx0aW4KK3N0ZGluOgorCXQoKSB7CisJCXRpbWUgPi9kZXYvbnVsbAorCX0KKwl0IDI+L2Rldi9udWxsCisJdCgpIHsKKwkJdGltZQorCX0KKy0tLQorbmFtZTogc3ludGF4LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgbG9uZSBhbXBlcnNhbmQgaXMgYSBzeW50YXggZXJyb3IKK3N0ZGluOgorCSAmCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9zeW50YXggZXJyb3IvCistLS0KK25hbWU6IHh4eC1xdW90ZWQtbmV3bGluZS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFw8bmV3bGluZT4gd29ya3MgaW5zaWRlIG9mICR7fQorc3RkaW46CisJYWJjPTIKKwllY2hvICR7YWJcCisJY30KK2V4cGVjdGVkLXN0ZG91dDoKKwkyCistLS0KK25hbWU6IHh4eC1xdW90ZWQtbmV3bGluZS0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFw8bmV3bGluZT4gd29ya3MgYXQgdGhlIHN0YXJ0IG9mIGEgaGVyZSBkb2N1bWVudAorc3RkaW46CisJY2F0IDw8IEVPXAorCUYKKwloaQorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCistLS0KK25hbWU6IHh4eC1xdW90ZWQtbmV3bGluZS0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFw8bmV3bGluZT4gd29ya3MgYXQgdGhlIGVuZCBvZiBhIGhlcmUgZG9jdW1lbnQKK3N0ZGluOgorCWNhdCA8PCBFT0YKKwloaQorCUVPXAorCUYKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorLS0tCituYW1lOiB4eHgtbXVsdGktYXNzaWdubWVudC1jbWQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYXNzaWdubWVudHMgaW4gYSBjb21tYW5kIGFmZmVjdCBzdWJzZXF1ZW50IGFzc2lnbm1lbnRzCisJaW4gdGhlIHNhbWUgY29tbWFuZAorc3RkaW46CisJRk9PPWFiYworCUZPTz0xMjMgQkFSPSRGT08KKwllY2hvICRCQVIKK2V4cGVjdGVkLXN0ZG91dDoKKwkxMjMKKy0tLQorbmFtZTogeHh4LW11bHRpLWFzc2lnbm1lbnQtcG9zaXgtY21kCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBiZWhhdmlvdXIgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzIHdpdGggYQorCWNvbW1hbmQgbmFtZSBtYXRjaGVzIFBPU0lYLiBTZWU6CisJaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUuY29tcC5zdGFuZGFyZHMucG9zaXguYXVzdGluLmdlbmVyYWwvMTkyNQorc3RkaW46CisJWD1hIFk9YjsgWD0kWSBZPSRYICIkX19wcm9nbmFtZSIgLWMgJ2VjaG8gMSAkWCAkWSAuJzsgZWNobyAyICRYICRZIC4KKwl1bnNldCBYIFkgWgorCVg9YSBZPSR7WD1ifSBaPSRYICIkX19wcm9nbmFtZSIgLWMgJ2VjaG8gMyAkWiAuJworCXVuc2V0IFggWSBaCisJWD1hIFk9JHtYPWJ9IFo9JFg7IGVjaG8gNCAkWiAuCitleHBlY3RlZC1zdGRvdXQ6CisJMSBiIGEgLgorCTIgYSBiIC4KKwkzIGIgLgorCTQgYSAuCistLS0KK25hbWU6IHh4eC1tdWx0aS1hc3NpZ25tZW50LXBvc2l4LW5vY21kCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBiZWhhdmlvdXIgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzIHdpdGggbm8KKwljb21tYW5kIG5hbWUgbWF0Y2hlcyBQT1NJWCAoRGViaWFuICMzMzQxODIpLiBTZWU6CisJaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUuY29tcC5zdGFuZGFyZHMucG9zaXguYXVzdGluLmdlbmVyYWwvMTkyNQorc3RkaW46CisJWD1hIFk9YjsgWD0kWSBZPSRYOyBlY2hvIDEgJFggJFkgLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgYiBiIC4KKy0tLQorbmFtZTogeHh4LW11bHRpLWFzc2lnbm1lbnQtcG9zaXgtc3ViYXNzaWduCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBiZWhhdmlvdXIgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzIG1hdGNoZXMgUE9TSVg6CisJLSBUaGUgYXNzaWdubWVudCB3b3JkcyBzaGFsbCBiZSBleHBhbmRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24KKwkgIGVudmlyb25tZW50LgorCS0gVGhlIGFzc2lnbm1lbnRzIGhhcHBlbiBpbiB0aGUgdGVtcG9yYXJ5IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KK3N0ZGluOgorCXVuc2V0IFggWSBaCisJWj1hIFk9JHtYOj1ifSBzaCAtYyAnZWNobyArJFgrICskWSsgKyRaKycKKwllY2hvIC8kWC8KKwkjIE5vdyBmb3IgdGhlIHNwZWNpYWwgY2FzZToKKwl1bnNldCBYIFkgWgorCVg9IFk9JHtYOj1ifSBzaCAtYyAnZWNobyArJFgrICskWSsnCisJZWNobyAvJFgvCitleHBlY3RlZC1zdGRvdXQ6CisJKysgK2IrICthKworCS9iLworCSsrICtiKworCS9iLworLS0tCituYW1lOiB4eHgtZXhlYy1lbnZpcm9ubWVudC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0byBzZWUgaWYgZXhlYyBzZXRzIGl0J3MgZW52aXJvbm1lbnQgY29ycmVjdGx5CitzdGRpbjoKKwlGT089YmFyIGV4ZWMgZW52CitleHBlY3RlZC1zdGRvdXQtcGF0dGVybjoKKwkvKF58LipcbilGT089YmFyXG4vCistLS0KK25hbWU6IHh4eC1leGVjLWVudmlyb25tZW50LTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRvIG1ha2Ugc3VyZSBleGVjIGRvZXNuJ3QgY2hhbmdlIGVudmlyb25tZW50IGlmIGEgcHJvZ3JhbQorCWlzbid0IGV4ZWMtZWQKK3N0ZGluOgorCXNvcnRwcm9nPSQod2hlbmNlIC1wIHNvcnQpIHx8IHNvcnRwcm9nPWNhdAorCWVudiB8ICRzb3J0cHJvZyB8IGdyZXAgLXYgJ15SQU5ET009JyA+YmFyMQorCUZPTz1iYXIgZXhlYzsgZW52IHwgJHNvcnRwcm9nIHwgZ3JlcCAtdiAnXlJBTkRPTT0nID5iYXIyCisJY21wIC1zIGJhcjEgYmFyMgorLS0tCituYW1lOiBleGVjLWZ1bmN0aW9uLWVudmlyb25tZW50LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGFzc2lnbm1lbnRzIGluIGZ1bmN0aW9uIGNhbGxzIGFuZCB3aGV0aGVyIHRoZXkgYWZmZWN0CisJdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50IChrc2g5MywgU1VTdjQpCitzdGRpbjoKKwlmKCkgeyBhPTI7IH07IGcoKSB7IGI9MzsgZWNobyB5JGMtOyB9OyBhPTEgZjsgYj0yOyBjPTEgZworCWVjaG8geCRhLSRiLSB6JGMtCitleHBlY3RlZC1zdGRvdXQ6CisJeTEtCisJeDItMy0gejEtCistLS0KK25hbWU6IHh4eC13aGF0LWRvLXlvdS1jYWxsLXRoaXMtMQorc3RkaW46CisJZWNobyAiJHtmb286LSJhIn0qIgorZXhwZWN0ZWQtc3Rkb3V0OgorCWEqCistLS0KK25hbWU6IHh4eC1wcmVmaXgtc3RyaXAtMQorc3RkaW46CisJZm9vPSdhIGNkZWYnCisJZWNobyAke2ZvbyNhIGN9CitleHBlY3RlZC1zdGRvdXQ6CisJZGVmCistLS0KK25hbWU6IHh4eC1wcmVmaXgtc3RyaXAtMgorc3RkaW46CisJc2V0IGEgYworCXg9J2EgY2RlZicKKwllY2hvICR7eCMkKn0KK2V4cGVjdGVkLXN0ZG91dDoKKwlkZWYKKy0tLQorbmFtZTogeHh4LXZhcmlhYmxlLXN5bnRheC0xCitzdGRpbjoKKwllY2hvICR7On0KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9iYWQgc3Vic3RpdHV0aW9uLworZXhwZWN0ZWQtZXhpdDogMQorLS0tCituYW1lOiB4eHgtdmFyaWFibGUtc3ludGF4LTIKK3N0ZGluOgorCXNldCAwCisJZWNobyAkeyo6MH0KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9iYWQgc3Vic3RpdHV0aW9uLworZXhwZWN0ZWQtZXhpdDogMQorLS0tCituYW1lOiB4eHgtdmFyaWFibGUtc3ludGF4LTMKK3N0ZGluOgorCXNldCAtQSBmb28gMAorCWVjaG8gJHtmb29bKl06MH0KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9iYWQgc3Vic3RpdHV0aW9uLworZXhwZWN0ZWQtZXhpdDogMQorLS0tCituYW1lOiB4eHgtc3Vic3RpdHV0aW9uLWV2YWwtb3JkZXIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIG9yZGVyIG9mIGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMKK3N0ZGluOgorCWk9MSB4PSB5PQorCXNldCAtQSBBIGFiYyBkZWYgR0hJIGogRyBrCisJZWNobyAke0FbeD0oaSs9MSldIyR7QVt5PShpKz0yKV19fQorCWVjaG8gJHggJHkKK2V4cGVjdGVkLXN0ZG91dDoKKwlISQorCTIgNAorLS0tCituYW1lOiB4eHgtc2V0LW9wdGlvbi0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBvcHRpb24gcGFyc2luZyBpbiBzZXQKK3N0ZGluOgorCXNldCAtdnNBIGZvbyAtLSBBIDEgMyAyCisJZWNobyAke2Zvb1sqXX0KK2V4cGVjdGVkLXN0ZGVycjoKKwllY2hvICR7Zm9vWypdfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgMiAzIEEKKy0tLQorbmFtZTogeHh4LWV4ZWMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBleGVjIGV4aXRzIGZvciBidWlsdC1pbnMKK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJZXhlYyBlY2hvIGhpCisJZWNobyBzdGlsbCBoZXJyZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4qLworLS0tCituYW1lOiB4eHgtd2hpbGUtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB3aGlsZSBsb29wcworCVhYWCBuZWVkIHRvIGRvIHNhbWUgZm9yIGZvci9zZWxlY3QvdW50aWwgbG9vcHMKK3N0ZGluOgorCWk9eAorCXdoaWxlIFsgJGkgIT0geHh4IF0gOyBkbworCSAgICBpPXgkaQorCSAgICBpZiBbICRpID0geHh4IF0gOyB0aGVuCisJCWZhbHNlCisJCWNvbnRpbnVlCisJICAgIGZpCisJZG9uZQorCWVjaG8gbG9vcDE9JD8KKwkKKwlpPXgKKwl3aGlsZSBbICRpICE9IHh4eCBdIDsgZG8KKwkgICAgaT14JGkKKwkgICAgaWYgWyAkaSA9IHh4eCBdIDsgdGhlbgorCQlmYWxzZQorCQlicmVhaworCSAgICBmaQorCWRvbmUKKwllY2hvIGxvb3AyPSQ/CisJCisJaT14CisJd2hpbGUgWyAkaSAhPSB4eHggXSA7IGRvCisJICAgIGk9eCRpCisJICAgIGZhbHNlCisJZG9uZQorCWVjaG8gbG9vcDM9JD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlsb29wMT0wCisJbG9vcDI9MAorCWxvb3AzPTEKKy0tLQorbmFtZTogeHh4LXN0YXR1cy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGJsYW5rIGxpbmVzIGRvbid0IGNsZWFyICQ/Cithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCShleGl0IDEpCisJZWNobyAkPworCShleGl0IDEpCisJCisJZWNobyAkPworCXRydWUKK2V4cGVjdGVkLXN0ZG91dDoKKwkxCisJMQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKi8KKy0tLQorbmFtZTogeHh4LXN0YXR1cy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0ICQ/IGlzIHByZXNlcnZlZCBpbiBzdWJzaGVsbHMsIGluY2x1ZGVzLCB0cmFwcy4KK3N0ZGluOgorCShleGl0IDEpCisJCisJZWNobyBibGFuazogJD8KKwkKKwkoZXhpdCAyKQorCShlY2hvIHN1YnNoZWxsOiAkPykKKwkKKwllY2hvICdlY2hvIGluY2x1ZGU6ICQ/JyA+IGZvbworCShleGl0IDMpCisJLiAuL2ZvbworCQorCXRyYXAgJ2VjaG8gdHJhcDogJD8nIEVSUgorCShleGl0IDQpCisJZWNobyBleGl0OiAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCWJsYW5rOiAxCisJc3Vic2hlbGw6IDIKKwlpbmNsdWRlOiAzCisJdHJhcDogNAorCWV4aXQ6IDQKKy0tLQorbmFtZTogeHh4LWNsZWFuLWNoYXJzLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIE1BR0lDIGNoYXJhY3RlciBpcyBzdHVmZmVkIGNvcnJlY3RseQorc3RkaW46CisJZWNobyBgZWNobyBbo2AKK2V4cGVjdGVkLXN0ZG91dDoKKwlboworLS0tCituYW1lOiB4eHgtcGFyYW0tc3Vic3QtcW1hcmstMQorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcHJlc2lvbiBvZiBlcnJvciBtZXNzYWdlIHdpdGggbnVsbCBzdHJpbmcuICBBY2NvcmRpbmcgdG8KKwlQT1NJWCwgaXQgc2hvdWxkbid0IHByaW50IHRoZSBlcnJvciBhcyAnd29yZCcgaXNuJ3Qgb21taXR0ZWQuCisJa3NoODgvOTMsIFNvbGFyaXMgL2Jpbi9zaCBhbmQgL3Vzci94cGc0L2Jpbi9zaCBhbGwgcHJpbnQgdGhlIGVycm9yLAorCXRoYXQncyB3aHkgdGhlIGNvbmRpdGlvbiBpcyByZXZlcnNlZC4KK3N0ZGluOgorCXVuc2V0IGZvbworCXg9CisJZWNobyB4JHtmb28/JHh9CitleHBlY3RlZC1leGl0OiAxCisjIFBPU0lYCisjZXhwZWN0ZWQtZmFpbDogeWVzCisjZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46ICEvbm90IHNldC8KKyMgY29tbW9uIHVzZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC9wYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0LworLS0tCituYW1lOiB4eHgtcGFyYW0tXy0xCisjIGZhaWxzIGR1ZSB0byB3ZWlyZG5lc3Mgb2YgZXhlY3Ygc3R1ZmYKK2NhdGVnb3J5OiAhb3M6dXdpbi1udAorZGVzY3JpcHRpb246CisJQ2hlY2sgYyBmbGFnIGlzIHNldC4KK2FyZ3VtZW50czogIS1jIWVjaG8gIlskLV0iIQorZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm46IC9eXFsuKmMuKlxdJC8KKy0tLQorbmFtZTogdGlsZGUtZXhwYW5kLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRpbGRlIGV4cGFuc2lvbiBhZnRlciBlcXVhbCBzaWducworZW52LXNldHVwOiAhSE9NRT0vc3dlZXQhCitzdGRpbjoKKwllY2hvICR7QT1hPX1+IGI9fiBjPWR+IH4KKwlzZXQgK28gYnJhY2VleHBhbmQKKwllY2hvICR7QT1hPX1+IGI9fiBjPWR+IH4KK2V4cGVjdGVkLXN0ZG91dDoKKwlhPS9zd2VldCBiPS9zd2VldCBjPWR+IC9zd2VldAorCWE9fiBiPX4gYz1kfiAvc3dlZXQKKy0tLQorbmFtZTogZXhpdC1lcnItMQorZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSAiZXhpdCBvbiBlcnJvciIgY29uZGl0aW9ucworc3RkaW46CisJc2V0IC1leAorCS91c3IvYmluL2VudiBmYWxzZSAmJiBlY2hvIHNvbWV0aGluZworCWVjaG8gRU5ECitleHBlY3RlZC1zdGRvdXQ6CisJRU5ECitleHBlY3RlZC1zdGRlcnI6CisJKyAvdXNyL2Jpbi9lbnYgZmFsc2UKKwkrIGVjaG8gRU5ECistLS0KK25hbWU6IGV4aXQtZXJyLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgImV4aXQgb24gZXJyb3IiIGVkZ2UgY29uZGl0aW9ucyAoUE9TSVhseSkKK3N0ZGluOgorCXNldCAtZXgKKwlpZiAvdXNyL2Jpbi9lbnYgdHJ1ZTsgdGhlbgorCQkvdXNyL2Jpbi9lbnYgZmFsc2UgJiYgZWNobyBzb21ldGhpbmcKKwlmaQorCWVjaG8gRU5ECitleHBlY3RlZC1zdGRvdXQ6CisJRU5ECitleHBlY3RlZC1zdGRlcnI6CisJKyAvdXNyL2Jpbi9lbnYgdHJ1ZQorCSsgL3Vzci9iaW4vZW52IGZhbHNlCisJKyBlY2hvIEVORAorLS0tCituYW1lOiBleGl0LWVyci0zCitkZXNjcmlwdGlvbjoKKwlwZGtzaCByZWdyZXNzaW9uIHdoaWNoIEFUJlQga3NoIGRvZXMgcmlnaHQKKwlURk0gc2F5czogW3NldF0gLWUgfCBlcnJleGl0CisJCUV4aXQgKGFmdGVyIGV4ZWN1dGluZyB0aGUgRVJSIHRyYXApIC4uLgorc3RkaW46CisJdHJhcCAnZWNobyBFWElUJyBFWElUCisJdHJhcCAnZWNobyBFUlInIEVSUgorCXNldCAtZQorCWNkIC9YWFhYWCAyPi9kZXYvbnVsbAorCWVjaG8gRE9ORQorCWV4aXQgMAorZXhwZWN0ZWQtc3Rkb3V0OgorCUVSUgorCUVYSVQKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorLS0tCituYW1lOiBleGl0LWVyci00CitkZXNjcmlwdGlvbjoKKwkic2V0IC1lIiB0ZXN0IHN1aXRlIChQT1NJWCkKK3N0ZGluOgorCXNldCAtZQorCWVjaG8gcHJlCisJaWYgdHJ1ZSA7IHRoZW4KKwkJZmFsc2UgJiYgZWNobyBmb28KKwlmaQorCWVjaG8gYmFyCitleHBlY3RlZC1zdGRvdXQ6CisJcHJlCisJYmFyCistLS0KK25hbWU6IGV4aXQtZXJyLTUKK2Rlc2NyaXB0aW9uOgorCSJzZXQgLWUiIHRlc3Qgc3VpdGUgKFBPU0lYKQorc3RkaW46CisJc2V0IC1lCisJZm9vKCkgeworCQl3aGlsZSBbICIkMSIgXTsgZG8KKwkJCWZvciBFIGluICR4OyBkbworCQkJCVsgIiQxIiA9ICIkRSIgXSAmJiB7IHNoaWZ0IDsgY29udGludWUgMiA7IH0KKwkJCWRvbmUKKwkJCXg9IiR4ICQxIgorCQkJc2hpZnQKKwkJZG9uZQorCQllY2hvICR4CisJfQorCWVjaG8gcHJlCisJZm9vIGEgYiBiIGMKKwllY2hvIHBvc3QKK2V4cGVjdGVkLXN0ZG91dDoKKwlwcmUKKwlhIGIgYworCXBvc3QKKy0tLQorbmFtZTogZXhpdC1lcnItNgorZGVzY3JpcHRpb246CisJInNldCAtZSIgdGVzdCBzdWl0ZSAoQlNEIG1ha2UpCitjYXRlZ29yeTogb3M6bWlyYnNkCitzdGRpbjoKKwlta2RpciB6ZCB6ZC9hIHpkL2IKKwlwcmludCAnYWxsOlxuXHRAZWNobyBlaW5zXG5cdEBleGl0IDQyXG4nID56ZC9hL01ha2VmaWxlCisJcHJpbnQgJ2FsbDpcblx0QGVjaG8gendlaVxuJyA+emQvYi9NYWtlZmlsZQorCXdkPSQocHdkKQorCXNldCAtZQorCWZvciBlbnRyeSBpbiBhIGI7IGRvICggIHNldCAtZTsgIGlmIFtbIC1kICR3ZC96ZC8kZW50cnkuaTM4NiBdXTsgdGhlbiAgX25ld2Rpcl89IiRlbnRyeS5pMzg2IjsgIGVsc2UgIF9uZXdkaXJfPSIkZW50cnkiOyAgZmk7ICBpZiBbWyAteiAkX1RISVNESVJfIF1dOyB0aGVuICBfbmV4dGRpcl89IiRfbmV3ZGlyXyI7ICBlbHNlICBfbmV4dGRpcl89IiRfVEhJU0RJUl8vJF9uZXdkaXJfIjsgIGZpOyAgX21ha2VmaWxlX3NwZWNfPTsgIFtbICEgLWYgJHdkL3pkLyRfbmV3ZGlyXy9NYWtlZmlsZS5ic2Qtd3JhcHBlciBdXSAgfHwgX21ha2VmaWxlX3NwZWNfPSItZiBNYWtlZmlsZS5ic2Qtd3JhcHBlciI7ICBzdWJza2lwZGlyPTsgIGZvciBza2lwZGlyIGluIDsgZG8gIHN1YmVudHJ5PSR7c2tpcGRpciMkZW50cnl9OyAgaWYgW1sgJHN1YmVudHJ5ICE9ICRza2lwZGlyIF1dOyB0aGVuICBpZiBbWyAteiAkc3ViZW50cnkgXV07IHRoZW4gIGVjaG8gIigkX25leHRkaXJfIHNraXBwZWQpIjsgIGJyZWFrOyAgZmk7ICBzdWJza2lwZGlyPSIkc3Vic2tpcGRpciAke3N1YmVudHJ5Iy99IjsgIGZpOyAgZG9uZTsgIGlmIFtbIC16ICRza2lwZGlyIHx8IC1uICRzdWJlbnRyeSBdXTsgdGhlbiAgZWNobyAiPT09PiAkX25leHRkaXJfIjsgIGNkICR3ZC96ZC8kX25ld2Rpcl87ICBtYWtlIFNLSVBESVI9IiRzdWJza2lwZGlyIiAkX21ha2VmaWxlX3NwZWNfICBfVEhJU0RJUl89IiRfbmV4dGRpcl8iICAgYWxsOyAgZmk7ICApIGRvbmUgMj4mMSB8IHNlZCAicyEkd2QhV0QhZyIKK2V4cGVjdGVkLXN0ZG91dDoKKwk9PT0+IGEKKwllaW5zCisJKioqIEVycm9yIGNvZGUgNDIKKwkKKwlTdG9wIGluIFdEL3pkL2EgKGxpbmUgMiBvZiBNYWtlZmlsZSkuCistLS0KK25hbWU6IGV4aXQtZW5vZW50LTEKK2Rlc2NyaXB0aW9uOgorCVNVU3Y0IHNheXMgdGhhdCB0aGUgc2hlbGwgc2hvdWxkIGV4aXQgd2l0aCAxMjYvMTI3IGluIHNvbWUgc2l0dWF0aW9ucworc3RkaW46CisJaT0wCisJKGVjaG87IGVjaG8gOikgPngKKwkiJF9fcHJvZ25hbWUiIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgorCSIkX19wcm9nbmFtZSIgLWMgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCisJZWNobyBleGl0IDQyID54CisJIiRfX3Byb2duYW1lIiAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KKwkiJF9fcHJvZ25hbWUiIC1jIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgorCXJtIC1mIHgKKwkiJF9fcHJvZ25hbWUiIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgorCSIkX19wcm9nbmFtZSIgLWMgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCitleHBlY3RlZC1zdGRvdXQ6CisJMCAwIC4KKwkxIDEyNiAuCisJMiA0MiAuCisJMyAxMjYgLgorCTQgMTI3IC4KKwk1IDEyNyAuCistLS0KK25hbWU6IGV4aXQtZXZhbC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBldmFsIHZzIHN1YnN0aXR1dGlvbiBleGl0IGNvZGVzIChrc2g5MyBhbGlrZSkKK3N0ZGluOgorCWV2YWwgJChmYWxzZSkKKwllY2hvIEEgJD8KKwlldmFsICcgJChmYWxzZSknCisJZWNobyBCICQ/CisJZXZhbCAiICQoZmFsc2UpIgorCWVjaG8gQyAkPworCWV2YWwgImV2YWwgJChmYWxzZSkiCisJZWNobyBEICQ/CisJZXZhbCAnZXZhbCAnIiQoZmFsc2UpIgorCWVjaG8gRSAkPworCUlGUz0iJElGUzoiCisJZXZhbCAkKGVjaG8gOjsgZmFsc2UpCisJZWNobyBGICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJQSAwCisJQiAxCisJQyAwCisJRCAwCisJRSAwCisJRiAwCistLS0KK25hbWU6IHRlc3Qtc3RsdC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRlc3QgYWxzbyBjYW4gaGFuZGxlIHN0cmluZzEgPCBzdHJpbmcyIGV0Yy4KK3N0ZGluOgorCXRlc3QgMjAwNS8xMC8wOCAnPCcgMjAwNS8wOC8yMSAmJiBlY2hvIGphIHx8IGVjaG8gbmVpbgorCXRlc3QgMjAwNS8wOC8yMSBcPCAyMDA1LzEwLzA4ICYmIGVjaG8gamEgfHwgZWNobyBuZWluCisJdGVzdCAyMDA1LzEwLzA4ICc+JyAyMDA1LzA4LzIxICYmIGVjaG8gamEgfHwgZWNobyBuZWluCisJdGVzdCAyMDA1LzA4LzIxIFw+IDIwMDUvMTAvMDggJiYgZWNobyBqYSB8fCBlY2hvIG5laW4KK2V4cGVjdGVkLXN0ZG91dDoKKwluZWluCisJamEKKwlqYQorCW5laW4KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAhL3VuZXhwZWN0ZWQgb3AvCistLS0KK25hbWU6IHRlc3QtcHJlY2VkZW5jZS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBhIHdlaXJkIHByZWNlZGVuY2UgY2FzZSAoYW5kIFBPU0lYIGVjaG8pCitzdGRpbjoKKwl0ZXN0IFwoIC1mID0gLWYgXCkKKwlydj0kPworCXRlc3QgLW4gIiRQT1NIX1ZFUlNJT04iIHx8IHNldCAtbyBzaAorCWVjaG8gLWUgJHJ2CitleHBlY3RlZC1zdGRvdXQ6CisJLWUgMAorLS0tCituYW1lOiB0ZXN0LW9wdGlvbi0xCitkZXNjcmlwdGlvbjoKKwlUZXN0IHRoZSB0ZXN0IC1vIG9wZXJhdG9yCitzdGRpbjoKKwlydW50ZXN0KCkgeworCQl0ZXN0IC1vICQxOyBlY2hvICQ/CisJCVsgLW8gJDEgXTsgZWNobyAkPworCQlbWyAtbyAkMSBdXTsgZWNobyAkPworCX0KKwlpZl90ZXN0KCkgeworCQl0ZXN0IC1vICQxIC1vIC1vICEkMTsgZWNobyAkPworCQlbIC1vICQxIC1vIC1vICEkMSBdOyBlY2hvICQ/CisJCVtbIC1vICQxIHx8IC1vICEkMSBdXTsgZWNobyAkPworCQl0ZXN0IC1vID8kMTsgZWNobyAkPworCX0KKwllY2hvIDB5ICQoaWZfdGVzdCB1dGY4LW1vZGUpID0KKwllY2hvIDBuICQoaWZfdGVzdCB1dGY4LWhhY2spID0KKwllY2hvIDE9ICQocnVudGVzdCB1dGY4LWhhY2spID0KKwllY2hvIDI9ICQocnVudGVzdCAhdXRmOC1oYWNrKSA9CisJZWNobyAzPSAkKHJ1bnRlc3QgP3V0ZjgtaGFjaykgPQorCXNldCArVQorCWVjaG8gMSsgJChydW50ZXN0IHV0ZjgtbW9kZSkgPQorCWVjaG8gMisgJChydW50ZXN0ICF1dGY4LW1vZGUpID0KKwllY2hvIDMrICQocnVudGVzdCA/dXRmOC1tb2RlKSA9CisJc2V0IC1VCisJZWNobyAxLSAkKHJ1bnRlc3QgdXRmOC1tb2RlKSA9CisJZWNobyAyLSAkKHJ1bnRlc3QgIXV0ZjgtbW9kZSkgPQorCWVjaG8gMy0gJChydW50ZXN0ID91dGY4LW1vZGUpID0KKwllY2hvID0gc2hvcnQgZmxhZ3MgPQorCWVjaG8gMHkgJChpZl90ZXN0IC1VKSA9CisJZWNobyAweSAkKGlmX3Rlc3QgK1UpID0KKwllY2hvIDBuICQoaWZfdGVzdCAtXykgPQorCWVjaG8gMG4gJChpZl90ZXN0IC1VLSkgPQorCWVjaG8gMT0gJChydW50ZXN0IC1fKSA9CisJZWNobyAyPSAkKHJ1bnRlc3QgIS1fKSA9CisJZWNobyAzPSAkKHJ1bnRlc3QgPy1fKSA9CisJc2V0ICtVCisJZWNobyAxKyAkKHJ1bnRlc3QgLVUpID0KKwllY2hvIDIrICQocnVudGVzdCAhLVUpID0KKwllY2hvIDMrICQocnVudGVzdCA/LVUpID0KKwllY2hvIDErICQocnVudGVzdCArVSkgPQorCWVjaG8gMisgJChydW50ZXN0ICErVSkgPQorCWVjaG8gMysgJChydW50ZXN0ID8rVSkgPQorCXNldCAtVQorCWVjaG8gMS0gJChydW50ZXN0IC1VKSA9CisJZWNobyAyLSAkKHJ1bnRlc3QgIS1VKSA9CisJZWNobyAzLSAkKHJ1bnRlc3QgPy1VKSA9CisJZWNobyAxLSAkKHJ1bnRlc3QgK1UpID0KKwllY2hvIDItICQocnVudGVzdCAhK1UpID0KKwllY2hvIDMtICQocnVudGVzdCA/K1UpID0KK2V4cGVjdGVkLXN0ZG91dDoKKwkweSAwIDAgMCAwID0KKwkwbiAxIDEgMSAxID0KKwkxPSAxIDEgMSA9CisJMj0gMSAxIDEgPQorCTM9IDEgMSAxID0KKwkxKyAxIDEgMSA9CisJMisgMCAwIDAgPQorCTMrIDAgMCAwID0KKwkxLSAwIDAgMCA9CisJMi0gMSAxIDEgPQorCTMtIDAgMCAwID0KKwk9IHNob3J0IGZsYWdzID0KKwkweSAwIDAgMCAwID0KKwkweSAwIDAgMCAwID0KKwkwbiAxIDEgMSAxID0KKwkwbiAxIDEgMSAxID0KKwkxPSAxIDEgMSA9CisJMj0gMSAxIDEgPQorCTM9IDEgMSAxID0KKwkxKyAxIDEgMSA9CisJMisgMCAwIDAgPQorCTMrIDAgMCAwID0KKwkxKyAxIDEgMSA9CisJMisgMCAwIDAgPQorCTMrIDAgMCAwID0KKwkxLSAwIDAgMCA9CisJMi0gMSAxIDEgPQorCTMtIDAgMCAwID0KKwkxLSAwIDAgMCA9CisJMi0gMSAxIDEgPQorCTMtIDAgMCAwID0KKy0tLQorbmFtZTogbWtzaHJjLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgfi8ubWtzaHJjIHdvcmtzIGNvcnJlY3RseS4KKwlQYXJ0IDE6IHZlcmlmeSB1c2VyIGVudmlyb25tZW50IGlzIG5vdCByZWFkIChpbnRlcm5hbCkKK3N0ZGluOgorCWVjaG8geCAkRk5PUkQKK2V4cGVjdGVkLXN0ZG91dDoKKwl4CistLS0KK25hbWU6IG1rc2hyYy0yYQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB+Ly5ta3NocmMgd29ya3MgY29ycmVjdGx5LgorCVBhcnQgMjogdmVyaWZ5IG1rc2hyYyBpcyBub3QgcmVhZCAobm9uLWludGVyYWN0aXZlIHNoZWxscykKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIubWtzaHJjIgorCUZOT1JEPTQyCitlbnYtc2V0dXA6ICFIT01FPS4hRU5WPSEKK3N0ZGluOgorCWVjaG8geCAkRk5PUkQKK2V4cGVjdGVkLXN0ZG91dDoKKwl4CistLS0KK25hbWU6IG1rc2hyYy0yYgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB+Ly5ta3NocmMgd29ya3MgY29ycmVjdGx5LgorCVBhcnQgMjogdmVyaWZ5IG1rc2hyYyBjYW4gYmUgcmVhZCAoaW50ZXJhY3RpdmUgc2hlbGxzKQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5ta3NocmMiCisJRk5PUkQ9NDIKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhSE9NRT0uIUVOVj0hUFMxPSEKK3N0ZGluOgorCWVjaG8geCAkRk5PUkQKK2V4cGVjdGVkLXN0ZG91dDoKKwl4IDQyCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvKCMgKSovCistLS0KK25hbWU6IG1rc2hyYy0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IH4vLm1rc2hyYyB3b3JrcyBjb3JyZWN0bHkuCisJUGFydCAzOiB2ZXJpZnkgbWtzaHJjIGNhbiBiZSB0dXJuZWQgb2ZmCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiLm1rc2hyYyIKKwlGTk9SRD00MgorZW52LXNldHVwOiAhSE9NRT0uIUVOVj1ub25leGlzdGFudCEKK3N0ZGluOgorCWVjaG8geCAkRk5PUkQKK2V4cGVjdGVkLXN0ZG91dDoKKwl4CistLS0KK25hbWU6IHNoLW1vZGUtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzaCBtb2RlIHR1cm5zIGJyYWNlZXhwYW5kIG9mZgorCWFuZCB0aGF0IHRoYXQgd29ya3MgY29ycmVjdGx5CitzdGRpbjoKKwlzZXQgLW8gYnJhY2VleHBhbmQKKwlzZXQgK28gc2gKKwlbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoCisJW1sgJChzZXQgK28pID09ICpAKC1vIGJyYWNlZXhwYW5kKUAofCAqKSBdXSAmJiBlY2hvIGJyZXggfHwgZWNobyBub2JyZXgKKwllY2hvIHthLGIsY30KKwlzZXQgK28gYnJhY2VleHBhbmQKKwllY2hvIHthLGIsY30KKwlzZXQgLW8gYnJhY2VleHBhbmQKKwllY2hvIHthLGIsY30KKwlzZXQgLW8gc2gKKwllY2hvIHthLGIsY30KKwlbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoCisJW1sgJChzZXQgK28pID09ICpAKC1vIGJyYWNlZXhwYW5kKUAofCAqKSBdXSAmJiBlY2hvIGJyZXggfHwgZWNobyBub2JyZXgKKwlzZXQgLW8gYnJhY2VleHBhbmQKKwllY2hvIHthLGIsY30KKwlbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoCisJW1sgJChzZXQgK28pID09ICpAKC1vIGJyYWNlZXhwYW5kKUAofCAqKSBdXSAmJiBlY2hvIGJyZXggfHwgZWNobyBub2JyZXgKK2V4cGVjdGVkLXN0ZG91dDoKKwlub3NoCisJYnJleAorCWEgYiBjCisJe2EsYixjfQorCWEgYiBjCisJe2EsYixjfQorCXNoCisJbm9icmV4CisJYSBiIGMKKwlzaAorCWJyZXgKKy0tLQorbmFtZTogc2gtbW9kZS0yYQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzaCBtb2RlIGlzICpub3QqIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uCitjYXRlZ29yeTogIWJpbnNoCitzdGRpbjoKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIGtzaAorCWxuIC1zICIkX19wcm9nbmFtZSIgc2gKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIC4vLWtzaAorCWxuIC1zICIkX19wcm9nbmFtZSIgLi8tc2gKKwlmb3Igc2hlbGwgaW4geywtfXssa31zaDsgZG8KKwkJcHJpbnQgLS0gJHNoZWxsICQoLi8kc2hlbGwgK2wgLWMgXAorCQkgICAgJ1tbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gnKQorCWRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwlzaCBub3NoCisJa3NoIG5vc2gKKwktc2ggbm9zaAorCS1rc2ggbm9zaAorLS0tCituYW1lOiBzaC1tb2RlLTJiCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHNoIG1vZGUgKmlzKiBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbgorY2F0ZWdvcnk6IGJpbnNoCitzdGRpbjoKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIGtzaAorCWxuIC1zICIkX19wcm9nbmFtZSIgc2gKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIC4vLWtzaAorCWxuIC1zICIkX19wcm9nbmFtZSIgLi8tc2gKKwlmb3Igc2hlbGwgaW4geywtfXssa31zaDsgZG8KKwkJcHJpbnQgLS0gJHNoZWxsICQoLi8kc2hlbGwgK2wgLWMgXAorCQkgICAgJ1tbICQoc2V0ICtvKSA9PSAqQCgtbyBzaClAKHwgKikgXV0gJiYgZWNobyBzaCB8fCBlY2hvIG5vc2gnKQorCWRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwlzaCBzaAorCWtzaCBub3NoCisJLXNoIHNoCisJLWtzaCBub3NoCistLS0KK25hbWU6IHBpcGVsaW5lLTEKK2Rlc2NyaXB0aW9uOgorCXBka3NoIGJ1ZzogbGFzdCBjb21tYW5kIG9mIGEgcGlwZWxpbmUgaXMgZXhlY3V0ZWQgaW4gYQorCXN1YnNoZWxsIC0gbWFrZSBzdXJlIGl0IHN0aWxsIGlzLCBzY3JpcHRzIGRlcGVuZCBvbiBpdAorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3giCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeSIKK3N0ZGluOgorCWVjaG8gKgorCWVjaG8gYSB8IHdoaWxlIHJlYWQgZDsgZG8KKwkJZWNobyAkZAorCQllY2hvICRkKgorCQllY2hvICoKKwkJc2V0IC1vIG5vZ2xvYgorCQllY2hvICRkKgorCQllY2hvICoKKwlkb25lCisJZWNobyAqCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjeCBhYmN5CisJYQorCWFiY3ggYWJjeQorCWFiY3ggYWJjeQorCWEqCisJKgorCWFiY3ggYWJjeQorLS0tCituYW1lOiBwaXBlbGluZS0yCitkZXNjcmlwdGlvbjoKKwljaGVjayB0aGF0IGNvLXByb2Nlc3NlcyB3b3JrIHdpdGggVENPTXMsIFRQSVBFcyBhbmQgVFBBUkVOcworc3RkaW46CisJIiRfX3Byb2duYW1lIiAtYyAnaT0xMDA7IGVjaG8gaGkgfCYgd2hpbGUgcmVhZCAtcCBsaW5lOyBkbyBlY2hvICIkKChpKyspKSAkbGluZSI7IGRvbmUnCisJIiRfX3Byb2duYW1lIiAtYyAnaT0yMDA7IGVjaG8gaGkgfCBjYXQgfCYgd2hpbGUgcmVhZCAtcCBsaW5lOyBkbyBlY2hvICIkKChpKyspKSAkbGluZSI7IGRvbmUnCisJIiRfX3Byb2duYW1lIiAtYyAnaT0zMDA7IChlY2hvIGhpIHwgY2F0KSB8JiB3aGlsZSByZWFkIC1wIGxpbmU7IGRvIGVjaG8gIiQoKGkrKykpICRsaW5lIjsgZG9uZScKK2V4cGVjdGVkLXN0ZG91dDoKKwkxMDAgaGkKKwkyMDAgaGkKKwkzMDAgaGkKKy0tLQorbmFtZTogcGVyc2lzdC1oaXN0b3J5LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHBlcnNpc3RlbnQgaGlzdG9yeSBzYXZpbmcgd29ya3MKK2NhdGVnb3J5OiAhbm8taGlzdGZpbGUKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWNhdCBoaXN0LmZpbGUKK2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuOgorCS9jYXQgaGlzdC5maWxlLworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IHR5cGVzZXQtcGFkZGluZy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBsZWZ0L3JpZ2h0IGp1c3RpZmljYXRpb24gd29ya3MgYXMgcGVyIFRGTQorc3RkaW46CisJdHlwZXNldCAtTDEwIGxuPTBoYWxsMAorCXR5cGVzZXQgLVIxMCBybj0waGFsbDAKKwl0eXBlc2V0IC1aTDEwIGx6PTBoYWxsMAorCXR5cGVzZXQgLVpSMTAgcno9MGhhbGwwCisJdHlwZXNldCAtWjEwIHJ4PSIgaGFsbG8gIgorCWVjaG8gIjwkbG4+IDwkcm4+IDwkbHo+IDwkcno+IDwkcng+IgorZXhwZWN0ZWQtc3Rkb3V0OgorCTwwaGFsbDAgICAgPiA8ICAgIDBoYWxsMD4gPGhhbGwwICAgICA+IDwwMDAwMGhhbGwwPiA8MDAwMCBoYWxsbz4KKy0tLQorbmFtZTogdHlwZXNldC1wYWRkaW5nLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJhc2UtITEwIGludGVnZXJzIGFyZSBwYWRkZWQgcmlnaHQKK3N0ZGluOgorCXR5cGVzZXQgLVV1aTE2IC1MOSBsbj0xNiMxCisJdHlwZXNldCAtVXVpMTYgLVI5IHJuPTE2IzEKKwl0eXBlc2V0IC1VdWkxNiAtWjkgem49MTYjMQorCXR5cGVzZXQgLUw5IGxzPTE2IzEKKwl0eXBlc2V0IC1SOSBycz0xNiMxCisJdHlwZXNldCAtWjkgenM9MTYjMQorCWVjaG8gIjwkbG4+IDwkcm4+IDwkem4+IDwkbHM+IDwkcnM+IDwkenM+IgorZXhwZWN0ZWQtc3Rkb3V0OgorCTwxNiMxICAgICA+IDwgICAgIDE2IzE+IDwxNiMwMDAwMDE+IDwxNiMxICAgICA+IDwgICAgIDE2IzE+IDwwMDAwMDE2IzE+CistLS0KK25hbWU6IHV0Zjhib20tMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgVVRGLTggQnl0ZSBPcmRlciBNYXJrIGlzIGlnbm9yZWQgYXMgdGhlIGZpcnN0CisJbXVsdGlieXRlIGNoYXJhY3RlciBvZiB0aGUgc2hlbGwgaW5wdXQgKHdpdGggLWMsIGZyb20gc3RhbmRhcmQKKwlpbnB1dCwgYXMgZmlsZSwgb3IgYXMgZXZhbCBhcmd1bWVudCksIGJ1dCBub3doZXJlIGVsc2UKKyMgYnJlYWtzIG9uIE1hYyBPU1ggKEhGUysgbm9uLXN0YW5kYXJkIFVuaWNvZGUgY2Fub25pY2FsIGRlY29tcG9zaXRpb24pCitjYXRlZ29yeTogIW9zOmRhcndpbgorc3RkaW46CisJbWtkaXIgZm9vCisJcHJpbnQgJyMhL2Jpbi9zaFxuZWNobyBvaG5lJyA+Zm9vL2Zub3JkCisJcHJpbnQgJyMhL2Jpbi9zaFxuZWNobyBtaXQnID5mb28v77u/Zm5vcmQKKwlwcmludCAn77u/Zm5vcmRcbmZub3JkXG7vu79mbm9yZFxuZm5vcmQnID5mb28vYmFyCisJcHJpbnQgZXZhbCBcJyfvu79mbm9yZFxuZm5vcmRcbu+7v2Zub3JkXG5mbm9yZCdcJyA+Zm9vL3pvbworCXNldCAtQSBhbnphaGwgLS0gZm9vLyoKKwllY2hvIGdvdCAkeyNhbnphaGxbKl19IGZpbGVzCisJY2htb2QgK3ggZm9vLyoKKwlleHBvcnQgUEFUSD0kKHB3ZCkvZm9vOiRQQVRICisJIiRfX3Byb2duYW1lIiAtYyAn77u/Zm5vcmQnCisJZWNobyA9CisJIiRfX3Byb2duYW1lIiAtYyAn77u/Zm5vcmQ7IGZub3JkOyDvu79mbm9yZDsgZm5vcmQnCisJZWNobyA9CisJIiRfX3Byb2duYW1lIiBmb28vYmFyCisJZWNobyA9CisJIiRfX3Byb2duYW1lIiA8Zm9vL2JhcgorCWVjaG8gPQorCSIkX19wcm9nbmFtZSIgZm9vL3pvbworCWVjaG8gPQorCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8g77u/OiAkKO+7v2Zub3JkKScKKwlybSAtcmYgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJZ290IDQgZmlsZXMKKwlvaG5lCisJPQorCW9obmUKKwlvaG5lCisJbWl0CisJb2huZQorCT0KKwlvaG5lCisJb2huZQorCW1pdAorCW9obmUKKwk9CisJb2huZQorCW9obmUKKwltaXQKKwlvaG5lCisJPQorCW9obmUKKwlvaG5lCisJbWl0CisJb2huZQorCT0KKwnvu786IG1pdAorLS0tCituYW1lOiB1dGY4Ym9tLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgd2UgY2FuIGV4ZWN1dGUgQk9NLXNoZWJhbmdzIChmYWlsdXJlcyBub3QgZmF0YWwpCisJWFhYIGlmIHRoZSBPUyBjYW4gYWxyZWFkeSBleGVjdXRlIHRoZW0sIHdlIGxvc2UKKwlub3RlOiBjeWd3aW4gZXhlY3ZlKDIpIGRvZXNuJ3QgcmV0dXJuIHRvIHVzIHdpdGggRU5PRVhFQywgd2UgbG9zZQorCW5vdGU6IFVsdHJpeCBwZXJsNSB0NCByZXR1cm5zIDY1MjgwIChleGl0LWNvZGUgMjU1KSBhbmQgbm8gdGV4dAorY2F0ZWdvcnk6ICFvczpjeWd3aW4sIW9zOnV3aW4tbnQsIW9zOnVsdHJpeCwhc21rc2gKK2Vudi1zZXR1cDogIUZPTz1CQVIhCitzdGRpbjoKKwlwcmludCAnIyEnIiRfX3Byb2duYW1lIidcbnByaW50ICIxIGE9JEVOVntGT099IjsnID50MQorCXByaW50ICfvu78jISciJF9fcHJvZ25hbWUiJ1xucHJpbnQgIjIgYT0kRU5We0ZPT30iOycgPnQyCisJcHJpbnQgJyMhJyIkX19wZXJsbmFtZSInXG5wcmludCAiMyBhPSRFTlZ7Rk9PfVxuIjsnID50MworCXByaW50ICfvu78jISciJF9fcGVybG5hbWUiJ1xucHJpbnQgIjQgYT0kRU5We0ZPT31cbiI7JyA+dDQKKwljaG1vZCAreCB0PworCS4vdDEKKwkuL3QyCisJLi90MworCS4vdDQKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIGE9L25vbmV4aXN0YW50e0ZPT30KKwkyIGE9L25vbmV4aXN0YW50e0ZPT30KKwkzIGE9QkFSCisJNCBhPUJBUgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLyhVbnJlY29nbml6ZWQgY2hhcmFjdGVyIC4uLi4gaWdub3JlZCBhdCBcLi50NCBsaW5lIDEpKi8KKy0tLQorbmFtZTogdXRmOGJvbS0zCitkZXNjcmlwdGlvbjoKKwlSZWFkaW5nIHRoZSBVVEYtOCBCT00gc2hvdWxkIGVuYWJsZSB0aGUgdXRmOC1tb2RlIGZsYWcKK3N0ZGluOgorCSIkX19wcm9nbmFtZSIgLWMgJzo7IGlmIFtbICQtID0gKlUqIF1dOyB0aGVuIGVjaG8gMSBvbjsgZWxzZSBlY2hvIDEgb2ZmOyBmaScKKwkiJF9fcHJvZ25hbWUiIC1jICfvu786OyBpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbiBlY2hvIDIgb247IGVsc2UgZWNobyAyIG9mZjsgZmknCitleHBlY3RlZC1zdGRvdXQ6CisJMSBvZmYKKwkyIG9uCistLS0KK25hbWU6IHV0ZjhvcHQtMWEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIG5vdCBzZXQgYXQgbm9uLWludGVyYWN0aXZlIHN0YXJ0dXAKK2NhdGVnb3J5OiAhb3M6aHB1eAorZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLlVURi04IQorc3RkaW46CisJaWYgW1sgJC0gPSAqVSogXV07IHRoZW4KKwkJZWNobyBpcyBzZXQKKwllbHNlCisJCWVjaG8gaXMgbm90IHNldAorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJaXMgbm90IHNldAorLS0tCituYW1lOiB1dGY4b3B0LTFiCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSB1dGY4LW1vZGUgZmxhZyBpcyBub3Qgc2V0IGF0IG5vbi1pbnRlcmFjdGl2ZSBzdGFydHVwCitjYXRlZ29yeTogb3M6aHB1eAorZW52LXNldHVwOiAhUFMxPSFQUzI9IUxDX0NUWVBFPWVuX1VTLnV0ZjghCitzdGRpbjoKKwlpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbgorCQllY2hvIGlzIHNldAorCWVsc2UKKwkJZWNobyBpcyBub3Qgc2V0CisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlpcyBub3Qgc2V0CistLS0KK25hbWU6IHV0ZjhvcHQtMmEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIHV0ZjgtbW9kZSBmbGFnIGlzIHNldCBhdCBpbnRlcmFjdGl2ZSBzdGFydHVwLgorCS1ETUtTSF9BU1NVTUVfVVRGOD0wID0+IGV4cGVjdGVkIGZhaWx1cmUsIHBsZWFzZSBpZ25vcmUKKwktRE1LU0hfQVNTVU1FX1VURjg9MSA9PiBub3QgZXhwZWN0ZWQsIHBsZWFzZSBpbnZlc3RpZ2F0ZQorCS1VTUtTSF9BU1NVTUVfVVRGOCA9PiBub3QgZXhwZWN0ZWQsIGJ1dCBpZiB5b3VyIE9TIGlzIG9sZCwKKwkgdHJ5IHBhc3NpbmcgSEFWRV9TRVRMT0NBTEVfQ1RZUEU9MCB0byBCdWlsZC5zaAorY2F0ZWdvcnk6ICFvczpocHV4Cithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIVBTMT0hUFMyPSFMQ19DVFlQRT1lbl9VUy5VVEYtOCEKK3N0ZGluOgorCWlmIFtbICQtID0gKlUqIF1dOyB0aGVuCisJCWVjaG8gaXMgc2V0CisJZWxzZQorCQllY2hvIGlzIG5vdCBzZXQKKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWlzIHNldAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLygjICkqLworLS0tCituYW1lOiB1dGY4b3B0LTJiCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSB1dGY4LW1vZGUgZmxhZyBpcyBzZXQgYXQgaW50ZXJhY3RpdmUgc3RhcnR1cAorCUV4cGVjdGVkIGZhaWx1cmUgaWYgLURNS1NIX0FTU1VNRV9VVEY4PTAKK2NhdGVnb3J5OiBvczpocHV4Cithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIVBTMT0hUFMyPSFMQ19DVFlQRT1lbl9VUy51dGY4IQorc3RkaW46CisJaWYgW1sgJC0gPSAqVSogXV07IHRoZW4KKwkJZWNobyBpcyBzZXQKKwllbHNlCisJCWVjaG8gaXMgbm90IHNldAorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJaXMgc2V0CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvKCMgKSovCistLS0KK25hbWU6IHV0ZjhvcHQtMworZGVzY3JpcHRpb246CisJRW5zdXJlIMKxVSBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIGhvbm91cmVkCisJKHRoaXMgdGVzdCBtYXkgcGFzcyBmYWxzZWx5IGRlcGVuZGluZyBvbiBDUFBGTEFHUykKK3N0ZGluOgorCWV4cG9ydCBpPTAKKwljb2RlPSdpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbiBlY2hvICRpIG9uOyBlbHNlIGVjaG8gJGkgb2ZmOyBmaScKKwlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiIC1VIC1jICIkY29kZSIKKwlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiICtVIC1jICIkY29kZSIKKwlsZXQgaSsrOyAiJF9fcHJvZ25hbWUiIC1VIC1pYyAiJGNvZGUiCisJbGV0IGkrKzsgIiRfX3Byb2duYW1lIiArVSAtaWMgIiRjb2RlIgorCWVjaG8gJCgoKytpKSkgZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgb24KKwkyIG9mZgorCTMgb24KKwk0IG9mZgorCTUgZG9uZQorLS0tCituYW1lOiBhbGlhc2VzLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJ1aWx0LWluIHNoZWxsIGFsaWFzZXMgYXJlIG9rYXkKK2NhdGVnb3J5OiAhYXJnZQorc3RkaW46CisJYWxpYXMKKwl0eXBlc2V0IC1mCitleHBlY3RlZC1zdGRvdXQ6CisJYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JworCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKKwloYXNoPSdhbGlhcyAtdCcKKwloaXN0b3J5PSdmYyAtbCcKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKwlsb2dpbj0nZXhlYyBsb2dpbicKKwluYW1lcmVmPSd0eXBlc2V0IC1uJworCW5vaHVwPSdub2h1cCAnCisJcj0nZmMgLWUgLScKKwlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCisJc3VzcGVuZD0na2lsbCAtU1RPUCAkJCcKKwl0eXBlPSd3aGVuY2UgLXYnCistLS0KK25hbWU6IGFsaWFzZXMtMS1oYXJ0ejQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJ1aWx0LWluIHNoZWxsIGFsaWFzZXMgYXJlIG9rYXkKK2NhdGVnb3J5OiBhcmdlCitzdGRpbjoKKwlhbGlhcworCXR5cGVzZXQgLWYKK2V4cGVjdGVkLXN0ZG91dDoKKwlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCisJZnVuY3Rpb25zPSd0eXBlc2V0IC1mJworCWhhc2g9J2FsaWFzIC10JworCWhpc3Rvcnk9J2ZjIC1sJworCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorCWxvZ2luPSdleGVjIGxvZ2luJworCW5hbWVyZWY9J3R5cGVzZXQgLW4nCisJbm9odXA9J25vaHVwICcKKwlyPSdmYyAtZSAtJworCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKKwl0eXBlPSd3aGVuY2UgLXYnCistLS0KK25hbWU6IGFsaWFzZXMtMmEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIOKAnHNldCAtbyBzaOKAnSBkaXNhYmxlcyBidWlsdC1pbiBhbGlhc2VzIChleGNlcHQgYSBmZXcpCitjYXRlZ29yeTogZGlzYWJsZWQKK2FyZ3VtZW50czogIS1vIXNoIQorc3RkaW46CisJYWxpYXMKKwl0eXBlc2V0IC1mCitleHBlY3RlZC1zdGRvdXQ6CisJaW50ZWdlcj0ndHlwZXNldCAtaScKKwlsb2NhbD10eXBlc2V0CistLS0KK25hbWU6IGFsaWFzZXMtM2EKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHJ1bm5pbmcgYXMgc2ggZGlzYWJsZXMgYnVpbHQtaW4gYWxpYXNlcyAoZXhjZXB0IGEgZmV3KQorY2F0ZWdvcnk6IGRpc2FibGVkCithcmd1bWVudHM6ICEtbyFzaCEKK3N0ZGluOgorCWNwICIkX19wcm9nbmFtZSIgc2gKKwkuL3NoIC1jICdhbGlhczsgdHlwZXNldCAtZicKKwlybSAtZiBzaAorZXhwZWN0ZWQtc3Rkb3V0OgorCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorLS0tCituYW1lOiBhbGlhc2VzLTJiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiDigJxzZXQgLW8gc2jigJ0gZG9lcyBub3QgaW5mbHVlbmNlIGJ1aWx0LWluIGFsaWFzZXMKK2NhdGVnb3J5OiAhYXJnZQorYXJndW1lbnRzOiAhLW8hc2ghCitzdGRpbjoKKwlhbGlhcworCXR5cGVzZXQgLWYKK2V4cGVjdGVkLXN0ZG91dDoKKwlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCisJZnVuY3Rpb25zPSd0eXBlc2V0IC1mJworCWhhc2g9J2FsaWFzIC10JworCWhpc3Rvcnk9J2ZjIC1sJworCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorCWxvZ2luPSdleGVjIGxvZ2luJworCW5hbWVyZWY9J3R5cGVzZXQgLW4nCisJbm9odXA9J25vaHVwICcKKwlyPSdmYyAtZSAtJworCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKKwlzdXNwZW5kPSdraWxsIC1TVE9QICQkJworCXR5cGU9J3doZW5jZSAtdicKKy0tLQorbmFtZTogYWxpYXNlcy0zYgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgcnVubmluZyBhcyBzaCBkb2VzIG5vdCBpbmZsdWVuY2UgYnVpbHQtaW4gYWxpYXNlcworY2F0ZWdvcnk6ICFhcmdlCithcmd1bWVudHM6ICEtbyFzaCEKK3N0ZGluOgorCWNwICIkX19wcm9nbmFtZSIgc2gKKwkuL3NoIC1jICdhbGlhczsgdHlwZXNldCAtZicKKwlybSAtZiBzaAorZXhwZWN0ZWQtc3Rkb3V0OgorCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKKwlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCisJaGFzaD0nYWxpYXMgLXQnCisJaGlzdG9yeT0nZmMgLWwnCisJaW50ZWdlcj0ndHlwZXNldCAtaScKKwlsb2NhbD10eXBlc2V0CisJbG9naW49J2V4ZWMgbG9naW4nCisJbmFtZXJlZj0ndHlwZXNldCAtbicKKwlub2h1cD0nbm9odXAgJworCXI9J2ZjIC1lIC0nCisJc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJworCXN1c3BlbmQ9J2tpbGwgLVNUT1AgJCQnCisJdHlwZT0nd2hlbmNlIC12JworLS0tCituYW1lOiBhbGlhc2VzLTJiLWhhcnR6NAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYg4oCcc2V0IC1vIHNo4oCdIGRvZXMgbm90IGluZmx1ZW5jZSBidWlsdC1pbiBhbGlhc2VzCitjYXRlZ29yeTogYXJnZQorYXJndW1lbnRzOiAhLW8hc2ghCitzdGRpbjoKKwlhbGlhcworCXR5cGVzZXQgLWYKK2V4cGVjdGVkLXN0ZG91dDoKKwlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCisJZnVuY3Rpb25zPSd0eXBlc2V0IC1mJworCWhhc2g9J2FsaWFzIC10JworCWhpc3Rvcnk9J2ZjIC1sJworCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorCWxvZ2luPSdleGVjIGxvZ2luJworCW5hbWVyZWY9J3R5cGVzZXQgLW4nCisJbm9odXA9J25vaHVwICcKKwlyPSdmYyAtZSAtJworCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKKwl0eXBlPSd3aGVuY2UgLXYnCistLS0KK25hbWU6IGFsaWFzZXMtM2ItaGFydHo0CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBydW5uaW5nIGFzIHNoIGRvZXMgbm90IGluZmx1ZW5jZSBidWlsdC1pbiBhbGlhc2VzCitjYXRlZ29yeTogYXJnZQorYXJndW1lbnRzOiAhLW8hc2ghCitzdGRpbjoKKwljcCAiJF9fcHJvZ25hbWUiIHNoCisJLi9zaCAtYyAnYWxpYXM7IHR5cGVzZXQgLWYnCisJcm0gLWYgc2gKK2V4cGVjdGVkLXN0ZG91dDoKKwlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCisJZnVuY3Rpb25zPSd0eXBlc2V0IC1mJworCWhhc2g9J2FsaWFzIC10JworCWhpc3Rvcnk9J2ZjIC1sJworCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorCWxvZ2luPSdleGVjIGxvZ2luJworCW5hbWVyZWY9J3R5cGVzZXQgLW4nCisJbm9odXA9J25vaHVwICcKKwlyPSdmYyAtZSAtJworCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKKwl0eXBlPSd3aGVuY2UgLXYnCistLS0KK25hbWU6IGFsaWFzZXMtZnVuY2RlZi0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBQT1NJWCBmdW5jdGlvbnMgdGFrZSBwcmVjZWRlbmNlcyBvdmVyIGFsaWFzZXMKK3N0ZGluOgorCWFsaWFzIGZvbz0nZWNobyBtYWtybycKKwlmb28oKSB7CisJCWVjaG8gZnVua3Rpb24KKwl9CisJZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJZnVua3Rpb24KKy0tLQorbmFtZTogYWxpYXNlcy1mdW5jZGVmLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIFBPU0lYIGZ1bmN0aW9ucyB0YWtlIHByZWNlZGVuY2VzIG92ZXIgYWxpYXNlcworc3RkaW46CisJYWxpYXMgZm9vPSdlY2hvIG1ha3JvJworCWZvbyAoKSB7CisJCWVjaG8gZnVua3Rpb24KKwl9CisJZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJZnVua3Rpb24KKy0tLQorbmFtZTogYWxpYXNlcy1mdW5jZGVmLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGFsaWFzZXMgdGFrZSBwcmVjZWRlbmNlcyBvdmVyIEtvcm4gZnVuY3Rpb25zCitzdGRpbjoKKwlhbGlhcyBmb289J2VjaG8gbWFrcm8nCisJZnVuY3Rpb24gZm9vIHsKKwkJZWNobyBmdW5rdGlvbgorCX0KKwlmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwltYWtybworLS0tCituYW1lOiBhcnJheXMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgS29ybiBTaGVsbCBhcnJheXMgd29yayBhcyBleHBlY3RlZAorc3RkaW46CisJdj0iYyBkIgorCXNldCAtQSBmb28gLS0gYSBcJHYgIiR2IiAnJHYnIGIKKwllY2hvICIkeyNmb29bKl19fCR7Zm9vWzBdfXwke2Zvb1sxXX18JHtmb29bMl19fCR7Zm9vWzNdfXwke2Zvb1s0XX18IgorZXhwZWN0ZWQtc3Rkb3V0OgorCTV8YXwkdnxjIGR8JHZ8YnwKKy0tLQorbmFtZTogYXJyYXlzLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJhc2gtc3R5bGUgYXJyYXlzIHdvcmsgYXMgZXhwZWN0ZWQKK2NhdGVnb3J5OiAhc21rc2gKK3N0ZGluOgorCXY9ImMgZCIKKwlmb289KGEgXCR2ICIkdiIgJyR2JyBiKQorCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwiCitleHBlY3RlZC1zdGRvdXQ6CisJNXxhfCR2fGMgZHwkdnxifAorLS0tCituYW1lOiBhcnJheXMtMworZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYXJyYXkgYm91bmRzIGFyZSB1aW50MzJfdAorc3RkaW46CisJc2V0IC1BIGZvbyBhIGIgYworCWZvb1s0MDk3XT1kCisJZm9vWzIxNDc0ODM2MzddPWUKKwllY2hvICR7Zm9vWypdfQorCWZvb1stMV09ZgorCWVjaG8gJHtmb29bNDI5NDk2NzI5NV19IGcgJHtmb29bKl19CitleHBlY3RlZC1zdGRvdXQ6CisJYSBiIGMgZCBlCisJZiBnIGEgYiBjIGQgZSBmCistLS0KK25hbWU6IGFycmF5cy00CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBLb3JuIFNoZWxsIGFycmF5cyB3aXRoIHNwZWNpZmllZCBpbmRpY2VzIHdvcmsgYXMgZXhwZWN0ZWQKK2NhdGVnb3J5OiAhc21rc2gKK3N0ZGluOgorCXY9ImMgZCIKKwlzZXQgLUEgZm9vIC0tIFsxXT1cJHYgWzJdPSIkdiIgWzRdPSckdicgWzBdPWEgWzVdPWIKKwllY2hvICIkeyNmb29bKl19fCR7Zm9vWzBdfXwke2Zvb1sxXX18JHtmb29bMl19fCR7Zm9vWzNdfXwke2Zvb1s0XX18JHtmb29bNV19fCIKK2V4cGVjdGVkLXN0ZG91dDoKKwk1fGF8JHZ8YyBkfHwkdnxifAorLS0tCituYW1lOiBhcnJheXMtNQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYmFzaC1zdHlsZSBhcnJheXMgd2l0aCBzcGVjaWZpZWQgaW5kaWNlcyB3b3JrIGFzIGV4cGVjdGVkCitjYXRlZ29yeTogIXNta3NoCitzdGRpbjoKKwl2PSJjIGQiCisJZm9vPShbMV09XCR2IFsyXT0iJHYiIFs0XT0nJHYnIFswXT1hIFs1XT1iKQorCWVjaG8gIiR7I2Zvb1sqXX18JHtmb29bMF19fCR7Zm9vWzFdfXwke2Zvb1syXX18JHtmb29bM119fCR7Zm9vWzRdfXwke2Zvb1s1XX18IgorCXg9KFsxMjhdPWZvbyBiYXIgYmF6KQorCWVjaG8gaz0gJHsheFsqXX0gLgorCWVjaG8gdj0gJHt4WypdfSAuCitleHBlY3RlZC1zdGRvdXQ6CisJNXxhfCR2fGMgZHx8JHZ8YnwKKwlrPSAxMjggMTI5IDEzMCAuCisJdj0gZm9vIGJhciBiYXogLgorLS0tCituYW1lOiBhcnJheXMtNgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgd2UgY2FuIGdldCB0aGUgYXJyYXkga2V5cyAoaW5kaWNlcykgZm9yIGluZGV4ZWQgYXJyYXlzLAorCUtvcm4gc2hlbGwgc3R5bGUKK3N0ZGluOgorCW9mKCkgeworCQlpPTAKKwkJZm9yIHggaW4gIiRAIjsgZG8KKwkJCWVjaG8gLW4gIiQoKGkrKykpPCR4PiIKKwkJZG9uZQorCQllY2hvCisJfQorCWZvb1sxXT1laW5zCisJc2V0IHwgZ3JlcCAnXmZvbycKKwllY2hvID0KKwlmb29bMF09endlaQorCWZvb1s0XT1kcmVpCisJc2V0IHwgZ3JlcCAnXmZvbycKKwllY2hvID0KKwllY2hvIGEgJChvZiAke2Zvb1sqXX0pID0gJChvZiAke2JhclsqXX0pIGEKKwllY2hvIGIgJChvZiAiJHtmb29bKl19IikgPSAkKG9mICIke2JhclsqXX0iKSBiCisJZWNobyBjICQob2YgJHtmb29bQF19KSA9ICQob2YgJHtiYXJbQF19KSBjCisJZWNobyBkICQob2YgIiR7Zm9vW0BdfSIpID0gJChvZiAiJHtiYXJbQF19IikgZAorCWVjaG8gZSAkKG9mICR7IWZvb1sqXX0pID0gJChvZiAkeyFiYXJbKl19KSBlCisJZWNobyBmICQob2YgIiR7IWZvb1sqXX0iKSA9ICQob2YgIiR7IWJhclsqXX0iKSBmCisJZWNobyBnICQob2YgJHshZm9vW0BdfSkgPSAkKG9mICR7IWJhcltAXX0pIGcKKwllY2hvIGggJChvZiAiJHshZm9vW0BdfSIpID0gJChvZiAiJHshYmFyW0BdfSIpIGgKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb29bMV09ZWlucworCT0KKwlmb29bMF09endlaQorCWZvb1sxXT1laW5zCisJZm9vWzRdPWRyZWkKKwk9CisJYSAwPHp3ZWk+MTxlaW5zPjI8ZHJlaT4gPSBhCisJYiAwPHp3ZWkgZWlucyBkcmVpPiA9IDA8PiBiCisJYyAwPHp3ZWk+MTxlaW5zPjI8ZHJlaT4gPSBjCisJZCAwPHp3ZWk+MTxlaW5zPjI8ZHJlaT4gPSBkCisJZSAwPDA+MTwxPjI8ND4gPSBlCisJZiAwPDAgMSA0PiA9IDA8PiBmCisJZyAwPDA+MTwxPjI8ND4gPSBnCisJaCAwPDA+MTwxPjI8ND4gPSBoCistLS0KK25hbWU6IGFycmF5cy03CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB3ZSBjYW4gZ2V0IHRoZSBhcnJheSBrZXlzIChpbmRpY2VzKSBmb3IgaW5kZXhlZCBhcnJheXMsCisJS29ybiBzaGVsbCBzdHlsZSwgaW4gc29tZSBjb3JuZXIgY2FzZXMKK3N0ZGluOgorCWVjaG8gIWFyejogJHshYXJ6fQorCWVjaG8gIWFyelswXTogJHshYXJ6WzBdfQorCWVjaG8gIWFyelsxXTogJHshYXJ6WzFdfQorCWFyej1mb28KKwllY2hvICFhcno6ICR7IWFyen0KKwllY2hvICFhcnpbMF06ICR7IWFyelswXX0KKwllY2hvICFhcnpbMV06ICR7IWFyelsxXX0KKwl1bnNldCBhcnoKKwllY2hvICFhcno6ICR7IWFyen0KKwllY2hvICFhcnpbMF06ICR7IWFyelswXX0KKwllY2hvICFhcnpbMV06ICR7IWFyelsxXX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkhYXJ6OiAwCisJIWFyelswXToKKwkhYXJ6WzFdOgorCSFhcno6IGFyegorCSFhcnpbMF06IDAKKwkhYXJ6WzFdOgorCSFhcno6IDAKKwkhYXJ6WzBdOgorCSFhcnpbMV06CistLS0KK25hbWU6IGFycmF5cy04CitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lIGJlaGF2aW91cmFsIHJ1bGVzIGZvciBhcnJheXMuCitzdGRpbjoKKwlmbmEoKSB7CisJCXNldCAtQSBhYSA5CisJfQorCWZuYigpIHsKKwkJdHlwZXNldCBhYgorCQlzZXQgLUEgYWIgOQorCX0KKwlmbmMoKSB7CisJCXR5cGVzZXQgYWMKKwkJc2V0IC1BIGFjIDkxCisJCXVuc2V0IGFjCisJCXNldCAtQSBhYyA5MgorCX0KKwlmbmQoKSB7CisJCXNldCArQSBhZCA5CisJfQorCWZuZSgpIHsKKwkJdW5zZXQgYWUKKwkJc2V0ICtBIGFlIDkKKwl9CisJZm5mKCkgeworCQl1bnNldCBhZlswXQorCQlzZXQgK0EgYWYgOQorCX0KKwlmbmcoKSB7CisJCXVuc2V0IGFnWypdCisJCXNldCArQSBhZyA5CisJfQorCXNldCAtQSBhYSAxIDIKKwlzZXQgLUEgYWIgMSAyCisJc2V0IC1BIGFjIDEgMgorCXNldCAtQSBhZCAxIDIKKwlzZXQgLUEgYWUgMSAyCisJc2V0IC1BIGFmIDEgMgorCXNldCAtQSBhZyAxIDIKKwlzZXQgLUEgYWggMSAyCisJdHlwZXNldCAtWjMgYWEgYWIgYWMgYWQgYWUgYWYgYWcKKwlwcmludCAxYSAke2FhWypdfSAuCisJcHJpbnQgMWIgJHthYlsqXX0gLgorCXByaW50IDFjICR7YWNbKl19IC4KKwlwcmludCAxZCAke2FkWypdfSAuCisJcHJpbnQgMWUgJHthZVsqXX0gLgorCXByaW50IDFmICR7YWZbKl19IC4KKwlwcmludCAxZyAke2FnWypdfSAuCisJcHJpbnQgMWggJHthaFsqXX0gLgorCWZuYQorCWZuYgorCWZuYworCWZuZAorCWZuZQorCWZuZgorCWZuZworCXR5cGVzZXQgLVo1IGFoWypdCisJcHJpbnQgMmEgJHthYVsqXX0gLgorCXByaW50IDJiICR7YWJbKl19IC4KKwlwcmludCAyYyAke2FjWypdfSAuCisJcHJpbnQgMmQgJHthZFsqXX0gLgorCXByaW50IDJlICR7YWVbKl19IC4KKwlwcmludCAyZiAke2FmWypdfSAuCisJcHJpbnQgMmcgJHthZ1sqXX0gLgorCXByaW50IDJoICR7YWhbKl19IC4KK2V4cGVjdGVkLXN0ZG91dDoKKwkxYSAwMDEgMDAyIC4KKwkxYiAwMDEgMDAyIC4KKwkxYyAwMDEgMDAyIC4KKwkxZCAwMDEgMDAyIC4KKwkxZSAwMDEgMDAyIC4KKwkxZiAwMDEgMDAyIC4KKwkxZyAwMDEgMDAyIC4KKwkxaCAxIDIgLgorCTJhIDkgLgorCTJiIDAwMSAwMDIgLgorCTJjIDkyIC4KKwkyZCAwMDkgMDAyIC4KKwkyZSA5IC4KKwkyZiA5IDAwMiAuCisJMmcgMDA5IC4KKwkyaCAwMDAwMSAwMDAwMiAuCistLS0KK25hbWU6IHZhcmV4cGFuZC1zdWJzdHItMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYmFzaC1zdHlsZSBzdWJzdHJpbmcgZXhwYW5zaW9uIHdvcmtzCisJd2hlbiB1c2luZyBwb3NpdGl2ZSBudW1lcmljcworc3RkaW46CisJeD1hYmNkZWZnaGkKKwl0eXBlc2V0IC1pIHk9MTIzNDU2Nzg5CisJdHlwZXNldCAtaSAxNiB6PTEyMzQ1Njc4OQkjIDE2Izc1YmNkMTUKKwllY2hvIGEgdCR7eDoyOjJ9ICR7eToyOjN9ICR7ejoyOjN9IGEKKwllY2hvIGIgJHt4OjozfSAke3k6OjN9ICR7ejo6M30gYgorCWVjaG8gYyAke3g6Mjp9ICR7eToyOn0gJHt6OjI6fSBjCisJZWNobyBkICR7eDoyfSAke3k6Mn0gJHt6OjJ9IGQKKwllY2hvIGUgJHt4OjI6Nn0gJHt5OjI6Nn0gJHt6OjI6N30gZQorCWVjaG8gZiAke3g6Mjo3fSAke3k6Mjo3fSAke3o6Mjo4fSBmCisJZWNobyBnICR7eDoyOjh9ICR7eToyOjh9ICR7ejoyOjl9IGcKK2V4cGVjdGVkLXN0ZG91dDoKKwlhIHRjZCAzNDUgIzc1IGEKKwliIGFiYyAxMjMgMTYjIGIKKwljIGMKKwlkIGNkZWZnaGkgMzQ1Njc4OSAjNzViY2QxNSBkCisJZSBjZGVmZ2ggMzQ1Njc4ICM3NWJjZDEgZQorCWYgY2RlZmdoaSAzNDU2Nzg5ICM3NWJjZDE1IGYKKwlnIGNkZWZnaGkgMzQ1Njc4OSAjNzViY2QxNSBnCistLS0KK25hbWU6IHZhcmV4cGFuZC1zdWJzdHItMgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYmFzaC1zdHlsZSBzdWJzdHJpbmcgZXhwYW5zaW9uIHdvcmtzCisJd2hlbiB1c2luZyBuZWdhdGl2ZSBudW1lcmljcyBvciBleHByZXNzaW9ucworc3RkaW46CisJeD1hYmNkZWZnaGkKKwl0eXBlc2V0IC1pIHk9MTIzNDU2Nzg5CisJdHlwZXNldCAtaSAxNiB6PTEyMzQ1Njc4OQkjIDE2Izc1YmNkMTUKKwluPTIKKwllY2hvIGEgJHt4OiRuOjN9ICR7eTokbjozfSAke3o6JG46M30gYQorCWVjaG8gYiAke3g6KG4pOjN9ICR7eToobik6M30gJHt6OihuKTozfSBiCisJZWNobyBjICR7eDooLTIpOjF9ICR7eTooLTIpOjF9ICR7ejooLTIpOjF9IGMKKwllY2hvIGQgdCR7eDogbjoyfSAke3k6IG46M30gJHt6OiBuOjN9IGQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhIGNkZSAzNDUgIzc1IGEKKwliIGNkZSAzNDUgIzc1IGIKKwljIGggOCAxIGMKKwlkIHRjZCAzNDUgIzc1IGQKKy0tLQorbmFtZTogdmFyZXhwYW5kLXN1YnN0ci0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHNvbWUgdGhpbmdzIHRoYXQgd29yayBpbiBiYXNoIGZhaWwuCisJVGhpcyBpcyBieSBkZXNpZ24uIEFuZCB0aGF0IHNvbWUgdGhpbmdzIGZhaWwgaW4gYm90aC4KK3N0ZGluOgorCWV4cG9ydCB4PWFiY2RlZmdoaSBuPTIKKwkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHYke3g6KG4pfXgnCisJIiRfX3Byb2duYW1lIiAtYyAnZWNobyB3JHt4OiBufXgnCisJIiRfX3Byb2duYW1lIiAtYyAnZWNobyB4JHt4Om59eCcKKwkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIHkke3g6fXgnCisJIiRfX3Byb2duYW1lIiAtYyAnZWNobyB6JHt4fXgnCisJIiRfX3Byb2duYW1lIiAtYyAneD1hYmNkZWY7eT0xMjM7ZWNobyAke3g6JHt5OjI6MX06Mn0nID4vZGV2L251bGwgMj4mMTsgZWNobyAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCXZjZGVmZ2hpeAorCXdjZGVmZ2hpeAorCXphYmNkZWZnaGl4CisJMQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL3g6bi4qYmFkIHN1YnN0aXR1dGlvbi4qXG4uKmJhZCBzdWJzdGl0dXRpb24vCistLS0KK25hbWU6IHZhcmV4cGFuZC1zdWJzdHItNAorZGVzY3JpcHRpb246CisJQ2hlY2sgY29ybmVyIGNhc2VzIGZvciBzdWJzdHJpbmcgZXhwYW5zaW9uCitzdGRpbjoKKwl4PWFiY2RlZmdoaQorCWludGVnZXIgeT0yCisJZWNobyBhICR7eDooeSA9PSAxID8gMiA6IDMpOjR9IGEKK2V4cGVjdGVkLXN0ZG91dDoKKwlhIGRlZmcgYQorLS0tCituYW1lOiB2YXJleHBhbmQtc3Vic3RyLTVBCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHN1YnN0cmluZyBleHBhbnNpb25zIHdvcmsgb24gY2hhcmFjdGVycworc3RkaW46CisJc2V0ICtVCisJeD1tw6RoCisJZWNobyBhICR7eDo6MX0gJHt4OiAtMX0gYQorCWVjaG8gYiAke3g6OjN9ICR7eDogLTN9IGIKKwllY2hvIGMgJHt4OjE6Mn0gJHt4OiAtMzoyfSBjCisJZWNobyBkICR7I3h9IGQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhIG0gaCBhCisJYiBtw6Qgw6RoIGIKKwljIMOkIMOkIGMKKwlkIDQgZAorLS0tCituYW1lOiB2YXJleHBhbmQtc3Vic3RyLTVXCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHN1YnN0cmluZyBleHBhbnNpb25zIHdvcmsgb24gY2hhcmFjdGVycworc3RkaW46CisJc2V0IC1VCisJeD1tw6RoCisJZWNobyBhICR7eDo6MX0gJHt4OiAtMX0gYQorCWVjaG8gYiAke3g6OjJ9ICR7eDogLTJ9IGIKKwllY2hvIGMgJHt4OjE6MX0gJHt4OiAtMjoxfSBjCisJZWNobyBkICR7I3h9IGQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhIG0gaCBhCisJYiBtw6Qgw6RoIGIKKwljIMOkIMOkIGMKKwlkIDMgZAorLS0tCituYW1lOiB2YXJleHBhbmQtc3Vic3RyLTYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc3RyaW5nIHN1YnN0aXR1dGlvbiB3b3JrcyBjb3JyZWN0bHkKK3N0ZGluOgorCWZvbz0xCisJYmFyPTIKKwliYXo9cXdlcnR5dWlvcAorCWVjaG8gYSAke2JhejogZm9vOiBiYXJ9CisJZWNobyBiICR7YmF6OiBmb286ICRiYXJ9CisJZWNobyBjICR7YmF6OiAkZm9vOiBiYXJ9CisJZWNobyBkICR7YmF6OiAkZm9vOiAkYmFyfQorZXhwZWN0ZWQtc3Rkb3V0OgorCWEgd2UKKwliIHdlCisJYyB3ZQorCWQgd2UKKy0tLQorbmFtZTogdmFyZXhwYW5kLW51bGwtMQorZGVzY3JpcHRpb246CisJRW5zdXJlIGVtcHR5IHN0cmluZ3MgZXhwYW5kIGVtcHRpbHkKK3N0ZGluOgorCXByaW50IHggJHthfSAke2J9IHkKKwlwcmludCB6ICR7YSM/fSAke2IlP30gdworCXByaW50IHYgJHthPX0gJHtiL2MvZH0gdQorZXhwZWN0ZWQtc3Rkb3V0OgorCXggeQorCXogdworCXYgdQorLS0tCituYW1lOiB2YXJleHBhbmQtbnVsbC0yCitkZXNjcmlwdGlvbjoKKwlFbnN1cmUgZW1wdHkgc3RyaW5ncywgd2hlbiBxdW90ZWQsIGFyZSBleHBhbmRlZCBhcyBlbXB0eSBzdHJpbmdzCitzdGRpbjoKKwlwcmludGYgJzwlcz4gJyAxICIke2F9IiAyICIke2EjP30iICsgIiR7YiU/fSIgMyAiJHthPX0iICsgIiR7Yi9jL2R9IgorCWVjaG8gLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTwxPiA8PiA8Mj4gPD4gPCs+IDw+IDwzPiA8PiA8Kz4gPD4gLgorLS0tCituYW1lOiBwcmludC1mdW5ueS1jaGFycworZGVzY3JpcHRpb246CisJQ2hlY2sgcHJpbnQgYnVpbHRpbidzIGNhcGFiaWxpdHkgdG8gb3V0cHV0IGRlc2lnbmF0ZWQgY2hhcmFjdGVycworc3RkaW46CisJcHJpbnQgJzxcMDE0NFwwMzQ0XHhEQlx1MDBEQlx1MjBBQ1x1REJceDQwPicKK2V4cGVjdGVkLXN0ZG91dDoKKwk8ZOTbw5vigqzDm0A+CistLS0KK25hbWU6IHByaW50LWJrc2wtYworZGVzY3JpcHRpb246CisJQ2hlY2sgcHJpbnQgYnVpbHRpbidzIFxjIGVzY2FwZQorc3RkaW46CisJcHJpbnQgJ1xjYSc7IHByaW50IGIKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYgorLS0tCituYW1lOiBwcmludC1udWwtY2hhcnMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGhhbmRsaW5nIG9mIE5VTCBjaGFyYWN0ZXJzIGZvciBwcmludCBhbmQgcmVhZAorCW5vdGU6IHNlY29uZCBsaW5lIHNob3VsZCBvdXRwdXQg4oCcNCAz4oCdIGJ1dCB3ZSBjYW5ub3QKKwloYW5kbGUgTlVMIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyB5ZXQKK3N0ZGluOgorCXByaW50ICQoKCQocHJpbnQgJzxcMD4nIHwgd2MgLWMpKSkKKwl4PSQocHJpbnQgJzxcMD4nKQorCXByaW50ICQoKCQocHJpbnQgIiR4IiB8IHdjIC1jKSkpICR7I3h9CitleHBlY3RlZC1zdGRvdXQ6CisJNAorCTMgMgorLS0tCituYW1lOiBwcmludC1lc2NhcGVzCitkZXNjcmlwdGlvbjoKKwlDaGVjayBiYWNrc2xhc2ggZXhwYW5zaW9uIGJ5IHRoZSBwcmludCBidWlsdGluCitzdGRpbjoKKwlwcmludCAnXCBcIVwiXCNcJFwlXCYnXFxcJydcKFwpXCpcK1wsXC1cLlwvXDBcMVwyXDNcNFw1XDZcN1w4JyBcCisJICAgICdcOVw6XDtcPFw9XD5cP1xAXEFcQlxDXERcRVxGXEdcSFxJXEpcS1xMXE1cTlxPXFBcUVxSXFNcVCcgXAorCSAgICAnXFVcVlxXXFhcWVxaXFtcXFxdXF5cX1xgXGFcYiAgXGRcZVxmXGdcaFxpXGpca1xsXG1cblxvXHAnIFwKKwkgICAgJ1xxXHJcc1x0XHVcdlx3XHhceVx6XHtcfFx9XH4nICdcdTIwYWNkJyAnXFUyMGFjZCcgJ1x4MTIzJyBcCisJICAgICdcMHgnICdcMDEyMycgJ1wwMTIzNCcgfCB7CisJCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKKwkJdHlwZXNldCAtVXVpMTYgLVo1IGh2CisJCXR5cGVzZXQgLWkxIHdjPTB4MEEKKwkJZGFzYz0KKwkJbmw9JHt3YyMxI30KKwkJd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCisJCQlsaW5lPSRsaW5lJG5sCisJCQl3aGlsZSBbWyAtbiAkbGluZSBdXTsgZG8KKwkJCQlodj0xIyR7bGluZTo6MX0KKwkJCQlpZiAoKCAocG9zICYgMTUpID09IDAgKSk7IHRoZW4KKwkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCisJCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCisJCQkJCWRhc2M9JyB8JworCQkJCWZpCisJCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCisJCQkJaWYgKCggKGh2IDwgMzIpIHx8IChodiA+IDEyNikgKSk7IHRoZW4KKwkJCQkJZGFzYz0kZGFzYy4KKwkJCQllbHNlCisJCQkJCWRhc2M9JGRhc2Mke2xpbmU6OjF9CisJCQkJZmkKKwkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCisJCQkJbGluZT0ke2xpbmU6MX0KKwkJCWRvbmUKKwkJZG9uZQorCQlpZiAoKCAocG9zICYgMTUpICE9IDEgKSk7IHRoZW4KKwkJCXdoaWxlICgoIHBvcyAmIDE1ICkpOyBkbworCQkJCXByaW50IC1uICcgICAnCisJCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJworCQkJZG9uZQorCQkJcHJpbnQgIiRkYXNjfCIKKwkJZmkKKwl9CitleHBlY3RlZC1zdGRvdXQ6CisJMDAwMDAwMDAgIDVDIDIwIDVDIDIxIDVDIDIyIDVDIDIzIC0gNUMgMjQgNUMgMjUgNUMgMjYgNUMgMjcgIHxcIFwhXCJcI1wkXCVcJlwnfAorCTAwMDAwMDEwICA1QyAyOCA1QyAyOSA1QyAyQSA1QyAyQiAtIDVDIDJDIDVDIDJEIDVDIDJFIDVDIDJGICB8XChcKVwqXCtcLFwtXC5cL3wKKwkwMDAwMDAyMCAgNUMgMzEgNUMgMzIgNUMgMzMgNUMgMzQgLSA1QyAzNSA1QyAzNiA1QyAzNyA1QyAzOCAgfFwxXDJcM1w0XDVcNlw3XDh8CisJMDAwMDAwMzAgIDIwIDVDIDM5IDVDIDNBIDVDIDNCIDVDIC0gM0MgNUMgM0QgNUMgM0UgNUMgM0YgNUMgIHwgXDlcOlw7XDxcPVw+XD9cfAorCTAwMDAwMDQwICA0MCA1QyA0MSA1QyA0MiA1QyA0MyA1QyAtIDQ0IDFCIDVDIDQ2IDVDIDQ3IDVDIDQ4ICB8QFxBXEJcQ1xELlxGXEdcSHwKKwkwMDAwMDA1MCAgNUMgNDkgNUMgNEEgNUMgNEIgNUMgNEMgLSA1QyA0RCA1QyA0RSA1QyA0RiA1QyA1MCAgfFxJXEpcS1xMXE1cTlxPXFB8CisJMDAwMDAwNjAgIDVDIDUxIDVDIDUyIDVDIDUzIDVDIDU0IC0gMjAgNUMgNTYgNUMgNTcgNUMgNTggNUMgIHxcUVxSXFNcVCBcVlxXXFhcfAorCTAwMDAwMDcwICA1OSA1QyA1QSA1QyA1QiA1QyA1QyA1RCAtIDVDIDVFIDVDIDVGIDVDIDYwIDA3IDA4ICB8WVxaXFtcXVxeXF9cYC4ufAorCTAwMDAwMDgwICAyMCAyMCA1QyA2NCAxQiAwQyA1QyA2NyAtIDVDIDY4IDVDIDY5IDVDIDZBIDVDIDZCICB8ICBcZC4uXGdcaFxpXGpca3wKKwkwMDAwMDA5MCAgNUMgNkMgNUMgNkQgMEEgNUMgNkYgNUMgLSA3MCAyMCA1QyA3MSAwRCA1QyA3MyAwOSAgfFxsXG0uXG9ccCBccS5ccy58CisJMDAwMDAwQTAgIDBCIDVDIDc3IDVDIDc5IDVDIDdBIDVDIC0gN0IgNUMgN0MgNUMgN0QgNUMgN0UgMjAgIHwuXHdceVx6XHtcfFx9XH4gfAorCTAwMDAwMEIwICBFMiA4MiBBQyA2NCAyMCBFRiBCRiBCRCAtIDIwIDEyIDMzIDIwIDc4IDIwIDUzIDIwICB8Li4uZCAuLi4gLjMgeCBTIHwKKwkwMDAwMDBDMCAgNTMgMzQgMEEgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgfFM0LnwKKy0tLQorbmFtZTogZG9sbGFyLXF1b3RlZC1zdHJpbmdzCitkZXNjcmlwdGlvbjoKKwlDaGVjayBiYWNrc2xhc2ggZXhwYW5zaW9uIGJ5ICQn4oCmJyBzdHJpbmdzCitzdGRpbjoKKwlwcmludGYgJyVzXG4nICQnXCBcIVwiXCNcJFwlXCZcJ1woXClcKlwrXCxcLVwuXC8gXDFcMlwzXDRcNVw2JyBcCisJICAgICQnYVwwYicgJCdhXDAxYicgJCdcN1w4XDlcOlw7XDxcPVw+XD9cQFxBXEJcQ1xEXEVcRlxHXEhcSScgXAorCSAgICAkJ1xKXEtcTFxNXE5cT1xQXFFcUlxTXFRcVTFcVlxXXFhcWVxaXFtcXFxdXF5cX1xgXGFcYlxkXGUnIFwKKwkgICAgJCdcZlxnXGhcaVxqXGtcbFxtXG5cb1xwXHFcclxzXHRcdTFcdlx3XHgxXHlcelx7XHxcfVx+ICR4JyBcCisJICAgICQnXHUyMGFjZCcgJCdcVTIwYWNkJyAkJ1x4MTIzJyAkJ2ZuXHgwcmQnICQnXDAyMzQnICQnXDIzNCcgXAorCSAgICAkJ1wyMzQ1JyAkJ1xjYScgJCdcYyEnICQnXGM/JyAkJ1xj4oKsJyAkJ2FcCisJYicgfCB7CisJCXR5cGVzZXQgLVV1aTE2IC1aMTEgcG9zPTAKKwkJdHlwZXNldCAtVXVpMTYgLVo1IGh2CisJCXR5cGVzZXQgLWkxIHdjPTB4MEEKKwkJZGFzYz0KKwkJbmw9JHt3YyMxI30KKwkJd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCisJCQlsaW5lPSRsaW5lJG5sCisJCQl3aGlsZSBbWyAtbiAkbGluZSBdXTsgZG8KKwkJCQlodj0xIyR7bGluZTo6MX0KKwkJCQlpZiAoKCAocG9zICYgMTUpID09IDAgKSk7IHRoZW4KKwkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCisJCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCisJCQkJCWRhc2M9JyB8JworCQkJCWZpCisJCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCisJCQkJaWYgKCggKGh2IDwgMzIpIHx8IChodiA+IDEyNikgKSk7IHRoZW4KKwkJCQkJZGFzYz0kZGFzYy4KKwkJCQllbHNlCisJCQkJCWRhc2M9JGRhc2Mke2xpbmU6OjF9CisJCQkJZmkKKwkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCisJCQkJbGluZT0ke2xpbmU6MX0KKwkJCWRvbmUKKwkJZG9uZQorCQlpZiAoKCAocG9zICYgMTUpICE9IDEgKSk7IHRoZW4KKwkJCXdoaWxlICgoIHBvcyAmIDE1ICkpOyBkbworCQkJCXByaW50IC1uICcgICAnCisJCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJworCQkJZG9uZQorCQkJcHJpbnQgIiRkYXNjfCIKKwkJZmkKKwl9CitleHBlY3RlZC1zdGRvdXQ6CisJMDAwMDAwMDAgIDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IC0gMjggMjkgMkEgMkIgMkMgMkQgMkUgMkYgIHwgISIjJCUmJygpKissLS4vfAorCTAwMDAwMDEwICAyMCAwMSAwMiAwMyAwNCAwNSAwNiAwQSAtIDYxIDBBIDYxIDAxIDYyIDBBIDA3IDM4ICB8IC4uLi4uLi5hLmEuYi4uOHwKKwkwMDAwMDAyMCAgMzkgM0EgM0IgM0MgM0QgM0UgM0YgNDAgLSA0MSA0MiA0MyA0NCAxQiA0NiA0NyA0OCAgfDk6Ozw9Pj9AQUJDRC5GR0h8CisJMDAwMDAwMzAgIDQ5IDBBIDRBIDRCIDRDIDREIDRFIDRGIC0gNTAgNTEgNTIgNTMgNTQgMDEgNTYgNTcgIHxJLkpLTE1OT1BRUlNULlZXfAorCTAwMDAwMDQwICA1OCA1OSA1QSA1QiA1QyA1RCA1RSA1RiAtIDYwIDA3IDA4IDY0IDFCIDBBIDBDIDY3ICB8WFlaW1xdXl9gLi5kLi4uZ3wKKwkwMDAwMDA1MCAgNjggNjkgNkEgNkIgNkMgNkQgMEEgNkYgLSA3MCA3MSAwRCA3MyAwOSAwMSAwQiA3NyAgfGhpamtsbS5vcHEucy4uLnd8CisJMDAwMDAwNjAgIDAxIDc5IDdBIDdCIDdDIDdEIDdFIDIwIC0gMjQgNzggMEEgRTIgODIgQUMgNjQgMEEgIHwueXp7fH1+ICR4Li4uLmQufAorCTAwMDAwMDcwICBFRiBCRiBCRCAwQSBDNCBBMyAwQSA2NiAtIDZFIDBBIDEzIDM0IDBBIDlDIDBBIDlDICB8Li4uLi4uLmZuLi40Li4uLnwKKwkwMDAwMDA4MCAgMzUgMEEgMDEgMEEgMDEgMEEgN0YgMEEgLSAwMiA4MiBBQyAwQSA2MSAwQSA2MiAwQSAgfDUuLi4uLi4uLi4uLmEuYi58CistLS0KK25hbWU6IGRvbGxhci1xdW90ZXMtaW4taGVyZWRvY3MKK2Rlc2NyaXB0aW9uOgorCVRoZXkgYXJlLCBob3dldmVyLCBub3QgcGFyc2VkIGluIGhlcmUgZG9jdW1lbnRzCitzdGRpbjoKKwljYXQgPDxFT0YKKwkJZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KKwlFT0YKKwljYXQgPDwkJ2FcdGInCisJYVx0YgorCWEJYgorZXhwZWN0ZWQtc3Rkb3V0OgorCQlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLworCWFcdGIKKy0tLQorbmFtZTogZG9sbGFyLXF1b3Rlcy1pbi1oZXJlc3RyaW5ncworZGVzY3JpcHRpb246CisJVGhleSBhcmUsIG5vdCBwYXJzZWQgaW4gaGVyZSBzdHJpbmdzIGVpdGhlcgorc3RkaW46CisJY2F0IDw8PCJkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLyIKKwljYXQgPDw8J2RvbGxhciA9IHN0cmNocihzLCAnXCcnJCdcJycpOwkvKiAnXCcnICovJworCXg9ImRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovIgorCWNhdCA8PDwiJHgiCisJY2F0IDw8PCQnYVxFWzBtXHRiJworZXhwZWN0ZWQtc3Rkb3V0OgorCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCisJZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KKwlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLworCWEbWzBtCWIKKy0tLQorbmFtZTogZG90LW5lZWRzLWFyZ3VtZW50CitkZXNjcmlwdGlvbjoKKwljaGVjayBEZWJpYW4gIzQxNTE2NyBzb2x1dGlvbjogJy4nIHdpdGhvdXQgYXJndW1lbnRzIHNob3VsZCBmYWlsCitzdGRpbjoKKwkiJF9fcHJvZ25hbWUiIC1jIC4KKwkiJF9fcHJvZ25hbWUiIC1jIHNvdXJjZQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXC46IG1pc3NpbmcgYXJndW1lbnQuKlxuLipcLjogbWlzc2luZyBhcmd1bWVudC8KKy0tLQorbmFtZTogYWxpYXMtZnVuY3Rpb24tbm8tY29uZmxpY3QKK2Rlc2NyaXB0aW9uOgorCW1ha2UgYWxpYXNlcyBub3QgY29uZmxpY3Qgd2l0aCBmdW5jdGlvbnMKKwlub3RlOiBmb3Iga3NoLWxpa2UgZnVuY3Rpb25zLCB0aGUgb3JkZXIgb2YgcHJlZmVyZW5jZSBpcworCWRpZmZlcmVudDsgYmFzaCBvdXRwdXRzIGJheiBpbnN0ZWFkIG9mIGJhciBpbiBsaW5lIDIgYmVsb3cKK3N0ZGluOgorCWFsaWFzIGZvbz0nZWNobyBiYXInCisJZm9vKCkgeworCQllY2hvIGJhegorCX0KKwlhbGlhcyBrb3JuPSdlY2hvIGJhcicKKwlmdW5jdGlvbiBrb3JuIHsKKwkJZWNobyBiYXoKKwl9CisJZm9vCisJa29ybgorCXVuc2V0IC1mIGZvbworCWZvbyAyPiYtIHx8IGVjaG8gcmFiCitleHBlY3RlZC1zdGRvdXQ6CisJYmF6CisJYmFyCisJcmFiCistLS0KK25hbWU6IGJhc2gtZnVuY3Rpb24tcGFyZW5zCitkZXNjcmlwdGlvbjoKKwllbnN1cmUgdGhlIGtleXdvcmQgZnVuY3Rpb24gaXMgaWdub3JlZCB3aGVuIHByZWNlZGluZworCVBPU0lYIHN0eWxlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAoYmFzaGlzbSkKK3N0ZGluOgorCW1rKCkgeworCQllY2hvICcjISciJF9fcHJvZ25hbWUiCisJCWVjaG8gIiQxIHsiCisJCWVjaG8gJwllY2hvICJiYXI9J1wnJyQwJ1wnXCIKKwkJZWNobyAnfScKKwkJZWNobyAkezI6LWZvb30KKwl9CisJbWsgJ2Z1bmN0aW9uIGZvbycgPmYta29ybgorCW1rICdmb28gKCknID5mLWRhc2gKKwltayAnZnVuY3Rpb24gZm9vICgpJyA+Zi1iYXNoCisJbWsgJ2Z1bmN0aW9uIHN0b3AgKCknIHN0b3AgPmYtc3RvcAorCWNobW9kICt4IGYtKgorCWVjaG8gImtvcm46ICQoLi9mLWtvcm4pIgorCWVjaG8gImRhc2g6ICQoLi9mLWRhc2gpIgorCWVjaG8gImJhc2g6ICQoLi9mLWJhc2gpIgorCWVjaG8gInN0b3A6ICQoLi9mLXN0b3ApIgorZXhwZWN0ZWQtc3Rkb3V0OgorCWtvcm46IGJhcj0nZm9vJworCWRhc2g6IGJhcj0nLi9mLWRhc2gnCisJYmFzaDogYmFyPScuL2YtYmFzaCcKKwlzdG9wOiBiYXI9Jy4vZi1zdG9wJworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTEKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSB3b3Jrcworc3RkaW46CisJc2V0IC1VCisJdHlwZXNldCAtVXVpMTYgaTA9MSPvIGkxPTEj4oKsCisJdHlwZXNldCAtaTEgbzBhPTY0CisJdHlwZXNldCAtaTEgbzFhPTB4MjYzQQorCXR5cGVzZXQgLVV1aTEgbzBiPTB4N0UKKwl0eXBlc2V0IC1VdWkxIG8xYj0weEZERDAKKwlpbnRlZ2VyIHB4PTB4Q0FGRSAncDA9MSMgJyBwMT0xI+KApiBwbD0xI2YKKwllY2hvICJpbiA8JGkwPiA8JGkxPiIKKwllY2hvICJvdXQgPCR7bzBhIzEjfXwke28wYiMxI30+IDwke28xYSMxI318JHtvMWIjMSN9PiIKKwl0eXBlc2V0IC1VdWkxIGkwIGkxCisJZWNobyAicGFzcyA8JHB4PiA8JHAwPiA8JHAxPiA8JHBsPiA8JHtpMCMxI318JHtpMSMxI30+IgorCXR5cGVzZXQgLVV1aTE2IHR2MT0xI34gdHYyPTEjfyB0djM9MSOAIHR2ND0xI4EgdHY1PTEjwCB0djY9MSPBIHR2Nz0xI8KgIHR2OD0xI8KACisJZWNobyAic3BlY1ggPCR7dHYxIzE2I30+IDwke3R2MiMxNiN9PiA8JHt0djMjMTYjfT4gPCR7dHY0IzE2I30+IDwke3R2NSMxNiN9PiA8JHt0djYjMTYjfT4gPCR7dHY3IzE2I30+IDwke3R2OCMxNiN9PiIKKwl0eXBlc2V0IC1pMSB0djEgdHYyIHR2MyB0djQgdHY1IHR2NiB0djcgdHY4CisJZWNobyAic3BlY1cgPCR7dHYxIzEjfT4gPCR7dHYyIzEjfT4gPCR7dHYzIzEjfT4gPCR7dHY0IzEjfT4gPCR7dHY1IzEjfT4gPCR7dHY2IzEjfT4gPCR7dHY3IzEjfT4gPCR7dHY4IzEjfT4iCisJdHlwZXNldCAtaTEgeHMxPTB4RUY3RiB4czI9MHhFRjgwIHhzMz0weEZERDAKKwllY2hvICJzcGVjVSA8JHt4czEjMSN9PiA8JHt4czIjMSN9PiA8JHt4czMjMSN9PiIKK2V4cGVjdGVkLXN0ZG91dDoKKwlpbiA8MTYjRUZFRj4gPDE2IzIwQUM+CisJb3V0IDxAfH4+IDzimLp877eQPgorCXBhc3MgPDE2I2NhZmU+IDwxIyA+IDwxI+KApj4gPDEjZj4gPO984oKsPgorCXNwZWNYIDw3RT4gPDdGPiA8RUY4MD4gPEVGODE+IDxFRkMwPiA8RUZDMT4gPEEwPiA8ODA+CisJc3BlY1cgPH4+IDx/PiA8gD4gPIE+IDzAPiA8wT4gPMKgPiA8woA+CisJc3BlY1UgPO69vz4gPIA+IDzvt5A+CistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmEKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBjb3JyZWN0IGNoYXJhY3RlcnMKK3N0ZGluOgorCXNldCAtVQorCWludGVnZXIgeD0xI2ZvbworCWVjaG8gLyR4LworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLzEjZm9vOiB1bmV4cGVjdGVkICdvbycvCitleHBlY3RlZC1leGl0OiBlICE9IDAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yYgorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycworc3RkaW46CisJc2V0IC1VCisJaW50ZWdlciB4PTEjwIAKKwllY2hvIC8keC8KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8xI8CAOiB1bmV4cGVjdGVkICeAJy8KK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJjMQorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycworc3RkaW46CisJc2V0IC1VCisJaW50ZWdlciB4PTEj4oCmCisJZWNobyAvJHgvCitleHBlY3RlZC1zdGRvdXQ6CisJLzEj4oCmLworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJjMgorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGNvcnJlY3QgY2hhcmFjdGVycworc3RkaW46CisJc2V0ICtVCisJaW50ZWdlciB4PTEj4oCmCisJZWNobyAvJHgvCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvMSPigKY6IHVuZXhwZWN0ZWQgJ4AnLworZXhwZWN0ZWQtZXhpdDogZSAhPSAwCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmQxCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgaGFuZGxlcyBvY3RldHMgb2theQorc3RkaW46CisJc2V0IC1VCisJdHlwZXNldCAtaTE2IHg9MSP/CisJZWNobyAvJHgvCSMgaW52YWxpZCB1dGYtOAorZXhwZWN0ZWQtc3Rkb3V0OgorCS8xNiNlZmZmLworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkMgorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIGhhbmRsZXMgb2N0ZXRzCitzdGRpbjoKKwlzZXQgLVUKKwl0eXBlc2V0IC1pMTYgeD0xI8IKKwllY2hvIC8keC8JIyBpbnZhbGlkIDItYnl0ZQorZXhwZWN0ZWQtc3Rkb3V0OgorCS8xNiNlZmMyLworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkMworZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIGhhbmRsZXMgb2N0ZXRzCitzdGRpbjoKKwlzZXQgLVUKKwl0eXBlc2V0IC1pMTYgeD0xI+8KKwllY2hvIC8keC8JIyBpbnZhbGlkIDItYnl0ZQorZXhwZWN0ZWQtc3Rkb3V0OgorCS8xNiNlZmVmLworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkNAorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGludmFsaWQgaW5wdXQKK3N0ZGluOgorCXNldCAtVQorCXR5cGVzZXQgLWkxNiB4PTEj77/ACisJZWNobyAvJHgvCSMgaW52YWxpZCAzLWJ5dGUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8xI++/wDogdW5leHBlY3RlZCAnvycvCitleHBlY3RlZC1leGl0OiBlICE9IDAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDUKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBpbnZhbGlkIGlucHV0CitzdGRpbjoKKwlzZXQgLVUKKwl0eXBlc2V0IC1pMTYgeD0xI8CACisJZWNobyAvJHgvCSMgbm9uLW1pbmltYWxpc3RpYworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLzEjwIA6IHVuZXhwZWN0ZWQgJ4AnLworZXhwZWN0ZWQtZXhpdDogZSAhPSAwCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmQ2CitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgaW52YWxpZCBpbnB1dAorc3RkaW46CisJc2V0IC1VCisJdHlwZXNldCAtaTE2IHg9MSPggIAKKwllY2hvIC8keC8JIyBub24tbWluaW1hbGlzdGljCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvMSPggIA6IHVuZXhwZWN0ZWQgJ4AnLworZXhwZWN0ZWQtZXhpdDogZSAhPSAwCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtM0EKK2Rlc2NyaXB0aW9uOgorCXNvbWUgc2FtcGxlIGNvZGUgZm9yIGhleGR1bXBpbmcKK3N0ZGluOgorCXsKKwkJcHJpbnQgJ0hlbGxvLCBXb3JsZCFcXFxu44GT44KT44Gr44Gh44Gv77yBJworCQl0eXBlc2V0IC1VdWkxNiBpPTB4MTAwCisJCSMgY2hhbmdlIHRoYXQgdG8gMHhGRiBvbmNlIHdlIGNhbiBoYW5kbGUgZW1iZWRkZWQKKwkJIyBOVUwgY2hhcmFjdGVycyBpbiBzdHJpbmdzIC8gaGVyZSBkb2N1bWVudHMKKwkJd2hpbGUgKCggaSsrIDwgMHgxRkYgKSk7IGRvCisJCQlwcmludCAtbiAiXHgke2kjMTYjMX0iCisJCWRvbmUKKwkJcHJpbnQKKwl9IHwgeworCQl0eXBlc2V0IC1VdWkxNiAtWjExIHBvcz0wCisJCXR5cGVzZXQgLVV1aTE2IC1aNSBodgorCQl0eXBlc2V0IC1pMSB3Yz0weDBBCisJCWRhc2M9CisJCW5sPSR7d2MjMSN9CisJCXdoaWxlIElGUz0gcmVhZCAtciBsaW5lOyBkbworCQkJbGluZT0kbGluZSRubAorCQkJd2hpbGUgW1sgLW4gJGxpbmUgXV07IGRvCisJCQkJaHY9MSMke2xpbmU6OjF9CisJCQkJaWYgKCggKHBvcyAmIDE1KSA9PSAwICkpOyB0aGVuCisJCQkJCSgoIHBvcyApKSAmJiBwcmludCAiJGRhc2N8IgorCQkJCQlwcmludCAtbiAiJHtwb3MjMTYjfSAgIgorCQkJCQlkYXNjPScgfCcKKwkJCQlmaQorCQkJCXByaW50IC1uICIke2h2IzE2I30gIgorCQkJCWlmICgoIChodiA8IDMyKSB8fCAoaHYgPiAxMjYpICkpOyB0aGVuCisJCQkJCWRhc2M9JGRhc2MuCisJCQkJZWxzZQorCQkJCQlkYXNjPSRkYXNjJHtsaW5lOjoxfQorCQkJCWZpCisJCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJworCQkJCWxpbmU9JHtsaW5lOjF9CisJCQlkb25lCisJCWRvbmUKKwkJaWYgKCggKHBvcyAmIDE1KSAhPSAxICkpOyB0aGVuCisJCQl3aGlsZSAoKCBwb3MgJiAxNSApKTsgZG8KKwkJCQlwcmludCAtbiAnICAgJworCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKKwkJCWRvbmUKKwkJCXByaW50ICIkZGFzY3wiCisJCWZpCisJfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTAwMDAwMDAwICA0OCA2NSA2QyA2QyA2RiAyQyAyMCA1NyAtIDZGIDcyIDZDIDY0IDIxIDVDIDBBIEUzICB8SGVsbG8sIFdvcmxkIVwuLnwKKwkwMDAwMDAxMCAgODEgOTMgRTMgODIgOTMgRTMgODEgQUIgLSBFMyA4MSBBMSBFMyA4MSBBRiBFRiBCQyAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwMjAgIDgxIDBBIDAxIDAyIDAzIDA0IDA1IDA2IC0gMDcgMDggMDkgMEEgMEIgMEMgMEQgMEUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMDMwICAwRiAxMCAxMSAxMiAxMyAxNCAxNSAxNiAtIDE3IDE4IDE5IDFBIDFCIDFDIDFEIDFFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDA0MCAgMUYgMjAgMjEgMjIgMjMgMjQgMjUgMjYgLSAyNyAyOCAyOSAyQSAyQiAyQyAyRCAyRSAgfC4gISIjJCUmJygpKissLS58CisJMDAwMDAwNTAgIDJGIDMwIDMxIDMyIDMzIDM0IDM1IDM2IC0gMzcgMzggMzkgM0EgM0IgM0MgM0QgM0UgIHwvMDEyMzQ1Njc4OTo7PD0+fAorCTAwMDAwMDYwICAzRiA0MCA0MSA0MiA0MyA0NCA0NSA0NiAtIDQ3IDQ4IDQ5IDRBIDRCIDRDIDREIDRFICB8P0BBQkNERUZHSElKS0xNTnwKKwkwMDAwMDA3MCAgNEYgNTAgNTEgNTIgNTMgNTQgNTUgNTYgLSA1NyA1OCA1OSA1QSA1QiA1QyA1RCA1RSAgfE9QUVJTVFVWV1hZWltcXV58CisJMDAwMDAwODAgIDVGIDYwIDYxIDYyIDYzIDY0IDY1IDY2IC0gNjcgNjggNjkgNkEgNkIgNkMgNkQgNkUgIHxfYGFiY2RlZmdoaWprbG1ufAorCTAwMDAwMDkwICA2RiA3MCA3MSA3MiA3MyA3NCA3NSA3NiAtIDc3IDc4IDc5IDdBIDdCIDdDIDdEIDdFICB8b3BxcnN0dXZ3eHl6e3x9fnwKKwkwMDAwMDBBMCAgN0YgODAgODEgODIgODMgODQgODUgODYgLSA4NyA4OCA4OSA4QSA4QiA4QyA4RCA4RSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwQjAgIDhGIDkwIDkxIDkyIDkzIDk0IDk1IDk2IC0gOTcgOTggOTkgOUEgOUIgOUMgOUQgOUUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMEMwICA5RiBBMCBBMSBBMiBBMyBBNCBBNSBBNiAtIEE3IEE4IEE5IEFBIEFCIEFDIEFEIEFFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDBEMCAgQUYgQjAgQjEgQjIgQjMgQjQgQjUgQjYgLSBCNyBCOCBCOSBCQSBCQiBCQyBCRCBCRSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwRTAgIEJGIEMwIEMxIEMyIEMzIEM0IEM1IEM2IC0gQzcgQzggQzkgQ0EgQ0IgQ0MgQ0QgQ0UgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMEYwICBDRiBEMCBEMSBEMiBEMyBENCBENSBENiAtIEQ3IEQ4IEQ5IERBIERCIERDIEREIERFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDEwMCAgREYgRTAgRTEgRTIgRTMgRTQgRTUgRTYgLSBFNyBFOCBFOSBFQSBFQiBFQyBFRCBFRSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAxMTAgIEVGIEYwIEYxIEYyIEYzIEY0IEY1IEY2IC0gRjcgRjggRjkgRkEgRkIgRkMgRkQgRkUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMTIwICBGRiAwQSAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICB8Li58CistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtM1cKK2Rlc2NyaXB0aW9uOgorCXNvbWUgc2FtcGxlIGNvZGUgZm9yIGhleGR1bXBpbmcgVW5pY29kZQorc3RkaW46CisJc2V0IC1VCisJeworCQlwcmludCAnSGVsbG8sIFdvcmxkIVxcXG7jgZPjgpPjgavjgaHjga/vvIEnCisJCXR5cGVzZXQgLVV1aTE2IGk9MHgxMDAKKwkJIyBjaGFuZ2UgdGhhdCB0byAweEZGIG9uY2Ugd2UgY2FuIGhhbmRsZSBlbWJlZGRlZAorCQkjIE5VTCBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgLyBoZXJlIGRvY3VtZW50cworCQl3aGlsZSAoKCBpKysgPCAweDFGRiApKTsgZG8KKwkJCXByaW50IC1uICJcdSR7aSMxNiMxfSIKKwkJZG9uZQorCQlwcmludAorCQlwcmludCBcXHhmZgkJIyBpbnZhbGlkIHV0Zi04CisJCXByaW50IFxceGMyCQkjIGludmFsaWQgMi1ieXRlCisJCXByaW50IFxceGVmXFx4YmZcXHhjMAkjIGludmFsaWQgMy1ieXRlCisJCXByaW50IFxceGMwXFx4ODAJIyBub24tbWluaW1hbGlzdGljCisJCXByaW50IFxceGUwXFx4ODBcXHg4MAkjIG5vbi1taW5pbWFsaXN0aWMKKwkJcHJpbnQgJ++/ve+/vu+/vycJIyBlbmQgb2YgcmFuZ2UKKwl9IHwgeworCQl0eXBlc2V0IC1VdWkxNiAtWjExIHBvcz0wCisJCXR5cGVzZXQgLVV1aTE2IC1aNyBodgorCQl0eXBlc2V0IC1pMSB3Yz0weDBBCisJCXR5cGVzZXQgLWkgbHBvcworCQlkYXNjPQorCQlubD0ke3djIzEjfQorCQl3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG8KKwkJCWxpbmU9JGxpbmUkbmwKKwkJCWxwb3M9MAorCQkJd2hpbGUgKCggbHBvcyA8ICR7I2xpbmV9ICkpOyBkbworCQkJCXdjPTEjJHtsaW5lOihscG9zKyspOjF9CisJCQkJaWYgKCggKHdjIDwgMzIpIHx8IFwKKwkJCQkgICAgKCh3YyA+IDEyNikgJiYgKHdjIDwgMTYwKSkgKSk7IHRoZW4KKwkJCQkJZGNoPS4KKwkJCQllbGlmICgoICh3YyAmIDB4RkY4MCkgPT0gMHhFRjgwICkpOyB0aGVuCisJCQkJCWRjaD3vv70KKwkJCQllbHNlCisJCQkJCWRjaD0ke3djIzEjfQorCQkJCWZpCisJCQkJaWYgKCggKHBvcyAmIDcpID09IDcgKSk7IHRoZW4KKwkJCQkJZGFzYz0kZGFzYyRkY2gKKwkJCQkJZGNoPQorCQkJCWVsaWYgKCggKHBvcyAmIDcpID09IDAgKSk7IHRoZW4KKwkJCQkJKCggcG9zICkpICYmIHByaW50ICIkZGFzY3wiCisJCQkJCXByaW50IC1uICIke3BvcyMxNiN9ICAiCisJCQkJCWRhc2M9JyB8JworCQkJCWZpCisJCQkJbGV0IGh2PXdjCisJCQkJcHJpbnQgLW4gIiR7aHYjMTYjfSAiCisJCQkJKCggKHBvcysrICYgNykgPT0gMyApKSAmJiBcCisJCQkJICAgIHByaW50IC1uIC0tICctICcKKwkJCQlkYXNjPSRkYXNjJGRjaAorCQkJZG9uZQorCQlkb25lCisJCWlmICgoIHBvcyAmIDcgKSk7IHRoZW4KKwkJCXdoaWxlICgoIHBvcyAmIDcgKSk7IGRvCisJCQkJcHJpbnQgLW4gJyAgICAgJworCQkJCSgoIChwb3MrKyAmIDcpID09IDMgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJworCQkJZG9uZQorCQkJcHJpbnQgIiRkYXNjfCIKKwkJZmkKKwl9CitleHBlY3RlZC1zdGRvdXQ6CisJMDAwMDAwMDAgIDAwNDggMDA2NSAwMDZDIDAwNkMgLSAwMDZGIDAwMkMgMDAyMCAwMDU3ICB8SGVsbG8sIFd8CisJMDAwMDAwMDggIDAwNkYgMDA3MiAwMDZDIDAwNjQgLSAwMDIxIDAwNUMgMDAwQSAzMDUzICB8b3JsZCFcLuOBk3wKKwkwMDAwMDAxMCAgMzA5MyAzMDZCIDMwNjEgMzA2RiAtIEZGMDEgMDAwQSAwMDAxIDAwMDIgIHzjgpPjgavjgaHjga/vvIEuLi58CisJMDAwMDAwMTggIDAwMDMgMDAwNCAwMDA1IDAwMDYgLSAwMDA3IDAwMDggMDAwOSAwMDBBICB8Li4uLi4uLi58CisJMDAwMDAwMjAgIDAwMEIgMDAwQyAwMDBEIDAwMEUgLSAwMDBGIDAwMTAgMDAxMSAwMDEyICB8Li4uLi4uLi58CisJMDAwMDAwMjggIDAwMTMgMDAxNCAwMDE1IDAwMTYgLSAwMDE3IDAwMTggMDAxOSAwMDFBICB8Li4uLi4uLi58CisJMDAwMDAwMzAgIDAwMUIgMDAxQyAwMDFEIDAwMUUgLSAwMDFGIDAwMjAgMDAyMSAwMDIyICB8Li4uLi4gISJ8CisJMDAwMDAwMzggIDAwMjMgMDAyNCAwMDI1IDAwMjYgLSAwMDI3IDAwMjggMDAyOSAwMDJBICB8IyQlJicoKSp8CisJMDAwMDAwNDAgIDAwMkIgMDAyQyAwMDJEIDAwMkUgLSAwMDJGIDAwMzAgMDAzMSAwMDMyICB8KywtLi8wMTJ8CisJMDAwMDAwNDggIDAwMzMgMDAzNCAwMDM1IDAwMzYgLSAwMDM3IDAwMzggMDAzOSAwMDNBICB8MzQ1Njc4OTp8CisJMDAwMDAwNTAgIDAwM0IgMDAzQyAwMDNEIDAwM0UgLSAwMDNGIDAwNDAgMDA0MSAwMDQyICB8Ozw9Pj9AQUJ8CisJMDAwMDAwNTggIDAwNDMgMDA0NCAwMDQ1IDAwNDYgLSAwMDQ3IDAwNDggMDA0OSAwMDRBICB8Q0RFRkdISUp8CisJMDAwMDAwNjAgIDAwNEIgMDA0QyAwMDREIDAwNEUgLSAwMDRGIDAwNTAgMDA1MSAwMDUyICB8S0xNTk9QUVJ8CisJMDAwMDAwNjggIDAwNTMgMDA1NCAwMDU1IDAwNTYgLSAwMDU3IDAwNTggMDA1OSAwMDVBICB8U1RVVldYWVp8CisJMDAwMDAwNzAgIDAwNUIgMDA1QyAwMDVEIDAwNUUgLSAwMDVGIDAwNjAgMDA2MSAwMDYyICB8W1xdXl9gYWJ8CisJMDAwMDAwNzggIDAwNjMgMDA2NCAwMDY1IDAwNjYgLSAwMDY3IDAwNjggMDA2OSAwMDZBICB8Y2RlZmdoaWp8CisJMDAwMDAwODAgIDAwNkIgMDA2QyAwMDZEIDAwNkUgLSAwMDZGIDAwNzAgMDA3MSAwMDcyICB8a2xtbm9wcXJ8CisJMDAwMDAwODggIDAwNzMgMDA3NCAwMDc1IDAwNzYgLSAwMDc3IDAwNzggMDA3OSAwMDdBICB8c3R1dnd4eXp8CisJMDAwMDAwOTAgIDAwN0IgMDA3QyAwMDdEIDAwN0UgLSAwMDdGIDAwODAgMDA4MSAwMDgyICB8e3x9fi4uLi58CisJMDAwMDAwOTggIDAwODMgMDA4NCAwMDg1IDAwODYgLSAwMDg3IDAwODggMDA4OSAwMDhBICB8Li4uLi4uLi58CisJMDAwMDAwQTAgIDAwOEIgMDA4QyAwMDhEIDAwOEUgLSAwMDhGIDAwOTAgMDA5MSAwMDkyICB8Li4uLi4uLi58CisJMDAwMDAwQTggIDAwOTMgMDA5NCAwMDk1IDAwOTYgLSAwMDk3IDAwOTggMDA5OSAwMDlBICB8Li4uLi4uLi58CisJMDAwMDAwQjAgIDAwOUIgMDA5QyAwMDlEIDAwOUUgLSAwMDlGIDAwQTAgMDBBMSAwMEEyICB8Li4uLi7CoMKhwqJ8CisJMDAwMDAwQjggIDAwQTMgMDBBNCAwMEE1IDAwQTYgLSAwMEE3IDAwQTggMDBBOSAwMEFBICB8wqPCpMKlwqbCp8KowqnCqnwKKwkwMDAwMDBDMCAgMDBBQiAwMEFDIDAwQUQgMDBBRSAtIDAwQUYgMDBCMCAwMEIxIDAwQjIgIHzCq8Kswq3CrsKvwrDCscKyfAorCTAwMDAwMEM4ICAwMEIzIDAwQjQgMDBCNSAwMEI2IC0gMDBCNyAwMEI4IDAwQjkgMDBCQSAgfMKzwrTCtcK2wrfCuMK5wrp8CisJMDAwMDAwRDAgIDAwQkIgMDBCQyAwMEJEIDAwQkUgLSAwMEJGIDAwQzAgMDBDMSAwMEMyICB8wrvCvMK9wr7Cv8OAw4HDgnwKKwkwMDAwMDBEOCAgMDBDMyAwMEM0IDAwQzUgMDBDNiAtIDAwQzcgMDBDOCAwMEM5IDAwQ0EgIHzDg8OEw4XDhsOHw4jDicOKfAorCTAwMDAwMEUwICAwMENCIDAwQ0MgMDBDRCAwMENFIC0gMDBDRiAwMEQwIDAwRDEgMDBEMiAgfMOLw4zDjcOOw4/DkMORw5J8CisJMDAwMDAwRTggIDAwRDMgMDBENCAwMEQ1IDAwRDYgLSAwMEQ3IDAwRDggMDBEOSAwMERBICB8w5PDlMOVw5bDl8OYw5nDmnwKKwkwMDAwMDBGMCAgMDBEQiAwMERDIDAwREQgMDBERSAtIDAwREYgMDBFMCAwMEUxIDAwRTIgIHzDm8Ocw53DnsOfw6DDocOifAorCTAwMDAwMEY4ICAwMEUzIDAwRTQgMDBFNSAwMEU2IC0gMDBFNyAwMEU4IDAwRTkgMDBFQSAgfMOjw6TDpcOmw6fDqMOpw6p8CisJMDAwMDAxMDAgIDAwRUIgMDBFQyAwMEVEIDAwRUUgLSAwMEVGIDAwRjAgMDBGMSAwMEYyICB8w6vDrMOtw67Dr8Oww7HDsnwKKwkwMDAwMDEwOCAgMDBGMyAwMEY0IDAwRjUgMDBGNiAtIDAwRjcgMDBGOCAwMEY5IDAwRkEgIHzDs8O0w7XDtsO3w7jDucO6fAorCTAwMDAwMTEwICAwMEZCIDAwRkMgMDBGRCAwMEZFIC0gMDBGRiAwMDBBIEVGRkYgMDAwQSAgfMO7w7zDvcO+w78u77+9LnwKKwkwMDAwMDExOCAgRUZDMiAwMDBBIEVGRUYgRUZCRiAtIEVGQzAgMDAwQSBFRkMwIEVGODAgIHzvv70u77+977+977+9Lu+/ve+/vXwKKwkwMDAwMDEyMCAgMDAwQSBFRkUwIEVGODAgRUY4MCAtIDAwMEEgRkZGRCBFRkVGIEVGQkYgIHwu77+977+977+9Lu+/ve+/ve+/vXwKKwkwMDAwMDEyOCAgRUZCRSBFRkVGIEVGQkYgRUZCRiAtIDAwMEEgICAgICAgICAgICAgICAgIHzvv73vv73vv73vv70ufAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGtzaDkzLXN0eWxlIGJhc2Utb25lIGludGVnZXJzIHdvcmsKK2NhdGVnb3J5OiAhc21rc2gKK3N0ZGluOgorCXNldCAtVQorCWVjaG8gMSAkKCgnYScpKQorCShlY2hvIDJmICQoKCdhYScpKSkgMj4mMSB8IHNlZCAicy9eW14nXSonLzJwICcvIgorCWVjaG8gMyAkKCgn4oCmJykpCisJeD0iJ2EnIgorCWVjaG8gIjQgPCR4PiIKKwllY2hvIDUgJCgoJHgpKQorCWVjaG8gNiAkKCh4KSkKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIDk3CisJMnAgJ2FhJzogbXVsdGktY2hhcmFjdGVyIGNoYXJhY3RlciBjb25zdGFudAorCTMgODIzMAorCTQgPCdhJz4KKwk1IDk3CisJNiA5NworLS0tCituYW1lOiB1bGltaXQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgd2UgY2FuIHVzZSBhIHNwZWNpZmljIHN5bnRheCBpZGlvbSBmb3IgdWxpbWl0CitzdGRpbjoKKwlpZiAhIHg9JCh1bGltaXQgLWQpIHx8IFtbICR4ID0gdW5rbm93biBdXTsgdGhlbgorCQkjZWNobyBleHBlY3RlZCB0byBmYWlsIG9uIHRoaXMgT1MKKwkJZWNobyBva2F5CisJZWxzZQorCQl1bGltaXQgLWRTICR4ICYmIGVjaG8gb2theQorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJb2theQorLS0tCituYW1lOiBiYXNoaW9wLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCisJUGFydCAxOiB0aGlzIGlzIGFsc28gc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCitzdGRpbjoKKwlleGVjIDM+JjEKKwlmdW5jdGlvbiB0aHJlZW91dCB7CisJCWVjaG8gcmFzCisJCWVjaG8gZHdhID4mMgorCQllY2hvIHRyaSA+JjMKKwl9CisJdGhyZWVvdXQgJj5mb28KKwllY2hvID09PQorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwl0cmkKKwk9PT0KKwlyYXMKKwlkd2EKKy0tLQorbmFtZTogYmFzaGlvcC0yYQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKKwlQYXJ0IDI6IHRoaXMgaXMgKm5vdCogc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCitzdGRpbjoKKwlleGVjIDM+JjEKKwlmdW5jdGlvbiB0aHJlZW91dCB7CisJCWVjaG8gcmFzCisJCWVjaG8gZHdhID4mMgorCQllY2hvIHRyaSA+JjMKKwl9CisJdGhyZWVvdXQgMyY+Zm9vCisJZWNobyA9PT0KKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJcmFzCisJPT09CisJZHdhCisJdHJpCistLS0KK25hbWU6IGJhc2hpb3AtMmIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCisJUGFydCAyOiB0aGlzIGlzICpub3QqIHN1cHBvcnRlZCBieSBHTlUgYmFzaAorc3RkaW46CisJZXhlYyAzPiYxCisJZnVuY3Rpb24gdGhyZWVvdXQgeworCQllY2hvIHJhcworCQllY2hvIGR3YSA+JjIKKwkJZWNobyB0cmkgPiYzCisJfQorCXRocmVlb3V0IDM+Zm9vICY+JjMKKwllY2hvID09PQorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwk9PT0KKwlyYXMKKwlkd2EKKwl0cmkKKy0tLQorbmFtZTogYmFzaGlvcC0yYworZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgR05VIGJhc2gtbGlrZSBJL08gcmVkaXJlY3Rpb24gd29ya3MKKwlQYXJ0IDI6IHRoaXMgaXMgc3VwcG9ydGVkIGJ5IEdOVSBiYXNoIDQgb25seQorc3RkaW46CisJZWNobyBtaXIgPmZvbworCXNldCAtbyBub2Nsb2JiZXIKKwlleGVjIDM+JjEKKwlmdW5jdGlvbiB0aHJlZW91dCB7CisJCWVjaG8gcmFzCisJCWVjaG8gZHdhID4mMgorCQllY2hvIHRyaSA+JjMKKwl9CisJdGhyZWVvdXQgJj4+Zm9vCisJZWNobyA9PT0KKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJdHJpCisJPT09CisJbWlyCisJcmFzCisJZHdhCistLS0KK25hbWU6IGJhc2hpb3AtM2EKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIGZhaWxzIGNvcnJlY3RseQorCVBhcnQgMTogdGhpcyBpcyBhbHNvIHN1cHBvcnRlZCBieSBHTlUgYmFzaAorc3RkaW46CisJZWNobyBtaXIgPmZvbworCXNldCAtbyBub2Nsb2JiZXIKKwlleGVjIDM+JjEKKwlmdW5jdGlvbiB0aHJlZW91dCB7CisJCWVjaG8gcmFzCisJCWVjaG8gZHdhID4mMgorCQllY2hvIHRyaSA+JjMKKwl9CisJdGhyZWVvdXQgJj5mb28KKwllY2hvID09PQorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwk9PT0KKwltaXIKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLio6IGNhbm5vdCAoY3JlYXRlfG92ZXJ3cml0ZSkgLiovCistLS0KK25hbWU6IGJhc2hpb3AtM2IKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIGZhaWxzIGNvcnJlY3RseQorCVBhcnQgMjogdGhpcyBpcyAqbm90KiBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKK3N0ZGluOgorCWVjaG8gbWlyID5mb28KKwlzZXQgLW8gbm9jbG9iYmVyCisJZXhlYyAzPiYxCisJZnVuY3Rpb24gdGhyZWVvdXQgeworCQllY2hvIHJhcworCQllY2hvIGR3YSA+JjIKKwkJZWNobyB0cmkgPiYzCisJfQorCXRocmVlb3V0ICY+fGZvbworCWVjaG8gPT09CisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCXRyaQorCT09PQorCXJhcworCWR3YQorLS0tCituYW1lOiBiYXNoaW9wLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCisJUGFydCA0OiB0aGlzIGlzIGFsc28gc3VwcG9ydGVkIGJ5IEdOVSBiYXNoLAorCWJ1dCBmYWlsZWQgaW4gc29tZSBta3NoIHZlcnNpb25zCitzdGRpbjoKKwlleGVjIDM+JjEKKwlmdW5jdGlvbiB0aHJlZW91dCB7CisJCWVjaG8gcmFzCisJCWVjaG8gZHdhID4mMgorCQllY2hvIHRyaSA+JjMKKwl9CisJZnVuY3Rpb24gYmx1YmIgeworCQlbWyAtZSBiYXIgXV0gJiYgdGhyZWVvdXQgIiRiZiIgJj5mb28KKwl9CisJYmx1YmIKKwllY2hvIC1uID5iYXIKKwlibHViYgorCWVjaG8gPT09CisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCXRyaQorCT09PQorCXJhcworCWR3YQorLS0tCituYW1lOiBta3NoaW9wLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGZvciBzdXBwb3J0IG9mIG1vcmUgdGhhbiA5IGZpbGUgZGVzY3JpcHRvcnMKK2NhdGVnb3J5OiAhY29udmZkcworc3RkaW46CisJcmVhZCAtdTEwIGZvbyAxMDw8PCBiYXIKKwllY2hvIHgkZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJeGJhcgorLS0tCituYW1lOiBta3NoaW9wLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGZvciBzdXBwb3J0IG9mIG1vcmUgdGhhbiA5IGZpbGUgZGVzY3JpcHRvcnMKK2NhdGVnb3J5OiAhY29udmZkcworc3RkaW46CisJZXhlYyAxMj5mb28KKwlwcmludCAtdTEyIGJhcgorCWVjaG8gYmF6ID4mMTIKKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJYmFyCisJYmF6CistLS0KK25hbWU6IG9rc2gtc2hjcmFzaAorZGVzY3JpcHRpb246CisJc3JjL3JlZ3Jlc3MvYmluL2tzaC9zaGNyYXNoLnNoLHYgMS4xCitzdGRpbjoKKwlkZXBsaWJzPSItbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLWxtIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbW9kdWxlLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLWx0aWZmIC1sanBlZyAtbHogLWxwbmcgLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGtfcGl4YnVmLmxhIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAtbG0gLWxtIC91c3IvbG9jYWwvbGliL2xpYmF1ZGlvZmlsZS5sYSAtbG0gLWxtIC1sYXVkaW9maWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZXNkLmxhIC1sbSAtbHogLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXN1cHBvcnQubGEgLWxtIC1seiAtbG0gLWxnbGliIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWUubGEgLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbW9kdWxlLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLWxJQ0UgLWxTTSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLWxtIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAtbHogL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvWDExUjYvbGliIC91c3IvbG9jYWwvbGliL2xpYmdka19pbWxpYi5sYSAtbG0gLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJhcnRfbGdwbC5sYSAtbG0gLWx6IC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLWxJQ0UgLWxTTSAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1ML3Vzci9YMTFSNi9saWIgLWxtIC1seiAtbHBuZyAtbHVuZ2lmIC1seiAtbGpwZWcgLWx0aWZmIC1sanBlZyAtbGdka19pbWxpYiAtbGdsaWIgLWxtIC1sYXVkaW9maWxlIC1sbSAtbGF1ZGlvZmlsZSAtbGVzZCAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21ldWkubGEgLWx6IC1seiAvdXNyL2xvY2FsL2xpYi9saWJ4bWwubGEgLWx6IC1seiAtbHogL3Vzci9sb2NhbC9saWIvbGlieG1sLmxhIC1sbSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtTC91c3IvWDExUjYvbGliIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2xhZGUubGEgLWx6IC1seiAtbHogL3Vzci9sb2NhbC9saWIvbGlieG1sLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgLWxtIC1sbSAvdXNyL2xvY2FsL2xpYi9saWJhdWRpb2ZpbGUubGEgLWxtIC1sbSAtbGF1ZGlvZmlsZSAvdXNyL2xvY2FsL2xpYi9saWJlc2QubGEgLWxtIC1seiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXN1cHBvcnQubGEgLWxtIC1seiAtbG0gLWxnbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lLmxhIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLWxnbGliIC1sZ21vZHVsZSAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLWxnbGliIC1sZ21vZHVsZSAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLWxJQ0UgLWxTTSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLWxtIC1seiAtbHogL3Vzci9sb2NhbC9saWIvbGliZ2RrX2ltbGliLmxhIC91c3IvbG9jYWwvbGliL2xpYmFydF9sZ3BsLmxhIC1sbSAtbHogLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1sbSAtbHogLWx1bmdpZiAtbHogLWxqcGVnIC1sanBlZyAtbGdka19pbWxpYiAtbGdsaWIgLWxtIC1sYXVkaW9maWxlIC1sbSAtbGF1ZGlvZmlsZSAtbGVzZCAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXVpLmxhIC1ML3Vzci9YMTFSNi9saWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbGFkZS1nbm9tZS5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC1sbSAtbG0gL3Vzci9sb2NhbC9saWIvbGliYXVkaW9maWxlLmxhIC1sbSAtbG0gLWxhdWRpb2ZpbGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJlc2QubGEgLWxtIC1seiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lc3VwcG9ydC5sYSAtbG0gLWx6IC1sbSAtbGdsaWIgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZS5sYSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdtb2R1bGUubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmd0ay5sYSAtbElDRSAtbFNNIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtbG0gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC1seiAvdXNyL2xvY2FsL2xpYi9saWJqcGVnLmxhIC1sdGlmZiAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9YMTFSNi9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrX2ltbGliLmxhIC1sbSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmFydF9sZ3BsLmxhIC1sbSAtbHogLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtbElDRSAtbFNNIC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLUwvdXNyL1gxMVI2L2xpYiAtbG0gLWx6IC1scG5nIC1sdW5naWYgLWx6IC1sanBlZyAtbHRpZmYgLWxqcGVnIC1sZ2RrX2ltbGliIC1sZ2xpYiAtbG0gLWxhdWRpb2ZpbGUgLWxtIC1sYXVkaW9maWxlIC1sZXNkIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWV1aS5sYSAtTC91c3IvWDExUjYvbGliIC1ML3Vzci9sb2NhbC9saWIiCisJc3BlY2lhbGRlcGxpYnM9Ii1sZ25vbWV1aSAtbGFydF9sZ3BsIC1sZ2RrX2ltbGliIC1sdGlmZiAtbGpwZWcgLWx1bmdpZiAtbHBuZyAtbHogLWxTTSAtbElDRSAtbGd0ayAtbGdkayAtbGdtb2R1bGUgLWxpbnRsIC1sWGV4dCAtbFgxMSAtbGdub21lIC1sZ25vbWVzdXBwb3J0IC1sZXNkIC1sYXVkaW9maWxlIC1sbSAtbGdsaWIiCisJZm9yIGRlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkJY2FzZSAkZGVwbGliIGluCisJCS1MKikKKwkJCW5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIKKwkJCTs7CisJCSopCisJCQljYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KKwkJCSoiICRkZXBsaWIgIiopCisJCQkJbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIjs7CisJCQllc2FjCisJCQk7OworCQllc2FjCisJZG9uZQorLS0tCituYW1lOiBva3NoLXZhcmZ1bmN0aW9uLW1vZDEKK2Rlc2NyaXB0aW9uOgorCSRPcGVuQlNEOiB2YXJmdW5jdGlvbi5zaCx2IDEuMSAyMDAzLzEyLzE1IDA1OjI4OjQwIG90dG8gRXhwICQKKwlDYWxsaW5nCisJCUZPTz1iYXIgZgorCXdoZXJlIGYgaXMgYSBrc2ggc3R5bGUgZnVuY3Rpb24sIHNob3VsZCBub3Qgc2V0IEZPTyBpbiB0aGUgY3VycmVudAorCWVudi4gSWYgZiBpcyBhIEJvdXJuZSBzdHlsZSBmdW5jdGlvbiwgRk9PIHNob3VsZCBiZSBzZXQuIEZ1cnRoZXJtb3JlLAorCXRoZSBmdW5jdGlvbiBzaG91bGQgcmVjZWl2ZSBhIGNvcnJlY3QgdmFsdWUgb2YgRk9PLiBIb3dldmVyLCBkaWZmZXJpbmcKKwlmcm9tIG9rc2gsIHNldHRpbmcgRk9PIGluIHRoZSBmdW5jdGlvbiBpdHNlbGYgbXVzdCBjaGFuZ2UgdGhlIHZhbHVlIGluCisJc2V0dGluZyBGT08gaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZiBzaG91bGQgbm90IGNoYW5nZSB0aGUgdmFsdWUgaW4KKwlnbG9iYWwgZW52aXJvbm1lbnQuCisJSW5zcGlyZWQgYnkgUFIgMjQ1MC4KK3N0ZGluOgorCWZ1bmN0aW9uIGsgeworCQlpZiBbIHgkRk9PICE9IHhiYXIgXTsgdGhlbgorCQkJZWNobyAxCisJCQlyZXR1cm4gMQorCQlmaQorCQl4PSQoZW52IHwgZ3JlcCBGT08pCisJCWlmIFsgIngkeCIgIT0gInhGT089YmFyIiBdOyB0aGVuCisJCQllY2hvIDIKKwkJCXJldHVybiAxOworCQlmaQorCQlGT089Zm9vCisJCXJldHVybiAwCisJfQorCWIgKCkgeworCQlpZiBbIHgkRk9PICE9IHhiYXIgXTsgdGhlbgorCQkJZWNobyAzCisJCQlyZXR1cm4gMQorCQlmaQorCQl4PSQoZW52IHwgZ3JlcCBGT08pCisJCWlmIFsgIngkeCIgIT0gInhGT089YmFyIiBdOyB0aGVuCisJCQllY2hvIDQKKwkJCXJldHVybiAxOworCQlmaQorCQlGT089Zm9vCisJCXJldHVybiAwCisJfQorCUZPTz1iYXIgaworCWlmIFsgJD8gIT0gMCBdOyB0aGVuCisJCWV4aXQgMQorCWZpCisJaWYgWyB4JEZPTyAhPSB4IF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKwlGT089YmFyIGIKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQlleGl0IDEKKwlmaQorCWlmIFsgeCRGT08gIT0geGZvbyBdOyB0aGVuCisJCWV4aXQgMQorCWZpCisJRk9PPWJhcmJhcgorCUZPTz1iYXIgaworCWlmIFsgJD8gIT0gMCBdOyB0aGVuCisJCWV4aXQgMQorCWZpCisJaWYgWyB4JEZPTyAhPSB4YmFyYmFyIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKwlGT089YmFyIGIKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQlleGl0IDEKKwlmaQorCWlmIFsgeCRGT08gIT0geGZvbyBdOyB0aGVuCisJCWV4aXQgMQorCWZpCistLS0KK25hbWU6IGZkLWNsb2V4ZWMtMQorZGVzY3JpcHRpb246CisJVmVyaWZ5IHRoYXQgZmlsZSBkZXNjcmlwdG9ycyA+IDIgYXJlIHByaXZhdGUgZm9yIEtvcm4gc2hlbGxzCitmaWxlLXNldHVwOiBmaWxlIDY0NCAidGVzdC5zaCIKKwlwcmludCAtdTMgRm93bAorc3RkaW46CisJZXhlYyAzPiYxCisJIiRfX3Byb2duYW1lIiB0ZXN0LnNoCitleHBlY3RlZC1leGl0OiBlICE9IDAKK2V4cGVjdGVkLXN0ZGVycjoKKwl0ZXN0LnNoWzFdOiBwcmludDogLXU6IDM6IGJhZCBmaWxlIGRlc2NyaXB0b3IKKy0tLQorbmFtZTogZmQtY2xvZXhlYy0yCitkZXNjcmlwdGlvbjoKKwlWZXJpZnkgdGhhdCBmaWxlIGRlc2NyaXB0b3JzID4gMiBhcmUgbm90IHByaXZhdGUgZm9yIFBPU0lYIHNoZWxscworCVNlZSBEZWJpYW4gQnVnICMxNTQ1NDAsIENsb3NlczogIzQ5OTEzOQorZmlsZS1zZXR1cDogZmlsZSA2NDQgInRlc3Quc2giCisJcHJpbnQgLXUzIEZvd2wKK3N0ZGluOgorCXRlc3QgLW4gIiRQT1NIX1ZFUlNJT04iIHx8IHNldCAtbyBzaAorCWV4ZWMgMz4mMQorCSIkX19wcm9nbmFtZSIgdGVzdC5zaAorZXhwZWN0ZWQtc3Rkb3V0OgorCUZvd2wKKy0tLQorbmFtZTogY29tc3ViLTEKK2Rlc2NyaXB0aW9uOgorCUNPTVNVQiBhcmUgY3VycmVudGx5IHBhcnNlZCBieSBoYWNraW5nIGxleC5jIGluc3RlYWQgb2YKKwlyZWN1cnNpdmVseSAoc2VlIHJlZ3Jlc3Npb24tNik6IG1hdGNoaW5nIHBhcmVudGhlc8STcyBidWcKKwlGYWlscyBvbjogcGRrc2ggbWtzaCBiYXNoMiBiYXNoMyB6c2gKKwlQYXNzZXMgb246IGJhc2g0IGtzaDkzCitleHBlY3RlZC1mYWlsOiB5ZXMKK3N0ZGluOgorCWVjaG8gJChjYXNlIDEgaW4gKDEpIGVjaG8geWVzOzsgKDIpIGVjaG8gbm87OyBlc2FjKQorCWVjaG8gJChjYXNlIDEgaW4gMSkgZWNobyB5ZXM7OyAyKSBlY2hvIG5vOzsgZXNhYykKK2V4cGVjdGVkLXN0ZG91dDoKKwl5ZXMKKwl5ZXMKKy0tLQorbmFtZTogY29tc3ViLTIKK2Rlc2NyaXB0aW9uOgorCVJlZEhhdCBCWiM0OTY3OTEg4oCTIGFub3RoZXIgY2FzZSBvZiBtaXNzaW5nIHJlY3Vyc2lvbgorCWluIHBhcnNpbmcgQ09NU1VCIGV4cHJlc3Npb25zCisJRmFpbHMgb246IHBka3NoIG1rc2ggYmFzaDIgYmFzaDPCuSBiYXNoNMK5IHpzaAorCVBhc3NlcyBvbjoga3NoOTMKKwnikaAgYmFzaFszNF0gc2VlbSB0byBjaG9rZSBvbiBjb21tZW50IGVuZGluZyB3aXRoIGJhY2tzbGFzaC1uZXdsaW5lCitleHBlY3RlZC1mYWlsOiB5ZXMKK3N0ZGluOgorCSMgYSBjb21tZW50IHdpdGggIiAnIFwKKwl4PSQoCisJZWNobyB5ZXMKKwkjIGEgY29tbWVudCB3aXRoICIgJyBcCisJKQorCWVjaG8gJHgKK2V4cGVjdGVkLXN0ZG91dDoKKwl5ZXMKKy0tLQorbmFtZTogdGVzdC1zdG56ZS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBzaG9ydCBmb3JtIFsgJHggXSB3b3Jrcworc3RkaW46CisJaT0wCisJWyAtbiAkeCBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAkeCBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAtbiAiJHgiIF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbICIkeCIgXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCXg9MAorCVsgLW4gJHggXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgJHggXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgLW4gIiR4IiBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAiJHgiIF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwl4PScxIC1hIDEgPSAyJworCVsgLW4gJHggXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgJHggXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgLW4gIiR4IiBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAiJHgiIF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIDAKKwkyIDEKKwkzIDEKKwk0IDEKKwk1IDAKKwk2IDAKKwk3IDAKKwk4IDAKKwk5IDEKKwkxMCAxCisJMTEgMAorCTEyIDAKKy0tLQorbmFtZTogdGVzdC1zdG56ZS0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBzaG9ydCBmb3JtIFtbICR4IF1dIHdvcmtzIChrc2g5MyBleHRlbnNpb24pCitzdGRpbjoKKwlpPTAKKwlbWyAtbiAkeCBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbICR4IF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgLW4gIiR4IiBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbICIkeCIgXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwl4PTAKKwlbWyAtbiAkeCBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbICR4IF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgLW4gIiR4IiBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbICIkeCIgXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwl4PScxIC1hIDEgPSAyJworCVtbIC1uICR4IF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgJHggXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAtbiAiJHgiIF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgIiR4IiBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgMQorCTIgMQorCTMgMQorCTQgMQorCTUgMAorCTYgMAorCTcgMAorCTggMAorCTkgMAorCTEwIDAKKwkxMSAwCisJMTIgMAorLS0tCituYW1lOiBldmVudC1zdWJzdC0xYQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCAnIScgc3Vic3RpdHV0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgd29ya3MKK2NhdGVnb3J5OiAhc21rc2gKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICJmYWxzZXR0byIKKwkjISAvYmluL3NoCisJZWNobyBtb2x0byBiZW5lCisJZXhpdCA0MgorZmlsZS1zZXR1cDogZmlsZSA3NTUgIiFmYWxzZSIKKwkjISAvYmluL3NoCisJZWNobyBzaQorYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwlleHBvcnQgUEFUSD0uOiRQQVRICisJZmFsc2V0dG8KKwllY2hvIHllYXAKKwkhZmFsc2UKK2V4cGVjdGVkLWV4aXQ6IDQyCitleHBlY3RlZC1zdGRvdXQ6CisJbW9sdG8gYmVuZQorCXllYXAKKwltb2x0byBiZW5lCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLiovCistLS0KK25hbWU6IGV2ZW50LXN1YnN0LTFiCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0ICchJyBzdWJzdGl0dXRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSB3b3JrcworCWV2ZW4gd2hlbiBhIHNwYWNlIHNlcGFyYXRlcyBpdCBmcm9tIHRoZSBzZWFyY2ggY29tbWFuZCwKKwl3aGljaCBpcyBub3Qgd2hhdCBHTlUgYmFzaCBwcm92aWRlcyBidXQgcmVxdWlyZWQgZm9yIHRoZQorCW90aGVyIHJlZ3Jlc3Npb24gdGVzdHMgYmVsb3cgdG8gY2hlY2sKK2NhdGVnb3J5OiAhc21rc2gKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICJmYWxzZXR0byIKKwkjISAvYmluL3NoCisJZWNobyBtb2x0byBiZW5lCisJZXhpdCA0MgorZmlsZS1zZXR1cDogZmlsZSA3NTUgIiEiCisJIyEgL2Jpbi9zaAorCWVjaG8gc2kKK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJZXhwb3J0IFBBVEg9LjokUEFUSAorCWZhbHNldHRvCisJZWNobyB5ZWFwCisJISBmYWxzZQorZXhwZWN0ZWQtZXhpdDogNDIKK2V4cGVjdGVkLXN0ZG91dDoKKwltb2x0byBiZW5lCisJeWVhcAorCW1vbHRvIGJlbmUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKi8KKy0tLQorbmFtZTogZXZlbnQtc3Vic3QtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCAnIScgc3Vic3RpdHV0aW9uIGluIGludGVyYWN0aXZlIG1vZGUKKwlkb2VzIG5vdCBicmVhayB0aGluZ3MKK2NhdGVnb3J5OiAhc21rc2gKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICJmYWxzZXR0byIKKwkjISAvYmluL3NoCisJZWNobyBtb2x0byBiZW5lCisJZXhpdCA0MgorZmlsZS1zZXR1cDogZmlsZSA3NTUgIiEiCisJIyEgL2Jpbi9zaAorCWVjaG8gc2kKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZXhwb3J0IFBBVEg9LjokUEFUSAorCWZhbHNldHRvCisJZWNobyB5ZWFwCisJIWZhbHNlCisJZWNobyBtZW93CisJISBmYWxzZQorCWVjaG8gPSAkPworCWlmCisJISBmYWxzZTsgdGhlbiBlY2hvIGZvbzsgZWxzZSBlY2hvIGJhcjsgZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwltb2x0byBiZW5lCisJeWVhcAorCW1vbHRvIGJlbmUKKwltZW93CisJbW9sdG8gYmVuZQorCT0gNDIKKwlmb28KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKi8KKy0tLQorbmFtZTogZXZlbnQtc3Vic3QtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCAnIScgc3Vic3RpdHV0aW9uIGluIG5vbmludGVyYWN0aXZlIG1vZGUgaXMgaWdub3JlZAorY2F0ZWdvcnk6ICFzbWtzaAorZmlsZS1zZXR1cDogZmlsZSA3NTUgImZhbHNldHRvIgorCSMhIC9iaW4vc2gKKwllY2hvIG1vbHRvIGJlbmUKKwlleGl0IDQyCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiIWZhbHNlIgorCSMhIC9iaW4vc2gKKwllY2hvIHNpCitzdGRpbjoKKwlleHBvcnQgUEFUSD0uOiRQQVRICisJZmFsc2V0dG8KKwllY2hvIHllYXAKKwkhZmFsc2UKKwllY2hvIG1lb3cKKwkhIGZhbHNlCisJZWNobyA9ICQ/CisJaWYKKwkhIGZhbHNlOyB0aGVuIGVjaG8gZm9vOyBlbHNlIGVjaG8gYmFyOyBmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCW1vbHRvIGJlbmUKKwl5ZWFwCisJc2kKKwltZW93CisJPSAwCisJZm9vCistLS0KK25hbWU6IG5vdW5zZXQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCAic2V0IC11IiBtYXRjaGVzIChmdXR1cmUpIFNVU3Y0IHJlcXVpcmVtZW50CitzdGRpbjoKKwkoc2V0IC11CisJdHJ5KCkgeworCQlsb2NhbCB2CisJCWV2YWwgdj1cJCQxCisJCWlmIFtbIC1uICR2IF1dOyB0aGVuCisJCQllY2hvICQxPW56CisJCWVsc2UKKwkJCWVjaG8gJDE9emYKKwkJZmkKKwl9CisJeD15CisJKGVjaG8gJHgpCisJZWNobyA9MQorCShlY2hvICR5KQorCWVjaG8gPTIKKwkodHJ5IHgpCisJZWNobyA9MworCSh0cnkgeSkKKwllY2hvID00CisJKHRyeSAwKQorCWVjaG8gPTUKKwkodHJ5IDIpCisJZWNobyA9NgorCSh0cnkpCisJZWNobyA9NworCShlY2hvIGF0PSRAKQorCWVjaG8gPTgKKwkoZWNobyBhc3Rlcmlzaz0kKikKKwllY2hvID05CisJKGVjaG8gJD8pCisJZWNobyA9MTAKKwkoZWNobyAkISkKKwllY2hvID0xMQorCShlY2hvICQtKQorCWVjaG8gPTEyCisJIyhlY2hvICRfKQorCSNlY2hvID0xMworCShlY2hvICQjKQorCWVjaG8gPTE0CisJKG15cGlkPSQkOyB0cnkgbXlwaWQpCisJZWNobyA9MTUKKwkpIDI+JjEgfCBzZWQgLWUgJ3MvXlteXV0qXS8vJyAtZSAncy9eW146XSo6ICovLycKK2V4cGVjdGVkLXN0ZG91dDoKKwl5CisJPTEKKwl5OiBwYXJhbWV0ZXIgbm90IHNldAorCT0yCisJeD1uegorCT0zCisJeTogcGFyYW1ldGVyIG5vdCBzZXQKKwk9NAorCTA9bnoKKwk9NQorCTI6IHBhcmFtZXRlciBub3Qgc2V0CisJPTYKKwkxOiBwYXJhbWV0ZXIgbm90IHNldAorCT03CisJYXQ9CisJPTgKKwlhc3Rlcmlzaz0KKwk9OQorCTAKKwk9MTAKKwkhOiBwYXJhbWV0ZXIgbm90IHNldAorCT0xMQorCXVzaAorCT0xMgorCTAKKwk9MTQKKwlteXBpZD1uegorCT0xNQorLS0tCituYW1lOiBuYW1lcmVmLTEKK2Rlc2NyaXB0aW9uOgorCVRlc3RzdWl0ZSBmb3IgbmFtZXJlZiAoYm91bmQgdmFyaWFibGVzKQorc3RkaW46CisJYmFyPWdsb2JhbAorCXR5cGVzZXQgLW4gaXIyPWJhcgorCXR5cGVzZXQgLW4gaW5kPWlyMgorCWVjaG8gIWluZDogJHshaW5kfQorCWVjaG8gaW5kOiAkaW5kCisJZWNobyAhaXIyOiAkeyFpcjJ9CisJZWNobyBpcjI6ICRpcjIKKwl0eXBlc2V0ICtuIGluZAorCWVjaG8gIWluZDogJHshaW5kfQorCWVjaG8gaW5kOiAkaW5kCisJdHlwZXNldCAtbiBpcjI9aW5kCisJZWNobyAhaXIyOiAkeyFpcjJ9CisJZWNobyBpcjI6ICRpcjIKKwlzZXR8Z3JlcCBeaXIyfHNlZCAncy9eL3MxOiAvJworCXR5cGVzZXR8Z3JlcCAnIGlyMid8c2VkIC1lICdzL14vczI6IC8nIC1lICdzL25hbWVyZWYvdHlwZXNldCAtbi8nCisJc2V0IC1BIGJsdWIgLS0gZTEgZTIgZTMKKwl0eXBlc2V0IC1uIGluZD1ibHViCisJdHlwZXNldCAtbiBpcjI9Ymx1YlsyXQorCWVjaG8gIWluZFsxXTogJHshaW5kWzFdfQorCWVjaG8gIWlyMjogJCFpcjIKKwllY2hvIGluZFsxXTogJHtpbmRbMV19CisJZWNobyBpcjI6ICRpcjIKK2V4cGVjdGVkLXN0ZG91dDoKKwkhaW5kOiBiYXIKKwlpbmQ6IGdsb2JhbAorCSFpcjI6IGJhcgorCWlyMjogZ2xvYmFsCisJIWluZDogaW5kCisJaW5kOiBpcjIKKwkhaXIyOiBpbmQKKwlpcjI6IGlyMgorCXMxOiBpcjI9aW5kCisJczI6IHR5cGVzZXQgLW4gaXIyCisJIWluZFsxXTogMQorCSFpcjI6IGlyMgorCWluZFsxXTogZTIKKwlpcjI6IGUzCistLS0KK25hbWU6IG5hbWVyZWYtMmRhCitkZXNjcmlwdGlvbjoKKwlUZXN0c3VpdGUgZm9yIG5hbWVyZWYgKGJvdW5kIHZhcmlhYmxlcykKKwlGdW5jdGlvbnMsIGFyZ3VtZW50IGdpdmVuIGRpcmVjdGx5LCBhZnRlciBsb2NhbAorc3RkaW46CisJZnVuY3Rpb24gZm9vIHsKKwkJdHlwZXNldCBiYXI9bG9rYWwgYmF6PWF1Y2gKKwkJdHlwZXNldCAtbiB2PWJhcgorCQllY2hvIGVudGVyaW5nCisJCWVjaG8gIXY6ICR7IXZ9CisJCWVjaG8gIWJhcjogJHshYmFyfQorCQllY2hvICFiYXo6ICR7IWJhen0KKwkJZWNobyBiYXI6ICRiYXIKKwkJZWNobyB2OiAkdgorCQl2PTEyMworCQllY2hvIGJhcjogJGJhcgorCQllY2hvIHY6ICR2CisJCWVjaG8gZXhpdGluZworCX0KKwliYXI9Z2xvYmFsCisJZWNobyBiYXI6ICRiYXIKKwlmb28gYmFyCisJZWNobyBiYXI6ICRiYXIKK2V4cGVjdGVkLXN0ZG91dDoKKwliYXI6IGdsb2JhbAorCWVudGVyaW5nCisJIXY6IGJhcgorCSFiYXI6IGJhcgorCSFiYXo6IGJhegorCWJhcjogbG9rYWwKKwl2OiBsb2thbAorCWJhcjogMTIzCisJdjogMTIzCisJZXhpdGluZworCWJhcjogZ2xvYmFsCistLS0KK25hbWU6IG5hbWVyZWYtMworZGVzY3JpcHRpb246CisJQWR2YW5jZWQgdGVzdHN1aXRlIGZvciBib3VuZCB2YXJpYWJsZXMgKGtzaDkzIGZhaWxzIHRoaXMpCitzdGRpbjoKKwl0eXBlc2V0IC1uIGZvbz1iYXJbaV0KKwlzZXQgLUEgYmFyIC0tIGIgYyBhCisJZm9yIGkgaW4gMCAxIDIgMzsgZG8KKwkJcHJpbnQgJGkgJGZvbyAuCisJZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCTAgYiAuCisJMSBjIC4KKwkyIGEgLgorCTMgLgorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTFhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwlpZiAoIChlY2hvIGZ1YmFyKSB8IHRyIHUgeCk7IHRoZW4KKwkJZWNobyBqYQorCWVsc2UKKwkJZWNobyBuZWluCisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhcgorCWphCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtMWIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWVjaG8gJCggKGVjaG8gZnViYXIpIHwgdHIgdSB4KSAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyIDAKKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy0yYQorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJaWYgKChlY2hvIGZ1YmFyKSB8IHRyIHUgeCk7IHRoZW4KKwkJZWNobyBqYQorCWVsc2UKKwkJZWNobyBuZWluCisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhcgorCWphCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtMmIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWVjaG8gJCgoZWNobyBmdWJhcikgfCB0ciB1IHgpICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIgMAorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTNhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwlpZiAoIChlY2hvIGZ1YmFyKSB8ICh0ciB1IHgpKTsgdGhlbgorCQllY2hvIGphCisJZWxzZQorCQllY2hvIG5laW4KKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyCisJamEKKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy0zYgorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJZWNobyAkKCAoZWNobyBmdWJhcikgfCAodHIgdSB4KSkgJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhciAwCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtNGEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWlmICgoZWNobyBmdWJhcikgfCAodHIgdSB4KSk7IHRoZW4KKwkJZWNobyBqYQorCWVsc2UKKwkJZWNobyBuZWluCisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhcgorCWphCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtNGIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWVjaG8gJCgoZWNobyBmdWJhcikgfCAodHIgdSB4KSkgJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhciAwCistLS0KK25hbWU6IGVjaG8tdGVzdC0xCitkZXNjcmlwdGlvbjoKKwlUZXN0IHdoYXQgdGhlIGVjaG8gYnVpbHRpbiBkb2VzIChta3NoKQorc3RkaW46CisJZWNobyAtbiAnZm9vXHg0MGJhcicKKwllY2hvIC1lICdcdGJheicKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb29AYmFyCWJhegorLS0tCituYW1lOiBlY2hvLXRlc3QtMgorZGVzY3JpcHRpb246CisJVGVzdCB3aGF0IHRoZSBlY2hvIGJ1aWx0aW4gZG9lcyAoUE9TSVgpCisJTm90ZTogdGhpcyBmb2xsb3dzIERlYmlhbiBQb2xpY3kgMTAuNCB3aGljaCBtYW5kYXRlcworCXRoYXQgLW4gc2hhbGwgYmUgdHJlYXRlZCBhcyBhbiBvcHRpb24sIG5vdCBYU0kgd2hpY2gKKwltYW5kYXRlcyBpdCBzaGFsbCBiZSB0cmVhdGVkIGFzIHN0cmluZyBidXQgZXNjYXBlcworCXNoYWxsIGJlIGV4cGFuZGVkLgorc3RkaW46CisJdGVzdCAtbiAiJFBPU0hfVkVSU0lPTiIgfHwgc2V0IC1vIHNoCisJZWNobyAtbiAnZm9vXHg0MGJhcicKKwllY2hvIC1lICdcdGJheicKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb29ceDQwYmFyLWUgXHRiYXoKKy0tLQorbmFtZTogdXRpbGl0aWVzLWdldG9wdHMtMQorZGVzY3JpcHRpb246CisJZ2V0b3B0cyBzZXRzIE9QVElORCBjb3JyZWN0bHkgZm9yIHVucGFyc2VkIG9wdGlvbgorc3RkaW46CisJc2V0IC0tIC1hIC1hIC14CisJd2hpbGUgZ2V0b3B0cyA6YSBvcHRjOyBkbworCSAgICBlY2hvICJPUFRBUkc9JE9QVEFSRywgT1BUSU5EPSRPUFRJTkQsIG9wdGM9JG9wdGMuIgorCWRvbmUKKwllY2hvIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwlPUFRBUkc9LCBPUFRJTkQ9Miwgb3B0Yz1hLgorCU9QVEFSRz0sIE9QVElORD0zLCBvcHRjPWEuCisJT1BUQVJHPXgsIE9QVElORD00LCBvcHRjPT8uCisJZG9uZQorLS0tCituYW1lOiB1dGlsaXRpZXMtZ2V0b3B0cy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBPUFRBUkcKK3N0ZGluOgorCXNldCAtLSAtYSBNYXJ5IC14CisJd2hpbGUgZ2V0b3B0cyBhOiBvcHRjOyBkbworCSAgICBlY2hvICJPUFRBUkc9JE9QVEFSRywgT1BUSU5EPSRPUFRJTkQsIG9wdGM9JG9wdGMuIgorCWRvbmUKKwllY2hvIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwlPUFRBUkc9TWFyeSwgT1BUSU5EPTMsIG9wdGM9YS4KKwlPUFRBUkc9LCBPUFRJTkQ9NCwgb3B0Yz0/LgorCWRvbmUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLioteC4qb3B0aW9uLworLS0tCituYW1lOiB3Y3N3aWR0aC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGUgbmV3IHdjc3dpZHRoIGZlYXR1cmUKK3N0ZGluOgorCXM95L2VCisJc2V0ICtVCisJcHJpbnQgb2N0ZXRzOiAkeyNzfSAuCisJcHJpbnQgOC1iaXQgd2lkdGg6ICR7JXN9IC4KKwlzZXQgLVUKKwlwcmludCBjaGFyYWN0ZXJzOiAkeyNzfSAuCisJcHJpbnQgY29sdW1uczogJHslc30gLgorCXM977+9CisJc2V0ICtVCisJcHJpbnQgb2N0ZXRzOiAkeyNzfSAuCisJcHJpbnQgOC1iaXQgd2lkdGg6ICR7JXN9IC4KKwlzZXQgLVUKKwlwcmludCBjaGFyYWN0ZXJzOiAkeyNzfSAuCisJcHJpbnQgY29sdW1uczogJHslc30gLgorZXhwZWN0ZWQtc3Rkb3V0OgorCW9jdGV0czogMyAuCisJOC1iaXQgd2lkdGg6IC0xIC4KKwljaGFyYWN0ZXJzOiAxIC4KKwljb2x1bW5zOiAyIC4KKwlvY3RldHM6IDMgLgorCTgtYml0IHdpZHRoOiAzIC4KKwljaGFyYWN0ZXJzOiAxIC4KKwljb2x1bW5zOiAxIC4KKy0tLQorbmFtZTogd2Nzd2lkdGgtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKK3N0ZGluOgorCXByaW50ICUgJCUgLgorCXNldCAtVQorCXg9J2EJYicKKwlwcmludCBjICR7JXh9IC4KKwlzZXQgK1UKKwl4PSdhCWInCisJcHJpbnQgZCAkeyV4fSAuCitleHBlY3RlZC1zdGRvdXQ6CisJJSAkJSAuCisJYyAtMSAuCisJZCAtMSAuCistLS0KK25hbWU6IHdjc3dpZHRoLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgY29ybmVyIGNhc2VzCitzdGRpbjoKKwlwcmludCAkeyV9IC4KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9iYWQgc3Vic3RpdHV0aW9uLworZXhwZWN0ZWQtZXhpdDogMQorLS0tCituYW1lOiB3Y3N3aWR0aC00YQorZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKK3N0ZGluOgorCXByaW50ICR7JSp9IC4KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9iYWQgc3Vic3RpdHV0aW9uLworZXhwZWN0ZWQtZXhpdDogMQorLS0tCituYW1lOiB3Y3N3aWR0aC00YgorZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKK3N0ZGluOgorCXByaW50ICR7JUB9IC4KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9iYWQgc3Vic3RpdHV0aW9uLworZXhwZWN0ZWQtZXhpdDogMQorLS0tCituYW1lOiB3Y3N3aWR0aC00YworZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSBjb3JuZXIgY2FzZXMKK3N0ZGluOgorCToKKwlwcmludCAkeyU/fSAuCitleHBlY3RlZC1zdGRvdXQ6CisJMSAuCistLS0KK25hbWU6IHJlYWxwYXRoLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHByb3BlciByZXR1cm4gdmFsdWVzIGZvciByZWFscGF0aAorY2F0ZWdvcnk6IG9zOm1pcmJzZAorc3RkaW46CisJd2Q9JChyZWFscGF0aCAuKQorCW1rZGlyIGRpcgorCTo+ZmlsZQorCTo+ZGlyL2ZpbGUKKwlsbiAtcyBkaXIgbG5kaXIKKwlsbiAtcyBmaWxlIGxuZmlsZQorCWxuIC1zIG5peCBsbm5peAorCWxuIC1zIC4gbG5zZWxmCisJaT0wCisJY2hrKCkgeworCQl0eXBlc2V0IHggeQorCQl4PSQocmVhbHBhdGggIiR3ZC8kMSIgMj4mMSk7IHk9JD8KKwkJcHJpbnQgJCgoKytpKSkgIj8kMSIgPSR7eCMjKiR3ZC99ICEkeQorCX0KKwljaGsgZGlyCisJY2hrIGRpci8KKwljaGsgZGlyL2ZpbGUKKwljaGsgZGlyL25peAorCWNoayBmaWxlCisJY2hrIGZpbGUvCisJY2hrIGZpbGUvZmlsZQorCWNoayBmaWxlL25peAorCWNoayBuaXgKKwljaGsgbml4LworCWNoayBuaXgvZmlsZQorCWNoayBuaXgvbml4CisJY2hrIGxuZGlyCisJY2hrIGxuZGlyLworCWNoayBsbmRpci9maWxlCisJY2hrIGxuZGlyL25peAorCWNoayBsbmZpbGUKKwljaGsgbG5maWxlLworCWNoayBsbmZpbGUvZmlsZQorCWNoayBsbmZpbGUvbml4CisJY2hrIGxubml4CisJY2hrIGxubml4LworCWNoayBsbm5peC9maWxlCisJY2hrIGxubml4L25peAorCWNoayBsbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYKKwlybSBsbnNlbGYKK2V4cGVjdGVkLXN0ZG91dDoKKwkxID9kaXIgPWRpciAhMAorCTIgP2Rpci8gPWRpciAhMAorCTMgP2Rpci9maWxlID1kaXIvZmlsZSAhMAorCTQgP2Rpci9uaXggPWRpci9uaXggITAKKwk1ID9maWxlID1maWxlICEwCisJNiA/ZmlsZS8gPWZpbGUvOiBOb3QgYSBkaXJlY3RvcnkgITIwCisJNyA/ZmlsZS9maWxlID1maWxlL2ZpbGU6IE5vdCBhIGRpcmVjdG9yeSAhMjAKKwk4ID9maWxlL25peCA9ZmlsZS9uaXg6IE5vdCBhIGRpcmVjdG9yeSAhMjAKKwk5ID9uaXggPW5peCAhMAorCTEwID9uaXgvID1uaXggITAKKwkxMSA/bml4L2ZpbGUgPW5peC9maWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICEyCisJMTIgP25peC9uaXggPW5peC9uaXg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgITIKKwkxMyA/bG5kaXIgPWRpciAhMAorCTE0ID9sbmRpci8gPWRpciAhMAorCTE1ID9sbmRpci9maWxlID1kaXIvZmlsZSAhMAorCTE2ID9sbmRpci9uaXggPWRpci9uaXggITAKKwkxNyA/bG5maWxlID1maWxlICEwCisJMTggP2xuZmlsZS8gPWxuZmlsZS86IE5vdCBhIGRpcmVjdG9yeSAhMjAKKwkxOSA/bG5maWxlL2ZpbGUgPWxuZmlsZS9maWxlOiBOb3QgYSBkaXJlY3RvcnkgITIwCisJMjAgP2xuZmlsZS9uaXggPWxuZmlsZS9uaXg6IE5vdCBhIGRpcmVjdG9yeSAhMjAKKwkyMSA/bG5uaXggPW5peCAhMAorCTIyID9sbm5peC8gPW5peCAhMAorCTIzID9sbm5peC9maWxlID1sbm5peC9maWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICEyCisJMjQgP2xubml4L25peCA9bG5uaXgvbml4OiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICEyCisJMjUgP2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZiA9bG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmOiBUb28gbWFueSBsZXZlbHMgb2Ygc3ltYm9saWMgbGlua3MgITYyCistLS0KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2VkaXQuYyBiL21rc2gvc3JjL2VkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVkZTdlCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvZWRpdC5jCkBAIC0wLDAgKzEsNTI0OSBAQAorLyoJJE9wZW5CU0Q6IGVkaXQuYyx2IDEuMzQgMjAxMC8wNS8yMCAwMToxMzowNyBmZ3NjaCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGVkaXQuaCx2IDEuOCAyMDA1LzAzLzI4IDIxOjI4OjIyIGRlcmFhZHQgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBlbWFjcy5jLHYgMS40MiAyMDA5LzA2LzAyIDA2OjQ3OjQ3IGhhbGV4IEV4cCAkCSovCisvKgkkT3BlbkJTRDogdmkuYyx2IDEuMjYgMjAwOS8wNi8yOSAyMjo1MDoxOSBtYXJ0eW5hcyBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2VkaXQuYyx2IDEuMTk2IDIwMTAvMDcvMjUgMTE6MzU6NDAgdGcgRXhwICQiKTsKKworLyoKKyAqIGluIGxhdGVyIHZlcnNpb25zIHdlIG1pZ2h0IHVzZSBsaWJ0ZXJtY2FwIGZvciB0aGlzLCBidXQgc2luY2UgZXh0ZXJuYWwKKyAqIGRlcGVuZGVuY2llcyBhcmUgcHJvYmxlbWF0aWMsIHRoaXMgaGFzIG5vdCB5ZXQgYmVlbiBkZWNpZGVkIG9uOyBhbm90aGVyCisgKiBnb29kIHN0cmluZyBpcyAiXDAzM2MiIGV4Y2VwdCBvbiBoYXJkd2FyZSB0ZXJtaW5hbHMgbGlrZSB0aGUgREVDIFZUNDIwCisgKiB3aGljaCBkbyBhIGZ1bGwgcG93ZXIgY3ljbGUgdGhlbi4uLgorICovCisjaWZuZGVmIE1LU0hfQ0xTX1NUUklORworI2RlZmluZSBNS1NIX0NMU19TVFJJTkcJCSJcMDMzWztIXDAzM1tKIgorI2VuZGlmCisjaWZuZGVmIE1LU0hfQ0xSVE9FT0xfU1RSSU5HCisjZGVmaW5lIE1LU0hfQ0xSVE9FT0xfU1RSSU5HCSJcMDMzW0siCisjZW5kaWYKKworLyogdHR5IGRyaXZlciBjaGFyYWN0ZXJzIHdlIGFyZSBpbnRlcmVzdGVkIGluICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGVyYXNlOworCWludCBraWxsOworCWludCB3ZXJhc2U7CisJaW50IGludHI7CisJaW50IHF1aXQ7CisJaW50IGVvZjsKK30gWF9jaGFyczsKKworc3RhdGljIFhfY2hhcnMgZWRjaGFyczsKKworLyogeF9mY19nbG9iKCkgZmxhZ3MgKi8KKyNkZWZpbmUgWENGX0NPTU1BTkQJQklUKDApCS8qIERvIGNvbW1hbmQgY29tcGxldGlvbiAqLworI2RlZmluZSBYQ0ZfRklMRQlCSVQoMSkJLyogRG8gZmlsZSBjb21wbGV0aW9uICovCisjZGVmaW5lIFhDRl9GVUxMUEFUSAlCSVQoMikJLyogY29tbWFuZCBjb21wbGV0aW9uOiBzdG9yZSBmdWxsIHBhdGggKi8KKyNkZWZpbmUgWENGX0NPTU1BTkRfRklMRSAoWENGX0NPTU1BTkR8WENGX0ZJTEUpCisKK3N0YXRpYyBjaGFyIGVkaXRtb2RlOworc3RhdGljIGludCB4eF9jb2xzOwkJCS8qIGZvciBFbWFjcyBtb2RlICovCitzdGF0aWMgaW50IG1vZGlmaWVkOwkJCS8qIGJ1ZmZlciBoYXMgYmVlbiAibW9kaWZpZWQiICovCitzdGF0aWMgY2hhciBob2xkYnVmW0xJTkVdOwkJLyogcGxhY2UgdG8gaG9sZCBsYXN0IGVkaXQgYnVmZmVyICovCisKK3N0YXRpYyBpbnQgeF9nZXRjKHZvaWQpOworc3RhdGljIHZvaWQgeF9wdXRjZihpbnQpOworc3RhdGljIGJvb2wgeF9tb2RlKGJvb2wpOworc3RhdGljIGludCB4X2RvX2NvbW1lbnQoY2hhciAqLCBpbnQsIGludCAqKTsKK3N0YXRpYyB2b2lkIHhfcHJpbnRfZXhwYW5zaW9ucyhpbnQsIGNoYXIgKmNvbnN0ICosIGJvb2wpOworc3RhdGljIGludCB4X2NmX2dsb2IoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQgKiwgaW50ICosIGNoYXIgKioqLAorICAgIGJvb2wgKik7CitzdGF0aWMgaW50IHhfbG9uZ2VzdF9wcmVmaXgoaW50LCBjaGFyICpjb25zdCAqKTsKK3N0YXRpYyBpbnQgeF9iYXNlbmFtZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCB4X2ZyZWVfd29yZHMoaW50LCBjaGFyICoqKTsKK3N0YXRpYyBpbnQgeF9lc2NhcGUoY29uc3QgY2hhciAqLCBzaXplX3QsIGludCAoKikoY29uc3QgY2hhciAqLCBzaXplX3QpKTsKK3N0YXRpYyBpbnQgeF9lbWFjcyhjaGFyICosIHNpemVfdCk7CitzdGF0aWMgdm9pZCB4X2luaXRfZW1hY3Modm9pZCk7CitzdGF0aWMgdm9pZCB4X2luaXRfcHJvbXB0KHZvaWQpOworI2lmICFNS1NIX1NfTk9WSQorc3RhdGljIGludCB4X3ZpKGNoYXIgKiwgc2l6ZV90KTsKKyNlbmRpZgorCisjZGVmaW5lIHhfZmx1c2goKQlzaGZfZmx1c2goc2hsX291dCkKKyNpZmRlZiBNS1NIX1NNQUxMCisjZGVmaW5lIHhfcHV0YyhjKQl4X3B1dGNmKGMpCisjZWxzZQorI2RlZmluZSB4X3B1dGMoYykJc2hmX3B1dGMoKGMpLCBzaGxfb3V0KQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGF0aF9vcmRlcl9jbXAoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKTsKK3N0YXRpYyBjaGFyICphZGRfZ2xvYihjb25zdCBjaGFyICosIGludCkKKyAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMSkpKQorICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMSwgMik7CitzdGF0aWMgdm9pZCBnbG9iX3RhYmxlKGNvbnN0IGNoYXIgKiwgWFB0clYgKiwgc3RydWN0IHRhYmxlICopOworc3RhdGljIHZvaWQgZ2xvYl9wYXRoKGludCBmbGFncywgY29uc3QgY2hhciAqLCBYUHRyViAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGludCB4X2ZpbGVfZ2xvYihpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICoqKikKKyAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMikpKQorICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMiwgMyk7CitzdGF0aWMgaW50IHhfY29tbWFuZF9nbG9iKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGNoYXIgKioqKQorICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgyKSkpCisgICAgTUtTSF9BX0JPVU5ERUQoc3RyaW5nLCAyLCAzKTsKK3N0YXRpYyBpbnQgeF9sb2NhdGVfd29yZChjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQgKiwgYm9vbCAqKTsKKworc3RhdGljIGludCB4X2VfZ2V0bWJjKGNoYXIgKik7CitzdGF0aWMgaW50IHhfZV9yZWJ1aWxkbGluZShjb25zdCBjaGFyICopOworCisvKiArKysgZ2VuZXJpYyBlZGl0aW5nIGZ1bmN0aW9ucyArKysgKi8KKworLyogQ2FsbGVkIGZyb20gbWFpbiAqLwordm9pZAoreF9pbml0KHZvaWQpCit7CisJLyogc2V0IHRvIC0yIHRvIGZvcmNlIGluaXRpYWwgYmluZGluZyAqLworCWVkY2hhcnMuZXJhc2UgPSBlZGNoYXJzLmtpbGwgPSBlZGNoYXJzLmludHIgPSBlZGNoYXJzLnF1aXQgPQorCSAgICBlZGNoYXJzLmVvZiA9IC0yOworCS8qIGRlZmF1bHQgdmFsdWUgZm9yIGRlZmljaWVudCBzeXN0ZW1zICovCisJZWRjaGFycy53ZXJhc2UgPSAwMjc7CS8qIF5XICovCisJeF9pbml0X2VtYWNzKCk7Cit9CisKKy8qCisgKiByZWFkIGFuIGVkaXRlZCBjb21tYW5kIGxpbmUKKyAqLworaW50Cit4X3JlYWQoY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBpOworCisJeF9tb2RlKHRydWUpOworCW1vZGlmaWVkID0gMTsKKwlpZiAoRmxhZyhGRU1BQ1MpIHx8IEZsYWcoRkdNQUNTKSkKKwkJaSA9IHhfZW1hY3MoYnVmLCBsZW4pOworI2lmICFNS1NIX1NfTk9WSQorCWVsc2UgaWYgKEZsYWcoRlZJKSkKKwkJaSA9IHhfdmkoYnVmLCBsZW4pOworI2VuZGlmCisJZWxzZQorCQlpID0gLTE7CQkvKiBpbnRlcm5hbCBlcnJvciAqLworCWVkaXRtb2RlID0gMDsKKwl4X21vZGUoZmFsc2UpOworCXJldHVybiAoaSk7Cit9CisKKy8qIHR0eSBJL08gKi8KKworc3RhdGljIGludAoreF9nZXRjKHZvaWQpCit7CisJY2hhciBjOworCWludCBuOworCisJd2hpbGUgKChuID0gYmxvY2tpbmdfcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSkgPCAwICYmIGVycm5vID09IEVJTlRSKQorCQlpZiAodHJhcCkgeworCQkJeF9tb2RlKGZhbHNlKTsKKwkJCXJ1bnRyYXBzKDApOworI2lmZGVmIFNJR1dJTkNICisJCQlpZiAoZ290X3dpbmNoKSB7CisJCQkJY2hhbmdlX3dpbnN6KCk7CisJCQkJaWYgKHhfY29scyAhPSB4eF9jb2xzICYmIGVkaXRtb2RlID09IDEpIHsKKwkJCQkJLyogcmVkcmF3IGxpbmUgaW4gRW1hY3MgbW9kZSAqLworCQkJCQl4eF9jb2xzID0geF9jb2xzOworCQkJCQl4X2VfcmVidWlsZGxpbmUoTUtTSF9DTFJUT0VPTF9TVFJJTkcpOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJeF9tb2RlKHRydWUpOworCQl9CisJcmV0dXJuICgobiA9PSAxKSA/IChpbnQpKHVuc2lnbmVkIGNoYXIpYyA6IC0xKTsKK30KKworc3RhdGljIHZvaWQKK3hfcHV0Y2YoaW50IGMpCit7CisJc2hmX3B1dGMoYywgc2hsX291dCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1pc2MgY29tbW9uIGNvZGUgZm9yIHZpL2VtYWNzICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhhbmRsZSB0aGUgY29tbWVudGluZy91bmNvbW1lbnRpbmcgb2YgYSBsaW5lLgorICogUmV0dXJuczoKKyAqCTEgaWYgYSBjYXJyaWFnZSByZXR1cm4gaXMgaW5kaWNhdGVkIChjb21tZW50IGFkZGVkKQorICoJMCBpZiBubyByZXR1cm4gKGNvbW1lbnQgcmVtb3ZlZCkKKyAqCS0xIGlmIHRoZXJlIGlzIGFuIGVycm9yIChub3QgZW5vdWdoIHJvb20gZm9yIGNvbW1lbnQgY2hhcnMpCisgKiBJZiBzdWNjZXNzZnVsLCAqbGVucCBjb250YWlucyB0aGUgbmV3IGxlbmd0aC4gTm90ZTogY3Vyc29yIHNob3VsZCBiZQorICogbW92ZWQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGFmdGVyICh1biljb21tZW50aW5nLgorICovCitzdGF0aWMgaW50Cit4X2RvX2NvbW1lbnQoY2hhciAqYnVmLCBpbnQgYnNpemUsIGludCAqbGVucCkKK3sKKwlpbnQgaSwgaiwgbGVuID0gKmxlbnA7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAoMSk7IC8qIHNvbWV3aGF0IGFyYml0cmFyeSAtIGl0J3Mgd2hhdCBBVCZUIGtzaCBkb2VzICovCisKKwkvKiBBbHJlYWR5IGNvbW1lbnRlZD8gKi8KKwlpZiAoYnVmWzBdID09ICcjJykgeworCQlib29sIHNhd19ubCA9IGZhbHNlOworCisJCWZvciAoaiA9IDAsIGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJCWlmICghc2F3X25sIHx8IGJ1ZltpXSAhPSAnIycpCisJCQkJYnVmW2orK10gPSBidWZbaV07CisJCQlzYXdfbmwgPSBidWZbaV0gPT0gJ1xuJzsKKwkJfQorCQkqbGVucCA9IGo7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJaW50IG4gPSAxOworCisJCS8qIFNlZSBpZiB0aGVyZSdzIHJvb20gZm9yIHRoZSAjcyAtIDEgcGVyIFxuICovCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCWlmIChidWZbaV0gPT0gJ1xuJykKKwkJCQluKys7CisJCWlmIChsZW4gKyBuID49IGJzaXplKQorCQkJcmV0dXJuICgtMSk7CisJCS8qIE5vdyBhZGQgdGhlbS4uLiAqLworCQlmb3IgKGkgPSBsZW4sIGogPSBsZW4gKyBuOyAtLWkgPj0gMDsgKSB7CisJCQlpZiAoYnVmW2ldID09ICdcbicpCisJCQkJYnVmWy0tal0gPSAnIyc7CisJCQlidWZbLS1qXSA9IGJ1ZltpXTsKKwkJfQorCQlidWZbMF0gPSAnIyc7CisJCSpsZW5wICs9IG47CisJCXJldHVybiAoMSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29tbW9uIGZpbGUvY29tbWFuZCBjb21wbGV0aW9uIGNvZGUgZm9yIHZpL2VtYWNzICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoreF9wcmludF9leHBhbnNpb25zKGludCBud29yZHMsIGNoYXIgKiBjb25zdCAqd29yZHMsIGJvb2wgaXNfY29tbWFuZCkKK3sKKwlib29sIHVzZV9jb3B5ID0gZmFsc2U7CisJaW50IHByZWZpeF9sZW47CisJWFB0clYgbCA9IHsgTlVMTCwgTlVMTCwgTlVMTCB9OworCisJLyogQ2hlY2sgaWYgYWxsIG1hdGNoZXMgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSAoaW4gdGhpcworCSAqIGNhc2UsIHdlIHdhbnQgdG8gb21pdCB0aGUgZGlyZWN0b3J5IG5hbWUpCisJICovCisJaWYgKCFpc19jb21tYW5kICYmCisJICAgIChwcmVmaXhfbGVuID0geF9sb25nZXN0X3ByZWZpeChud29yZHMsIHdvcmRzKSkgPiAwKSB7CisJCWludCBpOworCisJCS8qIFNwZWNpYWwgY2FzZSBmb3IgMSBtYXRjaCAocHJlZml4IGlzIHdob2xlIHdvcmQpICovCisJCWlmIChud29yZHMgPT0gMSkKKwkJCXByZWZpeF9sZW4gPSB4X2Jhc2VuYW1lKHdvcmRzWzBdLCBOVUxMKTsKKwkJLyogQW55IChub24tdHJhaWxpbmcpIHNsYXNoZXMgaW4gbm9uLWNvbW1vbiB3b3JkIHN1ZmZpeGVzPyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCisJCQlpZiAoeF9iYXNlbmFtZSh3b3Jkc1tpXSArIHByZWZpeF9sZW4sIE5VTEwpID4KKwkJCSAgICBwcmVmaXhfbGVuKQorCQkJCWJyZWFrOworCQkvKiBBbGwgaW4gc2FtZSBkaXJlY3Rvcnk/ICovCisJCWlmIChpID09IG53b3JkcykgeworCQkJd2hpbGUgKHByZWZpeF9sZW4gPiAwICYmIHdvcmRzWzBdW3ByZWZpeF9sZW4gLSAxXSAhPSAnLycpCisJCQkJcHJlZml4X2xlbi0tOworCQkJdXNlX2NvcHkgPSB0cnVlOworCQkJWFBpbml0KGwsIG53b3JkcyArIDEpOworCQkJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrKQorCQkJCVhQcHV0KGwsIHdvcmRzW2ldICsgcHJlZml4X2xlbik7CisJCQlYUHB1dChsLCBOVUxMKTsKKwkJfQorCX0KKwkvKgorCSAqIEVudW1lcmF0ZSBleHBhbnNpb25zCisJICovCisJeF9wdXRjKCdccicpOworCXhfcHV0YygnXG4nKTsKKwlwcl9saXN0KHVzZV9jb3B5ID8gKGNoYXIgKiopWFBwdHJ2KGwpIDogd29yZHMpOworCisJaWYgKHVzZV9jb3B5KQorCQlYUGZyZWUobCk7IC8qIG5vdCB4X2ZyZWVfd29yZHMoKSAqLworfQorCisvKioKKyAqIERvIGZpbGUgZ2xvYmJpbmc6CisgKgktIGFwcGVuZHMgKiB0byAoY29weSBvZikgc3RyIGlmIG5vIGdsb2JiaW5nIGNoYXJzIGZvdW5kCisgKgktIGRvZXMgZXhwYW5zaW9uLCBjaGVja3MgZm9yIG5vIG1hdGNoLCBldGMuCisgKgktIHNldHMgKndvcmRzcCB0byBhcnJheSBvZiBtYXRjaGluZyBzdHJpbmdzCisgKgktIHJldHVybnMgbnVtYmVyIG9mIG1hdGNoaW5nIHN0cmluZ3MKKyAqLworc3RhdGljIGludAoreF9maWxlX2dsb2IoaW50IGZsYWdzIE1LU0hfQV9VTlVTRUQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4sIGNoYXIgKioqd29yZHNwKQoreworCWNoYXIgKnRvZ2xvYiwgKip3b3JkczsKKwlpbnQgbndvcmRzLCBpLCBpZHg7CisJYm9vbCBlc2NhcGluZzsKKwlYUHRyViB3OworCXN0cnVjdCBzb3VyY2UgKnMsICpzb2xkOworCisJaWYgKHNsZW4gPCAwKQorCQlyZXR1cm4gKDApOworCisJdG9nbG9iID0gYWRkX2dsb2Ioc3RyLCBzbGVuKTsKKworCS8qIHJlbW92ZSBhbGwgZXNjYXBpbmcgYmFja3dhcmQgc2xhc2hlcyAqLworCWVzY2FwaW5nID0gZmFsc2U7CisJZm9yIChpID0gMCwgaWR4ID0gMDsgdG9nbG9iW2ldOyBpKyspIHsKKwkJaWYgKHRvZ2xvYltpXSA9PSAnXFwnICYmICFlc2NhcGluZykgeworCQkJZXNjYXBpbmcgPSB0cnVlOworCQkJY29udGludWU7CisJCX0KKwkJLyogc3BlY2lhbGx5IGVzY2FwZSBlc2NhcGVkIFsgb3IgJCBvciBgIGZvciBnbG9iYmluZyAqLworCQlpZiAoZXNjYXBpbmcgJiYgKHRvZ2xvYltpXSA9PSAnWycgfHwKKwkJICAgIHRvZ2xvYltpXSA9PSAnJCcgfHwgdG9nbG9iW2ldID09ICdgJykpCisJCQl0b2dsb2JbaWR4KytdID0gUUNIQVI7CisKKwkJdG9nbG9iW2lkeF0gPSB0b2dsb2JbaV07CisJCWlkeCsrOworCQlpZiAoZXNjYXBpbmcpCisJCQllc2NhcGluZyA9IGZhbHNlOworCX0KKwl0b2dsb2JbaWR4XSA9ICdcMCc7CisKKwkvKgorCSAqIENvbnZlcnQgImZvbyoiICh0b2dsb2IpIHRvIGFuIGFycmF5IG9mIHN0cmluZ3MgKHdvcmRzKQorCSAqLworCXNvbGQgPSBzb3VyY2U7CisJcyA9IHB1c2hzKFNXU1RSLCBBVEVNUCk7CisJcy0+c3RhcnQgPSBzLT5zdHIgPSB0b2dsb2I7CisJc291cmNlID0gczsKKwlpZiAoeXlsZXgoT05FV09SRCB8IExRQ0hBUikgIT0gTFdPUkQpIHsKKwkJc291cmNlID0gc29sZDsKKwkJaW50ZXJuYWxfd2FybmluZ2YoImZpbGVnbG9iOiBzdWJzdGl0dXRlIGVycm9yIik7CisJCXJldHVybiAoMCk7CisJfQorCXNvdXJjZSA9IHNvbGQ7CisJWFBpbml0KHcsIDMyKTsKKwlleHBhbmQoeXlsdmFsLmNwLCAmdywgRE9HTE9CIHwgRE9USUxERSB8IERPTUFSS0RJUlMpOworCVhQcHV0KHcsIE5VTEwpOworCXdvcmRzID0gKGNoYXIgKiopWFBjbG9zZSh3KTsKKworCWZvciAobndvcmRzID0gMDsgd29yZHNbbndvcmRzXTsgbndvcmRzKyspCisJCTsKKwlpZiAobndvcmRzID09IDEpIHsKKwkJc3RydWN0IHN0YXQgc3RhdGI7CisKKwkJLyogQ2hlY2sgaWYgZ2xvYmJpbmcgZmFpbGVkIChyZXR1cm5lZCBnbG9iIHBhdHRlcm4pLAorCQkgKiBidXQgYmUgY2FyZWZ1bCAoRS5nLiB0b2dsb2IgPT0gImFiKiIgd2hlbiB0aGUgZmlsZQorCQkgKiAiYWIqIiBleGlzdHMgaXMgbm90IGFuIGVycm9yKS4KKwkJICogQWxzbywgY2hlY2sgZm9yIGVtcHR5IHJlc3VsdCAtIGhhcHBlbnMgaWYgd2UgdHJpZWQKKwkJICogdG8gZ2xvYiBzb21ldGhpbmcgd2hpY2ggZXZhbHVhdGVkIHRvIGFuIGVtcHR5CisJCSAqIHN0cmluZyAoZS5nLiwgIiRGT08iIHdoZW4gdGhlcmUgaXMgbm8gRk9PLCBldGMpLgorCQkgKi8KKwkJaWYgKChzdHJjbXAod29yZHNbMF0sIHRvZ2xvYikgPT0gMCAmJgorCQkgICAgc3RhdCh3b3Jkc1swXSwgJnN0YXRiKSA8IDApIHx8CisJCSAgICB3b3Jkc1swXVswXSA9PSAnXDAnKSB7CisJCQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7CisJCQl3b3JkcyA9IE5VTEw7CisJCQlud29yZHMgPSAwOworCQl9CisJfQorCWFmcmVlKHRvZ2xvYiwgQVRFTVApOworCisJaWYgKCgqd29yZHNwID0gbndvcmRzID8gd29yZHMgOiBOVUxMKSA9PSBOVUxMICYmIHdvcmRzICE9IE5VTEwpCisJCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKKworCXJldHVybiAobndvcmRzKTsKK30KKworLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbiB4X2NvbW1hbmRfZ2xvYigpICovCitzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvIHsKKwljaGFyICp3b3JkOworCWludCBiYXNlOworCWludCBwYXRoX29yZGVyOworfTsKKworLyogQ29tcGFyZSByb3V0aW5lIHVzZWQgaW4geF9jb21tYW5kX2dsb2IoKSAqLworc3RhdGljIGludAorcGF0aF9vcmRlcl9jbXAoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKQoreworCWNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKmEgPSAoY29uc3Qgc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqKWFhOworCWNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKmIgPSAoY29uc3Qgc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqKWJiOworCWludCB0OworCisJdCA9IHN0cmNtcChhLT53b3JkICsgYS0+YmFzZSwgYi0+d29yZCArIGItPmJhc2UpOworCXJldHVybiAodCA/IHQgOiBhLT5wYXRoX29yZGVyIC0gYi0+cGF0aF9vcmRlcik7Cit9CisKK3N0YXRpYyBpbnQKK3hfY29tbWFuZF9nbG9iKGludCBmbGFncywgY29uc3QgY2hhciAqc3RyLCBpbnQgc2xlbiwgY2hhciAqKip3b3Jkc3ApCit7CisJY2hhciAqdG9nbG9iLCAqcGF0LCAqZnBhdGg7CisJaW50IG53b3JkczsKKwlYUHRyViB3OworCXN0cnVjdCBibG9jayAqbDsKKworCWlmIChzbGVuIDwgMCkKKwkJcmV0dXJuICgwKTsKKworCXRvZ2xvYiA9IGFkZF9nbG9iKHN0ciwgc2xlbik7CisKKwkvKiBDb252ZXJ0ICJmb28qIiAodG9nbG9iKSB0byBhIHBhdHRlcm4gZm9yIGZ1dHVyZSB1c2UgKi8KKwlwYXQgPSBldmFsc3RyKHRvZ2xvYiwgRE9QQVQgfCBET1RJTERFKTsKKwlhZnJlZSh0b2dsb2IsIEFURU1QKTsKKworCVhQaW5pdCh3LCAzMik7CisKKwlnbG9iX3RhYmxlKHBhdCwgJncsICZrZXl3b3Jkcyk7CisJZ2xvYl90YWJsZShwYXQsICZ3LCAmYWxpYXNlcyk7CisJZ2xvYl90YWJsZShwYXQsICZ3LCAmYnVpbHRpbnMpOworCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpCisJCWdsb2JfdGFibGUocGF0LCAmdywgJmwtPmZ1bnMpOworCisJZ2xvYl9wYXRoKGZsYWdzLCBwYXQsICZ3LCBwYXRoKTsKKwlpZiAoKGZwYXRoID0gc3RyX3ZhbChnbG9iYWwoIkZQQVRIIikpKSAhPSBudWxsKQorCQlnbG9iX3BhdGgoZmxhZ3MsIHBhdCwgJncsIGZwYXRoKTsKKworCW53b3JkcyA9IFhQc2l6ZSh3KTsKKworCWlmICghbndvcmRzKSB7CisJCSp3b3Jkc3AgPSBOVUxMOworCQlYUGZyZWUodyk7CisJCXJldHVybiAoMCk7CisJfQorCS8qIFNvcnQgZW50cmllcyAqLworCWlmIChmbGFncyAmIFhDRl9GVUxMUEFUSCkgeworCQkvKiBTb3J0IGJ5IGJhc2VuYW1lLCB0aGVuIHBhdGggb3JkZXIgKi8KKwkJc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqaW5mbywgKmxhc3RfaW5mbyA9IE5VTEw7CisJCWNoYXIgKip3b3JkcyA9IChjaGFyICoqKVhQcHRydih3KTsKKwkJaW50IGksIHBhdGhfb3JkZXIgPSAwOworCisJCWluZm8gPSAoc3RydWN0IHBhdGhfb3JkZXJfaW5mbyAqKQorCQkgICAgYWxsb2MobndvcmRzICogc2l6ZW9mKHN0cnVjdCBwYXRoX29yZGVyX2luZm8pLCBBVEVNUCk7CisJCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykgeworCQkJaW5mb1tpXS53b3JkID0gd29yZHNbaV07CisJCQlpbmZvW2ldLmJhc2UgPSB4X2Jhc2VuYW1lKHdvcmRzW2ldLCBOVUxMKTsKKwkJCWlmICghbGFzdF9pbmZvIHx8IGluZm9baV0uYmFzZSAhPSBsYXN0X2luZm8tPmJhc2UgfHwKKwkJCSAgICBzdHJuY21wKHdvcmRzW2ldLCBsYXN0X2luZm8tPndvcmQsIGluZm9baV0uYmFzZSkgIT0gMCkgeworCQkJCWxhc3RfaW5mbyA9ICZpbmZvW2ldOworCQkJCXBhdGhfb3JkZXIrKzsKKwkJCX0KKwkJCWluZm9baV0ucGF0aF9vcmRlciA9IHBhdGhfb3JkZXI7CisJCX0KKwkJcXNvcnQoaW5mbywgbndvcmRzLCBzaXplb2Yoc3RydWN0IHBhdGhfb3JkZXJfaW5mbyksCisJCSAgICBwYXRoX29yZGVyX2NtcCk7CisJCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKKwkJCXdvcmRzW2ldID0gaW5mb1tpXS53b3JkOworCQlhZnJlZShpbmZvLCBBVEVNUCk7CisJfSBlbHNlIHsKKwkJLyogU29ydCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzICovCisJCWNoYXIgKip3b3JkcyA9IChjaGFyICoqKVhQcHRydih3KTsKKwkJaW50IGksIGo7CisKKwkJcXNvcnQod29yZHMsIG53b3Jkcywgc2l6ZW9mKHZvaWQgKiksIHhzdHJjbXApOworCQlmb3IgKGkgPSBqID0gMDsgaSA8IG53b3JkcyAtIDE7IGkrKykgeworCQkJaWYgKHN0cmNtcCh3b3Jkc1tpXSwgd29yZHNbaSArIDFdKSkKKwkJCQl3b3Jkc1tqKytdID0gd29yZHNbaV07CisJCQllbHNlCisJCQkJYWZyZWUod29yZHNbaV0sIEFURU1QKTsKKwkJfQorCQl3b3Jkc1tqKytdID0gd29yZHNbaV07CisJCW53b3JkcyA9IGo7CisJCXcuY3VyID0gKHZvaWQgKiopJndvcmRzW2pdOworCX0KKworCVhQcHV0KHcsIE5VTEwpOworCSp3b3Jkc3AgPSAoY2hhciAqKilYUGNsb3NlKHcpOworCisJcmV0dXJuIChud29yZHMpOworfQorCisjZGVmaW5lIElTX1dPUkRDKGMpCSghY3R5cGUoYywgQ19MRVgxKSAmJiAoYykgIT0gJ1wnJyAmJiAoYykgIT0gJyInICYmIFwKKwkJCSAgICAoYykgIT0gJ2AnICYmIChjKSAhPSAnPScgJiYgKGMpICE9ICc6JykKKworc3RhdGljIGludAoreF9sb2NhdGVfd29yZChjb25zdCBjaGFyICpidWYsIGludCBidWZsZW4sIGludCBwb3MsIGludCAqc3RhcnRwLAorICAgIGJvb2wgKmlzX2NvbW1hbmRwKQoreworCWludCBzdGFydCwgZW5kOworCisJLyogQmFkIGNhbGw/IFByb2JhYmx5IHNob3VsZCByZXBvcnQgZXJyb3IgKi8KKwlpZiAocG9zIDwgMCB8fCBwb3MgPiBidWZsZW4pIHsKKwkJKnN0YXJ0cCA9IHBvczsKKwkJKmlzX2NvbW1hbmRwID0gZmFsc2U7CisJCXJldHVybiAoMCk7CisJfQorCS8qIFRoZSBjYXNlIHdoZXJlIHBvcyA9PSBidWZsZW4gaGFwcGVucyB0byB0YWtlIGNhcmUgb2YgaXRzZWxmLi4uICovCisKKwlzdGFydCA9IHBvczsKKwkvKiBLZWVwIGdvaW5nIGJhY2t3YXJkcyB0byBzdGFydCBvZiB3b3JkIChoYXMgZWZmZWN0IG9mIGFsbG93aW5nCisJICogb25lIGJsYW5rIGFmdGVyIHRoZSBlbmQgb2YgYSB3b3JkKQorCSAqLworCWZvciAoOyAoc3RhcnQgPiAwICYmIElTX1dPUkRDKGJ1ZltzdGFydCAtIDFdKSkgfHwKKwkgICAgKHN0YXJ0ID4gMSAmJiBidWZbc3RhcnQgLSAyXSA9PSAnXFwnKTsgc3RhcnQtLSkKKwkJOworCS8qIEdvIGZvcndhcmRzIHRvIGVuZCBvZiB3b3JkICovCisJZm9yIChlbmQgPSBzdGFydDsgZW5kIDwgYnVmbGVuICYmIElTX1dPUkRDKGJ1ZltlbmRdKTsgZW5kKyspIHsKKwkJaWYgKGJ1ZltlbmRdID09ICdcXCcgJiYgKGVuZCArIDEpIDwgYnVmbGVuKQorCQkJZW5kKys7CisJfQorCisJaWYgKGlzX2NvbW1hbmRwKSB7CisJCWJvb2wgaXNjbWQ7CisJCWludCBwID0gc3RhcnQgLSAxOworCisJCS8qIEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBhIGNvbW1hbmQgKi8KKwkJd2hpbGUgKHAgPj0gMCAmJiBrc2hfaXNzcGFjZShidWZbcF0pKQorCQkJcC0tOworCQlpc2NtZCA9IHAgPCAwIHx8IHZzdHJjaHIoIjt8JigpYCIsIGJ1ZltwXSk7CisJCWlmIChpc2NtZCkgeworCQkJLyogSWYgY29tbWFuZCBoYXMgYSAvLCBwYXRoLCBldGMuIGlzIG5vdCBzZWFyY2hlZDsKKwkJCSAqIG9ubHkgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQgd2hpY2ggaXMganVzdAorCQkJICogbGlrZSBmaWxlIGdsb2JiaW5nLgorCQkJICovCisJCQlmb3IgKHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrKQorCQkJCWlmIChidWZbcF0gPT0gJy8nKQorCQkJCQlicmVhazsKKwkJCWlzY21kID0gcCA9PSBlbmQ7CisJCX0KKwkJKmlzX2NvbW1hbmRwID0gaXNjbWQ7CisJfQorCSpzdGFydHAgPSBzdGFydDsKKworCXJldHVybiAoZW5kIC0gc3RhcnQpOworfQorCitzdGF0aWMgaW50Cit4X2NmX2dsb2IoaW50IGZsYWdzLCBjb25zdCBjaGFyICpidWYsIGludCBidWZsZW4sIGludCBwb3MsIGludCAqc3RhcnRwLAorICAgIGludCAqZW5kcCwgY2hhciAqKip3b3Jkc3AsIGJvb2wgKmlzX2NvbW1hbmRwKQoreworCWludCBsZW4sIG53b3JkczsKKwljaGFyICoqd29yZHMgPSBOVUxMOworCWJvb2wgaXNfY29tbWFuZDsKKworCWxlbiA9IHhfbG9jYXRlX3dvcmQoYnVmLCBidWZsZW4sIHBvcywgc3RhcnRwLCAmaXNfY29tbWFuZCk7CisJaWYgKCEoZmxhZ3MgJiBYQ0ZfQ09NTUFORCkpCisJCWlzX2NvbW1hbmQgPSBmYWxzZTsKKwkvKiBEb24ndCBkbyBjb21tYW5kIGdsb2Jpbmcgb24gemVybyBsZW5ndGggc3RyaW5ncyAtIGl0IHRha2VzIHRvbworCSAqIGxvbmcgYW5kIGlzbid0IHZlcnkgdXNlZnVsLiBGaWxlIGdsb2JzIGFyZSBtb3JlIGxpa2VseSB0byBiZQorCSAqIHVzZWZ1bCwgc28gYWxsb3cgdGhlc2UuCisJICovCisJaWYgKGxlbiA9PSAwICYmIGlzX2NvbW1hbmQpCisJCXJldHVybiAoMCk7CisKKwlud29yZHMgPSBpc19jb21tYW5kID8KKwkgICAgeF9jb21tYW5kX2dsb2IoZmxhZ3MsIGJ1ZiArICpzdGFydHAsIGxlbiwgJndvcmRzKSA6CisJICAgIHhfZmlsZV9nbG9iKGZsYWdzLCBidWYgKyAqc3RhcnRwLCBsZW4sICZ3b3Jkcyk7CisJaWYgKG53b3JkcyA9PSAwKSB7CisJCSp3b3Jkc3AgPSBOVUxMOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoaXNfY29tbWFuZHApCisJCSppc19jb21tYW5kcCA9IGlzX2NvbW1hbmQ7CisJKndvcmRzcCA9IHdvcmRzOworCSplbmRwID0gKnN0YXJ0cCArIGxlbjsKKworCXJldHVybiAobndvcmRzKTsKK30KKworLyogR2l2ZW4gYSBzdHJpbmcsIGNvcHkgaXQgYW5kIHBvc3NpYmx5IGFkZCBhICcqJyB0byB0aGUgZW5kLgorICogVGhlIG5ldyBzdHJpbmcgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2FkZF9nbG9iKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4pCit7CisJY2hhciAqdG9nbG9iLCAqczsKKwlib29sIHNhd19zbGFzaCA9IGZhbHNlOworCisJaWYgKHNsZW4gPCAwKQorCQlyZXR1cm4gKE5VTEwpOworCisJLyogZm9yIGNsYW5nJ3Mgc3RhdGljIGFuYWx5c2VyLCB0aGUgbm9ubnVsbCBhdHRyaWJ1dGUgaXNuJ3QgZW5vdWdoICovCisJbWtzc2VydChzdHIgIT0gTlVMTCk7CisKKwlzdHJuZHVweCh0b2dsb2IsIHN0ciwgc2xlbiArIDEsIEFURU1QKTsgLyogKyAxIGZvciAiKiIgKi8KKwl0b2dsb2Jbc2xlbl0gPSAnXDAnOworCisJLyoKKwkgKiBJZiB0aGUgcGF0aG5hbWUgY29udGFpbnMgYSB3aWxkY2FyZCAoYW4gdW5xdW90ZWQgJyonLAorCSAqICc/Jywgb3IgJ1snKSBvciBwYXJhbWV0ZXIgZXhwYW5zaW9uICgnJCcpLCBvciBhIH51c2VybmFtZQorCSAqIHdpdGggbm8gdHJhaWxpbmcgc2xhc2gsIHRoZW4gaXQgaXMgZ2xvYmJlZCBiYXNlZCBvbiB0aGF0CisJICogdmFsdWUgKGkuZS4sIHdpdGhvdXQgdGhlIGFwcGVuZGVkICcqJykuCisJICovCisJZm9yIChzID0gdG9nbG9iOyAqczsgcysrKSB7CisJCWlmICgqcyA9PSAnXFwnICYmIHNbMV0pCisJCQlzKys7CisJCWVsc2UgaWYgKCpzID09ICcqJyB8fCAqcyA9PSAnWycgfHwgKnMgPT0gJz8nIHx8ICpzID09ICckJyB8fAorCQkgICAgKHNbMV0gPT0gJygnIC8qKSovICYmIC8qICpzIGluICcqJywnPycgYWxyZWFkeSBjaGVja2VkICovCisJCSAgICAoKnMgPT0gJysnIHx8ICpzID09ICdAJyB8fCAqcyA9PSAnIScpKSkKKwkJCWJyZWFrOworCQllbHNlIGlmICgqcyA9PSAnLycpCisJCQlzYXdfc2xhc2ggPSB0cnVlOworCX0KKwlpZiAoISpzICYmICgqdG9nbG9iICE9ICd+JyB8fCBzYXdfc2xhc2gpKSB7CisJCXRvZ2xvYltzbGVuXSA9ICcqJzsKKwkJdG9nbG9iW3NsZW4gKyAxXSA9ICdcMCc7CisJfQorCXJldHVybiAodG9nbG9iKTsKK30KKworLyoKKyAqIEZpbmQgbG9uZ2VzdCBjb21tb24gcHJlZml4CisgKi8KK3N0YXRpYyBpbnQKK3hfbG9uZ2VzdF9wcmVmaXgoaW50IG53b3JkcywgY2hhciAqIGNvbnN0ICogd29yZHMpCit7CisJaW50IGksIGosIHByZWZpeF9sZW47CisJY2hhciAqcDsKKworCWlmIChud29yZHMgPD0gMCkKKwkJcmV0dXJuICgwKTsKKworCXByZWZpeF9sZW4gPSBzdHJsZW4od29yZHNbMF0pOworCWZvciAoaSA9IDE7IGkgPCBud29yZHM7IGkrKykKKwkJZm9yIChqID0gMCwgcCA9IHdvcmRzW2ldOyBqIDwgcHJlZml4X2xlbjsgaisrKQorCQkJaWYgKHBbal0gIT0gd29yZHNbMF1bal0pIHsKKwkJCQlwcmVmaXhfbGVuID0gajsKKwkJCQlicmVhazsKKwkJCX0KKwlyZXR1cm4gKHByZWZpeF9sZW4pOworfQorCitzdGF0aWMgdm9pZAoreF9mcmVlX3dvcmRzKGludCBud29yZHMsIGNoYXIgKip3b3JkcykKK3sKKwl3aGlsZSAobndvcmRzKQorCQlhZnJlZSh3b3Jkc1stLW53b3Jkc10sIEFURU1QKTsKKwlhZnJlZSh3b3JkcywgQVRFTVApOworfQorCisvKiBSZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgYmFzZW5hbWUgb2Ygc3RyaW5nIHMgKHdoaWNoIGVuZHMgYXQgc2UgLSBuZWVkIG5vdAorICogYmUgbnVsbCB0ZXJtaW5hdGVkKS4gVHJhaWxpbmcgc2xhc2hlcyBhcmUgaWdub3JlZC4gSWYgcyBpcyBqdXN0IGEgc2xhc2gsCisgKiB0aGVuIHRoZSBvZmZzZXQgaXMgMCAoYWN0dWFsbHksIGxlbmd0aCAtIDEpLgorICoJcwkJUmV0dXJuCisgKgkvZXRjCQkxCisgKgkvZXRjLwkJMQorICoJL2V0Yy8vCQkxCisgKgkvZXRjL2ZvCQk1CisgKglmb28JCTAKKyAqCS8vLwkJMgorICoJCQkwCisgKi8KK3N0YXRpYyBpbnQKK3hfYmFzZW5hbWUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqc2UpCit7CisJY29uc3QgY2hhciAqcDsKKworCWlmIChzZSA9PSBOVUxMKQorCQlzZSA9IHMgKyBzdHJsZW4ocyk7CisJaWYgKHMgPT0gc2UpCisJCXJldHVybiAoMCk7CisKKwkvKiBTa2lwIHRyYWlsaW5nIHNsYXNoZXMgKi8KKwlmb3IgKHAgPSBzZSAtIDE7IHAgPiBzICYmICpwID09ICcvJzsgcC0tKQorCQk7CisJZm9yICg7IHAgPiBzICYmICpwICE9ICcvJzsgcC0tKQorCQk7CisJaWYgKCpwID09ICcvJyAmJiBwICsgMSA8IHNlKQorCQlwKys7CisKKwlyZXR1cm4gKHAgLSBzKTsKK30KKworLyoKKyAqIEFwcGx5IHBhdHRlcm4gbWF0Y2hpbmcgdG8gYSB0YWJsZTogYWxsIHRhYmxlIGVudHJpZXMgdGhhdCBtYXRjaCBhIHBhdHRlcm4KKyAqIGFyZSBhZGRlZCB0byB3cC4KKyAqLworc3RhdGljIHZvaWQKK2dsb2JfdGFibGUoY29uc3QgY2hhciAqcGF0LCBYUHRyViAqd3AsIHN0cnVjdCB0YWJsZSAqdHApCit7CisJc3RydWN0IHRzdGF0ZSB0czsKKwlzdHJ1Y3QgdGJsICp0ZTsKKworCWt0d2FsaygmdHMsIHRwKTsKKwl3aGlsZSAoKHRlID0ga3RuZXh0KCZ0cykpKQorCQlpZiAoZ21hdGNoeCh0ZS0+bmFtZSwgcGF0LCBmYWxzZSkpIHsKKwkJCWNoYXIgKmNwOworCisJCQlzdHJkdXB4KGNwLCB0ZS0+bmFtZSwgQVRFTVApOworCQkJWFBwdXQoKndwLCBjcCk7CisJCX0KK30KKworc3RhdGljIHZvaWQKK2dsb2JfcGF0aChpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnBhdCwgWFB0clYgKndwLCBjb25zdCBjaGFyICpscGF0aCkKK3sKKwljb25zdCBjaGFyICpzcCwgKnA7CisJY2hhciAqeHAsICoqd29yZHM7CisJaW50IHN0YXRlcnIsIHBhdGhsZW4sIHBhdGxlbiwgb2xkc2l6ZSwgbmV3c2l6ZSwgaSwgajsKKwlYU3RyaW5nIHhzOworCisJcGF0bGVuID0gc3RybGVuKHBhdCkgKyAxOworCXNwID0gbHBhdGg7CisJWGluaXQoeHMsIHhwLCBwYXRsZW4gKyAxMjgsIEFURU1QKTsKKwl3aGlsZSAoc3ApIHsKKwkJeHAgPSBYc3RyaW5nKHhzLCB4cCk7CisJCWlmICghKHAgPSBjc3RyY2hyKHNwLCAnOicpKSkKKwkJCXAgPSBzcCArIHN0cmxlbihzcCk7CisJCXBhdGhsZW4gPSBwIC0gc3A7CisJCWlmIChwYXRobGVuKSB7CisJCQkvKiBDb3B5IHNwIGludG8geHAsIHN0dWZmaW5nIGFueSBNQUdJQyBjaGFyYWN0ZXJzCisJCQkgKiBvbiB0aGUgd2F5CisJCQkgKi8KKwkJCWNvbnN0IGNoYXIgKnMgPSBzcDsKKworCQkJWGNoZWNrTih4cywgeHAsIHBhdGhsZW4gKiAyKTsKKwkJCXdoaWxlIChzIDwgcCkgeworCQkJCWlmIChJU01BR0lDKCpzKSkKKwkJCQkJKnhwKysgPSBNQUdJQzsKKwkJCQkqeHArKyA9ICpzKys7CisJCQl9CisJCQkqeHArKyA9ICcvJzsKKwkJCXBhdGhsZW4rKzsKKwkJfQorCQlzcCA9IHA7CisJCVhjaGVja04oeHMsIHhwLCBwYXRsZW4pOworCQltZW1jcHkoeHAsIHBhdCwgcGF0bGVuKTsKKworCQlvbGRzaXplID0gWFBzaXplKCp3cCk7CisJCWdsb2Jfc3RyKFhzdHJpbmcoeHMsIHhwKSwgd3AsIDEpOyAvKiBtYXJrIGRpcnMgKi8KKwkJbmV3c2l6ZSA9IFhQc2l6ZSgqd3ApOworCisJCS8qIENoZWNrIHRoYXQgZWFjaCBtYXRjaCBpcyBleGVjdXRhYmxlLi4uICovCisJCXdvcmRzID0gKGNoYXIgKiopWFBwdHJ2KCp3cCk7CisJCWZvciAoaSA9IGogPSBvbGRzaXplOyBpIDwgbmV3c2l6ZTsgaSsrKSB7CisJCQlzdGF0ZXJyID0gMDsKKwkJCWlmICgoc2VhcmNoX2FjY2Vzcyh3b3Jkc1tpXSwgWF9PSywgJnN0YXRlcnIpID49IDApIHx8CisJCQkgICAgKHN0YXRlcnIgPT0gRUlTRElSKSkgeworCQkJCXdvcmRzW2pdID0gd29yZHNbaV07CisJCQkJaWYgKCEoZmxhZ3MgJiBYQ0ZfRlVMTFBBVEgpKQorCQkJCQltZW1tb3ZlKHdvcmRzW2pdLCB3b3Jkc1tqXSArIHBhdGhsZW4sCisJCQkJCSAgICBzdHJsZW4od29yZHNbal0gKyBwYXRobGVuKSArIDEpOworCQkJCWorKzsKKwkJCX0gZWxzZQorCQkJCWFmcmVlKHdvcmRzW2ldLCBBVEVNUCk7CisJCX0KKwkJd3AtPmN1ciA9ICh2b2lkICoqKSZ3b3Jkc1tqXTsKKworCQlpZiAoISpzcCsrKQorCQkJYnJlYWs7CisJfQorCVhmcmVlKHhzLCB4cCk7Cit9CisKKy8qCisgKiBpZiBhcmd1bWVudCBzdHJpbmcgY29udGFpbnMgYW55IHNwZWNpYWwgY2hhcmFjdGVycywgdGhleSB3aWxsCisgKiBiZSBlc2NhcGVkIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgcHV0IGludG8gZWRpdCBidWZmZXIgYnkKKyAqIGtleWJpbmRpbmctc3BlY2lmaWMgZnVuY3Rpb24KKyAqLworc3RhdGljIGludAoreF9lc2NhcGUoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgaW50ICgqcHV0YnVmX2Z1bmMpKGNvbnN0IGNoYXIgKiwgc2l6ZV90KSkKK3sKKwlzaXplX3QgYWRkID0gMCwgd2xlbiA9IGxlbjsKKwljb25zdCBjaGFyICppZnMgPSBzdHJfdmFsKGxvY2FsKCJJRlMiLCAwKSk7CisJaW50IHJ2YWwgPSAwOworCisJd2hpbGUgKHdsZW4gLSBhZGQgPiAwKQorCQlpZiAodnN0cmNocigiXCIjJCYnKCkqOjs8PT4/W1xcYHt8fSIsIHNbYWRkXSkgfHwKKwkJICAgIHZzdHJjaHIoaWZzLCBzW2FkZF0pKSB7CisJCQlpZiAocHV0YnVmX2Z1bmMocywgYWRkKSAhPSAwKSB7CisJCQkJcnZhbCA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQkJcHV0YnVmX2Z1bmMoc1thZGRdID09ICdcbicgPyAiJyIgOiAiXFwiLCAxKTsKKwkJCXB1dGJ1Zl9mdW5jKCZzW2FkZF0sIDEpOworCQkJaWYgKHNbYWRkXSA9PSAnXG4nKQorCQkJCXB1dGJ1Zl9mdW5jKCInIiwgMSk7CisKKwkJCWFkZCsrOworCQkJd2xlbiAtPSBhZGQ7CisJCQlzICs9IGFkZDsKKwkJCWFkZCA9IDA7CisJCX0gZWxzZQorCQkJKythZGQ7CisJaWYgKHdsZW4gPiAwICYmIHJ2YWwgPT0gMCkKKwkJcnZhbCA9IHB1dGJ1Zl9mdW5jKHMsIHdsZW4pOworCisJcmV0dXJuIChydmFsKTsKK30KKworCisvKiArKysgZW1hY3MgZWRpdGluZyBtb2RlICsrKyAqLworCitzdGF0aWMJQXJlYQlhZWRpdDsKKyNkZWZpbmUJQUVESVQJJmFlZGl0CQkvKiBhcmVhIGZvciBraWxsIHJpbmcgYW5kIG1hY3JvIGRlZm5zICovCisKKy8qIHZhbHVlcyByZXR1cm5lZCBieSBrZXlib2FyZCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUJS1NURAkwCisjZGVmaW5lCUtFT0wJMQkJLyogXk0sIF5KICovCisjZGVmaW5lCUtJTlRSCTIJCS8qIF5HLCBeQyAqLworCitzdHJ1Y3QgeF9mdGFiIHsKKwlpbnQgKCp4Zl9mdW5jKShpbnQgYyk7CisJY29uc3QgY2hhciAqeGZfbmFtZTsKKwlzaG9ydCB4Zl9mbGFnczsKK307CisKK3N0cnVjdCB4X2RlZmJpbmRpbmdzIHsKKwl1bnNpZ25lZCBjaGFyIHhkYl9mdW5jOwkvKiBYRlVOQ18qICovCisJdW5zaWduZWQgY2hhciB4ZGJfdGFiOworCXVuc2lnbmVkIGNoYXIgeGRiX2NoYXI7Cit9OworCisjZGVmaW5lIFhGX0FSRwkJMQkvKiBjb21tYW5kIHRha2VzIG51bWJlciBwcmVmaXggKi8KKyNkZWZpbmUJWEZfTk9CSU5ECTIJLyogbm90IGFsbG93ZWQgdG8gYmluZCB0byBmdW5jdGlvbiAqLworI2RlZmluZQlYRl9QUkVGSVgJNAkvKiBmdW5jdGlvbiBzZXRzIHByZWZpeCAqLworCisvKiBTZXBhcmF0b3IgZm9yIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUJaXNfY2ZzKGMpCSgoYykgPT0gJyAnIHx8IChjKSA9PSAnXHQnIHx8IChjKSA9PSAnIicgfHwgKGMpID09ICdcJycpCisvKiBTZXBhcmF0b3IgZm9yIG1vdGlvbiAqLworI2RlZmluZQlpc19tZnMoYykJKCEoa3NoX2lzYWxudXgoYykgfHwgKGMpID09ICckJyB8fCAoKGMpICYgMHg4MCkpKQorCisjZGVmaW5lIFhfTlRBQlMJCTMJCQkvKiBub3JtYWwsIG1ldGExLCBtZXRhMiAqLworI2RlZmluZSBYX1RBQlNaCQkyNTYJCQkvKiBzaXplIG9mIGtleWRlZiB0YWJsZXMgZXRjICovCisKKy8qIEFyZ3VtZW50cyBmb3IgZG9fY29tcGxldGUoKQorICogMCA9IGVudW1lcmF0ZQlNLT0JY29tcGxldGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBhbmQgdGhlbiBsaXN0CisgKiAxID0gY29tcGxldGUJCU0tRXNjCisgKiAyID0gbGlzdAkJTS0/CisgKi8KK3R5cGVkZWYgZW51bSB7CisJQ1RfTElTVCwJLyogbGlzdCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMgKi8KKwlDVF9DT01QTEVURSwJLyogY29tcGxldGUgdG8gbG9uZ2VzdCBwcmVmaXggKi8KKwlDVF9DT01QTElTVAkvKiBjb21wbGV0ZSBhbmQgdGhlbiBsaXN0IChpZiBub24tZXhhY3QpICovCit9IENvbXBfdHlwZTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIG15IGhvcml6b250YWwgc2Nyb2xsaW5nIHN0dWZmCisgKi8KK3N0YXRpYyBjaGFyICp4YnVmOwkJLyogYmVnIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIGNoYXIgKnhlbmQ7CQkvKiBlbmQgaW5wdXQgYnVmZmVyICovCitzdGF0aWMgY2hhciAqeGNwOwkJLyogY3VycmVudCBwb3NpdGlvbiAqLworc3RhdGljIGNoYXIgKnhlcDsJCS8qIGN1cnJlbnQgZW5kICovCitzdGF0aWMgY2hhciAqeGJwOwkJLyogc3RhcnQgb2YgdmlzaWJsZSBwb3J0aW9uIG9mIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIGNoYXIgKnhscDsJCS8qIGxhc3QgY2hhciB2aXNpYmxlIG9uIHNjcmVlbiAqLworc3RhdGljIGludCB4X2Fkal9vazsKKy8qCisgKiB3ZSB1c2UgeF9hZGpfZG9uZSBzbyB0aGF0IGZ1bmN0aW9ucyBjYW4gdGVsbAorICogd2hldGhlciB4X2FkanVzdCgpIGhhcyBiZWVuIGNhbGxlZCB3aGlsZSB0aGV5IGFyZSBhY3RpdmUuCisgKi8KK3N0YXRpYyBpbnQgeF9hZGpfZG9uZTsKKworc3RhdGljIGludCB4X2NvbDsKK3N0YXRpYyBpbnQgeF9kaXNwbGVuOworc3RhdGljIGludCB4X2FyZzsJCS8qIGdlbmVyYWwgcHVycG9zZSBhcmcgKi8KK3N0YXRpYyBpbnQgeF9hcmdfZGVmYXVsdGVkOwkvKiB4X2FyZyBub3QgZXhwbGljaXRseSBzZXQ7IGRlZmF1bHRlZCB0byAxICovCisKK3N0YXRpYyBpbnQgeGxwX3ZhbGlkOworCitzdGF0aWMgY2hhciAqKnhfaGlzdHA7CQkvKiBoaXN0b3J5IHBvc2l0aW9uICovCitzdGF0aWMgaW50IHhfbmV4dGNtZDsJCS8qIGZvciBuZXdsaW5lLWFuZC1uZXh0ICovCitzdGF0aWMgY2hhciAqeG1wOwkJLyogbWFyayBwb2ludGVyICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB4X2xhc3RfY29tbWFuZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICgqeF90YWIpW1hfVEFCU1pdOwkvKiBrZXkgZGVmaW5pdGlvbiAqLworI2lmbmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgY2hhciAqKCp4X2F0YWIpW1hfVEFCU1pdOwkvKiBtYWNybyBkZWZpbml0aW9ucyAqLworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgY2hhciB4X2JvdW5kWyhYX1RBQlNaICogWF9OVEFCUyArIDcpIC8gOF07CisjZGVmaW5lIEtJTExTSVpFCTIwCitzdGF0aWMgY2hhciAqa2lsbHN0YWNrW0tJTExTSVpFXTsKK3N0YXRpYyBpbnQga2lsbHNwLCBraWxsdHA7CitzdGF0aWMgaW50IHhfY3VycHJlZml4OworI2lmbmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgY2hhciAqbWFjcm9wdHIgPSBOVUxMOwkvKiBiaW5kIGtleSBtYWNybyBhY3RpdmU/ICovCisjZW5kaWYKKyNpZiAhTUtTSF9TX05PVkkKK3N0YXRpYyBpbnQgY3VyX2NvbDsJCS8qIGN1cnJlbnQgY29sdW1uIG9uIGxpbmUgKi8KK3N0YXRpYyBpbnQgcHdpZHRoOwkJLyogd2lkdGggb2YgcHJvbXB0ICovCitzdGF0aWMgaW50IHByb21wdF90cnVuYzsJLyogaG93IG11Y2ggb2YgcHJvbXB0IHRvIHRydW5jYXRlICovCitzdGF0aWMgaW50IHdpbndpZHRoOwkJLyogd2lkdGggb2Ygd2luZG93ICovCitzdGF0aWMgY2hhciAqd2J1ZlsyXTsJCS8qIHdpbmRvdyBidWZmZXJzICovCitzdGF0aWMgaW50IHdidWZfbGVuOwkJLyogbGVuZ3RoIG9mIHdpbmRvdyBidWZmZXJzICh4X2NvbHMgLSAzKSAqLworc3RhdGljIGludCB3aW47CQkJLyogd2luZG93IGJ1ZmZlciBpbiB1c2UgKi8KK3N0YXRpYyBjaGFyIG1vcmVjOwkJLyogbW9yZSBjaGFyYWN0ZXIgYXQgcmlnaHQgb2Ygd2luZG93ICovCitzdGF0aWMgaW50IGxhc3RyZWY7CQkvKiBhcmd1bWVudCB0byBsYXN0IHJlZnJlc2goKSAqLworc3RhdGljIGludCBob2xkbGVuOwkJLyogbGVuZ3RoIG9mIGhvbGRidWYgKi8KKyNlbmRpZgorc3RhdGljIGludCBwcm9tcHRfcmVkcmF3OwkvKiAwIGlmIG5ld2xpbmUgZm9yY2VkIGFmdGVyIHByb21wdCAqLworCitzdGF0aWMgaW50IHhfaW5zKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCB4X2RlbGV0ZShpbnQsIGludCk7CitzdGF0aWMgaW50IHhfYndvcmQodm9pZCk7CitzdGF0aWMgaW50IHhfZndvcmQoaW50KTsKK3N0YXRpYyB2b2lkIHhfZ290byhjaGFyICopOworc3RhdGljIHZvaWQgeF9iczMoY2hhciAqKik7CitzdGF0aWMgaW50IHhfc2l6ZV9zdHIoY2hhciAqKTsKK3N0YXRpYyBpbnQgeF9zaXplMihjaGFyICosIGNoYXIgKiopOworc3RhdGljIHZvaWQgeF96b3RzKGNoYXIgKik7CitzdGF0aWMgdm9pZCB4X3pvdGMyKGludCk7CitzdGF0aWMgdm9pZCB4X3pvdGMzKGNoYXIgKiopOworc3RhdGljIHZvaWQgeF9sb2FkX2hpc3QoY2hhciAqKik7CitzdGF0aWMgaW50IHhfc2VhcmNoKGNoYXIgKiwgaW50LCBpbnQpOworI2lmbmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgaW50IHhfc2VhcmNoX2RpcihpbnQpOworI2VuZGlmCitzdGF0aWMgaW50IHhfbWF0Y2goY2hhciAqLCBjaGFyICopOworc3RhdGljIHZvaWQgeF9yZWRyYXcoaW50KTsKK3N0YXRpYyB2b2lkIHhfcHVzaChpbnQpOworc3RhdGljIGNoYXIgKnhfbWFwaW4oY29uc3QgY2hhciAqLCBBcmVhICopCisgICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDEpKSk7CitzdGF0aWMgY2hhciAqeF9tYXBvdXQoaW50KTsKK3N0YXRpYyB2b2lkIHhfbWFwb3V0MihpbnQsIGNoYXIgKiopOworc3RhdGljIHZvaWQgeF9wcmludChpbnQsIGludCk7CitzdGF0aWMgdm9pZCB4X2FkanVzdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhfZV91bmdldGMoaW50KTsKK3N0YXRpYyBpbnQgeF9lX2dldGModm9pZCk7CitzdGF0aWMgdm9pZCB4X2VfcHV0YzIoaW50KTsKK3N0YXRpYyB2b2lkIHhfZV9wdXRjMyhjb25zdCBjaGFyICoqKTsKK3N0YXRpYyB2b2lkIHhfZV9wdXRzKGNvbnN0IGNoYXIgKik7CisjaWZuZGVmIE1LU0hfU01BTEwKK3N0YXRpYyBpbnQgeF9mb2xkX2Nhc2UoaW50KTsKKyNlbmRpZgorc3RhdGljIGNoYXIgKnhfbGFzdGNwKHZvaWQpOworc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW50LCBDb21wX3R5cGUpOworCitzdGF0aWMgaW50IHVuZ2V0X2NoYXIgPSAtMTsKKworc3RhdGljIGludCB4X2RvX2lucyhjb25zdCBjaGFyICosIHNpemVfdCk7CitzdGF0aWMgdm9pZCBiaW5kX2lmX25vdF9ib3VuZChpbnQsIGludCwgaW50KTsKKworZW51bSBlbWFjc19mdW5jcyB7CisjZGVmaW5lIEVNQUNTRk5fRU5VTVMKKyNpbmNsdWRlICJlbWFjc2ZuLmgiCisJWEZVTkNfTUFYCit9OworCisjZGVmaW5lIEVNQUNTRk5fREVGTlMKKyNpbmNsdWRlICJlbWFjc2ZuLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeF9mdGFiIHhfZnRhYltdID0geworI2RlZmluZSBFTUFDU0ZOX0lURU1TCisjaW5jbHVkZSAiZW1hY3Nmbi5oIgorCXsgMCwgTlVMTCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHhfZGVmYmluZGluZ3MgY29uc3QgeF9kZWZiaW5kaW5nc1tdID0geworCXsgWEZVTkNfZGVsX2JhY2ssCQkwLCBDVFJMKCc/JykJfSwKKwl7IFhGVU5DX2RlbF9id29yZCwJCTEsIENUUkwoJz8nKQl9LAorCXsgWEZVTkNfZW90X2RlbCwJCTAsIENUUkwoJ0QnKQl9LAorCXsgWEZVTkNfZGVsX2JhY2ssCQkwLCBDVFJMKCdIJykJfSwKKwl7IFhGVU5DX2RlbF9id29yZCwJCTEsIENUUkwoJ0gnKQl9LAorCXsgWEZVTkNfZGVsX2J3b3JkLAkJMSwJJ2gnCX0sCisJeyBYRlVOQ19tdl9id29yZCwJCTEsCSdiJwl9LAorCXsgWEZVTkNfbXZfZndvcmQsCQkxLAknZicJfSwKKwl7IFhGVU5DX2RlbF9md29yZCwJCTEsCSdkJwl9LAorCXsgWEZVTkNfbXZfYmFjaywJCTAsIENUUkwoJ0InKQl9LAorCXsgWEZVTkNfbXZfZm9ydywJCTAsIENUUkwoJ0YnKQl9LAorCXsgWEZVTkNfc2VhcmNoX2NoYXJfZm9ydywJMCwgQ1RSTCgnXScpCX0sCisJeyBYRlVOQ19zZWFyY2hfY2hhcl9iYWNrLAkxLCBDVFJMKCddJykJfSwKKwl7IFhGVU5DX25ld2xpbmUsCQkwLCBDVFJMKCdNJykJfSwKKwl7IFhGVU5DX25ld2xpbmUsCQkwLCBDVFJMKCdKJykJfSwKKwl7IFhGVU5DX2VuZF9vZl90ZXh0LAkJMCwgQ1RSTCgnXycpCX0sCisJeyBYRlVOQ19hYm9ydCwJCQkwLCBDVFJMKCdHJykJfSwKKwl7IFhGVU5DX3ByZXZfY29tLAkJMCwgQ1RSTCgnUCcpCX0sCisJeyBYRlVOQ19uZXh0X2NvbSwJCTAsIENUUkwoJ04nKQl9LAorCXsgWEZVTkNfbmxfbmV4dF9jb20sCQkwLCBDVFJMKCdPJykJfSwKKwl7IFhGVU5DX3NlYXJjaF9oaXN0LAkJMCwgQ1RSTCgnUicpCX0sCisJeyBYRlVOQ19iZWdfaGlzdCwJCTEsCSc8Jwl9LAorCXsgWEZVTkNfZW5kX2hpc3QsCQkxLAknPicJfSwKKwl7IFhGVU5DX2dvdG9faGlzdCwJCTEsCSdnJwl9LAorCXsgWEZVTkNfbXZfZW5kLAkJCTAsIENUUkwoJ0UnKQl9LAorCXsgWEZVTkNfbXZfYmVnaW4sCQkwLCBDVFJMKCdBJykJfSwKKwl7IFhGVU5DX2RyYXdfbGluZSwJCTAsIENUUkwoJ0wnKQl9LAorCXsgWEZVTkNfY2xzLAkJCTEsIENUUkwoJ0wnKQl9LAorCXsgWEZVTkNfbWV0YTEsCQkJMCwgQ1RSTCgnWycpCX0sCisJeyBYRlVOQ19tZXRhMiwJCQkwLCBDVFJMKCdYJykJfSwKKwl7IFhGVU5DX2tpbGwsCQkJMCwgQ1RSTCgnSycpCX0sCisJeyBYRlVOQ195YW5rLAkJCTAsIENUUkwoJ1knKQl9LAorCXsgWEZVTkNfbWV0YV95YW5rLAkJMSwJJ3knCX0sCisJeyBYRlVOQ19saXRlcmFsLAkJMCwgQ1RSTCgnXicpCX0sCisJeyBYRlVOQ19jb21tZW50LAkJMSwJJyMnCX0sCisJeyBYRlVOQ190cmFuc3Bvc2UsCQkwLCBDVFJMKCdUJykJfSwKKwl7IFhGVU5DX2NvbXBsZXRlLAkJMSwgQ1RSTCgnWycpCX0sCisJeyBYRlVOQ19jb21wX2xpc3QsCQkwLCBDVFJMKCdJJykJfSwKKwl7IFhGVU5DX2NvbXBfbGlzdCwJCTEsCSc9Jwl9LAorCXsgWEZVTkNfZW51bWVyYXRlLAkJMSwJJz8nCX0sCisJeyBYRlVOQ19leHBhbmQsCQkJMSwJJyonCX0sCisJeyBYRlVOQ19jb21wX2ZpbGUsCQkxLCBDVFJMKCdYJykJfSwKKwl7IFhGVU5DX2NvbXBfY29tbSwJCTIsIENUUkwoJ1snKQl9LAorCXsgWEZVTkNfbGlzdF9jb21tLAkJMiwJJz8nCX0sCisJeyBYRlVOQ19saXN0X2ZpbGUsCQkyLCBDVFJMKCdZJykJfSwKKwl7IFhGVU5DX3NldF9tYXJrLAkJMSwJJyAnCX0sCisJeyBYRlVOQ19raWxsX3JlZ2lvbiwJCTAsIENUUkwoJ1cnKQl9LAorCXsgWEZVTkNfeGNoZ19wb2ludF9tYXJrLAkyLCBDVFJMKCdYJykJfSwKKwl7IFhGVU5DX2xpdGVyYWwsCQkwLCBDVFJMKCdWJykJfSwKKwl7IFhGVU5DX3ZlcnNpb24sCQkxLCBDVFJMKCdWJykJfSwKKwl7IFhGVU5DX3ByZXZfaGlzdHdvcmQsCQkxLAknLicJfSwKKwl7IFhGVU5DX3ByZXZfaGlzdHdvcmQsCQkxLAknXycJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknMCcJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknMScJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknMicJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknMycJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknNCcJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknNScJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknNicJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknNycJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknOCcJfSwKKwl7IFhGVU5DX3NldF9hcmcsCQkxLAknOScJfSwKKyNpZm5kZWYgTUtTSF9TTUFMTAorCXsgWEZVTkNfZm9sZF91cHBlciwJCTEsCSdVJwl9LAorCXsgWEZVTkNfZm9sZF91cHBlciwJCTEsCSd1Jwl9LAorCXsgWEZVTkNfZm9sZF9sb3dlciwJCTEsCSdMJwl9LAorCXsgWEZVTkNfZm9sZF9sb3dlciwJCTEsCSdsJwl9LAorCXsgWEZVTkNfZm9sZF9jYXBpdGFsaXNlLAkxLAknQycJfSwKKwl7IFhGVU5DX2ZvbGRfY2FwaXRhbGlzZSwJMSwJJ2MnCX0sCisjZW5kaWYKKwkvKiBUaGVzZSBmb3IgYW5zaSBhcnJvdyBrZXlzOiBhcmd1YWJsZWx5IHNob3VsZG4ndCBiZSBoZXJlIGJ5CisJICogZGVmYXVsdCwgYnV0IGl0cyBzaW1wbGVyL2Zhc3Rlci9zbWFsbGVyIHRoYW4gdXNpbmcgdGVybWNhcAorCSAqIGVudHJpZXMuCisJICovCisJeyBYRlVOQ19tZXRhMiwJCQkxLAknWycJfSwKKwl7IFhGVU5DX21ldGEyLAkJCTEsCSdPJwl9LAorCXsgWEZVTkNfcHJldl9jb20sCQkyLAknQScJfSwKKwl7IFhGVU5DX25leHRfY29tLAkJMiwJJ0InCX0sCisJeyBYRlVOQ19tdl9mb3J3LAkJMiwJJ0MnCX0sCisJeyBYRlVOQ19tdl9iYWNrLAkJMiwJJ0QnCX0sCisjaWZuZGVmIE1LU0hfU01BTEwKKwl7IFhGVU5DX3Z0X2hhY2ssCQkyLAknMScJfSwKKwl7IFhGVU5DX212X2JlZ2luIHwgMHg4MCwJMiwJJzcnCX0sCisJeyBYRlVOQ19tdl9iZWdpbiwJCTIsCSdIJwl9LAorCXsgWEZVTkNfbXZfZW5kIHwgMHg4MCwJCTIsCSc0Jwl9LAorCXsgWEZVTkNfbXZfZW5kIHwgMHg4MCwJCTIsCSc4Jwl9LAorCXsgWEZVTkNfbXZfZW5kLAkJCTIsCSdGJwl9LAorCXsgWEZVTkNfZGVsX2NoYXIgfCAweDgwLAkyLAknMycJfSwKKwl7IFhGVU5DX3NlYXJjaF9oaXN0X3VwIHwgMHg4MCwJMiwJJzUnCX0sCisJeyBYRlVOQ19zZWFyY2hfaGlzdF9kbiB8IDB4ODAsCTIsCSc2Jwl9LAorCS8qIG1vcmUgbm9uLXN0YW5kYXJkIG9uZXMgKi8KKwl7IFhGVU5DX2VkaXRfbGluZSwJCTIsCSdlJwl9CisjZW5kaWYKK307CisKKyNpZmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgdm9pZCB4X21vZGlmaWVkKHZvaWQpOworc3RhdGljIHZvaWQKK3hfbW9kaWZpZWQodm9pZCkKK3sKKwlpZiAoIW1vZGlmaWVkKSB7CisJCXhfaGlzdHAgPSBoaXN0cHRyICsgMTsKKwkJbW9kaWZpZWQgPSAxOworCX0KK30KKyNkZWZpbmUgWEZVTkNfVkFMVUUoZikgKGYpCisjZWxzZQorI2RlZmluZSB4X21vZGlmaWVkKCkgZG8gewkJCVwKKwlpZiAoIW1vZGlmaWVkKSB7CQkJXAorCQl4X2hpc3RwID0gaGlzdHB0ciArIDE7CQlcCisJCW1vZGlmaWVkID0gMTsJCQlcCisJfQkJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZGVmaW5lIFhGVU5DX1ZBTFVFKGYpIChmICYgMHg3RikKKyNlbmRpZgorCitzdGF0aWMgaW50Cit4X2VfZ2V0bWJjKGNoYXIgKnNidWYpCit7CisJaW50IGMsIHBvcyA9IDA7CisJdW5zaWduZWQgY2hhciAqYnVmID0gKHVuc2lnbmVkIGNoYXIgKilzYnVmOworCisJbWVtc2V0KGJ1ZiwgMCwgNCk7CisJYnVmW3BvcysrXSA9IGMgPSB4X2VfZ2V0YygpOworCWlmIChjID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoVVRGTU9ERSkgeworCQlpZiAoKGJ1ZlswXSA+PSAweEMyKSAmJiAoYnVmWzBdIDwgMHhGMCkpIHsKKwkJCWMgPSB4X2VfZ2V0YygpOworCQkJaWYgKGMgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCQlpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7CisJCQkJeF9lX3VuZ2V0YyhjKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJYnVmW3BvcysrXSA9IGM7CisJCX0KKwkJaWYgKChidWZbMF0gPj0gMHhFMCkgJiYgKGJ1ZlswXSA8IDB4RjApKSB7CisJCQkvKiBYWFggeF9lX3VuZ2V0YyBpcyBvbmUtb2N0ZXQgb25seSAqLworCQkJYnVmW3BvcysrXSA9IGMgPSB4X2VfZ2V0YygpOworCQkJaWYgKGMgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9CisJcmV0dXJuIChwb3MpOworfQorCitzdGF0aWMgdm9pZAoreF9pbml0X3Byb21wdCh2b2lkKQoreworCXhfY29sID0gcHJvbXB0bGVuKHByb21wdCk7CisJeF9hZGpfb2sgPSAxOworCXByb21wdF9yZWRyYXcgPSAxOworCWlmICh4X2NvbCA+PSB4eF9jb2xzKQorCQl4X2NvbCAlPSB4eF9jb2xzOworCXhfZGlzcGxlbiA9IHh4X2NvbHMgLSAyIC0geF9jb2w7CisJeF9hZGpfZG9uZSA9IDA7CisKKwlwcHJvbXB0KHByb21wdCwgMCk7CisJaWYgKHhfZGlzcGxlbiA8IDEpIHsKKwkJeF9jb2wgPSAwOworCQl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMjsKKwkJeF9lX3B1dGMyKCdcbicpOworCQlwcm9tcHRfcmVkcmF3ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3hfZW1hY3MoY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBjLCBpOworCXVuc2lnbmVkIGNoYXIgZjsKKworCXhicCA9IHhidWYgPSBidWY7IHhlbmQgPSBidWYgKyBsZW47CisJeGxwID0geGNwID0geGVwID0gYnVmOworCSp4Y3AgPSAwOworCXhscF92YWxpZCA9IHRydWU7CisJeG1wID0gTlVMTDsKKwl4X2N1cnByZWZpeCA9IDA7CisJeF9oaXN0cCA9IGhpc3RwdHIgKyAxOworCXhfbGFzdF9jb21tYW5kID0gWEZVTkNfZXJyb3I7CisKKwl4eF9jb2xzID0geF9jb2xzOworCXhfaW5pdF9wcm9tcHQoKTsKKworCWlmICh4X25leHRjbWQgPj0gMCkgeworCQlpbnQgb2ZmID0gc291cmNlLT5saW5lIC0geF9uZXh0Y21kOworCQlpZiAoaGlzdHB0ciAtIGhpc3RvcnkgPj0gb2ZmKQorCQkJeF9sb2FkX2hpc3QoaGlzdHB0ciAtIG9mZik7CisJCXhfbmV4dGNtZCA9IC0xOworCX0KKwllZGl0bW9kZSA9IDE7CisJd2hpbGUgKDEpIHsKKwkJeF9mbHVzaCgpOworCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSA8IDApCisJCQlyZXR1cm4gKDApOworCisJCWYgPSB4X2N1cnByZWZpeCA9PSAtMSA/IFhGVU5DX2luc2VydCA6CisJCSAgICB4X3RhYlt4X2N1cnByZWZpeF1bY107CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJaWYgKGYgJiAweDgwKSB7CisJCQlmICY9IDB4N0Y7CisJCQlpZiAoKGkgPSB4X2VfZ2V0YygpKSAhPSAnficpCisJCQkJeF9lX3VuZ2V0YyhpKTsKKwkJfQorCisJCS8qIGF2b2lkIGJpbmQga2V5IG1hY3JvIHJlY3Vyc2lvbiAqLworCQlpZiAobWFjcm9wdHIgJiYgZiA9PSBYRlVOQ19pbnNfc3RyaW5nKQorCQkJZiA9IFhGVU5DX2luc2VydDsKKyNlbmRpZgorCisJCWlmICghKHhfZnRhYltmXS54Zl9mbGFncyAmIFhGX1BSRUZJWCkgJiYKKwkJICAgIHhfbGFzdF9jb21tYW5kICE9IFhGVU5DX3NldF9hcmcpIHsKKwkJCXhfYXJnID0gMTsKKwkJCXhfYXJnX2RlZmF1bHRlZCA9IDE7CisJCX0KKwkJaSA9IGMgfCAoeF9jdXJwcmVmaXggPDwgOCk7CisJCXhfY3VycHJlZml4ID0gMDsKKwkJc3dpdGNoICgoKnhfZnRhYltmXS54Zl9mdW5jKShpKSkgeworCQljYXNlIEtTVEQ6CisJCQlpZiAoISh4X2Z0YWJbZl0ueGZfZmxhZ3MgJiBYRl9QUkVGSVgpKQorCQkJCXhfbGFzdF9jb21tYW5kID0gZjsKKwkJCWJyZWFrOworCQljYXNlIEtFT0w6CisJCQlpID0geGVwIC0geGJ1ZjsKKwkJCXJldHVybiAoaSk7CisJCWNhc2UgS0lOVFI6CS8qIHNwZWNpYWwgY2FzZSBmb3IgaW50ZXJydXB0ICovCisJCQl0cmFwc2lnKFNJR0lOVCk7CisJCQl4X21vZGUoZmFsc2UpOworCQkJdW53aW5kKExTSEVMTCk7CisJCX0KKwkJLyogYWQtaG9jIGhhY2sgZm9yIGZpeGluZyB0aGUgY3Vyc29yIHBvc2l0aW9uICovCisJCXhfZ290byh4Y3ApOworCX0KK30KKworc3RhdGljIGludAoreF9pbnNlcnQoaW50IGMpCit7CisJc3RhdGljIGludCBsZWZ0ID0gMCwgcG9zLCBzYXZlX2FyZzsKKwlzdGF0aWMgY2hhciBzdHJbNF07CisKKwkvKgorCSAqIFNob3VsZCBhbGxvdyB0YWIgYW5kIGNvbnRyb2wgY2hhcnMuCisJICovCisJaWYgKGMgPT0gMCkgeworIGludm1iczoKKwkJbGVmdCA9IDA7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJaWYgKFVURk1PREUpIHsKKwkJaWYgKCgoYyAmIDB4QzApID09IDB4ODApICYmIGxlZnQpIHsKKwkJCXN0cltwb3MrK10gPSBjOworCQkJaWYgKCEtLWxlZnQpIHsKKwkJCQlzdHJbcG9zXSA9ICdcMCc7CisJCQkJeF9hcmcgPSBzYXZlX2FyZzsKKwkJCQl3aGlsZSAoeF9hcmctLSkKKwkJCQkJeF9pbnMoc3RyKTsKKwkJCX0KKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwkJaWYgKGxlZnQpIHsKKwkJCWlmICh4X2N1cnByZWZpeCA9PSAtMSkgeworCQkJCS8qIGZsdXNoIGludmFsaWQgbXVsdGlieXRlICovCisJCQkJc3RyW3Bvc10gPSAnXDAnOworCQkJCXdoaWxlIChzYXZlX2FyZy0tKQorCQkJCQl4X2lucyhzdHIpOworCQkJfQorCQl9CisJCWlmICgoYyA+PSAweEMyKSAmJiAoYyA8IDB4RTApKQorCQkJbGVmdCA9IDE7CisJCWVsc2UgaWYgKChjID49IDB4RTApICYmIChjIDwgMHhGMCkpCisJCQlsZWZ0ID0gMjsKKwkJZWxzZSBpZiAoYyA+IDB4N0YpCisJCQlnb3RvIGludm1iczsKKwkJZWxzZQorCQkJbGVmdCA9IDA7CisJCWlmIChsZWZ0KSB7CisJCQlzYXZlX2FyZyA9IHhfYXJnOworCQkJcG9zID0gMTsKKwkJCXN0clswXSA9IGM7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJfQorCWxlZnQgPSAwOworCXN0clswXSA9IGM7CisJc3RyWzFdID0gJ1wwJzsKKwl3aGlsZSAoeF9hcmctLSkKKwkJeF9pbnMoc3RyKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCisjaWZuZGVmIE1LU0hfU01BTEwKK3N0YXRpYyBpbnQKK3hfaW5zX3N0cmluZyhpbnQgYykKK3sKKwltYWNyb3B0ciA9IHhfYXRhYltjID4+IDhdW2MgJiAyNTVdOworCS8qCisJICogd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gYm90aGVyIGNoZWNraW5nIGlmIG1hY3JvcHRyIGlzCisJICogbm90IE5VTEwgYnV0IGZpcnN0IGNoYXIgaXMgTlVMOyB4X2VfZ2V0YygpIGRvZXMgaXQKKwkgKi8KKwlyZXR1cm4gKEtTVEQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3hfZG9faW5zKGNvbnN0IGNoYXIgKmNwLCBzaXplX3QgbGVuKQoreworCWlmICh4ZXAgKyBsZW4gPj0geGVuZCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoLTEpOworCX0KKwltZW1tb3ZlKHhjcCArIGxlbiwgeGNwLCB4ZXAgLSB4Y3AgKyAxKTsKKwltZW1tb3ZlKHhjcCwgY3AsIGxlbik7CisJeGNwICs9IGxlbjsKKwl4ZXAgKz0gbGVuOworCXhfbW9kaWZpZWQoKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit4X2lucyhjb25zdCBjaGFyICpzKQoreworCWNoYXIgKmNwID0geGNwOworCWludCBhZGogPSB4X2Fkal9kb25lOworCisJaWYgKHhfZG9faW5zKHMsIHN0cmxlbihzKSkgPCAwKQorCQlyZXR1cm4gKC0xKTsKKwkvKgorCSAqIHhfem90cygpIG1heSByZXN1bHQgaW4gYSBjYWxsIHRvIHhfYWRqdXN0KCkKKwkgKiB3ZSB3YW50IHhjcCB0byByZWZsZWN0IHRoZSBuZXcgcG9zaXRpb24uCisJICovCisJeGxwX3ZhbGlkID0gZmFsc2U7CisJeF9sYXN0Y3AoKTsKKwl4X2Fkal9vayA9ICh4Y3AgPj0geGxwKTsKKwl4X3pvdHMoY3ApOworCWlmIChhZGogPT0geF9hZGpfZG9uZSkgewkvKiBoYXMgeF9hZGp1c3QoKSBiZWVuIGNhbGxlZD8gKi8KKwkJLyogbm8gKi8KKwkJY3AgPSB4bHA7CisJCXdoaWxlIChjcCA+IHhjcCkKKwkJCXhfYnMzKCZjcCk7CisJfQorCWlmICh4bHAgPT0geGVwIC0gMSkKKwkJeF9yZWRyYXcoeHhfY29scyk7CisJeF9hZGpfb2sgPSAxOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZGVsX2JhY2soaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoeGNwID09IHhidWYpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwlkbyB7CisJCXhfZ290byh4Y3AgLSAxKTsKKwl9IHdoaWxlICgoKytpIDwgeF9hcmcpICYmICh4Y3AgIT0geGJ1ZikpOworCXhfZGVsZXRlKGksIGZhbHNlKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2RlbF9jaGFyKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqY3AsICpjcDI7CisJaW50IGkgPSAwOworCisJY3AgPSB4Y3A7CisJd2hpbGUgKGkgPCB4X2FyZykgeworCQl1dGZfcHRyYWRqeChjcCwgY3AyKTsKKwkJaWYgKGNwMiA+IHhlcCkKKwkJCWJyZWFrOworCQljcCA9IGNwMjsKKwkJaSsrOworCX0KKworCWlmICghaSkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXhfZGVsZXRlKGksIGZhbHNlKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCisvKiBEZWxldGUgbmMgY2hhcnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IgKGluY2x1ZGluZyBjdXJzb3IgcG9zaXRpb24pICovCitzdGF0aWMgdm9pZAoreF9kZWxldGUoaW50IG5jLCBpbnQgcHVzaCkKK3sKKwlpbnQgaSwgbmIsIG53OworCWNoYXIgKmNwOworCisJaWYgKG5jID09IDApCisJCXJldHVybjsKKworCW53ID0gMDsKKwljcCA9IHhjcDsKKwlmb3IgKGkgPSAwOyBpIDwgbmM7ICsraSkgeworCQljaGFyICpjcDI7CisJCWludCBqOworCisJCWogPSB4X3NpemUyKGNwLCAmY3AyKTsKKwkJaWYgKGNwMiA+IHhlcCkKKwkJCWJyZWFrOworCQljcCA9IGNwMjsKKwkJbncgKz0gajsKKwl9CisJbmIgPSBjcCAtIHhjcDsKKwkvKiBuYyA9IGk7ICovCisKKwlpZiAoeG1wICE9IE5VTEwgJiYgeG1wID4geGNwKSB7CisJCWlmICh4Y3AgKyBuYiA+IHhtcCkKKwkJCXhtcCA9IHhjcDsKKwkJZWxzZQorCQkJeG1wIC09IG5iOworCX0KKwkvKgorCSAqIFRoaXMgbGV0cyB1cyB5YW5rIGEgd29yZCB3ZSBoYXZlIGRlbGV0ZWQuCisJICovCisJaWYgKHB1c2gpCisJCXhfcHVzaChuYik7CisKKwl4ZXAgLT0gbmI7CisJbWVtbW92ZSh4Y3AsIHhjcCArIG5iLCB4ZXAgLSB4Y3AgKyAxKTsJLyogQ29waWVzIHRoZSBOVUwgKi8KKwl4X2Fkal9vayA9IDA7CQkJLyogZG9uJ3QgcmVkcmF3ICovCisJeGxwX3ZhbGlkID0gZmFsc2U7CisJeF96b3RzKHhjcCk7CisJLyoKKwkgKiBpZiB3ZSBhcmUgYWxyZWFkeSBmaWxsaW5nIHRoZSBsaW5lLAorCSAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gJyAnLCdcYicuCisJICogQnV0IGlmIHdlIG11c3QsIG1ha2Ugc3VyZSB3ZSBkbyB0aGUgbWluaW11bS4KKwkgKi8KKwlpZiAoKGkgPSB4eF9jb2xzIC0gMiAtIHhfY29sKSA+IDAgfHwgeGVwIC0geGxwID09IDApIHsKKwkJbncgPSBpID0gKG53IDwgaSkgPyBudyA6IGk7CisJCXdoaWxlIChpLS0pCisJCQl4X2VfcHV0YzIoJyAnKTsKKwkJaWYgKHhfY29sID09IHh4X2NvbHMgLSAyKSB7CisJCQl4X2VfcHV0YzIoKHhlcCA+IHhscCkgPyAnPicgOiAoeGJwID4geGJ1ZikgPyAnPCcgOiAnICcpOworCQkJKytudzsKKwkJfQorCQl3aGlsZSAobnctLSkKKwkJCXhfZV9wdXRjMignXGInKTsKKwl9CisJLyp4X2dvdG8oeGNwKTsqLworCXhfYWRqX29rID0gMTsKKwl4bHBfdmFsaWQgPSBmYWxzZTsKKwljcCA9IHhfbGFzdGNwKCk7CisJd2hpbGUgKGNwID4geGNwKQorCQl4X2JzMygmY3ApOworCisJeF9tb2RpZmllZCgpOworCXJldHVybjsKK30KKworc3RhdGljIGludAoreF9kZWxfYndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2RlbGV0ZSh4X2J3b3JkKCksIHRydWUpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbXZfYndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2J3b3JkKCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tdl9md29yZChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfZndvcmQoMSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9kZWxfZndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2RlbGV0ZSh4X2Z3b3JkKDApLCB0cnVlKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2J3b3JkKHZvaWQpCit7CisJaW50IG5jID0gMCwgbmIgPSAwOworCWNoYXIgKmNwID0geGNwOworCisJaWYgKGNwID09IHhidWYpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKDApOworCX0KKwl3aGlsZSAoeF9hcmctLSkgeworCQl3aGlsZSAoY3AgIT0geGJ1ZiAmJiBpc19tZnMoY3BbLTFdKSkgeworCQkJY3AtLTsKKwkJCW5iKys7CisJCX0KKwkJd2hpbGUgKGNwICE9IHhidWYgJiYgIWlzX21mcyhjcFstMV0pKSB7CisJCQljcC0tOworCQkJbmIrKzsKKwkJfQorCX0KKwl4X2dvdG8oY3ApOworCWZvciAoY3AgPSB4Y3A7IGNwIDwgKHhjcCArIG5iKTsgKytuYykKKwkJY3AgKz0gdXRmX3B0cmFkaihjcCk7CisJcmV0dXJuIChuYyk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZndvcmQoaW50IG1vdmUpCit7CisJaW50IG5jID0gMDsKKwljaGFyICpjcCA9IHhjcCwgKmNwMjsKKworCWlmIChjcCA9PSB4ZXApIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKDApOworCX0KKwl3aGlsZSAoeF9hcmctLSkgeworCQl3aGlsZSAoY3AgIT0geGVwICYmIGlzX21mcygqY3ApKQorCQkJY3ArKzsKKwkJd2hpbGUgKGNwICE9IHhlcCAmJiAhaXNfbWZzKCpjcCkpCisJCQljcCsrOworCX0KKwlmb3IgKGNwMiA9IHhjcDsgY3AyIDwgY3A7ICsrbmMpCisJCWNwMiArPSB1dGZfcHRyYWRqKGNwMik7CisJaWYgKG1vdmUpCisJCXhfZ290byhjcCk7CisJcmV0dXJuIChuYyk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2dvdG8oY2hhciAqY3ApCit7CisJaWYgKFVURk1PREUpCisJCXdoaWxlICgoY3AgPiB4YnVmKSAmJiAoKCpjcCAmIDB4QzApID09IDB4ODApKQorCQkJLS1jcDsKKwlpZiAoY3AgPCB4YnAgfHwgY3AgPj0gdXRmX3NraXBjb2xzKHhicCwgeF9kaXNwbGVuKSkgeworCQkvKiB3ZSBhcmUgaGVhZGluZyBvZmYgc2NyZWVuICovCisJCXhjcCA9IGNwOworCQl4X2FkanVzdCgpOworCX0gZWxzZSBpZiAoY3AgPCB4Y3ApIHsJCS8qIG1vdmUgYmFjayAqLworCQl3aGlsZSAoY3AgPCB4Y3ApCisJCQl4X2JzMygmeGNwKTsKKwl9IGVsc2UgaWYgKGNwID4geGNwKSB7CQkvKiBtb3ZlIGZvcndhcmQgKi8KKwkJd2hpbGUgKGNwID4geGNwKQorCQkJeF96b3RjMygmeGNwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit4X2JzMyhjaGFyICoqcCkKK3sKKwlpbnQgaTsKKworCSgqcCktLTsKKwlpZiAoVVRGTU9ERSkKKwkJd2hpbGUgKCgodW5zaWduZWQgY2hhcikqKnAgJiAweEMwKSA9PSAweDgwKQorCQkJKCpwKS0tOworCisJaSA9IHhfc2l6ZTIoKnAsIE5VTEwpOworCXdoaWxlIChpLS0pCisJCXhfZV9wdXRjMignXGInKTsKK30KKworc3RhdGljIGludAoreF9zaXplX3N0cihjaGFyICpjcCkKK3sKKwlpbnQgc2l6ZSA9IDA7CisJd2hpbGUgKCpjcCkKKwkJc2l6ZSArPSB4X3NpemUyKGNwLCAmY3ApOworCXJldHVybiAoc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3hfc2l6ZTIoY2hhciAqY3AsIGNoYXIgKipkY3ApCit7CisJaW50IGMgPSAqKHVuc2lnbmVkIGNoYXIgKiljcDsKKworCWlmIChVVEZNT0RFICYmIChjID4gMHg3RikpCisJCXJldHVybiAodXRmX3dpZHRoYWRqKGNwLCAoY29uc3QgY2hhciAqKilkY3ApKTsKKwlpZiAoZGNwKQorCQkqZGNwID0gY3AgKyAxOworCWlmIChjID09ICdcdCcpCisJCXJldHVybiAoNCk7CS8qIEtsdWRnZSwgdGFicyBhcmUgYWx3YXlzIGZvdXIgc3BhY2VzLiAqLworCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikKKwkJcmV0dXJuICgyKTsJLyogY29udHJvbCB1bnNpZ25lZCBjaGFyICovCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK3hfem90cyhjaGFyICpzdHIpCit7CisJaW50IGFkaiA9IHhfYWRqX2RvbmU7CisKKwl4X2xhc3RjcCgpOworCXdoaWxlICgqc3RyICYmIHN0ciA8IHhscCAmJiBhZGogPT0geF9hZGpfZG9uZSkKKwkJeF96b3RjMygmc3RyKTsKK30KKworc3RhdGljIHZvaWQKK3hfem90YzIoaW50IGMpCit7CisJaWYgKGMgPT0gJ1x0JykgeworCQkvKiBLbHVkZ2UsIHRhYnMgYXJlIGFsd2F5cyBmb3VyIHNwYWNlcy4gKi8KKwkJeF9lX3B1dHMoIiAgICAiKTsKKwl9IGVsc2UgaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7CisJCXhfZV9wdXRjMignXicpOworCQl4X2VfcHV0YzIoVU5DVFJMKGMpKTsKKwl9IGVsc2UKKwkJeF9lX3B1dGMyKGMpOworfQorCitzdGF0aWMgdm9pZAoreF96b3RjMyhjaGFyICoqY3ApCit7CisJdW5zaWduZWQgY2hhciBjID0gKioodW5zaWduZWQgY2hhciAqKiljcDsKKworCWlmIChjID09ICdcdCcpIHsKKwkJLyogS2x1ZGdlLCB0YWJzIGFyZSBhbHdheXMgZm91ciBzcGFjZXMuICovCisJCXhfZV9wdXRzKCIgICAgIik7CisJCSgqY3ApKys7CisJfSBlbHNlIGlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgeworCQl4X2VfcHV0YzIoJ14nKTsKKwkJeF9lX3B1dGMyKFVOQ1RSTChjKSk7CisJCSgqY3ApKys7CisJfSBlbHNlCisJCXhfZV9wdXRjMygoY29uc3QgY2hhciAqKiljcCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbXZfYmFjayhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWlmICh4Y3AgPT0geGJ1ZikgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXdoaWxlICh4X2FyZy0tKSB7CisJCXhfZ290byh4Y3AgLSAxKTsKKwkJaWYgKHhjcCA9PSB4YnVmKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbXZfZm9ydyhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKmNwID0geGNwLCAqY3AyOworCisJaWYgKHhjcCA9PSB4ZXApIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl3aGlsZSAoeF9hcmctLSkgeworCQl1dGZfcHRyYWRqeChjcCwgY3AyKTsKKwkJaWYgKGNwMiA+IHhlcCkKKwkJCWJyZWFrOworCQljcCA9IGNwMjsKKwl9CisJeF9nb3RvKGNwKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X3NlYXJjaF9jaGFyX2ZvcncoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICpjcCA9IHhjcDsKKwljaGFyIHRtcFs0XTsKKworCSp4ZXAgPSAnXDAnOworCWlmICh4X2VfZ2V0bWJjKHRtcCkgPCAwKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJd2hpbGUgKHhfYXJnLS0pIHsKKwkJaWYgKChjcCA9IChjcCA9PSB4ZXApID8gTlVMTCA6IHN0cnN0cihjcCArIDEsIHRtcCkpID09IE5VTEwgJiYKKwkJICAgIChjcCA9IHN0cnN0cih4YnVmLCB0bXApKSA9PSBOVUxMKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJfQorCXhfZ290byhjcCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9zZWFyY2hfY2hhcl9iYWNrKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqY3AgPSB4Y3AsICpwLCB0bXBbNF07CisJYm9vbCBiOworCisJaWYgKHhfZV9nZXRtYmModG1wKSA8IDApIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwlmb3IgKDsgeF9hcmctLTsgY3AgPSBwKQorCQlmb3IgKHAgPSBjcDsgOyApIHsKKwkJCWlmIChwLS0gPT0geGJ1ZikKKwkJCQlwID0geGVwOworCQkJaWYgKHAgPT0gY3ApIHsKKwkJCQl4X2VfcHV0YzIoNyk7CisJCQkJcmV0dXJuIChLU1REKTsKKwkJCX0KKwkJCWlmICgodG1wWzFdICYmICgocCsxKSA+IHhlcCkpIHx8CisJCQkgICAgKHRtcFsyXSAmJiAoKHArMikgPiB4ZXApKSkKKwkJCQljb250aW51ZTsKKwkJCWIgPSB0cnVlOworCQkJaWYgKCpwICE9IHRtcFswXSkKKwkJCQliID0gZmFsc2U7CisJCQlpZiAoYiAmJiB0bXBbMV0gJiYgcFsxXSAhPSB0bXBbMV0pCisJCQkJYiA9IGZhbHNlOworCQkJaWYgKGIgJiYgdG1wWzJdICYmIHBbMl0gIT0gdG1wWzJdKQorCQkJCWIgPSBmYWxzZTsKKwkJCWlmIChiKQorCQkJCWJyZWFrOworCQl9CisJeF9nb3RvKGNwKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X25ld2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2VfcHV0YzIoJ1xyJyk7CisJeF9lX3B1dGMyKCdcbicpOworCXhfZmx1c2goKTsKKwkqeGVwKysgPSAnXG4nOworCXJldHVybiAoS0VPTCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZW5kX29mX3RleHQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X3pvdGMyKGVkY2hhcnMuZW9mKTsKKwl4X3B1dGMoJ1xyJyk7CisJeF9wdXRjKCdcbicpOworCXhfZmx1c2goKTsKKwlyZXR1cm4gKEtFT0wpOworfQorCitzdGF0aWMgaW50Cit4X2JlZ19oaXN0KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9sb2FkX2hpc3QoaGlzdG9yeSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9lbmRfaGlzdChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfbG9hZF9oaXN0KGhpc3RwdHIpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfcHJldl9jb20oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2xvYWRfaGlzdCh4X2hpc3RwIC0geF9hcmcpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbmV4dF9jb20oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2xvYWRfaGlzdCh4X2hpc3RwICsgeF9hcmcpOworCXJldHVybiAoS1NURCk7Cit9CisKKy8qIEdvdG8gYSBwYXJ0aWN1bGFyIGhpc3RvcnkgbnVtYmVyIG9idGFpbmVkIGZyb20gYXJndW1lbnQuCisgKiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiBoaXN0b3J5IDEgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91CisgKiB3YW50IHNvIHdlJ2xsIHNpbXBseSBnbyB0byB0aGUgb2xkZXN0IG9uZS4KKyAqLworc3RhdGljIGludAoreF9nb3RvX2hpc3QoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpZiAoeF9hcmdfZGVmYXVsdGVkKQorCQl4X2xvYWRfaGlzdChoaXN0b3J5KTsKKwllbHNlCisJCXhfbG9hZF9oaXN0KGhpc3RwdHIgKyB4X2FyZyAtIHNvdXJjZS0+bGluZSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIHZvaWQKK3hfbG9hZF9oaXN0KGNoYXIgKipocCkKK3sKKwlpbnQgb2xkc2l6ZTsKKwljaGFyICpzcCA9IE5VTEw7CisKKwlpZiAoaHAgPT0gaGlzdHB0ciArIDEpIHsKKwkJc3AgPSBob2xkYnVmOworCQltb2RpZmllZCA9IDA7CisJfSBlbHNlIGlmIChocCA8IGhpc3RvcnkgfHwgaHAgPiBoaXN0cHRyKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3AgPT0gTlVMTCkKKwkJc3AgPSAqaHA7CisJeF9oaXN0cCA9IGhwOworCW9sZHNpemUgPSB4X3NpemVfc3RyKHhidWYpOworCWlmIChtb2RpZmllZCkKKwkJc3RybGNweShob2xkYnVmLCB4YnVmLCBzaXplb2YoaG9sZGJ1ZikpOworCXN0cmxjcHkoeGJ1Ziwgc3AsIHhlbmQgLSB4YnVmKTsKKwl4YnAgPSB4YnVmOworCXhlcCA9IHhjcCA9IHhidWYgKyBzdHJsZW4oeGJ1Zik7CisJeGxwX3ZhbGlkID0gZmFsc2U7CisJaWYgKHhlcCA8PSB4X2xhc3RjcCgpKSB7CisJCXhfcmVkcmF3KG9sZHNpemUpOworCX0KKwl4X2dvdG8oeGVwKTsKKwltb2RpZmllZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3hfbmxfbmV4dF9jb20oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X25leHRjbWQgPSBzb3VyY2UtPmxpbmUgLSAoaGlzdHB0ciAtIHhfaGlzdHApICsgMTsKKwlyZXR1cm4gKHhfbmV3bGluZSgnXG4nKSk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZW90X2RlbChpbnQgYykKK3sKKwlpZiAoeGVwID09IHhidWYgJiYgeF9hcmdfZGVmYXVsdGVkKQorCQlyZXR1cm4gKHhfZW5kX29mX3RleHQoYykpOworCWVsc2UKKwkJcmV0dXJuICh4X2RlbF9jaGFyKGMpKTsKK30KKworLyogcmV2ZXJzZSBpbmNyZW1lbnRhbCBoaXN0b3J5IHNlYXJjaCAqLworc3RhdGljIGludAoreF9zZWFyY2hfaGlzdChpbnQgYykKK3sKKwlpbnQgb2Zmc2V0ID0gLTE7CS8qIG9mZnNldCBvZiBtYXRjaCBpbiB4YnVmLCBlbHNlIC0xICovCisJY2hhciBwYXRbMjU2ICsgMV07CS8qIHBhdHRlcm4gYnVmZmVyICovCisJY2hhciAqcCA9IHBhdDsKKwl1bnNpZ25lZCBjaGFyIGY7CisKKwkqcCA9ICdcMCc7CisJd2hpbGUgKDEpIHsKKwkJaWYgKG9mZnNldCA8IDApIHsKKwkJCXhfZV9wdXRzKCJcbkktc2VhcmNoOiAiKTsKKwkJCXhfZV9wdXRzKHBhdCk7CisJCX0KKwkJeF9mbHVzaCgpOworCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSA8IDApCisJCQlyZXR1cm4gKEtTVEQpOworCQlmID0geF90YWJbMF1bY107CisJCWlmIChjID09IENUUkwoJ1snKSkgeworCQkJaWYgKChmICYgMHg3RikgPT0gWEZVTkNfbWV0YTEpIHsKKwkJCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSA8IDApCisJCQkJCXJldHVybiAoS1NURCk7CisJCQkJZiA9IHhfdGFiWzFdW2NdICYgMHg3RjsKKwkJCQlpZiAoZiA9PSBYRlVOQ19tZXRhMSB8fCBmID09IFhGVU5DX21ldGEyKQorCQkJCQl4X21ldGExKENUUkwoJ1snKSk7CisJCQkJeF9lX3VuZ2V0YyhjKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJaWYgKGYgJiAweDgwKSB7CisJCQlmICY9IDB4N0Y7CisJCQlpZiAoKGMgPSB4X2VfZ2V0YygpKSAhPSAnficpCisJCQkJeF9lX3VuZ2V0YyhjKTsKKwkJfQorI2VuZGlmCisJCWlmIChmID09IFhGVU5DX3NlYXJjaF9oaXN0KQorCQkJb2Zmc2V0ID0geF9zZWFyY2gocGF0LCAwLCBvZmZzZXQpOworCQllbHNlIGlmIChmID09IFhGVU5DX2RlbF9iYWNrKSB7CisJCQlpZiAocCA9PSBwYXQpIHsKKwkJCQlvZmZzZXQgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwID4gcGF0KQorCQkJCSotLXAgPSAnXDAnOworCQkJaWYgKHAgPT0gcGF0KQorCQkJCW9mZnNldCA9IC0xOworCQkJZWxzZQorCQkJCW9mZnNldCA9IHhfc2VhcmNoKHBhdCwgMSwgb2Zmc2V0KTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGYgPT0gWEZVTkNfaW5zZXJ0KSB7CisJCQkvKiBhZGQgY2hhciB0byBwYXR0ZXJuICovCisJCQkvKiBvdmVyZmxvdyBjaGVjay4uLiAqLworCQkJaWYgKHAgPj0gJnBhdFtzaXplb2YocGF0KSAtIDFdKSB7CisJCQkJeF9lX3B1dGMyKDcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKnArKyA9IGMsICpwID0gJ1wwJzsKKwkJCWlmIChvZmZzZXQgPj0gMCkgeworCQkJCS8qIGFscmVhZHkgaGF2ZSBwYXJ0aWFsIG1hdGNoICovCisJCQkJb2Zmc2V0ID0geF9tYXRjaCh4YnVmLCBwYXQpOworCQkJCWlmIChvZmZzZXQgPj0gMCkgeworCQkJCQl4X2dvdG8oeGJ1ZiArIG9mZnNldCArIChwIC0gcGF0KSAtCisJCQkJCSAgICAoKnBhdCA9PSAnXicpKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJb2Zmc2V0ID0geF9zZWFyY2gocGF0LCAwLCBvZmZzZXQpOworCQl9IGVsc2UgaWYgKGYgPT0gWEZVTkNfYWJvcnQpIHsKKwkJCWlmIChvZmZzZXQgPj0gMCkKKwkJCQl4X2xvYWRfaGlzdChoaXN0cHRyICsgMSk7CisJCQlicmVhazsKKwkJfSBlbHNlIHsgLyogb3RoZXIgY29tbWFuZCAqLworCQkJeF9lX3VuZ2V0YyhjKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvZmZzZXQgPCAwKQorCQl4X3JlZHJhdygtMSk7CisJcmV0dXJuIChLU1REKTsKK30KKworLyogc2VhcmNoIGJhY2t3YXJkIGZyb20gY3VycmVudCBsaW5lICovCitzdGF0aWMgaW50Cit4X3NlYXJjaChjaGFyICpwYXQsIGludCBzYW1lbGluZSwgaW50IG9mZnNldCkKK3sKKwljaGFyICoqaHA7CisJaW50IGk7CisKKwlmb3IgKGhwID0geF9oaXN0cCAtIChzYW1lbGluZSA/IDAgOiAxKTsgaHAgPj0gaGlzdG9yeTsgLS1ocCkgeworCQlpID0geF9tYXRjaCgqaHAsIHBhdCk7CisJCWlmIChpID49IDApIHsKKwkJCWlmIChvZmZzZXQgPCAwKQorCQkJCXhfZV9wdXRjMignXG4nKTsKKwkJCXhfbG9hZF9oaXN0KGhwKTsKKwkJCXhfZ290byh4YnVmICsgaSArIHN0cmxlbihwYXQpIC0gKCpwYXQgPT0gJ14nKSk7CisJCQlyZXR1cm4gKGkpOworCQl9CisJfQorCXhfZV9wdXRjMig3KTsKKwl4X2hpc3RwID0gaGlzdHB0cjsKKwlyZXR1cm4gKC0xKTsKK30KKworI2lmbmRlZiBNS1NIX1NNQUxMCisvKiBhbmNob3JlZCBzZWFyY2ggdXAgZnJvbSBjdXJyZW50IGxpbmUgKi8KK3N0YXRpYyBpbnQKK3hfc2VhcmNoX2hpc3RfdXAoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKHhfc2VhcmNoX2RpcigtMSkpOworfQorCisvKiBhbmNob3JlZCBzZWFyY2ggZG93biBmcm9tIGN1cnJlbnQgbGluZSAqLworc3RhdGljIGludAoreF9zZWFyY2hfaGlzdF9kbihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoeF9zZWFyY2hfZGlyKDEpKTsKK30KKworLyogYW5jaG9yZWQgc2VhcmNoIGluIHRoZSBpbmRpY2F0ZWQgZGlyZWN0aW9uICovCitzdGF0aWMgaW50Cit4X3NlYXJjaF9kaXIoaW50IHNlYXJjaF9kaXIgLyogc2hvdWxkJ3ZlIGJlZW4gYm9vbCAqLykKK3sKKwljaGFyICoqaHAgPSB4X2hpc3RwICsgc2VhcmNoX2RpcjsKKwlzaXplX3QgY3VycyA9IHhjcCAtIHhidWY7CisKKwl3aGlsZSAoaGlzdHB0ciA+PSBocCAmJiBocCA+PSBoaXN0b3J5KSB7CisJCWlmIChzdHJuY21wKHhidWYsICpocCwgY3VycykgPT0gMCkgeworCQkJeF9sb2FkX2hpc3QoaHApOworCQkJeF9nb3RvKHhidWYgKyBjdXJzKTsKKwkJCWJyZWFrOworCQl9CisJCWhwICs9IHNlYXJjaF9kaXI7CisJfQorCXJldHVybiAoS1NURCk7Cit9CisjZW5kaWYKKworLyogcmV0dXJuIHBvc2l0aW9uIG9mIGZpcnN0IG1hdGNoIG9mIHBhdHRlcm4gaW4gc3RyaW5nLCBlbHNlIC0xICovCitzdGF0aWMgaW50Cit4X21hdGNoKGNoYXIgKnN0ciwgY2hhciAqcGF0KQoreworCWlmICgqcGF0ID09ICdeJykgeworCQlyZXR1cm4gKChzdHJuY21wKHN0ciwgcGF0ICsgMSwgc3RybGVuKHBhdCArIDEpKSA9PSAwKSA/IDAgOiAtMSk7CisJfSBlbHNlIHsKKwkJY2hhciAqcSA9IHN0cnN0cihzdHIsIHBhdCk7CisJCXJldHVybiAoKHEgPT0gTlVMTCkgPyAtMSA6IHEgLSBzdHIpOworCX0KK30KKworc3RhdGljIGludAoreF9kZWxfbGluZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWludCBpLCBqOworCisJKnhlcCA9IDA7CisJaSA9IHhlcCAtIHhidWY7CisJaiA9IHhfc2l6ZV9zdHIoeGJ1Zik7CisJeGNwID0geGJ1ZjsKKwl4X3B1c2goaSk7CisJeGxwID0geGJwID0geGVwID0geGJ1ZjsKKwl4bHBfdmFsaWQgPSB0cnVlOworCSp4Y3AgPSAwOworCXhtcCA9IE5VTEw7CisJeF9yZWRyYXcoaik7CisJeF9tb2RpZmllZCgpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbXZfZW5kKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9nb3RvKHhlcCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tdl9iZWdpbihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfZ290byh4YnVmKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2RyYXdfbGluZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfcmVkcmF3KC0xKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2VfcmVidWlsZGxpbmUoY29uc3QgY2hhciAqY2xyc3RyKQoreworCXNoZl9wdXRzKGNscnN0ciwgc2hsX291dCk7CisJeF9hZGp1c3QoKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2NscyhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoeF9lX3JlYnVpbGRsaW5lKE1LU0hfQ0xTX1NUUklORykpOworfQorCisvKiBSZWRyYXcgKHBhcnQgb2YpIHRoZSBsaW5lLiBJZiBsaW1pdCBpcyA8IDAsIHRoZSBldmVyeXRoaW5nIGlzIHJlZHJhd24KKyAqIG9uIGEgTkVXIGxpbmUsIG90aGVyd2lzZSBsaW1pdCBpcyB0aGUgc2NyZWVuIGNvbHVtbiB1cCB0byB3aGljaCBuZWVkcworICogcmVkcmF3aW5nLgorICovCitzdGF0aWMgdm9pZAoreF9yZWRyYXcoaW50IGxpbWl0KQoreworCWludCBpLCBqLCB4X3RydW5jID0gMDsKKwljaGFyICpjcDsKKworCXhfYWRqX29rID0gMDsKKwlpZiAobGltaXQgPT0gLTEpCisJCXhfZV9wdXRjMignXG4nKTsKKwllbHNlCisJCXhfZV9wdXRjMignXHInKTsKKwl4X2ZsdXNoKCk7CisJaWYgKHhicCA9PSB4YnVmKSB7CisJCXhfY29sID0gcHJvbXB0bGVuKHByb21wdCk7CisJCWlmICh4X2NvbCA+PSB4eF9jb2xzKQorCQkJeF90cnVuYyA9ICh4X2NvbCAvIHh4X2NvbHMpICogeHhfY29sczsKKwkJaWYgKHByb21wdF9yZWRyYXcpCisJCQlwcHJvbXB0KHByb21wdCwgeF90cnVuYyk7CisJfQorCWlmICh4X2NvbCA+PSB4eF9jb2xzKQorCQl4X2NvbCAlPSB4eF9jb2xzOworCXhfZGlzcGxlbiA9IHh4X2NvbHMgLSAyIC0geF9jb2w7CisJaWYgKHhfZGlzcGxlbiA8IDEpIHsKKwkJeF9jb2wgPSAwOworCQl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMjsKKwl9CisJeGxwX3ZhbGlkID0gZmFsc2U7CisJeF9sYXN0Y3AoKTsKKwl4X3pvdHMoeGJwKTsKKwlpZiAoeGJwICE9IHhidWYgfHwgeGVwID4geGxwKQorCQlsaW1pdCA9IHh4X2NvbHM7CisJaWYgKGxpbWl0ID49IDApIHsKKwkJaWYgKHhlcCA+IHhscCkKKwkJCWkgPSAwOwkJCS8qIHdlIGZpbGwgdGhlIGxpbmUgKi8KKwkJZWxzZSB7CisJCQljaGFyICpjcGwgPSB4YnA7CisKKwkJCWkgPSBsaW1pdDsKKwkJCXdoaWxlIChjcGwgPCB4bHApCisJCQkJaSAtPSB4X3NpemUyKGNwbCwgJmNwbCk7CisJCX0KKworCQlqID0gMDsKKwkJd2hpbGUgKChqIDwgaSkgfHwgKHhfY29sIDwgKHh4X2NvbHMgLSAyKSkpIHsKKwkJCWlmICghKHhfY29sIDwgKHh4X2NvbHMgLSAyKSkpCisJCQkJYnJlYWs7CisJCQl4X2VfcHV0YzIoJyAnKTsKKwkJCWorKzsKKwkJfQorCQlpID0gJyAnOworCQlpZiAoeGVwID4geGxwKSB7CQkvKiBtb3JlIG9mZiBzY3JlZW4gKi8KKwkJCWlmICh4YnAgPiB4YnVmKQorCQkJCWkgPSAnKic7CisJCQllbHNlCisJCQkJaSA9ICc+JzsKKwkJfSBlbHNlIGlmICh4YnAgPiB4YnVmKQorCQkJaSA9ICc8JzsKKwkJeF9lX3B1dGMyKGkpOworCQlqKys7CisJCXdoaWxlIChqLS0pCisJCQl4X2VfcHV0YzIoJ1xiJyk7CisJfQorCWNwID0geGxwOworCXdoaWxlIChjcCA+IHhjcCkKKwkJeF9iczMoJmNwKTsKKwl4X2Fkal9vayA9IDE7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50Cit4X3RyYW5zcG9zZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXVuc2lnbmVkIGludCB0bXBhLCB0bXBiOworCisJLyogV2hhdCB0cmFuc3Bvc2UgaXMgbWVhbnQgdG8gZG8gc2VlbXMgdG8gYmUgdXAgZm9yIGRlYmF0ZS4gVGhpcworCSAqIGlzIGEgZ2VuZXJhbCBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zOyB0aGUgdGV4dCBpcyBhYmNkIHdpdGggdGhlCisJICogdXBwZXIgY2FzZSBjaGFyYWN0ZXIgb3IgdW5kZXJzY29yZSBpbmRpY2F0aW5nIHRoZSBjdXJzb3IgcG9zaXRpb246CisJICoJV2hvCQkJQmVmb3JlCUFmdGVyCUJlZm9yZQlBZnRlcgorCSAqCUFUJlQga3NoIGluIGVtYWNzIG1vZGU6CWFiQ2QJYWJkQwlhYmNkXwkoYmVsbCkKKwkgKglBVCZUIGtzaCBpbiBnbWFjcyBtb2RlOglhYkNkCWJhQ2QJYWJjZF8JYWJkY18KKwkgKglnbnUgZW1hY3M6CQlhYkNkCWFjYkQJYWJjZF8JYWJkY18KKwkgKiBQZGtzaCBjdXJyZW50bHkgZ29lcyB3aXRoIEdOVSBiZWhhdmlvciBzaW5jZSBJIGJlbGlldmUgdGhpcyBpcyB0aGUKKwkgKiBtb3N0IGNvbW1vbiB2ZXJzaW9uIG9mIGVtYWNzLCB1bmxlc3MgaW4gZ21hY3MgbW9kZSwgaW4gd2hpY2ggY2FzZQorCSAqIGl0IGRvZXMgdGhlIEFUJlQga3NoIGdtYWNzIG1vZGUuCisJICogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGJyb2tlbiB1cCBpbnRvIDMgZnVuY3Rpb25zIHNvIHVzZXJzIGNhbiBiaW5kCisJICogdG8gdGhlIG9uZSB0aGV5IHdhbnQuCisJICovCisJaWYgKHhjcCA9PSB4YnVmKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9IGVsc2UgaWYgKHhjcCA9PSB4ZXAgfHwgRmxhZyhGR01BQ1MpKSB7CisJCWlmICh4Y3AgLSB4YnVmID09IDEpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwkJLyogR29zbGluZy9VbmlwcmVzcyBlbWFjcyBzdHlsZTogU3dhcCB0d28gY2hhcmFjdGVycyBiZWZvcmUgdGhlCisJCSAqIGN1cnNvciwgZG8gbm90IGNoYW5nZSBjdXJzb3IgcG9zaXRpb24KKwkJICovCisJCXhfYnMzKCZ4Y3ApOworCQlpZiAodXRmX21idG93YygmdG1wYSwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJCXhfYnMzKCZ4Y3ApOworCQlpZiAodXRmX21idG93YygmdG1wYiwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJCXV0Zl93Y3RvbWIoeGNwLCB0bXBhKTsKKwkJeF96b3RjMygmeGNwKTsKKwkJdXRmX3djdG9tYih4Y3AsIHRtcGIpOworCQl4X3pvdGMzKCZ4Y3ApOworCX0gZWxzZSB7CisJCS8qIEdOVSBlbWFjcyBzdHlsZTogU3dhcCB0aGUgY2hhcmFjdGVycyBiZWZvcmUgYW5kIHVuZGVyIHRoZQorCQkgKiBjdXJzb3IsIG1vdmUgY3Vyc29yIHBvc2l0aW9uIGFsb25nIG9uZS4KKwkJICovCisJCWlmICh1dGZfbWJ0b3djKCZ0bXBhLCB4Y3ApID09IChzaXplX3QpLTEpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwkJeF9iczMoJnhjcCk7CisJCWlmICh1dGZfbWJ0b3djKCZ0bXBiLCB4Y3ApID09IChzaXplX3QpLTEpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwkJdXRmX3djdG9tYih4Y3AsIHRtcGEpOworCQl4X3pvdGMzKCZ4Y3ApOworCQl1dGZfd2N0b21iKHhjcCwgdG1wYik7CisJCXhfem90YzMoJnhjcCk7CisJfQorCXhfbW9kaWZpZWQoKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2xpdGVyYWwoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2N1cnByZWZpeCA9IC0xOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbWV0YTEoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2N1cnByZWZpeCA9IDE7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9tZXRhMihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfY3VycHJlZml4ID0gMjsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2tpbGwoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgY29sID0geGNwIC0geGJ1ZjsKKwlpbnQgbGFzdGNvbCA9IHhlcCAtIHhidWY7CisJaW50IG5kZWw7CisKKwlpZiAoeF9hcmdfZGVmYXVsdGVkKQorCQl4X2FyZyA9IGxhc3Rjb2w7CisJZWxzZSBpZiAoeF9hcmcgPiBsYXN0Y29sKQorCQl4X2FyZyA9IGxhc3Rjb2w7CisJbmRlbCA9IHhfYXJnIC0gY29sOworCWlmIChuZGVsIDwgMCkgeworCQl4X2dvdG8oeGJ1ZiArIHhfYXJnKTsKKwkJbmRlbCA9IC1uZGVsOworCX0KKwl4X2RlbGV0ZShuZGVsLCB0cnVlKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgdm9pZAoreF9wdXNoKGludCBuY2hhcnMpCit7CisJY2hhciAqY3A7CisKKwlzdHJuZHVweChjcCwgeGNwLCBuY2hhcnMsIEFFRElUKTsKKwlpZiAoa2lsbHN0YWNrW2tpbGxzcF0pCisJCWFmcmVlKGtpbGxzdGFja1traWxsc3BdLCBBRURJVCk7CisJa2lsbHN0YWNrW2tpbGxzcF0gPSBjcDsKKwlraWxsc3AgPSAoa2lsbHNwICsgMSkgJSBLSUxMU0laRTsKK30KKworc3RhdGljIGludAoreF95YW5rKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaWYgKGtpbGxzcCA9PSAwKQorCQlraWxsdHAgPSBLSUxMU0laRTsKKwllbHNlCisJCWtpbGx0cCA9IGtpbGxzcDsKKwlraWxsdHAtLTsKKwlpZiAoa2lsbHN0YWNrW2tpbGx0cF0gPT0gMCkgeworCQl4X2VfcHV0cygiXG5ub3RoaW5nIHRvIHlhbmsiKTsKKwkJeF9yZWRyYXcoLTEpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl4bXAgPSB4Y3A7CisJeF9pbnMoa2lsbHN0YWNrW2tpbGx0cF0pOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbWV0YV95YW5rKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IGxlbjsKKworCWlmICgoeF9sYXN0X2NvbW1hbmQgIT0gWEZVTkNfeWFuayAmJiB4X2xhc3RfY29tbWFuZCAhPSBYRlVOQ19tZXRhX3lhbmspIHx8CisJICAgIGtpbGxzdGFja1traWxsdHBdID09IDApIHsKKwkJa2lsbHRwID0ga2lsbHNwOworCQl4X2VfcHV0cygiXG55YW5rIHNvbWV0aGluZyBmaXJzdCIpOworCQl4X3JlZHJhdygtMSk7CisJCXJldHVybiAoS1NURCk7CisJfQorCWxlbiA9IHN0cmxlbihraWxsc3RhY2tba2lsbHRwXSk7CisJeF9nb3RvKHhjcCAtIGxlbik7CisJeF9kZWxldGUobGVuLCBmYWxzZSk7CisJZG8geworCQlpZiAoa2lsbHRwID09IDApCisJCQlraWxsdHAgPSBLSUxMU0laRSAtIDE7CisJCWVsc2UKKwkJCWtpbGx0cC0tOworCX0gd2hpbGUgKGtpbGxzdGFja1traWxsdHBdID09IDApOworCXhfaW5zKGtpbGxzdGFja1traWxsdHBdKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2Fib3J0KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJLyogeF96b3RjKGMpOyAqLworCXhscCA9IHhlcCA9IHhjcCA9IHhicCA9IHhidWY7CisJeGxwX3ZhbGlkID0gdHJ1ZTsKKwkqeGNwID0gMDsKKwl4X21vZGlmaWVkKCk7CisJcmV0dXJuIChLSU5UUik7Cit9CisKK3N0YXRpYyBpbnQKK3hfZXJyb3IoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2VfcHV0YzIoNyk7CisJcmV0dXJuIChLU1REKTsKK30KKworI2lmbmRlZiBNS1NIX1NNQUxMCisvKiBzcGVjaWFsIFZUMTAwIHN0eWxlIGtleSBzZXF1ZW5jZSBoYWNrICovCitzdGF0aWMgaW50Cit4X3Z0X2hhY2soaW50IGMpCit7CisJLyogd2Ugb25seSBzdXBwb3J0IFBGMi0nMScgZm9yIG5vdyAqLworCWlmIChjICE9ICgyIDw8IDggfCAnMScpKQorCQlyZXR1cm4gKHhfZXJyb3IoYykpOworCisJLyogd2hhdCdzIHRoZSBuZXh0IGNoYXJhY3Rlcj8gKi8KKwlzd2l0Y2ggKChjID0geF9lX2dldGMoKSkpIHsKKwljYXNlICd+JzoKKwkJeF9hcmcgPSAxOworCQl4X2FyZ19kZWZhdWx0ZWQgPSAxOworCQlyZXR1cm4gKHhfbXZfYmVnaW4oMCkpOworCWNhc2UgJzsnOgorCQkvKiAiaW50ZXJlc3RpbmciIHNlcXVlbmNlIGRldGVjdGVkICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gdW53aW5kX2VycjsKKwl9CisKKwkvKiBYWFggeF9lX3VuZ2V0YyBpcyBvbmUtb2N0ZXQgb25seSAqLworCWlmICgoYyA9IHhfZV9nZXRjKCkpICE9ICc1JyAmJiBjICE9ICczJykKKwkJZ290byB1bndpbmRfZXJyOworCisJLyotCisJICogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSByZWFkIHRoZSBmb2xsb3dpbmcgb2N0ZXRzIHNvIGZhcjoKKwkgKiAtIEVTQytbIG9yIEVTQytPIG9yIEN0cmwtWCAoUHLDpmZpeCAyKQorCSAqIC0gMSAodnRfaGFjaykKKwkgKiAtIDsKKwkgKiAtIDUgKEN0cmwga2V5IGNvbWJpbmVyKSBvciAzIChBbHQga2V5IGNvbWJpbmVyKQorCSAqIFdlIGNhbiBub3cgYWNjZXB0IG9uZSBtb3JlIG9jdGV0IGRlc2lnbmF0aW5nIHRoZSBrZXkuCisJICovCisKKwlzd2l0Y2ggKChjID0geF9lX2dldGMoKSkpIHsKKwljYXNlICdDJzoKKwkJcmV0dXJuICh4X212X2Z3b3JkKGMpKTsKKwljYXNlICdEJzoKKwkJcmV0dXJuICh4X212X2J3b3JkKGMpKTsKKwl9CisKKyB1bndpbmRfZXJyOgorCXhfZV91bmdldGMoYyk7CisJcmV0dXJuICh4X2Vycm9yKGMpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY2hhciAqCit4X21hcGluKGNvbnN0IGNoYXIgKmNwLCBBcmVhICphcCkKK3sKKwljaGFyICpuZXdzLCAqb3A7CisKKwkvKiBmb3IgY2xhbmcncyBzdGF0aWMgYW5hbHlzZXIsIHRoZSBub25udWxsIGF0dHJpYnV0ZSBpc24ndCBlbm91Z2ggKi8KKwlta3NzZXJ0KGNwICE9IE5VTEwpOworCisJc3RyZHVweChuZXdzLCBjcCwgYXApOworCW9wID0gbmV3czsKKwl3aGlsZSAoKmNwKSB7CisJCS8qIFhYWCAtLSBzaG91bGQgaGFuZGxlIFxeIGVzY2FwZT8gKi8KKwkJaWYgKCpjcCA9PSAnXicpIHsKKwkJCWNwKys7CisJCQlpZiAoKmNwID49ICc/JykJLyogaW5jbHVkZXMgJz8nOyBBU0NJSSAqLworCQkJCSpvcCsrID0gQ1RSTCgqY3ApOworCQkJZWxzZSB7CisJCQkJKm9wKysgPSAnXic7CisJCQkJY3AtLTsKKwkJCX0KKwkJfSBlbHNlCisJCQkqb3ArKyA9ICpjcDsKKwkJY3ArKzsKKwl9CisJKm9wID0gJ1wwJzsKKworCXJldHVybiAobmV3cyk7Cit9CisKK3N0YXRpYyB2b2lkCit4X21hcG91dDIoaW50IGMsIGNoYXIgKipidWYpCit7CisJY2hhciAqcCA9ICpidWY7CisKKwlpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKKwkJKnArKyA9ICdeJzsKKwkJKnArKyA9IFVOQ1RSTChjKTsKKwl9IGVsc2UKKwkJKnArKyA9IGM7CisJKnAgPSAwOworCSpidWYgPSBwOworfQorCitzdGF0aWMgY2hhciAqCit4X21hcG91dChpbnQgYykKK3sKKwlzdGF0aWMgY2hhciBidWZbOF07CisJY2hhciAqYnAgPSBidWY7CisKKwl4X21hcG91dDIoYywgJmJwKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCit4X3ByaW50KGludCBwcmVmaXgsIGludCBrZXkpCit7CisJaW50IGYgPSB4X3RhYltwcmVmaXhdW2tleV07CisKKwlpZiAocHJlZml4KQorCQkvKiBwcmVmaXggPT0gMSB8fCBwcmVmaXggPT0gMiAqLworCQlzaGZfcHV0cyh4X21hcG91dChwcmVmaXggPT0gMSA/CisJCSAgICBDVFJMKCdbJykgOiBDVFJMKCdYJykpLCBzaGxfc3Rkb3V0KTsKKyNpZmRlZiBNS1NIX1NNQUxMCisJc2hwcmludGYoIiVzID0gIiwgeF9tYXBvdXQoa2V5KSk7CisjZWxzZQorCXNocHJpbnRmKCIlcyVzID0gIiwgeF9tYXBvdXQoa2V5KSwgKGYgJiAweDgwKSA/ICJ+IiA6ICIiKTsKKwlpZiAoWEZVTkNfVkFMVUUoZikgIT0gWEZVTkNfaW5zX3N0cmluZykKKyNlbmRpZgorCQlzaHByaW50ZigiJXNcbiIsIHhfZnRhYltYRlVOQ19WQUxVRShmKV0ueGZfbmFtZSk7CisjaWZuZGVmIE1LU0hfU01BTEwKKwllbHNlCisJCXNocHJpbnRmKCInJXMnXG4iLCB4X2F0YWJbcHJlZml4XVtrZXldKTsKKyNlbmRpZgorfQorCitpbnQKK3hfYmluZChjb25zdCBjaGFyICphMSwgY29uc3QgY2hhciAqYTIsCisjaWZuZGVmIE1LU0hfU01BTEwKKyAgICBib29sIG1hY3JvLAkJCS8qIGJpbmQgLW0gKi8KKyNlbmRpZgorICAgIGJvb2wgbGlzdCkJCQkvKiBiaW5kIC1sICovCit7CisJdW5zaWduZWQgY2hhciBmOworCWludCBwcmVmaXgsIGtleTsKKwljaGFyICptMSwgKm0yOworI2lmbmRlZiBNS1NIX1NNQUxMCisJY2hhciAqc3AgPSBOVUxMOworCWJvb2wgaGFzdGlsZGU7CisjZW5kaWYKKworCWlmICh4X3RhYiA9PSBOVUxMKSB7CisJCWJpX2Vycm9yZigiY2Fubm90IGJpbmQsIG5vdCBhIHR0eSIpOworCQlyZXR1cm4gKDEpOworCX0KKwkvKiBMaXN0IGZ1bmN0aW9uIG5hbWVzICovCisJaWYgKGxpc3QpIHsKKwkJZm9yIChmID0gMDsgZiA8IE5FTEVNKHhfZnRhYik7IGYrKykKKwkJCWlmICh4X2Z0YWJbZl0ueGZfbmFtZSAmJgorCQkJICAgICEoeF9mdGFiW2ZdLnhmX2ZsYWdzICYgWEZfTk9CSU5EKSkKKwkJCQlzaHByaW50ZigiJXNcbiIsIHhfZnRhYltmXS54Zl9uYW1lKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGExID09IE5VTEwpIHsKKwkJZm9yIChwcmVmaXggPSAwOyBwcmVmaXggPCBYX05UQUJTOyBwcmVmaXgrKykKKwkJCWZvciAoa2V5ID0gMDsga2V5IDwgWF9UQUJTWjsga2V5KyspIHsKKwkJCQlmID0gWEZVTkNfVkFMVUUoeF90YWJbcHJlZml4XVtrZXldKTsKKwkJCQlpZiAoZiA9PSBYRlVOQ19pbnNlcnQgfHwgZiA9PSBYRlVOQ19lcnJvcgorI2lmbmRlZiBNS1NIX1NNQUxMCisJCQkJICAgIHx8IChtYWNybyAmJiBmICE9IFhGVU5DX2luc19zdHJpbmcpCisjZW5kaWYKKwkJCQkgICAgKQorCQkJCQljb250aW51ZTsKKwkJCQl4X3ByaW50KHByZWZpeCwga2V5KTsKKwkJCX0KKwkJcmV0dXJuICgwKTsKKwl9CisJbTIgPSBtMSA9IHhfbWFwaW4oYTEsIEFURU1QKTsKKwlwcmVmaXggPSAwOworCWZvciAoOzsgbTErKykgeworCQlrZXkgPSAodW5zaWduZWQgY2hhcikqbTE7CisJCWYgPSBYRlVOQ19WQUxVRSh4X3RhYltwcmVmaXhdW2tleV0pOworCQlpZiAoZiA9PSBYRlVOQ19tZXRhMSkKKwkJCXByZWZpeCA9IDE7CisJCWVsc2UgaWYgKGYgPT0gWEZVTkNfbWV0YTIpCisJCQlwcmVmaXggPSAyOworCQllbHNlCisJCQlicmVhazsKKwl9CisJaWYgKCorK20xCisjaWZuZGVmIE1LU0hfU01BTEwKKwkgICAgJiYgKCgqbTEgIT0gJ34nKSB8fCAqKG0xICsgMSkpCisjZW5kaWYKKwkgICAgKSB7CisJCWNoYXIgbXNnWzI1Nl0gPSAia2V5IHNlcXVlbmNlICciOworCQljb25zdCBjaGFyICpjID0gYTE7CisJCW0xID0gbXNnICsgc3RybGVuKG1zZyk7CisJCXdoaWxlICgqYyAmJiBtMSA8IChtc2cgKyBzaXplb2YobXNnKSAtIDMpKQorCQkJeF9tYXBvdXQyKCpjKyssICZtMSk7CisJCWJpX2Vycm9yZigiJXMnIHRvbyBsb25nIiwgbXNnKTsKKwkJcmV0dXJuICgxKTsKKwl9CisjaWZuZGVmIE1LU0hfU01BTEwKKwloYXN0aWxkZSA9ICptMTsKKyNlbmRpZgorCWFmcmVlKG0yLCBBVEVNUCk7CisKKwlpZiAoYTIgPT0gTlVMTCkgeworCQl4X3ByaW50KHByZWZpeCwga2V5KTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKCphMiA9PSAwKSB7CisJCWYgPSBYRlVOQ19pbnNlcnQ7CisjaWZuZGVmIE1LU0hfU01BTEwKKwl9IGVsc2UgaWYgKG1hY3JvKSB7CisJCWYgPSBYRlVOQ19pbnNfc3RyaW5nOworCQlzcCA9IHhfbWFwaW4oYTIsIEFFRElUKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWZvciAoZiA9IDA7IGYgPCBORUxFTSh4X2Z0YWIpOyBmKyspCisJCQlpZiAoeF9mdGFiW2ZdLnhmX25hbWUgJiYKKwkJCSAgICBzdHJjbXAoeF9mdGFiW2ZdLnhmX25hbWUsIGEyKSA9PSAwKQorCQkJCWJyZWFrOworCQlpZiAoZiA9PSBORUxFTSh4X2Z0YWIpIHx8IHhfZnRhYltmXS54Zl9mbGFncyAmIFhGX05PQklORCkgeworCQkJYmlfZXJyb3JmKCIlczogbm8gc3VjaCBmdW5jdGlvbiIsIGEyKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWlmIChYRlVOQ19WQUxVRSh4X3RhYltwcmVmaXhdW2tleV0pID09IFhGVU5DX2luc19zdHJpbmcgJiYKKwkgICAgeF9hdGFiW3ByZWZpeF1ba2V5XSkKKwkJYWZyZWUoeF9hdGFiW3ByZWZpeF1ba2V5XSwgQUVESVQpOworI2VuZGlmCisJeF90YWJbcHJlZml4XVtrZXldID0gZgorI2lmbmRlZiBNS1NIX1NNQUxMCisJICAgIHwgKGhhc3RpbGRlID8gMHg4MCA6IDApCisjZW5kaWYKKwkgICAgOworI2lmbmRlZiBNS1NIX1NNQUxMCisJeF9hdGFiW3ByZWZpeF1ba2V5XSA9IHNwOworI2VuZGlmCisKKwkvKiBUcmFjayB3aGF0IHRoZSB1c2VyIGhhcyBib3VuZCBzbyB4X21vZGUodHJ1ZSkgd29uJ3QgdG9hc3QgdGhpbmdzICovCisJaWYgKGYgPT0gWEZVTkNfaW5zZXJ0KQorCQl4X2JvdW5kWyhwcmVmaXggKiBYX1RBQlNaICsga2V5KSAvIDhdICY9CisJCSAgICB+KDEgPDwgKChwcmVmaXggKiBYX1RBQlNaICsga2V5KSAlIDgpKTsKKwllbHNlCisJCXhfYm91bmRbKHByZWZpeCAqIFhfVEFCU1ogKyBrZXkpIC8gOF0gfD0KKwkJICAgICgxIDw8ICgocHJlZml4ICogWF9UQUJTWiArIGtleSkgJSA4KSk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAoreF9pbml0X2VtYWNzKHZvaWQpCit7CisJaW50IGksIGo7CisKKwlhaW5pdChBRURJVCk7CisJeF9uZXh0Y21kID0gLTE7CisKKwl4X3RhYiA9IGFsbG9jKFhfTlRBQlMgKiBzaXplb2YoKnhfdGFiKSwgQUVESVQpOworCWZvciAoaiA9IDA7IGogPCBYX1RBQlNaOyBqKyspCisJCXhfdGFiWzBdW2pdID0gWEZVTkNfaW5zZXJ0OworCWZvciAoaSA9IDE7IGkgPCBYX05UQUJTOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBYX1RBQlNaOyBqKyspCisJCQl4X3RhYltpXVtqXSA9IFhGVU5DX2Vycm9yOworCWZvciAoaSA9IDA7IGkgPCAoaW50KU5FTEVNKHhfZGVmYmluZGluZ3MpOyBpKyspCisJCXhfdGFiW3hfZGVmYmluZGluZ3NbaV0ueGRiX3RhYl1beF9kZWZiaW5kaW5nc1tpXS54ZGJfY2hhcl0KKwkJICAgID0geF9kZWZiaW5kaW5nc1tpXS54ZGJfZnVuYzsKKworI2lmbmRlZiBNS1NIX1NNQUxMCisJeF9hdGFiID0gYWxsb2MoWF9OVEFCUyAqIHNpemVvZigqeF9hdGFiKSwgQUVESVQpOworCWZvciAoaSA9IDE7IGkgPCBYX05UQUJTOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBYX1RBQlNaOyBqKyspCisJCQl4X2F0YWJbaV1bal0gPSBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitiaW5kX2lmX25vdF9ib3VuZChpbnQgcCwgaW50IGssIGludCBmdW5jKQoreworCS8qIEhhcyB1c2VyIGFscmVhZHkgYm91bmQgdGhpcyBrZXk/IElmIHNvLCBkb24ndCBvdmVycmlkZSBpdCAqLworCWlmICh4X2JvdW5kWygocCkgKiBYX1RBQlNaICsgKGspKSAvIDhdICYKKwkgICAgKDEgPDwgKCgocCkgKiBYX1RBQlNaICsgKGspKSAlIDgpKSkKKwkJcmV0dXJuOworCisJeF90YWJbcF1ba10gPSBmdW5jOworfQorCitzdGF0aWMgaW50Cit4X3NldF9tYXJrKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeG1wID0geGNwOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfa2lsbF9yZWdpb24oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgcnNpemU7CisJY2hhciAqeHI7CisKKwlpZiAoeG1wID09IE5VTEwpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwlpZiAoeG1wID4geGNwKSB7CisJCXJzaXplID0geG1wIC0geGNwOworCQl4ciA9IHhjcDsKKwl9IGVsc2UgeworCQlyc2l6ZSA9IHhjcCAtIHhtcDsKKwkJeHIgPSB4bXA7CisJfQorCXhfZ290byh4cik7CisJeF9kZWxldGUocnNpemUsIHRydWUpOworCXhtcCA9IHhyOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfeGNoZ19wb2ludF9tYXJrKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqdG1wOworCisJaWYgKHhtcCA9PSBOVUxMKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJdG1wID0geG1wOworCXhtcCA9IHhjcDsKKwl4X2dvdG8odG1wKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X25vb3AoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKEtTVEQpOworfQorCisvKgorICoJRmlsZS9jb21tYW5kIG5hbWUgY29tcGxldGlvbiByb3V0aW5lcworICovCitzdGF0aWMgaW50Cit4X2NvbXBfY29tbShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5ELCBDVF9DT01QTEVURSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9saXN0X2NvbW0oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORCwgQ1RfTElTVCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9jb21wbGV0ZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5EX0ZJTEUsIENUX0NPTVBMRVRFKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2VudW1lcmF0ZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5EX0ZJTEUsIENUX0xJU1QpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfY29tcF9maWxlKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJZG9fY29tcGxldGUoWENGX0ZJTEUsIENUX0NPTVBMRVRFKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2xpc3RfZmlsZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWRvX2NvbXBsZXRlKFhDRl9GSUxFLCBDVF9MSVNUKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2NvbXBfbGlzdChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWRvX2NvbXBsZXRlKFhDRl9DT01NQU5EX0ZJTEUsIENUX0NPTVBMSVNUKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2V4cGFuZChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKip3b3JkczsKKwlpbnQgc3RhcnQsIGVuZCwgbndvcmRzLCBpOworCWJvb2wgaXNfY29tbWFuZDsKKworCW53b3JkcyA9IHhfY2ZfZ2xvYihYQ0ZfRklMRSwgeGJ1ZiwgeGVwIC0geGJ1ZiwgeGNwIC0geGJ1ZiwKKwkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsICZpc19jb21tYW5kKTsKKworCWlmIChud29yZHMgPT0gMCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXhfZ290byh4YnVmICsgc3RhcnQpOworCXhfZGVsZXRlKGVuZCAtIHN0YXJ0LCBmYWxzZSk7CisJZm9yIChpID0gMDsgaSA8IG53b3JkczspIHsKKwkJaWYgKHhfZXNjYXBlKHdvcmRzW2ldLCBzdHJsZW4od29yZHNbaV0pLCB4X2RvX2lucykgPCAwIHx8CisJCSAgICAoKytpIDwgbndvcmRzICYmIHhfaW5zKCIgIikgPCAwKSkgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCX0KKwl4X2FkanVzdCgpOworCisJcmV0dXJuIChLU1REKTsKK30KKworLyogdHlwZSA9PSAwIGZvciBsaXN0LCAxIGZvciBjb21wbGV0ZSBhbmQgMiBmb3IgY29tcGxldGUtbGlzdCAqLworc3RhdGljIHZvaWQKK2RvX2NvbXBsZXRlKGludCBmbGFncywJLyogWENGX3tDT01NQU5ELEZJTEUsQ09NTUFORF9GSUxFfSAqLworICAgIENvbXBfdHlwZSB0eXBlKQoreworCWNoYXIgKip3b3JkczsKKwlpbnQgc3RhcnQsIGVuZCwgbmxlbiwgb2xlbiwgbndvcmRzOworCWJvb2wgaXNfY29tbWFuZCwgY29tcGxldGVkID0gZmFsc2U7CisKKwlud29yZHMgPSB4X2NmX2dsb2IoZmxhZ3MsIHhidWYsIHhlcCAtIHhidWYsIHhjcCAtIHhidWYsCisJICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCAmaXNfY29tbWFuZCk7CisJLyogbm8gbWF0Y2ggKi8KKwlpZiAobndvcmRzID09IDApIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm47CisJfQorCWlmICh0eXBlID09IENUX0xJU1QpIHsKKwkJeF9wcmludF9leHBhbnNpb25zKG53b3Jkcywgd29yZHMsIGlzX2NvbW1hbmQpOworCQl4X3JlZHJhdygwKTsKKwkJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOworCQlyZXR1cm47CisJfQorCW9sZW4gPSBlbmQgLSBzdGFydDsKKwlubGVuID0geF9sb25nZXN0X3ByZWZpeChud29yZHMsIHdvcmRzKTsKKwkvKiBjb21wbGV0ZSAqLworCWlmIChud29yZHMgPT0gMSB8fCBubGVuID4gb2xlbikgeworCQl4X2dvdG8oeGJ1ZiArIHN0YXJ0KTsKKwkJeF9kZWxldGUob2xlbiwgZmFsc2UpOworCQl4X2VzY2FwZSh3b3Jkc1swXSwgbmxlbiwgeF9kb19pbnMpOworCQl4X2FkanVzdCgpOworCQljb21wbGV0ZWQgPSB0cnVlOworCX0KKwkvKiBhZGQgc3BhY2UgaWYgc2luZ2xlIG5vbi1kaXIgbWF0Y2ggKi8KKwlpZiAobndvcmRzID09IDEgJiYgd29yZHNbMF1bbmxlbiAtIDFdICE9ICcvJykgeworCQl4X2lucygiICIpOworCQljb21wbGV0ZWQgPSB0cnVlOworCX0KKwlpZiAodHlwZSA9PSBDVF9DT01QTElTVCAmJiAhY29tcGxldGVkKSB7CisJCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKKwkJY29tcGxldGVkID0gdHJ1ZTsKKwl9CisJaWYgKGNvbXBsZXRlZCkKKwkJeF9yZWRyYXcoMCk7CisKKwl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7Cit9CisKKy8qIE5BTUU6CisgKgl4X2FkanVzdCAtIHJlZHJhdyB0aGUgbGluZSBhZGp1c3Rpbmcgc3RhcnRpbmcgcG9pbnQgZXRjLgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGV4Y2VlZGVkIHRoZSBib3VuZHMKKyAqCW9mIHRoZSBlZGl0IHdpbmRvdy4gSXQgaW5jcmVtZW50cyB4X2Fkal9kb25lIHNvIHRoYXQKKyAqCWZ1bmN0aW9ucyBsaWtlIHhfaW5zIGFuZCB4X2RlbGV0ZSBrbm93IHRoYXQgd2UgaGF2ZSBiZWVuCisgKgljYWxsZWQgYW5kIGNhbiBza2lwIHRoZSB4X2JzKCkgc3R1ZmYgd2hpY2ggaGFzIGFscmVhZHkKKyAqCWJlZW4gZG9uZSBieSB4X3JlZHJhdy4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKglOb25lCisgKi8KK3N0YXRpYyB2b2lkCit4X2FkanVzdCh2b2lkKQoreworCXhfYWRqX2RvbmUrKzsJCQkvKiBmbGFnIHRoZSBmYWN0IHRoYXQgd2Ugd2VyZSBjYWxsZWQuICovCisJLyoKKwkgKiB3ZSBoYWQgYSBwcm9ibGVtIGlmIHRoZSBwcm9tcHQgbGVuZ3RoID4geHhfY29scyAvIDIKKwkgKi8KKwlpZiAoKHhicCA9IHhjcCAtICh4X2Rpc3BsZW4gLyAyKSkgPCB4YnVmKQorCQl4YnAgPSB4YnVmOworCWlmIChVVEZNT0RFKQorCQl3aGlsZSAoKHhicCA+IHhidWYpICYmICgoKnhicCAmIDB4QzApID09IDB4ODApKQorCQkJLS14YnA7CisJeGxwX3ZhbGlkID0gZmFsc2U7CisJeF9yZWRyYXcoeHhfY29scyk7CisJeF9mbHVzaCgpOworfQorCitzdGF0aWMgdm9pZAoreF9lX3VuZ2V0YyhpbnQgYykKK3sKKwl1bmdldF9jaGFyID0gYyA8IDAgPyAtMSA6IChjICYgMjU1KTsKK30KKworc3RhdGljIGludAoreF9lX2dldGModm9pZCkKK3sKKwlpbnQgYzsKKworCWlmICh1bmdldF9jaGFyID49IDApIHsKKwkJYyA9IHVuZ2V0X2NoYXI7CisJCXVuZ2V0X2NoYXIgPSAtMTsKKwkJcmV0dXJuIChjKTsKKwl9CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWlmIChtYWNyb3B0cikgeworCQlpZiAoKGMgPSAodW5zaWduZWQgY2hhcikqbWFjcm9wdHIrKykpCisJCQlyZXR1cm4gKGMpOworCQltYWNyb3B0ciA9IE5VTEw7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKHhfZ2V0YygpKTsKK30KKworc3RhdGljIHZvaWQKK3hfZV9wdXRjMihpbnQgYykKK3sKKwlpbnQgd2lkdGggPSAxOworCisJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCisJCXhfY29sID0gMDsKKwlpZiAoeF9jb2wgPCB4eF9jb2xzKSB7CisJCWlmIChVVEZNT0RFICYmIChjID4gMHg3RikpIHsKKwkJCWNoYXIgdXRmX3RtcFszXTsKKwkJCXNpemVfdCB4OworCisJCQlpZiAoYyA8IDB4QTApCisJCQkJYyA9IDB4RkZGRDsKKwkJCXggPSB1dGZfd2N0b21iKHV0Zl90bXAsIGMpOworCQkJeF9wdXRjKHV0Zl90bXBbMF0pOworCQkJaWYgKHggPiAxKQorCQkJCXhfcHV0Yyh1dGZfdG1wWzFdKTsKKwkJCWlmICh4ID4gMikKKwkJCQl4X3B1dGModXRmX3RtcFsyXSk7CisJCQl3aWR0aCA9IHV0Zl93Y3dpZHRoKGMpOworCQl9IGVsc2UKKwkJCXhfcHV0YyhjKTsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgNzoKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCWNhc2UgJ1xuJzoKKwkJCWJyZWFrOworCQljYXNlICdcYic6CisJCQl4X2NvbC0tOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl4X2NvbCArPSB3aWR0aDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh4X2Fkal9vayAmJiAoeF9jb2wgPCAwIHx8IHhfY29sID49ICh4eF9jb2xzIC0gMikpKQorCQl4X2FkanVzdCgpOworfQorCitzdGF0aWMgdm9pZAoreF9lX3B1dGMzKGNvbnN0IGNoYXIgKipjcCkKK3sKKwlpbnQgd2lkdGggPSAxLCBjID0gKiooY29uc3QgdW5zaWduZWQgY2hhciAqKiljcDsKKworCWlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQorCQl4X2NvbCA9IDA7CisJaWYgKHhfY29sIDwgeHhfY29scykgeworCQlpZiAoVVRGTU9ERSAmJiAoYyA+IDB4N0YpKSB7CisJCQljaGFyICpjcDI7CisKKwkJCXdpZHRoID0gdXRmX3dpZHRoYWRqKCpjcCwgKGNvbnN0IGNoYXIgKiopJmNwMik7CisJCQl3aGlsZSAoKmNwIDwgY3AyKQorCQkJCXhfcHV0Y2YoKigqY3ApKyspOworCQl9IGVsc2UgeworCQkJKCpjcCkrKzsKKwkJCXhfcHV0YyhjKTsKKwkJfQorCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSA3OgorCQkJYnJlYWs7CisJCWNhc2UgJ1xyJzoKKwkJY2FzZSAnXG4nOgorCQkJYnJlYWs7CisJCWNhc2UgJ1xiJzoKKwkJCXhfY29sLS07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXhfY29sICs9IHdpZHRoOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHhfYWRqX29rICYmICh4X2NvbCA8IDAgfHwgeF9jb2wgPj0gKHh4X2NvbHMgLSAyKSkpCisJCXhfYWRqdXN0KCk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2VfcHV0cyhjb25zdCBjaGFyICpzKQoreworCWludCBhZGogPSB4X2Fkal9kb25lOworCisJd2hpbGUgKCpzICYmIGFkaiA9PSB4X2Fkal9kb25lKQorCQl4X2VfcHV0YzMoJnMpOworfQorCisvKiBOQU1FOgorICoJeF9zZXRfYXJnIC0gc2V0IGFuIGFyZyB2YWx1ZSBmb3IgbmV4dCBmdW5jdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBNLVswLTldLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqCUtTVEQKKyAqLworc3RhdGljIGludAoreF9zZXRfYXJnKGludCBjKQoreworCWludCBuID0gMCwgZmlyc3QgPSAxOworCisJYyAmPSAyNTU7CS8qIHN0cmlwIGNvbW1hbmQgcHJlZml4ICovCisJZm9yICg7IGMgPj0gMCAmJiBrc2hfaXNkaWdpdChjKTsgYyA9IHhfZV9nZXRjKCksIGZpcnN0ID0gMCkKKwkJbiA9IG4gKiAxMCArIChjIC0gJzAnKTsKKwlpZiAoYyA8IDAgfHwgZmlyc3QpIHsKKwkJeF9lX3B1dGMyKDcpOworCQl4X2FyZyA9IDE7CisJCXhfYXJnX2RlZmF1bHRlZCA9IDE7CisJfSBlbHNlIHsKKwkJeF9lX3VuZ2V0YyhjKTsKKwkJeF9hcmcgPSBuOworCQl4X2FyZ19kZWZhdWx0ZWQgPSAwOworCX0KKwlyZXR1cm4gKEtTVEQpOworfQorCisvKiBDb21tZW50IG9yIHVuY29tbWVudCB0aGUgY3VycmVudCBsaW5lLiAqLworc3RhdGljIGludAoreF9jb21tZW50KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IG9sZHNpemUgPSB4X3NpemVfc3RyKHhidWYpOworCWludCBsZW4gPSB4ZXAgLSB4YnVmOworCWludCByZXQgPSB4X2RvX2NvbW1lbnQoeGJ1ZiwgeGVuZCAtIHhidWYsICZsZW4pOworCisJaWYgKHJldCA8IDApCisJCXhfZV9wdXRjMig3KTsKKwllbHNlIHsKKwkJeF9tb2RpZmllZCgpOworCQl4ZXAgPSB4YnVmICsgbGVuOworCQkqeGVwID0gJ1wwJzsKKwkJeGNwID0geGJwID0geGJ1ZjsKKwkJeF9yZWRyYXcob2xkc2l6ZSk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0dXJuICh4X25ld2xpbmUoJ1xuJykpOworCX0KKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X3ZlcnNpb24oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICpvX3hidWYgPSB4YnVmLCAqb194ZW5kID0geGVuZDsKKwljaGFyICpvX3hicCA9IHhicCwgKm9feGVwID0geGVwLCAqb194Y3AgPSB4Y3A7CisJaW50IHZsZW4sIGxpbSA9IHhfbGFzdGNwKCkgLSB4YnA7CisJY2hhciAqdjsKKworCXN0cmR1cHgodiwgS1NIX1ZFUlNJT04sIEFURU1QKTsKKworCXhidWYgPSB4YnAgPSB4Y3AgPSB2OworCXhlbmQgPSB4ZXAgPSB2ICsgKHZsZW4gPSBzdHJsZW4odikpOworCXhfcmVkcmF3KGxpbSk7CisJeF9mbHVzaCgpOworCisJYyA9IHhfZV9nZXRjKCk7CisJeGJ1ZiA9IG9feGJ1ZjsKKwl4ZW5kID0gb194ZW5kOworCXhicCA9IG9feGJwOworCXhlcCA9IG9feGVwOworCXhjcCA9IG9feGNwOworCXhfcmVkcmF3KHZsZW4pOworCisJaWYgKGMgPCAwKQorCQlyZXR1cm4gKEtTVEQpOworCS8qIFRoaXMgaXMgd2hhdCBBVCZUIGtzaCBzZWVtcyB0byBkby4uLiBWZXJ5IGJpemFycmUgKi8KKwlpZiAoYyAhPSAnICcpCisJCXhfZV91bmdldGMoYyk7CisKKwlhZnJlZSh2LCBBVEVNUCk7CisJcmV0dXJuIChLU1REKTsKK30KKworI2lmbmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgaW50Cit4X2VkaXRfbGluZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWlmICh4X2FyZ19kZWZhdWx0ZWQpIHsKKwkJaWYgKHhlcCA9PSB4YnVmKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJCWlmIChtb2RpZmllZCkgeworCQkJKnhlcCA9ICdcMCc7CisJCQloaXN0c2F2ZSgmc291cmNlLT5saW5lLCB4YnVmLCB0cnVlLCB0cnVlKTsKKwkJCXhfYXJnID0gMDsKKwkJfSBlbHNlCisJCQl4X2FyZyA9IHNvdXJjZS0+bGluZSAtIChoaXN0cHRyIC0geF9oaXN0cCk7CisJfQorCWlmICh4X2FyZykKKwkJc2hmX3NucHJpbnRmKHhidWYsIHhlbmQgLSB4YnVmLCAiJXMgJWQiLAorCQkgICAgImZjIC1lICR7VklTVUFMOi0ke0VESVRPUjotdml9fSAtLSIsIHhfYXJnKTsKKwllbHNlCisJCXN0cmxjcHkoeGJ1ZiwgImZjIC1lICR7VklTVUFMOi0ke0VESVRPUjotdml9fSAtLSIsIHhlbmQgLSB4YnVmKTsKKwl4ZXAgPSB4YnVmICsgc3RybGVuKHhidWYpOworCXJldHVybiAoeF9uZXdsaW5lKCdcbicpKTsKK30KKyNlbmRpZgorCisvKiBOQU1FOgorICoJeF9wcmV2X2hpc3R3b3JkIC0gcmVjb3ZlciB3b3JkIGZyb20gcHJldiBjb21tYW5kCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIHJlY292ZXJzIHRoZSBsYXN0IHdvcmQgZnJvbSB0aGUgcHJldmlvdXMKKyAqCWNvbW1hbmQgYW5kIGluc2VydHMgaXQgaW50byB0aGUgY3VycmVudCBlZGl0IGxpbmUuIElmIGEKKyAqCW51bWVyaWMgYXJnIGlzIHN1cHBsaWVkIHRoZW4gdGhlIG4ndGggd29yZCBmcm9tIHRoZQorICoJc3RhcnQgb2YgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgdXNlZC4KKyAqCUFzIGEgc2lkZSBlZmZlY3QsIHRyYXNoZXMgdGhlIG1hcmsgaW4gb3JkZXIgdG8gYWNoaWV2ZQorICoJYmVpbmcgY2FsbGVkIGluIGEgcmVwZWF0YWJsZSBmYXNoaW9uLgorICoKKyAqCUJvdW5kIHRvIE0tLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqCUtTVEQKKyAqLworc3RhdGljIGludAoreF9wcmV2X2hpc3R3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqcmNwLCAqY3A7CisJY2hhciAqKnhocDsKKwlpbnQgbTsKKworCWlmICh4bXAgJiYgbW9kaWZpZWQgPiAxKQorCQl4X2tpbGxfcmVnaW9uKDApOworCW0gPSBtb2RpZmllZCA/IG1vZGlmaWVkIDogMTsKKwl4aHAgPSBoaXN0cHRyIC0gKG0gLSAxKTsKKwlpZiAoKHhocCA8IGhpc3RvcnkpIHx8ICEoY3AgPSAqeGhwKSkgeworCQl4X2VfcHV0YzIoNyk7CisJCXhfbW9kaWZpZWQoKTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJeF9zZXRfbWFyaygwKTsKKwlpZiAoeF9hcmdfZGVmYXVsdGVkKSB7CisJCXJjcCA9ICZjcFtzdHJsZW4oY3ApIC0gMV07CisJCS8qCisJCSAqIGlnbm9yZSB3aGl0ZS1zcGFjZSBhZnRlciB0aGUgbGFzdCB3b3JkCisJCSAqLworCQl3aGlsZSAocmNwID4gY3AgJiYgaXNfY2ZzKCpyY3ApKQorCQkJcmNwLS07CisJCXdoaWxlIChyY3AgPiBjcCAmJiAhaXNfY2ZzKCpyY3ApKQorCQkJcmNwLS07CisJCWlmIChpc19jZnMoKnJjcCkpCisJCQlyY3ArKzsKKwkJeF9pbnMocmNwKTsKKwl9IGVsc2UgeworCQljaGFyIGNoOworCisJCXJjcCA9IGNwOworCQkvKgorCQkgKiBpZ25vcmUgd2hpdGUtc3BhY2UgYXQgc3RhcnQgb2YgbGluZQorCQkgKi8KKwkJd2hpbGUgKCpyY3AgJiYgaXNfY2ZzKCpyY3ApKQorCQkJcmNwKys7CisJCXdoaWxlICh4X2FyZy0tID4gMSkgeworCQkJd2hpbGUgKCpyY3AgJiYgIWlzX2NmcygqcmNwKSkKKwkJCQlyY3ArKzsKKwkJCXdoaWxlICgqcmNwICYmIGlzX2NmcygqcmNwKSkKKwkJCQlyY3ArKzsKKwkJfQorCQljcCA9IHJjcDsKKwkJd2hpbGUgKCpyY3AgJiYgIWlzX2NmcygqcmNwKSkKKwkJCXJjcCsrOworCQljaCA9ICpyY3A7CisJCSpyY3AgPSAnXDAnOworCQl4X2lucyhjcCk7CisJCSpyY3AgPSBjaDsKKwl9CisJbW9kaWZpZWQgPSBtICsgMTsKKwlyZXR1cm4gKEtTVEQpOworfQorCisjaWZuZGVmIE1LU0hfU01BTEwKKy8qIFVwcGVyY2FzZSBOKDEpIHdvcmRzICovCitzdGF0aWMgaW50Cit4X2ZvbGRfdXBwZXIoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKHhfZm9sZF9jYXNlKCdVJykpOworfQorCisvKiBMb3dlcmNhc2UgTigxKSB3b3JkcyAqLworc3RhdGljIGludAoreF9mb2xkX2xvd2VyKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICh4X2ZvbGRfY2FzZSgnTCcpKTsKK30KKworLyogTG93ZXJjYXNlIE4oMSkgd29yZHMgKi8KK3N0YXRpYyBpbnQKK3hfZm9sZF9jYXBpdGFsaXNlKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICh4X2ZvbGRfY2FzZSgnQycpKTsKK30KKworLyogTkFNRToKKyAqCXhfZm9sZF9jYXNlIC0gY29udmVydCB3b3JkIHRvIFVQUEVSL2xvd2VyL0NhcGl0YWwgY2FzZQorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGltcGxlbWVudCBNLVUsTS11LE0tTCxNLWwsTS1DIGFuZCBNLWMKKyAqCXRvIFVQUEVSIGNhc2UsIGxvd2VyIGNhc2Ugb3IgQ2FwaXRhbGlzZSB3b3Jkcy4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKglOb25lCisgKi8KK3N0YXRpYyBpbnQKK3hfZm9sZF9jYXNlKGludCBjKQoreworCWNoYXIgKmNwID0geGNwOworCisJaWYgKGNwID09IHhlcCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXdoaWxlICh4X2FyZy0tKSB7CisJCS8qCisJCSAqIGZpcnN0IHNraXAgb3ZlciBhbnkgd2hpdGUtc3BhY2UKKwkJICovCisJCXdoaWxlIChjcCAhPSB4ZXAgJiYgaXNfbWZzKCpjcCkpCisJCQljcCsrOworCQkvKgorCQkgKiBkbyB0aGUgZmlyc3QgY2hhciBvbiBpdHMgb3duIHNpbmNlIGl0IG1heSBiZQorCQkgKiBhIGRpZmZlcmVudCBhY3Rpb24gdGhhbiBmb3IgdGhlIHJlc3QuCisJCSAqLworCQlpZiAoY3AgIT0geGVwKSB7CisJCQlpZiAoYyA9PSAnTCcpCQkvKiBsb3dlcmNhc2UgKi8KKwkJCQkqY3AgPSBrc2hfdG9sb3dlcigqY3ApOworCQkJZWxzZQkJCS8qIHVwcGVyY2FzZSwgY2FwaXRhbGlzZSAqLworCQkJCSpjcCA9IGtzaF90b3VwcGVyKCpjcCk7CisJCQljcCsrOworCQl9CisJCS8qCisJCSAqIG5vdyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHdvcmQKKwkJICovCisJCXdoaWxlIChjcCAhPSB4ZXAgJiYgIWlzX21mcygqY3ApKSB7CisJCQlpZiAoYyA9PSAnVScpCQkvKiB1cHBlcmNhc2UgKi8KKwkJCQkqY3AgPSBrc2hfdG91cHBlcigqY3ApOworCQkJZWxzZQkJCS8qIGxvd2VyY2FzZSwgY2FwaXRhbGlzZSAqLworCQkJCSpjcCA9IGtzaF90b2xvd2VyKCpjcCk7CisJCQljcCsrOworCQl9CisJfQorCXhfZ290byhjcCk7CisJeF9tb2RpZmllZCgpOworCXJldHVybiAoS1NURCk7Cit9CisjZW5kaWYKKworLyogTkFNRToKKyAqCXhfbGFzdGNwIC0gbGFzdCB2aXNpYmxlIGNoYXIKKyAqCisgKiBTWU5PUFNJUzoKKyAqCXhfbGFzdGNwKCkKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhhdCBjaGFyIGluIHRoZQorICoJZWRpdCBidWZmZXIgdGhhdCB3aWxsIGJlIHRoZSBsYXN0IGRpc3BsYXllZCBvbiB0aGUKKyAqCXNjcmVlbi4gVGhlIHNlcXVlbmNlOgorICoKKyAqCWNwID0geF9sYXN0Y3AoKTsKKyAqCXdoaWxlIChjcCA+IHhjcCkKKyAqCQl4X2JzMygmY3ApOworICoKKyAqCVdpbGwgcG9zaXRpb24gdGhlIGN1cnNvciBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbi4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKgljcCBvciBOVUxMCisgKi8KK3N0YXRpYyBjaGFyICoKK3hfbGFzdGNwKHZvaWQpCit7CisJaWYgKCF4bHBfdmFsaWQpIHsKKwkJaW50IGkgPSAwLCBqOworCQljaGFyICp4bHAyOworCisJCXhscCA9IHhicDsKKwkJd2hpbGUgKHhscCA8IHhlcCkgeworCQkJaiA9IHhfc2l6ZTIoeGxwLCAmeGxwMik7CisJCQlpZiAoKGkgKyBqKSA+IHhfZGlzcGxlbikKKwkJCQlicmVhazsKKwkJCWkgKz0gajsKKwkJCXhscCA9IHhscDI7CisJCX0KKwl9CisJeGxwX3ZhbGlkID0gdHJ1ZTsKKwlyZXR1cm4gKHhscCk7Cit9CisKK3N0YXRpYyBib29sCit4X21vZGUoYm9vbCBvbm9mZikKK3sKKwlzdGF0aWMgYm9vbCB4X2N1cl9tb2RlOworCWJvb2wgcHJldjsKKworCWlmICh4X2N1cl9tb2RlID09IG9ub2ZmKQorCQlyZXR1cm4gKHhfY3VyX21vZGUpOworCXByZXYgPSB4X2N1cl9tb2RlOworCXhfY3VyX21vZGUgPSBvbm9mZjsKKworCWlmIChvbm9mZikgeworCQlzdHJ1Y3QgdGVybWlvcyBjYjsKKworCQljYiA9IHR0eV9zdGF0ZTsKKworCQllZGNoYXJzLmVyYXNlID0gY2IuY19jY1tWRVJBU0VdOworCQllZGNoYXJzLmtpbGwgPSBjYi5jX2NjW1ZLSUxMXTsKKwkJZWRjaGFycy5pbnRyID0gY2IuY19jY1tWSU5UUl07CisJCWVkY2hhcnMucXVpdCA9IGNiLmNfY2NbVlFVSVRdOworCQllZGNoYXJzLmVvZiA9IGNiLmNfY2NbVkVPRl07CisjaWZkZWYgVldFUkFTRQorCQllZGNoYXJzLndlcmFzZSA9IGNiLmNfY2NbVldFUkFTRV07CisjZW5kaWYKKwkJY2IuY19pZmxhZyAmPSB+KElOTENSIHwgSUNSTkwpOworCQljYi5jX2xmbGFnICY9IH4oSVNJRyB8IElDQU5PTiB8IEVDSE8pOworI2lmIGRlZmluZWQoVkxORVhUKSAmJiBkZWZpbmVkKF9QT1NJWF9WRElTQUJMRSkKKwkJLyogb3NmLzEgcHJvY2Vzc2VzIGxuZXh0IHdoZW4gfmljYW5vbiAqLworCQljYi5jX2NjW1ZMTkVYVF0gPSBfUE9TSVhfVkRJU0FCTEU7CisjZW5kaWYKKwkJLyogc3Vub3MgNC4xLnggJiBvc2YvMSBwcm9jZXNzZXMgZGlzY2FyZChmbHVzaCkgd2hlbiB+aWNhbm9uICovCisjaWYgZGVmaW5lZChWRElTQ0FSRCkgJiYgZGVmaW5lZChfUE9TSVhfVkRJU0FCTEUpCisJCWNiLmNfY2NbVkRJU0NBUkRdID0gX1BPU0lYX1ZESVNBQkxFOworI2VuZGlmCisJCWNiLmNfY2NbVlRJTUVdID0gMDsKKwkJY2IuY19jY1tWTUlOXSA9IDE7CisKKwkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmY2IpOworCisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisJCS8qIENvbnZlcnQgdW5zZXQgdmFsdWVzIHRvIGludGVybmFsICd1bnNldCcgdmFsdWUgKi8KKwkJaWYgKGVkY2hhcnMuZXJhc2UgPT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJZWRjaGFycy5lcmFzZSA9IC0xOworCQlpZiAoZWRjaGFycy5raWxsID09IF9QT1NJWF9WRElTQUJMRSkKKwkJCWVkY2hhcnMua2lsbCA9IC0xOworCQlpZiAoZWRjaGFycy5pbnRyID09IF9QT1NJWF9WRElTQUJMRSkKKwkJCWVkY2hhcnMuaW50ciA9IC0xOworCQlpZiAoZWRjaGFycy5xdWl0ID09IF9QT1NJWF9WRElTQUJMRSkKKwkJCWVkY2hhcnMucXVpdCA9IC0xOworCQlpZiAoZWRjaGFycy5lb2YgPT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJZWRjaGFycy5lb2YgPSAtMTsKKwkJaWYgKGVkY2hhcnMud2VyYXNlID09IF9QT1NJWF9WRElTQUJMRSkKKwkJCWVkY2hhcnMud2VyYXNlID0gLTE7CisjZW5kaWYKKworCQlpZiAoZWRjaGFycy5lcmFzZSA+PSAwKSB7CisJCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLmVyYXNlLCBYRlVOQ19kZWxfYmFjayk7CisJCQliaW5kX2lmX25vdF9ib3VuZCgxLCBlZGNoYXJzLmVyYXNlLCBYRlVOQ19kZWxfYndvcmQpOworCQl9CisJCWlmIChlZGNoYXJzLmtpbGwgPj0gMCkKKwkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMua2lsbCwgWEZVTkNfZGVsX2xpbmUpOworCQlpZiAoZWRjaGFycy53ZXJhc2UgPj0gMCkKKwkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMud2VyYXNlLCBYRlVOQ19kZWxfYndvcmQpOworCQlpZiAoZWRjaGFycy5pbnRyID49IDApCisJCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLmludHIsIFhGVU5DX2Fib3J0KTsKKwkJaWYgKGVkY2hhcnMucXVpdCA+PSAwKQorCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy5xdWl0LCBYRlVOQ19ub29wKTsKKwl9IGVsc2UKKwkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKKworCXJldHVybiAocHJldik7Cit9CisKKyNpZiAhTUtTSF9TX05PVkkKKy8qICsrKyB2aSBlZGl0aW5nIG1vZGUgKysrICovCisKKyNkZWZpbmUgQ3RybChjKQkJKGMmMHgxZikKKworc3RydWN0IGVkc3RhdGUgeworCWNoYXIgKmNidWY7CisJaW50IHdpbmxlZnQ7CisJaW50IGNidWZzaXplOworCWludCBsaW5lbGVuOworCWludCBjdXJzb3I7Cit9OworCitzdGF0aWMgaW50IHZpX2hvb2soaW50KTsKK3N0YXRpYyBpbnQgbmV4dHN0YXRlKGludCk7CitzdGF0aWMgaW50IHZpX2luc2VydChpbnQpOworc3RhdGljIGludCB2aV9jbWQoaW50LCBjb25zdCBjaGFyICopOworc3RhdGljIGludCBkb21vdmUoaW50LCBjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IHJlZG9faW5zZXJ0KGludCk7CitzdGF0aWMgdm9pZCB5YW5rX3JhbmdlKGludCwgaW50KTsKK3N0YXRpYyBpbnQgYnJhY2t0eXBlKGludCk7CitzdGF0aWMgdm9pZCBzYXZlX2NidWYodm9pZCk7CitzdGF0aWMgdm9pZCByZXN0b3JlX2NidWYodm9pZCk7CitzdGF0aWMgaW50IHB1dGJ1Zihjb25zdCBjaGFyICosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIGRlbF9yYW5nZShpbnQsIGludCk7CitzdGF0aWMgaW50IGZpbmRjaChpbnQsIGludCwgaW50LCBpbnQpOworc3RhdGljIGludCBmb3J3d29yZChpbnQpOworc3RhdGljIGludCBiYWNrd29yZChpbnQpOworc3RhdGljIGludCBlbmR3b3JkKGludCk7CitzdGF0aWMgaW50IEZvcnd3b3JkKGludCk7CitzdGF0aWMgaW50IEJhY2t3b3JkKGludCk7CitzdGF0aWMgaW50IEVuZHdvcmQoaW50KTsKK3N0YXRpYyBpbnQgZ3JhYmhpc3QoaW50LCBpbnQpOworc3RhdGljIGludCBncmFic2VhcmNoKGludCwgaW50LCBpbnQsIGNoYXIgKik7CitzdGF0aWMgdm9pZCByZWRyYXdfbGluZShpbnQpOworc3RhdGljIHZvaWQgcmVmcmVzaChpbnQpOworc3RhdGljIGludCBvdXRvZndpbih2b2lkKTsKK3N0YXRpYyB2b2lkIHJld2luZG93KHZvaWQpOworc3RhdGljIGludCBuZXdjb2woaW50LCBpbnQpOworc3RhdGljIHZvaWQgZGlzcGxheShjaGFyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGVkX21vdl9vcHQoaW50LCBjaGFyICopOworc3RhdGljIGludCBleHBhbmRfd29yZChpbnQpOworc3RhdGljIGludCBjb21wbGV0ZV93b3JkKGludCwgaW50KTsKK3N0YXRpYyBpbnQgcHJpbnRfZXhwYW5zaW9ucyhzdHJ1Y3QgZWRzdGF0ZSAqLCBpbnQpOworI2RlZmluZSBjaGFyX2xlbihjKQkoKGMpIDwgJyAnIHx8IChjKSA9PSAweDdGID8gMiA6IDEpCitzdGF0aWMgdm9pZCB4X3ZpX3pvdGMoaW50KTsKK3N0YXRpYyB2b2lkIHZpX2Vycm9yKHZvaWQpOworc3RhdGljIHZvaWQgdmlfbWFjcm9fcmVzZXQodm9pZCk7CitzdGF0aWMgaW50IHhfdmlfcHV0YnVmKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKKworI2RlZmluZSBDXwkweDEJCS8qIGEgdmFsaWQgY29tbWFuZCB0aGF0IGlzbid0IGEgTV8sIEVfLCBVXyAqLworI2RlZmluZSBNXwkweDIJCS8qIG1vdmVtZW50IGNvbW1hbmQgKGgsIGwsIGV0Yy4pICovCisjZGVmaW5lIEVfCTB4NAkJLyogZXh0ZW5kZWQgY29tbWFuZCAoYywgZCwgeSkgKi8KKyNkZWZpbmUgWF8JMHg4CQkvKiBsb25nIGNvbW1hbmQgKEAsIGYsIEYsIHQsIFQsIGV0Yy4pICovCisjZGVmaW5lIFVfCTB4MTAJCS8qIGFuIFVOLXVuZG9hYmxlIGNvbW1hbmQgKHRoYXQgaXNuJ3QgYSBNXykgKi8KKyNkZWZpbmUgQl8JMHgyMAkJLyogYmFkIGNvbW1hbmQgKF5AKSAqLworI2RlZmluZSBaXwkweDQwCQkvKiByZXBlYXQgY291bnQgZGVmYXVsdHMgdG8gMCAobm90IDEpICovCisjZGVmaW5lIFNfCTB4ODAJCS8qIHNlYXJjaCAoLywgPykgKi8KKworI2RlZmluZSBpc19iYWQoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZCXykKKyNkZWZpbmUgaXNfY21kKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mKE1ffEVffENffFVfKSkKKyNkZWZpbmUgaXNfbW92ZShjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJk1fKQorI2RlZmluZSBpc19leHRlbmQoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZFXykKKyNkZWZpbmUgaXNfbG9uZyhjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJlhfKQorI2RlZmluZSBpc191bmRvYWJsZShjKQkoIShjbGFzc2lmeVsoYykmMHg3Zl0mVV8pKQorI2RlZmluZSBpc19zcmNoKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mU18pCisjZGVmaW5lIGlzX3plcm9jb3VudChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJlpfKQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjbGFzc2lmeVsxMjhdID0geworLyoJIDAJMQkyCTMJNAk1CTYJNwkqLworLyogMAleQAleQQleQgleQwleRAleRQleRgleRwkqLworCUJfLAkwLAkwLAkwLAkwLAlDX3xVXywJQ198Wl8sCTAsCisvKiAxCV5ICV5JCV5KCV5LCV5MCV5NCV5OCV5PCSovCisJTV8sCUNffFpfLAkwLAkwLAlDX3xVXywJMCwJQ18sCTAsCisvKiAyCV5QCV5RCV5SCV5TCV5UCV5VCV5WCV5XCSovCisJQ18sCTAsCUNffFVfLAkwLAkwLAkwLAlDXywJMCwKKy8qIDMJXlgJXlkJXloJXlsJXlwJXl0JXl4JXl8JKi8KKwlDXywJMCwJMCwJQ198Wl8sCTAsCTAsCTAsCTAsCisvKiA0CTxzcGFjZT4JIQkiCSMJJAklCSYJJwkqLworCU1fLAkwLAkwLAlDXywJTV8sCU1fLAkwLAkwLAorLyogNQkoCSkJKgkrCSwJLQkuCS8JKi8KKwkwLAkwLAlDXywJQ18sCU1fLAlDXywJMCwJQ198U18sCisvKiA2CTAJMQkyCTMJNAk1CTYJNwkqLworCU1fLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorLyogNwk4CTkJOgk7CTwJPQk+CT8JKi8KKwkwLAkwLAkwLAlNXywJMCwJQ18sCTAsCUNffFNfLAorLyogOAlACUEJQglDCUQJRQlGCUcJKi8KKwlDX3xYXywJQ18sCU1fLAlDXywJQ18sCU1fLAlNX3xYXywJQ198VV98Wl8sCisvKiA5CUgJSQlKCUsJTAlNCU4JTwkqLworCTAsCUNfLAkwLAkwLAkwLAkwLAlDX3xVXywJMCwKKy8qIEEJUAlRCVIJUwlUCVUJVglXCSovCisJQ18sCTAsCUNfLAlDXywJTV98WF8sCUNfLAkwLAlNXywKKy8qIEIJWAlZCVoJWwlcCV0JXglfCSovCisJQ18sCUNffFVfLAkwLAkwLAlDX3xaXywJMCwJTV8sCUNffFpfLAorLyogQwlgCWEJYgljCWQJZQlmCWcJKi8KKwkwLAlDXywJTV8sCUVfLAlFXywJTV8sCU1ffFhfLAlDX3xaXywKKy8qIEQJaAlpCWoJawlsCW0JbglvCSovCisJTV8sCUNfLAlDX3xVXywJQ198VV8sCU1fLAkwLAlDX3xVXywJMCwKKy8qIEUJcAlxCXIJcwl0CXUJdgl3CSovCisJQ18sCTAsCVhfLAlDXywJTV98WF8sCUNffFVfLAlDX3xVX3xaXywgTV8sCisvKiBGCXgJeQl6CXsJfAl9CX4JXj8JKi8KKwlDXywJRV98VV8sCTAsCTAsCU1ffFpfLAkwLAlDXywJMAorfTsKKworI2RlZmluZSBNQVhWSUNNRAkzCisjZGVmaW5lIFNSQ0hMRU4JCTQwCisKKyNkZWZpbmUgSU5TRVJUCQkxCisjZGVmaW5lIFJFUExBQ0UJCTIKKworI2RlZmluZSBWTk9STUFMCQkwCQkvKiBjb21tYW5kLCBpbnNlcnQgb3IgcmVwbGFjZSBtb2RlICovCisjZGVmaW5lIFZBUkcxCQkxCQkvKiBkaWdpdCBwcmVmaXggKGZpcnN0LCBlZywgNWwpICovCisjZGVmaW5lIFZFWFRDTUQJCTIJCS8qIGNtZCArIG1vdmVtZW50IChlZywgY2wpICovCisjZGVmaW5lIFZBUkcyCQkzCQkvKiBkaWdpdCBwcmVmaXggKHNlY29uZCwgZWcsIDJjM2wpICovCisjZGVmaW5lIFZYQ0gJCTQJCS8qIGYsIEYsIHQsIFQsIEAgKi8KKyNkZWZpbmUgVkZBSUwJCTUJCS8qIGJhZCBjb21tYW5kICovCisjZGVmaW5lIFZDTUQJCTYJCS8qIHNpbmdsZSBjaGFyIGNvbW1hbmQgKGVnLCBYKSAqLworI2RlZmluZSBWUkVETwkJNwkJLyogLiAqLworI2RlZmluZSBWTElUCQk4CQkvKiBeViAqLworI2RlZmluZSBWU0VBUkNICQk5CQkvKiAvLCA/ICovCisjZGVmaW5lIFZWRVJTSU9OCTEwCQkvKiA8RVNDPiBeViAqLworCitzdGF0aWMgY2hhcgkJdW5kb2NidWZbTElORV07CisKK3N0YXRpYyBzdHJ1Y3QgZWRzdGF0ZQkqc2F2ZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpOworc3RhdGljIHZvaWQJCXJlc3RvcmVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkLCBzdHJ1Y3QgZWRzdGF0ZSAqbmV3cyk7CitzdGF0aWMgdm9pZAkJZnJlZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpOworCitzdGF0aWMgc3RydWN0IGVkc3RhdGUJZWJ1ZjsKK3N0YXRpYyBzdHJ1Y3QgZWRzdGF0ZQl1bmRvYnVmID0geyB1bmRvY2J1ZiwgMCwgTElORSwgMCwgMCB9OworCitzdGF0aWMgc3RydWN0IGVkc3RhdGUJKmVzOwkJCS8qIGN1cnJlbnQgZWRpdG9yIHN0YXRlICovCitzdGF0aWMgc3RydWN0IGVkc3RhdGUJKnVuZG87CisKK3N0YXRpYyBjaGFyIGlidWZbTElORV07CQkJLyogaW5wdXQgYnVmZmVyICovCitzdGF0aWMgaW50IGZpcnN0X2luc2VydDsJCS8qIHNldCB3aGVuIHN0YXJ0aW5nIGluIGluc2VydCBtb2RlICovCitzdGF0aWMgaW50IHNhdmVkX2luc2xlbjsJCS8qIHNhdmVkIGluc2xlbiBmb3IgZmlyc3QgaW5zZXJ0ICovCitzdGF0aWMgaW50IGluc2xlbjsJCQkvKiBsZW5ndGggb2YgaW5wdXQgYnVmZmVyICovCitzdGF0aWMgaW50IHNyY2hsZW47CQkJLyogbGVuZ3RoIG9mIGN1cnJlbnQgc2VhcmNoIHBhdHRlcm4gKi8KK3N0YXRpYyBjaGFyIHlidWZbTElORV07CQkJLyogeWFuayBidWZmZXIgKi8KK3N0YXRpYyBpbnQgeWFua2xlbjsJCQkvKiBsZW5ndGggb2YgeWFuayBidWZmZXIgKi8KK3N0YXRpYyBpbnQgZnNhdmVjbWQgPSAnICc7CQkvKiBsYXN0IGZpbmQgY29tbWFuZCAqLworc3RhdGljIGludCBmc2F2ZWNoOwkJCS8qIGNoYXJhY3RlciB0byBmaW5kICovCitzdGF0aWMgY2hhciBsYXN0Y21kW01BWFZJQ01EXTsJCS8qIGxhc3Qgbm9uLW1vdmUgY29tbWFuZCAqLworc3RhdGljIGludCBsYXN0YWM7CQkJLyogYXJnY250IGZvciBsYXN0Y21kICovCitzdGF0aWMgaW50IGxhc3RzZWFyY2ggPSAnICc7CQkvKiBsYXN0IHNlYXJjaCBjb21tYW5kICovCitzdGF0aWMgY2hhciBzcmNocGF0W1NSQ0hMRU5dOwkJLyogbGFzdCBzZWFyY2ggcGF0dGVybiAqLworc3RhdGljIGludCBpbnNlcnQ7CQkJLyogbm9uLXplcm8gaW4gaW5zZXJ0IG1vZGUgKi8KK3N0YXRpYyBpbnQgaG51bTsJCQkvKiBwb3NpdGlvbiBpbiBoaXN0b3J5ICovCitzdGF0aWMgaW50IG9obnVtOwkJCS8qIGhpc3RvcnkgbGluZSBjb3BpZWQgKGFmdGVyIG1vZCkgKi8KK3N0YXRpYyBpbnQgaGxhc3Q7CQkJLyogMSBwYXN0IGxhc3QgcG9zaXRpb24gaW4gaGlzdG9yeSAqLworc3RhdGljIGludCBzdGF0ZTsKKworLyogSW5mb3JtYXRpb24gZm9yIGtlZXBpbmcgdHJhY2sgb2YgbWFjcm9zIHRoYXQgYXJlIGJlaW5nIGV4cGFuZGVkLgorICogVGhlIGZvcm1hdCBvZiBidWYgaXMgdGhlIGFsaWFzIGNvbnRlbnRzIGZvbGxvd2VkIGJ5IGEgTlVMIGJ5dGUgZm9sbG93ZWQKKyAqIGJ5IHRoZSBuYW1lIChsZXR0ZXIpIG9mIHRoZSBhbGlhcy4gVGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIG1hcmtlZCBieQorICogYSBkb3VibGUgTlVMLiBUaGUgbmFtZSBvZiB0aGUgYWxpYXMgaXMgc3RvcmVkIHNvIHJlY3Vyc2l2ZSBtYWNyb3MgY2FuCisgKiBiZSBkZXRlY3RlZC4KKyAqLworc3RydWN0IG1hY3JvX3N0YXRlIHsKKwl1bnNpZ25lZCBjaGFyICpwOwkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZiAqLworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsJLyogcG9pbnRlciB0byBtYWNybyhzKSBiZWluZyBleHBhbmRlZCAqLworCWludCBsZW47CQkvKiBob3cgbXVjaCBkYXRhIGluIGJ1ZmZlciAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgbWFjcm9fc3RhdGUgbWFjcm87CisKK2VudW0gZXhwYW5kX21vZGUgeworCU5PTkUsIEVYUEFORCwgQ09NUExFVEUsIFBSSU5UCit9Oworc3RhdGljIGVudW0gZXhwYW5kX21vZGUgZXhwYW5kZWQgPSBOT05FOwkvKiBsYXN0IGlucHV0IHdhcyBleHBhbmRlZCAqLworCitzdGF0aWMgaW50Cit4X3ZpKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgYzsKKworCXN0YXRlID0gVk5PUk1BTDsKKwlvaG51bSA9IGhudW0gPSBobGFzdCA9IGhpc3RudW0oLTEpICsgMTsKKwlpbnNlcnQgPSBJTlNFUlQ7CisJc2F2ZWRfaW5zbGVuID0gaW5zbGVuOworCWZpcnN0X2luc2VydCA9IDE7CisJaW5zbGVuID0gMDsKKwl2aV9tYWNyb19yZXNldCgpOworCisJZXMgPSAmZWJ1ZjsKKwllcy0+Y2J1ZiA9IGJ1ZjsKKwl1bmRvID0gJnVuZG9idWY7CisJdW5kby0+Y2J1ZnNpemUgPSBlcy0+Y2J1ZnNpemUgPSBsZW4gPiBMSU5FID8gTElORSA6IGxlbjsKKworCWVzLT5saW5lbGVuID0gdW5kby0+bGluZWxlbiA9IDA7CisJZXMtPmN1cnNvciA9IHVuZG8tPmN1cnNvciA9IDA7CisJZXMtPndpbmxlZnQgPSB1bmRvLT53aW5sZWZ0ID0gMDsKKworCWN1cl9jb2wgPSBwcm9tcHRsZW4ocHJvbXB0KTsKKwlwcm9tcHRfdHJ1bmMgPSAoY3VyX2NvbCAvIHhfY29scykgKiB4X2NvbHM7CisJY3VyX2NvbCAtPSBwcm9tcHRfdHJ1bmM7CisKKwlwcHJvbXB0KHByb21wdCwgMCk7CisJaWYgKGN1cl9jb2wgPiB4X2NvbHMgLSAzIC0gTUlOX0VESVRfU1BBQ0UpIHsKKwkJcHJvbXB0X3JlZHJhdyA9IGN1cl9jb2wgPSAwOworCQl4X3B1dGMoJ1xuJyk7CisJfSBlbHNlCisJCXByb21wdF9yZWRyYXcgPSAxOworCXB3aWR0aCA9IGN1cl9jb2w7CisKKwlpZiAoIXdidWZfbGVuIHx8IHdidWZfbGVuICE9IHhfY29scyAtIDMpIHsKKwkJd2J1Zl9sZW4gPSB4X2NvbHMgLSAzOworCQl3YnVmWzBdID0gYXJlc2l6ZSh3YnVmWzBdLCB3YnVmX2xlbiwgQVBFUk0pOworCQl3YnVmWzFdID0gYXJlc2l6ZSh3YnVmWzFdLCB3YnVmX2xlbiwgQVBFUk0pOworCX0KKwkodm9pZCltZW1zZXQod2J1ZlswXSwgJyAnLCB3YnVmX2xlbik7CisJKHZvaWQpbWVtc2V0KHdidWZbMV0sICcgJywgd2J1Zl9sZW4pOworCXdpbndpZHRoID0geF9jb2xzIC0gcHdpZHRoIC0gMzsKKwl3aW4gPSAwOworCW1vcmVjID0gJyAnOworCWxhc3RyZWYgPSAxOworCWhvbGRsZW4gPSAwOworCisJZWRpdG1vZGUgPSAyOworCXhfZmx1c2goKTsKKwl3aGlsZSAoMSkgeworCQlpZiAobWFjcm8ucCkgeworCQkJYyA9ICptYWNyby5wKys7CisJCQkvKiBlbmQgb2YgY3VycmVudCBtYWNybz8gKi8KKwkJCWlmICghYykgeworCQkJCS8qIG1vcmUgbWFjcm9zIGxlZnQgdG8gZmluaXNoPyAqLworCQkJCWlmICgqbWFjcm8ucCsrKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBtdXN0IGJlIHRoZSBlbmQgb2YgYWxsIHRoZSBtYWNyb3MgKi8KKwkJCQl2aV9tYWNyb19yZXNldCgpOworCQkJCWMgPSB4X2dldGMoKTsKKwkJCX0KKwkJfSBlbHNlCisJCQljID0geF9nZXRjKCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHN0YXRlICE9IFZMSVQpIHsKKwkJCWlmIChjID09IGVkY2hhcnMuaW50ciB8fCBjID09IGVkY2hhcnMucXVpdCkgeworCQkJCS8qIHByZXRlbmQgd2UgZ290IGFuIGludGVycnVwdCAqLworCQkJCXhfdmlfem90YyhjKTsKKwkJCQl4X2ZsdXNoKCk7CisJCQkJdHJhcHNpZyhjID09IGVkY2hhcnMuaW50ciA/IFNJR0lOVCA6IFNJR1FVSVQpOworCQkJCXhfbW9kZShmYWxzZSk7CisJCQkJdW53aW5kKExTSEVMTCk7CisJCQl9IGVsc2UgaWYgKGMgPT0gZWRjaGFycy5lb2YgJiYgc3RhdGUgIT0gVlZFUlNJT04pIHsKKwkJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkgeworCQkJCQl4X3ZpX3pvdGMoZWRjaGFycy5lb2YpOworCQkJCQljID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAodmlfaG9vayhjKSkKKwkJCWJyZWFrOworCQl4X2ZsdXNoKCk7CisJfQorCisJeF9wdXRjKCdccicpOworCXhfcHV0YygnXG4nKTsKKwl4X2ZsdXNoKCk7CisKKwlpZiAoYyA9PSAtMSB8fCAoc3NpemVfdClsZW4gPD0gZXMtPmxpbmVsZW4pCisJCXJldHVybiAoLTEpOworCisJaWYgKGVzLT5jYnVmICE9IGJ1ZikKKwkJbWVtbW92ZShidWYsIGVzLT5jYnVmLCBlcy0+bGluZWxlbik7CisKKwlidWZbZXMtPmxpbmVsZW4rK10gPSAnXG4nOworCisJcmV0dXJuIChlcy0+bGluZWxlbik7Cit9CisKK3N0YXRpYyBpbnQKK3ZpX2hvb2soaW50IGNoKQoreworCXN0YXRpYyBjaGFyIGN1cmNtZFtNQVhWSUNNRF0sIGxvY3BhdFtTUkNITEVOXTsKKwlzdGF0aWMgaW50IGNtZGxlbiwgYXJnYzEsIGFyZ2MyOworCisJc3dpdGNoIChzdGF0ZSkgeworCisJY2FzZSBWTk9STUFMOgorCQlpZiAoaW5zZXJ0ICE9IDApIHsKKwkJCWlmIChjaCA9PSBDdHJsKCd2JykpIHsKKwkJCQlzdGF0ZSA9IFZMSVQ7CisJCQkJY2ggPSAnXic7CisJCQl9CisJCQlzd2l0Y2ggKHZpX2luc2VydChjaCkpIHsKKwkJCWNhc2UgLTE6CisJCQkJdmlfZXJyb3IoKTsKKwkJCQlzdGF0ZSA9IFZOT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkJaWYgKHN0YXRlID09IFZMSVQpIHsKKwkJCQkJZXMtPmN1cnNvci0tOworCQkJCQlyZWZyZXNoKDApOworCQkJCX0gZWxzZQorCQkJCQlyZWZyZXNoKGluc2VydCAhPSAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykKKwkJCQlyZXR1cm4gKDEpOworCQkJY21kbGVuID0gMDsKKwkJCWFyZ2MxID0gMDsKKwkJCWlmIChjaCA+PSAnMScgJiYgY2ggPD0gJzknKSB7CisJCQkJYXJnYzEgPSBjaCAtICcwJzsKKwkJCQlzdGF0ZSA9IFZBUkcxOworCQkJfSBlbHNlIHsKKwkJCQljdXJjbWRbY21kbGVuKytdID0gY2g7CisJCQkJc3RhdGUgPSBuZXh0c3RhdGUoY2gpOworCQkJCWlmIChzdGF0ZSA9PSBWU0VBUkNIKSB7CisJCQkJCXNhdmVfY2J1ZigpOworCQkJCQllcy0+Y3Vyc29yID0gMDsKKwkJCQkJZXMtPmxpbmVsZW4gPSAwOworCQkJCQlpZiAoY2ggPT0gJy8nKSB7CisJCQkJCQlpZiAocHV0YnVmKCIvIiwgMSwgMCkgIT0gMCkKKwkJCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkJfSBlbHNlIGlmIChwdXRidWYoIj8iLCAxLCAwKSAhPSAwKQorCQkJCQkJcmV0dXJuICgtMSk7CisJCQkJCXJlZnJlc2goMCk7CisJCQkJfQorCQkJCWlmIChzdGF0ZSA9PSBWVkVSU0lPTikgeworCQkJCQlzYXZlX2NidWYoKTsKKwkJCQkJZXMtPmN1cnNvciA9IDA7CisJCQkJCWVzLT5saW5lbGVuID0gMDsKKwkJCQkJcHV0YnVmKEtTSF9WRVJTSU9OLAorCQkJCQkgICAgc3RybGVuKEtTSF9WRVJTSU9OKSwgMCk7CisJCQkJCXJlZnJlc2goMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBWTElUOgorCQlpZiAoaXNfYmFkKGNoKSkgeworCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyAxKTsKKwkJCXZpX2Vycm9yKCk7CisJCX0gZWxzZQorCQkJZXMtPmNidWZbZXMtPmN1cnNvcisrXSA9IGNoOworCQlyZWZyZXNoKDEpOworCQlzdGF0ZSA9IFZOT1JNQUw7CisJCWJyZWFrOworCisJY2FzZSBWVkVSU0lPTjoKKwkJcmVzdG9yZV9jYnVmKCk7CisJCXN0YXRlID0gVk5PUk1BTDsKKwkJcmVmcmVzaCgwKTsKKwkJYnJlYWs7CisKKwljYXNlIFZBUkcxOgorCQlpZiAoa3NoX2lzZGlnaXQoY2gpKQorCQkJYXJnYzEgPSBhcmdjMSAqIDEwICsgY2ggLSAnMCc7CisJCWVsc2UgeworCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOworCQkJc3RhdGUgPSBuZXh0c3RhdGUoY2gpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWRVhUQ01EOgorCQlhcmdjMiA9IDA7CisJCWlmIChjaCA+PSAnMScgJiYgY2ggPD0gJzknKSB7CisJCQlhcmdjMiA9IGNoIC0gJzAnOworCQkJc3RhdGUgPSBWQVJHMjsKKwkJCXJldHVybiAoMCk7CisJCX0gZWxzZSB7CisJCQljdXJjbWRbY21kbGVuKytdID0gY2g7CisJCQlpZiAoY2ggPT0gY3VyY21kWzBdKQorCQkJCXN0YXRlID0gVkNNRDsKKwkJCWVsc2UgaWYgKGlzX21vdmUoY2gpKQorCQkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKKwkJCWVsc2UKKwkJCQlzdGF0ZSA9IFZGQUlMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWQVJHMjoKKwkJaWYgKGtzaF9pc2RpZ2l0KGNoKSkKKwkJCWFyZ2MyID0gYXJnYzIgKiAxMCArIGNoIC0gJzAnOworCQllbHNlIHsKKwkJCWlmIChhcmdjMSA9PSAwKQorCQkJCWFyZ2MxID0gYXJnYzI7CisJCQllbHNlCisJCQkJYXJnYzEgKj0gYXJnYzI7CisJCQljdXJjbWRbY21kbGVuKytdID0gY2g7CisJCQlpZiAoY2ggPT0gY3VyY21kWzBdKQorCQkJCXN0YXRlID0gVkNNRDsKKwkJCWVsc2UgaWYgKGlzX21vdmUoY2gpKQorCQkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKKwkJCWVsc2UKKwkJCQlzdGF0ZSA9IFZGQUlMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWWENIOgorCQlpZiAoY2ggPT0gQ3RybCgnWycpKQorCQkJc3RhdGUgPSBWTk9STUFMOworCQllbHNlIHsKKwkJCWN1cmNtZFtjbWRsZW4rK10gPSBjaDsKKwkJCXN0YXRlID0gVkNNRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVlNFQVJDSDoKKwkJaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJyAvKnx8IGNoID09IEN0cmwoJ1snKSovICkgeworCQkJcmVzdG9yZV9jYnVmKCk7CisJCQkvKiBSZXBlYXQgbGFzdCBzZWFyY2g/ICovCisJCQlpZiAoc3JjaGxlbiA9PSAwKSB7CisJCQkJaWYgKCFzcmNocGF0WzBdKSB7CisJCQkJCXZpX2Vycm9yKCk7CisJCQkJCXN0YXRlID0gVk5PUk1BTDsKKwkJCQkJcmVmcmVzaCgwKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxvY3BhdFtzcmNobGVuXSA9ICdcMCc7CisJCQkJbWVtY3B5KHNyY2hwYXQsIGxvY3BhdCwgc3JjaGxlbiArIDEpOworCQkJfQorCQkJc3RhdGUgPSBWQ01EOworCQl9IGVsc2UgaWYgKGNoID09IGVkY2hhcnMuZXJhc2UgfHwgY2ggPT0gQ3RybCgnaCcpKSB7CisJCQlpZiAoc3JjaGxlbiAhPSAwKSB7CisJCQkJc3JjaGxlbi0tOworCQkJCWVzLT5saW5lbGVuIC09IGNoYXJfbGVuKCh1bnNpZ25lZCBjaGFyKWxvY3BhdFtzcmNobGVuXSk7CisJCQkJZXMtPmN1cnNvciA9IGVzLT5saW5lbGVuOworCQkJCXJlZnJlc2goMCk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCXJlc3RvcmVfY2J1ZigpOworCQkJc3RhdGUgPSBWTk9STUFMOworCQkJcmVmcmVzaCgwKTsKKwkJfSBlbHNlIGlmIChjaCA9PSBlZGNoYXJzLmtpbGwpIHsKKwkJCXNyY2hsZW4gPSAwOworCQkJZXMtPmxpbmVsZW4gPSAxOworCQkJZXMtPmN1cnNvciA9IDE7CisJCQlyZWZyZXNoKDApOworCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlIGlmIChjaCA9PSBlZGNoYXJzLndlcmFzZSkgeworCQkJaW50IGksIG4gPSBzcmNobGVuOworCQkJc3RydWN0IGVkc3RhdGUgbmV3X2VzLCAqc2F2ZV9lczsKKworCQkJbmV3X2VzLmN1cnNvciA9IG47CisJCQluZXdfZXMuY2J1ZiA9IGxvY3BhdDsKKworCQkJc2F2ZV9lcyA9IGVzOworCQkJZXMgPSAmbmV3X2VzOworCQkJbiA9IGJhY2t3b3JkKDEpOworCQkJZXMgPSBzYXZlX2VzOworCisJCQlmb3IgKGkgPSBzcmNobGVuOyAtLWkgPj0gbjsgKQorCQkJCWVzLT5saW5lbGVuIC09IGNoYXJfbGVuKCh1bnNpZ25lZCBjaGFyKWxvY3BhdFtpXSk7CisJCQlzcmNobGVuID0gbjsKKwkJCWVzLT5jdXJzb3IgPSBlcy0+bGluZWxlbjsKKwkJCXJlZnJlc2goMCk7CisJCQlyZXR1cm4gKDApOworCQl9IGVsc2UgeworCQkJaWYgKHNyY2hsZW4gPT0gU1JDSExFTiAtIDEpCisJCQkJdmlfZXJyb3IoKTsKKwkJCWVsc2UgeworCQkJCWxvY3BhdFtzcmNobGVuKytdID0gY2g7CisJCQkJaWYgKGNoIDwgJyAnIHx8IGNoID09IDB4N2YpIHsKKwkJCQkJaWYgKGVzLT5saW5lbGVuICsgMiA+IGVzLT5jYnVmc2l6ZSkKKwkJCQkJCXZpX2Vycm9yKCk7CisJCQkJCWVzLT5jYnVmW2VzLT5saW5lbGVuKytdID0gJ14nOworCQkJCQllcy0+Y2J1Zltlcy0+bGluZWxlbisrXSA9IGNoIF4gJ0AnOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChlcy0+bGluZWxlbiA+PSBlcy0+Y2J1ZnNpemUpCisJCQkJCQl2aV9lcnJvcigpOworCQkJCQllcy0+Y2J1Zltlcy0+bGluZWxlbisrXSA9IGNoOworCQkJCX0KKwkJCQllcy0+Y3Vyc29yID0gZXMtPmxpbmVsZW47CisJCQkJcmVmcmVzaCgwKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgVkNNRDoKKwkJc3RhdGUgPSBWTk9STUFMOworCQlzd2l0Y2ggKHZpX2NtZChhcmdjMSwgY3VyY21kKSkgeworCQljYXNlIC0xOgorCQkJdmlfZXJyb3IoKTsKKwkJCXJlZnJlc2goMCk7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJaWYgKGluc2VydCAhPSAwKQorCQkJCWluc2xlbiA9IDA7CisJCQlyZWZyZXNoKGluc2VydCAhPSAwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlyZWZyZXNoKDApOworCQkJcmV0dXJuICgxKTsKKwkJY2FzZSAyOgorCQkJLyogYmFjayBmcm9tIGEgJ3YnIGNvbW1hbmQgLSBkb24ndCByZWRyYXcgdGhlIHNjcmVlbiAqLworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVlJFRE86CisJCXN0YXRlID0gVk5PUk1BTDsKKwkJaWYgKGFyZ2MxICE9IDApCisJCQlsYXN0YWMgPSBhcmdjMTsKKwkJc3dpdGNoICh2aV9jbWQobGFzdGFjLCBsYXN0Y21kKSkgeworCQljYXNlIC0xOgorCQkJdmlfZXJyb3IoKTsKKwkJCXJlZnJlc2goMCk7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJaWYgKGluc2VydCAhPSAwKSB7CisJCQkJaWYgKGxhc3RjbWRbMF0gPT0gJ3MnIHx8IGxhc3RjbWRbMF0gPT0gJ2MnIHx8CisJCQkJICAgIGxhc3RjbWRbMF0gPT0gJ0MnKSB7CisJCQkJCWlmIChyZWRvX2luc2VydCgxKSAhPSAwKQorCQkJCQkJdmlfZXJyb3IoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocmVkb19pbnNlcnQobGFzdGFjKSAhPSAwKQorCQkJCQkJdmlfZXJyb3IoKTsKKwkJCQl9CisJCQl9CisJCQlyZWZyZXNoKDApOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXJlZnJlc2goMCk7CisJCQlyZXR1cm4gKDEpOworCQljYXNlIDI6CisJCQkvKiBiYWNrIGZyb20gYSAndicgY29tbWFuZCAtIGNhbid0IGhhcHBlbiAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZGQUlMOgorCQlzdGF0ZSA9IFZOT1JNQUw7CisJCXZpX2Vycm9yKCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CituZXh0c3RhdGUoaW50IGNoKQoreworCWlmIChpc19leHRlbmQoY2gpKQorCQlyZXR1cm4gKFZFWFRDTUQpOworCWVsc2UgaWYgKGlzX3NyY2goY2gpKQorCQlyZXR1cm4gKFZTRUFSQ0gpOworCWVsc2UgaWYgKGlzX2xvbmcoY2gpKQorCQlyZXR1cm4gKFZYQ0gpOworCWVsc2UgaWYgKGNoID09ICcuJykKKwkJcmV0dXJuIChWUkVETyk7CisJZWxzZSBpZiAoY2ggPT0gQ3RybCgndicpKQorCQlyZXR1cm4gKFZWRVJTSU9OKTsKKwllbHNlIGlmIChpc19jbWQoY2gpKQorCQlyZXR1cm4gKFZDTUQpOworCWVsc2UKKwkJcmV0dXJuIChWRkFJTCk7Cit9CisKK3N0YXRpYyBpbnQKK3ZpX2luc2VydChpbnQgY2gpCit7CisJaW50IHRjdXJzb3I7CisKKwlpZiAoY2ggPT0gZWRjaGFycy5lcmFzZSB8fCBjaCA9PSBDdHJsKCdoJykpIHsKKwkJaWYgKGluc2VydCA9PSBSRVBMQUNFKSB7CisJCQlpZiAoZXMtPmN1cnNvciA9PSB1bmRvLT5jdXJzb3IpIHsKKwkJCQl2aV9lcnJvcigpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAoaW5zbGVuID4gMCkKKwkJCQlpbnNsZW4tLTsKKwkJCWVzLT5jdXJzb3ItLTsKKwkJCWlmIChlcy0+Y3Vyc29yID49IHVuZG8tPmxpbmVsZW4pCisJCQkJZXMtPmxpbmVsZW4tLTsKKwkJCWVsc2UKKwkJCQllcy0+Y2J1Zltlcy0+Y3Vyc29yXSA9IHVuZG8tPmNidWZbZXMtPmN1cnNvcl07CisJCX0gZWxzZSB7CisJCQlpZiAoZXMtPmN1cnNvciA9PSAwKQorCQkJCXJldHVybiAoMCk7CisJCQlpZiAoaW5zbGVuID4gMCkKKwkJCQlpbnNsZW4tLTsKKwkJCWVzLT5jdXJzb3ItLTsKKwkJCWVzLT5saW5lbGVuLS07CisJCQltZW1tb3ZlKCZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3IgKyAxXSwKKwkJCSAgICBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3IgKyAxKTsKKwkJfQorCQlleHBhbmRlZCA9IE5PTkU7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChjaCA9PSBlZGNoYXJzLmtpbGwpIHsKKwkJaWYgKGVzLT5jdXJzb3IgIT0gMCkgeworCQkJaW5zbGVuID0gMDsKKwkJCW1lbW1vdmUoZXMtPmNidWYsICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwKKwkJCSAgICBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3IpOworCQkJZXMtPmxpbmVsZW4gLT0gZXMtPmN1cnNvcjsKKwkJCWVzLT5jdXJzb3IgPSAwOworCQl9CisJCWV4cGFuZGVkID0gTk9ORTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGNoID09IGVkY2hhcnMud2VyYXNlKSB7CisJCWlmIChlcy0+Y3Vyc29yICE9IDApIHsKKwkJCXRjdXJzb3IgPSBiYWNrd29yZCgxKTsKKwkJCW1lbW1vdmUoJmVzLT5jYnVmW3RjdXJzb3JdLCAmZXMtPmNidWZbZXMtPmN1cnNvcl0sCisJCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKKwkJCWVzLT5saW5lbGVuIC09IGVzLT5jdXJzb3IgLSB0Y3Vyc29yOworCQkJaWYgKGluc2xlbiA8IGVzLT5jdXJzb3IgLSB0Y3Vyc29yKQorCQkJCWluc2xlbiA9IDA7CisJCQllbHNlCisJCQkJaW5zbGVuIC09IGVzLT5jdXJzb3IgLSB0Y3Vyc29yOworCQkJZXMtPmN1cnNvciA9IHRjdXJzb3I7CisJCX0KKwkJZXhwYW5kZWQgPSBOT05FOworCQlyZXR1cm4gKDApOworCX0KKwkvKiBJZiBhbnkgY2hhcnMgYXJlIGVudGVyZWQgYmVmb3JlIGVzY2FwZSwgdHJhc2ggdGhlIHNhdmVkIGluc2VydAorCSAqIGJ1ZmZlciAoaWYgdXNlciBpbnNlcnRzICYgZGVsZXRlcyBjaGFyLCBpYnVmIGdldHMgdHJhc2hlZCBhbmQKKwkgKiB3ZSBkb24ndCB3YW50IHRvIHVzZSBpdCkKKwkgKi8KKwlpZiAoZmlyc3RfaW5zZXJ0ICYmIGNoICE9IEN0cmwoJ1snKSkKKwkJc2F2ZWRfaW5zbGVuID0gMDsKKwlzd2l0Y2ggKGNoKSB7CisJY2FzZSAnXDAnOgorCQlyZXR1cm4gKC0xKTsKKworCWNhc2UgJ1xyJzoKKwljYXNlICdcbic6CisJCXJldHVybiAoMSk7CisKKwljYXNlIEN0cmwoJ1snKToKKwkJZXhwYW5kZWQgPSBOT05FOworCQlpZiAoZmlyc3RfaW5zZXJ0KSB7CisJCQlmaXJzdF9pbnNlcnQgPSAwOworCQkJaWYgKGluc2xlbiA9PSAwKSB7CisJCQkJaW5zbGVuID0gc2F2ZWRfaW5zbGVuOworCQkJCXJldHVybiAocmVkb19pbnNlcnQoMCkpOworCQkJfQorCQkJbGFzdGNtZFswXSA9ICdhJzsKKwkJCWxhc3RhYyA9IDE7CisJCX0KKwkJaWYgKGxhc3RjbWRbMF0gPT0gJ3MnIHx8IGxhc3RjbWRbMF0gPT0gJ2MnIHx8CisJCSAgICBsYXN0Y21kWzBdID09ICdDJykKKwkJCXJldHVybiAocmVkb19pbnNlcnQoMCkpOworCQllbHNlCisJCQlyZXR1cm4gKHJlZG9faW5zZXJ0KGxhc3RhYyAtIDEpKTsKKworCS8qIHsgQmVnaW4gbm9uc3RhbmRhcmQgdmkgY29tbWFuZHMgKi8KKwljYXNlIEN0cmwoJ3gnKToKKwkJZXhwYW5kX3dvcmQoMCk7CisJCWJyZWFrOworCisJY2FzZSBDdHJsKCdmJyk6CisJCWNvbXBsZXRlX3dvcmQoMCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBDdHJsKCdlJyk6CisJCXByaW50X2V4cGFuc2lvbnMoZXMsIDApOworCQlicmVhazsKKworCWNhc2UgQ3RybCgnaScpOgorCQlpZiAoRmxhZyhGVklUQUJDT01QTEVURSkpIHsKKwkJCWNvbXBsZXRlX3dvcmQoMCwgMCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCS8qIEVuZCBub25zdGFuZGFyZCB2aSBjb21tYW5kcyB9ICovCisKKwlkZWZhdWx0OgorCQlpZiAoZXMtPmxpbmVsZW4gPj0gZXMtPmNidWZzaXplIC0gMSkKKwkJCXJldHVybiAoLTEpOworCQlpYnVmW2luc2xlbisrXSA9IGNoOworCQlpZiAoaW5zZXJ0ID09IElOU0VSVCkgeworCQkJbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvciArIDFdLCAmZXMtPmNidWZbZXMtPmN1cnNvcl0sCisJCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKKwkJCWVzLT5saW5lbGVuKys7CisJCX0KKwkJZXMtPmNidWZbZXMtPmN1cnNvcisrXSA9IGNoOworCQlpZiAoaW5zZXJ0ID09IFJFUExBQ0UgJiYgZXMtPmN1cnNvciA+IGVzLT5saW5lbGVuKQorCQkJZXMtPmxpbmVsZW4rKzsKKwkJZXhwYW5kZWQgPSBOT05FOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit2aV9jbWQoaW50IGFyZ2NudCwgY29uc3QgY2hhciAqY21kKQoreworCWludCBuY3Vyc29yOworCWludCBjdXIsIGMxLCBjMiwgYzMgPSAwOworCWludCBhbnk7CisJc3RydWN0IGVkc3RhdGUgKnQ7CisKKwlpZiAoYXJnY250ID09IDAgJiYgIWlzX3plcm9jb3VudCgqY21kKSkKKwkJYXJnY250ID0gMTsKKworCWlmIChpc19tb3ZlKCpjbWQpKSB7CisJCWlmICgoY3VyID0gZG9tb3ZlKGFyZ2NudCwgY21kLCAwKSkgPj0gMCkgeworCQkJaWYgKGN1ciA9PSBlcy0+bGluZWxlbiAmJiBjdXIgIT0gMCkKKwkJCQljdXItLTsKKwkJCWVzLT5jdXJzb3IgPSBjdXI7CisJCX0gZWxzZQorCQkJcmV0dXJuICgtMSk7CisJfSBlbHNlIHsKKwkJLyogRG9uJ3Qgc2F2ZSBzdGF0ZSBpbiBtaWRkbGUgb2YgbWFjcm8uLiAqLworCQlpZiAoaXNfdW5kb2FibGUoKmNtZCkgJiYgIW1hY3JvLnApIHsKKwkJCXVuZG8tPndpbmxlZnQgPSBlcy0+d2lubGVmdDsKKwkJCW1lbW1vdmUodW5kby0+Y2J1ZiwgZXMtPmNidWYsIGVzLT5saW5lbGVuKTsKKwkJCXVuZG8tPmxpbmVsZW4gPSBlcy0+bGluZWxlbjsKKwkJCXVuZG8tPmN1cnNvciA9IGVzLT5jdXJzb3I7CisJCQlsYXN0YWMgPSBhcmdjbnQ7CisJCQltZW1tb3ZlKGxhc3RjbWQsIGNtZCwgTUFYVklDTUQpOworCQl9CisJCXN3aXRjaCAoKmNtZCkgeworCisJCWNhc2UgQ3RybCgnbCcpOgorCQljYXNlIEN0cmwoJ3InKToKKwkJCXJlZHJhd19saW5lKDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnQCc6CisJCQl7CisJCQkJc3RhdGljIGNoYXIgYWxpYXNbXSA9ICJfXDAiOworCQkJCXN0cnVjdCB0YmwgKmFwOworCQkJCWludCBvbGVuLCBubGVuOworCQkJCWNoYXIgKnAsICpuYnVmOworCisJCQkJLyogbG9va3VwIGxldHRlciBpbiBhbGlhcyBsaXN0Li4uICovCisJCQkJYWxpYXNbMV0gPSBjbWRbMV07CisJCQkJYXAgPSBrdHNlYXJjaCgmYWxpYXNlcywgYWxpYXMsIGhhc2goYWxpYXMpKTsKKwkJCQlpZiAoIWNtZFsxXSB8fCAhYXAgfHwgIShhcC0+ZmxhZyAmIElTU0VUKSkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJLyogY2hlY2sgaWYgdGhpcyBpcyBhIHJlY3Vyc2l2ZSBjYWxsLi4uICovCisJCQkJaWYgKChwID0gKGNoYXIgKiltYWNyby5wKSkKKwkJCQkJd2hpbGUgKChwID0gc3RybnVsKHApKSAmJiBwWzFdKQorCQkJCQkJaWYgKCorK3AgPT0gY21kWzFdKQorCQkJCQkJCXJldHVybiAoLTEpOworCQkJCS8qIGluc2VydCBhbGlhcyBpbnRvIG1hY3JvIGJ1ZmZlciAqLworCQkJCW5sZW4gPSBzdHJsZW4oYXAtPnZhbC5zKSArIDE7CisJCQkJb2xlbiA9ICFtYWNyby5wID8gMiA6CisJCQkJICAgIG1hY3JvLmxlbiAtIChtYWNyby5wIC0gbWFjcm8uYnVmKTsKKwkJCQluYnVmID0gYWxsb2MobmxlbiArIDEgKyBvbGVuLCBBUEVSTSk7CisJCQkJbWVtY3B5KG5idWYsIGFwLT52YWwucywgbmxlbik7CisJCQkJbmJ1ZltubGVuKytdID0gY21kWzFdOworCQkJCWlmIChtYWNyby5wKSB7CisJCQkJCW1lbWNweShuYnVmICsgbmxlbiwgbWFjcm8ucCwgb2xlbik7CisJCQkJCWFmcmVlKG1hY3JvLmJ1ZiwgQVBFUk0pOworCQkJCQlubGVuICs9IG9sZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJbmJ1ZltubGVuKytdID0gJ1wwJzsKKwkJCQkJbmJ1ZltubGVuKytdID0gJ1wwJzsKKwkJCQl9CisJCQkJbWFjcm8ucCA9IG1hY3JvLmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopbmJ1ZjsKKwkJCQltYWNyby5sZW4gPSBubGVuOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnYSc6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpZiAoZXMtPmxpbmVsZW4gIT0gMCkKKwkJCQllcy0+Y3Vyc29yKys7CisJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQlicmVhazsKKworCQljYXNlICdBJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWRlbF9yYW5nZSgwLCAwKTsKKwkJCWVzLT5jdXJzb3IgPSBlcy0+bGluZWxlbjsKKwkJCWluc2VydCA9IElOU0VSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1MnOgorCQkJZXMtPmN1cnNvciA9IGRvbW92ZSgxLCAiXiIsIDEpOworCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5saW5lbGVuKTsKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWluc2VydCA9IElOU0VSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1knOgorCQkJY21kID0gInkkIjsKKwkJCS8qIGFoaGhoaGguLi4gKi8KKwkJY2FzZSAnYyc6CisJCWNhc2UgJ2QnOgorCQljYXNlICd5JzoKKwkJCWlmICgqY21kID09IGNtZFsxXSkgeworCQkJCWMxID0gKmNtZCA9PSAnYycgPyBkb21vdmUoMSwgIl4iLCAxKSA6IDA7CisJCQkJYzIgPSBlcy0+bGluZWxlbjsKKwkJCX0gZWxzZSBpZiAoIWlzX21vdmUoY21kWzFdKSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWVsc2UgeworCQkJCWlmICgobmN1cnNvciA9IGRvbW92ZShhcmdjbnQsICZjbWRbMV0sIDEpKSA8IDApCisJCQkJCXJldHVybiAoLTEpOworCQkJCWlmICgqY21kID09ICdjJyAmJgorCQkJCSAgICAoY21kWzFdID09ICd3JyB8fCBjbWRbMV0gPT0gJ1cnKSAmJgorCQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbZXMtPmN1cnNvcl0pKSB7CisJCQkJCWRvIHsKKwkJCQkJCS0tbmN1cnNvcjsKKwkJCQkJfSB3aGlsZSAoa3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKTsKKwkJCQkJbmN1cnNvcisrOworCQkJCX0KKwkJCQlpZiAobmN1cnNvciA+IGVzLT5jdXJzb3IpIHsKKwkJCQkJYzEgPSBlcy0+Y3Vyc29yOworCQkJCQljMiA9IG5jdXJzb3I7CisJCQkJfSBlbHNlIHsKKwkJCQkJYzEgPSBuY3Vyc29yOworCQkJCQljMiA9IGVzLT5jdXJzb3I7CisJCQkJCWlmIChjbWRbMV0gPT0gJyUnKQorCQkJCQkJYzIrKzsKKwkJCQl9CisJCQl9CisJCQlpZiAoKmNtZCAhPSAnYycgJiYgYzEgIT0gYzIpCisJCQkJeWFua19yYW5nZShjMSwgYzIpOworCQkJaWYgKCpjbWQgIT0gJ3knKSB7CisJCQkJZGVsX3JhbmdlKGMxLCBjMik7CisJCQkJZXMtPmN1cnNvciA9IGMxOworCQkJfQorCQkJaWYgKCpjbWQgPT0gJ2MnKSB7CisJCQkJbW9kaWZpZWQgPSAxOworCQkJCWhudW0gPSBobGFzdDsKKwkJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdwJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWlmIChlcy0+bGluZWxlbiAhPSAwKQorCQkJCWVzLT5jdXJzb3IrKzsKKwkJCXdoaWxlIChwdXRidWYoeWJ1ZiwgeWFua2xlbiwgMCkgPT0gMCAmJiAtLWFyZ2NudCA+IDApCisJCQkJOworCQkJaWYgKGVzLT5jdXJzb3IgIT0gMCkKKwkJCQllcy0+Y3Vyc29yLS07CisJCQlpZiAoYXJnY250ICE9IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlICdQJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWFueSA9IDA7CisJCQl3aGlsZSAocHV0YnVmKHlidWYsIHlhbmtsZW4sIDApID09IDAgJiYgLS1hcmdjbnQgPiAwKQorCQkJCWFueSA9IDE7CisJCQlpZiAoYW55ICYmIGVzLT5jdXJzb3IgIT0gMCkKKwkJCQllcy0+Y3Vyc29yLS07CisJCQlpZiAoYXJnY250ICE9IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlICdDJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+bGluZWxlbik7CisJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQlicmVhazsKKworCQljYXNlICdEJzoKKwkJCXlhbmtfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmxpbmVsZW4pOworCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5saW5lbGVuKTsKKwkJCWlmIChlcy0+Y3Vyc29yICE9IDApCisJCQkJZXMtPmN1cnNvci0tOworCQkJYnJlYWs7CisKKwkJY2FzZSAnZyc6CisJCQlpZiAoIWFyZ2NudCkKKwkJCQlhcmdjbnQgPSBobGFzdDsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgJ0cnOgorCQkJaWYgKCFhcmdjbnQpCisJCQkJYXJnY250ID0gMTsKKwkJCWVsc2UKKwkJCQlhcmdjbnQgPSBobGFzdCAtIChzb3VyY2UtPmxpbmUgLSBhcmdjbnQpOworCQkJaWYgKGdyYWJoaXN0KG1vZGlmaWVkLCBhcmdjbnQgLSAxKSA8IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQllbHNlIHsKKwkJCQltb2RpZmllZCA9IDA7CisJCQkJaG51bSA9IGFyZ2NudCAtIDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdpJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWluc2VydCA9IElOU0VSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0knOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJZXMtPmN1cnNvciA9IGRvbW92ZSgxLCAiXiIsIDEpOworCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSAnaic6CisJCWNhc2UgJysnOgorCQljYXNlIEN0cmwoJ24nKToKKwkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgaG51bSArIGFyZ2NudCkgPCAwKQorCQkJCXJldHVybiAoLTEpOworCQkJZWxzZSB7CisJCQkJbW9kaWZpZWQgPSAwOworCQkJCWhudW0gKz0gYXJnY250OworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnayc6CisJCWNhc2UgJy0nOgorCQljYXNlIEN0cmwoJ3AnKToKKwkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgaG51bSAtIGFyZ2NudCkgPCAwKQorCQkJCXJldHVybiAoLTEpOworCQkJZWxzZSB7CisJCQkJbW9kaWZpZWQgPSAwOworCQkJCWhudW0gLT0gYXJnY250OworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAncic6CisJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWlmIChjbWRbMV0gPT0gMCkKKwkJCQl2aV9lcnJvcigpOworCQkJZWxzZSB7CisJCQkJaW50IG47CisKKwkJCQlpZiAoZXMtPmN1cnNvciArIGFyZ2NudCA+IGVzLT5saW5lbGVuKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlmb3IgKG4gPSAwOyBuIDwgYXJnY250OyArK24pCisJCQkJCWVzLT5jYnVmW2VzLT5jdXJzb3IgKyBuXSA9IGNtZFsxXTsKKwkJCQllcy0+Y3Vyc29yICs9IG4gLSAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnUic6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpbnNlcnQgPSBSRVBMQUNFOworCQkJYnJlYWs7CisKKwkJY2FzZSAncyc6CisJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWlmIChlcy0+Y3Vyc29yICsgYXJnY250ID4gZXMtPmxpbmVsZW4pCisJCQkJYXJnY250ID0gZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yOworCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyBhcmdjbnQpOworCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSAndic6CisJCQlpZiAoIWFyZ2NudCkgeworCQkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlpZiAobW9kaWZpZWQpIHsKKwkJCQkJZXMtPmNidWZbZXMtPmxpbmVsZW5dID0gJ1wwJzsKKwkJCQkJaGlzdHNhdmUoJnNvdXJjZS0+bGluZSwgZXMtPmNidWYsIHRydWUsCisJCQkJCSAgICB0cnVlKTsKKwkJCQl9IGVsc2UKKwkJCQkJYXJnY250ID0gc291cmNlLT5saW5lICsgMSAtCisJCQkJCSAgICAoaGxhc3QgLSBobnVtKTsKKwkJCX0KKwkJCWlmIChhcmdjbnQpCisJCQkJc2hmX3NucHJpbnRmKGVzLT5jYnVmLCBlcy0+Y2J1ZnNpemUsICIlcyAlZCIsCisJCQkJICAgICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLAorCQkJCSAgICBhcmdjbnQpOworCQkJZWxzZQorCQkJCXN0cmxjcHkoZXMtPmNidWYsCisJCQkJICAgICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLAorCQkJCSAgICBlcy0+Y2J1ZnNpemUpOworCQkJZXMtPmxpbmVsZW4gPSBzdHJsZW4oZXMtPmNidWYpOworCQkJcmV0dXJuICgyKTsKKworCQljYXNlICd4JzoKKwkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQorCQkJCXJldHVybiAoLTEpOworCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaWYgKGVzLT5jdXJzb3IgKyBhcmdjbnQgPiBlcy0+bGluZWxlbikKKwkJCQlhcmdjbnQgPSBlcy0+bGluZWxlbiAtIGVzLT5jdXJzb3I7CisJCQl5YW5rX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyBhcmdjbnQpOworCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5jdXJzb3IgKyBhcmdjbnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnWCc6CisJCQlpZiAoZXMtPmN1cnNvciA+IDApIHsKKwkJCQltb2RpZmllZCA9IDE7CisJCQkJaG51bSA9IGhsYXN0OworCQkJCWlmIChlcy0+Y3Vyc29yIDwgYXJnY250KQorCQkJCQlhcmdjbnQgPSBlcy0+Y3Vyc29yOworCQkJCXlhbmtfcmFuZ2UoZXMtPmN1cnNvciAtIGFyZ2NudCwgZXMtPmN1cnNvcik7CisJCQkJZGVsX3JhbmdlKGVzLT5jdXJzb3IgLSBhcmdjbnQsIGVzLT5jdXJzb3IpOworCQkJCWVzLT5jdXJzb3IgLT0gYXJnY250OworCQkJfSBlbHNlCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlICd1JzoKKwkJCXQgPSBlczsKKwkJCWVzID0gdW5kbzsKKwkJCXVuZG8gPSB0OworCQkJYnJlYWs7CisKKwkJY2FzZSAnVSc6CisJCQlpZiAoIW1vZGlmaWVkKQorCQkJCXJldHVybiAoLTEpOworCQkJaWYgKGdyYWJoaXN0KG1vZGlmaWVkLCBvaG51bSkgPCAwKQorCQkJCXJldHVybiAoLTEpOworCQkJbW9kaWZpZWQgPSAwOworCQkJaG51bSA9IG9obnVtOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPyc6CisJCQlpZiAoaG51bSA9PSBobGFzdCkKKwkJCQlobnVtID0gLTE7CisJCQkvKiBhaGhoICovCisJCWNhc2UgJy8nOgorCQkJYzMgPSAxOworCQkJc3JjaGxlbiA9IDA7CisJCQlsYXN0c2VhcmNoID0gKmNtZDsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgJ24nOgorCQljYXNlICdOJzoKKwkJCWlmIChsYXN0c2VhcmNoID09ICcgJykKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmIChsYXN0c2VhcmNoID09ICc/JykKKwkJCQljMSA9IDE7CisJCQllbHNlCisJCQkJYzEgPSAwOworCQkJaWYgKCpjbWQgPT0gJ04nKQorCQkJCWMxID0gIWMxOworCQkJaWYgKChjMiA9IGdyYWJzZWFyY2gobW9kaWZpZWQsIGhudW0sCisJCQkgICAgYzEsIHNyY2hwYXQpKSA8IDApIHsKKwkJCQlpZiAoYzMpIHsKKwkJCQkJcmVzdG9yZV9jYnVmKCk7CisJCQkJCXJlZnJlc2goMCk7CisJCQkJfQorCQkJCXJldHVybiAoLTEpOworCQkJfSBlbHNlIHsKKwkJCQltb2RpZmllZCA9IDA7CisJCQkJaG51bSA9IGMyOworCQkJCW9obnVtID0gaG51bTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdfJzoKKwkJCXsKKwkJCQlpbnQgaW5zcGFjZTsKKwkJCQljaGFyICpwLCAqc3A7CisKKwkJCQlpZiAoaGlzdG51bSgtMSkgPCAwKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlwID0gKmhpc3Rwb3MoKTsKKyNkZWZpbmUgaXNzcChjKQkJKGtzaF9pc3NwYWNlKGMpIHx8IChjKSA9PSAnXG4nKQorCQkJCWlmIChhcmdjbnQpIHsKKwkJCQkJd2hpbGUgKCpwICYmIGlzc3AoKnApKQorCQkJCQkJcCsrOworCQkJCQl3aGlsZSAoKnAgJiYgLS1hcmdjbnQpIHsKKwkJCQkJCXdoaWxlICgqcCAmJiAhaXNzcCgqcCkpCisJCQkJCQkJcCsrOworCQkJCQkJd2hpbGUgKCpwICYmIGlzc3AoKnApKQorCQkJCQkJCXArKzsKKwkJCQkJfQorCQkJCQlpZiAoISpwKQorCQkJCQkJcmV0dXJuICgtMSk7CisJCQkJCXNwID0gcDsKKwkJCQl9IGVsc2UgeworCQkJCQlzcCA9IHA7CisJCQkJCWluc3BhY2UgPSAwOworCQkJCQl3aGlsZSAoKnApIHsKKwkJCQkJCWlmIChpc3NwKCpwKSkKKwkJCQkJCQlpbnNwYWNlID0gMTsKKwkJCQkJCWVsc2UgaWYgKGluc3BhY2UpIHsKKwkJCQkJCQlpbnNwYWNlID0gMDsKKwkJCQkJCQlzcCA9IHA7CisJCQkJCQl9CisJCQkJCQlwKys7CisJCQkJCX0KKwkJCQkJcCA9IHNwOworCQkJCX0KKwkJCQltb2RpZmllZCA9IDE7CisJCQkJaG51bSA9IGhsYXN0OworCQkJCWlmIChlcy0+Y3Vyc29yICE9IGVzLT5saW5lbGVuKQorCQkJCQllcy0+Y3Vyc29yKys7CisJCQkJd2hpbGUgKCpwICYmICFpc3NwKCpwKSkgeworCQkJCQlhcmdjbnQrKzsKKwkJCQkJcCsrOworCQkJCX0KKwkJCQlpZiAocHV0YnVmKCIgIiwgMSwgMCkgIT0gMCkKKwkJCQkJYXJnY250ID0gLTE7CisJCQkJZWxzZSBpZiAocHV0YnVmKHNwLCBhcmdjbnQsIDApICE9IDApCisJCQkJCWFyZ2NudCA9IC0xOworCQkJCWlmIChhcmdjbnQgPCAwKSB7CisJCQkJCWlmIChlcy0+Y3Vyc29yICE9IDApCisJCQkJCQllcy0+Y3Vyc29yLS07CisJCQkJCXJldHVybiAoLTEpOworCQkJCX0KKwkJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICd+JzoKKwkJCXsKKwkJCQljaGFyICpwOworCQkJCWludCBpOworCisJCQkJaWYgKGVzLT5saW5lbGVuID09IDApCisJCQkJCXJldHVybiAoLTEpOworCQkJCWZvciAoaSA9IDA7IGkgPCBhcmdjbnQ7IGkrKykgeworCQkJCQlwID0gJmVzLT5jYnVmW2VzLT5jdXJzb3JdOworCQkJCQlpZiAoa3NoX2lzbG93ZXIoKnApKSB7CisJCQkJCQltb2RpZmllZCA9IDE7CisJCQkJCQlobnVtID0gaGxhc3Q7CisJCQkJCQkqcCA9IGtzaF90b3VwcGVyKCpwKTsKKwkJCQkJfSBlbHNlIGlmIChrc2hfaXN1cHBlcigqcCkpIHsKKwkJCQkJCW1vZGlmaWVkID0gMTsKKwkJCQkJCWhudW0gPSBobGFzdDsKKwkJCQkJCSpwID0ga3NoX3RvbG93ZXIoKnApOworCQkJCQl9CisJCQkJCWlmIChlcy0+Y3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxKQorCQkJCQkJZXMtPmN1cnNvcisrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlICcjJzoKKwkJCXsKKwkJCQlpbnQgcmV0ID0geF9kb19jb21tZW50KGVzLT5jYnVmLCBlcy0+Y2J1ZnNpemUsCisJCQkJICAgICZlcy0+bGluZWxlbik7CisJCQkJaWYgKHJldCA+PSAwKQorCQkJCQllcy0+Y3Vyc29yID0gMDsKKwkJCQlyZXR1cm4gKHJldCk7CisJCQl9CisKKwkJY2FzZSAnPSc6CQkJLyogQVQmVCBrc2ggKi8KKwkJY2FzZSBDdHJsKCdlJyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCisJCQlwcmludF9leHBhbnNpb25zKGVzLCAxKTsKKwkJCWJyZWFrOworCisKKwkJY2FzZSBDdHJsKCdpJyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCisJCQlpZiAoIUZsYWcoRlZJVEFCQ09NUExFVEUpKQorCQkJCXJldHVybiAoLTEpOworCQkJY29tcGxldGVfd29yZCgxLCBhcmdjbnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDdHJsKCdbJyk6CQkJLyogc29tZSBhbm5veWluZyBBVCZUIGtzaHMgKi8KKwkJCWlmICghRmxhZyhGVklFU0NDT01QTEVURSkpCisJCQkJcmV0dXJuICgtMSk7CisJCWNhc2UgJ1xcJzoJCQkvKiBBVCZUIGtzaCAqLworCQljYXNlIEN0cmwoJ2YnKToJCQkvKiBOb25zdGFuZGFyZCB2aS9rc2ggKi8KKwkJCWNvbXBsZXRlX3dvcmQoMSwgYXJnY250KTsKKwkJCWJyZWFrOworCisKKwkJY2FzZSAnKic6CQkJLyogQVQmVCBrc2ggKi8KKwkJY2FzZSBDdHJsKCd4Jyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCisJCQlleHBhbmRfd29yZCgxKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpbnNlcnQgPT0gMCAmJiBlcy0+Y3Vyc29yICE9IDAgJiYgZXMtPmN1cnNvciA+PSBlcy0+bGluZWxlbikKKwkJCWVzLT5jdXJzb3ItLTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorZG9tb3ZlKGludCBhcmdjbnQsIGNvbnN0IGNoYXIgKmNtZCwgaW50IHN1YikKK3sKKwlpbnQgYmNvdW50LCBpID0gMCwgdDsKKwlpbnQgbmN1cnNvciA9IDA7CisKKwlzd2l0Y2ggKCpjbWQpIHsKKwljYXNlICdiJzoKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciA9PSAwKQorCQkJcmV0dXJuICgtMSk7CisJCW5jdXJzb3IgPSBiYWNrd29yZChhcmdjbnQpOworCQlicmVhazsKKworCWNhc2UgJ0InOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yID09IDApCisJCQlyZXR1cm4gKC0xKTsKKwkJbmN1cnNvciA9IEJhY2t3b3JkKGFyZ2NudCk7CisJCWJyZWFrOworCisJY2FzZSAnZSc6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQorCQkJcmV0dXJuICgtMSk7CisJCW5jdXJzb3IgPSBlbmR3b3JkKGFyZ2NudCk7CisJCWlmIChzdWIgJiYgbmN1cnNvciA8IGVzLT5saW5lbGVuKQorCQkJbmN1cnNvcisrOworCQlicmVhazsKKworCWNhc2UgJ0UnOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKKwkJCXJldHVybiAoLTEpOworCQluY3Vyc29yID0gRW5kd29yZChhcmdjbnQpOworCQlpZiAoc3ViICYmIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKKwkJCW5jdXJzb3IrKzsKKwkJYnJlYWs7CisKKwljYXNlICdmJzoKKwljYXNlICdGJzoKKwljYXNlICd0JzoKKwljYXNlICdUJzoKKwkJZnNhdmVjbWQgPSAqY21kOworCQlmc2F2ZWNoID0gY21kWzFdOworCQkvKiBkcm9wIHRocm91Z2ggKi8KKworCWNhc2UgJywnOgorCWNhc2UgJzsnOgorCQlpZiAoZnNhdmVjbWQgPT0gJyAnKQorCQkJcmV0dXJuICgtMSk7CisJCWkgPSBmc2F2ZWNtZCA9PSAnZicgfHwgZnNhdmVjbWQgPT0gJ0YnOworCQl0ID0gZnNhdmVjbWQgPiAnYSc7CisJCWlmICgqY21kID09ICcsJykKKwkJCXQgPSAhdDsKKwkJaWYgKChuY3Vyc29yID0gZmluZGNoKGZzYXZlY2gsIGFyZ2NudCwgdCwgaSkpIDwgMCkKKwkJCXJldHVybiAoLTEpOworCQlpZiAoc3ViICYmIHQpCisJCQluY3Vyc29yKys7CisJCWJyZWFrOworCisJY2FzZSAnaCc6CisJY2FzZSBDdHJsKCdoJyk6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgPT0gMCkKKwkJCXJldHVybiAoLTEpOworCQluY3Vyc29yID0gZXMtPmN1cnNvciAtIGFyZ2NudDsKKwkJaWYgKG5jdXJzb3IgPCAwKQorCQkJbmN1cnNvciA9IDA7CisJCWJyZWFrOworCisJY2FzZSAnICc6CisJY2FzZSAnbCc6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQorCQkJcmV0dXJuICgtMSk7CisJCWlmIChlcy0+bGluZWxlbiAhPSAwKSB7CisJCQluY3Vyc29yID0gZXMtPmN1cnNvciArIGFyZ2NudDsKKwkJCWlmIChuY3Vyc29yID4gZXMtPmxpbmVsZW4pCisJCQkJbmN1cnNvciA9IGVzLT5saW5lbGVuOworCQl9CisJCWJyZWFrOworCisJY2FzZSAndyc6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgKyAxID49IGVzLT5saW5lbGVuKQorCQkJcmV0dXJuICgtMSk7CisJCW5jdXJzb3IgPSBmb3J3d29yZChhcmdjbnQpOworCQlicmVhazsKKworCWNhc2UgJ1cnOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKKwkJCXJldHVybiAoLTEpOworCQluY3Vyc29yID0gRm9yd3dvcmQoYXJnY250KTsKKwkJYnJlYWs7CisKKwljYXNlICcwJzoKKwkJbmN1cnNvciA9IDA7CisJCWJyZWFrOworCisJY2FzZSAnXic6CisJCW5jdXJzb3IgPSAwOworCQl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJgorCQkgICAga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJbmN1cnNvcisrOworCQlicmVhazsKKworCWNhc2UgJ3wnOgorCQluY3Vyc29yID0gYXJnY250OworCQlpZiAobmN1cnNvciA+IGVzLT5saW5lbGVuKQorCQkJbmN1cnNvciA9IGVzLT5saW5lbGVuOworCQlpZiAobmN1cnNvcikKKwkJCW5jdXJzb3ItLTsKKwkJYnJlYWs7CisKKwljYXNlICckJzoKKwkJaWYgKGVzLT5saW5lbGVuICE9IDApCisJCQluY3Vyc29yID0gZXMtPmxpbmVsZW47CisJCWVsc2UKKwkJCW5jdXJzb3IgPSAwOworCQlicmVhazsKKworCWNhc2UgJyUnOgorCQluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwkJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAmJgorCQkgICAgKGkgPSBicmFja3R5cGUoZXMtPmNidWZbbmN1cnNvcl0pKSA9PSAwKQorCQkJbmN1cnNvcisrOworCQlpZiAobmN1cnNvciA9PSBlcy0+bGluZWxlbikKKwkJCXJldHVybiAoLTEpOworCQliY291bnQgPSAxOworCQlkbyB7CisJCQlpZiAoaSA+IDApIHsKKwkJCQlpZiAoKytuY3Vyc29yID49IGVzLT5saW5lbGVuKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKC0tbmN1cnNvciA8IDApCisJCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJdCA9IGJyYWNrdHlwZShlcy0+Y2J1ZltuY3Vyc29yXSk7CisJCQlpZiAodCA9PSBpKQorCQkJCWJjb3VudCsrOworCQkJZWxzZSBpZiAodCA9PSAtaSkKKwkJCQliY291bnQtLTsKKwkJfSB3aGlsZSAoYmNvdW50ICE9IDApOworCQlpZiAoc3ViICYmIGkgPiAwKQorCQkJbmN1cnNvcisrOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50CityZWRvX2luc2VydChpbnQgY291bnQpCit7CisJd2hpbGUgKGNvdW50LS0gPiAwKQorCQlpZiAocHV0YnVmKGlidWYsIGluc2xlbiwgaW5zZXJ0ID09IFJFUExBQ0UpICE9IDApCisJCQlyZXR1cm4gKC0xKTsKKwlpZiAoZXMtPmN1cnNvciA+IDApCisJCWVzLT5jdXJzb3ItLTsKKwlpbnNlcnQgPSAwOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCit5YW5rX3JhbmdlKGludCBhLCBpbnQgYikKK3sKKwl5YW5rbGVuID0gYiAtIGE7CisJaWYgKHlhbmtsZW4gIT0gMCkKKwkJbWVtbW92ZSh5YnVmLCAmZXMtPmNidWZbYV0sIHlhbmtsZW4pOworfQorCitzdGF0aWMgaW50CiticmFja3R5cGUoaW50IGNoKQoreworCXN3aXRjaCAoY2gpIHsKKworCWNhc2UgJygnOgorCQlyZXR1cm4gKDEpOworCisJY2FzZSAnWyc6CisJCXJldHVybiAoMik7CisKKwljYXNlICd7JzoKKwkJcmV0dXJuICgzKTsKKworCWNhc2UgJyknOgorCQlyZXR1cm4gKC0xKTsKKworCWNhc2UgJ10nOgorCQlyZXR1cm4gKC0yKTsKKworCWNhc2UgJ30nOgorCQlyZXR1cm4gKC0zKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAoMCk7CisJfQorfQorCisvKgorICoJTm9uIHVzZXIgaW50ZXJmYWNlIGVkaXRvciByb3V0aW5lcyBiZWxvdyBoZXJlCisgKi8KKworc3RhdGljIHZvaWQKK3NhdmVfY2J1Zih2b2lkKQoreworCW1lbW1vdmUoaG9sZGJ1ZiwgZXMtPmNidWYsIGVzLT5saW5lbGVuKTsKKwlob2xkbGVuID0gZXMtPmxpbmVsZW47CisJaG9sZGJ1Zltob2xkbGVuXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkCityZXN0b3JlX2NidWYodm9pZCkKK3sKKwllcy0+Y3Vyc29yID0gMDsKKwllcy0+bGluZWxlbiA9IGhvbGRsZW47CisJbWVtbW92ZShlcy0+Y2J1ZiwgaG9sZGJ1ZiwgaG9sZGxlbik7Cit9CisKKy8qIHJldHVybiBhIG5ldyBlZHN0YXRlICovCitzdGF0aWMgc3RydWN0IGVkc3RhdGUgKgorc2F2ZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpCit7CisJc3RydWN0IGVkc3RhdGUgKm5ld3M7CisKKwluZXdzID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBlZHN0YXRlKSwgQVBFUk0pOworCW5ld3MtPmNidWYgPSBhbGxvYyhvbGQtPmNidWZzaXplLCBBUEVSTSk7CisJbWVtY3B5KG5ld3MtPmNidWYsIG9sZC0+Y2J1Ziwgb2xkLT5saW5lbGVuKTsKKwluZXdzLT5jYnVmc2l6ZSA9IG9sZC0+Y2J1ZnNpemU7CisJbmV3cy0+bGluZWxlbiA9IG9sZC0+bGluZWxlbjsKKwluZXdzLT5jdXJzb3IgPSBvbGQtPmN1cnNvcjsKKwluZXdzLT53aW5sZWZ0ID0gb2xkLT53aW5sZWZ0OworCXJldHVybiAobmV3cyk7Cit9CisKK3N0YXRpYyB2b2lkCityZXN0b3JlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm5ld3MsIHN0cnVjdCBlZHN0YXRlICpvbGQpCit7CisJbWVtY3B5KG5ld3MtPmNidWYsIG9sZC0+Y2J1Ziwgb2xkLT5saW5lbGVuKTsKKwluZXdzLT5saW5lbGVuID0gb2xkLT5saW5lbGVuOworCW5ld3MtPmN1cnNvciA9IG9sZC0+Y3Vyc29yOworCW5ld3MtPndpbmxlZnQgPSBvbGQtPndpbmxlZnQ7CisJZnJlZV9lZHN0YXRlKG9sZCk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm9sZCkKK3sKKwlhZnJlZShvbGQtPmNidWYsIEFQRVJNKTsKKwlhZnJlZShvbGQsIEFQRVJNKTsKK30KKworLyoKKyAqIHRoaXMgaXMgdXNlZCBmb3IgY2FsbGluZyB4X2VzY2FwZSgpIGluIGNvbXBsZXRlX3dvcmQoKQorICovCitzdGF0aWMgaW50Cit4X3ZpX3B1dGJ1Zihjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKQoreworCXJldHVybiAocHV0YnVmKHMsIGxlbiwgMCkpOworfQorCitzdGF0aWMgaW50CitwdXRidWYoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcmVwbCkKK3sKKwlpZiAobGVuID09IDApCisJCXJldHVybiAoMCk7CisJaWYgKHJlcGwpIHsKKwkJaWYgKGVzLT5jdXJzb3IgKyBsZW4gPj0gZXMtPmNidWZzaXplKQorCQkJcmV0dXJuICgtMSk7CisJCWlmIChlcy0+Y3Vyc29yICsgbGVuID4gZXMtPmxpbmVsZW4pCisJCQllcy0+bGluZWxlbiA9IGVzLT5jdXJzb3IgKyBsZW47CisJfSBlbHNlIHsKKwkJaWYgKGVzLT5saW5lbGVuICsgbGVuID49IGVzLT5jYnVmc2l6ZSkKKwkJCXJldHVybiAoLTEpOworCQltZW1tb3ZlKCZlcy0+Y2J1Zltlcy0+Y3Vyc29yICsgbGVuXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3JdLAorCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKKwkJZXMtPmxpbmVsZW4gKz0gbGVuOworCX0KKwltZW1tb3ZlKCZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwgYnVmLCBsZW4pOworCWVzLT5jdXJzb3IgKz0gbGVuOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWxfcmFuZ2UoaW50IGEsIGludCBiKQoreworCWlmIChlcy0+bGluZWxlbiAhPSBiKQorCQltZW1tb3ZlKCZlcy0+Y2J1ZlthXSwgJmVzLT5jYnVmW2JdLCBlcy0+bGluZWxlbiAtIGIpOworCWVzLT5saW5lbGVuIC09IGIgLSBhOworfQorCitzdGF0aWMgaW50CitmaW5kY2goaW50IGNoLCBpbnQgY250LCBpbnQgZm9ydywgaW50IGluY2wpCit7CisJaW50IG5jdXJzb3I7CisKKwlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJd2hpbGUgKGNudC0tKSB7CisJCWRvIHsKKwkJCWlmIChmb3J3KSB7CisJCQkJaWYgKCsrbmN1cnNvciA9PSBlcy0+bGluZWxlbikKKwkJCQkJcmV0dXJuICgtMSk7CisJCQl9IGVsc2UgeworCQkJCWlmICgtLW5jdXJzb3IgPCAwKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJfSB3aGlsZSAoZXMtPmNidWZbbmN1cnNvcl0gIT0gY2gpOworCX0KKwlpZiAoIWluY2wpIHsKKwkJaWYgKGZvcncpCisJCQluY3Vyc29yLS07CisJCWVsc2UKKwkJCW5jdXJzb3IrKzsKKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorZm9yd3dvcmQoaW50IGFyZ2NudCkKK3sKKwlpbnQgbmN1cnNvcjsKKworCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYgYXJnY250LS0pIHsKKwkJaWYgKGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCXdoaWxlIChrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJCSAgICBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCisJCQkJbmN1cnNvcisrOworCQllbHNlIGlmICgha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJd2hpbGUgKCFrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQorCQkJCW5jdXJzb3IrKzsKKwkJd2hpbGUgKGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQorCQkJbmN1cnNvcisrOworCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50CitiYWNrd29yZChpbnQgYXJnY250KQoreworCWludCBuY3Vyc29yOworCisJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJd2hpbGUgKG5jdXJzb3IgPiAwICYmIGFyZ2NudC0tKSB7CisJCXdoaWxlICgtLW5jdXJzb3IgPiAwICYmIGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCTsKKwkJaWYgKG5jdXJzb3IgPiAwKSB7CisJCQlpZiAoa3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJCXdoaWxlICgtLW5jdXJzb3IgPj0gMCAmJgorCQkJCSAgICBrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQkJCTsKKwkJCWVsc2UKKwkJCQl3aGlsZSAoLS1uY3Vyc29yID49IDAgJiYKKwkJCQkgICAgIWtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJCQk7CisJCQluY3Vyc29yKys7CisJCX0KKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorZW5kd29yZChpbnQgYXJnY250KQoreworCWludCBuY3Vyc29yOworCisJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAmJiBhcmdjbnQtLSkgeworCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxICYmCisJCSAgICBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQk7CisJCWlmIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxKSB7CisJCQlpZiAoa3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJCXdoaWxlICgrK25jdXJzb3IgPCBlcy0+bGluZWxlbiAmJgorCQkJCSAgICBrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQkJCTsKKwkJCWVsc2UKKwkJCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKKwkJCQkgICAgIWtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJCQk7CisJCQluY3Vyc29yLS07CisJCX0KKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorRm9yd3dvcmQoaW50IGFyZ2NudCkKK3sKKwlpbnQgbmN1cnNvcjsKKworCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYgYXJnY250LS0pIHsKKwkJd2hpbGUgKCFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKKwkJCW5jdXJzb3IrKzsKKwkJd2hpbGUgKGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQorCQkJbmN1cnNvcisrOworCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50CitCYWNrd29yZChpbnQgYXJnY250KQoreworCWludCBuY3Vyc29yOworCisJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJd2hpbGUgKG5jdXJzb3IgPiAwICYmIGFyZ2NudC0tKSB7CisJCXdoaWxlICgtLW5jdXJzb3IgPj0gMCAmJiBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQk7CisJCXdoaWxlIChuY3Vyc29yID49IDAgJiYgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCW5jdXJzb3ItLTsKKwkJbmN1cnNvcisrOworCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50CitFbmR3b3JkKGludCBhcmdjbnQpCit7CisJaW50IG5jdXJzb3I7CisKKwluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJiBhcmdjbnQtLSkgeworCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxICYmCisJCSAgICBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQk7CisJCWlmIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gLSAxKSB7CisJCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKKwkJCSAgICAha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJCTsKKwkJCW5jdXJzb3ItLTsKKwkJfQorCX0KKwlyZXR1cm4gKG5jdXJzb3IpOworfQorCitzdGF0aWMgaW50CitncmFiaGlzdChpbnQgc2F2ZSwgaW50IG4pCit7CisJY2hhciAqaHB0cjsKKworCWlmIChuIDwgMCB8fCBuID4gaGxhc3QpCisJCXJldHVybiAoLTEpOworCWlmIChuID09IGhsYXN0KSB7CisJCXJlc3RvcmVfY2J1ZigpOworCQlvaG51bSA9IG47CisJCXJldHVybiAoMCk7CisJfQorCSh2b2lkKWhpc3RudW0obik7CisJaWYgKChocHRyID0gKmhpc3Rwb3MoKSkgPT0gTlVMTCkgeworCQlpbnRlcm5hbF93YXJuaW5nZigiZ3JhYmhpc3Q6IGJhZCBoaXN0b3J5IGFycmF5Iik7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoc2F2ZSkKKwkJc2F2ZV9jYnVmKCk7CisJaWYgKChlcy0+bGluZWxlbiA9IHN0cmxlbihocHRyKSkgPj0gZXMtPmNidWZzaXplKQorCQllcy0+bGluZWxlbiA9IGVzLT5jYnVmc2l6ZSAtIDE7CisJbWVtbW92ZShlcy0+Y2J1ZiwgaHB0ciwgZXMtPmxpbmVsZW4pOworCWVzLT5jdXJzb3IgPSAwOworCW9obnVtID0gbjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitncmFic2VhcmNoKGludCBzYXZlLCBpbnQgc3RhcnQsIGludCBmd2QsIGNoYXIgKnBhdCkKK3sKKwljaGFyICpocHRyOworCWludCBoaXN0OworCWludCBhbmNob3JlZDsKKworCWlmICgoc3RhcnQgPT0gMCAmJiBmd2QgPT0gMCkgfHwgKHN0YXJ0ID49IGhsYXN0IC0gMSAmJiBmd2QgPT0gMSkpCisJCXJldHVybiAoLTEpOworCWlmIChmd2QpCisJCXN0YXJ0Kys7CisJZWxzZQorCQlzdGFydC0tOworCWFuY2hvcmVkID0gKnBhdCA9PSAnXicgPyAoKytwYXQsIDEpIDogMDsKKwlpZiAoKGhpc3QgPSBmaW5kaGlzdChzdGFydCwgZndkLCBwYXQsIGFuY2hvcmVkKSkgPCAwKSB7CisJCS8qIGlmIChzdGFydCAhPSAwICYmIGZ3ZCAmJiBtYXRjaChob2xkYnVmLCBwYXQpID49IDApIHsgKi8KKwkJLyogWFhYIHNob3VsZCBzdHJjbXAgYmUgc3RybmNtcD8gKi8KKwkJaWYgKHN0YXJ0ICE9IDAgJiYgZndkICYmIHN0cmNtcChob2xkYnVmLCBwYXQpID49IDApIHsKKwkJCXJlc3RvcmVfY2J1ZigpOworCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKHNhdmUpCisJCXNhdmVfY2J1ZigpOworCWhpc3RudW0oaGlzdCk7CisJaHB0ciA9ICpoaXN0cG9zKCk7CisJaWYgKChlcy0+bGluZWxlbiA9IHN0cmxlbihocHRyKSkgPj0gZXMtPmNidWZzaXplKQorCQllcy0+bGluZWxlbiA9IGVzLT5jYnVmc2l6ZSAtIDE7CisJbWVtbW92ZShlcy0+Y2J1ZiwgaHB0ciwgZXMtPmxpbmVsZW4pOworCWVzLT5jdXJzb3IgPSAwOworCXJldHVybiAoaGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCityZWRyYXdfbGluZShpbnQgbmV3bCkKK3sKKwkodm9pZCltZW1zZXQod2J1Zlt3aW5dLCAnICcsIHdidWZfbGVuKTsKKwlpZiAobmV3bCkgeworCQl4X3B1dGMoJ1xyJyk7CisJCXhfcHV0YygnXG4nKTsKKwl9CisJaWYgKHByb21wdF9yZWRyYXcpCisJCXBwcm9tcHQocHJvbXB0LCBwcm9tcHRfdHJ1bmMpOworCWN1cl9jb2wgPSBwd2lkdGg7CisJbW9yZWMgPSAnICc7Cit9CisKK3N0YXRpYyB2b2lkCityZWZyZXNoKGludCBsZWZ0c2lkZSkKK3sKKwlpZiAobGVmdHNpZGUgPCAwKQorCQlsZWZ0c2lkZSA9IGxhc3RyZWY7CisJZWxzZQorCQlsYXN0cmVmID0gbGVmdHNpZGU7CisJaWYgKG91dG9md2luKCkpCisJCXJld2luZG93KCk7CisJZGlzcGxheSh3YnVmWzEgLSB3aW5dLCB3YnVmW3dpbl0sIGxlZnRzaWRlKTsKKwl3aW4gPSAxIC0gd2luOworfQorCitzdGF0aWMgaW50CitvdXRvZndpbih2b2lkKQoreworCWludCBjdXIsIGNvbDsKKworCWlmIChlcy0+Y3Vyc29yIDwgZXMtPndpbmxlZnQpCisJCXJldHVybiAoMSk7CisJY29sID0gMDsKKwljdXIgPSBlcy0+d2lubGVmdDsKKwl3aGlsZSAoY3VyIDwgZXMtPmN1cnNvcikKKwkJY29sID0gbmV3Y29sKCh1bnNpZ25lZCBjaGFyKWVzLT5jYnVmW2N1cisrXSwgY29sKTsKKwlpZiAoY29sID49IHdpbndpZHRoKQorCQlyZXR1cm4gKDEpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCityZXdpbmRvdyh2b2lkKQoreworCWludCB0Y3VyLCB0Y29sOworCWludCBob2xkY3VyMSwgaG9sZGNvbDE7CisJaW50IGhvbGRjdXIyLCBob2xkY29sMjsKKworCWhvbGRjdXIxID0gaG9sZGN1cjIgPSB0Y3VyID0gMDsKKwlob2xkY29sMSA9IGhvbGRjb2wyID0gdGNvbCA9IDA7CisJd2hpbGUgKHRjdXIgPCBlcy0+Y3Vyc29yKSB7CisJCWlmICh0Y29sIC0gaG9sZGNvbDIgPiB3aW53aWR0aCAvIDIpIHsKKwkJCWhvbGRjdXIxID0gaG9sZGN1cjI7CisJCQlob2xkY29sMSA9IGhvbGRjb2wyOworCQkJaG9sZGN1cjIgPSB0Y3VyOworCQkJaG9sZGNvbDIgPSB0Y29sOworCQl9CisJCXRjb2wgPSBuZXdjb2woKHVuc2lnbmVkIGNoYXIpZXMtPmNidWZbdGN1cisrXSwgdGNvbCk7CisJfQorCXdoaWxlICh0Y29sIC0gaG9sZGNvbDEgPiB3aW53aWR0aCAvIDIpCisJCWhvbGRjb2wxID0gbmV3Y29sKCh1bnNpZ25lZCBjaGFyKWVzLT5jYnVmW2hvbGRjdXIxKytdLAorCQkgICAgaG9sZGNvbDEpOworCWVzLT53aW5sZWZ0ID0gaG9sZGN1cjE7Cit9CisKK3N0YXRpYyBpbnQKK25ld2NvbChpbnQgY2gsIGludCBjb2wpCit7CisJaWYgKGNoID09ICdcdCcpCisJCXJldHVybiAoKGNvbCB8IDcpICsgMSk7CisJcmV0dXJuIChjb2wgKyBjaGFyX2xlbihjaCkpOworfQorCitzdGF0aWMgdm9pZAorZGlzcGxheShjaGFyICp3YjEsIGNoYXIgKndiMiwgaW50IGxlZnRzaWRlKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisJY2hhciAqdHdiMSwgKnR3YjIsIG1jOworCWludCBjdXIsIGNvbCwgY250OworCWludCBuY29sID0gMDsKKwlpbnQgbW9yZXJpZ2h0OworCisJY29sID0gMDsKKwljdXIgPSBlcy0+d2lubGVmdDsKKwltb3JlcmlnaHQgPSAwOworCXR3YjEgPSB3YjE7CisJd2hpbGUgKGNvbCA8IHdpbndpZHRoICYmIGN1ciA8IGVzLT5saW5lbGVuKSB7CisJCWlmIChjdXIgPT0gZXMtPmN1cnNvciAmJiBsZWZ0c2lkZSkKKwkJCW5jb2wgPSBjb2wgKyBwd2lkdGg7CisJCWlmICgoY2ggPSBlcy0+Y2J1ZltjdXJdKSA9PSAnXHQnKQorCQkJZG8geworCQkJCSp0d2IxKysgPSAnICc7CisJCQl9IHdoaWxlICgrK2NvbCA8IHdpbndpZHRoICYmIChjb2wgJiA3KSAhPSAwKTsKKwkJZWxzZSBpZiAoY29sIDwgd2lud2lkdGgpIHsKKwkJCWlmIChjaCA8ICcgJyB8fCBjaCA9PSAweDdmKSB7CisJCQkJKnR3YjErKyA9ICdeJzsKKwkJCQlpZiAoKytjb2wgPCB3aW53aWR0aCkgeworCQkJCQkqdHdiMSsrID0gY2ggXiAnQCc7CisJCQkJCWNvbCsrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJKnR3YjErKyA9IGNoOworCQkJCWNvbCsrOworCQkJfQorCQl9CisJCWlmIChjdXIgPT0gZXMtPmN1cnNvciAmJiAhbGVmdHNpZGUpCisJCQluY29sID0gY29sICsgcHdpZHRoIC0gMTsKKwkJY3VyKys7CisJfQorCWlmIChjdXIgPT0gZXMtPmN1cnNvcikKKwkJbmNvbCA9IGNvbCArIHB3aWR0aDsKKwlpZiAoY29sIDwgd2lud2lkdGgpIHsKKwkJd2hpbGUgKGNvbCA8IHdpbndpZHRoKSB7CisJCQkqdHdiMSsrID0gJyAnOworCQkJY29sKys7CisJCX0KKwl9IGVsc2UKKwkJbW9yZXJpZ2h0Kys7CisJKnR3YjEgPSAnICc7CisKKwljb2wgPSBwd2lkdGg7CisJY250ID0gd2lud2lkdGg7CisJdHdiMSA9IHdiMTsKKwl0d2IyID0gd2IyOworCXdoaWxlIChjbnQtLSkgeworCQlpZiAoKnR3YjEgIT0gKnR3YjIpIHsKKwkJCWlmIChjdXJfY29sICE9IGNvbCkKKwkJCQllZF9tb3Zfb3B0KGNvbCwgd2IxKTsKKwkJCXhfcHV0YygqdHdiMSk7CisJCQljdXJfY29sKys7CisJCX0KKwkJdHdiMSsrOworCQl0d2IyKys7CisJCWNvbCsrOworCX0KKwlpZiAoZXMtPndpbmxlZnQgPiAwICYmIG1vcmVyaWdodCkKKwkJLyogUE9TSVggc2F5cyB0byB1c2UgKiBmb3IgdGhpcyBidXQgdGhhdCBpcyBhIGdsb2JiaW5nCisJCSAqIGNoYXJhY3RlciBhbmQgbWF5IGNvbmZ1c2UgcGVvcGxlOyArIGlzIG1vcmUgaW5ub2N1b3VzCisJCSAqLworCQltYyA9ICcrJzsKKwllbHNlIGlmIChlcy0+d2lubGVmdCA+IDApCisJCW1jID0gJzwnOworCWVsc2UgaWYgKG1vcmVyaWdodCkKKwkJbWMgPSAnPic7CisJZWxzZQorCQltYyA9ICcgJzsKKwlpZiAobWMgIT0gbW9yZWMpIHsKKwkJZWRfbW92X29wdChwd2lkdGggKyB3aW53aWR0aCArIDEsIHdiMSk7CisJCXhfcHV0YyhtYyk7CisJCWN1cl9jb2wrKzsKKwkJbW9yZWMgPSBtYzsKKwl9CisJaWYgKGN1cl9jb2wgIT0gbmNvbCkKKwkJZWRfbW92X29wdChuY29sLCB3YjEpOworfQorCitzdGF0aWMgdm9pZAorZWRfbW92X29wdChpbnQgY29sLCBjaGFyICp3YikKK3sKKwlpZiAoY29sIDwgY3VyX2NvbCkgeworCQlpZiAoY29sICsgMSA8IGN1cl9jb2wgLSBjb2wpIHsKKwkJCXhfcHV0YygnXHInKTsKKwkJCWlmIChwcm9tcHRfcmVkcmF3KQorCQkJCXBwcm9tcHQocHJvbXB0LCBwcm9tcHRfdHJ1bmMpOworCQkJY3VyX2NvbCA9IHB3aWR0aDsKKwkJCXdoaWxlIChjdXJfY29sKysgPCBjb2wpCisJCQkJeF9wdXRjZigqd2IrKyk7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoY3VyX2NvbC0tID4gY29sKQorCQkJCXhfcHV0YygnXGInKTsKKwkJfQorCX0gZWxzZSB7CisJCXdiID0gJndiW2N1cl9jb2wgLSBwd2lkdGhdOworCQl3aGlsZSAoY3VyX2NvbCsrIDwgY29sKQorCQkJeF9wdXRjZigqd2IrKyk7CisJfQorCWN1cl9jb2wgPSBjb2w7Cit9CisKKworLyogcmVwbGFjZSB3b3JkIHdpdGggYWxsIGV4cGFuc2lvbnMgKGllLCBleHBhbmQgd29yZCopICovCitzdGF0aWMgaW50CitleHBhbmRfd29yZChpbnQgY21kKQoreworCXN0YXRpYyBzdHJ1Y3QgZWRzdGF0ZSAqYnVmOworCWludCBydmFsID0gMDsKKwlpbnQgbndvcmRzOworCWludCBzdGFydCwgZW5kOworCWNoYXIgKip3b3JkczsKKwlpbnQgaTsKKworCS8qIFVuZG8gcHJldmlvdXMgZXhwYW5zaW9uICovCisJaWYgKGNtZCA9PSAwICYmIGV4cGFuZGVkID09IEVYUEFORCAmJiBidWYpIHsKKwkJcmVzdG9yZV9lZHN0YXRlKGVzLCBidWYpOworCQlidWYgPSAwOworCQlleHBhbmRlZCA9IE5PTkU7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChidWYpIHsKKwkJZnJlZV9lZHN0YXRlKGJ1Zik7CisJCWJ1ZiA9IDA7CisJfQorCisJbndvcmRzID0geF9jZl9nbG9iKFhDRl9DT01NQU5EX0ZJTEV8WENGX0ZVTExQQVRILAorCSAgICBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4sIGVzLT5jdXJzb3IsCisJICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCBOVUxMKTsKKwlpZiAobndvcmRzID09IDApIHsKKwkJdmlfZXJyb3IoKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJYnVmID0gc2F2ZV9lZHN0YXRlKGVzKTsKKwlleHBhbmRlZCA9IEVYUEFORDsKKwlkZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7CisJZXMtPmN1cnNvciA9IHN0YXJ0OworCWZvciAoaSA9IDA7IGkgPCBud29yZHM7ICkgeworCQlpZiAoeF9lc2NhcGUod29yZHNbaV0sIHN0cmxlbih3b3Jkc1tpXSksIHhfdmlfcHV0YnVmKSAhPSAwKSB7CisJCQlydmFsID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKytpIDwgbndvcmRzICYmIHB1dGJ1ZigiICIsIDEsIDApICE9IDApIHsKKwkJCXJ2YWwgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWkgPSBidWYtPmN1cnNvciAtIGVuZDsKKwlpZiAocnZhbCA9PSAwICYmIGkgPiAwKQorCQllcy0+Y3Vyc29yICs9IGk7CisJbW9kaWZpZWQgPSAxOworCWhudW0gPSBobGFzdDsKKwlpbnNlcnQgPSBJTlNFUlQ7CisJbGFzdGFjID0gMDsKKwlyZWZyZXNoKDApOworCXJldHVybiAocnZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBsZXRlX3dvcmQoaW50IGNtZCwgaW50IGNvdW50KQoreworCXN0YXRpYyBzdHJ1Y3QgZWRzdGF0ZSAqYnVmOworCWludCBydmFsLCBud29yZHMsIHN0YXJ0LCBlbmQsIG1hdGNoX2xlbjsKKwljaGFyICoqd29yZHM7CisJY2hhciAqbWF0Y2g7CisJYm9vbCBpc19jb21tYW5kLCBpc191bmlxdWU7CisKKwkvKiBVbmRvIHByZXZpb3VzIGNvbXBsZXRpb24gKi8KKwlpZiAoY21kID09IDAgJiYgZXhwYW5kZWQgPT0gQ09NUExFVEUgJiYgYnVmKSB7CisJCXByaW50X2V4cGFuc2lvbnMoYnVmLCAwKTsKKwkJZXhwYW5kZWQgPSBQUklOVDsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGNtZCA9PSAwICYmIGV4cGFuZGVkID09IFBSSU5UICYmIGJ1ZikgeworCQlyZXN0b3JlX2Vkc3RhdGUoZXMsIGJ1Zik7CisJCWJ1ZiA9IDA7CisJCWV4cGFuZGVkID0gTk9ORTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGJ1ZikgeworCQlmcmVlX2Vkc3RhdGUoYnVmKTsKKwkJYnVmID0gMDsKKwl9CisKKwkvKiBYQ0ZfRlVMTFBBVEggZm9yIGNvdW50ICdjYXVzZSB0aGUgbWVudSBwcmludGVkIGJ5IHByaW50X2V4cGFuc2lvbnMoKQorCSAqIHdhcyBkb25lIHRoaXMgd2F5LgorCSAqLworCW53b3JkcyA9IHhfY2ZfZ2xvYihYQ0ZfQ09NTUFORF9GSUxFIHwgKGNvdW50ID8gWENGX0ZVTExQQVRIIDogMCksCisJICAgIGVzLT5jYnVmLCBlcy0+bGluZWxlbiwgZXMtPmN1cnNvciwKKwkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsICZpc19jb21tYW5kKTsKKwlpZiAobndvcmRzID09IDApIHsKKwkJdmlfZXJyb3IoKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChjb3VudCkgeworCQlpbnQgaTsKKworCQljb3VudC0tOworCQlpZiAoY291bnQgPj0gbndvcmRzKSB7CisJCQl2aV9lcnJvcigpOworCQkJeF9wcmludF9leHBhbnNpb25zKG53b3Jkcywgd29yZHMsIGlzX2NvbW1hbmQpOworCQkJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOworCQkJcmVkcmF3X2xpbmUoMCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQkvKgorCQkgKiBFeHBhbmQgdGhlIGNvdW50J3RoIHdvcmQgdG8gaXRzIGJhc2VuYW1lCisJCSAqLworCQlpZiAoaXNfY29tbWFuZCkgeworCQkJbWF0Y2ggPSB3b3Jkc1tjb3VudF0gKworCQkJICAgIHhfYmFzZW5hbWUod29yZHNbY291bnRdLCBOVUxMKTsKKwkJCS8qIElmIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgbWF0Y2gsIHVzZSBmdWxsIHBhdGggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKKwkJCQlpZiAoaSAhPSBjb3VudCAmJgorCQkJCSAgICBzdHJjbXAod29yZHNbaV0gKyB4X2Jhc2VuYW1lKHdvcmRzW2ldLAorCQkJCSAgICBOVUxMKSwgbWF0Y2gpID09IDApIHsKKwkJCQkJbWF0Y2ggPSB3b3Jkc1tjb3VudF07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfSBlbHNlCisJCQltYXRjaCA9IHdvcmRzW2NvdW50XTsKKwkJbWF0Y2hfbGVuID0gc3RybGVuKG1hdGNoKTsKKwkJaXNfdW5pcXVlID0gdHJ1ZTsKKwkJLyogZXhwYW5kZWQgPSBQUklOVDsJbmV4dCBjYWxsIHVuZG8gKi8KKwl9IGVsc2UgeworCQltYXRjaCA9IHdvcmRzWzBdOworCQltYXRjaF9sZW4gPSB4X2xvbmdlc3RfcHJlZml4KG53b3Jkcywgd29yZHMpOworCQlleHBhbmRlZCA9IENPTVBMRVRFOwkvKiBuZXh0IGNhbGwgd2lsbCBsaXN0IGNvbXBsZXRpb25zICovCisJCWlzX3VuaXF1ZSA9IG53b3JkcyA9PSAxOworCX0KKworCWJ1ZiA9IHNhdmVfZWRzdGF0ZShlcyk7CisJZGVsX3JhbmdlKHN0YXJ0LCBlbmQpOworCWVzLT5jdXJzb3IgPSBzdGFydDsKKworCS8qIGVzY2FwZSBhbGwgc2hlbGwtc2Vuc2l0aXZlIGNoYXJhY3RlcnMgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8KKwkgKiBjb21tYW5kIGJ1ZmZlciAqLworCXJ2YWwgPSB4X2VzY2FwZShtYXRjaCwgbWF0Y2hfbGVuLCB4X3ZpX3B1dGJ1Zik7CisKKwlpZiAocnZhbCA9PSAwICYmIGlzX3VuaXF1ZSkgeworCQkvKiBJZiBleGFjdCBtYXRjaCwgZG9uJ3QgdW5kby4gQWxsb3dzIGRpcmVjdG9yeSBjb21wbGV0aW9ucworCQkgKiB0byBiZSB1c2VkIChpZSwgY29tcGxldGUgdGhlIG5leHQgcG9ydGlvbiBvZiB0aGUgcGF0aCkuCisJCSAqLworCQlleHBhbmRlZCA9IE5PTkU7CisKKwkJLyogSWYgbm90IGEgZGlyZWN0b3J5LCBhZGQgYSBzcGFjZSB0byB0aGUgZW5kLi4uICovCisJCWlmIChtYXRjaF9sZW4gPiAwICYmIG1hdGNoW21hdGNoX2xlbiAtIDFdICE9ICcvJykKKwkJCXJ2YWwgPSBwdXRidWYoIiAiLCAxLCAwKTsKKwl9CisJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOworCisJbW9kaWZpZWQgPSAxOworCWhudW0gPSBobGFzdDsKKwlpbnNlcnQgPSBJTlNFUlQ7CisJbGFzdGFjID0gMDsJIC8qIHByZXZlbnQgdGhpcyBmcm9tIGJlaW5nIHJlZG9uZS4uLiAqLworCXJlZnJlc2goMCk7CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCitzdGF0aWMgaW50CitwcmludF9leHBhbnNpb25zKHN0cnVjdCBlZHN0YXRlICplc3QsIGludCBjbWQgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgc3RhcnQsIGVuZCwgbndvcmRzOworCWNoYXIgKip3b3JkczsKKwlib29sIGlzX2NvbW1hbmQ7CisKKwlud29yZHMgPSB4X2NmX2dsb2IoWENGX0NPTU1BTkRfRklMRSB8IFhDRl9GVUxMUEFUSCwKKwkgICAgZXN0LT5jYnVmLCBlc3QtPmxpbmVsZW4sIGVzdC0+Y3Vyc29yLAorCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgJmlzX2NvbW1hbmQpOworCWlmIChud29yZHMgPT0gMCkgeworCQl2aV9lcnJvcigpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJeF9wcmludF9leHBhbnNpb25zKG53b3Jkcywgd29yZHMsIGlzX2NvbW1hbmQpOworCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKKwlyZWRyYXdfbGluZSgwKTsKKwlyZXR1cm4gKDApOworfQorCisvKiBTaW1pbGFyIHRvIHhfem90YyhlbWFjcy5jKSwgYnV0IG5vIHRhYiB3ZWlyZG5lc3MgKi8KK3N0YXRpYyB2b2lkCit4X3ZpX3pvdGMoaW50IGMpCit7CisJaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7CisJCXhfcHV0YygnXicpOworCQljIF49ICdAJzsKKwl9CisJeF9wdXRjKGMpOworfQorCitzdGF0aWMgdm9pZAordmlfZXJyb3Iodm9pZCkKK3sKKwkvKiBCZWVtIG91dCBvZiBhbnkgbWFjcm9zIGFzIHNvb24gYXMgYW4gZXJyb3Igb2NjdXJzICovCisJdmlfbWFjcm9fcmVzZXQoKTsKKwl4X3B1dGMoNyk7CisJeF9mbHVzaCgpOworfQorCitzdGF0aWMgdm9pZAordmlfbWFjcm9fcmVzZXQodm9pZCkKK3sKKwlpZiAobWFjcm8ucCkgeworCQlhZnJlZShtYWNyby5idWYsIEFQRVJNKTsKKwkJbWVtc2V0KChjaGFyICopJm1hY3JvLCAwLCBzaXplb2YobWFjcm8pKTsKKwl9Cit9CisjZW5kaWYgLyogIU1LU0hfU19OT1ZJICovCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9lbWFjc2ZuLmggYi9ta3NoL3NyYy9lbWFjc2ZuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzMzM5OQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2VtYWNzZm4uaApAQCAtMCwwICsxLDg5IEBACisjaWYgZGVmaW5lZChFTUFDU0ZOX0RFRk5TKQorX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZW1hY3Nmbi5oLHYgMS41IDIwMTAvMDcvMTcgMjI6MDk6MzMgdGcgRXhwICQiKTsKKyNkZWZpbmUgRk4oY25hbWUsc25hbWUsZmxhZ3MpCXN0YXRpYyBpbnQgeF8jI2NuYW1lKGludCk7CisjZWxpZiBkZWZpbmVkKEVNQUNTRk5fRU5VTVMpCisjZGVmaW5lIEZOKGNuYW1lLHNuYW1lLGZsYWdzKQlYRlVOQ18jI2NuYW1lLAorI2RlZmluZSBGMChjbmFtZSxzbmFtZSxmbGFncykJWEZVTkNfIyNjbmFtZSA9IDAsCisjZWxpZiBkZWZpbmVkKEVNQUNTRk5fSVRFTVMpCisjZGVmaW5lIEZOKGNuYW1lLHNuYW1lLGZsYWdzKQl7IHhfIyNjbmFtZSwgc25hbWUsIGZsYWdzIH0sCisjZW5kaWYKKworI2lmbmRlZiBGMAorI2RlZmluZSBGMCBGTgorI2VuZGlmCisKK0YwKGFib3J0LCAiYWJvcnQiLCAwKQorRk4oYmVnX2hpc3QsICJiZWdpbm5pbmctb2YtaGlzdG9yeSIsIDApCitGTihjbHMsICJjbGVhci1zY3JlZW4iLCAwKQorRk4oY29tbWVudCwgImNvbW1lbnQiLCAwKQorRk4oY29tcF9jb21tLCAiY29tcGxldGUtY29tbWFuZCIsIDApCitGTihjb21wX2ZpbGUsICJjb21wbGV0ZS1maWxlIiwgMCkKK0ZOKGNvbXBfbGlzdCwgImNvbXBsZXRlLWxpc3QiLCAwKQorRk4oY29tcGxldGUsICJjb21wbGV0ZSIsIDApCitGTihkZWxfYmFjaywgImRlbGV0ZS1jaGFyLWJhY2t3YXJkIiwgWEZfQVJHKQorRk4oZGVsX2J3b3JkLCAiZGVsZXRlLXdvcmQtYmFja3dhcmQiLCBYRl9BUkcpCitGTihkZWxfY2hhciwgImRlbGV0ZS1jaGFyLWZvcndhcmQiLCBYRl9BUkcpCitGTihkZWxfZndvcmQsICJkZWxldGUtd29yZC1mb3J3YXJkIiwgWEZfQVJHKQorRk4oZGVsX2xpbmUsICJraWxsLWxpbmUiLCAwKQorRk4oZHJhd19saW5lLCAicmVkcmF3IiwgMCkKKyNpZm5kZWYgTUtTSF9TTUFMTAorRk4oZWRpdF9saW5lLCAiZWRpdC1saW5lIiwgWEZfQVJHKQorI2VuZGlmCitGTihlbmRfaGlzdCwgImVuZC1vZi1oaXN0b3J5IiwgMCkKK0ZOKGVuZF9vZl90ZXh0LCAiZW90IiwgMCkKK0ZOKGVudW1lcmF0ZSwgImxpc3QiLCAwKQorRk4oZW90X2RlbCwgImVvdC1vci1kZWxldGUiLCBYRl9BUkcpCitGTihlcnJvciwgImVycm9yIiwgMCkKK0ZOKGV4cGFuZCwgImV4cGFuZC1maWxlIiwgMCkKKyNpZm5kZWYgTUtTSF9TTUFMTAorRk4oZm9sZF9jYXBpdGFsaXNlLCAiY2FwaXRhbGl6ZS13b3JkIiwgWEZfQVJHKQorRk4oZm9sZF9sb3dlciwgImRvd25jYXNlLXdvcmQiLCBYRl9BUkcpCitGTihmb2xkX3VwcGVyLCAidXBjYXNlLXdvcmQiLCBYRl9BUkcpCisjZW5kaWYKK0ZOKGdvdG9faGlzdCwgImdvdG8taGlzdG9yeSIsIFhGX0FSRykKKyNpZm5kZWYgTUtTSF9TTUFMTAorRk4oaW5zX3N0cmluZywgIm1hY3JvLXN0cmluZyIsIFhGX05PQklORCkKKyNlbmRpZgorRk4oaW5zZXJ0LCAiYXV0by1pbnNlcnQiLCBYRl9BUkcpCitGTihraWxsLCAia2lsbC10by1lb2wiLCBYRl9BUkcpCitGTihraWxsX3JlZ2lvbiwgImtpbGwtcmVnaW9uIiwgMCkKK0ZOKGxpc3RfY29tbSwgImxpc3QtY29tbWFuZCIsIDApCitGTihsaXN0X2ZpbGUsICJsaXN0LWZpbGUiLCAwKQorRk4obGl0ZXJhbCwgInF1b3RlIiwgMCkKK0ZOKG1ldGExLCAicHJlZml4LTEiLCBYRl9QUkVGSVgpCitGTihtZXRhMiwgInByZWZpeC0yIiwgWEZfUFJFRklYKQorRk4obWV0YV95YW5rLCAieWFuay1wb3AiLCAwKQorRk4obXZfYmFjaywgImJhY2t3YXJkLWNoYXIiLCBYRl9BUkcpCitGTihtdl9iZWdpbiwgImJlZ2lubmluZy1vZi1saW5lIiwgMCkKK0ZOKG12X2J3b3JkLCAiYmFja3dhcmQtd29yZCIsIFhGX0FSRykKK0ZOKG12X2VuZCwgImVuZC1vZi1saW5lIiwgMCkKK0ZOKG12X2ZvcncsICJmb3J3YXJkLWNoYXIiLCBYRl9BUkcpCitGTihtdl9md29yZCwgImZvcndhcmQtd29yZCIsIFhGX0FSRykKK0ZOKG5ld2xpbmUsICJuZXdsaW5lIiwgMCkKK0ZOKG5leHRfY29tLCAiZG93bi1oaXN0b3J5IiwgWEZfQVJHKQorRk4obmxfbmV4dF9jb20sICJuZXdsaW5lLWFuZC1uZXh0IiwgMCkKK0ZOKG5vb3AsICJuby1vcCIsIDApCitGTihwcmV2X2NvbSwgInVwLWhpc3RvcnkiLCBYRl9BUkcpCitGTihwcmV2X2hpc3R3b3JkLCAicHJldi1oaXN0LXdvcmQiLCBYRl9BUkcpCitGTihzZWFyY2hfY2hhcl9iYWNrLCAic2VhcmNoLWNoYXJhY3Rlci1iYWNrd2FyZCIsIFhGX0FSRykKK0ZOKHNlYXJjaF9jaGFyX2ZvcncsICJzZWFyY2gtY2hhcmFjdGVyLWZvcndhcmQiLCBYRl9BUkcpCitGTihzZWFyY2hfaGlzdCwgInNlYXJjaC1oaXN0b3J5IiwgMCkKKyNpZm5kZWYgTUtTSF9TTUFMTAorRk4oc2VhcmNoX2hpc3RfZG4sICJzZWFyY2gtaGlzdG9yeS1kb3duIiwgMCkKK0ZOKHNlYXJjaF9oaXN0X3VwLCAic2VhcmNoLWhpc3RvcnktdXAiLCAwKQorI2VuZGlmCitGTihzZXRfYXJnLCAic2V0LWFyZyIsIFhGX05PQklORCkKK0ZOKHNldF9tYXJrLCAic2V0LW1hcmstY29tbWFuZCIsIDApCitGTih0cmFuc3Bvc2UsICJ0cmFuc3Bvc2UtY2hhcnMiLCAwKQorRk4odmVyc2lvbiwgInZlcnNpb24iLCAwKQorI2lmbmRlZiBNS1NIX1NNQUxMCitGTih2dF9oYWNrLCAidnQxMDAtaGFjayIsIFhGX0FSRykKKyNlbmRpZgorRk4oeGNoZ19wb2ludF9tYXJrLCAiZXhjaGFuZ2UtcG9pbnQtYW5kLW1hcmsiLCAwKQorRk4oeWFuaywgInlhbmsiLCAwKQorCisjdW5kZWYgRk4KKyN1bmRlZiBGMAorI3VuZGVmIEVNQUNTRk5fREVGTlMKKyN1bmRlZiBFTUFDU0ZOX0VOVU1TCisjdW5kZWYgRU1BQ1NGTl9JVEVNUwpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZXZhbC5jIGIvbWtzaC9zcmMvZXZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmUzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9ldmFsLmMKQEAgLTAsMCArMSwxNTgwIEBACisvKgkkT3BlbkJTRDogZXZhbC5jLHYgMS4zNSAyMDEwLzAzLzI0IDA4OjI3OjI2IGZnc2NoIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZXZhbC5jLHYgMS45MCAyMDEwLzA3LzE3IDIyOjA5OjMzIHRnIEV4cCAkIik7CisKKy8qCisgKiBzdHJpbmcgZXhwYW5zaW9uCisgKgorICogZmlyc3QgcGFzczogcXVvdGluZywgSUZTIHNlcGFyYXRpb24sIH4sICR7fSwgJCgpIGFuZCAkKCgpKSBzdWJzdGl0dXRpb24uCisgKiBzZWNvbmQgcGFzczogYWx0ZXJuYXRpb24gKHssfSksIGZpbGVuYW1lIGV4cGFuc2lvbiAoKj9bXSkuCisgKi8KKworLyogZXhwYW5zaW9uIGdlbmVyYXRvciBzdGF0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgRXhwYW5kIHsKKwkvKiBpbnQgdHlwZTsgKi8JCQkvKiBzZWUgZXhwYW5kKCkgKi8KKwljb25zdCBjaGFyICpzdHI7CQkvKiBzdHJpbmcgKi8KKwl1bmlvbiB7CisJCWNvbnN0IGNoYXIgKipzdHJ2OwkvKiBzdHJpbmdbXSAqLworCQlzdHJ1Y3Qgc2hmICpzaGY7CS8qIGZpbGUgKi8KKwl9IHU7CQkJCS8qIHNvdXJjZSAqLworCXN0cnVjdCB0YmwgKnZhcjsJCS8qIHZhcmlhYmxlIGluICR7dmFyLi59ICovCisJc2hvcnQgc3BsaXQ7CQkJLyogc3BsaXQgIiRAIiAvIGNhbGwgd2FpdGxhc3QgJCgpICovCit9IEV4cGFuZDsKKworI2RlZmluZQlYQkFTRQkJMAkvKiBzY2FubmluZyBvcmlnaW5hbCAqLworI2RlZmluZQlYU1VCCQkxCS8qIGV4cGFuZGluZyAke30gc3RyaW5nICovCisjZGVmaW5lCVhBUkdTRVAJCTIJLyogaWZzMCBiZXR3ZWVuICIkKiIgKi8KKyNkZWZpbmUJWEFSRwkJMwkvKiBleHBhbmRpbmcgJCosICRAICovCisjZGVmaW5lCVhDT00JCTQJLyogZXhwYW5kaW5nICQoKSAqLworI2RlZmluZSBYTlVMTFNVQgk1CS8qICIkQCIgd2hlbiAkIyBpcyAwIChkb24ndCBnZW5lcmF0ZSB3b3JkKSAqLworI2RlZmluZSBYU1VCTUlECQk2CS8qIG1pZGRsZSBvZiBleHBhbmRpbmcgJHt9ICovCisKKy8qIFN0YXRlcyB1c2VkIGZvciBmaWVsZCBzcGxpdHRpbmcgKi8KKyNkZWZpbmUgSUZTX1dPUkQJMAkvKiB3b3JkIGhhcyBjaGFycyAob3IgcXVvdGVzKSAqLworI2RlZmluZSBJRlNfV1MJCTEJLyogaGF2ZSBzZWVuIElGUyB3aGl0ZS1zcGFjZSAqLworI2RlZmluZSBJRlNfTldTCQkyCS8qIGhhdmUgc2VlbiBJRlMgbm9uLXdoaXRlLXNwYWNlICovCisKK3N0YXRpYyBpbnQgdmFyc3ViKEV4cGFuZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICosIGludCAqKTsKK3N0YXRpYyBpbnQgY29tc3ViKEV4cGFuZCAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGNoYXIgKnRyaW1zdWIoY2hhciAqLCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBnbG9iKGNoYXIgKiwgWFB0clYgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGdsb2JpdChYU3RyaW5nICosIGNoYXIgKiosIGNoYXIgKiwgWFB0clYgKiwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICptYXliZV9leHBhbmRfdGlsZGUoY29uc3QgY2hhciAqLCBYU3RyaW5nICosIGNoYXIgKiosIGludCk7CitzdGF0aWMgY2hhciAqdGlsZGUoY2hhciAqKTsKKyNpZm5kZWYgTUtTSF9OT1BXTkFNCitzdGF0aWMgY2hhciAqaG9tZWRpcihjaGFyICopOworI2VuZGlmCitzdGF0aWMgdm9pZCBhbHRfZXhwYW5kKFhQdHJWICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCk7CitzdGF0aWMgc2l6ZV90IHV0Zmxlbihjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgdXRmaW5jcHRyKGNvbnN0IGNoYXIgKiwgbWtzaF9hcmlfdCAqKTsKKworLyogVVRGTU9ERSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBzaXplX3QKK3V0Zmxlbihjb25zdCBjaGFyICpzKQoreworCXNpemVfdCBuOworCisJaWYgKFVURk1PREUpIHsKKwkJbiA9IDA7CisJCXdoaWxlICgqcykgeworCQkJcyArPSB1dGZfcHRyYWRqKHMpOworCQkJKytuOworCQl9CisJfSBlbHNlCisJCW4gPSBzdHJsZW4ocyk7CisJcmV0dXJuIChuKTsKK30KKworc3RhdGljIHZvaWQKK3V0ZmluY3B0cihjb25zdCBjaGFyICpzLCBta3NoX2FyaV90ICpscCkKK3sKKwljb25zdCBjaGFyICpjcCA9IHM7CisKKwl3aGlsZSAoKCpscCktLSkKKwkJY3AgKz0gdXRmX3B0cmFkaihjcCk7CisJKmxwID0gY3AgLSBzOworfQorCisvKiBjb21waWxlIGFuZCBleHBhbmQgd29yZCAqLworY2hhciAqCitzdWJzdGl0dXRlKGNvbnN0IGNoYXIgKmNwLCBpbnQgZikKK3sKKwlzdHJ1Y3Qgc291cmNlICpzLCAqc29sZDsKKworCXNvbGQgPSBzb3VyY2U7CisJcyA9IHB1c2hzKFNXU1RSLCBBVEVNUCk7CisJcy0+c3RhcnQgPSBzLT5zdHIgPSBjcDsKKwlzb3VyY2UgPSBzOworCWlmICh5eWxleChPTkVXT1JEKSAhPSBMV09SRCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzdWJzdGl0dXRlIik7CisJc291cmNlID0gc29sZDsKKwlhZnJlZShzLCBBVEVNUCk7CisJcmV0dXJuIChldmFsc3RyKHl5bHZhbC5jcCwgZikpOworfQorCisvKgorICogZXhwYW5kIGFyZy1saXN0CisgKi8KK2NoYXIgKioKK2V2YWwoY29uc3QgY2hhciAqKmFwLCBpbnQgZikKK3sKKwlYUHRyViB3OworCisJaWYgKCphcCA9PSBOVUxMKSB7CisJCXVuaW9uIG1rc2hfY2NwaGFjayB2YXA7CisKKwkJdmFwLnJvID0gYXA7CisJCXJldHVybiAodmFwLnJ3KTsKKwl9CisJWFBpbml0KHcsIDMyKTsKKwlYUHB1dCh3LCBOVUxMKTsJCS8qIHNwYWNlIGZvciBzaGVsbCBuYW1lICovCisJd2hpbGUgKCphcCAhPSBOVUxMKQorCQlleHBhbmQoKmFwKyssICZ3LCBmKTsKKwlYUHB1dCh3LCBOVUxMKTsKKwlyZXR1cm4gKChjaGFyICoqKVhQY2xvc2UodykgKyAxKTsKK30KKworLyoKKyAqIGV4cGFuZCBzdHJpbmcKKyAqLworY2hhciAqCitldmFsc3RyKGNvbnN0IGNoYXIgKmNwLCBpbnQgZikKK3sKKwlYUHRyViB3OworCWNoYXIgKmRwID0gbnVsbDsKKworCVhQaW5pdCh3LCAxKTsKKwlleHBhbmQoY3AsICZ3LCBmKTsKKwlpZiAoWFBzaXplKHcpKQorCQlkcCA9ICpYUHB0cnYodyk7CisJWFBmcmVlKHcpOworCXJldHVybiAoZHApOworfQorCisvKgorICogZXhwYW5kIHN0cmluZyAtIHJldHVybiBvbmx5IG9uZSBjb21wb25lbnQKKyAqIHVzZWQgZnJvbSBpb3NldHVwIHRvIGV4cGFuZCByZWRpcmVjdGlvbiBmaWxlcworICovCitjaGFyICoKK2V2YWxvbmVzdHIoY29uc3QgY2hhciAqY3AsIGludCBmKQoreworCVhQdHJWIHc7CisJY2hhciAqcnY7CisKKwlYUGluaXQodywgMSk7CisJZXhwYW5kKGNwLCAmdywgZik7CisJc3dpdGNoIChYUHNpemUodykpIHsKKwljYXNlIDA6CisJCXJ2ID0gbnVsbDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlydiA9IChjaGFyICopICpYUHB0cnYodyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJ2ID0gZXZhbHN0cihjcCwgZiZ+RE9HTE9CKTsKKwkJYnJlYWs7CisJfQorCVhQZnJlZSh3KTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogZm9yIG5lc3RlZCBzdWJzdGl0dXRpb246ICR7dmFyOj0kdmFyMn0gKi8KK3R5cGVkZWYgc3RydWN0IFN1YlR5cGUgeworCXN0cnVjdCB0YmwgKnZhcjsJLyogdmFyaWFibGUgZm9yICR7dmFyLi59ICovCisJc3RydWN0IFN1YlR5cGUgKnByZXY7CS8qIG9sZCB0eXBlICovCisJc3RydWN0IFN1YlR5cGUgKm5leHQ7CS8qIHBvcGVkIHR5cGUgKHRvIGF2b2lkIHJlLWFsbG9jYXRpbmcpICovCisJc2hvcnQJc3R5cGU7CQkvKiBbPSstPyUjXSBhY3Rpb24gYWZ0ZXIgZXhwYW5kZWQgd29yZCAqLworCXNob3J0CWJhc2U7CQkvKiBiZWdpbiBwb3NpdGlvbiBvZiBleHBhbmRlZCB3b3JkICovCisJc2hvcnQJZjsJCS8qIHNhdmVkIHZhbHVlIG9mIGYgKERPUEFULCBldGMpICovCisJdWludDhfdAlxdW90ZXA7CQkvKiBzYXZlZCB2YWx1ZSBvZiBxdW90ZSAoZm9yICR7Li5bJSNdLi59KSAqLworCXVpbnQ4X3QJcXVvdGV3OwkJLyogc2F2ZWQgdmFsdWUgb2YgcXVvdGUgKGZvciAkey4uWystPV0uLn0pICovCit9IFN1YlR5cGU7CisKK3ZvaWQKK2V4cGFuZChjb25zdCBjaGFyICpjcCwJLyogaW5wdXQgd29yZCAqLworICAgIFhQdHJWICp3cCwJCS8qIG91dHB1dCB3b3JkcyAqLworICAgIGludCBmKQkJLyogRE8qIGZsYWdzICovCit7CisJaW50IGMgPSAwOworCWludCB0eXBlOwkJLyogZXhwYW5zaW9uIHR5cGUgKi8KKwlpbnQgcXVvdGUgPSAwOwkJLyogcXVvdGVkICovCisJWFN0cmluZyBkczsJCS8qIGRlc3RpbmF0aW9uIHN0cmluZyAqLworCWNoYXIgKmRwOwkJLyogZGVzdGluYXRpb24gKi8KKwljb25zdCBjaGFyICpzcDsJCS8qIHNvdXJjZSAqLworCWludCBmZG8sIHdvcmQ7CQkvKiBzZWNvbmQgcGFzcyBmbGFnczsgaGF2ZSB3b3JkICovCisJaW50IGRvYmxhbms7CQkvKiBmaWVsZCBzcGxpdHRpbmcgb2YgcGFyYW1ldGVyL2NvbW1hbmQgc3Vic3QgKi8KKwlFeHBhbmQgeCA9IHsJCS8qIGV4cGFuc2lvbiB2YXJpYWJsZXMgKi8KKwkJTlVMTCwgeyBOVUxMIH0sIE5VTEwsIDAKKwl9OworCVN1YlR5cGUgc3RfaGVhZCwgKnN0OworCWludCBuZXdsaW5lcyA9IDA7IC8qIEZvciB0cmFpbGluZyBuZXdsaW5lcyBpbiBDT01TVUIgKi8KKwlpbnQgc2F3X2VxLCB0aWxkZV9vazsKKwlpbnQgbWFrZV9tYWdpYzsKKwlzaXplX3QgbGVuOworCisJaWYgKGNwID09IE5VTEwpCisJCWludGVybmFsX2Vycm9yZigiZXhwYW5kKE5VTEwpIik7CisJLyogZm9yIGFsaWFzLCByZWFkb25seSwgc2V0LCB0eXBlc2V0IGNvbW1hbmRzICovCisJaWYgKChmICYgRE9WQUNIRUNLKSAmJiBpc193ZHZhcmFzc2lnbihjcCkpIHsKKwkJZiAmPSB+KERPVkFDSEVDS3xET0JMQU5LfERPR0xPQnxET1RJTERFKTsKKwkJZiB8PSBET0FTTlRJTERFOworCX0KKwlpZiAoRmxhZyhGTk9HTE9CKSkKKwkJZiAmPSB+RE9HTE9COworCWlmIChGbGFnKEZNQVJLRElSUykpCisJCWYgfD0gRE9NQVJLRElSUzsKKwlpZiAoRmxhZyhGQlJBQ0VFWFBBTkQpICYmIChmICYgRE9HTE9CKSkKKwkJZiB8PSBET0JSQUNFXzsKKworCVhpbml0KGRzLCBkcCwgMTI4LCBBVEVNUCk7CS8qIGluaXQgZGVzdC4gc3RyaW5nICovCisJdHlwZSA9IFhCQVNFOworCXNwID0gY3A7CisJZmRvID0gMDsKKwlzYXdfZXEgPSAwOworCXRpbGRlX29rID0gKGYgJiAoRE9USUxERXxET0FTTlRJTERFKSkgPyAxIDogMDsgLyogbXVzdCBiZSAxLzAgKi8KKwlkb2JsYW5rID0gMDsKKwltYWtlX21hZ2ljID0gMDsKKwl3b3JkID0gKGYmRE9CTEFOSykgPyBJRlNfV1MgOiBJRlNfV09SRDsKKwkvKiBjbGFuZyBkb2Vzbid0IGtub3cgT1NVQlNUIGNvbWVzIGJlZm9yZSBDU1VCU1QgKi8KKwltZW1zZXQoJnN0X2hlYWQsIDAsIHNpemVvZihzdF9oZWFkKSk7CisJc3QgPSAmc3RfaGVhZDsKKworCXdoaWxlICgxKSB7CisJCVhjaGVjayhkcywgZHApOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFhCQVNFOgkvKiBvcmlnaW5hbCBwcmVmaXhlZCBzdHJpbmcgKi8KKwkJCWMgPSAqc3ArKzsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSBFT1M6CisJCQkJYyA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIENIQVI6CisJCQkJYyA9ICpzcCsrOworCQkJCWJyZWFrOworCQkJY2FzZSBRQ0hBUjoKKwkJCQlxdW90ZSB8PSAyOyAvKiB0ZW1wb3JhcnkgcXVvdGUgKi8KKwkJCQljID0gKnNwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIE9RVU9URToKKwkJCQl3b3JkID0gSUZTX1dPUkQ7CisJCQkJdGlsZGVfb2sgPSAwOworCQkJCXF1b3RlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgQ1FVT1RFOgorCQkJCXF1b3RlID0gc3QtPnF1b3RldzsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgQ09NU1VCOgorCQkJCXRpbGRlX29rID0gMDsKKwkJCQlpZiAoZiAmIERPTlRSVU5DT01NQU5EKSB7CisJCQkJCXdvcmQgPSBJRlNfV09SRDsKKwkJCQkJKmRwKysgPSAnJCc7ICpkcCsrID0gJygnOworCQkJCQl3aGlsZSAoKnNwICE9ICdcMCcpIHsKKwkJCQkJCVhjaGVjayhkcywgZHApOworCQkJCQkJKmRwKysgPSAqc3ArKzsKKwkJCQkJfQorCQkJCQkqZHArKyA9ICcpJzsKKwkJCQl9IGVsc2UgeworCQkJCQl0eXBlID0gY29tc3ViKCZ4LCBzcCk7CisJCQkJCWlmICh0eXBlID09IFhDT00gJiYgKGYmRE9CTEFOSykpCisJCQkJCQlkb2JsYW5rKys7CisJCQkJCXNwID0gc3RybnVsKHNwKSArIDE7CisJCQkJCW5ld2xpbmVzID0gMDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQljYXNlIEVYUFJTVUI6CisJCQkJd29yZCA9IElGU19XT1JEOworCQkJCXRpbGRlX29rID0gMDsKKwkJCQlpZiAoZiAmIERPTlRSVU5DT01NQU5EKSB7CisJCQkJCSpkcCsrID0gJyQnOyAqZHArKyA9ICcoJzsgKmRwKysgPSAnKCc7CisJCQkJCXdoaWxlICgqc3AgIT0gJ1wwJykgeworCQkJCQkJWGNoZWNrKGRzLCBkcCk7CisJCQkJCQkqZHArKyA9ICpzcCsrOworCQkJCQl9CisJCQkJCSpkcCsrID0gJyknOyAqZHArKyA9ICcpJzsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJ1Y3QgdGJsIHY7CisJCQkJCWNoYXIgKnA7CisKKwkJCQkJdi5mbGFnID0gREVGSU5FRHxJU1NFVHxJTlRFR0VSOworCQkJCQl2LnR5cGUgPSAxMDsgLyogbm90IGRlZmF1bHQgKi8KKwkJCQkJdi5uYW1lWzBdID0gJ1wwJzsKKwkJCQkJdl9ldmFsdWF0ZSgmdiwgc3Vic3RpdHV0ZShzcCwgMCksCisJCQkJCSAgICBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKKwkJCQkJc3AgPSBzdHJudWwoc3ApICsgMTsKKwkJCQkJZm9yIChwID0gc3RyX3ZhbCgmdik7ICpwOyApIHsKKwkJCQkJCVhjaGVjayhkcywgZHApOworCQkJCQkJKmRwKysgPSAqcCsrOworCQkJCQl9CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBPU1VCU1Q6IHsJLyogJHt7I312YXJ7On1bPSstPyMlXXdvcmR9ICovCisJCQkvKiBmb3JtYXQgaXM6CisJCQkgKglPU1VCU1QgW3t4XSBwbGFpbi12YXJpYWJsZS1wYXJ0IFwwCisJCQkgKgkgICAgY29tcGlsZWQtd29yZC1wYXJ0IENTVUJTVCBbfXhdCisJCQkgKiBUaGlzIGlzIHdoZXJlIGFsbCBzeW50YXggY2hlY2tpbmcgZ2V0cyBkb25lLi4uCisJCQkgKi8KKwkJCQljb25zdCBjaGFyICp2YXJuYW1lID0gKytzcDsgLyogc2tpcCB0aGUgeyBvciB4ICh9KSAqLworCQkJCWludCBzdHlwZTsKKwkJCQlpbnQgc2xlbiA9IDA7CisKKwkJCQlzcCA9IGNzdHJjaHIoc3AsICdcMCcpICsgMTsgLyogc2tpcCB2YXJpYWJsZSAqLworCQkJCXR5cGUgPSB2YXJzdWIoJngsIHZhcm5hbWUsIHNwLCAmc3R5cGUsICZzbGVuKTsKKwkJCQlpZiAodHlwZSA8IDApIHsKKwkJCQkJY2hhciAqYmVnLCAqZW5kLCAqc3RyOworCisgdW53aW5kX3N1YnN0c3luOgorCQkJCQlzcCA9IHZhcm5hbWUgLSAyOyAvKiByZXN0b3JlIHNwICovCisJCQkJCWVuZCA9IChiZWcgPSB3ZGNvcHkoc3AsIEFURU1QKSkgKworCQkJCQkgICAgKHdkc2NhbihzcCwgQ1NVQlNUKSAtIHNwKTsKKwkJCQkJLyogKHspIHRoZSB9IG9yIHggaXMgYWxyZWFkeSBza2lwcGVkICovCisJCQkJCWlmIChlbmQgPCB3ZHNjYW4oYmVnLCBFT1MpKQorCQkJCQkJKmVuZCA9IEVPUzsKKwkJCQkJc3RyID0gc25wdHJlZWYoTlVMTCwgNjQsICIlUyIsIGJlZyk7CisJCQkJCWFmcmVlKGJlZywgQVRFTVApOworCQkJCQllcnJvcmYoIiVzOiBiYWQgc3Vic3RpdHV0aW9uIiwgc3RyKTsKKwkJCQl9CisJCQkJaWYgKGYgJiBET0JMQU5LKQorCQkJCQlkb2JsYW5rKys7CisJCQkJdGlsZGVfb2sgPSAwOworCQkJCWlmICh0eXBlID09IFhCQVNFKSB7CS8qIGV4cGFuZD8gKi8KKwkJCQkJaWYgKCFzdC0+bmV4dCkgeworCQkJCQkJU3ViVHlwZSAqbmV3c3Q7CisKKwkJCQkJCW5ld3N0ID0gYWxsb2Moc2l6ZW9mKFN1YlR5cGUpLCBBVEVNUCk7CisJCQkJCQluZXdzdC0+bmV4dCA9IE5VTEw7CisJCQkJCQluZXdzdC0+cHJldiA9IHN0OworCQkJCQkJc3QtPm5leHQgPSBuZXdzdDsKKwkJCQkJfQorCQkJCQlzdCA9IHN0LT5uZXh0OworCQkJCQlzdC0+c3R5cGUgPSBzdHlwZTsKKwkJCQkJc3QtPmJhc2UgPSBYc2F2ZXBvcyhkcywgZHApOworCQkJCQlzdC0+ZiA9IGY7CisJCQkJCXN0LT52YXIgPSB4LnZhcjsKKwkJCQkJc3QtPnF1b3RldyA9IHN0LT5xdW90ZXAgPSBxdW90ZTsKKwkJCQkJLyogc2tpcCBxdWFsaWZpZXIocykgKi8KKwkJCQkJaWYgKHN0eXBlKQorCQkJCQkJc3AgKz0gc2xlbjsKKwkJCQkJc3dpdGNoIChzdHlwZSAmIDB4N2YpIHsKKwkJCQkJY2FzZSAnMCc6IHsKKwkJCQkJCWNoYXIgKmJlZywgKm1pZCwgKmVuZCwgKnN0ZzsKKwkJCQkJCW1rc2hfYXJpX3QgZnJvbSA9IDAsIG51bSA9IC0xLCBmbGVuLCBmaW5jID0gMDsKKworCQkJCQkJYmVnID0gd2Rjb3B5KHNwLCBBVEVNUCk7CisJCQkJCQltaWQgPSBiZWcgKyAod2RzY2FuKHNwLCBBREVMSU0pIC0gc3ApOworCQkJCQkJc3RnID0gYmVnICsgKHdkc2NhbihzcCwgQ1NVQlNUKSAtIHNwKTsKKwkJCQkJCWlmIChtaWQgPj0gc3RnKQorCQkJCQkJCWdvdG8gdW53aW5kX3N1YnN0c3luOworCQkJCQkJbWlkWy0yXSA9IEVPUzsKKwkJCQkJCWlmIChtaWRbLTFdID09IC8qeyovJ30nKSB7CisJCQkJCQkJc3AgKz0gbWlkIC0gYmVnIC0gMTsKKwkJCQkJCQllbmQgPSBOVUxMOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQllbmQgPSBtaWQgKworCQkJCQkJCSAgICAod2RzY2FuKG1pZCwgQURFTElNKSAtIG1pZCk7CisJCQkJCQkJaWYgKGVuZCA+PSBzdGcpCisJCQkJCQkJCWdvdG8gdW53aW5kX3N1YnN0c3luOworCQkJCQkJCWVuZFstMl0gPSBFT1M7CisJCQkJCQkJc3AgKz0gZW5kIC0gYmVnIC0gMTsKKwkJCQkJCX0KKwkJCQkJCWV2YWx1YXRlKHN1YnN0aXR1dGUoc3RnID0gd2RzdHJpcChiZWcsIGZhbHNlLCBmYWxzZSksIDApLAorCQkJCQkJICAgICZmcm9tLCBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKKwkJCQkJCWFmcmVlKHN0ZywgQVRFTVApOworCQkJCQkJaWYgKGVuZCkgeworCQkJCQkJCWV2YWx1YXRlKHN1YnN0aXR1dGUoc3RnID0gd2RzdHJpcChtaWQsIGZhbHNlLCBmYWxzZSksIDApLAorCQkJCQkJCSAgICAmbnVtLCBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKKwkJCQkJCQlhZnJlZShzdGcsIEFURU1QKTsKKwkJCQkJCX0KKwkJCQkJCWFmcmVlKGJlZywgQVRFTVApOworCQkJCQkJYmVnID0gc3RyX3ZhbChzdC0+dmFyKTsKKwkJCQkJCWZsZW4gPSB1dGZsZW4oYmVnKTsKKwkJCQkJCWlmIChmcm9tIDwgMCkgeworCQkJCQkJCWlmICgtZnJvbSA8IGZsZW4pCisJCQkJCQkJCWZpbmMgPSBmbGVuICsgZnJvbTsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCWZpbmMgPSBmcm9tIDwgZmxlbiA/IGZyb20gOiBmbGVuOworCQkJCQkJaWYgKFVURk1PREUpCisJCQkJCQkJdXRmaW5jcHRyKGJlZywgJmZpbmMpOworCQkJCQkJYmVnICs9IGZpbmM7CisJCQkJCQlmbGVuID0gdXRmbGVuKGJlZyk7CisJCQkJCQlpZiAobnVtIDwgMCB8fCBudW0gPiBmbGVuKQorCQkJCQkJCW51bSA9IGZsZW47CisJCQkJCQlpZiAoVVRGTU9ERSkKKwkJCQkJCQl1dGZpbmNwdHIoYmVnLCAmbnVtKTsKKwkJCQkJCXN0cm5kdXB4KHguc3RyLCBiZWcsIG51bSwgQVRFTVApOworCQkJCQkJZ290byBkb19DU1VCU1Q7CisJCQkJCX0KKwkJCQkJY2FzZSAnLyc6IHsKKwkJCQkJCWNoYXIgKnMsICpwLCAqZCwgKnNiZWcsICplbmQ7CisJCQkJCQljaGFyICpwYXQsICpycmVwOworCQkJCQkJY2hhciAqdHBhdDAsICp0cGF0MSwgKnRwYXQyOworCisJCQkJCQlzID0gd2Rjb3B5KHNwLCBBVEVNUCk7CisJCQkJCQlwID0gcyArICh3ZHNjYW4oc3AsIEFERUxJTSkgLSBzcCk7CisJCQkJCQlkID0gcyArICh3ZHNjYW4oc3AsIENTVUJTVCkgLSBzcCk7CisJCQkJCQlpZiAocCA+PSBkKQorCQkJCQkJCWdvdG8gdW53aW5kX3N1YnN0c3luOworCQkJCQkJcFstMl0gPSBFT1M7CisJCQkJCQlpZiAocFstMV0gPT0gLyp7Ki8nfScpCisJCQkJCQkJZCA9IE5VTEw7CisJCQkJCQllbHNlCisJCQkJCQkJZFstMl0gPSBFT1M7CisJCQkJCQlzcCArPSAoZCA/IGQgOiBwKSAtIHMgLSAxOworCQkJCQkJdHBhdDAgPSB3ZHN0cmlwKHMsIHRydWUsIHRydWUpOworCQkJCQkJcGF0ID0gc3Vic3RpdHV0ZSh0cGF0MCwgMCk7CisJCQkJCQlpZiAoZCkgeworCQkJCQkJCWQgPSB3ZHN0cmlwKHAsIHRydWUsIGZhbHNlKTsKKwkJCQkJCQlycmVwID0gc3Vic3RpdHV0ZShkLCAwKTsKKwkJCQkJCQlhZnJlZShkLCBBVEVNUCk7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlycmVwID0gbnVsbDsKKwkJCQkJCWFmcmVlKHMsIEFURU1QKTsKKwkJCQkJCXMgPSBkID0gcGF0OworCQkJCQkJd2hpbGUgKCpzKQorCQkJCQkJCWlmICgqcyAhPSAnXFwnIHx8CisJCQkJCQkJICAgIHNbMV0gPT0gJyUnIHx8CisJCQkJCQkJICAgIHNbMV0gPT0gJyMnIHx8CisJCQkJCQkJICAgIHNbMV0gPT0gJ1wwJyB8fAorCQkJCS8qIFhYWCByZWFsbHk/ICovCSAgICBzWzFdID09ICdcXCcgfHwKKwkJCQkJCQkgICAgc1sxXSA9PSAnLycpCisJCQkJCQkJCSpkKysgPSAqcysrOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcysrOworCQkJCQkJKmQgPSAnXDAnOworCQkJCQkJYWZyZWUodHBhdDAsIEFURU1QKTsKKworCQkJCQkJLyogcmVqZWN0IGVtcHR5IHBhdHRlcm4gKi8KKwkJCQkJCWlmICghKnBhdCB8fCBnbWF0Y2h4KCIiLCBwYXQsIGZhbHNlKSkKKwkJCQkJCQlnb3RvIG5vX3JlcGw7CisKKwkJCQkJCS8qIHByZXBhcmUgc3RyaW5nIG9uIHdoaWNoIHRvIHdvcmsgKi8KKwkJCQkJCXN0cmR1cHgocywgc3RyX3ZhbChzdC0+dmFyKSwgQVRFTVApOworCQkJCQkJc2JlZyA9IHM7CisKKwkJCQkJCS8qIGZpcnN0IHNlZSBpZiB3ZSBoYXZlIGFueSBtYXRjaCBhdCBhbGwgKi8KKwkJCQkJCXRwYXQwID0gcGF0OworCQkJCQkJaWYgKCpwYXQgPT0gJyMnKSB7CisJCQkJCQkJLyogYW5jaG9yIGF0IHRoZSBiZWdpbm5pbmcgKi8KKwkJCQkJCQl0cGF0MSA9IHNoZl9zbXByaW50ZigiJXMlYyoiLCArK3RwYXQwLCBNQUdJQyk7CisJCQkJCQkJdHBhdDIgPSB0cGF0MTsKKwkJCQkJCX0gZWxzZSBpZiAoKnBhdCA9PSAnJScpIHsKKwkJCQkJCQkvKiBhbmNob3IgYXQgdGhlIGVuZCAqLworCQkJCQkJCXRwYXQxID0gc2hmX3NtcHJpbnRmKCIlYyolcyIsIE1BR0lDLCArK3RwYXQwKTsKKwkJCQkJCQl0cGF0MiA9IHRwYXQwOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvKiBmbG9hdCAqLworCQkJCQkJCXRwYXQxID0gc2hmX3NtcHJpbnRmKCIlYyolcyVjKiIsIE1BR0lDLCBwYXQsIE1BR0lDKTsKKwkJCQkJCQl0cGF0MiA9IHRwYXQxICsgMjsKKwkJCQkJCX0KKyBhZ2Fpbl9yZXBsOgorCQkJCQkJLyogdGhpcyB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIGdtYXRjaHggd291bGQgcmV0dXJuCisJCQkJCQkgKiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgb2YgYSBtYXRjaCBmb3VuZCwgbGlrZSByZSoKKwkJCQkJCSAqLworCQkJCQkJaWYgKCFnbWF0Y2h4KHNiZWcsIHRwYXQxLCBmYWxzZSkpCisJCQkJCQkJZ290byBlbmRfcmVwbDsKKwkJCQkJCWVuZCA9IHN0cm51bChzKTsKKwkJCQkJCS8qIG5vdyBhbmNob3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWF0Y2ggKi8KKwkJCQkJCWlmICgqcGF0ICE9ICcjJykKKwkJCQkJCQl3aGlsZSAoc2JlZyA8PSBlbmQpIHsKKwkJCQkJCQkJaWYgKGdtYXRjaHgoc2JlZywgdHBhdDIsIGZhbHNlKSkKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQllbHNlCisJCQkJCQkJCQlzYmVnKys7CisJCQkJCQkJfQorCQkJCQkJLyogbm93IGFuY2hvciB0aGUgZW5kIG9mIHRoZSBtYXRjaCAqLworCQkJCQkJcCA9IGVuZDsKKwkJCQkJCWlmICgqcGF0ICE9ICclJykKKwkJCQkJCQl3aGlsZSAocCA+PSBzYmVnKSB7CisJCQkJCQkJCWJvb2wgZ290bWF0Y2g7CisKKwkJCQkJCQkJYyA9ICpwOyAqcCA9ICdcMCc7CisJCQkJCQkJCWdvdG1hdGNoID0gZ21hdGNoeChzYmVnLCB0cGF0MCwgZmFsc2UpOworCQkJCQkJCQkqcCA9IGM7CisJCQkJCQkJCWlmIChnb3RtYXRjaCkKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQlwLS07CisJCQkJCQkJfQorCQkJCQkJc3RybmR1cHgoZW5kLCBzLCBzYmVnIC0gcywgQVRFTVApOworCQkJCQkJZCA9IHNoZl9zbXByaW50ZigiJXMlcyVzIiwgZW5kLCBycmVwLCBwKTsKKwkJCQkJCWFmcmVlKGVuZCwgQVRFTVApOworCQkJCQkJc2JlZyA9IGQgKyAoc2JlZyAtIHMpICsgc3RybGVuKHJyZXApOworCQkJCQkJYWZyZWUocywgQVRFTVApOworCQkJCQkJcyA9IGQ7CisJCQkJCQlpZiAoc3R5cGUgJiAweDgwKQorCQkJCQkJCWdvdG8gYWdhaW5fcmVwbDsKKyBlbmRfcmVwbDoKKwkJCQkJCWFmcmVlKHRwYXQxLCBBVEVNUCk7CisJCQkJCQl4LnN0ciA9IHM7Cisgbm9fcmVwbDoKKwkJCQkJCWFmcmVlKHBhdCwgQVRFTVApOworCQkJCQkJaWYgKHJyZXAgIT0gbnVsbCkKKwkJCQkJCQlhZnJlZShycmVwLCBBVEVNUCk7CisJCQkJCQlnb3RvIGRvX0NTVUJTVDsKKwkJCQkJfQorCQkJCQljYXNlICcjJzoKKwkJCQkJY2FzZSAnJSc6CisJCQkJCQkvKiAhIERPQkxBTkssRE9CUkFDRV8sRE9USUxERSAqLworCQkJCQkJZiA9IERPUEFUIHwgKGYmRE9OVFJVTkNPTU1BTkQpIHwKKwkJCQkJCSAgICBET1RFTVBfOworCQkJCQkJc3QtPnF1b3RldyA9IHF1b3RlID0gMDsKKwkJCQkJCS8qIFByZXBlbmQgb3BlbiBwYXR0ZXJuIChzbyB8CisJCQkJCQkgKiBpbiBhIHRyaW0gd2lsbCB3b3JrIGFzCisJCQkJCQkgKiBleHBlY3RlZCkKKwkJCQkJCSAqLworCQkJCQkJKmRwKysgPSBNQUdJQzsKKwkJCQkJCSpkcCsrID0gKGNoYXIpKCdAJyB8IDB4ODApOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJz0nOgorCQkJCQkJLyogRW5hYmxpbmcgdGlsZGUgZXhwYW5zaW9uCisJCQkJCQkgKiBhZnRlciA6cyBoZXJlIGlzCisJCQkJCQkgKiBub24tc3RhbmRhcmQga3NoLCBidXQgaXMKKwkJCQkJCSAqIGNvbnNpc3RlbnQgd2l0aCBydWxlcyBmb3IKKwkJCQkJCSAqIG90aGVyIGFzc2lnbm1lbnRzLiBOb3QKKwkJCQkJCSAqIHN1cmUgd2hhdCBQT1NJWCB0aGlua3Mgb2YKKwkJCQkJCSAqIHRoaXMuCisJCQkJCQkgKiBOb3QgZG9pbmcgdGlsZGUgZXhwYW5zaW9uCisJCQkJCQkgKiBmb3IgaW50ZWdlciB2YXJpYWJsZXMgaXMgYQorCQkJCQkJICogbm9uLVBPU0lYIHRoaW5nIC0gbWFrZXMKKwkJCQkJCSAqIHNlbnNlIHRob3VnaCwgc2luY2UgfiBpcworCQkJCQkJICogYSBhcml0aG1ldGljIG9wZXJhdG9yLgorCQkJCQkJICovCisJCQkJCQlpZiAoISh4LnZhci0+ZmxhZyAmIElOVEVHRVIpKQorCQkJCQkJCWYgfD0gRE9BU05USUxERXxET1RJTERFOworCQkJCQkJZiB8PSBET1RFTVBfOworCQkJCQkJLyogVGhlc2Ugd2lsbCBiZSBkb25lIGFmdGVyIHRoZQorCQkJCQkJICogdmFsdWUgaGFzIGJlZW4gYXNzaWduZWQuCisJCQkJCQkgKi8KKwkJCQkJCWYgJj0gfihET0JMQU5LfERPR0xPQnxET0JSQUNFXyk7CisJCQkJCQl0aWxkZV9vayA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnPyc6CisJCQkJCQlmICY9IH5ET0JMQU5LOworCQkJCQkJZiB8PSBET1RFTVBfOworCQkJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCQkJZGVmYXVsdDoKKwkJCQkJCS8qIEVuYWJsZSB0aWxkZSBleHBhbnNpb24gKi8KKwkJCQkJCXRpbGRlX29rID0gMTsKKwkJCQkJCWYgfD0gRE9USUxERTsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQkvKiBza2lwIHdvcmQgKi8KKwkJCQkJc3AgKz0gd2RzY2FuKHNwLCBDU1VCU1QpIC0gc3A7CisJCQkJY29udGludWU7CisJCQl9CisJCQljYXNlIENTVUJTVDogLyogb25seSBnZXQgaGVyZSBpZiBleHBhbmRpbmcgd29yZCAqLworIGRvX0NTVUJTVDoKKwkJCQlzcCsrOyAvKiAoeykgc2tpcCB0aGUgfSBvciB4ICovCisJCQkJdGlsZGVfb2sgPSAwOwkvKiBpbiBjYXNlIG9mICR7dW5zZXQ6LX0gKi8KKwkJCQkqZHAgPSAnXDAnOworCQkJCXF1b3RlID0gc3QtPnF1b3RlcDsKKwkJCQlmID0gc3QtPmY7CisJCQkJaWYgKGYmRE9CTEFOSykKKwkJCQkJZG9ibGFuay0tOworCQkJCXN3aXRjaCAoc3QtPnN0eXBlJjB4N2YpIHsKKwkJCQljYXNlICcjJzoKKwkJCQljYXNlICclJzoKKwkJCQkJLyogQXBwZW5kIGVuZC1wYXR0ZXJuICovCisJCQkJCSpkcCsrID0gTUFHSUM7ICpkcCsrID0gJyknOyAqZHAgPSAnXDAnOworCQkJCQlkcCA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOworCQkJCQkvKiBNdXN0IHVzZSBzdC0+dmFyIHNpbmNlIGNhbGxpbmcKKwkJCQkJICogZ2xvYmFsIHdvdWxkIGJyZWFrIHRoaW5ncworCQkJCQkgKiBsaWtlIHhbaSs9MV0uCisJCQkJCSAqLworCQkJCQl4LnN0ciA9IHRyaW1zdWIoc3RyX3ZhbChzdC0+dmFyKSwKKwkJCQkJCWRwLCBzdC0+c3R5cGUpOworCQkJCQlpZiAoeC5zdHJbMF0gIT0gJ1wwJyB8fCBzdC0+cXVvdGVwKQorCQkJCQkJdHlwZSA9IFhTVUI7CisJCQkJCWVsc2UKKwkJCQkJCXR5cGUgPSBYTlVMTFNVQjsKKwkJCQkJaWYgKGYmRE9CTEFOSykKKwkJCQkJCWRvYmxhbmsrKzsKKwkJCQkJc3QgPSBzdC0+cHJldjsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSAnPSc6CisJCQkJCS8qIFJlc3RvcmUgb3VyIHBvc2l0aW9uIGFuZCBzdWJzdGl0dXRlCisJCQkJCSAqIHRoZSB2YWx1ZSBvZiBzdC0+dmFyIChtYXkgbm90IGJlCisJCQkJCSAqIHRoZSBhc3NpZ25lZCB2YWx1ZSBpbiB0aGUgcHJlc2VuY2UKKwkJCQkJICogb2YgaW50ZWdlci9yaWdodC1hZGovZXRjIGF0dHJpYnV0ZXMpLgorCQkJCQkgKi8KKwkJCQkJZHAgPSBYcmVzdHBvcyhkcywgZHAsIHN0LT5iYXNlKTsKKwkJCQkJLyogTXVzdCB1c2Ugc3QtPnZhciBzaW5jZSBjYWxsaW5nCisJCQkJCSAqIGdsb2JhbCB3b3VsZCBjYXVzZSB3aXRoIHRoaW5ncworCQkJCQkgKiBsaWtlIHhbaSs9MV0gdG8gYmUgZXZhbHVhdGVkIHR3aWNlLgorCQkJCQkgKi8KKwkJCQkJLyogTm90ZTogbm90IGV4cG9ydGVkIGJ5IEZFWFBPUlQKKwkJCQkJICogaW4gQVQmVCBrc2guCisJCQkJCSAqLworCQkJCQkvKiBYWFggUE9TSVggc2F5cyByZWFkb25seSBpcyBvbmx5CisJCQkJCSAqIGZhdGFsIGZvciBzcGVjaWFsIGJ1aWx0aW5zIChzZXRzdHIKKwkJCQkJICogZG9lcyByZWFkb25seSBjaGVjaykuCisJCQkJCSAqLworCQkJCQlsZW4gPSBzdHJsZW4oZHApICsgMTsKKwkJCQkJc2V0c3RyKHN0LT52YXIsCisJCQkJCSAgICBkZWJ1bmsoYWxsb2MobGVuLCBBVEVNUCksCisJCQkJCSAgICBkcCwgbGVuKSwgS1NIX1VOV0lORF9FUlJPUik7CisJCQkJCXguc3RyID0gc3RyX3ZhbChzdC0+dmFyKTsKKwkJCQkJdHlwZSA9IFhTVUI7CisJCQkJCWlmIChmJkRPQkxBTkspCisJCQkJCQlkb2JsYW5rKys7CisJCQkJCXN0ID0gc3QtPnByZXY7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJz8nOiB7CisJCQkJCWNoYXIgKnMgPSBYcmVzdHBvcyhkcywgZHAsIHN0LT5iYXNlKTsKKworCQkJCQllcnJvcmYoIiVzOiAlcyIsIHN0LT52YXItPm5hbWUsCisJCQkJCSAgICBkcCA9PSBzID8KKwkJCQkJICAgICJwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0IiA6CisJCQkJCSAgICAoZGVidW5rKHMsIHMsIHN0cmxlbihzKSArIDEpLCBzKSk7CisJCQkJfQorCQkJCWNhc2UgJzAnOgorCQkJCWNhc2UgJy8nOgorCQkJCQlkcCA9IFhyZXN0cG9zKGRzLCBkcCwgc3QtPmJhc2UpOworCQkJCQl0eXBlID0gWFNVQjsKKwkJCQkJaWYgKGYmRE9CTEFOSykKKwkJCQkJCWRvYmxhbmsrKzsKKwkJCQkJc3QgPSBzdC0+cHJldjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXN0ID0gc3QtPnByZXY7CisJCQkJdHlwZSA9IFhCQVNFOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIE9QQVQ6IC8qIG9wZW4gcGF0dGVybjogKihmb298YmFyKSAqLworCQkJCS8qIE5leHQgY2hhciBpcyB0aGUgdHlwZSBvZiBwYXR0ZXJuICovCisJCQkJbWFrZV9tYWdpYyA9IDE7CisJCQkJYyA9ICpzcCsrICsgMHg4MDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTUEFUOiAvKiBwYXR0ZXJuIHNlcGFyYXRvciAofCkgKi8KKwkJCQltYWtlX21hZ2ljID0gMTsKKwkJCQljID0gJ3wnOworCQkJCWJyZWFrOworCisJCQljYXNlIENQQVQ6IC8qIGNsb3NlIHBhdHRlcm4gKi8KKwkJCQltYWtlX21hZ2ljID0gMTsKKwkJCQljID0gLyooKi8gJyknOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBYTlVMTFNVQjoKKwkJCS8qIFNwZWNpYWwgY2FzZSBmb3IgIiRAIiAoYW5kICIke2Zvb1tAXX0iKSAtIG5vCisJCQkgKiB3b3JkIGlzIGdlbmVyYXRlZCBpZiAkIyBpcyAwICh1bmxlc3MgdGhlcmUgaXMKKwkJCSAqIG90aGVyIHN0dWZmIGluc2lkZSB0aGUgcXVvdGVzKS4KKwkJCSAqLworCQkJdHlwZSA9IFhCQVNFOworCQkJaWYgKGYmRE9CTEFOSykgeworCQkJCWRvYmxhbmstLTsKKwkJCQkvKiBub3QgcmVhbGx5IGNvcnJlY3Q6IHg9OyAiJHgkQCIgc2hvdWxkCisJCQkJICogZ2VuZXJhdGUgYSBudWxsIGFyZ3VtZW50IGFuZAorCQkJCSAqIHNldCBBOyAiJHtAOit9IiBzaG91bGRuJ3QuCisJCQkJICovCisJCQkJaWYgKGRwID09IFhzdHJpbmcoZHMsIGRwKSkKKwkJCQkJd29yZCA9IElGU19XUzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWNhc2UgWFNVQjoKKwkJY2FzZSBYU1VCTUlEOgorCQkJaWYgKChjID0gKnguc3RyKyspID09IDApIHsKKwkJCQl0eXBlID0gWEJBU0U7CisJCQkJaWYgKGYmRE9CTEFOSykKKwkJCQkJZG9ibGFuay0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBYQVJHU0VQOgorCQkJdHlwZSA9IFhBUkc7CisJCQlxdW90ZSA9IDE7CisJCWNhc2UgWEFSRzoKKwkJCWlmICgoYyA9ICp4LnN0cisrKSA9PSAnXDAnKSB7CisJCQkJLyogZm9yY2UgbnVsbCB3b3JkcyB0byBiZSBjcmVhdGVkIHNvCisJCQkJICogc2V0IC0tICcnIDIgJyc7IGZvbyAiJEAiIHdpbGwgZG8KKwkJCQkgKiB0aGUgcmlnaHQgdGhpbmcKKwkJCQkgKi8KKwkJCQlpZiAocXVvdGUgJiYgeC5zcGxpdCkKKwkJCQkJd29yZCA9IElGU19XT1JEOworCQkJCWlmICgoeC5zdHIgPSAqeC51LnN0cnYrKykgPT0gTlVMTCkgeworCQkJCQl0eXBlID0gWEJBU0U7CisJCQkJCWlmIChmJkRPQkxBTkspCisJCQkJCQlkb2JsYW5rLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQljID0gaWZzMDsKKwkJCQlpZiAoYyA9PSAwKSB7CisJCQkJCWlmIChxdW90ZSAmJiAheC5zcGxpdCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQljID0gJyAnOworCQkJCX0KKwkJCQlpZiAocXVvdGUgJiYgeC5zcGxpdCkgeworCQkJCQkvKiB0ZXJtaW5hdGUgd29yZCBmb3IgIiRAIiAqLworCQkJCQl0eXBlID0gWEFSR1NFUDsKKwkJCQkJcXVvdGUgPSAwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWENPTToKKwkJCWlmIChuZXdsaW5lcykgewkJLyogU3BpdCBvdXQgc2F2ZWQgTkxzICovCisJCQkJYyA9ICdcbic7CisJCQkJLS1uZXdsaW5lczsKKwkJCX0gZWxzZSB7CisJCQkJd2hpbGUgKChjID0gc2hmX2dldGMoeC51LnNoZikpID09IDAgfHwgYyA9PSAnXG4nKQorCQkJCQlpZiAoYyA9PSAnXG4nKQorCQkJCQkJLyogU2F2ZSBuZXdsaW5lcyAqLworCQkJCQkJbmV3bGluZXMrKzsKKwkJCQlpZiAobmV3bGluZXMgJiYgYyAhPSBFT0YpIHsKKwkJCQkJc2hmX3VuZ2V0YyhjLCB4LnUuc2hmKTsKKwkJCQkJYyA9ICdcbic7CisJCQkJCS0tbmV3bGluZXM7CisJCQkJfQorCQkJfQorCQkJaWYgKGMgPT0gRU9GKSB7CisJCQkJbmV3bGluZXMgPSAwOworCQkJCXNoZl9jbG9zZSh4LnUuc2hmKTsKKwkJCQlpZiAoeC5zcGxpdCkKKwkJCQkJc3Vic3RfZXhzdGF0ID0gd2FpdGxhc3QoKTsKKwkJCQl0eXBlID0gWEJBU0U7CisJCQkJaWYgKGYmRE9CTEFOSykKKwkJCQkJZG9ibGFuay0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBmb3IgZW5kIG9mIHdvcmQgb3IgSUZTIHNlcGFyYXRpb24gKi8KKwkJaWYgKGMgPT0gMCB8fCAoIXF1b3RlICYmIChmICYgRE9CTEFOSykgJiYgZG9ibGFuayAmJgorCQkgICAgIW1ha2VfbWFnaWMgJiYgY3R5cGUoYywgQ19JRlMpKSkgeworCQkJLyogSG93IHdvcmRzIGFyZSBicm9rZW4gdXA6CisJCQkgKgkJCXwJdmFsdWUgb2YgYworCQkJICoJd29yZAkJfAl3cwlud3MJMAorCQkJICoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqCUlGU19XT1JECQl3L1dTCXcvTldTCXcKKwkJCSAqCUlGU19XUwkJCS0vV1MJdy9OV1MJLQorCQkJICoJSUZTX05XUwkJCS0vTldTCXcvTldTCXcKKwkJCSAqICh3IG1lYW5zIGdlbmVyYXRlIGEgd29yZCkKKwkJCSAqIE5vdGUgdGhhdCBJRlNfTldTLzAgZ2VuZXJhdGVzIGEgd29yZCAoQVQmVCBrc2gKKwkJCSAqIGRvZXNuJ3QgZG8gdGhpcywgYnV0IFBPU0lYIGRvZXMpLgorCQkJICovCisJCQlpZiAod29yZCA9PSBJRlNfV09SRCB8fAorCQkJICAgICghY3R5cGUoYywgQ19JRlNXUykgJiYgYyAmJiB3b3JkID09IElGU19OV1MpKSB7CisJCQkJY2hhciAqcDsKKworCQkJCSpkcCsrID0gJ1wwJzsKKwkJCQlwID0gWGNsb3NlKGRzLCBkcCk7CisJCQkJaWYgKGZkbyAmIERPQlJBQ0VfKQorCQkJCQkvKiBhbHNvIGRvZXMgZ2xvYmJpbmcgKi8KKwkJCQkJYWx0X2V4cGFuZCh3cCwgcCwgcCwKKwkJCQkJICAgIHAgKyBYbGVuZ3RoKGRzLCAoZHAgLSAxKSksCisJCQkJCSAgICBmZG8gfCAoZiAmIERPTUFSS0RJUlMpKTsKKwkJCQllbHNlIGlmIChmZG8gJiBET0dMT0IpCisJCQkJCWdsb2IocCwgd3AsIGYgJiBET01BUktESVJTKTsKKwkJCQllbHNlIGlmICgoZiAmIERPUEFUKSB8fCAhKGZkbyAmIERPTUFHSUNfKSkKKwkJCQkJWFBwdXQoKndwLCBwKTsKKwkJCQllbHNlCisJCQkJCVhQcHV0KCp3cCwgZGVidW5rKHAsIHAsIHN0cmxlbihwKSArIDEpKTsKKwkJCQlmZG8gPSAwOworCQkJCXNhd19lcSA9IDA7CisJCQkJdGlsZGVfb2sgPSAoZiAmIChET1RJTERFfERPQVNOVElMREUpKSA/IDEgOiAwOworCQkJCWlmIChjICE9IDApCisJCQkJCVhpbml0KGRzLCBkcCwgMTI4LCBBVEVNUCk7CisJCQl9CisJCQlpZiAoYyA9PSAwKQorCQkJCXJldHVybjsKKwkJCWlmICh3b3JkICE9IElGU19OV1MpCisJCQkJd29yZCA9IGN0eXBlKGMsIENfSUZTV1MpID8gSUZTX1dTIDogSUZTX05XUzsKKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlID09IFhTVUIpIHsKKwkJCQlpZiAod29yZCA9PSBJRlNfTldTICYmCisJCQkJICAgIFhsZW5ndGgoZHMsIGRwKSA9PSAwKSB7CisJCQkJCWNoYXIgKnA7CisKKwkJCQkJKihwID0gYWxsb2MoMSwgQVRFTVApKSA9ICdcMCc7CisJCQkJCVhQcHV0KCp3cCwgcCk7CisJCQkJfQorCQkJCXR5cGUgPSBYU1VCTUlEOworCQkJfQorCisJCQkvKiBhZ2UgdGlsZGVfb2sgaW5mbyAtIH4gY29kZSB0ZXN0cyBzZWNvbmQgYml0ICovCisJCQl0aWxkZV9vayA8PD0gMTsKKwkJCS8qIG1hcmsgYW55IHNwZWNpYWwgc2Vjb25kIHBhc3MgY2hhcnMgKi8KKwkJCWlmICghcXVvdGUpCisJCQkJc3dpdGNoIChjKSB7CisJCQkJY2FzZSAnWyc6CisJCQkJY2FzZSBOT1Q6CisJCQkJY2FzZSAnLSc6CisJCQkJY2FzZSAnXSc6CisJCQkJCS8qIEZvciBjaGFyYWN0ZXIgY2xhc3NlcyAtIGRvZXNuJ3QgaHVydAorCQkJCQkgKiB0byBoYXZlIG1hZ2ljICEsLSxdcyBvdXRzaWRlIG9mCisJCQkJCSAqIFsuLi5dIGV4cHJlc3Npb25zLgorCQkJCQkgKi8KKwkJCQkJaWYgKGYgJiAoRE9QQVQgfCBET0dMT0IpKSB7CisJCQkJCQlmZG8gfD0gRE9NQUdJQ187CisJCQkJCQlpZiAoYyA9PSAnWycpCisJCQkJCQkJZmRvIHw9IGYgJiBET0dMT0I7CisJCQkJCQkqZHArKyA9IE1BR0lDOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyonOgorCQkJCWNhc2UgJz8nOgorCQkJCQlpZiAoZiAmIChET1BBVCB8IERPR0xPQikpIHsKKwkJCQkJCWZkbyB8PSBET01BR0lDXyB8IChmICYgRE9HTE9CKTsKKwkJCQkJCSpkcCsrID0gTUFHSUM7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPQlJBQ0U6CisJCQkJY2FzZSAnLCc6CisJCQkJY2FzZSBDQlJBQ0U6CisJCQkJCWlmICgoZiAmIERPQlJBQ0VfKSAmJiAoYyA9PSBPQlJBQ0UgfHwKKwkJCQkJICAgIChmZG8gJiBET0JSQUNFXykpKSB7CisJCQkJCQlmZG8gfD0gRE9CUkFDRV98RE9NQUdJQ187CisJCQkJCQkqZHArKyA9IE1BR0lDOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJz0nOgorCQkJCQkvKiBOb3RlIGZpcnN0IHVucXVvdGVkID0gZm9yIH4gKi8KKwkJCQkJaWYgKCEoZiAmIERPVEVNUF8pICYmICFzYXdfZXEgJiYKKwkJCQkJICAgIChGbGFnKEZCUkFDRUVYUEFORCkgfHwKKwkJCQkJICAgIChmICYgRE9BU05USUxERSkpKSB7CisJCQkJCQlzYXdfZXEgPSAxOworCQkJCQkJdGlsZGVfb2sgPSAxOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzonOiAvKiA6ICovCisJCQkJCS8qIE5vdGUgdW5xdW90ZWQgOiBmb3IgfiAqLworCQkJCQlpZiAoIShmICYgRE9URU1QXykgJiYgKGYgJiBET0FTTlRJTERFKSkKKwkJCQkJCXRpbGRlX29rID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnfic6CisJCQkJCS8qIHRpbGRlX29rIGlzIHJlc2V0IHdoZW5ldmVyCisJCQkJCSAqIGFueSBvZiAnICIgJCggJCgoICR7IH0gYXJlIHNlZW4uCisJCQkJCSAqIE5vdGUgdGhhdCB0aWxkZV9vayBtdXN0IGJlIHByZXNlcnZlZAorCQkJCQkgKiB0aHJvdWdoIHRoZSBzZXF1ZW5jZSAke0E9YT19fgorCQkJCQkgKi8KKwkJCQkJaWYgKHR5cGUgPT0gWEJBU0UgJiYKKwkJCQkJICAgIChmICYgKERPVElMREV8RE9BU05USUxERSkpICYmCisJCQkJCSAgICAodGlsZGVfb2sgJiAyKSkgeworCQkJCQkJY29uc3QgY2hhciAqcDsKKwkJCQkJCWNoYXIgKmRwX3g7CisKKwkJCQkJCWRwX3ggPSBkcDsKKwkJCQkJCXAgPSBtYXliZV9leHBhbmRfdGlsZGUoc3AsCisJCQkJCQkgICAgJmRzLCAmZHBfeCwKKwkJCQkJCSAgICBmICYgRE9BU05USUxERSk7CisJCQkJCQlpZiAocCkgeworCQkJCQkJCWlmIChkcCAhPSBkcF94KQorCQkJCQkJCQl3b3JkID0gSUZTX1dPUkQ7CisJCQkJCQkJZHAgPSBkcF94OworCQkJCQkJCXNwID0gcDsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQllbHNlCisJCQkJcXVvdGUgJj0gfjI7IC8qIHVuZG8gdGVtcG9yYXJ5ICovCisKKwkJCWlmIChtYWtlX21hZ2ljKSB7CisJCQkJbWFrZV9tYWdpYyA9IDA7CisJCQkJZmRvIHw9IERPTUFHSUNfIHwgKGYgJiBET0dMT0IpOworCQkJCSpkcCsrID0gTUFHSUM7CisJCQl9IGVsc2UgaWYgKElTTUFHSUMoYykpIHsKKwkJCQlmZG8gfD0gRE9NQUdJQ187CisJCQkJKmRwKysgPSBNQUdJQzsKKwkJCX0KKwkJCSpkcCsrID0gYzsgLyogc2F2ZSBvdXRwdXQgY2hhciAqLworCQkJd29yZCA9IElGU19XT1JEOworCQl9CisJfQorfQorCisvKgorICogUHJlcGFyZSB0byBnZW5lcmF0ZSB0aGUgc3RyaW5nIHJldHVybmVkIGJ5ICR7fSBzdWJzdGl0dXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK3ZhcnN1YihFeHBhbmQgKnhwLCBjb25zdCBjaGFyICpzcCwgY29uc3QgY2hhciAqd29yZCwKKyAgICBpbnQgKnN0eXBlcCwJLyogYmVjb21lcyBxdWFsaWZpZXIgdHlwZSAqLworICAgIGludCAqc2xlbnApCQkvKiAiICIgbGVuICg9LCA6PSwgZXRjLikgdmFsaWQgaWZmICpzdHlwZXAgIT0gMCAqLworeworCWludCBjOworCWludCBzdGF0ZTsJLyogbmV4dCBzdGF0ZTogWEJBU0UsIFhBUkcsIFhTVUIsIFhOVUxMU1VCICovCisJaW50IHN0eXBlOwkvKiBzdWJzdGl0dXRpb24gdHlwZSAqLworCWludCBzbGVuOworCWNvbnN0IGNoYXIgKnA7CisJc3RydWN0IHRibCAqdnA7CisJYm9vbCB6ZXJvX29rID0gZmFsc2U7CisKKwlpZiAoKHN0eXBlID0gc3BbMF0pID09ICdcMCcpCS8qIEJhZCB2YXJpYWJsZSBuYW1lICovCisJCXJldHVybiAoLTEpOworCisJeHAtPnZhciA9IE5VTEw7CisKKwkvKi0KKwkgKiAkeyN2YXJ9LCBzdHJpbmcgbGVuZ3RoICgtVTogY2hhcmFjdGVycywgK1U6IG9jdGV0cykgb3IgYXJyYXkgc2l6ZQorCSAqICR7JXZhcn0sIHN0cmluZyB3aWR0aCAoLVU6IHNjcmVlbiBjb2x1bW5zLCArVTogb2N0ZXRzKQorCSAqLworCWMgPSBzcFsxXTsKKwlpZiAoc3R5cGUgPT0gJyUnICYmIGMgPT0gJ1wwJykKKwkJcmV0dXJuICgtMSk7CisJaWYgKChzdHlwZSA9PSAnIycgfHwgc3R5cGUgPT0gJyUnKSAmJiBjICE9ICdcMCcpIHsKKwkJLyogQ2FuJ3QgaGF2ZSBhbnkgbW9kaWZpZXJzIGZvciAkeyMuLi59IG9yICR7JS4uLn0gKi8KKwkJaWYgKCp3b3JkICE9IENTVUJTVCkKKwkJCXJldHVybiAoLTEpOworCQlzcCsrOworCQkvKiBDaGVjayBmb3Igc2l6ZSBvZiBhcnJheSAqLworCQlpZiAoKHAgPSBjc3RyY2hyKHNwLCAnWycpKSAmJiAocFsxXSA9PSAnKicgfHwgcFsxXSA9PSAnQCcpICYmCisJCSAgICBwWzJdID09ICddJykgeworCQkJaW50IG4gPSAwOworCisJCQlpZiAoc3R5cGUgIT0gJyMnKQorCQkJCXJldHVybiAoLTEpOworCQkJdnAgPSBnbG9iYWwoYXJyYXluYW1lKHNwKSk7CisJCQlpZiAodnAtPmZsYWcgJiAoSVNTRVR8QVJSQVkpKQorCQkJCXplcm9fb2sgPSB0cnVlOworCQkJZm9yICg7IHZwOyB2cCA9IHZwLT51LmFycmF5KQorCQkJCWlmICh2cC0+ZmxhZyAmIElTU0VUKQorCQkJCQluKys7CisJCQljID0gbjsKKwkJfSBlbHNlIGlmIChjID09ICcqJyB8fCBjID09ICdAJykgeworCQkJaWYgKHN0eXBlICE9ICcjJykKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWMgPSBlLT5sb2MtPmFyZ2M7CisJCX0gZWxzZSB7CisJCQlwID0gc3RyX3ZhbChnbG9iYWwoc3ApKTsKKwkJCXplcm9fb2sgPSBwICE9IG51bGw7CisJCQlpZiAoc3R5cGUgPT0gJyMnKQorCQkJCWMgPSB1dGZsZW4ocCk7CisJCQllbHNlIHsKKwkJCQkvKiBwYXJ0aWFsIHV0Zl9tYnN3aWR0aCByZWltcGxlbWVudGF0aW9uICovCisJCQkJY29uc3QgY2hhciAqcyA9IHA7CisJCQkJdW5zaWduZWQgaW50IHdjOworCQkJCXNpemVfdCBsZW47CisJCQkJaW50IGN3OworCisJCQkJYyA9IDA7CisJCQkJd2hpbGUgKCpzKSB7CisJCQkJCWlmICghVVRGTU9ERSB8fCAobGVuID0gdXRmX21idG93Yygmd2MsCisJCQkJCSAgICBzKSkgPT0gKHNpemVfdCktMSkKKwkJCQkJCS8qIG5vdCBVVEZNT0RFIG9yIG5vdCBVVEYtOCAqLworCQkJCQkJd2MgPSAodW5zaWduZWQgY2hhcikoKnMrKyk7CisJCQkJCWVsc2UKKwkJCQkJCS8qIFVURk1PREUgYW5kIFVURi04ICovCisJCQkJCQlzICs9IGxlbjsKKwkJCQkJLyogd2MgPT0gY2hhciBvciB3Y2hhciBhdCBzKysgKi8KKwkJCQkJaWYgKChjdyA9IHV0Zl93Y3dpZHRoKHdjKSkgPT0gLTEpIHsKKwkJCQkJCS8qIDY0NiwgODg1OS0xLCAxMDY0NiBDMC9DMSAqLworCQkJCQkJYyA9IC0xOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYyArPSBjdzsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKEZsYWcoRk5PVU5TRVQpICYmIGMgPT0gMCAmJiAhemVyb19vaykKKwkJCWVycm9yZigiJXM6IHBhcmFtZXRlciBub3Qgc2V0Iiwgc3ApOworCQkqc3R5cGVwID0gMDsgLyogdW5xdWFsaWZpZWQgdmFyaWFibGUvc3RyaW5nIHN1YnN0aXR1dGlvbiAqLworCQl4cC0+c3RyID0gc2hmX3NtcHJpbnRmKCIlZCIsIGMpOworCQlyZXR1cm4gKFhTVUIpOworCX0KKworCS8qIENoZWNrIGZvciBxdWFsaWZpZXJzIGluIHdvcmQgcGFydCAqLworCXN0eXBlID0gMDsKKwljID0gd29yZFtzbGVuID0gMF0gPT0gQ0hBUiA/IHdvcmRbMV0gOiAwOworCWlmIChjID09ICc6JykgeworCQlzbGVuICs9IDI7CisJCXN0eXBlID0gMHg4MDsKKwkJYyA9IHdvcmRbc2xlbiArIDBdID09IENIQVIgPyB3b3JkW3NsZW4gKyAxXSA6IDA7CisJfQorCWlmICghc3R5cGUgJiYgYyA9PSAnLycpIHsKKwkJc2xlbiArPSAyOworCQlzdHlwZSA9IGM7CisJCWlmICh3b3JkW3NsZW5dID09IEFERUxJTSkgeworCQkJc2xlbiArPSAyOworCQkJc3R5cGUgfD0gMHg4MDsKKwkJfQorCX0gZWxzZSBpZiAoc3R5cGUgPT0gMHg4MCAmJiAoYyA9PSAnICcgfHwgYyA9PSAnMCcpKSB7CisJCXN0eXBlIHw9ICcwJzsKKwl9IGVsc2UgaWYgKGN0eXBlKGMsIENfU1VCT1AxKSkgeworCQlzbGVuICs9IDI7CisJCXN0eXBlIHw9IGM7CisJfSBlbHNlIGlmIChjdHlwZShjLCBDX1NVQk9QMikpIHsgLyogTm90ZToga3NoODggYWxsb3dzIDolLCA6JSUsIGV0YyAqLworCQlzbGVuICs9IDI7CisJCXN0eXBlID0gYzsKKwkJaWYgKHdvcmRbc2xlbiArIDBdID09IENIQVIgJiYgYyA9PSB3b3JkW3NsZW4gKyAxXSkgeworCQkJc3R5cGUgfD0gMHg4MDsKKwkJCXNsZW4gKz0gMjsKKwkJfQorCX0gZWxzZSBpZiAoc3R5cGUpCS8qIDogaXMgbm90IG9rICovCisJCXJldHVybiAoLTEpOworCWlmICghc3R5cGUgJiYgKndvcmQgIT0gQ1NVQlNUKQorCQlyZXR1cm4gKC0xKTsKKwkqc3R5cGVwID0gc3R5cGU7CisJKnNsZW5wID0gc2xlbjsKKworCWMgPSBzcFswXTsKKwlpZiAoYyA9PSAnKicgfHwgYyA9PSAnQCcpIHsKKwkJc3dpdGNoIChzdHlwZSAmIDB4N2YpIHsKKwkJY2FzZSAnPSc6CS8qIGNhbid0IGFzc2lnbiB0byBhIHZlY3RvciAqLworCQljYXNlICclJzoJLyogY2FuJ3QgdHJpbSBhIHZlY3RvciAoeWV0KSAqLworCQljYXNlICcjJzoKKwkJY2FzZSAnMCc6CisJCWNhc2UgJy8nOgorCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJaWYgKGUtPmxvYy0+YXJnYyA9PSAwKSB7CisJCQl4cC0+c3RyID0gbnVsbDsKKwkJCXhwLT52YXIgPSBnbG9iYWwoc3ApOworCQkJc3RhdGUgPSBjID09ICdAJyA/IFhOVUxMU1VCIDogWFNVQjsKKwkJfSBlbHNlIHsKKwkJCXhwLT51LnN0cnYgPSAoY29uc3QgY2hhciAqKillLT5sb2MtPmFyZ3YgKyAxOworCQkJeHAtPnN0ciA9ICp4cC0+dS5zdHJ2Kys7CisJCQl4cC0+c3BsaXQgPSBjID09ICdAJzsgLyogJEAgKi8KKwkJCXN0YXRlID0gWEFSRzsKKwkJfQorCQl6ZXJvX29rID0gdHJ1ZTsJLyogUE9TSVggMjAwOT8gKi8KKwl9IGVsc2UgeworCQlpZiAoKHAgPSBjc3RyY2hyKHNwLCAnWycpKSAmJiAocFsxXSA9PSAnKicgfHwgcFsxXSA9PSAnQCcpICYmCisJCSAgICBwWzJdID09ICddJykgeworCQkJWFB0clYgd3Y7CisKKwkJCXN3aXRjaCAoc3R5cGUgJiAweDdmKSB7CisJCQljYXNlICc9JzoJLyogY2FuJ3QgYXNzaWduIHRvIGEgdmVjdG9yICovCisJCQljYXNlICclJzoJLyogY2FuJ3QgdHJpbSBhIHZlY3RvciAoeWV0KSAqLworCQkJY2FzZSAnIyc6CisJCQljYXNlICc/JzoKKwkJCWNhc2UgJzAnOgorCQkJY2FzZSAnLyc6CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlYUGluaXQod3YsIDMyKTsKKwkJCWlmICgoYyA9IHNwWzBdKSA9PSAnIScpCisJCQkJKytzcDsKKwkJCXZwID0gZ2xvYmFsKGFycmF5bmFtZShzcCkpOworCQkJZm9yICg7IHZwOyB2cCA9IHZwLT51LmFycmF5KSB7CisJCQkJaWYgKCEodnAtPmZsYWcmSVNTRVQpKQorCQkJCQljb250aW51ZTsKKwkJCQlYUHB1dCh3diwgYyA9PSAnIScgPyBzaGZfc21wcmludGYoIiVsdSIsCisJCQkJICAgIGFycmF5aW5kZXgodnApKSA6CisJCQkJICAgIHN0cl92YWwodnApKTsKKwkJCX0KKwkJCWlmIChYUHNpemUod3YpID09IDApIHsKKwkJCQl4cC0+c3RyID0gbnVsbDsKKwkJCQlzdGF0ZSA9IHBbMV0gPT0gJ0AnID8gWE5VTExTVUIgOiBYU1VCOworCQkJCVhQZnJlZSh3dik7CisJCQl9IGVsc2UgeworCQkJCVhQcHV0KHd2LCAwKTsKKwkJCQl4cC0+dS5zdHJ2ID0gKGNvbnN0IGNoYXIgKiopWFBwdHJ2KHd2KTsKKwkJCQl4cC0+c3RyID0gKnhwLT51LnN0cnYrKzsKKwkJCQl4cC0+c3BsaXQgPSBwWzFdID09ICdAJzsgLyogJHtmb29bQF19ICovCisJCQkJc3RhdGUgPSBYQVJHOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQ2FuJ3QgYXNzaWduIHRoaW5ncyBsaWtlICQhIG9yICQxICovCisJCQlpZiAoKHN0eXBlICYgMHg3ZikgPT0gJz0nICYmCisJCQkgICAgY3R5cGUoKnNwLCBDX1ZBUjEgfCBDX0RJR0lUKSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmICgqc3AgPT0gJyEnICYmIHNwWzFdKSB7CisJCQkJKytzcDsKKwkJCQl4cC0+dmFyID0gZ2xvYmFsKHNwKTsKKwkJCQlpZiAoY3N0cmNocihzcCwgJ1snKSkgeworCQkJCQlpZiAoeHAtPnZhci0+ZmxhZyAmIElTU0VUKQorCQkJCQkJeHAtPnN0ciA9IHNoZl9zbXByaW50ZigiJWx1IiwKKwkJCQkJCSAgICBhcnJheWluZGV4KHhwLT52YXIpKTsKKwkJCQkJZWxzZQorCQkJCQkJeHAtPnN0ciA9IG51bGw7CisJCQkJfSBlbHNlIGlmICh4cC0+dmFyLT5mbGFnICYgSVNTRVQpCisJCQkJCXhwLT5zdHIgPSB4cC0+dmFyLT5uYW1lOworCQkJCWVsc2UKKwkJCQkJeHAtPnN0ciA9ICIwIjsJLyoga3NoOTMgY29tcGF0ICovCisJCQl9IGVsc2UgeworCQkJCXhwLT52YXIgPSBnbG9iYWwoc3ApOworCQkJCXhwLT5zdHIgPSBzdHJfdmFsKHhwLT52YXIpOworCQkJfQorCQkJc3RhdGUgPSBYU1VCOworCQl9CisJfQorCisJYyA9IHN0eXBlJjB4N2Y7CisJLyogdGVzdCB0aGUgY29tcGlsZXIncyBjb2RlIGdlbmVyYXRvciAqLworCWlmIChjdHlwZShjLCBDX1NVQk9QMikgfHwgc3R5cGUgPT0gKDB4ODAgfCAnMCcpIHx8IGMgPT0gJy8nIHx8CisJICAgICgoKHN0eXBlJjB4ODApID8gKnhwLT5zdHI9PSdcMCcgOiB4cC0+c3RyPT1udWxsKSA/IC8qIHVuZGVmPyAqLworCSAgICBjID09ICc9JyB8fCBjID09ICctJyB8fCBjID09ICc/JyA6IGMgPT0gJysnKSkKKwkJc3RhdGUgPSBYQkFTRTsJLyogZXhwYW5kIHdvcmQgaW5zdGVhZCBvZiB2YXJpYWJsZSB2YWx1ZSAqLworCWlmIChGbGFnKEZOT1VOU0VUKSAmJiB4cC0+c3RyID09IG51bGwgJiYgIXplcm9fb2sgJiYKKwkgICAgKGN0eXBlKGMsIENfU1VCT1AyKSB8fCAoc3RhdGUgIT0gWEJBU0UgJiYgYyAhPSAnKycpKSkKKwkJZXJyb3JmKCIlczogcGFyYW1ldGVyIG5vdCBzZXQiLCBzcCk7CisJcmV0dXJuIChzdGF0ZSk7Cit9CisKKy8qCisgKiBSdW4gdGhlIGNvbW1hbmQgaW4gJCguLi4pIGFuZCByZWFkIGl0cyBvdXRwdXQuCisgKi8KK3N0YXRpYyBpbnQKK2NvbXN1YihFeHBhbmQgKnhwLCBjb25zdCBjaGFyICpjcCkKK3sKKwlTb3VyY2UgKnMsICpzb2xkOworCXN0cnVjdCBvcCAqdDsKKwlzdHJ1Y3Qgc2hmICpzaGY7CisKKwlzID0gcHVzaHMoU1NUUklORywgQVRFTVApOworCXMtPnN0YXJ0ID0gcy0+c3RyID0gY3A7CisJc29sZCA9IHNvdXJjZTsKKwl0ID0gY29tcGlsZShzKTsKKwlhZnJlZShzLCBBVEVNUCk7CisJc291cmNlID0gc29sZDsKKworCWlmICh0ID09IE5VTEwpCisJCXJldHVybiAoWEJBU0UpOworCisJaWYgKHQgIT0gTlVMTCAmJiB0LT50eXBlID09IFRDT00gJiYgLyogJCg8ZmlsZSkgKi8KKwkgICAgKnQtPmFyZ3MgPT0gTlVMTCAmJiAqdC0+dmFycyA9PSBOVUxMICYmIHQtPmlvYWN0ICE9IE5VTEwpIHsKKwkJc3RydWN0IGlvd29yZCAqaW8gPSAqdC0+aW9hY3Q7CisJCWNoYXIgKm5hbWU7CisKKwkJaWYgKChpby0+ZmxhZyZJT1RZUEUpICE9IElPUkVBRCkKKwkJCWVycm9yZigiZnVubnkgJCgpIGNvbW1hbmQ6ICVzIiwKKwkJCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgaW8pKTsKKwkJc2hmID0gc2hmX29wZW4obmFtZSA9IGV2YWxzdHIoaW8tPm5hbWUsIERPVElMREUpLCBPX1JET05MWSwgMCwKKwkJCVNIRl9NQVBISXxTSEZfQ0xFWEVDKTsKKwkJaWYgKHNoZiA9PSBOVUxMKQorCQkJZXJyb3JmKCIlczogY2Fubm90IG9wZW4gJCgpIGlucHV0IiwgbmFtZSk7CisJCXhwLT5zcGxpdCA9IDA7CS8qIG5vIHdhaXRsYXN0KCkgKi8KKwl9IGVsc2UgeworCQlpbnQgb2ZkMSwgcHZbMl07CisJCW9wZW5waXBlKHB2KTsKKwkJc2hmID0gc2hmX2Zkb3BlbihwdlswXSwgU0hGX1JELCBOVUxMKTsKKwkJb2ZkMSA9IHNhdmVmZCgxKTsKKwkJaWYgKHB2WzFdICE9IDEpIHsKKwkJCWtzaF9kdXAyKHB2WzFdLCAxLCBmYWxzZSk7CisJCQljbG9zZShwdlsxXSk7CisJCX0KKwkJZXhlY3V0ZSh0LCBYRk9SS3xYWENPTXxYUElQRU8sIE5VTEwpOworCQlyZXN0ZmQoMSwgb2ZkMSk7CisJCXN0YXJ0bGFzdCgpOworCQl4cC0+c3BsaXQgPSAxOwkvKiB3YWl0bGFzdCgpICovCisJfQorCisJeHAtPnUuc2hmID0gc2hmOworCXJldHVybiAoWENPTSk7Cit9CisKKy8qCisgKiBwZXJmb3JtICNwYXR0ZXJuIGFuZCAlcGF0dGVybiBzdWJzdGl0dXRpb24gaW4gJHt9CisgKi8KKworc3RhdGljIGNoYXIgKgordHJpbXN1YihjaGFyICpzdHIsIGNoYXIgKnBhdCwgaW50IGhvdykKK3sKKwljaGFyICplbmQgPSBzdHJudWwoc3RyKTsKKwljaGFyICpwLCBjOworCisJc3dpdGNoIChob3cgJiAweEZGKSB7CisJY2FzZSAnIyc6CQkvKiBzaG9ydGVzdCBhdCBiZWdpbm5pbmcgKi8KKwkJZm9yIChwID0gc3RyOyBwIDw9IGVuZDsgcCArPSB1dGZfcHRyYWRqKHApKSB7CisJCQljID0gKnA7ICpwID0gJ1wwJzsKKwkJCWlmIChnbWF0Y2h4KHN0ciwgcGF0LCBmYWxzZSkpIHsKKwkJCQkqcCA9IGM7CisJCQkJcmV0dXJuIChwKTsKKwkJCX0KKwkJCSpwID0gYzsKKwkJfQorCQlicmVhazsKKwljYXNlICcjJ3wweDgwOgkJLyogbG9uZ2VzdCBtYXRjaCBhdCBiZWdpbm5pbmcgKi8KKwkJZm9yIChwID0gZW5kOyBwID49IHN0cjsgcC0tKSB7CisJCQljID0gKnA7ICpwID0gJ1wwJzsKKwkJCWlmIChnbWF0Y2h4KHN0ciwgcGF0LCBmYWxzZSkpIHsKKwkJCQkqcCA9IGM7CisJCQkJcmV0dXJuIChwKTsKKwkJCX0KKwkJCSpwID0gYzsKKwkJfQorCQlicmVhazsKKwljYXNlICclJzoJCS8qIHNob3J0ZXN0IG1hdGNoIGF0IGVuZCAqLworCQlwID0gZW5kOworCQl3aGlsZSAocCA+PSBzdHIpIHsKKwkJCWlmIChnbWF0Y2h4KHAsIHBhdCwgZmFsc2UpKQorCQkJCWdvdG8gdHJpbXN1Yl9tYXRjaDsKKwkJCWlmIChVVEZNT0RFKSB7CisJCQkJY2hhciAqb3AgPSBwOworCQkJCXdoaWxlICgocC0tID4gc3RyKSAmJiAoKCpwICYgMHhDMCkgPT0gMHg4MCkpCisJCQkJCTsKKwkJCQlpZiAoKHAgPCBzdHIpIHx8IChwICsgdXRmX3B0cmFkaihwKSAhPSBvcCkpCisJCQkJCXAgPSBvcCAtIDE7CisJCQl9IGVsc2UKKwkJCQktLXA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnJSd8MHg4MDoJCS8qIGxvbmdlc3QgbWF0Y2ggYXQgZW5kICovCisJCWZvciAocCA9IHN0cjsgcCA8PSBlbmQ7IHArKykKKwkJCWlmIChnbWF0Y2h4KHAsIHBhdCwgZmFsc2UpKSB7CisgdHJpbXN1Yl9tYXRjaDoKKwkJCQlzdHJuZHVweChlbmQsIHN0ciwgcCAtIHN0ciwgQVRFTVApOworCQkJCXJldHVybiAoZW5kKTsKKwkJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChzdHIpOwkJLyogbm8gbWF0Y2gsIHJldHVybiBzdHJpbmcgKi8KK30KKworLyoKKyAqIGdsb2IKKyAqIE5hbWUgZGVyaXZlZCBmcm9tIFY2J3MgL2V0Yy9nbG9iLCB0aGUgcHJvZ3JhbSB0aGF0IGV4cGFuZGVkIGZpbGVuYW1lcy4KKyAqLworCisvKiBYWFggY3Agbm90IGNvbnN0ICdjYXVzZSBzbGFzaGVzIGFyZSB0ZW1wb3JhcmlseSByZXBsYWNlZCB3aXRoIE5VTHMuLi4gKi8KK3N0YXRpYyB2b2lkCitnbG9iKGNoYXIgKmNwLCBYUHRyViAqd3AsIGludCBtYXJrZGlycykKK3sKKwlpbnQgb2xkc2l6ZSA9IFhQc2l6ZSgqd3ApOworCisJaWYgKGdsb2Jfc3RyKGNwLCB3cCwgbWFya2RpcnMpID09IDApCisJCVhQcHV0KCp3cCwgZGVidW5rKGNwLCBjcCwgc3RybGVuKGNwKSArIDEpKTsKKwllbHNlCisJCXFzb3J0KFhQcHRydigqd3ApICsgb2xkc2l6ZSwgWFBzaXplKCp3cCkgLSBvbGRzaXplLAorCQkgICAgc2l6ZW9mKHZvaWQgKiksIHhzdHJjbXApOworfQorCisjZGVmaW5lIEdGX05PTkUJCTAKKyNkZWZpbmUgR0ZfRVhDSEVDSwlCSVQoMCkJCS8qIGRvIGV4aXN0ZW5jZSBjaGVjayBvbiBmaWxlICovCisjZGVmaW5lIEdGX0dMT0JCRUQJQklUKDEpCQkvKiBzb21lIGdsb2JiaW5nIGhhcyBiZWVuIGRvbmUgKi8KKyNkZWZpbmUgR0ZfTUFSS0RJUglCSVQoMikJCS8qIGFkZCB0cmFpbGluZyAvIHRvIGRpcmVjdG9yaWVzICovCisKKy8qIEFwcGx5IGZpbGUgZ2xvYmJpbmcgdG8gY3AgYW5kIHN0b3JlIHRoZSBtYXRjaGluZyBmaWxlcyBpbiB3cC4gUmV0dXJucworICogdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kLgorICovCitpbnQKK2dsb2Jfc3RyKGNoYXIgKmNwLCBYUHRyViAqd3AsIGludCBtYXJrZGlycykKK3sKKwlpbnQgb2xkc2l6ZSA9IFhQc2l6ZSgqd3ApOworCVhTdHJpbmcgeHM7CisJY2hhciAqeHA7CisKKwlYaW5pdCh4cywgeHAsIDI1NiwgQVRFTVApOworCWdsb2JpdCgmeHMsICZ4cCwgY3AsIHdwLCBtYXJrZGlycyA/IEdGX01BUktESVIgOiBHRl9OT05FKTsKKwlYZnJlZSh4cywgeHApOworCisJcmV0dXJuIChYUHNpemUoKndwKSAtIG9sZHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZ2xvYml0KFhTdHJpbmcgKnhzLAkvKiBkZXN0IHN0cmluZyAqLworICAgIGNoYXIgKip4cHAsCQkvKiBwdHIgdG8gZGVzdCBlbmQgKi8KKyAgICBjaGFyICpzcCwJCS8qIHNvdXJjZSBwYXRoICovCisgICAgWFB0clYgKndwLAkJLyogb3V0cHV0IGxpc3QgKi8KKyAgICBpbnQgY2hlY2spCQkvKiBHRl8qIGZsYWdzICovCit7CisJY2hhciAqbnA7CQkvKiBuZXh0IHNvdXJjZSBjb21wb25lbnQgKi8KKwljaGFyICp4cCA9ICp4cHA7CisJY2hhciAqc2U7CisJY2hhciBvZGlyc2VwOworCisJLyogVGhpcyB0byBhbGxvdyBsb25nIGV4cGFuc2lvbnMgdG8gYmUgaW50ZXJydXB0ZWQgKi8KKwlpbnRyY2hlY2soKTsKKworCWlmIChzcCA9PSBOVUxMKSB7CS8qIGVuZCBvZiBzb3VyY2UgcGF0aCAqLworCQkvKiBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzIGlmIGEgcGF0dGVybgorCQkgKiBpcyBmb2xsb3dlZCBieSBhIG5vbi1wYXR0ZXJuIChlZywgZm9vKngvYmFyOyBubyBjaGVjaworCQkgKiBpcyBuZWVkZWQgZm9yIGZvbyogc2luY2UgdGhlIG1hdGNoIG11c3QgZXhpc3QpIG9yIGlmCisJCSAqIGFueSBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIGFuZCB0aGUgbWFya2RpcnMgb3B0aW9uIGlzIHNldC4KKwkJICogU3ltbGlua3MgbWFrZSB0aGluZ3MgYSBiaXQgdHJpY2t5Li4uCisJCSAqLworCQlpZiAoKGNoZWNrICYgR0ZfRVhDSEVDSykgfHwKKwkJICAgICgoY2hlY2sgJiBHRl9NQVJLRElSKSAmJiAoY2hlY2sgJiBHRl9HTE9CQkVEKSkpIHsKKyNkZWZpbmUgc3RhdF9jaGVjaygpCShzdGF0X2RvbmUgPyBzdGF0X2RvbmUgOiBcCisJCQkgICAgKHN0YXRfZG9uZSA9IHN0YXQoWHN0cmluZygqeHMsIHhwKSwgJnN0YXRiKSA8IDAgXAorCQkJCT8gLTEgOiAxKSkKKwkJCXN0cnVjdCBzdGF0IGxzdGF0Yiwgc3RhdGI7CisJCQlpbnQgc3RhdF9kb25lID0gMDsJIC8qIC0xOiBmYWlsZWQsIDEgb2sgKi8KKworCQkJaWYgKGxzdGF0KFhzdHJpbmcoKnhzLCB4cCksICZsc3RhdGIpIDwgMCkKKwkJCQlyZXR1cm47CisJCQkvKiBzcGVjaWFsIGNhc2UgZm9yIHN5c3RlbXMgd2hpY2ggc3RyaXAgdHJhaWxpbmcKKwkJCSAqIHNsYXNoZXMgZnJvbSByZWd1bGFyIGZpbGVzIChlZywgL2V0Yy9wYXNzd2QvKS4KKwkJCSAqIFN1bk9TIDQuMS4zIGRvZXMgdGhpcy4uLgorCQkJICovCisJCQlpZiAoKGNoZWNrICYgR0ZfRVhDSEVDSykgJiYgeHAgPiBYc3RyaW5nKCp4cywgeHApICYmCisJCQkgICAgeHBbLTFdID09ICcvJyAmJiAhU19JU0RJUihsc3RhdGIuc3RfbW9kZSkgJiYKKwkJCSAgICAoIVNfSVNMTksobHN0YXRiLnN0X21vZGUpIHx8CisJCQkgICAgc3RhdF9jaGVjaygpIDwgMCB8fCAhU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkpCisJCQkJcmV0dXJuOworCQkJLyogUG9zc2libHkgdGFjayBvbiBhIHRyYWlsaW5nIC8gaWYgdGhlcmUgaXNuJ3QgYWxyZWFkeQorCQkJICogb25lIGFuZCBpZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSBvciBhIHN5bWxpbmsgdG8gYQorCQkJICogZGlyZWN0b3J5CisJCQkgKi8KKwkJCWlmICgoKGNoZWNrICYgR0ZfTUFSS0RJUikgJiYgKGNoZWNrICYgR0ZfR0xPQkJFRCkpICYmCisJCQkgICAgeHAgPiBYc3RyaW5nKCp4cywgeHApICYmIHhwWy0xXSAhPSAnLycgJiYKKwkJCSAgICAoU19JU0RJUihsc3RhdGIuc3RfbW9kZSkgfHwKKwkJCSAgICAoU19JU0xOSyhsc3RhdGIuc3RfbW9kZSkgJiYgc3RhdF9jaGVjaygpID4gMCAmJgorCQkJICAgIFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpKSkgeworCQkJCSp4cCsrID0gJy8nOworCQkJCSp4cCA9ICdcMCc7CisJCQl9CisJCX0KKwkJc3RybmR1cHgobnAsIFhzdHJpbmcoKnhzLCB4cCksIFhsZW5ndGgoKnhzLCB4cCksIEFURU1QKTsKKwkJWFBwdXQoKndwLCBucCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoeHAgPiBYc3RyaW5nKCp4cywgeHApKQorCQkqeHArKyA9ICcvJzsKKwl3aGlsZSAoKnNwID09ICcvJykgeworCQlYY2hlY2soKnhzLCB4cCk7CisJCSp4cCsrID0gKnNwKys7CisJfQorCW5wID0gc3RyY2hyKHNwLCAnLycpOworCWlmIChucCAhPSBOVUxMKSB7CisJCXNlID0gbnA7CisJCW9kaXJzZXAgPSAqbnA7CS8qIGRvbid0IGFzc3VtZSAnLycsIGNhbiBiZSBtdWx0aXBsZSBraW5kcyAqLworCQkqbnArKyA9ICdcMCc7CisJfSBlbHNlIHsKKwkJb2RpcnNlcCA9ICdcMCc7IC8qIGtlZXAgZ2NjIHF1aWV0ICovCisJCXNlID0gc3AgKyBzdHJsZW4oc3ApOworCX0KKworCisJLyogQ2hlY2sgaWYgc3AgbmVlZHMgZ2xvYmJpbmcgLSBkb25lIHRvIGF2b2lkIHBhdHRlcm4gY2hlY2tzIGZvciBzdHJpbmdzCisJICogY29udGFpbmluZyBNQUdJQyBjaGFyYWN0ZXJzLCBvcGVuIFtzIHdpdGhvdXQgdGhlIG1hdGNoaW5nIGNsb3NlIF0sCisJICogZXRjLiAob3RoZXJ3aXNlIG9wZW5kaXIoKSB3aWxsIGJlIGNhbGxlZCB3aGljaCBtYXkgZmFpbCBiZWNhdXNlIHRoZQorCSAqIGRpcmVjdG9yeSBpc24ndCByZWFkYWJsZSAtIGlmIG5vIGdsb2JiaW5nIGlzIG5lZWRlZCwgb25seSBleGVjdXRlCisJICogcGVybWlzc2lvbiBzaG91bGQgYmUgcmVxdWlyZWQgKGFzIHBlciBQT1NJWCkpLgorCSAqLworCWlmICghaGFzX2dsb2JiaW5nKHNwLCBzZSkpIHsKKwkJWGNoZWNrTigqeHMsIHhwLCBzZSAtIHNwICsgMSk7CisJCWRlYnVuayh4cCwgc3AsIFhubGVmdCgqeHMsIHhwKSk7CisJCXhwICs9IHN0cmxlbih4cCk7CisJCSp4cHAgPSB4cDsKKwkJZ2xvYml0KHhzLCB4cHAsIG5wLCB3cCwgY2hlY2spOworCX0gZWxzZSB7CisJCURJUiAqZGlycDsKKwkJc3RydWN0IGRpcmVudCAqZDsKKwkJY2hhciAqbmFtZTsKKwkJaW50IGxlbjsKKwkJaW50IHByZWZpeF9sZW47CisKKwkJLyogeHAgPSAqeHBwOwljb3B5X25vbl9nbG9iKCkgbWF5IGhhdmUgcmUtYWxsb2MnZCB4cyAqLworCQkqeHAgPSAnXDAnOworCQlwcmVmaXhfbGVuID0gWGxlbmd0aCgqeHMsIHhwKTsKKwkJZGlycCA9IG9wZW5kaXIocHJlZml4X2xlbiA/IFhzdHJpbmcoKnhzLCB4cCkgOiAiLiIpOworCQlpZiAoZGlycCA9PSBOVUxMKQorCQkJZ290byBOb2RpcjsKKwkJd2hpbGUgKChkID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgeworCQkJbmFtZSA9IGQtPmRfbmFtZTsKKwkJCWlmIChuYW1lWzBdID09ICcuJyAmJgorCQkJICAgIChuYW1lWzFdID09IDAgfHwgKG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gMCkpKQorCQkJCWNvbnRpbnVlOyAvKiBhbHdheXMgaWdub3JlIC4gYW5kIC4uICovCisJCQlpZiAoKCpuYW1lID09ICcuJyAmJiAqc3AgIT0gJy4nKSB8fAorCQkJICAgICFnbWF0Y2h4KG5hbWUsIHNwLCB0cnVlKSkKKwkJCQljb250aW51ZTsKKworCQkJbGVuID0gc3RybGVuKGQtPmRfbmFtZSkgKyAxOworCQkJWGNoZWNrTigqeHMsIHhwLCBsZW4pOworCQkJbWVtY3B5KHhwLCBuYW1lLCBsZW4pOworCQkJKnhwcCA9IHhwICsgbGVuIC0gMTsKKwkJCWdsb2JpdCh4cywgeHBwLCBucCwgd3AsCisJCQkJKGNoZWNrICYgR0ZfTUFSS0RJUikgfCBHRl9HTE9CQkVECisJCQkJfCAobnAgPyBHRl9FWENIRUNLIDogR0ZfTk9ORSkpOworCQkJeHAgPSBYc3RyaW5nKCp4cywgeHApICsgcHJlZml4X2xlbjsKKwkJfQorCQljbG9zZWRpcihkaXJwKTsKKyBOb2RpcjoKKwkJOworCX0KKworCWlmIChucCAhPSBOVUxMKQorCQkqLS1ucCA9IG9kaXJzZXA7Cit9CisKKy8qIHJlbW92ZSBNQUdJQyBmcm9tIHN0cmluZyAqLworY2hhciAqCitkZWJ1bmsoY2hhciAqZHAsIGNvbnN0IGNoYXIgKnNwLCBzaXplX3QgZGxlbikKK3sKKwljaGFyICpkOworCWNvbnN0IGNoYXIgKnM7CisKKwlpZiAoKHMgPSBjc3RyY2hyKHNwLCBNQUdJQykpKSB7CisJCWlmIChzIC0gc3AgPj0gKHNzaXplX3QpZGxlbikKKwkJCXJldHVybiAoZHApOworCQltZW1tb3ZlKGRwLCBzcCwgcyAtIHNwKTsKKwkJZm9yIChkID0gZHAgKyAocyAtIHNwKTsgKnMgJiYgKGQgLSBkcCA8IChzc2l6ZV90KWRsZW4pOyBzKyspCisJCQlpZiAoIUlTTUFHSUMoKnMpIHx8ICEoKisrcyAmIDB4ODApIHx8CisJCQkgICAgIXZzdHJjaHIoIiorP0AhICIsICpzICYgMHg3ZikpCisJCQkJKmQrKyA9ICpzOworCQkJZWxzZSB7CisJCQkJLyogZXh0ZW5kZWQgcGF0dGVybiBvcGVyYXRvcnM6ICorP0AhICovCisJCQkJaWYgKCgqcyAmIDB4N2YpICE9ICcgJykKKwkJCQkJKmQrKyA9ICpzICYgMHg3ZjsKKwkJCQlpZiAoZCAtIGRwIDwgKHNzaXplX3QpZGxlbikKKwkJCQkJKmQrKyA9ICcoJzsKKwkJCX0KKwkJKmQgPSAnXDAnOworCX0gZWxzZSBpZiAoZHAgIT0gc3ApCisJCXN0cmxjcHkoZHAsIHNwLCBkbGVuKTsKKwlyZXR1cm4gKGRwKTsKK30KKworLyogQ2hlY2sgaWYgcCBpcyBhbiB1bnF1b3RlZCBuYW1lLCBwb3NzaWJseSBmb2xsb3dlZCBieSBhIC8gb3IgOi4gSWYgc28KKyAqIHB1dHMgdGhlIGV4cGFuZGVkIHZlcnNpb24gaW4gKmRjcCxkcCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgaW4gcCBqdXN0CisgKiBwYXN0IHRoZSBuYW1lLCBvdGhlcndpc2UgcmV0dXJucyAwLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCittYXliZV9leHBhbmRfdGlsZGUoY29uc3QgY2hhciAqcCwgWFN0cmluZyAqZHNwLCBjaGFyICoqZHBwLCBpbnQgaXNhc3NpZ24pCit7CisJWFN0cmluZyB0czsKKwljaGFyICpkcCA9ICpkcHA7CisJY2hhciAqdHA7CisJY29uc3QgY2hhciAqcjsKKworCVhpbml0KHRzLCB0cCwgMTYsIEFURU1QKTsKKwkvKiA6IG9ubHkgZm9yIERPQVNOVElMREUgZm9ybSAqLworCXdoaWxlIChwWzBdID09IENIQVIgJiYgcFsxXSAhPSAnLycgJiYgKCFpc2Fzc2lnbiB8fCBwWzFdICE9ICc6JykpCisJeworCQlYY2hlY2sodHMsIHRwKTsKKwkJKnRwKysgPSBwWzFdOworCQlwICs9IDI7CisJfQorCSp0cCA9ICdcMCc7CisJciA9IChwWzBdID09IEVPUyB8fCBwWzBdID09IENIQVIgfHwgcFswXSA9PSBDU1VCU1QpID8KKwkgICAgdGlsZGUoWHN0cmluZyh0cywgdHApKSA6IE5VTEw7CisJWGZyZWUodHMsIHRwKTsKKwlpZiAocikgeworCQl3aGlsZSAoKnIpIHsKKwkJCVhjaGVjaygqZHNwLCBkcCk7CisJCQlpZiAoSVNNQUdJQygqcikpCisJCQkJKmRwKysgPSBNQUdJQzsKKwkJCSpkcCsrID0gKnIrKzsKKwkJfQorCQkqZHBwID0gZHA7CisJCXIgPSBwOworCX0KKwlyZXR1cm4gKHIpOworfQorCisvKgorICogdGlsZGUgZXhwYW5zaW9uCisgKgorICogYmFzZWQgb24gYSB2ZXJzaW9uIGJ5IEFybm9sZCBSb2JiaW5zCisgKi8KKworc3RhdGljIGNoYXIgKgordGlsZGUoY2hhciAqY3ApCit7CisJY2hhciAqZHAgPSBudWxsOworCisJaWYgKGNwWzBdID09ICdcMCcpCisJCWRwID0gc3RyX3ZhbChnbG9iYWwoIkhPTUUiKSk7CisJZWxzZSBpZiAoY3BbMF0gPT0gJysnICYmIGNwWzFdID09ICdcMCcpCisJCWRwID0gc3RyX3ZhbChnbG9iYWwoIlBXRCIpKTsKKwllbHNlIGlmIChjcFswXSA9PSAnLScgJiYgY3BbMV0gPT0gJ1wwJykKKwkJZHAgPSBzdHJfdmFsKGdsb2JhbCgiT0xEUFdEIikpOworI2lmbmRlZiBNS1NIX05PUFdOQU0KKwllbHNlCisJCWRwID0gaG9tZWRpcihjcCk7CisjZW5kaWYKKwkvKiBJZiBIT01FLCBQV0Qgb3IgT0xEUFdEIGFyZSBub3Qgc2V0LCBkb24ndCBleHBhbmQgfiAqLworCXJldHVybiAoZHAgPT0gbnVsbCA/IE5VTEwgOiBkcCk7Cit9CisKKyNpZm5kZWYgTUtTSF9OT1BXTkFNCisvKgorICogbWFwIHVzZXJpZCB0byB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCisgKiBub3RlIHRoYXQgNC4zJ3MgZ2V0cHcgYWRkcyBtb3JlIHRoYW4gNksgdG8gdGhlIHNoZWxsLAorICogYW5kIHRoZSBZUCB2ZXJzaW9uIHByb2JhYmx5IGFkZHMgbXVjaCBtb3JlLgorICogd2UgbWlnaHQgY29uc2lkZXIgb3VyIG93biB2ZXJzaW9uIG9mIGdldHB3bmFtKCkgdG8ga2VlcCB0aGUgc2l6ZSBkb3duLgorICovCitzdGF0aWMgY2hhciAqCitob21lZGlyKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRibCAqYXA7CisKKwlhcCA9IGt0ZW50ZXIoJmhvbWVkaXJzLCBuYW1lLCBoYXNoKG5hbWUpKTsKKwlpZiAoIShhcC0+ZmxhZyAmIElTU0VUKSkgeworCQlzdHJ1Y3QgcGFzc3dkICpwdzsKKworCQlwdyA9IGdldHB3bmFtKG5hbWUpOworCQlpZiAocHcgPT0gTlVMTCkKKwkJCXJldHVybiAoTlVMTCk7CisJCXN0cmR1cHgoYXAtPnZhbC5zLCBwdy0+cHdfZGlyLCBBUEVSTSk7CisJCWFwLT5mbGFnIHw9IERFRklORUR8SVNTRVR8QUxMT0M7CisJfQorCXJldHVybiAoYXAtPnZhbC5zKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorYWx0X2V4cGFuZChYUHRyViAqd3AsIGNoYXIgKnN0YXJ0LCBjaGFyICpleHBfc3RhcnQsIGNoYXIgKmVuZCwgaW50IGZkbykKK3sKKwlpbnQgY291bnQgPSAwOworCWNoYXIgKmJyYWNlX3N0YXJ0LCAqYnJhY2VfZW5kLCAqY29tbWEgPSBOVUxMOworCWNoYXIgKmZpZWxkX3N0YXJ0OworCWNoYXIgKnA7CisKKwkvKiBzZWFyY2ggZm9yIG9wZW4gYnJhY2UgKi8KKwlmb3IgKHAgPSBleHBfc3RhcnQ7IChwID0gc3RyY2hyKHAsIE1BR0lDKSkgJiYgcFsxXSAhPSBPQlJBQ0U7IHAgKz0gMikKKwkJOworCWJyYWNlX3N0YXJ0ID0gcDsKKworCS8qIGZpbmQgbWF0Y2hpbmcgY2xvc2UgYnJhY2UsIGlmIGFueSAqLworCWlmIChwKSB7CisJCWNvbW1hID0gTlVMTDsKKwkJY291bnQgPSAxOworCQlmb3IgKHAgKz0gMjsgKnAgJiYgY291bnQ7IHArKykgeworCQkJaWYgKElTTUFHSUMoKnApKSB7CisJCQkJaWYgKCorK3AgPT0gT0JSQUNFKQorCQkJCQljb3VudCsrOworCQkJCWVsc2UgaWYgKCpwID09IENCUkFDRSkKKwkJCQkJLS1jb3VudDsKKwkJCQllbHNlIGlmICgqcCA9PSAnLCcgJiYgY291bnQgPT0gMSkKKwkJCQkJY29tbWEgPSBwOworCQkJfQorCQl9CisJfQorCS8qIG5vIHZhbGlkIGV4cGFuc2lvbnMuLi4gKi8KKwlpZiAoIXAgfHwgY291bnQgIT0gMCkgeworCQkvKiBOb3RlIHRoYXQgZ2l2ZW4gYXt7YixjfSB3ZSBkbyBub3QgZXhwYW5kIGFueXRoaW5nICh0aGlzIGlzCisJCSAqIHdoYXQgQVQmVCBrc2ggZG9lcy4gVGhpcyBtYXkgYmUgY2hhbmdlZCB0byBkbyB0aGUge2IsY30KKwkJICogZXhwYW5zaW9uLiB9CisJCSAqLworCQlpZiAoZmRvICYgRE9HTE9CKQorCQkJZ2xvYihzdGFydCwgd3AsIGZkbyAmIERPTUFSS0RJUlMpOworCQllbHNlCisJCQlYUHB1dCgqd3AsIGRlYnVuayhzdGFydCwgc3RhcnQsIGVuZCAtIHN0YXJ0KSk7CisJCXJldHVybjsKKwl9CisJYnJhY2VfZW5kID0gcDsKKwlpZiAoIWNvbW1hKSB7CisJCWFsdF9leHBhbmQod3AsIHN0YXJ0LCBicmFjZV9lbmQsIGVuZCwgZmRvKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGV4cGFuZCBleHByZXNzaW9uICovCisJZmllbGRfc3RhcnQgPSBicmFjZV9zdGFydCArIDI7CisJY291bnQgPSAxOworCWZvciAocCA9IGJyYWNlX3N0YXJ0ICsgMjsgcCAhPSBicmFjZV9lbmQ7IHArKykgeworCQlpZiAoSVNNQUdJQygqcCkpIHsKKwkJCWlmICgqKytwID09IE9CUkFDRSkKKwkJCQljb3VudCsrOworCQkJZWxzZSBpZiAoKCpwID09IENCUkFDRSAmJiAtLWNvdW50ID09IDApIHx8CisJCQkgICAgKCpwID09ICcsJyAmJiBjb3VudCA9PSAxKSkgeworCQkJCWNoYXIgKm5ld3M7CisJCQkJaW50IGwxLCBsMiwgbDM7CisKKwkJCQlsMSA9IGJyYWNlX3N0YXJ0IC0gc3RhcnQ7CisJCQkJbDIgPSAocCAtIDEpIC0gZmllbGRfc3RhcnQ7CisJCQkJbDMgPSBlbmQgLSBicmFjZV9lbmQ7CisJCQkJbmV3cyA9IGFsbG9jKGwxICsgbDIgKyBsMyArIDEsIEFURU1QKTsKKwkJCQltZW1jcHkobmV3cywgc3RhcnQsIGwxKTsKKwkJCQltZW1jcHkobmV3cyArIGwxLCBmaWVsZF9zdGFydCwgbDIpOworCQkJCW1lbWNweShuZXdzICsgbDEgKyBsMiwgYnJhY2VfZW5kLCBsMyk7CisJCQkJbmV3c1tsMSArIGwyICsgbDNdID0gJ1wwJzsKKwkJCQlhbHRfZXhwYW5kKHdwLCBuZXdzLCBuZXdzICsgbDEsCisJCQkJICAgIG5ld3MgKyBsMSArIGwyICsgbDMsIGZkbyk7CisJCQkJZmllbGRfc3RhcnQgPSBwICsgMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9leGVjLmMgYi9ta3NoL3NyYy9leGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMzIxYQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2V4ZWMuYwpAQCAtMCwwICsxLDE1MTggQEAKKy8qCSRPcGVuQlNEOiBleGVjLmMsdiAxLjQ5IDIwMDkvMDEvMjkgMjM6Mjc6MjYgamFyZWR5IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZXhlYy5jLHYgMS43NSAyMDEwLzA3LzE3IDIyOjA5OjM0IHRnIEV4cCAkIik7CisKKyNpZm5kZWYgTUtTSF9ERUZBVUxUX0VYRUNTSEVMTAorI2RlZmluZSBNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMCSIvYmluL3NoIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgY29tZXhlYyhzdHJ1Y3Qgb3AgKiwgc3RydWN0IHRibCAqdm9sYXRpbGUsIGNvbnN0IGNoYXIgKiosCisgICAgaW50IHZvbGF0aWxlLCB2b2xhdGlsZSBpbnQgKik7CitzdGF0aWMgdm9pZCBzY3JpcHRleGVjKHN0cnVjdCBvcCAqLCBjb25zdCBjaGFyICoqKSBNS1NIX0FfTk9SRVRVUk47CitzdGF0aWMgaW50IGNhbGxfYnVpbHRpbihzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKiopOworc3RhdGljIGludCBpb3NldHVwKHN0cnVjdCBpb3dvcmQgKiwgc3RydWN0IHRibCAqKTsKK3N0YXRpYyBpbnQgaGVyZWluKGNvbnN0IGNoYXIgKiwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpkb19zZWxlY3RhcmdzKGNvbnN0IGNoYXIgKiosIGJvb2wpOworc3RhdGljIFRlc3Rfb3AgZGJ0ZXN0ZV9pc2EoVGVzdF9lbnYgKiwgVGVzdF9tZXRhKTsKK3N0YXRpYyBjb25zdCBjaGFyICpkYnRlc3RlX2dldG9wbmQoVGVzdF9lbnYgKiwgVGVzdF9vcCwgYm9vbCk7CitzdGF0aWMgdm9pZCBkYnRlc3RlX2Vycm9yKFRlc3RfZW52ICosIGludCwgY29uc3QgY2hhciAqKTsKKworLyoKKyAqIGV4ZWN1dGUgY29tbWFuZCB0cmVlCisgKi8KK2ludAorZXhlY3V0ZShzdHJ1Y3Qgb3AgKnZvbGF0aWxlIHQsCisgICAgdm9sYXRpbGUgaW50IGZsYWdzLAkJLyogaWYgWEVYRUMgZG9uJ3QgZm9yayAqLworICAgIHZvbGF0aWxlIGludCAqIHZvbGF0aWxlIHhlcnJvaykKK3sKKwlpbnQgaTsKKwl2b2xhdGlsZSBpbnQgcnYgPSAwLCBkdW1teSA9IDA7CisJaW50IHB2WzJdOworCWNvbnN0IGNoYXIgKiogdm9sYXRpbGUgYXA7CisJY2hhciAqKiB2b2xhdGlsZSB1cDsKKwljb25zdCBjaGFyICpzLCAqY3A7CisJc3RydWN0IGlvd29yZCAqKmlvd3A7CisJc3RydWN0IHRibCAqdHAgPSBOVUxMOworCisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKworCS8qIENhbGxlciBkb2Vzbid0IGNhcmUgaWYgWEVSUk9LIHNob3VsZCBwcm9wYWdhdGUuICovCisJaWYgKHhlcnJvayA9PSBOVUxMKQorCQl4ZXJyb2sgPSAmZHVtbXk7CisKKwlpZiAoKGZsYWdzJlhGT1JLKSAmJiAhKGZsYWdzJlhFWEVDKSAmJiB0LT50eXBlICE9IFRQSVBFKQorCQkvKiBydW4gaW4gc3ViLXByb2Nlc3MgKi8KKwkJcmV0dXJuIChleGNoaWxkKHQsIGZsYWdzICYgflhUSU1FLCB4ZXJyb2ssIC0xKSk7CisKKwluZXdlbnYoRV9FWEVDKTsKKwlpZiAodHJhcCkKKwkJcnVudHJhcHMoMCk7CisKKwlpZiAodC0+dHlwZSA9PSBUQ09NKSB7CisJCS8qIENsZWFyIHN1YnN0X2V4c3RhdCBiZWZvcmUgYXJndW1lbnQgZXhwYW5zaW9uLiBVc2VkIGJ5CisJCSAqIG51bGwgY29tbWFuZHMgKHNlZSBjb21leGVjKCkgYW5kIGNfZXZhbCgpKSBhbmQgYnkgY19zZXQoKS4KKwkJICovCisJCXN1YnN0X2V4c3RhdCA9IDA7CisKKwkJY3VycmVudF9saW5lbm8gPSB0LT5saW5lbm87CS8qIGZvciAkTElORU5PICovCisKKwkJLyogUE9TSVggc2F5cyBleHBhbmQgY29tbWFuZCB3b3JkcyBmaXJzdCwgdGhlbiByZWRpcmVjdGlvbnMsCisJCSAqIGFuZCBhc3NpZ25tZW50cyBsYXN0Li4KKwkJICovCisJCXVwID0gZXZhbCh0LT5hcmdzLCB0LT51LmV2YWxmbGFncyB8IERPQkxBTksgfCBET0dMT0IgfCBET1RJTERFKTsKKwkJaWYgKGZsYWdzICYgWFRJTUUpCisJCQkvKiBBbGxvdyBvcHRpb24gcGFyc2luZyAoYml6YXJyZSwgYnV0IFBPU0lYKSAqLworCQkJdGltZXhfaG9vayh0LCAmdXApOworCQlhcCA9IChjb25zdCBjaGFyICoqKXVwOworCQlpZiAoRmxhZyhGWFRSQUNFKSAmJiBhcFswXSkgeworCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzIiwKKwkJCQlzdWJzdGl0dXRlKHN0cl92YWwoZ2xvYmFsKCJQUzQiKSksIDApKTsKKwkJCWZvciAoaSA9IDA7IGFwW2ldOyBpKyspCisJCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzJWMiLCBhcFtpXSwKKwkJCQkgICAgYXBbaSArIDFdID8gJyAnIDogJ1xuJyk7CisJCQlzaGZfZmx1c2goc2hsX291dCk7CisJCX0KKwkJaWYgKGFwWzBdKQorCQkJdHAgPSBmaW5kY29tKGFwWzBdLCBGQ19CSXxGQ19GVU5DKTsKKwl9CisJZmxhZ3MgJj0gflhUSU1FOworCisJaWYgKHQtPmlvYWN0ICE9IE5VTEwgfHwgdC0+dHlwZSA9PSBUUElQRSB8fCB0LT50eXBlID09IFRDT1BST0MpIHsKKwkJZS0+c2F2ZWZkID0gYWxsb2MoTlVGSUxFICogc2l6ZW9mKHNob3J0KSwgQVRFTVApOworCQkvKiBpbml0aWFsaXNlIHRvIG5vdCByZWRpcmVjdGVkICovCisJCW1lbXNldChlLT5zYXZlZmQsIDAsIE5VRklMRSAqIHNpemVvZihzaG9ydCkpOworCX0KKworCS8qIGRvIHJlZGlyZWN0aW9uLCB0byBiZSByZXN0b3JlZCBpbiBxdWl0ZW52KCkgKi8KKwlpZiAodC0+aW9hY3QgIT0gTlVMTCkKKwkJZm9yIChpb3dwID0gdC0+aW9hY3Q7ICppb3dwICE9IE5VTEw7IGlvd3ArKykgeworCQkJaWYgKGlvc2V0dXAoKmlvd3AsIHRwKSA8IDApIHsKKwkJCQlleHN0YXQgPSBydiA9IDE7CisJCQkJLyogUmVkaXJlY3Rpb24gZmFpbHVyZXMgZm9yIHNwZWNpYWwgY29tbWFuZHMKKwkJCQkgKiBjYXVzZSAobm9uLWludGVyYWN0aXZlKSBzaGVsbCB0byBleGl0LgorCQkJCSAqLworCQkJCWlmICh0cCAmJiB0cC0+dHlwZSA9PSBDU0hFTEwgJiYKKwkJCQkgICAgKHRwLT5mbGFnICYgU1BFQ19CSSkpCisJCQkJCWVycm9yZnooKTsKKwkJCQkvKiBEZWFsIHdpdGggRkVSUkVYSVQsIHF1aXRlbnYoKSwgZXRjLiAqLworCQkJCWdvdG8gQnJlYWs7CisJCQl9CisJCX0KKworCXN3aXRjaCAodC0+dHlwZSkgeworCWNhc2UgVENPTToKKwkJcnYgPSBjb21leGVjKHQsIHRwLCAoY29uc3QgY2hhciAqKilhcCwgZmxhZ3MsIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBUUEFSRU46CisJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyB8IFhGT1JLLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVFBJUEU6CisJCWZsYWdzIHw9IFhGT1JLOworCQlmbGFncyAmPSB+WEVYRUM7CisJCWUtPnNhdmVmZFswXSA9IHNhdmVmZCgwKTsKKwkJZS0+c2F2ZWZkWzFdID0gc2F2ZWZkKDEpOworCQl3aGlsZSAodC0+dHlwZSA9PSBUUElQRSkgeworCQkJb3BlbnBpcGUocHYpOworCQkJa3NoX2R1cDIocHZbMV0sIDEsIGZhbHNlKTsgLyogc3Rkb3V0IG9mIGN1cnIgKi8KKwkJCS8qKgorCQkJICogTGV0IGV4Y2hpbGQoKSBjbG9zZSBwdlswXSBpbiBjaGlsZAorCQkJICogKGlmIHRoaXMgaXNuJ3QgZG9uZSwgY29tbWFuZHMgbGlrZQorCQkJICoJKDogOyBjYXQgL2V0Yy90ZXJtY2FwKSB8IHNsZWVwIDEKKwkJCSAqIHdpbGwgaGFuZyBmb3JldmVyKS4KKwkJCSAqLworCQkJZXhjaGlsZCh0LT5sZWZ0LCBmbGFncyB8IFhQSVBFTyB8IFhDQ0xPU0UsCisJCQkgICAgTlVMTCwgcHZbMF0pOworCQkJa3NoX2R1cDIocHZbMF0sIDAsIGZhbHNlKTsgLyogc3RkaW4gb2YgbmV4dCAqLworCQkJY2xvc2VwaXBlKHB2KTsKKwkJCWZsYWdzIHw9IFhQSVBFSTsKKwkJCXQgPSB0LT5yaWdodDsKKwkJfQorCQlyZXN0ZmQoMSwgZS0+c2F2ZWZkWzFdKTsgLyogc3Rkb3V0IG9mIGxhc3QgKi8KKwkJZS0+c2F2ZWZkWzFdID0gMDsgLyogbm8gbmVlZCB0byByZS1yZXN0b3JlIHRoaXMgKi8KKwkJLyogTGV0IGV4Y2hpbGQoKSBjbG9zZSAwIGluIHBhcmVudCwgYWZ0ZXIgZm9yaywgYmVmb3JlIHdhaXQgKi8KKwkJaSA9IGV4Y2hpbGQodCwgZmxhZ3MgfCBYUENMT1NFLCB4ZXJyb2ssIDApOworCQlpZiAoIShmbGFncyZYQkdORCkgJiYgIShmbGFncyZYWENPTSkpCisJCQlydiA9IGk7CisJCWJyZWFrOworCisJY2FzZSBUTElTVDoKKwkJd2hpbGUgKHQtPnR5cGUgPT0gVExJU1QpIHsKKwkJCWV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIE5VTEwpOworCQkJdCA9IHQtPnJpZ2h0OworCQl9CisJCXJ2ID0gZXhlY3V0ZSh0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRDT1BST0M6IHsKKwkJc2lnc2V0X3Qgb21hc2s7CisKKwkJLyogQmxvY2sgc2lnY2hpbGQgYXMgd2UgYXJlIHVzaW5nIHRoaW5ncyBjaGFuZ2VkIGluIHRoZQorCQkgKiBzaWduYWwgaGFuZGxlcgorCQkgKi8KKwkJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKwkJZS0+dHlwZSA9IEVfRVJSSDsKKwkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwkJaWYgKGkpIHsKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQkJcXVpdGVudihOVUxMKTsKKwkJCXVud2luZChpKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQkvKiBBbHJlYWR5IGhhdmUgYSAobGl2ZSkgY28tcHJvY2Vzcz8gKi8KKwkJaWYgKGNvcHJvYy5qb2IgJiYgY29wcm9jLndyaXRlID49IDApCisJCQllcnJvcmYoImNvcHJvY2VzcyBhbHJlYWR5IGV4aXN0cyIpOworCisJCS8qIENhbiB3ZSByZS11c2UgdGhlIGV4aXN0aW5nIGNvLXByb2Nlc3MgcGlwZT8gKi8KKwkJY29wcm9jX2NsZWFudXAodHJ1ZSk7CisKKwkJLyogZG8gdGhpcyBiZWZvcmUgb3BlbmluZyBwaXBlcywgaW4gY2FzZSB0aGVzZSBmYWlsICovCisJCWUtPnNhdmVmZFswXSA9IHNhdmVmZCgwKTsKKwkJZS0+c2F2ZWZkWzFdID0gc2F2ZWZkKDEpOworCisJCW9wZW5waXBlKHB2KTsKKwkJaWYgKHB2WzBdICE9IDApIHsKKwkJCWtzaF9kdXAyKHB2WzBdLCAwLCBmYWxzZSk7CisJCQljbG9zZShwdlswXSk7CisJCX0KKwkJY29wcm9jLndyaXRlID0gcHZbMV07CisJCWNvcHJvYy5qb2IgPSBOVUxMOworCisJCWlmIChjb3Byb2MucmVhZHcgPj0gMCkKKwkJCWtzaF9kdXAyKGNvcHJvYy5yZWFkdywgMSwgZmFsc2UpOworCQllbHNlIHsKKwkJCW9wZW5waXBlKHB2KTsKKwkJCWNvcHJvYy5yZWFkID0gcHZbMF07CisJCQlrc2hfZHVwMihwdlsxXSwgMSwgZmFsc2UpOworCQkJY29wcm9jLnJlYWR3ID0gcHZbMV07CSAvKiBjbG9zZWQgYmVmb3JlIGZpcnN0IHJlYWQgKi8KKwkJCWNvcHJvYy5uam9icyA9IDA7CisJCQkvKiBjcmVhdGUgbmV3IGNvcHJvY2VzcyBpZCAqLworCQkJKytjb3Byb2MuaWQ7CisJCX0KKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWUtPnR5cGUgPSBFX0VYRUM7IC8qIG5vIG1vcmUgbmVlZCBmb3IgZXJyb3IgaGFuZGxlciAqLworCisJCS8qIGV4Y2hpbGQoKSBjbG9zZXMgY29wcm9jLiogaW4gY2hpbGQgYWZ0ZXIgZm9yaywKKwkJICogd2lsbCBhbHNvIGluY3JlbWVudCBjb3Byb2MubmpvYnMgd2hlbiB0aGUKKwkJICogam9iIGlzIGFjdHVhbGx5IGNyZWF0ZWQuCisJCSAqLworCQlmbGFncyAmPSB+WEVYRUM7CisJCWV4Y2hpbGQodC0+bGVmdCwgZmxhZ3MgfCBYQkdORCB8IFhGT1JLIHwgWENPUFJPQyB8IFhDQ0xPU0UsCisJCSAgICBOVUxMLCBjb3Byb2MucmVhZHcpOworCQlicmVhazsKKwl9CisKKwljYXNlIFRBU1lOQzoKKwkJLyogWFhYIG5vbi1vcHRpbWFsLCBJIHRoaW5rIC0gIihmb28gJikiLCBmb3JrcyBmb3IgKCksCisJCSAqIGZvcmtzIGFnYWluIGZvciBhc3luYy4uLiBwYXJlbnQgc2hvdWxkIG9wdGltaXNlCisJCSAqIHRoaXMgdG8gImZvbyAmIi4uLgorCQkgKi8KKwkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIChmbGFncyZ+WEVYRUMpfFhCR05EfFhGT1JLLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVE9SOgorCWNhc2UgVEFORDoKKwkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIFhFUlJPSywgeGVycm9rKTsKKwkJaWYgKChydiA9PSAwKSA9PSAodC0+dHlwZSA9PSBUQU5EKSkKKwkJCXJ2ID0gZXhlY3V0ZSh0LT5yaWdodCwgWEVSUk9LLCB4ZXJyb2spOworCQlmbGFncyB8PSBYRVJST0s7CisJCWlmICh4ZXJyb2spCisJCQkqeGVycm9rID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFRCQU5HOgorCQlydiA9ICFleGVjdXRlKHQtPnJpZ2h0LCBYRVJST0ssIHhlcnJvayk7CisJCWZsYWdzIHw9IFhFUlJPSzsKKwkJaWYgKHhlcnJvaykKKwkJCSp4ZXJyb2sgPSAxOworCQlicmVhazsKKworCWNhc2UgVERCUkFDS0VUOiB7CisJCVRlc3RfZW52IHRlOworCisJCXRlLmZsYWdzID0gVEVGX0RCUkFDS0VUOworCQl0ZS5wb3Mud3AgPSB0LT5hcmdzOworCQl0ZS5pc2EgPSBkYnRlc3RlX2lzYTsKKwkJdGUuZ2V0b3BuZCA9IGRidGVzdGVfZ2V0b3BuZDsKKwkJdGUuZXZhbCA9IHRlc3RfZXZhbDsKKwkJdGUuZXJyb3IgPSBkYnRlc3RlX2Vycm9yOworCisJCXJ2ID0gdGVzdF9wYXJzZSgmdGUpOworCQlicmVhazsKKwl9CisKKwljYXNlIFRGT1I6CisJY2FzZSBUU0VMRUNUOiB7CisJCXZvbGF0aWxlIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworCQlhcCA9ICh0LT52YXJzID09IE5VTEwpID8gZS0+bG9jLT5hcmd2ICsgMSA6CisJCSAgICAoY29uc3QgY2hhciAqKilldmFsKChjb25zdCBjaGFyICoqKXQtPnZhcnMsCisJCSAgICBET0JMQU5LIHwgRE9HTE9CIHwgRE9USUxERSk7CisJCWUtPnR5cGUgPSBFX0xPT1A7CisJCXdoaWxlICgxKSB7CisJCQlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCQkJaWYgKCFpKQorCQkJCWJyZWFrOworCQkJaWYgKChlLT5mbGFncyZFRl9CUktDT05UX1BBU1MpIHx8CisJCQkgICAgKGkgIT0gTEJSRUFLICYmIGkgIT0gTENPTlRJTikpIHsKKwkJCQlxdWl0ZW52KE5VTEwpOworCQkJCXVud2luZChpKTsKKwkJCX0gZWxzZSBpZiAoaSA9PSBMQlJFQUspIHsKKwkJCQlydiA9IDA7CisJCQkJZ290byBCcmVhazsKKwkJCX0KKwkJfQorCQlydiA9IDA7IC8qIGluIGNhc2Ugb2YgYSBjb250aW51ZSAqLworCQlpZiAodC0+dHlwZSA9PSBURk9SKSB7CisJCQl3aGlsZSAoKmFwICE9IE5VTEwpIHsKKwkJCQlzZXRzdHIoZ2xvYmFsKHQtPnN0ciksICphcCsrLCBLU0hfVU5XSU5EX0VSUk9SKTsKKwkJCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCQl9CisJCX0gZWxzZSB7IC8qIFRTRUxFQ1QgKi8KKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoIShjcCA9IGRvX3NlbGVjdGFyZ3MoYXAsIGlzX2ZpcnN0KSkpIHsKKwkJCQkJcnYgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaXNfZmlyc3QgPSBmYWxzZTsKKwkJCQlzZXRzdHIoZ2xvYmFsKHQtPnN0ciksIGNwLCBLU0hfVU5XSU5EX0VSUk9SKTsKKwkJCQlleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgVFdISUxFOgorCWNhc2UgVFVOVElMOgorCQllLT50eXBlID0gRV9MT09QOworCQl3aGlsZSAoMSkgeworCQkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwkJCWlmICghaSkKKwkJCQlicmVhazsKKwkJCWlmICgoZS0+ZmxhZ3MmRUZfQlJLQ09OVF9QQVNTKSB8fAorCQkJICAgIChpICE9IExCUkVBSyAmJiBpICE9IExDT05USU4pKSB7CisJCQkJcXVpdGVudihOVUxMKTsKKwkJCQl1bndpbmQoaSk7CisJCQl9IGVsc2UgaWYgKGkgPT0gTEJSRUFLKSB7CisJCQkJcnYgPSAwOworCQkJCWdvdG8gQnJlYWs7CisJCQl9CisJCX0KKwkJcnYgPSAwOyAvKiBpbiBjYXNlIG9mIGEgY29udGludWUgKi8KKwkJd2hpbGUgKChleGVjdXRlKHQtPmxlZnQsIFhFUlJPSywgTlVMTCkgPT0gMCkgPT0KKwkJICAgICh0LT50eXBlID09IFRXSElMRSkpCisJCQlydiA9IGV4ZWN1dGUodC0+cmlnaHQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVElGOgorCWNhc2UgVEVMSUY6CisJCWlmICh0LT5yaWdodCA9PSBOVUxMKQorCQkJYnJlYWs7CS8qIHNob3VsZCBiZSBlcnJvciAqLworCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgWEVSUk9LLCBOVUxMKSA9PSAwID8KKwkJICAgIGV4ZWN1dGUodC0+cmlnaHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spIDoKKwkJICAgIGV4ZWN1dGUodC0+cmlnaHQtPnJpZ2h0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRDQVNFOgorCQljcCA9IGV2YWxzdHIodC0+c3RyLCBET1RJTERFKTsKKwkJZm9yICh0ID0gdC0+bGVmdDsgdCAhPSBOVUxMICYmIHQtPnR5cGUgPT0gVFBBVDsgdCA9IHQtPnJpZ2h0KQorCQkgICAgZm9yIChhcCA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICphcDsgYXArKykKKwkJCWlmICgocyA9IGV2YWxzdHIoKmFwLCBET1RJTERFfERPUEFUKSkgJiYKKwkJCSAgICBnbWF0Y2h4KGNwLCBzLCBmYWxzZSkpCisJCQkJZ290byBGb3VuZDsKKwkJYnJlYWs7CisgRm91bmQ6CisJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRCUkFDRToKKwkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVEZVTkNUOgorCQlydiA9IGRlZmluZSh0LT5zdHIsIHQpOworCQlicmVhazsKKworCWNhc2UgVFRJTUU6CisJCS8qIENsZWFyIFhFWEVDIHNvIG5lc3RlZCBleGVjdXRlKCkgY2FsbCBkb2Vzbid0IGV4aXQKKwkJICogKGFsbG93cyAibHMgLWwgfCB0aW1lIGdyZXAgZm9vIikuCisJCSAqLworCQlydiA9IHRpbWV4KHQsIGZsYWdzICYgflhFWEVDLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVEVYRUM6CQkvKiBhbiBldmFsJ2QgVENPTSAqLworCQlzID0gdC0+YXJnc1swXTsKKwkJdXAgPSBtYWtlbnYoKTsKKwkJcmVzdG9yZXNpZ3MoKTsKKwkJY2xlYW51cF9wcm9jX2VudigpOworCQl7CisJCQl1bmlvbiBta3NoX2NjcGhhY2sgY2FyZ3M7CisKKwkJCWNhcmdzLnJvID0gdC0+YXJnczsKKwkJCWV4ZWN2ZSh0LT5zdHIsIGNhcmdzLnJ3LCB1cCk7CisJCQlydiA9IGVycm5vOworCQl9CisJCWlmIChydiA9PSBFTk9FWEVDKQorCQkJc2NyaXB0ZXhlYyh0LCAoY29uc3QgY2hhciAqKil1cCk7CisJCWVsc2UKKwkJCWVycm9yZigiJXM6ICVzIiwgcywgc3RyZXJyb3IocnYpKTsKKwl9CisgQnJlYWs6CisJZXhzdGF0ID0gcnY7CisKKwlxdWl0ZW52KE5VTEwpOwkJLyogcmVzdG9yZXMgSU8gKi8KKwlpZiAoKGZsYWdzJlhFWEVDKSkKKwkJdW53aW5kKExFWElUKTsJLyogZXhpdCBjaGlsZCAqLworCWlmIChydiAhPSAwICYmICEoZmxhZ3MgJiBYRVJST0spICYmCisJICAgICh4ZXJyb2sgPT0gTlVMTCB8fCAhKnhlcnJvaykpIHsKKwkJdHJhcHNpZyhTSUdFUlJfKTsKKwkJaWYgKEZsYWcoRkVSUkVYSVQpKQorCQkJdW53aW5kKExFUlJPUik7CisJfQorCXJldHVybiAocnYpOworfQorCisvKgorICogZXhlY3V0ZSBzaW1wbGUgY29tbWFuZAorICovCisKK3N0YXRpYyBpbnQKK2NvbWV4ZWMoc3RydWN0IG9wICp0LCBzdHJ1Y3QgdGJsICp2b2xhdGlsZSB0cCwgY29uc3QgY2hhciAqKmFwLAorICAgIHZvbGF0aWxlIGludCBmbGFncywgdm9sYXRpbGUgaW50ICp4ZXJyb2spCit7CisJaW50IGk7CisJdm9sYXRpbGUgaW50IHJ2ID0gMDsKKwljb25zdCBjaGFyICpjcDsKKwljb25zdCBjaGFyICoqbGFzdHA7CisJc3RhdGljIHN0cnVjdCBvcCB0ZXhlYzsgLyogTXVzdCBiZSBzdGF0aWMgKFhYWCBidXQgd2h5PykgKi8KKwlpbnQgdHlwZV9mbGFnczsKKwlpbnQga2VlcGFzbl9vazsKKwlpbnQgZmNmbGFncyA9IEZDX0JJfEZDX0ZVTkN8RkNfUEFUSDsKKwlib29sIGJvdXJuZV9mdW5jdGlvbl9jYWxsID0gZmFsc2U7CisJc3RydWN0IGJsb2NrICpsX2V4cGFuZCwgKmxfYXNzaWduOworCisJLyogc25hZyB0aGUgbGFzdCBhcmd1bWVudCBmb3IgJF8gWFhYIG5vdCB0aGUgc2FtZSBhcyBBVCZUIGtzaCwKKwkgKiB3aGljaCBvbmx5IHNlZW1zIHRvIHNldCAkXyBhZnRlciBhIG5ld2xpbmUgKGJ1dCBub3QgaW4KKwkgKiBmdW5jdGlvbnMvZG90IHNjcmlwdHMsIGJ1dCBpbiBpbnRlcmFjdGl2ZSBhbmQgc2NyaXB0KSAtCisJICogcGVyaGFwcyBzYXZlIGxhc3QgYXJnIGhlcmUgYW5kIHNldCBpdCBpbiBzaGVsbCgpPy4KKwkgKi8KKwlpZiAoRmxhZyhGVEFMS0lORykgJiYgKihsYXN0cCA9IGFwKSkgeworCQl3aGlsZSAoKisrbGFzdHApCisJCQk7CisJCS8qIHNldHN0cigpIGNhbid0IGZhaWwgaGVyZSAqLworCQlzZXRzdHIodHlwZXNldCgiXyIsIExPQ0FMLCAwLCBJTlRFR0VSLCAwKSwgKi0tbGFzdHAsCisJCSAgICBLU0hfUkVUVVJOX0VSUk9SKTsKKwl9CisKKwkvKiBEZWFsIHdpdGggdGhlIHNoZWxsIGJ1aWx0aW5zIGJ1aWx0aW4sIGV4ZWMgYW5kIGNvbW1hbmQgc2luY2UKKwkgKiB0aGV5IGNhbiBiZSBmb2xsb3dlZCBieSBvdGhlciBjb21tYW5kcy4gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCisJICogd2Uga25vdyBpZiB3ZSBzaG91bGQgY3JlYXRlIGEgbG9jYWwgYmxvY2sgd2hpY2ggbXVzdCBiZSBkb25lCisJICogYmVmb3JlIHdlIGNhbiBkbyBhIHBhdGggc2VhcmNoIChpbiBjYXNlIHRoZSBhc3NpZ25tZW50cyBjaGFuZ2UKKwkgKiBQQVRIKS4KKwkgKiBPZGQgY2FzZXM6CisJICoJRk9PPWJhciBleGVjID4vZGV2L251bGwJCUZPTyBpcyBrZXB0IGJ1dCBub3QgZXhwb3J0ZWQKKwkgKglGT089YmFyIGV4ZWMgZm9vYmFyCQlGT08gaXMgZXhwb3J0ZWQKKwkgKglGT089YmFyIGNvbW1hbmQgZXhlYyA+L2Rldi9udWxsCUZPTyBpcyBuZWl0aGVyIGtlcHQgbm9yIGV4cG9ydGVkCisJICoJRk9PPWJhciBjb21tYW5kCQkJRk9PIGlzIG5laXRoZXIga2VwdCBub3IgZXhwb3J0ZWQKKwkgKglQQVRIPS4uLiBmb29iYXIJCQl1c2UgbmV3IFBBVEggaW4gZm9vYmFyIHNlYXJjaAorCSAqLworCWtlZXBhc25fb2sgPSAxOworCXdoaWxlICh0cCAmJiB0cC0+dHlwZSA9PSBDU0hFTEwpIHsKKwkJZmNmbGFncyA9IEZDX0JJfEZDX0ZVTkN8RkNfUEFUSDsvKiB1bmRvIGVmZmVjdHMgb2YgY29tbWFuZCAqLworCQlpZiAodHAtPnZhbC5mID09IGNfYnVpbHRpbikgeworCQkJaWYgKChjcCA9ICorK2FwKSA9PSBOVUxMKSB7CisJCQkJdHAgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQkJdHAgPSBmaW5kY29tKGNwLCBGQ19CSSk7CisJCQlpZiAodHAgPT0gTlVMTCkKKwkJCQllcnJvcmYoImJ1aWx0aW46ICVzOiBub3QgYSBidWlsdGluIiwgY3ApOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAodHAtPnZhbC5mID09IGNfZXhlYykgeworCQkJaWYgKGFwWzFdID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlhcCsrOworCQkJZmxhZ3MgfD0gWEVYRUM7CisJCX0gZWxzZSBpZiAodHAtPnZhbC5mID09IGNfY29tbWFuZCkgeworCQkJaW50IG9wdGMsIHNhd19wID0gMDsKKworCQkJLyogVWdseSBkZWFsaW5nIHdpdGggb3B0aW9ucyBpbiB0d28gcGxhY2VzIChoZXJlIGFuZAorCQkJICogaW4gY19jb21tYW5kKCksIGJ1dCBzdWNoIGlzIGxpZmUpCisJCQkgKi8KKwkJCWtzaF9nZXRvcHRfcmVzZXQoJmJ1aWx0aW5fb3B0LCAwKTsKKwkJCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQoYXAsICZidWlsdGluX29wdCwgIjpwIikpID09ICdwJykKKwkJCQlzYXdfcCA9IDE7CisJCQlpZiAob3B0YyAhPSBFT0YpCisJCQkJYnJlYWs7CS8qIGNvbW1hbmQgLXZWIG9yIHNvbWV0aGluZyAqLworCQkJLyogZG9uJ3QgbG9vayBmb3IgZnVuY3Rpb25zICovCisJCQlmY2ZsYWdzID0gRkNfQkl8RkNfUEFUSDsKKwkJCWlmIChzYXdfcCkgeworCQkJCWlmIChGbGFnKEZSRVNUUklDVEVEKSkgeworCQkJCQl3YXJuaW5nZih0cnVlLAorCQkJCQkgICAgImNvbW1hbmQgLXA6IHJlc3RyaWN0ZWQiKTsKKwkJCQkJcnYgPSAxOworCQkJCQlnb3RvIExlYXZlOworCQkJCX0KKwkJCQlmY2ZsYWdzIHw9IEZDX0RFRlBBVEg7CisJCQl9CisJCQlhcCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisJCQkvKiBQT1NJWCBzYXlzIHNwZWNpYWwgYnVpbHRpbnMgbG9zZSB0aGVpciBzdGF0dXMKKwkJCSAqIGlmIGFjY2Vzc2VkIHVzaW5nIGNvbW1hbmQuCisJCQkgKi8KKwkJCWtlZXBhc25fb2sgPSAwOworCQkJaWYgKCFhcFswXSkgeworCQkJCS8qIGVuc3VyZSBjb21tYW5kIHdpdGggbm8gYXJncyBleGl0cyB3aXRoIDAgKi8KKwkJCQlzdWJzdF9leHN0YXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJCWJyZWFrOworCQl0cCA9IGZpbmRjb20oYXBbMF0sIGZjZmxhZ3MgJiAoRkNfQkl8RkNfRlVOQykpOworCX0KKwlsX2V4cGFuZCA9IGUtPmxvYzsKKwlpZiAoa2VlcGFzbl9vayAmJiAoIWFwWzBdIHx8ICh0cCAmJiAodHAtPmZsYWcgJiBLRUVQQVNOKSkpKQorCQl0eXBlX2ZsYWdzID0gMDsKKwllbHNlIHsKKwkJLyogY3JlYXRlIG5ldyB2YXJpYWJsZS9mdW5jdGlvbiBibG9jayAqLworCQluZXdibG9jaygpOworCQkvKiBrc2ggZnVuY3Rpb25zIGRvbid0IGtlZXAgYXNzaWdubWVudHMsIFBPU0lYIGZ1bmN0aW9ucyBkby4gKi8KKwkJaWYgKGtlZXBhc25fb2sgJiYgdHAgJiYgdHAtPnR5cGUgPT0gQ0ZVTkMgJiYKKwkJICAgICEodHAtPmZsYWcgJiBGS1NIKSkgeworCQkJYm91cm5lX2Z1bmN0aW9uX2NhbGwgPSB0cnVlOworCQkJdHlwZV9mbGFncyA9IEVYUE9SVDsKKwkJfSBlbHNlCisJCQl0eXBlX2ZsYWdzID0gTE9DQUx8TE9DQUxfQ09QWXxFWFBPUlQ7CisJfQorCWxfYXNzaWduID0gZS0+bG9jOworCWlmIChGbGFnKEZFWFBPUlQpKQorCQl0eXBlX2ZsYWdzIHw9IEVYUE9SVDsKKwlmb3IgKGkgPSAwOyB0LT52YXJzW2ldOyBpKyspIHsKKwkJLyogZG8gTk9UIGxvb2t1cCBpbiB0aGUgbmV3IHZhci9mbiBibG9jayBqdXN0IGNyZWF0ZWQgKi8KKwkJZS0+bG9jID0gbF9leHBhbmQ7CisJCWNwID0gZXZhbHN0cih0LT52YXJzW2ldLCBET0FTTlRJTERFKTsKKwkJZS0+bG9jID0gbF9hc3NpZ247CisJCS8qIGJ1dCBhc3NpZ24gaW4gdGhlcmUgYXMgdXN1YWwgKi8KKworCQlpZiAoRmxhZyhGWFRSQUNFKSkgeworCQkJaWYgKGkgPT0gMCkKKwkJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXMiLAorCQkJCQlzdWJzdGl0dXRlKHN0cl92YWwoZ2xvYmFsKCJQUzQiKSksIDApKTsKKwkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlcyVjIiwgY3AsCisJCQkgICAgdC0+dmFyc1tpICsgMV0gPyAnICcgOiAnXG4nKTsKKwkJCWlmICghdC0+dmFyc1tpICsgMV0pCisJCQkJc2hmX2ZsdXNoKHNobF9vdXQpOworCQl9CisJCXR5cGVzZXQoY3AsIHR5cGVfZmxhZ3MsIDAsIDAsIDApOworCQlpZiAoYm91cm5lX2Z1bmN0aW9uX2NhbGwgJiYgISh0eXBlX2ZsYWdzICYgRVhQT1JUKSkKKwkJCXR5cGVzZXQoY3AsIExPQ0FMfExPQ0FMX0NPUFl8RVhQT1JULCAwLCAwLCAwKTsKKwl9CisKKwlpZiAoKGNwID0gKmFwKSA9PSBOVUxMKSB7CisJCXJ2ID0gc3Vic3RfZXhzdGF0OworCQlnb3RvIExlYXZlOworCX0gZWxzZSBpZiAoIXRwKSB7CisJCWlmIChGbGFnKEZSRVNUUklDVEVEKSAmJiB2c3RyY2hyKGNwLCAnLycpKSB7CisJCQl3YXJuaW5nZih0cnVlLCAiJXM6IHJlc3RyaWN0ZWQiLCBjcCk7CisJCQlydiA9IDE7CisJCQlnb3RvIExlYXZlOworCQl9CisJCXRwID0gZmluZGNvbShjcCwgZmNmbGFncyk7CisJfQorCisJc3dpdGNoICh0cC0+dHlwZSkgeworCWNhc2UgQ1NIRUxMOgkJCS8qIHNoZWxsIGJ1aWx0LWluICovCisJCXJ2ID0gY2FsbF9idWlsdGluKHRwLCAoY29uc3QgY2hhciAqKilhcCk7CisJCWJyZWFrOworCisJY2FzZSBDRlVOQzogewkJCS8qIGZ1bmN0aW9uIGNhbGwgKi8KKwkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBvbGRfeGZsYWc7CisJCXZvbGF0aWxlIFRmbGFnIG9sZF9pbnVzZTsKKwkJY29uc3QgY2hhciAqdm9sYXRpbGUgb2xkX2tzaG5hbWU7CisKKwkJaWYgKCEodHAtPmZsYWcgJiBJU1NFVCkpIHsKKwkJCXN0cnVjdCB0YmwgKmZ0cDsKKworCQkJaWYgKCF0cC0+dS5mcGF0aCkgeworCQkJCWlmICh0cC0+dTIuZXJybm9fKSB7CisJCQkJCXdhcm5pbmdmKHRydWUsCisJCQkJCSAgICAiJXM6IGNhbid0IGZpbmQgZnVuY3Rpb24gIgorCQkJCQkgICAgImRlZmluaXRpb24gZmlsZSAtICVzIiwKKwkJCQkJICAgIGNwLCBzdHJlcnJvcih0cC0+dTIuZXJybm9fKSk7CisJCQkJCXJ2ID0gMTI2OworCQkJCX0gZWxzZSB7CisJCQkJCXdhcm5pbmdmKHRydWUsCisJCQkJCSAgICAiJXM6IGNhbid0IGZpbmQgZnVuY3Rpb24gIgorCQkJCQkgICAgImRlZmluaXRpb24gZmlsZSIsIGNwKTsKKwkJCQkJcnYgPSAxMjc7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGluY2x1ZGUodHAtPnUuZnBhdGgsIDAsIE5VTEwsIDApIDwgMCkgeworCQkJCXJ2ID0gZXJybm87CisJCQkJd2FybmluZ2YodHJ1ZSwKKwkJCQkgICAgIiVzOiBjYW4ndCBvcGVuIGZ1bmN0aW9uIGRlZmluaXRpb24gZmlsZSAlcyAtICVzIiwKKwkJCQkgICAgY3AsIHRwLT51LmZwYXRoLCBzdHJlcnJvcihydikpOworCQkJCXJ2ID0gMTI3OworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCEoZnRwID0gZmluZGZ1bmMoY3AsIGhhc2goY3ApLCBmYWxzZSkpIHx8CisJCQkgICAgIShmdHAtPmZsYWcgJiBJU1NFVCkpIHsKKwkJCQl3YXJuaW5nZih0cnVlLAorCQkJCSAgICAiJXM6IGZ1bmN0aW9uIG5vdCBkZWZpbmVkIGJ5ICVzIiwKKwkJCQkgICAgY3AsIHRwLT51LmZwYXRoKTsKKwkJCQlydiA9IDEyNzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRwID0gZnRwOworCQl9CisKKwkJLyoga3NoIGZ1bmN0aW9ucyBzZXQgJDAgdG8gZnVuY3Rpb24gbmFtZSwgUE9TSVggZnVuY3Rpb25zIGxlYXZlCisJCSAqICQwIHVuY2hhbmdlZC4KKwkJICovCisJCW9sZF9rc2huYW1lID0ga3NobmFtZTsKKwkJaWYgKHRwLT5mbGFnICYgRktTSCkKKwkJCWtzaG5hbWUgPSBhcFswXTsKKwkJZWxzZQorCQkJYXBbMF0gPSBrc2huYW1lOworCQllLT5sb2MtPmFyZ3YgPSBhcDsKKwkJZm9yIChpID0gMDsgKmFwKysgIT0gTlVMTDsgaSsrKQorCQkJOworCQllLT5sb2MtPmFyZ2MgPSBpIC0gMTsKKwkJLyoga3NoLXN0eWxlIGZ1bmN0aW9ucyBoYW5kbGUgZ2V0b3B0cyBzYW5lbHksCisJCSAqIEJvdXJuZS9QT1NJWCBmdW5jdGlvbnMgYXJlIGluc2FuZS4uLgorCQkgKi8KKwkJaWYgKHRwLT5mbGFnICYgRktTSCkgeworCQkJZS0+bG9jLT5mbGFncyB8PSBCRl9ET0dFVE9QVFM7CisJCQllLT5sb2MtPmdldG9wdHNfc3RhdGUgPSB1c2VyX29wdDsKKwkJCWdldG9wdHNfcmVzZXQoMSk7CisJCX0KKworCQlvbGRfeGZsYWcgPSBGbGFnKEZYVFJBQ0UpOworCQlGbGFnKEZYVFJBQ0UpID0gdHAtPmZsYWcgJiBUUkFDRSA/IDEgOiAwOworCisJCW9sZF9pbnVzZSA9IHRwLT5mbGFnICYgRklOVVNFOworCQl0cC0+ZmxhZyB8PSBGSU5VU0U7CisKKwkJZS0+dHlwZSA9IEVfRlVOQzsKKwkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwkJaWYgKGkgPT0gMCkgeworCQkJLyogc2VlbXMgb2RkIHRvIHBhc3MgWEVSUk9LIGhlcmUsIGJ1dCBBVCZUIGtzaCBkb2VzICovCisJCQlleHN0YXQgPSBleGVjdXRlKHRwLT52YWwudCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCQlpID0gTFJFVFVSTjsKKwkJfQorCQlrc2huYW1lID0gb2xkX2tzaG5hbWU7CisJCUZsYWcoRlhUUkFDRSkgPSBvbGRfeGZsYWc7CisJCXRwLT5mbGFnID0gKHRwLT5mbGFnICYgfkZJTlVTRSkgfCBvbGRfaW51c2U7CisJCS8qIFdlcmUgd2UgZGVsZXRlZCB3aGlsZSBleGVjdXRpbmc/IElmIHNvLCBmcmVlIHRoZSBleGVjdXRpb24KKwkJICogdHJlZS4gdG9kbzogVW5mb3J0dW5hdGVseSwgdGhlIHRhYmxlIGVudHJ5IGlzIG5ldmVyIHJlLXVzZWQKKwkJICogdW50aWwgdGhlIGxvb2t1cCB0YWJsZSBpcyBleHBhbmRlZC4KKwkJICovCisJCWlmICgodHAtPmZsYWcgJiAoRkRFTEVURXxGSU5VU0UpKSA9PSBGREVMRVRFKSB7CisJCQlpZiAodHAtPmZsYWcgJiBBTExPQykgeworCQkJCXRwLT5mbGFnICY9IH5BTExPQzsKKwkJCQl0ZnJlZSh0cC0+dmFsLnQsIHRwLT5hcmVhcCk7CisJCQl9CisJCQl0cC0+ZmxhZyA9IDA7CisJCX0KKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgTFJFVFVSTjoKKwkJY2FzZSBMRVJST1I6CisJCQlydiA9IGV4c3RhdDsKKwkJCWJyZWFrOworCQljYXNlIExJTlRSOgorCQljYXNlIExFWElUOgorCQljYXNlIExMRUFWRToKKwkJY2FzZSBMU0hFTEw6CisJCQlxdWl0ZW52KE5VTEwpOworCQkJdW53aW5kKGkpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQlkZWZhdWx0OgorCQkJcXVpdGVudihOVUxMKTsKKwkJCWludGVybmFsX2Vycm9yZigiQ0ZVTkMgJWQiLCBpKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIENFWEVDOgkJLyogZXhlY3V0YWJsZSBjb21tYW5kICovCisJY2FzZSBDVEFMSUFTOgkJLyogdHJhY2tlZCBhbGlhcyAqLworCQlpZiAoISh0cC0+ZmxhZyZJU1NFVCkpIHsKKwkJCS8qIGVycm5vXyB3aWxsIGJlIHNldCBpZiB0aGUgbmFtZWQgY29tbWFuZCB3YXMgZm91bmQKKwkJCSAqIGJ1dCBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgKHBlcm1pc3Npb25zLCBubyBleGVjdXRlCisJCQkgKiBiaXQsIGRpcmVjdG9yeSwgZXRjKS4gUHJpbnQgb3V0IGEgKGhvcGVmdWxseSkKKwkJCSAqIHVzZWZ1bCBlcnJvciBtZXNzYWdlIGFuZCBzZXQgdGhlIGV4aXQgc3RhdHVzIHRvIDEyNi4KKwkJCSAqLworCQkJaWYgKHRwLT51Mi5lcnJub18pIHsKKwkJCQl3YXJuaW5nZih0cnVlLCAiJXM6IGNhbm5vdCBleGVjdXRlIC0gJXMiLCBjcCwKKwkJCQkgICAgc3RyZXJyb3IodHAtPnUyLmVycm5vXykpOworCQkJCXJ2ID0gMTI2OwkvKiBQT1NJWCAqLworCQkJfSBlbHNlIHsKKwkJCQl3YXJuaW5nZih0cnVlLCAiJXM6IG5vdCBmb3VuZCIsIGNwKTsKKwkJCQlydiA9IDEyNzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogc2V0ICRfIHRvIHByb2dyYW1tZSdzIGZ1bGwgcGF0aCAqLworCQkvKiBzZXRzdHIoKSBjYW4ndCBmYWlsIGhlcmUgKi8KKwkJc2V0c3RyKHR5cGVzZXQoIl8iLCBMT0NBTHxFWFBPUlQsIDAsIElOVEVHRVIsIDApLAorCQkgICAgdHAtPnZhbC5zLCBLU0hfUkVUVVJOX0VSUk9SKTsKKworCQlpZiAoZmxhZ3MmWEVYRUMpIHsKKwkJCWpfZXhpdCgpOworCQkJaWYgKCEoZmxhZ3MmWEJHTkQpCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQkJICAgIHx8IEZsYWcoRk1PTklUT1IpCisjZW5kaWYKKwkJCSAgICApIHsKKwkJCQlzZXRleGVjc2lnKCZzaWd0cmFwc1tTSUdJTlRdLCBTU19SRVNUT1JFX09SSUcpOworCQkJCXNldGV4ZWNzaWcoJnNpZ3RyYXBzW1NJR1FVSVRdLCBTU19SRVNUT1JFX09SSUcpOworCQkJfQorCQl9CisKKwkJLyogdG8gZm9yayB3ZSBzZXQgdXAgYSBURVhFQyBub2RlIGFuZCBjYWxsIGV4ZWN1dGUgKi8KKwkJdGV4ZWMudHlwZSA9IFRFWEVDOworCQl0ZXhlYy5sZWZ0ID0gdDsJLyogZm9yIHRwcmludCAqLworCQl0ZXhlYy5zdHIgPSB0cC0+dmFsLnM7CisJCXRleGVjLmFyZ3MgPSBhcDsKKwkJcnYgPSBleGNoaWxkKCZ0ZXhlYywgZmxhZ3MsIHhlcnJvaywgLTEpOworCQlicmVhazsKKwl9CisgTGVhdmU6CisJaWYgKGZsYWdzICYgWEVYRUMpIHsKKwkJZXhzdGF0ID0gcnY7CisJCXVud2luZChMTEVBVkUpOworCX0KKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIHZvaWQKK3NjcmlwdGV4ZWMoc3RydWN0IG9wICp0cCwgY29uc3QgY2hhciAqKmFwKQoreworCWNvbnN0IGNoYXIgKnNoOworI2lmbmRlZiBNS1NIX1NNQUxMCisJdW5zaWduZWQgY2hhciAqY3A7CisJY2hhciBidWZbNjRdOwkJLyogNjQgPT0gTUFYSU5URVJQIGluIE1pckJTRCA8c3lzL3BhcmFtLmg+ICovCisJaW50IGZkOworI2VuZGlmCisJdW5pb24gbWtzaF9jY3BoYWNrIGFyZ3MsIGNhcDsKKworCXNoID0gc3RyX3ZhbChnbG9iYWwoIkVYRUNTSEVMTCIpKTsKKwlpZiAoc2ggJiYgKnNoKQorCQlzaCA9IHNlYXJjaChzaCwgcGF0aCwgWF9PSywgTlVMTCk7CisJaWYgKCFzaCB8fCAhKnNoKQorCQlzaCA9IE1LU0hfREVGQVVMVF9FWEVDU0hFTEw7CisKKwkqdHAtPmFyZ3MtLSA9IHRwLT5zdHI7CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWlmICgoZmQgPSBvcGVuKHRwLT5zdHIsIE9fUkRPTkxZKSkgPj0gMCkgeworCQkvKiByZWFkIGZpcnN0IE1BWElOVEVSUCBvY3RldHMgZnJvbSBmaWxlICovCisJCWlmIChyZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSA8PSAwKQorCQkJLyogcmVhZCBlcnJvciAtPiBubyBnb29kICovCisJCQlidWZbMF0gPSAnXDAnOworCQljbG9zZShmZCk7CisJCS8qIHNjYW4gZm9yIG5ld2xpbmUgKG9yIENSKSBvciBOVUwgX2JlZm9yZV8gZW5kIG9mIGJ1ZmZlciAqLworCQljcCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCQl3aGlsZSAoKGNoYXIgKiljcCA8IChidWYgKyBzaXplb2YoYnVmKSkpCisJCQlpZiAoKmNwID09ICdcMCcgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICdccicpIHsKKwkJCQkqY3AgPSAnXDAnOworCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJKytjcDsKKwkJLyogaWYgdGhlIHNoZWJhbmcgbGluZSBpcyBsb25nZXIgdGhhbiBNQVhJTlRFUlAsIGJhaWwgb3V0ICovCisJCWlmICgoY2hhciAqKWNwID49IChidWYgKyBzaXplb2YoYnVmKSkpCisJCQlnb3RvIG5vc2hlYmFuZzsKKwkJLyogc2tpcCBVVEYtOCBCeXRlIE9yZGVyIE1hcmssIGlmIHByZXNlbnQgKi8KKwkJY3AgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKwkJaWYgKChjcFswXSA9PSAweEVGKSAmJiAoY3BbMV0gPT0gMHhCQikgJiYgKGNwWzJdID09IDB4QkYpKQorCQkJY3AgKz0gMzsKKwkJLyogYmFpbCBvdXQgaWYgcmVhZCBlcnJvciAoYWJvdmUpIG9yIG5vIHNoZWJhbmcgKi8KKwkJaWYgKChjcFswXSAhPSAnIycpIHx8IChjcFsxXSAhPSAnIScpKQorCQkJZ290byBub3NoZWJhbmc7CisJCWNwICs9IDI7CisJCS8qIHNraXAgd2hpdGVzcGFjZSBiZWZvcmUgc2hlbGwgbmFtZSAqLworCQl3aGlsZSAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykKKwkJCSsrY3A7CisJCS8qIGp1c3Qgd2hpdGVzcGFjZSBvbiB0aGUgbGluZT8gKi8KKwkJaWYgKCpjcCA9PSAnXDAnKQorCQkJZ290byBub3NoZWJhbmc7CisJCS8qIG5vLCB3ZSBhY3R1YWxseSBmb3VuZCBhbiBpbnRlcnByZXRlciBuYW1lICovCisJCXNoID0gKGNoYXIgKiljcDsKKwkJLyogbG9vayBmb3IgZW5kIG9mIHNoZWxsL2ludGVycHJldGVyIG5hbWUgKi8KKwkJd2hpbGUgKCpjcCAhPSAnICcgJiYgKmNwICE9ICdcdCcgJiYgKmNwICE9ICdcMCcpCisJCQkrK2NwOworCQkvKiBhbnkgYXJndW1lbnRzPyAqLworCQlpZiAoKmNwKSB7CisJCQkqY3ArKyA9ICdcMCc7CisJCQkvKiBza2lwIHNwYWNlcyBiZWZvcmUgYXJndW1lbnRzICovCisJCQl3aGlsZSAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykKKwkJCQkrK2NwOworCQkJLyogcGFzcyBpdCBhbGwgaW4gT05FIGFyZ3VtZW50IChoaXN0b3JpYyByZWFzb25zKSAqLworCQkJaWYgKCpjcCkKKwkJCQkqdHAtPmFyZ3MtLSA9IChjaGFyICopY3A7CisJCX0KKyBub3NoZWJhbmc6CisJCWZkID0gYnVmWzBdIDw8IDggfCBidWZbMV07CisJCWlmICgoZmQgPT0gLyogT01BR0lDICovIDA0MDcpIHx8CisJCSAgICAoZmQgPT0gLyogTk1BR0lDICovIDA0MTApIHx8CisJCSAgICAoZmQgPT0gLyogWk1BR0lDICovIDA0MTMpIHx8CisJCSAgICAoZmQgPT0gLyogUU1BR0lDICovIDAzMTQpIHx8CisJCSAgICAoZmQgPT0gLyogRUNPRkZfSTM4NiAqLyAweDRDMDEpIHx8CisJCSAgICAoZmQgPT0gLyogRUNPRkZfTTY4SyAqLyAweDAxNTAgfHwgZmQgPT0gMHg1MDAxKSB8fAorCQkgICAgKGZkID09IC8qIEVDT0ZGX1NIICovICAgMHgwNTAwIHx8IGZkID09IDB4MDAwNSkgfHwKKwkJICAgIChmZCA9PSAweDdGNDUgJiYgYnVmWzJdID09ICdMJyAmJiBidWZbM10gPT0gJ0YnKSB8fAorCQkgICAgKGZkID09IC8qICJNWiIgKi8gMHg0RDVBKSB8fAorCQkgICAgKGZkID09IC8qIGd6aXAgKi8gMHgxRjhCKSkKKwkJCWVycm9yZigiJXM6IG5vdCBleGVjdXRhYmxlOiBtYWdpYyAlMDRYIiwgdHAtPnN0ciwgZmQpOworCX0KKyNlbmRpZgorCWFyZ3Mucm8gPSB0cC0+YXJnczsKKwkqYXJncy5ybyA9IHNoOworCisJY2FwLnJvID0gYXA7CisJZXhlY3ZlKGFyZ3MucndbMF0sIGFyZ3MucncsIGNhcC5ydyk7CisKKwkvKiByZXBvcnQgYm90aCB0aGUgcHJvZ3JhbW1lIHRoYXQgd2FzIHJ1biBhbmQgdGhlIGJvZ3VzIGludGVycHJldGVyICovCisJZXJyb3JmKCIlczogJXM6ICVzIiwgdHAtPnN0ciwgc2gsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK2ludAorc2hjb21leGVjKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3QgdGJsICp0cDsKKworCXRwID0ga3RzZWFyY2goJmJ1aWx0aW5zLCAqd3AsIGhhc2goKndwKSk7CisJaWYgKHRwID09IE5VTEwpCisJCWludGVybmFsX2Vycm9yZigic2hjb21leGVjOiAlcyIsICp3cCk7CisJcmV0dXJuIChjYWxsX2J1aWx0aW4odHAsIHdwKSk7Cit9CisKKy8qCisgKiBTZWFyY2ggZnVuY3Rpb24gdGFibGVzIGZvciBhIGZ1bmN0aW9uLiBJZiBjcmVhdGUgc2V0LCBhIHRhYmxlIGVudHJ5CisgKiBpcyBjcmVhdGVkIGlmIG5vbmUgaXMgZm91bmQuCisgKi8KK3N0cnVjdCB0YmwgKgorZmluZGZ1bmMoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgaCwgYm9vbCBjcmVhdGUpCit7CisJc3RydWN0IGJsb2NrICpsOworCXN0cnVjdCB0YmwgKnRwID0gTlVMTDsKKworCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpIHsKKwkJdHAgPSBrdHNlYXJjaCgmbC0+ZnVucywgbmFtZSwgaCk7CisJCWlmICh0cCkKKwkJCWJyZWFrOworCQlpZiAoIWwtPm5leHQgJiYgY3JlYXRlKSB7CisJCQl0cCA9IGt0ZW50ZXIoJmwtPmZ1bnMsIG5hbWUsIGgpOworCQkJdHAtPmZsYWcgPSBERUZJTkVEOworCQkJdHAtPnR5cGUgPSBDRlVOQzsKKwkJCXRwLT52YWwudCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKHRwKTsKK30KKworLyoKKyAqIGRlZmluZSBmdW5jdGlvbi4gUmV0dXJucyAxIGlmIGZ1bmN0aW9uIGlzIGJlaW5nIHVuZGVmaW5lZCAodCA9PSAwKSBhbmQKKyAqIGZ1bmN0aW9uIGRpZCBub3QgZXhpc3QsIHJldHVybnMgMCBvdGhlcndpc2UuCisgKi8KK2ludAorZGVmaW5lKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvcCAqdCkKK3sKKwlzdHJ1Y3QgdGJsICp0cDsKKwlib29sIHdhc19zZXQgPSBmYWxzZTsKKworCXdoaWxlICgxKSB7CisJCXRwID0gZmluZGZ1bmMobmFtZSwgaGFzaChuYW1lKSwgdHJ1ZSk7CisKKwkJaWYgKHRwLT5mbGFnICYgSVNTRVQpCisJCQl3YXNfc2V0ID0gdHJ1ZTsKKwkJLyogSWYgdGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQsIHdlIHphcCB0aGlzCisJCSAqIHRhYmxlIGVudHJ5IHNvIGZpbmRmdW5jKCkgd29uJ3Qgc2VlIGl0CisJCSAqLworCQlpZiAodHAtPmZsYWcgJiBGSU5VU0UpIHsKKwkJCXRwLT5uYW1lWzBdID0gJ1wwJzsKKwkJCXRwLT5mbGFnICY9IH5ERUZJTkVEOyAvKiBlbnN1cmUgaXQgd29uJ3QgYmUgZm91bmQgKi8KKwkJCXRwLT5mbGFnIHw9IEZERUxFVEU7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKHRwLT5mbGFnICYgQUxMT0MpIHsKKwkJdHAtPmZsYWcgJj0gfihJU1NFVHxBTExPQyk7CisJCXRmcmVlKHRwLT52YWwudCwgdHAtPmFyZWFwKTsKKwl9CisKKwlpZiAodCA9PSBOVUxMKSB7CQkvKiB1bmRlZmluZSAqLworCQlrdGRlbGV0ZSh0cCk7CisJCXJldHVybiAod2FzX3NldCA/IDAgOiAxKTsKKwl9CisKKwl0cC0+dmFsLnQgPSB0Y29weSh0LT5sZWZ0LCB0cC0+YXJlYXApOworCXRwLT5mbGFnIHw9IChJU1NFVHxBTExPQyk7CisJaWYgKHQtPnUua3NoX2Z1bmMpCisJCXRwLT5mbGFnIHw9IEZLU0g7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogYWRkIGJ1aWx0aW4KKyAqLwordm9pZAorYnVpbHRpbihjb25zdCBjaGFyICpuYW1lLCBpbnQgKCpmdW5jKSAoY29uc3QgY2hhciAqKikpCit7CisJc3RydWN0IHRibCAqdHA7CisJVGZsYWcgZmxhZzsKKworCS8qIHNlZSBpZiBhbnkgZmxhZ3Mgc2hvdWxkIGJlIHNldCBmb3IgdGhpcyBidWlsdGluICovCisJZm9yIChmbGFnID0gMDsgOyBuYW1lKyspIHsKKwkJaWYgKCpuYW1lID09ICc9JykJLyogY29tbWFuZCBkb2VzIHZhcmlhYmxlIGFzc2lnbm1lbnQgKi8KKwkJCWZsYWcgfD0gS0VFUEFTTjsKKwkJZWxzZSBpZiAoKm5hbWUgPT0gJyonKQkvKiBQT1NJWCBzcGVjaWFsIGJ1aWx0aW4gKi8KKwkJCWZsYWcgfD0gU1BFQ19CSTsKKwkJZWxzZSBpZiAoKm5hbWUgPT0gJysnKQkvKiBQT1NJWCByZWd1bGFyIGJ1aWx0aW4gKi8KKwkJCWZsYWcgfD0gUkVHX0JJOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwl0cCA9IGt0ZW50ZXIoJmJ1aWx0aW5zLCBuYW1lLCBoYXNoKG5hbWUpKTsKKwl0cC0+ZmxhZyA9IERFRklORUQgfCBmbGFnOworCXRwLT50eXBlID0gQ1NIRUxMOworCXRwLT52YWwuZiA9IGZ1bmM7Cit9CisKKy8qCisgKiBmaW5kIGNvbW1hbmQKKyAqIGVpdGhlciBmdW5jdGlvbiwgaGFzaGVkIGNvbW1hbmQsIG9yIGJ1aWx0LWluIChpbiB0aGF0IG9yZGVyKQorICovCitzdHJ1Y3QgdGJsICoKK2ZpbmRjb20oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQoreworCXN0YXRpYyBzdHJ1Y3QgdGJsIHRlbXA7CisJdWludDMyX3QgaCA9IGhhc2gobmFtZSk7CisJc3RydWN0IHRibCAqdHAgPSBOVUxMLCAqdGJpOworCXVuc2lnbmVkIGNoYXIgaW5zZXJ0ID0gRmxhZyhGVFJBQ0tBTEwpOwkvKiBpbnNlcnQgaWYgbm90IGZvdW5kICovCisJY2hhciAqZnBhdGg7CQkJLyogZm9yIGZ1bmN0aW9uIGF1dG9sb2FkaW5nICovCisJdW5pb24gbWtzaF9jY2hhY2sgbnBhdGg7CisKKwlpZiAodnN0cmNocihuYW1lLCAnLycpKSB7CisJCWluc2VydCA9IDA7CisJCS8qIHByZXZlbnQgRlBBVEggc2VhcmNoIGJlbG93ICovCisJCWZsYWdzICY9IH5GQ19GVU5DOworCQlnb3RvIFNlYXJjaDsKKwl9CisJdGJpID0gKGZsYWdzICYgRkNfQkkpID8ga3RzZWFyY2goJmJ1aWx0aW5zLCBuYW1lLCBoKSA6IE5VTEw7CisJLyogUE9TSVggc2F5cyBzcGVjaWFsIGJ1aWx0aW5zIGZpcnN0LCB0aGVuIGZ1bmN0aW9ucywgdGhlbgorCSAqIFBPU0lYIHJlZ3VsYXIgYnVpbHRpbnMsIHRoZW4gc2VhcmNoIHBhdGguLi4KKwkgKi8KKwlpZiAoKGZsYWdzICYgRkNfU1BFQ0JJKSAmJiB0YmkgJiYgKHRiaS0+ZmxhZyAmIFNQRUNfQkkpKQorCQl0cCA9IHRiaTsKKwlpZiAoIXRwICYmIChmbGFncyAmIEZDX0ZVTkMpKSB7CisJCXRwID0gZmluZGZ1bmMobmFtZSwgaCwgZmFsc2UpOworCQlpZiAodHAgJiYgISh0cC0+ZmxhZyAmIElTU0VUKSkgeworCQkJaWYgKChmcGF0aCA9IHN0cl92YWwoZ2xvYmFsKCJGUEFUSCIpKSkgPT0gbnVsbCkgeworCQkJCXRwLT51LmZwYXRoID0gTlVMTDsKKwkJCQl0cC0+dTIuZXJybm9fID0gMDsKKwkJCX0gZWxzZQorCQkJCXRwLT51LmZwYXRoID0gc2VhcmNoKG5hbWUsIGZwYXRoLCBSX09LLAorCQkJCSAgICAmdHAtPnUyLmVycm5vXyk7CisJCX0KKwl9CisJaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19SRUdCSSkgJiYgdGJpICYmICh0YmktPmZsYWcgJiBSRUdfQkkpKQorCQl0cCA9IHRiaTsKKwlpZiAoIXRwICYmIChmbGFncyAmIEZDX1VOUkVHQkkpICYmIHRiaSkKKwkJdHAgPSB0Ymk7CisJaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19QQVRIKSAmJiAhKGZsYWdzICYgRkNfREVGUEFUSCkpIHsKKwkJdHAgPSBrdHNlYXJjaCgmdGFsaWFzZXMsIG5hbWUsIGgpOworCQlpZiAodHAgJiYgKHRwLT5mbGFnICYgSVNTRVQpICYmIGFjY2Vzcyh0cC0+dmFsLnMsIFhfT0spICE9IDApIHsKKwkJCWlmICh0cC0+ZmxhZyAmIEFMTE9DKSB7CisJCQkJdHAtPmZsYWcgJj0gfkFMTE9DOworCQkJCWFmcmVlKHRwLT52YWwucywgQVBFUk0pOworCQkJfQorCQkJdHAtPmZsYWcgJj0gfklTU0VUOworCQl9CisJfQorCisgU2VhcmNoOgorCWlmICgoIXRwIHx8ICh0cC0+dHlwZSA9PSBDVEFMSUFTICYmICEodHAtPmZsYWcmSVNTRVQpKSkgJiYKKwkgICAgKGZsYWdzICYgRkNfUEFUSCkpIHsKKwkJaWYgKCF0cCkgeworCQkJaWYgKGluc2VydCAmJiAhKGZsYWdzICYgRkNfREVGUEFUSCkpIHsKKwkJCQl0cCA9IGt0ZW50ZXIoJnRhbGlhc2VzLCBuYW1lLCBoKTsKKwkJCQl0cC0+dHlwZSA9IENUQUxJQVM7CisJCQl9IGVsc2UgeworCQkJCXRwID0gJnRlbXA7CisJCQkJdHAtPnR5cGUgPSBDRVhFQzsKKwkJCX0KKwkJCXRwLT5mbGFnID0gREVGSU5FRDsJLyogbWFrZSB+SVNTRVQgKi8KKwkJfQorCQlucGF0aC5ybyA9IHNlYXJjaChuYW1lLCBmbGFncyAmIEZDX0RFRlBBVEggPyBkZWZfcGF0aCA6IHBhdGgsCisJCSAgICBYX09LLCAmdHAtPnUyLmVycm5vXyk7CisJCWlmIChucGF0aC5ybykgeworCQkJc3RyZHVweCh0cC0+dmFsLnMsIG5wYXRoLnJvLCBBUEVSTSk7CisJCQlpZiAobnBhdGgucm8gIT0gbmFtZSkKKwkJCQlhZnJlZShucGF0aC5ydywgQVRFTVApOworCQkJdHAtPmZsYWcgfD0gSVNTRVR8QUxMT0M7CisJCX0gZWxzZSBpZiAoKGZsYWdzICYgRkNfRlVOQykgJiYKKwkJICAgIChmcGF0aCA9IHN0cl92YWwoZ2xvYmFsKCJGUEFUSCIpKSkgIT0gbnVsbCAmJgorCQkgICAgKG5wYXRoLnJvID0gc2VhcmNoKG5hbWUsIGZwYXRoLCBSX09LLAorCQkgICAgJnRwLT51Mi5lcnJub18pKSAhPSBOVUxMKSB7CisJCQkvKiBBbiB1bmRvY3VtZW50ZWQgZmVhdHVyZSBvZiBBVCZUIGtzaCBpcyB0aGF0IGl0CisJCQkgKiBzZWFyY2hlcyBGUEFUSCBpZiBhIGNvbW1hbmQgaXMgbm90IGZvdW5kLCBldmVuCisJCQkgKiBpZiB0aGUgY29tbWFuZCBoYXNuJ3QgYmVlbiBzZXQgdXAgYXMgYW4gYXV0b2xvYWRlZAorCQkJICogZnVuY3Rpb24gKGllLCBubyB0eXBlc2V0IC11ZikuCisJCQkgKi8KKwkJCXRwID0gJnRlbXA7CisJCQl0cC0+dHlwZSA9IENGVU5DOworCQkJdHAtPmZsYWcgPSBERUZJTkVEOyAvKiBtYWtlIH5JU1NFVCAqLworCQkJdHAtPnUuZnBhdGggPSBucGF0aC5ybzsKKwkJfQorCX0KKwlyZXR1cm4gKHRwKTsKK30KKworLyoKKyAqIGZsdXNoIGV4ZWN1dGFibGUgY29tbWFuZHMgd2l0aCByZWxhdGl2ZSBwYXRocworICovCit2b2lkCitmbHVzaGNvbShpbnQgYWxsKQkvKiBqdXN0IHJlbGF0aXZlIG9yIGFsbCAqLworeworCXN0cnVjdCB0YmwgKnRwOworCXN0cnVjdCB0c3RhdGUgdHM7CisKKwlmb3IgKGt0d2FsaygmdHMsICZ0YWxpYXNlcyk7ICh0cCA9IGt0bmV4dCgmdHMpKSAhPSBOVUxMOyApCisJCWlmICgodHAtPmZsYWcmSVNTRVQpICYmIChhbGwgfHwgdHAtPnZhbC5zWzBdICE9ICcvJykpIHsKKwkJCWlmICh0cC0+ZmxhZyZBTExPQykgeworCQkJCXRwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOworCQkJCWFmcmVlKHRwLT52YWwucywgQVBFUk0pOworCQkJfQorCQkJdHAtPmZsYWcgJj0gfklTU0VUOworCQl9Cit9CisKKy8qIENoZWNrIGlmIHBhdGggaXMgc29tZXRoaW5nIHdlIHdhbnQgdG8gZmluZC4gUmV0dXJucyAtMSBmb3IgZmFpbHVyZS4gKi8KK2ludAorc2VhcmNoX2FjY2Vzcyhjb25zdCBjaGFyICpscGF0aCwgaW50IG1vZGUsCisgICAgaW50ICplcnJub3ApCS8qIHNldCBpZiBjYW5kaWRhdGUgZm91bmQsIGJ1dCBub3Qgc3VpdGFibGUgKi8KK3sKKwlpbnQgcmV0LCBlcnIgPSAwOworCXN0cnVjdCBzdGF0IHN0YXRiOworCisJaWYgKHN0YXQobHBhdGgsICZzdGF0YikgPCAwKQorCQlyZXR1cm4gKC0xKTsKKwlyZXQgPSBhY2Nlc3MobHBhdGgsIG1vZGUpOworCWlmIChyZXQgPCAwKQorCQllcnIgPSBlcnJubzsgLyogRmlsZSBleGlzdHMsIGJ1dCB3ZSBjYW4ndCBhY2Nlc3MgaXQgKi8KKwllbHNlIGlmIChtb2RlID09IFhfT0sgJiYgKCFTX0lTUkVHKHN0YXRiLnN0X21vZGUpIHx8CisJICAgICEoc3RhdGIuc3RfbW9kZSAmIChTX0lYVVNSfFNfSVhHUlB8U19JWE9USCkpKSkgeworCQkvKiBUaGlzICdjYXVzZSBhY2Nlc3MoKSBzYXlzIHJvb3QgY2FuIGV4ZWN1dGUgZXZlcnl0aGluZyAqLworCQlyZXQgPSAtMTsKKwkJZXJyID0gU19JU0RJUihzdGF0Yi5zdF9tb2RlKSA/IEVJU0RJUiA6IEVBQ0NFUzsKKwl9CisJaWYgKGVyciAmJiBlcnJub3AgJiYgISplcnJub3ApCisJCSplcnJub3AgPSBlcnI7CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICogc2VhcmNoIGZvciBjb21tYW5kIHdpdGggUEFUSAorICovCitjb25zdCBjaGFyICoKK3NlYXJjaChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpscGF0aCwKKyAgICBpbnQgbW9kZSwJCS8qIFJfT0sgb3IgWF9PSyAqLworICAgIGludCAqZXJybm9wKQkvKiBzZXQgaWYgY2FuZGlkYXRlIGZvdW5kLCBidXQgbm90IHN1aXRhYmxlICovCit7CisJY29uc3QgY2hhciAqc3AsICpwOworCWNoYXIgKnhwOworCVhTdHJpbmcgeHM7CisJaW50IG5hbWVsZW47CisKKwlpZiAoZXJybm9wKQorCQkqZXJybm9wID0gMDsKKwlpZiAodnN0cmNocihuYW1lLCAnLycpKSB7CisJCWlmIChzZWFyY2hfYWNjZXNzKG5hbWUsIG1vZGUsIGVycm5vcCkgPT0gMCkKKwkJCXJldHVybiAobmFtZSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKSArIDE7CisJWGluaXQoeHMsIHhwLCAxMjgsIEFURU1QKTsKKworCXNwID0gbHBhdGg7CisJd2hpbGUgKHNwICE9IE5VTEwpIHsKKwkJeHAgPSBYc3RyaW5nKHhzLCB4cCk7CisJCWlmICghKHAgPSBjc3RyY2hyKHNwLCAnOicpKSkKKwkJCXAgPSBzcCArIHN0cmxlbihzcCk7CisJCWlmIChwICE9IHNwKSB7CisJCQlYY2hlY2tOKHhzLCB4cCwgcCAtIHNwKTsKKwkJCW1lbWNweSh4cCwgc3AsIHAgLSBzcCk7CisJCQl4cCArPSBwIC0gc3A7CisJCQkqeHArKyA9ICcvJzsKKwkJfQorCQlzcCA9IHA7CisJCVhjaGVja04oeHMsIHhwLCBuYW1lbGVuKTsKKwkJbWVtY3B5KHhwLCBuYW1lLCBuYW1lbGVuKTsKKwkJaWYgKHNlYXJjaF9hY2Nlc3MoWHN0cmluZyh4cywgeHApLCBtb2RlLCBlcnJub3ApID09IDApCisJCQlyZXR1cm4gKFhjbG9zZSh4cywgeHAgKyBuYW1lbGVuKSk7CisJCWlmICgqc3ArKyA9PSAnXDAnKQorCQkJc3AgPSBOVUxMOworCX0KKwlYZnJlZSh4cywgeHApOworCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK2NhbGxfYnVpbHRpbihzdHJ1Y3QgdGJsICp0cCwgY29uc3QgY2hhciAqKndwKQoreworCWludCBydjsKKworCWJ1aWx0aW5fYXJndjAgPSB3cFswXTsKKwlidWlsdGluX2ZsYWcgPSB0cC0+ZmxhZzsKKwlzaGZfcmVvcGVuKDEsIFNIRl9XUiwgc2hsX3N0ZG91dCk7CisJc2hsX3N0ZG91dF9vayA9IDE7CisJa3NoX2dldG9wdF9yZXNldCgmYnVpbHRpbl9vcHQsIEdGX0VSUk9SKTsKKwlydiA9ICgqdHAtPnZhbC5mKSh3cCk7CisJc2hmX2ZsdXNoKHNobF9zdGRvdXQpOworCXNobF9zdGRvdXRfb2sgPSAwOworCWJ1aWx0aW5fZmxhZyA9IDA7CisJYnVpbHRpbl9hcmd2MCA9IE5VTEw7CisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBzZXQgdXAgcmVkaXJlY3Rpb24sIHNhdmluZyBvbGQgZmRzIGluIGUtPnNhdmVmZAorICovCitzdGF0aWMgaW50Citpb3NldHVwKHN0cnVjdCBpb3dvcmQgKmlvcCwgc3RydWN0IHRibCAqdHApCit7CisJaW50IHUgPSAtMTsKKwljaGFyICpjcCA9IGlvcC0+bmFtZTsKKwlpbnQgaW90eXBlID0gaW9wLT5mbGFnICYgSU9UWVBFOworCWludCBkb19vcGVuID0gMSwgZG9fY2xvc2UgPSAwLCBmbGFncyA9IDA7CisJc3RydWN0IGlvd29yZCBpb3RtcDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCWlmIChpb3R5cGUgIT0gSU9IRVJFKQorCQljcCA9IGV2YWxvbmVzdHIoY3AsIERPVElMREV8KEZsYWcoRlRBTEtJTkdfSSkgPyBET0dMT0IgOiAwKSk7CisKKwkvKiBVc2VkIGZvciB0cmFjaW5nIGFuZCBlcnJvciBtZXNzYWdlcyB0byBwcmludCBleHBhbmRlZCBjcCAqLworCWlvdG1wID0gKmlvcDsKKwlpb3RtcC5uYW1lID0gKGlvdHlwZSA9PSBJT0hFUkUpID8gTlVMTCA6IGNwOworCWlvdG1wLmZsYWcgfD0gSU9OQU1FWFA7CisKKwlpZiAoRmxhZyhGWFRSQUNFKSkKKwkJc2hlbGxmKCIlcyVzXG4iLAorCQkgICAgc3Vic3RpdHV0ZShzdHJfdmFsKGdsb2JhbCgiUFM0IikpLCAwKSwKKwkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCAmaW90bXApKTsKKworCXN3aXRjaCAoaW90eXBlKSB7CisJY2FzZSBJT1JFQUQ6CisJCWZsYWdzID0gT19SRE9OTFk7CisJCWJyZWFrOworCisJY2FzZSBJT0NBVDoKKwkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQVBQRU5EIHwgT19DUkVBVDsKKwkJYnJlYWs7CisKKwljYXNlIElPV1JJVEU6CisJCWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKwkJLyogVGhlIHN0YXQoKSBpcyBoZXJlIHRvIGFsbG93IHJlZGlyZWN0aW9ucyB0bworCQkgKiB0aGluZ3MgbGlrZSAvZGV2L251bGwgd2l0aG91dCBlcnJvci4KKwkJICovCisJCWlmIChGbGFnKEZOT0NMT0JCRVIpICYmICEoaW9wLT5mbGFnICYgSU9DTE9CKSAmJgorCQkgICAgKHN0YXQoY3AsICZzdGF0YikgPCAwIHx8IFNfSVNSRUcoc3RhdGIuc3RfbW9kZSkpKQorCQkJZmxhZ3MgfD0gT19FWENMOworCQlicmVhazsKKworCWNhc2UgSU9SRFdSOgorCQlmbGFncyA9IE9fUkRXUiB8IE9fQ1JFQVQ7CisJCWJyZWFrOworCisJY2FzZSBJT0hFUkU6CisJCWRvX29wZW4gPSAwOworCQkvKiBoZXJlaW4oKSByZXR1cm5zIC0yIGlmIGVycm9yIGhhcyBiZWVuIHByaW50ZWQgKi8KKwkJdSA9IGhlcmVpbihpb3AtPmhlcmVkb2MsIGlvcC0+ZmxhZyAmIElPRVZBTCk7CisJCS8qIGNwIG1heSBoYXZlIHdyb25nIG5hbWUgKi8KKwkJYnJlYWs7CisKKwljYXNlIElPRFVQOiB7CisJCWNvbnN0IGNoYXIgKmVtc2c7CisKKwkJZG9fb3BlbiA9IDA7CisJCWlmICgqY3AgPT0gJy0nICYmICFjcFsxXSkgeworCQkJdSA9IDEwMDk7CSAvKiBwcmV2ZW50IGVycm9yIHJldHVybiBiZWxvdyAqLworCQkJZG9fY2xvc2UgPSAxOworCQl9IGVsc2UgaWYgKCh1ID0gY2hlY2tfZmQoY3AsCisJCSAgICBYX09LIHwgKChpb3AtPmZsYWcgJiBJT1JEVVApID8gUl9PSyA6IFdfT0spLAorCQkgICAgJmVtc2cpKSA8IDApIHsKKwkJCXdhcm5pbmdmKHRydWUsICIlczogJXMiLAorCQkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCAmaW90bXApLCBlbXNnKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmICh1ID09IGlvcC0+dW5pdCkKKwkJCXJldHVybiAoMCk7CQkvKiAiZHVwIGZyb20iID09ICJkdXAgdG8iICovCisJCWJyZWFrOworCX0KKwl9CisKKwlpZiAoZG9fb3BlbikgeworCQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkgJiYgKGZsYWdzICYgT19DUkVBVCkpIHsKKwkJCXdhcm5pbmdmKHRydWUsICIlczogcmVzdHJpY3RlZCIsIGNwKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCXUgPSBvcGVuKGNwLCBmbGFncywgMDY2Nik7CisJfQorCWlmICh1IDwgMCkgeworCQkvKiBoZXJlaW4oKSBtYXkgYWxyZWFkeSBoYXZlIHByaW50ZWQgbWVzc2FnZSAqLworCQlpZiAodSA9PSAtMSkgeworCQkJdSA9IGVycm5vOworCQkJd2FybmluZ2YodHJ1ZSwgImNhbm5vdCAlcyAlczogJXMiLAorCQkJICAgIGlvdHlwZSA9PSBJT0RVUCA/ICJkdXAiIDoKKwkJCSAgICAoaW90eXBlID09IElPUkVBRCB8fCBpb3R5cGUgPT0gSU9IRVJFKSA/CisJCQkgICAgIm9wZW4iIDogImNyZWF0ZSIsIGNwLCBzdHJlcnJvcih1KSk7CisJCX0KKwkJcmV0dXJuICgtMSk7CisJfQorCS8qIERvIG5vdCBzYXZlIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVkaXJlY3RlZCAoaS5lLiAiY2F0ID54ID55IikuICovCisJaWYgKGUtPnNhdmVmZFtpb3AtPnVuaXRdID09IDApIHsKKwkJLyogSWYgdGhlc2UgYXJlIHRoZSBzYW1lLCBpdCBtZWFucyB1bml0IHdhcyBwcmV2aW91c2x5IGNsb3NlZCAqLworCQlpZiAodSA9PSBpb3AtPnVuaXQpCisJCQllLT5zYXZlZmRbaW9wLT51bml0XSA9IC0xOworCQllbHNlCisJCQkvKiBjX2V4ZWMoKSBhc3N1bWVzIGUtPnNhdmVmZFtmZF0gc2V0IGZvciBhbnkKKwkJCSAqIHJlZGlyZWN0aW9ucy4gQXNrIHNhdmVmZCgpIG5vdCB0byBjbG9zZSBpb3AtPnVuaXQ7CisJCQkgKiB0aGlzIGFsbG93cyBlcnJvciBtZXNzYWdlcyB0byBiZSBzZWVuIGlmIGlvcC0+dW5pdAorCQkJICogaXMgMjsgYWxzbyBtZWFucyB3ZSBjYW4ndCBsb3NlIHRoZSBmZCAoZWcsIGJvdGgKKwkJCSAqIGR1cDIgYmVsb3cgYW5kIGR1cDIgaW4gcmVzdGZkKCkgZmFpbGluZykuCisJCQkgKi8KKwkJCWUtPnNhdmVmZFtpb3AtPnVuaXRdID0gc2F2ZWZkKGlvcC0+dW5pdCk7CisJfQorCisJaWYgKGRvX2Nsb3NlKQorCQljbG9zZShpb3AtPnVuaXQpOworCWVsc2UgaWYgKHUgIT0gaW9wLT51bml0KSB7CisJCWlmIChrc2hfZHVwMih1LCBpb3AtPnVuaXQsIHRydWUpIDwgMCkgeworCQkJaW50IGV2OworCisJCQlldiA9IGVycm5vOworCQkJd2FybmluZ2YodHJ1ZSwKKwkJCSAgICAiY291bGQgbm90IGZpbmlzaCAoZHVwKSByZWRpcmVjdGlvbiAlczogJXMiLAorCQkJICAgIHNucHRyZWVmKE5VTEwsIDMyLCAiJVIiLCAmaW90bXApLAorCQkJICAgIHN0cmVycm9yKGV2KSk7CisJCQlpZiAoaW90eXBlICE9IElPRFVQKQorCQkJCWNsb3NlKHUpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJaWYgKGlvdHlwZSAhPSBJT0RVUCkKKwkJCWNsb3NlKHUpOworCQkvKiBUb3VjaGluZyBhbnkgY28tcHJvY2VzcyBmZCBpbiBhbiBlbXB0eSBleGVjCisJCSAqIGNhdXNlcyB0aGUgc2hlbGwgdG8gY2xvc2UgaXRzIGNvcGllcworCQkgKi8KKwkJZWxzZSBpZiAodHAgJiYgdHAtPnR5cGUgPT0gQ1NIRUxMICYmIHRwLT52YWwuZiA9PSBjX2V4ZWMpIHsKKwkJCWlmIChpb3AtPmZsYWcgJiBJT1JEVVApCS8qIHBvc3NpYmxlIGV4ZWMgPCZwICovCisJCQkJY29wcm9jX3JlYWRfY2xvc2UodSk7CisJCQllbHNlCQkJLyogcG9zc2libGUgZXhlYyA+JnAgKi8KKwkJCQljb3Byb2Nfd3JpdGVfY2xvc2UodSk7CisJCX0KKwl9CisJaWYgKHUgPT0gMikgLyogQ2xlYXIgYW55IHdyaXRlIGVycm9ycyAqLworCQlzaGZfcmVvcGVuKDIsIFNIRl9XUiwgc2hsX291dCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIG9wZW4gaGVyZSBkb2N1bWVudCB0ZW1wIGZpbGUuCisgKiBpZiB1bnF1b3RlZCBoZXJlLCBleHBhbmQgaGVyZSB0ZW1wIGZpbGUgaW50byBzZWNvbmQgdGVtcCBmaWxlLgorICovCitzdGF0aWMgaW50CitoZXJlaW4oY29uc3QgY2hhciAqY29udGVudCwgaW50IHN1YikKK3sKKwl2b2xhdGlsZSBpbnQgZmQgPSAtMTsKKwlzdHJ1Y3Qgc291cmNlICpzLCAqdm9sYXRpbGUgb3NvdXJjZTsKKwlzdHJ1Y3Qgc2hmICp2b2xhdGlsZSBzaGY7CisJc3RydWN0IHRlbXAgKmg7CisJaW50IGk7CisKKwkvKiBrc2ggLWMgJ2NhdCA8PCBFT0YnIGNhbiBjYXVzZSB0aGlzLi4uICovCisJaWYgKGNvbnRlbnQgPT0gTlVMTCkgeworCQl3YXJuaW5nZih0cnVlLCAiaGVyZSBkb2N1bWVudCBtaXNzaW5nIik7CisJCXJldHVybiAoLTIpOyAvKiBzcGVjaWFsIHRvIGlvc2V0dXAoKTogZG9uJ3QgcHJpbnQgZXJyb3IgKi8KKwl9CisKKwkvKiBDcmVhdGUgdGVtcCBmaWxlIHRvIGhvbGQgY29udGVudCAoZG9uZSBiZWZvcmUgbmV3ZW52IHNvIHRlbXAKKwkgKiBkb2Vzbid0IGdldCByZW1vdmVkIHRvbyBzb29uKS4KKwkgKi8KKwloID0gbWFrZXRlbXAoQVRFTVAsIFRUX0hFUkVET0NfRVhQLCAmZS0+dGVtcHMpOworCWlmICghKHNoZiA9IGgtPnNoZikgfHwgKGZkID0gb3BlbihoLT5uYW1lLCBPX1JET05MWSwgMCkpIDwgMCkgeworCQlmZCA9IGVycm5vOworCQl3YXJuaW5nZih0cnVlLCAiY2FuJ3QgJXMgdGVtcG9yYXJ5IGZpbGUgJXM6ICVzIiwKKwkJICAgICFzaGYgPyAiY3JlYXRlIiA6ICJvcGVuIiwKKwkJICAgIGgtPm5hbWUsIHN0cmVycm9yKGZkKSk7CisJCWlmIChzaGYpCisJCQlzaGZfY2xvc2Uoc2hmKTsKKwkJcmV0dXJuICgtMiAvKiBzcGVjaWFsIHRvIGlvc2V0dXAoKTogZG9uJ3QgcHJpbnQgZXJyb3IgKi8pOworCX0KKworCW9zb3VyY2UgPSBzb3VyY2U7CisJbmV3ZW52KEVfRVJSSCk7CisJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwlpZiAoaSkgeworCQlzb3VyY2UgPSBvc291cmNlOworCQlxdWl0ZW52KHNoZik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuICgtMik7IC8qIHNwZWNpYWwgdG8gaW9zZXR1cCgpOiBkb24ndCBwcmludCBlcnJvciAqLworCX0KKwlpZiAoc3ViKSB7CisJCS8qIERvIHN1YnN0aXR1dGlvbnMgb24gdGhlIGNvbnRlbnQgb2YgaGVyZWRvYyAqLworCQlzID0gcHVzaHMoU1NUUklORywgQVRFTVApOworCQlzLT5zdGFydCA9IHMtPnN0ciA9IGNvbnRlbnQ7CisJCXNvdXJjZSA9IHM7CisJCWlmICh5eWxleChPTkVXT1JEfEhFUkVET0MpICE9IExXT1JEKQorCQkJaW50ZXJuYWxfZXJyb3JmKCJoZXJlaW46IHl5bGV4Iik7CisJCXNvdXJjZSA9IG9zb3VyY2U7CisJCXNoZl9wdXRzKGV2YWxzdHIoeXlsdmFsLmNwLCAwKSwgc2hmKTsKKwl9IGVsc2UKKwkJc2hmX3B1dHMoY29udGVudCwgc2hmKTsKKworCXF1aXRlbnYoTlVMTCk7CisKKwlpZiAoc2hmX2Nsb3NlKHNoZikgPT0gRU9GKSB7CisJCWkgPSBlcnJubzsKKwkJY2xvc2UoZmQpOworCQlmZCA9IGVycm5vOworCQl3YXJuaW5nZih0cnVlLCAiZXJyb3Igd3JpdGluZyAlczogJXMsICVzIiwgaC0+bmFtZSwKKwkJICAgIHN0cmVycm9yKGkpLCBzdHJlcnJvcihmZCkpOworCQlyZXR1cm4gKC0yKTsJLyogc3BlY2lhbCB0byBpb3NldHVwKCk6IGRvbid0IHByaW50IGVycm9yICovCisJfQorCisJcmV0dXJuIChmZCk7Cit9CisKKy8qCisgKglrc2ggc3BlY2lhbCAtIHRoZSBzZWxlY3QgY29tbWFuZCBwcm9jZXNzaW5nIHNlY3Rpb24KKyAqCXByaW50IHRoZSBhcmdzIGluIGNvbHVtbiBmb3JtIC0gYXNzdW1pbmcgdGhhdCB3ZSBjYW4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorZG9fc2VsZWN0YXJncyhjb25zdCBjaGFyICoqYXAsIGJvb2wgcHJpbnRfbWVudSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcmVhZF9hcmdzW10gPSB7CisJCSJyZWFkIiwgIi1yIiwgIlJFUExZIiwgTlVMTAorCX07CisJY2hhciAqczsKKwlpbnQgaSwgYXJnY3Q7CisKKwlmb3IgKGFyZ2N0ID0gMDsgYXBbYXJnY3RdOyBhcmdjdCsrKQorCQk7CisJd2hpbGUgKDEpIHsKKwkJLyogTWVudSBpcyBwcmludGVkIGlmCisJCSAqCS0gdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBhcm91bmQgdGhlIHNlbGVjdCBsb29wCisJCSAqCS0gdGhlIHVzZXIgZW50ZXJzIGEgYmxhbmsgbGluZQorCQkgKgktIHRoZSBSRVBMWSBwYXJhbWV0ZXIgaXMgZW1wdHkKKwkJICovCisJCWlmIChwcmludF9tZW51IHx8ICEqc3RyX3ZhbChnbG9iYWwoIlJFUExZIikpKQorCQkJcHJfbWVudShhcCk7CisJCXNoZWxsZigiJXMiLCBzdHJfdmFsKGdsb2JhbCgiUFMzIikpKTsKKwkJaWYgKGNhbGxfYnVpbHRpbihmaW5kY29tKCJyZWFkIiwgRkNfQkkpLCByZWFkX2FyZ3MpKQorCQkJcmV0dXJuIChOVUxMKTsKKwkJcyA9IHN0cl92YWwoZ2xvYmFsKCJSRVBMWSIpKTsKKwkJaWYgKCpzKSB7CisJCQlnZXRuKHMsICZpKTsKKwkJCXJldHVybiAoKGkgPj0gMSAmJiBpIDw9IGFyZ2N0KSA/IGFwW2kgLSAxXSA6IG51bGwpOworCQl9CisJCXByaW50X21lbnUgPSAxOworCX0KK30KKworc3RydWN0IHNlbGVjdF9tZW51X2luZm8geworCWNvbnN0IGNoYXIgKiBjb25zdCAqYXJnczsKKwlpbnQgbnVtX3dpZHRoOworfTsKKworc3RhdGljIGNoYXIgKnNlbGVjdF9mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKKworLyogZm9ybWF0IGEgc2luZ2xlIHNlbGVjdCBtZW51IGl0ZW0gKi8KK3N0YXRpYyBjaGFyICoKK3NlbGVjdF9mbXRfZW50cnkoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgaSwgY29uc3Qgdm9pZCAqYXJnKQoreworCWNvbnN0IHN0cnVjdCBzZWxlY3RfbWVudV9pbmZvICpzbWkgPQorCSAgICAoY29uc3Qgc3RydWN0IHNlbGVjdF9tZW51X2luZm8gKilhcmc7CisKKwlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlKmQpICVzIiwKKwkgICAgc21pLT5udW1fd2lkdGgsIGkgKyAxLCBzbWktPmFyZ3NbaV0pOworCXJldHVybiAoYnVmKTsKK30KKworLyoKKyAqCXByaW50IGEgc2VsZWN0IHN0eWxlIG1lbnUKKyAqLworaW50Citwcl9tZW51KGNvbnN0IGNoYXIgKiBjb25zdCAqYXApCit7CisJc3RydWN0IHNlbGVjdF9tZW51X2luZm8gc21pOworCWNvbnN0IGNoYXIgKiBjb25zdCAqcHA7CisJaW50IGFjb2xzID0gMCwgYW9jdHMgPSAwLCBpLCBuOworCisJLyoKKwkgKiB3aWR0aC9jb2x1bW4gY2FsY3VsYXRpb25zIHdlcmUgZG9uZSBvbmNlIGFuZCBzYXZlZCwgYnV0IHRoaXMKKwkgKiBtZWFucyBzZWxlY3QgY2FuJ3QgYmUgdXNlZCByZWN1cnNpdmVseSBzbyB3ZSByZS1jYWxjdWxhdGUKKwkgKiBlYWNoIHRpbWUgKGNvdWxkIHNhdmUgaW4gYSBzdHJ1Y3R1cmUgdGhhdCBpcyByZXR1cm5lZCwgYnV0CisJICogaXQncyBwcm9iYWJseSBub3Qgd29ydGggdGhlIGJvdGhlcikKKwkgKi8KKworCS8qCisJICogZ2V0IGRpbWVuc2lvbnMgb2YgdGhlIGxpc3QKKwkgKi8KKwlmb3IgKG4gPSAwLCBwcCA9IGFwOyAqcHA7IG4rKywgcHArKykgeworCQlpID0gc3RybGVuKCpwcCk7CisJCWlmIChpID4gYW9jdHMpCisJCQlhb2N0cyA9IGk7CisJCWkgPSB1dGZfbWJzd2lkdGgoKnBwKTsKKwkJaWYgKGkgPiBhY29scykKKwkJCWFjb2xzID0gaTsKKwl9CisKKwkvKgorCSAqIHdlIHdpbGwgcHJpbnQgYW4gaW5kZXggb2YgdGhlIGZvcm0gIiVkKSAiIGluIGZyb250IG9mCisJICogZWFjaCBlbnRyeSwgc28gZ2V0IHRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoaXMKKwkgKi8KKwlmb3IgKGkgPSBuLCBzbWkubnVtX3dpZHRoID0gMTsgaSA+PSAxMDsgaSAvPSAxMCkKKwkJc21pLm51bV93aWR0aCsrOworCisJc21pLmFyZ3MgPSBhcDsKKwlwcmludF9jb2x1bW5zKHNobF9vdXQsIG4sIHNlbGVjdF9mbXRfZW50cnksICh2b2lkICopJnNtaSwKKwkgICAgc21pLm51bV93aWR0aCArIDIgKyBhb2N0cywgc21pLm51bV93aWR0aCArIDIgKyBhY29scywKKwkgICAgdHJ1ZSk7CisKKwlyZXR1cm4gKG4pOworfQorCisvKiBYWFg6IGhvcnJpYmxlIGtsdWRnZSB0byBmaXQgd2l0aGluIHRoZSBmcmFtZXdvcmsgKi8KK3N0YXRpYyBjaGFyICpwbGFpbl9mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKKworc3RhdGljIGNoYXIgKgorcGxhaW5fZm10X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGksIGNvbnN0IHZvaWQgKmFyZykKK3sKKwlzaGZfc25wcmludGYoYnVmLCBidWZsZW4sICIlcyIsICgoY29uc3QgY2hhciAqIGNvbnN0ICopYXJnKVtpXSk7CisJcmV0dXJuIChidWYpOworfQorCitpbnQKK3ByX2xpc3QoY2hhciAqIGNvbnN0ICphcCkKK3sKKwlpbnQgYWNvbHMgPSAwLCBhb2N0cyA9IDAsIGksIG47CisJY2hhciAqIGNvbnN0ICpwcDsKKworCWZvciAobiA9IDAsIHBwID0gYXA7ICpwcDsgbisrLCBwcCsrKSB7CisJCWkgPSBzdHJsZW4oKnBwKTsKKwkJaWYgKGkgPiBhb2N0cykKKwkJCWFvY3RzID0gaTsKKwkJaSA9IHV0Zl9tYnN3aWR0aCgqcHApOworCQlpZiAoaSA+IGFjb2xzKQorCQkJYWNvbHMgPSBpOworCX0KKworCXByaW50X2NvbHVtbnMoc2hsX291dCwgbiwgcGxhaW5fZm10X2VudHJ5LCAoY29uc3Qgdm9pZCAqKWFwLAorCSAgICBhb2N0cywgYWNvbHMsIGZhbHNlKTsKKworCXJldHVybiAobik7Cit9CisKKy8qCisgKglbWyAuLi4gXV0gZXZhbHVhdGlvbiByb3V0aW5lcworICovCisKKy8qCisgKiBUZXN0IGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgd2hhdGV2ZXIuIEFjY2VwdHMgdGhlIGN1cnJlbnQgdG9rZW4gaWYKKyAqIGl0IGlzLiBSZXR1cm5zIDAgaWYgaXQgaXMgbm90LCBub24temVybyBpZiBpdCBpcyAoaW4gdGhlIGNhc2Ugb2YKKyAqIFRNX1VOT1AgYW5kIFRNX0JJTk9QLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBUZXN0X29wKS4KKyAqLworc3RhdGljIFRlc3Rfb3AKK2RidGVzdGVfaXNhKFRlc3RfZW52ICp0ZSwgVGVzdF9tZXRhIG1ldGEpCit7CisJVGVzdF9vcCByZXQgPSBUT19OT05PUDsKKwlpbnQgdXF3b3JkOworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoISp0ZS0+cG9zLndwKQorCQlyZXR1cm4gKG1ldGEgPT0gVE1fRU5EID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QKTsKKworCS8qIHVucXVvdGVkIHdvcmQ/ICovCisJZm9yIChwID0gKnRlLT5wb3Mud3A7ICpwID09IENIQVI7IHAgKz0gMikKKwkJOworCXVxd29yZCA9ICpwID09IEVPUzsKKworCWlmIChtZXRhID09IFRNX1VOT1AgfHwgbWV0YSA9PSBUTV9CSU5PUCkgeworCQlpZiAodXF3b3JkKSB7CisJCQljaGFyIGJ1Zls4XTsJLyogbG9uZ2VyIHRoYW4gdGhlIGxvbmdlc3Qgb3BlcmF0b3IgKi8KKwkJCWNoYXIgKnEgPSBidWY7CisJCQlmb3IgKHAgPSAqdGUtPnBvcy53cDsKKwkJCSAgICAqcCA9PSBDSEFSICYmIHEgPCAmYnVmW3NpemVvZihidWYpIC0gMV07IHAgKz0gMikKKwkJCQkqcSsrID0gcFsxXTsKKwkJCSpxID0gJ1wwJzsKKwkJCXJldCA9IHRlc3RfaXNvcChtZXRhLCBidWYpOworCQl9CisJfSBlbHNlIGlmIChtZXRhID09IFRNX0VORCkKKwkJcmV0ID0gVE9fTk9OT1A7CisJZWxzZQorCQlyZXQgPSAodXF3b3JkICYmICFzdHJjbXAoKnRlLT5wb3Mud3AsCisJCSAgICBkYnRlc3RfdG9rZW5zWyhpbnQpbWV0YV0pKSA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKKworCS8qIEFjY2VwdCB0aGUgdG9rZW4/ICovCisJaWYgKHJldCAhPSBUT19OT05PUCkKKwkJdGUtPnBvcy53cCsrOworCisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitkYnRlc3RlX2dldG9wbmQoVGVzdF9lbnYgKnRlLCBUZXN0X29wIG9wLCBib29sIGRvX2V2YWwpCit7CisJY29uc3QgY2hhciAqcyA9ICp0ZS0+cG9zLndwOworCisJaWYgKCFzKQorCQlyZXR1cm4gKE5VTEwpOworCisJdGUtPnBvcy53cCsrOworCisJaWYgKCFkb19ldmFsKQorCQlyZXR1cm4gKG51bGwpOworCisJaWYgKG9wID09IFRPX1NURVFMIHx8IG9wID09IFRPX1NUTkVRKQorCQlzID0gZXZhbHN0cihzLCBET1RJTERFIHwgRE9QQVQpOworCWVsc2UKKwkJcyA9IGV2YWxzdHIocywgRE9USUxERSk7CisKKwlyZXR1cm4gKHMpOworfQorCitzdGF0aWMgdm9pZAorZGJ0ZXN0ZV9lcnJvcihUZXN0X2VudiAqdGUsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOworCWludGVybmFsX3dhcm5pbmdmKCJkYnRlc3RlX2Vycm9yOiAlcyAob2Zmc2V0ICVkKSIsIG1zZywgb2Zmc2V0KTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2V4cHIuYyBiL21rc2gvc3JjL2V4cHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU3MTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvZXhwci5jCkBAIC0wLDAgKzEsODk1IEBACisvKgkkT3BlbkJTRDogZXhwci5jLHYgMS4yMSAyMDA5LzA2LzAxIDE5OjAwOjU3IGRlcmFhZHQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9leHByLmMsdiAxLjQ0IDIwMTAvMDgvMTQgMjE6MzU6MTMgdGcgRXhwICQiKTsKKworLyogVGhlIG9yZGVyIG9mIHRoZXNlIGVudW1zIGlzIGNvbnN0cmFpbmVkIGJ5IHRoZSBvcmRlciBvZiBvcGluZm9bXSAqLworZW51bSB0b2tlbiB7CisJLyogc29tZSAobG9uZykgdW5hcnkgb3BlcmF0b3JzICovCisJT19QTFVTUExVUyA9IDAsIE9fTUlOVVNNSU5VUywKKwkvKiBiaW5hcnkgb3BlcmF0b3JzICovCisJT19FUSwgT19ORSwKKwkvKiBhc3NpZ25tZW50cyBhcmUgYXNzdW1lZCB0byBiZSBpbiByYW5nZSBPX0FTTiAuLiBPX0JPUkFTTiAqLworCU9fQVNOLCBPX1RJTUVTQVNOLCBPX0RJVkFTTiwgT19NT0RBU04sIE9fUExVU0FTTiwgT19NSU5VU0FTTiwKKwlPX0xTSElGVEFTTiwgT19SU0hJRlRBU04sIE9fQkFOREFTTiwgT19CWE9SQVNOLCBPX0JPUkFTTiwKKwlPX0xTSElGVCwgT19SU0hJRlQsCisJT19MRSwgT19HRSwgT19MVCwgT19HVCwKKwlPX0xBTkQsCisJT19MT1IsCisJT19USU1FUywgT19ESVYsIE9fTU9ELAorCU9fUExVUywgT19NSU5VUywKKwlPX0JBTkQsCisJT19CWE9SLAorCU9fQk9SLAorCU9fVEVSTiwKKwlPX0NPTU1BLAorCS8qIHRoaW5ncyBhZnRlciB0aGlzIGFyZW4ndCB1c2VkIGFzIGJpbmFyeSBvcGVyYXRvcnMgKi8KKwkvKiB1bmFyeSB0aGF0IGFyZSBub3QgYWxzbyBiaW5hcmllcyAqLworCU9fQk5PVCwgT19MTk9ULAorCS8qIG1pc2MgKi8KKwlPUEVOX1BBUkVOLCBDTE9TRV9QQVJFTiwgQ1RFUk4sCisJLyogdGhpbmdzIHRoYXQgZG9uJ3QgYXBwZWFyIGluIHRoZSBvcGluZm9bXSB0YWJsZSAqLworCVZBUiwgTElULCBFTkQsIEJBRAorfTsKKyNkZWZpbmUgSVNfQklOT1Aob3ApICgoKGludClvcCkgPj0gKGludClPX0VRICYmICgoaW50KW9wKSA8PSAoaW50KU9fQ09NTUEpCisjZGVmaW5lIElTX0FTU0lHTk9QKG9wKQkoKGludCkob3ApID49IChpbnQpT19BU04gJiYgKGludCkob3ApIDw9IChpbnQpT19CT1JBU04pCisKKy8qIHByZWNpc2lvbnM7IHVzZWQgdG8gYmUgZW51bSBwcmVjIGJ1dCB3ZSBkbyBhcml0aG1ldGljcyBvbiBpdCAqLworI2RlZmluZSBQX1BSSU1BUlkJMAkvKiBWQVIsIExJVCwgKCksIH4gISAtICsgKi8KKyNkZWZpbmUgUF9NVUxUCQkxCS8qICogLyAlICovCisjZGVmaW5lIFBfQURECQkyCS8qICsgLSAqLworI2RlZmluZSBQX1NISUZUCQkzCS8qIDw8ID4+ICovCisjZGVmaW5lIFBfUkVMQVRJT04JNAkvKiA8IDw9ID4gPj0gKi8KKyNkZWZpbmUgUF9FUVVBTElUWQk1CS8qID09ICE9ICovCisjZGVmaW5lIFBfQkFORAkJNgkvKiAmICovCisjZGVmaW5lIFBfQlhPUgkJNwkvKiBeICovCisjZGVmaW5lIFBfQk9SCQk4CS8qIHwgKi8KKyNkZWZpbmUgUF9MQU5ECQk5CS8qICYmICovCisjZGVmaW5lIFBfTE9SCQkxMAkvKiB8fCAqLworI2RlZmluZSBQX1RFUk4JCTExCS8qID86ICovCisjZGVmaW5lIFBfQVNTSUdOCTEyCS8qID0gKj0gLz0gJT0gKz0gLT0gPDw9ID4+PSAmPSBePSB8PSAqLworI2RlZmluZSBQX0NPTU1BCQkxMwkvKiAsICovCisjZGVmaW5lIE1BWF9QUkVDCVBfQ09NTUEKKworc3RydWN0IG9waW5mbyB7CisJY2hhcgkJbmFtZVs0XTsKKwlpbnQJCWxlbjsJLyogbmFtZSBsZW5ndGggKi8KKwlpbnQJCXByZWM7CS8qIHByZWNlZGVuY2U6IGxvd2VyIGlzIGhpZ2hlciAqLworfTsKKworLyogVG9rZW5zIGluIHRoaXMgdGFibGUgbXVzdCBiZSBvcmRlcmVkIHNvIHRoZSBsb25nZXN0IGFyZSBmaXJzdAorICogKGVnLCArPSBiZWZvcmUgKykuIElmIHlvdSBjaGFuZ2Ugc29tZXRoaW5nLCBjaGFuZ2UgdGhlIG9yZGVyCisgKiBvZiBlbnVtIHRva2VuIHRvby4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBvcGluZm8gb3BpbmZvW10gPSB7CisJeyAiKysiLAkgMiwgUF9QUklNQVJZIH0sCS8qIGJlZm9yZSArICovCisJeyAiLS0iLAkgMiwgUF9QUklNQVJZIH0sCS8qIGJlZm9yZSAtICovCisJeyAiPT0iLAkgMiwgUF9FUVVBTElUWSB9LAkvKiBiZWZvcmUgPSAqLworCXsgIiE9IiwJIDIsIFBfRVFVQUxJVFkgfSwJLyogYmVmb3JlICEgKi8KKwl7ICI9IiwJIDEsIFBfQVNTSUdOIH0sCQkvKiBrZWVwIGFzc2lnbnMgaW4gYSBibG9jayAqLworCXsgIio9IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAiLz0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICIlPSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgIis9IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAiLT0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICI8PD0iLCAzLCBQX0FTU0lHTiB9LAorCXsgIj4+PSIsIDMsIFBfQVNTSUdOIH0sCisJeyAiJj0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICJePSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgInw9IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAiPDwiLAkgMiwgUF9TSElGVCB9LAorCXsgIj4+IiwJIDIsIFBfU0hJRlQgfSwKKwl7ICI8PSIsCSAyLCBQX1JFTEFUSU9OIH0sCisJeyAiPj0iLAkgMiwgUF9SRUxBVElPTiB9LAorCXsgIjwiLAkgMSwgUF9SRUxBVElPTiB9LAorCXsgIj4iLAkgMSwgUF9SRUxBVElPTiB9LAorCXsgIiYmIiwJIDIsIFBfTEFORCB9LAorCXsgInx8IiwJIDIsIFBfTE9SIH0sCisJeyAiKiIsCSAxLCBQX01VTFQgfSwKKwl7ICIvIiwJIDEsIFBfTVVMVCB9LAorCXsgIiUiLAkgMSwgUF9NVUxUIH0sCisJeyAiKyIsCSAxLCBQX0FERCB9LAorCXsgIi0iLAkgMSwgUF9BREQgfSwKKwl7ICImIiwJIDEsIFBfQkFORCB9LAorCXsgIl4iLAkgMSwgUF9CWE9SIH0sCisJeyAifCIsCSAxLCBQX0JPUiB9LAorCXsgIj8iLAkgMSwgUF9URVJOIH0sCisJeyAiLCIsCSAxLCBQX0NPTU1BIH0sCisJeyAifiIsCSAxLCBQX1BSSU1BUlkgfSwKKwl7ICIhIiwJIDEsIFBfUFJJTUFSWSB9LAorCXsgIigiLAkgMSwgUF9QUklNQVJZIH0sCisJeyAiKSIsCSAxLCBQX1BSSU1BUlkgfSwKKwl7ICI6IiwJIDEsIFBfUFJJTUFSWSB9LAorCXsgIiIsCSAwLCBQX1BSSU1BUlkgfQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgZXhwcl9zdGF0ZSBFeHByX3N0YXRlOworc3RydWN0IGV4cHJfc3RhdGUgeworCWNvbnN0IGNoYXIgKmV4cHJlc3Npb247CQkvKiBleHByZXNzaW9uIGJlaW5nIGV2YWx1YXRlZCAqLworCWNvbnN0IGNoYXIgKnRva3A7CQkvKiBsZXhpY2FsIHBvc2l0aW9uICovCisJc3RydWN0IHRibCAqdmFsOwkJLyogdmFsdWUgZnJvbSB0b2tlbigpICovCisJc3RydWN0IHRibCAqZXZhbGluZzsJCS8qIHZhcmlhYmxlIHRoYXQgaXMgYmVpbmcgcmVjdXJzaXZlbHkKKwkJCQkJICogZXhwYW5kZWQgKEVYUFJJTkVWQUwgZmxhZyBzZXQpICovCisJaW50IG5vYXNzaWduOwkJCS8qIGRvbid0IGRvIGFzc2lnbnMgKGZvciA/OiwmJix8fCkgKi8KKwllbnVtIHRva2VuIHRvazsJCQkvKiB0b2tlbiBmcm9tIHRva2VuKCkgKi8KKwlib29sIGFyaXRoOwkJCS8qIGV2YWx1YXRpbmcgYW4gJCgoKSkgZXhwcmVzc2lvbj8gKi8KKwlib29sIG5hdHVyYWw7CQkJLyogdW5zaWduZWQgYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiAqLworfTsKKworI2RlZmluZSBiaXZ1aSh4LCBvcCwgeSkJKGVzLT5uYXR1cmFsID8JCQlcCisJKG1rc2hfYXJpX3QpKCh4KS0+dmFsLnUgb3AgKHkpLT52YWwudSkgOglcCisJKG1rc2hfYXJpX3QpKCh4KS0+dmFsLmkgb3AgKHkpLT52YWwuaSkJCVwKKykKKyNkZWZpbmUgY2h2dWkoeCwgb3ApCWRvIHsJCQlcCisJaWYgKGVzLT5uYXR1cmFsKQkJCVwKKwkJKHgpLT52YWwudSA9IG9wICh4KS0+dmFsLnU7CVwKKwllbHNlCQkJCQlcCisJCSh4KS0+dmFsLmkgPSBvcCAoeCktPnZhbC5pOwlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNkZWZpbmUgc3R2dWkoeCwgbikJZG8gewkJCVwKKwlpZiAoZXMtPm5hdHVyYWwpCQkJXAorCQkoeCktPnZhbC51ID0gKG4pOwkJXAorCWVsc2UJCQkJCVwKKwkJKHgpLT52YWwuaSA9IChuKTsJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorCitlbnVtIGVycm9yX3R5cGUgeworCUVUX1VORVhQRUNURUQsIEVUX0JBRExJVCwgRVRfUkVDVVJTSVZFLAorCUVUX0xWQUxVRSwgRVRfUkRPTkxZLCBFVF9TVFIKK307CisKK3N0YXRpYyB2b2lkIGV2YWxlcnIoRXhwcl9zdGF0ZSAqLCBlbnVtIGVycm9yX3R5cGUsIGNvbnN0IGNoYXIgKikKKyAgICBNS1NIX0FfTk9SRVRVUk47CitzdGF0aWMgc3RydWN0IHRibCAqZXZhbGV4cHIoRXhwcl9zdGF0ZSAqLCBpbnQpOworc3RhdGljIHZvaWQgZXhwcnRva2VuKEV4cHJfc3RhdGUgKik7CitzdGF0aWMgc3RydWN0IHRibCAqZG9fcHBtbShFeHByX3N0YXRlICosIGVudW0gdG9rZW4sIHN0cnVjdCB0YmwgKiwgYm9vbCk7CitzdGF0aWMgdm9pZCBhc3NpZ25fY2hlY2soRXhwcl9zdGF0ZSAqLCBlbnVtIHRva2VuLCBzdHJ1Y3QgdGJsICopOworc3RhdGljIHN0cnVjdCB0YmwgKnRlbXB2YXIodm9pZCk7CitzdGF0aWMgc3RydWN0IHRibCAqaW50dmFyKEV4cHJfc3RhdGUgKiwgc3RydWN0IHRibCAqKTsKKworLyoKKyAqIHBhcnNlIGFuZCBldmFsdWF0ZSBleHByZXNzaW9uCisgKi8KK2ludAorZXZhbHVhdGUoY29uc3QgY2hhciAqZXhwciwgbWtzaF9hcmlfdCAqcnZhbCwgaW50IGVycm9yX29rLCBib29sIGFyaXRoKQoreworCXN0cnVjdCB0YmwgdjsKKwlpbnQgcmV0OworCisJdi5mbGFnID0gREVGSU5FRHxJTlRFR0VSOworCXYudHlwZSA9IDA7CisJcmV0ID0gdl9ldmFsdWF0ZSgmdiwgZXhwciwgZXJyb3Jfb2ssIGFyaXRoKTsKKwkqcnZhbCA9IHYudmFsLmk7CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICogcGFyc2UgYW5kIGV2YWx1YXRlIGV4cHJlc3Npb24sIHN0b3JpbmcgcmVzdWx0IGluIHZwLgorICovCitpbnQKK3ZfZXZhbHVhdGUoc3RydWN0IHRibCAqdnAsIGNvbnN0IGNoYXIgKmV4cHIsIHZvbGF0aWxlIGludCBlcnJvcl9vaywKKyAgICBib29sIGFyaXRoKQoreworCXN0cnVjdCB0YmwgKnY7CisJRXhwcl9zdGF0ZSBjdXJzdGF0ZTsKKwlFeHByX3N0YXRlICogY29uc3QgZXMgPSAmY3Vyc3RhdGU7CisJaW50IGk7CisKKwkvKiBzYXZlIHN0YXRlIHRvIGFsbG93IHJlY3Vyc2l2ZSBjYWxscyAqLworCWN1cnN0YXRlLmV4cHJlc3Npb24gPSBjdXJzdGF0ZS50b2twID0gZXhwcjsKKwljdXJzdGF0ZS5ub2Fzc2lnbiA9IDA7CisJY3Vyc3RhdGUuYXJpdGggPSBhcml0aDsKKwljdXJzdGF0ZS5ldmFsaW5nID0gTlVMTDsKKwljdXJzdGF0ZS5uYXR1cmFsID0gZmFsc2U7CisKKwluZXdlbnYoRV9FUlJIKTsKKwlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCWlmIChpKSB7CisJCS8qIENsZWFyIEVYUFJJTkVWQUwgaW4gb2YgYW55IHZhcmlhYmxlcyB3ZSB3ZXJlIHBsYXlpbmcgd2l0aCAqLworCQlpZiAoY3Vyc3RhdGUuZXZhbGluZykKKwkJCWN1cnN0YXRlLmV2YWxpbmctPmZsYWcgJj0gfkVYUFJJTkVWQUw7CisJCXF1aXRlbnYoTlVMTCk7CisJCWlmIChpID09IExBRVhQUikgeworCQkJaWYgKGVycm9yX29rID09IEtTSF9SRVRVUk5fRVJST1IpCisJCQkJcmV0dXJuICgwKTsKKwkJCWVycm9yZnooKTsKKwkJfQorCQl1bndpbmQoaSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwlleHBydG9rZW4oZXMpOworCWlmIChlcy0+dG9rID09IEVORCkgeworCQllcy0+dG9rID0gTElUOworCQllcy0+dmFsID0gdGVtcHZhcigpOworCX0KKwl2ID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgTUFYX1BSRUMpKTsKKworCWlmIChlcy0+dG9rICE9IEVORCkKKwkJZXZhbGVycihlcywgRVRfVU5FWFBFQ1RFRCwgTlVMTCk7CisKKwlpZiAoZXMtPmFyaXRoICYmIGVzLT5uYXR1cmFsKQorCQl2cC0+ZmxhZyB8PSBJTlRfVTsKKwlpZiAodnAtPmZsYWcgJiBJTlRFR0VSKQorCQlzZXRpbnRfdih2cCwgdiwgZXMtPmFyaXRoKTsKKwllbHNlCisJCS8qIGNhbiBmYWlsIGlmIHJlYWRvbmx5ICovCisJCXNldHN0cih2cCwgc3RyX3ZhbCh2KSwgZXJyb3Jfb2spOworCisJcXVpdGVudihOVUxMKTsKKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitldmFsZXJyKEV4cHJfc3RhdGUgKmVzLCBlbnVtIGVycm9yX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgdGJ1ZlsyXTsKKwljb25zdCBjaGFyICpzOworCisJZXMtPmFyaXRoID0gZmFsc2U7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFVF9VTkVYUEVDVEVEOgorCQlzd2l0Y2ggKGVzLT50b2spIHsKKwkJY2FzZSBWQVI6CisJCQlzID0gZXMtPnZhbC0+bmFtZTsKKwkJCWJyZWFrOworCQljYXNlIExJVDoKKwkJCXMgPSBzdHJfdmFsKGVzLT52YWwpOworCQkJYnJlYWs7CisJCWNhc2UgRU5EOgorCQkJcyA9ICJlbmQgb2YgZXhwcmVzc2lvbiI7CisJCQlicmVhazsKKwkJY2FzZSBCQUQ6CisJCQl0YnVmWzBdID0gKmVzLT50b2twOworCQkJdGJ1ZlsxXSA9ICdcMCc7CisJCQlzID0gdGJ1ZjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcyA9IG9waW5mb1soaW50KWVzLT50b2tdLm5hbWU7CisJCX0KKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiB1bmV4cGVjdGVkICclcyciLCBlcy0+ZXhwcmVzc2lvbiwgcyk7CisJCWJyZWFrOworCisJY2FzZSBFVF9CQURMSVQ6CisJCXdhcm5pbmdmKHRydWUsICIlczogYmFkIG51bWJlciAnJXMnIiwgZXMtPmV4cHJlc3Npb24sIHN0cik7CisJCWJyZWFrOworCisJY2FzZSBFVF9SRUNVUlNJVkU6CisJCXdhcm5pbmdmKHRydWUsICIlczogZXhwcmVzc2lvbiByZWN1cnNlcyBvbiBwYXJhbWV0ZXIgJyVzJyIsCisJCSAgICBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKKwkJYnJlYWs7CisKKwljYXNlIEVUX0xWQUxVRToKKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiAlcyByZXF1aXJlcyBsdmFsdWUiLAorCQkgICAgZXMtPmV4cHJlc3Npb24sIHN0cik7CisJCWJyZWFrOworCisJY2FzZSBFVF9SRE9OTFk6CisJCXdhcm5pbmdmKHRydWUsICIlczogJXMgYXBwbGllZCB0byByZWFkIG9ubHkgdmFyaWFibGUiLAorCQkgICAgZXMtPmV4cHJlc3Npb24sIHN0cik7CisJCWJyZWFrOworCisJZGVmYXVsdDogLyoga2VlcCBnY2MgaGFwcHkgKi8KKwljYXNlIEVUX1NUUjoKKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiAlcyIsIGVzLT5leHByZXNzaW9uLCBzdHIpOworCQlicmVhazsKKwl9CisJdW53aW5kKExBRVhQUik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGJsICoKK2V2YWxleHByKEV4cHJfc3RhdGUgKmVzLCBpbnQgcHJlYykKK3sKKwlzdHJ1Y3QgdGJsICp2bCwgKnZyID0gTlVMTCwgKnZhc247CisJZW51bSB0b2tlbiBvcDsKKwlta3NoX2FyaV90IHJlcyA9IDA7CisKKwlpZiAocHJlYyA9PSBQX1BSSU1BUlkpIHsKKwkJb3AgPSBlcy0+dG9rOworCQlpZiAob3AgPT0gT19CTk9UIHx8IG9wID09IE9fTE5PVCB8fCBvcCA9PSBPX01JTlVTIHx8CisJCSAgICBvcCA9PSBPX1BMVVMpIHsKKwkJCWV4cHJ0b2tlbihlcyk7CisJCQl2bCA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIFBfUFJJTUFSWSkpOworCQkJaWYgKG9wID09IE9fQk5PVCkKKwkJCQljaHZ1aSh2bCwgfik7CisJCQllbHNlIGlmIChvcCA9PSBPX0xOT1QpCisJCQkJY2h2dWkodmwsICEpOworCQkJZWxzZSBpZiAob3AgPT0gT19NSU5VUykKKwkJCQljaHZ1aSh2bCwgLSk7CisJCQkvKiBvcCA9PSBPX1BMVVMgaXMgYSBuby1vcCAqLworCQl9IGVsc2UgaWYgKG9wID09IE9QRU5fUEFSRU4pIHsKKwkJCWV4cHJ0b2tlbihlcyk7CisJCQl2bCA9IGV2YWxleHByKGVzLCBNQVhfUFJFQyk7CisJCQlpZiAoZXMtPnRvayAhPSBDTE9TRV9QQVJFTikKKwkJCQlldmFsZXJyKGVzLCBFVF9TVFIsICJtaXNzaW5nICkiKTsKKwkJCWV4cHJ0b2tlbihlcyk7CisJCX0gZWxzZSBpZiAob3AgPT0gT19QTFVTUExVUyB8fCBvcCA9PSBPX01JTlVTTUlOVVMpIHsKKwkJCWV4cHJ0b2tlbihlcyk7CisJCQl2bCA9IGRvX3BwbW0oZXMsIG9wLCBlcy0+dmFsLCB0cnVlKTsKKwkJCWV4cHJ0b2tlbihlcyk7CisJCX0gZWxzZSBpZiAob3AgPT0gVkFSIHx8IG9wID09IExJVCkgeworCQkJdmwgPSBlcy0+dmFsOworCQkJZXhwcnRva2VuKGVzKTsKKwkJfSBlbHNlIHsKKwkJCWV2YWxlcnIoZXMsIEVUX1VORVhQRUNURUQsIE5VTEwpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWlmIChlcy0+dG9rID09IE9fUExVU1BMVVMgfHwgZXMtPnRvayA9PSBPX01JTlVTTUlOVVMpIHsKKwkJCXZsID0gZG9fcHBtbShlcywgZXMtPnRvaywgdmwsIGZhbHNlKTsKKwkJCWV4cHJ0b2tlbihlcyk7CisJCX0KKwkJcmV0dXJuICh2bCk7CisJfQorCXZsID0gZXZhbGV4cHIoZXMsIHByZWMgLSAxKTsKKwlmb3IgKG9wID0gZXMtPnRvazsgSVNfQklOT1Aob3ApICYmIG9waW5mb1soaW50KW9wXS5wcmVjID09IHByZWM7CisJICAgIG9wID0gZXMtPnRvaykgeworCQlleHBydG9rZW4oZXMpOworCQl2YXNuID0gdmw7CisJCWlmIChvcCAhPSBPX0FTTikgLyogdmwgbWF5IG5vdCBoYXZlIGEgdmFsdWUgeWV0ICovCisJCQl2bCA9IGludHZhcihlcywgdmwpOworCQlpZiAoSVNfQVNTSUdOT1Aob3ApKSB7CisJCQlhc3NpZ25fY2hlY2soZXMsIG9wLCB2YXNuKTsKKwkJCXZyID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgUF9BU1NJR04pKTsKKwkJfSBlbHNlIGlmIChvcCAhPSBPX1RFUk4gJiYgb3AgIT0gT19MQU5EICYmIG9wICE9IE9fTE9SKQorCQkJdnIgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBwcmVjIC0gMSkpOworCQlpZiAoKG9wID09IE9fRElWIHx8IG9wID09IE9fTU9EIHx8IG9wID09IE9fRElWQVNOIHx8CisJCSAgICBvcCA9PSBPX01PREFTTikgJiYgdnItPnZhbC5pID09IDApIHsKKwkJCWlmIChlcy0+bm9hc3NpZ24pCisJCQkJdnItPnZhbC5pID0gMTsKKwkJCWVsc2UKKwkJCQlldmFsZXJyKGVzLCBFVF9TVFIsICJ6ZXJvIGRpdmlzb3IiKTsKKwkJfQorCQlzd2l0Y2ggKChpbnQpb3ApIHsKKwkJY2FzZSBPX1RJTUVTOgorCQljYXNlIE9fVElNRVNBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgKiwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19ESVY6CisJCWNhc2UgT19ESVZBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgLywgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19NT0Q6CisJCWNhc2UgT19NT0RBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgJSwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19QTFVTOgorCQljYXNlIE9fUExVU0FTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCArLCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX01JTlVTOgorCQljYXNlIE9fTUlOVVNBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgLSwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19MU0hJRlQ6CisJCWNhc2UgT19MU0hJRlRBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgPDwsIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fUlNISUZUOgorCQljYXNlIE9fUlNISUZUQVNOOgorCQkJcmVzID0gYml2dWkodmwsID4+LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0xUOgorCQkJcmVzID0gYml2dWkodmwsIDwsIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fTEU6CisJCQlyZXMgPSBiaXZ1aSh2bCwgPD0sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fR1Q6CisJCQlyZXMgPSBiaXZ1aSh2bCwgPiwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19HRToKKwkJCXJlcyA9IGJpdnVpKHZsLCA+PSwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19FUToKKwkJCXJlcyA9IGJpdnVpKHZsLCA9PSwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19ORToKKwkJCXJlcyA9IGJpdnVpKHZsLCAhPSwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19CQU5EOgorCQljYXNlIE9fQkFOREFTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCAmLCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0JYT1I6CisJCWNhc2UgT19CWE9SQVNOOgorCQkJcmVzID0gYml2dWkodmwsIF4sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fQk9SOgorCQljYXNlIE9fQk9SQVNOOgorCQkJcmVzID0gYml2dWkodmwsIHwsIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fTEFORDoKKwkJCWlmICghdmwtPnZhbC5pKQorCQkJCWVzLT5ub2Fzc2lnbisrOworCQkJdnIgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBwcmVjIC0gMSkpOworCQkJcmVzID0gYml2dWkodmwsICYmLCB2cik7CisJCQlpZiAoIXZsLT52YWwuaSkKKwkJCQllcy0+bm9hc3NpZ24tLTsKKwkJCWJyZWFrOworCQljYXNlIE9fTE9SOgorCQkJaWYgKHZsLT52YWwuaSkKKwkJCQllcy0+bm9hc3NpZ24rKzsKKwkJCXZyID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgcHJlYyAtIDEpKTsKKwkJCXJlcyA9IGJpdnVpKHZsLCB8fCwgdnIpOworCQkJaWYgKHZsLT52YWwuaSkKKwkJCQllcy0+bm9hc3NpZ24tLTsKKwkJCWJyZWFrOworCQljYXNlIE9fVEVSTjoKKwkJCXsKKwkJCQlib29sIGV2ID0gdmwtPnZhbC5pICE9IDA7CisKKwkJCQlpZiAoIWV2KQorCQkJCQllcy0+bm9hc3NpZ24rKzsKKwkJCQl2bCA9IGV2YWxleHByKGVzLCBNQVhfUFJFQyk7CisJCQkJaWYgKCFldikKKwkJCQkJZXMtPm5vYXNzaWduLS07CisJCQkJaWYgKGVzLT50b2sgIT0gQ1RFUk4pCisJCQkJCWV2YWxlcnIoZXMsIEVUX1NUUiwgIm1pc3NpbmcgOiIpOworCQkJCWV4cHJ0b2tlbihlcyk7CisJCQkJaWYgKGV2KQorCQkJCQllcy0+bm9hc3NpZ24rKzsKKwkJCQl2ciA9IGV2YWxleHByKGVzLCBQX1RFUk4pOworCQkJCWlmIChldikKKwkJCQkJZXMtPm5vYXNzaWduLS07CisJCQkJdmwgPSBldiA/IHZsIDogdnI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPX0FTTjoKKwkJCXJlcyA9IHZyLT52YWwuaTsKKwkJCWJyZWFrOworCQljYXNlIE9fQ09NTUE6CisJCQlyZXMgPSB2ci0+dmFsLmk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoSVNfQVNTSUdOT1Aob3ApKSB7CisJCQlzdHZ1aSh2ciwgcmVzKTsKKwkJCWlmICghZXMtPm5vYXNzaWduKSB7CisJCQkJaWYgKHZhc24tPmZsYWcgJiBJTlRFR0VSKQorCQkJCQlzZXRpbnRfdih2YXNuLCB2ciwgZXMtPmFyaXRoKTsKKwkJCQllbHNlCisJCQkJCXNldGludCh2YXNuLCByZXMpOworCQkJfQorCQkJdmwgPSB2cjsKKwkJfSBlbHNlIGlmIChvcCAhPSBPX1RFUk4pCisJCQlzdHZ1aSh2bCwgcmVzKTsKKwl9CisJcmV0dXJuICh2bCk7Cit9CisKK3N0YXRpYyB2b2lkCitleHBydG9rZW4oRXhwcl9zdGF0ZSAqZXMpCit7CisJY29uc3QgY2hhciAqY3AgPSBlcy0+dG9rcDsKKwlpbnQgYzsKKwljaGFyICp0dmFyOworCisJLyogc2tpcCB3aGl0ZSBzcGFjZSAqLworIHNraXBfc3BhY2VzOgorCXdoaWxlICgoYyA9ICpjcCksIGtzaF9pc3NwYWNlKGMpKQorCQkrK2NwOworCWlmIChlcy0+dG9rcCA9PSBlcy0+ZXhwcmVzc2lvbiAmJiBjID09ICcjJykgeworCQkvKiBleHByZXNzaW9uIGJlZ2lucyB3aXRoICMgKi8KKwkJZXMtPm5hdHVyYWwgPSB0cnVlOwkvKiBzd2l0Y2ggdG8gdW5zaWduZWQgKi8KKwkJKytjcDsKKwkJZ290byBza2lwX3NwYWNlczsKKwl9CisJZXMtPnRva3AgPSBjcDsKKworCWlmIChjID09ICdcMCcpCisJCWVzLT50b2sgPSBFTkQ7CisJZWxzZSBpZiAoa3NoX2lzYWxwaHgoYykpIHsKKwkJZm9yICg7IGtzaF9pc2FsbnV4KGMpOyBjID0gKmNwKQorCQkJY3ArKzsKKwkJaWYgKGMgPT0gJ1snKSB7CisJCQlpbnQgbGVuOworCisJCQlsZW4gPSBhcnJheV9yZWZfbGVuKGNwKTsKKwkJCWlmIChsZW4gPT0gMCkKKwkJCQlldmFsZXJyKGVzLCBFVF9TVFIsICJtaXNzaW5nIF0iKTsKKwkJCWNwICs9IGxlbjsKKwkJfSBlbHNlIGlmIChjID09ICcoJyAvKikqLyApIHsKKwkJCS8qIHRvZG86IGFkZCBtYXRoIGZ1bmN0aW9ucyAoYWxsIHRha2Ugc2luZ2xlIGFyZ3VtZW50KToKKwkJCSAqIGFicyBhY29zIGFzaW4gYXRhbiBjb3MgY29zaCBleHAgaW50IGxvZyBzaW4gc2luaCBzcXJ0CisJCQkgKiB0YW4gdGFuaAorCQkJICovCisJCQk7CisJCX0KKwkJaWYgKGVzLT5ub2Fzc2lnbikgeworCQkJZXMtPnZhbCA9IHRlbXB2YXIoKTsKKwkJCWVzLT52YWwtPmZsYWcgfD0gRVhQUkxWQUxVRTsKKwkJfSBlbHNlIHsKKwkJCXN0cm5kdXB4KHR2YXIsIGVzLT50b2twLCBjcCAtIGVzLT50b2twLCBBVEVNUCk7CisJCQllcy0+dmFsID0gZ2xvYmFsKHR2YXIpOworCQkJYWZyZWUodHZhciwgQVRFTVApOworCQl9CisJCWVzLT50b2sgPSBWQVI7CisJfSBlbHNlIGlmIChjID09ICcxJyAmJiBjcFsxXSA9PSAnIycpIHsKKwkJY3AgKz0gMjsKKwkJY3AgKz0gdXRmX3B0cmFkaihjcCk7CisJCXN0cm5kdXB4KHR2YXIsIGVzLT50b2twLCBjcCAtIGVzLT50b2twLCBBVEVNUCk7CisJCWdvdG8gcHJvY2Vzc190dmFyOworI2lmbmRlZiBNS1NIX1NNQUxMCisJfSBlbHNlIGlmIChjID09ICdcJycpIHsKKwkJKytjcDsKKwkJY3AgKz0gdXRmX3B0cmFkaihjcCk7CisJCWlmICgqY3ArKyAhPSAnXCcnKQorCQkJZXZhbGVycihlcywgRVRfU1RSLAorCQkJICAgICJtdWx0aS1jaGFyYWN0ZXIgY2hhcmFjdGVyIGNvbnN0YW50Iik7CisJCS8qICd4JyAtPiAxI3ggKHggPSBvbmUgbXVsdGlieXRlIGNoYXJhY3RlcikgKi8KKwkJYyA9IGNwIC0gZXMtPnRva3A7CisJCXR2YXIgPSBhbGxvYyhjICsgLyogTlVMICovIDEsIEFURU1QKTsKKwkJdHZhclswXSA9ICcxJzsKKwkJdHZhclsxXSA9ICcjJzsKKwkJbWVtY3B5KHR2YXIgKyAyLCBlcy0+dG9rcCArIDEsIGMgLSAyKTsKKwkJdHZhcltjXSA9ICdcMCc7CisJCWdvdG8gcHJvY2Vzc190dmFyOworI2VuZGlmCisJfSBlbHNlIGlmIChrc2hfaXNkaWdpdChjKSkgeworCQl3aGlsZSAoYyAhPSAnXycgJiYgKGtzaF9pc2FsbnV4KGMpIHx8IGMgPT0gJyMnKSkKKwkJCWMgPSAqY3ArKzsKKwkJc3RybmR1cHgodHZhciwgZXMtPnRva3AsIC0tY3AgLSBlcy0+dG9rcCwgQVRFTVApOworIHByb2Nlc3NfdHZhcjoKKwkJZXMtPnZhbCA9IHRlbXB2YXIoKTsKKwkJZXMtPnZhbC0+ZmxhZyAmPSB+SU5URUdFUjsKKwkJZXMtPnZhbC0+dHlwZSA9IDA7CisJCWVzLT52YWwtPnZhbC5zID0gdHZhcjsKKwkJaWYgKHNldGludF92KGVzLT52YWwsIGVzLT52YWwsIGVzLT5hcml0aCkgPT0gTlVMTCkKKwkJCWV2YWxlcnIoZXMsIEVUX0JBRExJVCwgdHZhcik7CisJCWFmcmVlKHR2YXIsIEFURU1QKTsKKwkJZXMtPnRvayA9IExJVDsKKwl9IGVsc2UgeworCQlpbnQgaSwgbjA7CisKKwkJZm9yIChpID0gMDsgKG4wID0gb3BpbmZvW2ldLm5hbWVbMF0pOyBpKyspCisJCQlpZiAoYyA9PSBuMCAmJiBzdHJuY21wKGNwLCBvcGluZm9baV0ubmFtZSwKKwkJCSAgICAoc2l6ZV90KW9waW5mb1tpXS5sZW4pID09IDApIHsKKwkJCQllcy0+dG9rID0gKGVudW0gdG9rZW4paTsKKwkJCQljcCArPSBvcGluZm9baV0ubGVuOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoIW4wKQorCQkJZXMtPnRvayA9IEJBRDsKKwl9CisJZXMtPnRva3AgPSBjcDsKK30KKworLyogRG8gYSArKyBvciAtLSBvcGVyYXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgdGJsICoKK2RvX3BwbW0oRXhwcl9zdGF0ZSAqZXMsIGVudW0gdG9rZW4gb3AsIHN0cnVjdCB0YmwgKnZhc24sIGJvb2wgaXNfcHJlZml4KQoreworCXN0cnVjdCB0YmwgKnZsOworCW1rc2hfYXJpX3Qgb3ZhbDsKKworCWFzc2lnbl9jaGVjayhlcywgb3AsIHZhc24pOworCisJdmwgPSBpbnR2YXIoZXMsIHZhc24pOworCW92YWwgPSB2bC0+dmFsLmk7CisJaWYgKG9wID09IE9fUExVU1BMVVMpIHsKKwkJaWYgKGVzLT5uYXR1cmFsKQorCQkJKyt2bC0+dmFsLnU7CisJCWVsc2UKKwkJCSsrdmwtPnZhbC5pOworCX0gZWxzZSB7CisJCWlmIChlcy0+bmF0dXJhbCkKKwkJCS0tdmwtPnZhbC51OworCQllbHNlCisJCQktLXZsLT52YWwuaTsKKwl9CisJaWYgKHZhc24tPmZsYWcgJiBJTlRFR0VSKQorCQlzZXRpbnRfdih2YXNuLCB2bCwgZXMtPmFyaXRoKTsKKwllbHNlCisJCXNldGludCh2YXNuLCB2bC0+dmFsLmkpOworCWlmICghaXNfcHJlZml4KQkJLyogdW5kbyB0aGUgaW5jL2RlYyAqLworCQl2bC0+dmFsLmkgPSBvdmFsOworCisJcmV0dXJuICh2bCk7Cit9CisKK3N0YXRpYyB2b2lkCithc3NpZ25fY2hlY2soRXhwcl9zdGF0ZSAqZXMsIGVudW0gdG9rZW4gb3AsIHN0cnVjdCB0YmwgKnZhc24pCit7CisJaWYgKGVzLT50b2sgPT0gRU5EIHx8CisJICAgICh2YXNuLT5uYW1lWzBdID09ICdcMCcgJiYgISh2YXNuLT5mbGFnICYgRVhQUkxWQUxVRSkpKQorCQlldmFsZXJyKGVzLCBFVF9MVkFMVUUsIG9waW5mb1soaW50KW9wXS5uYW1lKTsKKwllbHNlIGlmICh2YXNuLT5mbGFnICYgUkRPTkxZKQorCQlldmFsZXJyKGVzLCBFVF9SRE9OTFksIG9waW5mb1soaW50KW9wXS5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCB0YmwgKgordGVtcHZhcih2b2lkKQoreworCXN0cnVjdCB0YmwgKnZwOworCisJdnAgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHRibCksIEFURU1QKTsKKwl2cC0+ZmxhZyA9IElTU0VUfElOVEVHRVI7CisJdnAtPnR5cGUgPSAwOworCXZwLT5hcmVhcCA9IEFURU1QOworCXZwLT51YS5odmFsID0gMDsKKwl2cC0+dmFsLmkgPSAwOworCXZwLT5uYW1lWzBdID0gJ1wwJzsKKwlyZXR1cm4gKHZwKTsKK30KKworLyogY2FzdCAoc3RyaW5nKSB2YXJpYWJsZSB0byB0ZW1wb3JhcnkgaW50ZWdlciB2YXJpYWJsZSAqLworc3RhdGljIHN0cnVjdCB0YmwgKgoraW50dmFyKEV4cHJfc3RhdGUgKmVzLCBzdHJ1Y3QgdGJsICp2cCkKK3sKKwlzdHJ1Y3QgdGJsICp2cTsKKworCS8qIHRyeSB0byBhdm9pZCByZXBsYWNpbmcgYSB0ZW1wIHZhciB3aXRoIGFub3RoZXIgdGVtcCB2YXIgKi8KKwlpZiAodnAtPm5hbWVbMF0gPT0gJ1wwJyAmJgorCSAgICAodnAtPmZsYWcgJiAoSVNTRVR8SU5URUdFUnxFWFBSTFZBTFVFKSkgPT0gKElTU0VUfElOVEVHRVIpKQorCQlyZXR1cm4gKHZwKTsKKworCXZxID0gdGVtcHZhcigpOworCWlmIChzZXRpbnRfdih2cSwgdnAsIGVzLT5hcml0aCkgPT0gTlVMTCkgeworCQlpZiAodnAtPmZsYWcgJiBFWFBSSU5FVkFMKQorCQkJZXZhbGVycihlcywgRVRfUkVDVVJTSVZFLCB2cC0+bmFtZSk7CisJCWVzLT5ldmFsaW5nID0gdnA7CisJCXZwLT5mbGFnIHw9IEVYUFJJTkVWQUw7CisJCXZfZXZhbHVhdGUodnEsIHN0cl92YWwodnApLCBLU0hfVU5XSU5EX0VSUk9SLCBlcy0+YXJpdGgpOworCQl2cC0+ZmxhZyAmPSB+RVhQUklORVZBTDsKKwkJZXMtPmV2YWxpbmcgPSBOVUxMOworCX0KKwlyZXR1cm4gKHZxKTsKK30KKworCisvKgorICogVVRGLTggc3VwcG9ydCBjb2RlOiBoaWdoLWxldmVsIGZ1bmN0aW9ucworICovCisKK2ludAordXRmX3dpZHRoYWRqKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqKmRzdCkKK3sKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGludCB3YzsKKwlpbnQgd2lkdGg7CisKKwlpZiAoIVVURk1PREUgfHwgKGxlbiA9IHV0Zl9tYnRvd2MoJndjLCBzcmMpKSA9PSAoc2l6ZV90KS0xIHx8CisJICAgIHdjID09IDApCisJCWxlbiA9IHdpZHRoID0gMTsKKwllbHNlIGlmICgod2lkdGggPSB1dGZfd2N3aWR0aCh3YykpIDwgMCkKKwkJLyogWFhYIHVzZSAyIGZvciB4X3pvdGMzIGhlcmU/ICovCisJCXdpZHRoID0gMTsKKworCWlmIChkc3QpCisJCSpkc3QgPSBzcmMgKyBsZW47CisJcmV0dXJuICh3aWR0aCk7Cit9CisKK2ludAordXRmX21ic3dpZHRoKGNvbnN0IGNoYXIgKnMpCit7CisJc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBpbnQgd2M7CisJaW50IHdpZHRoID0gMCwgY3c7CisKKwlpZiAoIVVURk1PREUpCisJCXJldHVybiAoc3RybGVuKHMpKTsKKworCXdoaWxlICgqcykKKwkJaWYgKCgobGVuID0gdXRmX21idG93Yygmd2MsIHMpKSA9PSAoc2l6ZV90KS0xKSB8fAorCQkgICAgKChjdyA9IHV0Zl93Y3dpZHRoKHdjKSkgPT0gLTEpKSB7CisJCQlzKys7CisJCQl3aWR0aCArPSAxOworCQl9IGVsc2UgeworCQkJcyArPSBsZW47CisJCQl3aWR0aCArPSBjdzsKKwkJfQorCXJldHVybiAod2lkdGgpOworfQorCitjb25zdCBjaGFyICoKK3V0Zl9za2lwY29scyhjb25zdCBjaGFyICpwLCBpbnQgY29scykKK3sKKwlpbnQgYyA9IDA7CisKKwl3aGlsZSAoYyA8IGNvbHMpIHsKKwkJaWYgKCEqcCkKKwkJCXJldHVybiAocCArIGNvbHMgLSBjKTsKKwkJYyArPSB1dGZfd2lkdGhhZGoocCwgJnApOworCX0KKwlyZXR1cm4gKHApOworfQorCitzaXplX3QKK3V0Zl9wdHJhZGooY29uc3QgY2hhciAqc3JjKQoreworCXJlZ2lzdGVyIHNpemVfdCBuOworCisJaWYgKCFVVEZNT0RFIHx8CisJICAgICooY29uc3QgdW5zaWduZWQgY2hhciAqKShzcmMpIDwgMHhDMiB8fAorCSAgICAobiA9IHV0Zl9tYnRvd2MoTlVMTCwgc3JjKSkgPT0gKHNpemVfdCktMSkKKwkJbiA9IDE7CisJcmV0dXJuIChuKTsKK30KKworLyoKKyAqIFVURi04IHN1cHBvcnQgY29kZTogbG93LWxldmVsIGZ1bmN0aW9ucworICovCisKKy8qIENFU1UtOCBtdWx0aWJ5dGUgYW5kIHdpZGUgY2hhcmFjdGVyIGNvbnZlcnNpb24gY3JhZnRlZCBmb3IgbWtzaCAqLworCitzaXplX3QKK3V0Zl9tYnRvd2ModW5zaWduZWQgaW50ICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzcmM7CisJdW5zaWduZWQgaW50IGMsIHdjOworCisJaWYgKCh3YyA9ICpzKyspIDwgMHg4MCkgeworIG91dDoKKwkJaWYgKGRzdCAhPSBOVUxMKQorCQkJKmRzdCA9IHdjOworCQlyZXR1cm4gKHdjID8gKChjb25zdCBjaGFyICopcyAtIHNyYykgOiAwKTsKKwl9CisJaWYgKHdjIDwgMHhDMiB8fCB3YyA+PSAweEYwKQorCQkvKiA8IDB4QzA6IHNwdXJpb3VzIHNlY29uZCBieXRlICovCisJCS8qIDwgMHhDMjogbm9uLW1pbmltYWxpc3RpYyBtYXBwaW5nIGVycm9yIGluIDItYnl0ZSBzZXFzICovCisJCS8qID4gMHhFRjogYmV5b25kIEJNUCAqLworCQlnb3RvIGlsc2VxOworCisJaWYgKHdjIDwgMHhFMCkgeworCQl3YyA9ICh3YyAmIDB4MUYpIDw8IDY7CisJCWlmICgoKGMgPSAqcysrKSAmIDB4QzApICE9IDB4ODApCisJCQlnb3RvIGlsc2VxOworCQl3YyB8PSBjICYgMHgzRjsKKwkJZ290byBvdXQ7CisJfQorCisJd2MgPSAod2MgJiAweDBGKSA8PCAxMjsKKworCWlmICgoKGMgPSAqcysrKSAmIDB4QzApICE9IDB4ODApCisJCWdvdG8gaWxzZXE7CisJd2MgfD0gKGMgJiAweDNGKSA8PCA2OworCisJaWYgKCgoYyA9ICpzKyspICYgMHhDMCkgIT0gMHg4MCkKKwkJZ290byBpbHNlcTsKKwl3YyB8PSBjICYgMHgzRjsKKworCS8qIENoZWNrIGZvciBub24tbWluaW1hbGlzdGljIG1hcHBpbmcgZXJyb3IgaW4gMy1ieXRlIHNlcXMgKi8KKwlpZiAod2MgPj0gMHgwODAwICYmIHdjIDw9IDB4RkZGRCkKKwkJZ290byBvdXQ7CisgaWxzZXE6CisJcmV0dXJuICgoc2l6ZV90KSgtMSkpOworfQorCitzaXplX3QKK3V0Zl93Y3RvbWIoY2hhciAqZHN0LCB1bnNpZ25lZCBpbnQgd2MpCit7CisJdW5zaWduZWQgY2hhciAqZDsKKworCWlmICh3YyA8IDB4ODApIHsKKwkJKmRzdCA9IHdjOworCQlyZXR1cm4gKDEpOworCX0KKworCWQgPSAodW5zaWduZWQgY2hhciAqKWRzdDsKKwlpZiAod2MgPCAweDA4MDApCisJCSpkKysgPSAod2MgPj4gNikgfCAweEMwOworCWVsc2UgeworCQkqZCsrID0gKCh3YyA9IHdjID4gMHhGRkZEID8gMHhGRkZEIDogd2MpID4+IDEyKSB8IDB4RTA7CisJCSpkKysgPSAoKHdjID4+IDYpICYgMHgzRikgfCAweDgwOworCX0KKwkqZCsrID0gKHdjICYgMHgzRikgfCAweDgwOworCXJldHVybiAoKGNoYXIgKilkIC0gZHN0KTsKK30KKworCisjaWZuZGVmIE1LU0hfbWlyYnNkX3djd2lkdGgKKy8qIC0tLSBiZWdpbiBvZiB3Y3dpZHRoLmMgZXhjZXJwdCAtLS0gKi8KKy8qLQorICogTWFya3VzIEt1aG4gLS0gMjAwNy0wNS0yNiAoVW5pY29kZSA1LjApCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorICogZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4gVGhlIGF1dGhvcgorICogZGlzY2xhaW1zIGFsbCB3YXJyYW50aWVzIHdpdGggcmVnYXJkIHRvIHRoaXMgc29mdHdhcmUuCisgKi8KKworX19SQ1NJRCgiJG1pcm9zOiBzcmMvbGliL2xpYmMvaTE4bi93Y3dpZHRoLmMsdiAxLjggMjAwOC8wOS8yMCAxMjowMToxOCB0ZyBFeHAgJCIpOworCitpbnQKK3V0Zl93Y3dpZHRoKHVuc2lnbmVkIGludCBjKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2JzZXQgeworCQl1bnNpZ25lZCBzaG9ydCBmaXJzdDsKKwkJdW5zaWduZWQgc2hvcnQgbGFzdDsKKwl9IGNvbWJbXSA9IHsKKwkJeyAweDAzMDAsIDB4MDM2RiB9LCB7IDB4MDQ4MywgMHgwNDg2IH0sIHsgMHgwNDg4LCAweDA0ODkgfSwKKwkJeyAweDA1OTEsIDB4MDVCRCB9LCB7IDB4MDVCRiwgMHgwNUJGIH0sIHsgMHgwNUMxLCAweDA1QzIgfSwKKwkJeyAweDA1QzQsIDB4MDVDNSB9LCB7IDB4MDVDNywgMHgwNUM3IH0sIHsgMHgwNjAwLCAweDA2MDMgfSwKKwkJeyAweDA2MTAsIDB4MDYxNSB9LCB7IDB4MDY0QiwgMHgwNjVFIH0sIHsgMHgwNjcwLCAweDA2NzAgfSwKKwkJeyAweDA2RDYsIDB4MDZFNCB9LCB7IDB4MDZFNywgMHgwNkU4IH0sIHsgMHgwNkVBLCAweDA2RUQgfSwKKwkJeyAweDA3MEYsIDB4MDcwRiB9LCB7IDB4MDcxMSwgMHgwNzExIH0sIHsgMHgwNzMwLCAweDA3NEEgfSwKKwkJeyAweDA3QTYsIDB4MDdCMCB9LCB7IDB4MDdFQiwgMHgwN0YzIH0sIHsgMHgwOTAxLCAweDA5MDIgfSwKKwkJeyAweDA5M0MsIDB4MDkzQyB9LCB7IDB4MDk0MSwgMHgwOTQ4IH0sIHsgMHgwOTRELCAweDA5NEQgfSwKKwkJeyAweDA5NTEsIDB4MDk1NCB9LCB7IDB4MDk2MiwgMHgwOTYzIH0sIHsgMHgwOTgxLCAweDA5ODEgfSwKKwkJeyAweDA5QkMsIDB4MDlCQyB9LCB7IDB4MDlDMSwgMHgwOUM0IH0sIHsgMHgwOUNELCAweDA5Q0QgfSwKKwkJeyAweDA5RTIsIDB4MDlFMyB9LCB7IDB4MEEwMSwgMHgwQTAyIH0sIHsgMHgwQTNDLCAweDBBM0MgfSwKKwkJeyAweDBBNDEsIDB4MEE0MiB9LCB7IDB4MEE0NywgMHgwQTQ4IH0sIHsgMHgwQTRCLCAweDBBNEQgfSwKKwkJeyAweDBBNzAsIDB4MEE3MSB9LCB7IDB4MEE4MSwgMHgwQTgyIH0sIHsgMHgwQUJDLCAweDBBQkMgfSwKKwkJeyAweDBBQzEsIDB4MEFDNSB9LCB7IDB4MEFDNywgMHgwQUM4IH0sIHsgMHgwQUNELCAweDBBQ0QgfSwKKwkJeyAweDBBRTIsIDB4MEFFMyB9LCB7IDB4MEIwMSwgMHgwQjAxIH0sIHsgMHgwQjNDLCAweDBCM0MgfSwKKwkJeyAweDBCM0YsIDB4MEIzRiB9LCB7IDB4MEI0MSwgMHgwQjQzIH0sIHsgMHgwQjRELCAweDBCNEQgfSwKKwkJeyAweDBCNTYsIDB4MEI1NiB9LCB7IDB4MEI4MiwgMHgwQjgyIH0sIHsgMHgwQkMwLCAweDBCQzAgfSwKKwkJeyAweDBCQ0QsIDB4MEJDRCB9LCB7IDB4MEMzRSwgMHgwQzQwIH0sIHsgMHgwQzQ2LCAweDBDNDggfSwKKwkJeyAweDBDNEEsIDB4MEM0RCB9LCB7IDB4MEM1NSwgMHgwQzU2IH0sIHsgMHgwQ0JDLCAweDBDQkMgfSwKKwkJeyAweDBDQkYsIDB4MENCRiB9LCB7IDB4MENDNiwgMHgwQ0M2IH0sIHsgMHgwQ0NDLCAweDBDQ0QgfSwKKwkJeyAweDBDRTIsIDB4MENFMyB9LCB7IDB4MEQ0MSwgMHgwRDQzIH0sIHsgMHgwRDRELCAweDBENEQgfSwKKwkJeyAweDBEQ0EsIDB4MERDQSB9LCB7IDB4MEREMiwgMHgwREQ0IH0sIHsgMHgwREQ2LCAweDBERDYgfSwKKwkJeyAweDBFMzEsIDB4MEUzMSB9LCB7IDB4MEUzNCwgMHgwRTNBIH0sIHsgMHgwRTQ3LCAweDBFNEUgfSwKKwkJeyAweDBFQjEsIDB4MEVCMSB9LCB7IDB4MEVCNCwgMHgwRUI5IH0sIHsgMHgwRUJCLCAweDBFQkMgfSwKKwkJeyAweDBFQzgsIDB4MEVDRCB9LCB7IDB4MEYxOCwgMHgwRjE5IH0sIHsgMHgwRjM1LCAweDBGMzUgfSwKKwkJeyAweDBGMzcsIDB4MEYzNyB9LCB7IDB4MEYzOSwgMHgwRjM5IH0sIHsgMHgwRjcxLCAweDBGN0UgfSwKKwkJeyAweDBGODAsIDB4MEY4NCB9LCB7IDB4MEY4NiwgMHgwRjg3IH0sIHsgMHgwRjkwLCAweDBGOTcgfSwKKwkJeyAweDBGOTksIDB4MEZCQyB9LCB7IDB4MEZDNiwgMHgwRkM2IH0sIHsgMHgxMDJELCAweDEwMzAgfSwKKwkJeyAweDEwMzIsIDB4MTAzMiB9LCB7IDB4MTAzNiwgMHgxMDM3IH0sIHsgMHgxMDM5LCAweDEwMzkgfSwKKwkJeyAweDEwNTgsIDB4MTA1OSB9LCB7IDB4MTE2MCwgMHgxMUZGIH0sIHsgMHgxMzVGLCAweDEzNUYgfSwKKwkJeyAweDE3MTIsIDB4MTcxNCB9LCB7IDB4MTczMiwgMHgxNzM0IH0sIHsgMHgxNzUyLCAweDE3NTMgfSwKKwkJeyAweDE3NzIsIDB4MTc3MyB9LCB7IDB4MTdCNCwgMHgxN0I1IH0sIHsgMHgxN0I3LCAweDE3QkQgfSwKKwkJeyAweDE3QzYsIDB4MTdDNiB9LCB7IDB4MTdDOSwgMHgxN0QzIH0sIHsgMHgxN0RELCAweDE3REQgfSwKKwkJeyAweDE4MEIsIDB4MTgwRCB9LCB7IDB4MThBOSwgMHgxOEE5IH0sIHsgMHgxOTIwLCAweDE5MjIgfSwKKwkJeyAweDE5MjcsIDB4MTkyOCB9LCB7IDB4MTkzMiwgMHgxOTMyIH0sIHsgMHgxOTM5LCAweDE5M0IgfSwKKwkJeyAweDFBMTcsIDB4MUExOCB9LCB7IDB4MUIwMCwgMHgxQjAzIH0sIHsgMHgxQjM0LCAweDFCMzQgfSwKKwkJeyAweDFCMzYsIDB4MUIzQSB9LCB7IDB4MUIzQywgMHgxQjNDIH0sIHsgMHgxQjQyLCAweDFCNDIgfSwKKwkJeyAweDFCNkIsIDB4MUI3MyB9LCB7IDB4MURDMCwgMHgxRENBIH0sIHsgMHgxREZFLCAweDFERkYgfSwKKwkJeyAweDIwMEIsIDB4MjAwRiB9LCB7IDB4MjAyQSwgMHgyMDJFIH0sIHsgMHgyMDYwLCAweDIwNjMgfSwKKwkJeyAweDIwNkEsIDB4MjA2RiB9LCB7IDB4MjBEMCwgMHgyMEVGIH0sIHsgMHgzMDJBLCAweDMwMkYgfSwKKwkJeyAweDMwOTksIDB4MzA5QSB9LCB7IDB4QTgwNiwgMHhBODA2IH0sIHsgMHhBODBCLCAweEE4MEIgfSwKKwkJeyAweEE4MjUsIDB4QTgyNiB9LCB7IDB4RkIxRSwgMHhGQjFFIH0sIHsgMHhGRTAwLCAweEZFMEYgfSwKKwkJeyAweEZFMjAsIDB4RkUyMyB9LCB7IDB4RkVGRiwgMHhGRUZGIH0sIHsgMHhGRkY5LCAweEZGRkIgfQorCX07CisJc2l6ZV90IG1pbiA9IDAsIG1pZCwgbWF4ID0gTkVMRU0oY29tYikgLSAxOworCisJLyogdGVzdCBmb3IgOC1iaXQgY29udHJvbCBjaGFyYWN0ZXJzICovCisJaWYgKGMgPCAzMiB8fCAoYyA+PSAweDdmICYmIGMgPCAweGEwKSkKKwkJcmV0dXJuIChjID8gLTEgOiAwKTsKKworCS8qIGJpbmFyeSBzZWFyY2ggaW4gdGFibGUgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycyAqLworCWlmIChjID49IGNvbWJbMF0uZmlyc3QgJiYgYyA8PSBjb21iW21heF0ubGFzdCkKKwkJd2hpbGUgKG1heCA+PSBtaW4pIHsKKwkJCW1pZCA9IChtaW4gKyBtYXgpIC8gMjsKKwkJCWlmIChjID4gY29tYlttaWRdLmxhc3QpCisJCQkJbWluID0gbWlkICsgMTsKKwkJCWVsc2UgaWYgKGMgPCBjb21iW21pZF0uZmlyc3QpCisJCQkJbWF4ID0gbWlkIC0gMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKDApOworCQl9CisKKwkvKiBpZiB3ZSBhcnJpdmUgaGVyZSwgYyBpcyBub3QgYSBjb21iaW5pbmcgb3IgQzAvQzEgY29udHJvbCBjaGFyICovCisJcmV0dXJuICgoYyA+PSAweDExMDAgJiYgKAorCSAgICBjIDw9IDB4MTE1ZiB8fCAvKiBIYW5ndWwgSmFtbyBpbml0LiBjb25zb25hbnRzICovCisJICAgIGMgPT0gMHgyMzI5IHx8IGMgPT0gMHgyMzJhIHx8CisJICAgIChjID49IDB4MmU4MCAmJiBjIDw9IDB4YTRjZiAmJiBjICE9IDB4MzAzZikgfHwgLyogQ0pLIC4uLiBZaSAqLworCSAgICAoYyA+PSAweGFjMDAgJiYgYyA8PSAweGQ3YTMpIHx8IC8qIEhhbmd1bCBTeWxsYWJsZXMgKi8KKwkgICAgKGMgPj0gMHhmOTAwICYmIGMgPD0gMHhmYWZmKSB8fCAvKiBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzICovCisJICAgIChjID49IDB4ZmUxMCAmJiBjIDw9IDB4ZmUxOSkgfHwgLyogVmVydGljYWwgZm9ybXMgKi8KKwkgICAgKGMgPj0gMHhmZTMwICYmIGMgPD0gMHhmZTZmKSB8fCAvKiBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyAqLworCSAgICAoYyA+PSAweGZmMDAgJiYgYyA8PSAweGZmNjApIHx8IC8qIEZ1bGx3aWR0aCBGb3JtcyAqLworCSAgICAoYyA+PSAweGZmZTAgJiYgYyA8PSAweGZmZTYpKSkgPyAyIDogMSk7Cit9CisvKiAtLS0gZW5kIG9mIHdjd2lkdGguYyBleGNlcnB0IC0tLSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9mdW5jcy5jIGIvbWtzaC9zcmMvZnVuY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDljMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvZnVuY3MuYwpAQCAtMCwwICsxLDM0MjkgQEAKKy8qCSRPcGVuQlNEOiBjX2tzaC5jLHYgMS4zMyAyMDA5LzAyLzA3IDE0OjAzOjI0IGtpbGkgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBjX3NoLmMsdiAxLjQxIDIwMTAvMDMvMjcgMDk6MTA6MDEgam1jIEV4cCAkCSovCisvKgkkT3BlbkJTRDogY190ZXN0LmMsdiAxLjE4IDIwMDkvMDMvMDEgMjA6MTE6MDYgb3R0byBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGNfdWxpbWl0LmMsdiAxLjE3IDIwMDgvMDMvMjEgMTI6NTE6MTkgbWlsbGVydCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2Z1bmNzLmMsdiAxLjE1NyAyMDEwLzA4LzI0IDE0OjQyOjAxIHRnIEV4cCAkIik7CisKKyNpZiBIQVZFX0tJTExQRworLyoKKyAqIHVzZSBraWxscGcgaWYgPCAtMSBzaW5jZSAtMSBkb2VzIHNwZWNpYWwgdGhpbmdzCisgKiBmb3Igc29tZSBub24ta2lsbHBnLWVuZG93ZWQga2lsbHMKKyAqLworI2RlZmluZSBta3NoX2tpbGwocCxzKQkoKHApIDwgLTEgPyBraWxscGcoLShwKSwgKHMpKSA6IGtpbGwoKHApLCAocykpKQorI2Vsc2UKKy8qIGNyb3NzIGZpbmdlcnMgYW5kIGhvcGUga2lsbCBpcyBraWxscGctZW5kb3dlZCAqLworI2RlZmluZSBta3NoX2tpbGwJa2lsbAorI2VuZGlmCisKKy8qIFhYWCBjb25kaXRpb25zIGNvcnJlY3Q/ICovCisjaWYgIWRlZmluZWQoUkxJTV9JTkZJTklUWSkgJiYgIWRlZmluZWQoTUtTSF9OT19MSU1JVFMpCisjZGVmaW5lIE1LU0hfTk9fTElNSVRTCisjZW5kaWYKKworI2lmZGVmIE1LU0hfTk9fTElNSVRTCisjZGVmaW5lIGNfdWxpbWl0IGNfbGFiZWwKKyNlbmRpZgorCitleHRlcm4gdWludDhfdCBzZXRfcmVmZmxhZzsKKworLyogQSBsZWFkaW5nID0gbWVhbnMgYXNzaWdubWVudHMgYmVmb3JlIGNvbW1hbmQgYXJlIGtlcHQ7CisgKiBhIGxlYWRpbmcgKiBtZWFucyBhIFBPU0lYIHNwZWNpYWwgYnVpbHRpbjsKKyAqIGEgbGVhZGluZyArIG1lYW5zIGEgUE9TSVggcmVndWxhciBidWlsdGluCisgKiAoKiBhbmQgKyBzaG91bGQgbm90IGJlIGNvbWJpbmVkKS4KKyAqLworY29uc3Qgc3RydWN0IGJ1aWx0aW4gbWtzaGJ1aWx0aW5zW10gPSB7CisJeyIqPS4iLCBjX2RvdH0sCisJeyIqPToiLCBjX2xhYmVsfSwKKwl7IlsiLCBjX3Rlc3R9LAorCXsiKj1icmVhayIsIGNfYnJrY29udH0sCisJeyI9YnVpbHRpbiIsIGNfYnVpbHRpbn0sCisJeyIqPWNvbnRpbnVlIiwgY19icmtjb250fSwKKwl7Iio9ZXZhbCIsIGNfZXZhbH0sCisJeyIqPWV4ZWMiLCBjX2V4ZWN9LAorCXsiKj1leGl0IiwgY19leGl0cmV0dXJufSwKKwl7IitmYWxzZSIsIGNfbGFiZWx9LAorCXsiKj1yZXR1cm4iLCBjX2V4aXRyZXR1cm59LAorCXsiKj1zZXQiLCBjX3NldH0sCisJeyIqPXNoaWZ0IiwgY19zaGlmdH0sCisJeyI9dGltZXMiLCBjX3RpbWVzfSwKKwl7Iio9dHJhcCIsIGNfdHJhcH0sCisJeyIrPXdhaXQiLCBjX3dhaXR9LAorCXsiK3JlYWQiLCBjX3JlYWR9LAorCXsidGVzdCIsIGNfdGVzdH0sCisJeyIrdHJ1ZSIsIGNfbGFiZWx9LAorCXsidWxpbWl0IiwgY191bGltaXR9LAorCXsiK3VtYXNrIiwgY191bWFza30sCisJeyIqPXVuc2V0IiwgY191bnNldH0sCisJeyIrYWxpYXMiLCBjX2FsaWFzfSwJLyogbm8gPTogQVQmVCBtYW51YWwgd3JvbmcgKi8KKwl7IitjZCIsIGNfY2R9LAorCXsiY2hkaXIiLCBjX2NkfSwJLyogZGFzaCBjb21wYXRpYmlsaXR5IGhhY2sgKi8KKwl7Iitjb21tYW5kIiwgY19jb21tYW5kfSwKKwl7ImVjaG8iLCBjX3ByaW50fSwKKwl7Iio9ZXhwb3J0IiwgY190eXBlc2V0fSwKKwl7IitmYyIsIGNfZmN9LAorCXsiK2dldG9wdHMiLCBjX2dldG9wdHN9LAorCXsiK2pvYnMiLCBjX2pvYnN9LAorCXsiK2tpbGwiLCBjX2tpbGx9LAorCXsibGV0IiwgY19sZXR9LAorCXsicHJpbnQiLCBjX3ByaW50fSwKKyNpZmRlZiBNS1NIX1BSSU5URl9CVUlMVElOCisJeyJwcmludGYiLCBjX3ByaW50Zn0sCisjZW5kaWYKKwl7InB3ZCIsIGNfcHdkfSwKKwl7Iio9cmVhZG9ubHkiLCBjX3R5cGVzZXR9LAorCXtUX190eXBlc2V0LCBjX3R5cGVzZXR9LAorCXsiK3VuYWxpYXMiLCBjX3VuYWxpYXN9LAorCXsid2hlbmNlIiwgY193aGVuY2V9LAorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwl7IitiZyIsIGNfZmdiZ30sCisJeyIrZmciLCBjX2ZnYmd9LAorI2VuZGlmCisJeyJiaW5kIiwgY19iaW5kfSwKKyNpZiBIQVZFX01LTk9ECisJeyJta25vZCIsIGNfbWtub2R9LAorI2VuZGlmCisJeyJyZWFscGF0aCIsIGNfcmVhbHBhdGh9LAorCXsicmVuYW1lIiwgY19yZW5hbWV9LAorCXtOVUxMLCAoaW50ICgqKShjb25zdCBjaGFyICoqKSlOVUxMfQorfTsKKworc3RydWN0IGtpbGxfaW5mbyB7CisJaW50IG51bV93aWR0aDsKKwlpbnQgbmFtZV93aWR0aDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdF9vcCB7CisJY2hhciBvcF90ZXh0WzRdOworCVRlc3Rfb3Agb3BfbnVtOworfSB1X29wc1tdID0geworCXsiLWEiLAlUT19GSUxBWFNUIH0sCisJeyItYiIsCVRPX0ZJTEJERVYgfSwKKwl7Ii1jIiwJVE9fRklMQ0RFViB9LAorCXsiLWQiLAlUT19GSUxJRCB9LAorCXsiLWUiLAlUT19GSUxFWFNUIH0sCisJeyItZiIsCVRPX0ZJTFJFRyB9LAorCXsiLUciLAlUT19GSUxHSUQgfSwKKwl7Ii1nIiwJVE9fRklMU0VURyB9LAorCXsiLWgiLAlUT19GSUxTWU0gfSwKKwl7Ii1IIiwJVE9fRklMQ0RGIH0sCisJeyItayIsCVRPX0ZJTFNUQ0sgfSwKKwl7Ii1MIiwJVE9fRklMU1lNIH0sCisJeyItbiIsCVRPX1NUTlpFIH0sCisJeyItTyIsCVRPX0ZJTFVJRCB9LAorCXsiLW8iLAlUT19PUFRJT04gfSwKKwl7Ii1wIiwJVE9fRklMRklGTyB9LAorCXsiLXIiLAlUT19GSUxSRCB9LAorCXsiLXMiLAlUT19GSUxHWiB9LAorCXsiLVMiLAlUT19GSUxTT0NLIH0sCisJeyItdCIsCVRPX0ZJTFRUIH0sCisJeyItdSIsCVRPX0ZJTFNFVFUgfSwKKwl7Ii13IiwJVE9fRklMV1IgfSwKKwl7Ii14IiwJVE9fRklMRVggfSwKKwl7Ii16IiwJVE9fU1RaRVIgfSwKKwl7IiIsCVRPX05PTk9QIH0KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHRfb3AgYl9vcHNbXSA9IHsKKwl7Ij0iLAlUT19TVEVRTCB9LAorCXsiPT0iLAlUT19TVEVRTCB9LAorCXsiIT0iLAlUT19TVE5FUSB9LAorCXsiPCIsCVRPX1NUTFQgfSwKKwl7Ij4iLAlUT19TVEdUIH0sCisJeyItZXEiLAlUT19JTlRFUSB9LAorCXsiLW5lIiwJVE9fSU5UTkUgfSwKKwl7Ii1ndCIsCVRPX0lOVEdUIH0sCisJeyItZ2UiLAlUT19JTlRHRSB9LAorCXsiLWx0IiwJVE9fSU5UTFQgfSwKKwl7Ii1sZSIsCVRPX0lOVExFIH0sCisJeyItZWYiLAlUT19GSUxFUSB9LAorCXsiLW50IiwJVE9fRklMTlQgfSwKKwl7Ii1vdCIsCVRPX0ZJTE9UIH0sCisJeyIiLAlUT19OT05PUCB9Cit9OworCitzdGF0aWMgaW50IHRlc3RfZWFjY2Vzcyhjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IHRlc3Rfb2V4cHIoVGVzdF9lbnYgKiwgYm9vbCk7CitzdGF0aWMgaW50IHRlc3RfYWV4cHIoVGVzdF9lbnYgKiwgYm9vbCk7CitzdGF0aWMgaW50IHRlc3RfbmV4cHIoVGVzdF9lbnYgKiwgYm9vbCk7CitzdGF0aWMgaW50IHRlc3RfcHJpbWFyeShUZXN0X2VudiAqLCBib29sKTsKK3N0YXRpYyBUZXN0X29wIHB0ZXN0X2lzYShUZXN0X2VudiAqLCBUZXN0X21ldGEpOworc3RhdGljIGNvbnN0IGNoYXIgKnB0ZXN0X2dldG9wbmQoVGVzdF9lbnYgKiwgVGVzdF9vcCwgYm9vbCk7CitzdGF0aWMgdm9pZCBwdGVzdF9lcnJvcihUZXN0X2VudiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgY2hhciAqa2lsbF9mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIHBfdGltZShzdHJ1Y3Qgc2hmICosIGJvb2wsIGxvbmcsIGludCwgaW50LAorICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKQorICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICg2LCA3KSkpOworc3RhdGljIGNoYXIgKmRvX3JlYWxwYXRoKGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyBjaGFyICoKK2RvX3JlYWxwYXRoKGNvbnN0IGNoYXIgKnVwYXRoKQoreworCWNoYXIgKnhwLCAqaXAsICp0cCwgKmlwYXRoLCAqbGRlc3QgPSBOVUxMOworCVhTdHJpbmcgeHM7CisJcHRyZGlmZl90IHBvczsKKwlzaXplX3QgbGVuOworCWludCBzeW1saW5rcyA9IDMyOwkvKiBtYXguIHJlY3Vyc2lvbiBkZXB0aCAqLworCWludCBsbGVuOworCXN0cnVjdCBzdGF0IHNiOworI2lmZGVmIE5PX1BBVEhfTUFYCisJc2l6ZV90IGxkZXN0bGVuID0gMDsKKyNkZWZpbmUgcGF0aGxlbiBzYi5zdF9zaXplCisjZGVmaW5lIHBhdGhjbmQgKGxkZXN0bGVuIDwgKHBhdGhsZW4gKyAxKSkKKyNlbHNlCisjZGVmaW5lIHBhdGhsZW4gUEFUSF9NQVgKKyNkZWZpbmUgcGF0aGNuZCAoIWxkZXN0KQorI2VuZGlmCisKKwlpZiAodXBhdGhbMF0gPT0gJy8nKSB7CisJCS8qIHVwYXRoIGlzIGFuIGFic29sdXRlIHBhdGhuYW1lICovCisJCXN0cmR1cHgoaXBhdGgsIHVwYXRoLCBBVEVNUCk7CisJfSBlbHNlIHsKKwkJLyogdXBhdGggaXMgYSByZWxhdGl2ZSBwYXRobmFtZSwgcHJlcGVuZCBjd2QgKi8KKwkJaWYgKCh0cCA9IGtzaF9nZXRfd2QoTlVMTCkpID09IE5VTEwgfHwgdHBbMF0gIT0gJy8nKQorCQkJcmV0dXJuIChOVUxMKTsKKwkJaXBhdGggPSBzaGZfc21wcmludGYoIiVzLyVzIiwgdHAsIHVwYXRoKTsKKwkJYWZyZWUodHAsIEFURU1QKTsKKwl9CisKKwlYaW5pdCh4cywgeHAsIHN0cmxlbihpcCA9IGlwYXRoKSArIDEsIEFURU1QKTsKKworCXdoaWxlICgqaXApIHsKKwkJLyogc2tpcCBzbGFzaGVzIGluIGlucHV0ICovCisJCXdoaWxlICgqaXAgPT0gJy8nKQorCQkJKytpcDsKKwkJaWYgKCEqaXApCisJCQlicmVhazsKKworCQkvKiBnZXQgbmV4dCBwYXRobmFtZSBjb21wb25lbnQgZnJvbSBpbnB1dCAqLworCQl0cCA9IGlwOworCQl3aGlsZSAoKmlwICYmICppcCAhPSAnLycpCisJCQkrK2lwOworCQlsZW4gPSBpcCAtIHRwOworCisJCS8qIGNoZWNrIGlucHV0IGZvciAiLiIgYW5kICIuLiIgKi8KKwkJaWYgKHRwWzBdID09ICcuJykgeworCQkJaWYgKGxlbiA9PSAxKQorCQkJCS8qIGp1c3QgY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUgKi8KKwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKGxlbiA9PSAyICYmIHRwWzFdID09ICcuJykgeworCQkJCS8qIHN0cmlwIG9mZiBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudCAqLworCQkJCXdoaWxlICh4cCA+IFhzdHJpbmcoeHMsIHhwKSkKKwkJCQkJaWYgKCotLXhwID09ICcvJykKKwkJCQkJCWJyZWFrOworCQkJCS8qIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIHN0b3JlIG91dHB1dCBwb3NpdGlvbiBhd2F5LCB0aGVuIGFwcGVuZCBzbGFzaCB0byBvdXRwdXQgKi8KKwkJcG9zID0gWHNhdmVwb3MoeHMsIHhwKTsKKwkJLyogMSBmb3IgdGhlICcvJyBhbmQgbGVuICsgMSBmb3IgdHAgYW5kIHRoZSBOVUwgZnJvbSBiZWxvdyAqLworCQlYY2hlY2tOKHhzLCB4cCwgMSArIGxlbiArIDEpOworCQlYcHV0KHhzLCB4cCwgJy8nKTsKKworCQkvKiBhcHBlbmQgbmV4dCBwYXRobmFtZSBjb21wb25lbnQgdG8gb3V0cHV0ICovCisJCW1lbWNweSh4cCwgdHAsIGxlbik7CisJCXhwICs9IGxlbjsKKwkJKnhwID0gJ1wwJzsKKworCQkvKiBsc3RhdCB0aGUgY3VycmVudCBvdXRwdXQsIHNlZSBpZiBpdCdzIGEgc3ltbGluayAqLworCQlpZiAobHN0YXQoWHN0cmluZyh4cywgeHApLCAmc2IpKSB7CisJCQkvKiBsc3RhdCBmYWlsZWQgKi8KKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCQkvKiBiZWNhdXNlIHRoZSBwYXRobmFtZSBkb2VzIG5vdCBleGlzdCAqLworCQkJCXdoaWxlICgqaXAgPT0gJy8nKQorCQkJCQkvKiBza2lwIGFueSB0cmFpbGluZyBzbGFzaGVzICovCisJCQkJCSsraXA7CisJCQkJLyogbm8gbW9yZSBjb21wb25lbnRzIGxlZnQ/ICovCisJCQkJaWYgKCEqaXApCisJCQkJCS8qIHdlIGNhbiBzdGlsbCByZXR1cm4gc3VjY2Vzc2Z1bGx5ICovCisJCQkJCWJyZWFrOworCQkJCS8qIG1vcmUgY29tcG9uZW50cyBsZWZ0PyBmYWxsIHRocm91Z2ggKi8KKwkJCX0KKwkJCS8qIG5vdCBFTk9FTlQgb3Igbm90IGF0IHRoZSBlbmQgb2YgaXBhdGggKi8KKwkJCWdvdG8gbm90Zm91bmQ7CisJCX0KKworCQkvKiBjaGVjayBpZiB3ZSBlbmNvdW50ZXJlZCBhIHN5bWxpbms/ICovCisJCWlmIChTX0lTTE5LKHNiLnN0X21vZGUpKSB7CisJCQkvKiByZWFjaGVkIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoPyAqLworCQkJaWYgKCFzeW1saW5rcy0tKSB7CisJCQkJLyogeWVwLCBwcmV2ZW50IGluZmluaXRlIGxvb3BzICovCisJCQkJZXJybm8gPSBFTE9PUDsKKwkJCQlnb3RvIG5vdGZvdW5kOworCQkJfQorCisJCQkvKiBnZXQgc3ltbGluayg3KSB0YXJnZXQgKi8KKwkJCWlmIChwYXRoY25kKQorCQkJCWxkZXN0ID0gYXJlc2l6ZShsZGVzdCwgcGF0aGxlbiArIDEsIEFURU1QKTsKKwkJCWxsZW4gPSByZWFkbGluayhYc3RyaW5nKHhzLCB4cCksIGxkZXN0LCBwYXRobGVuKTsKKwkJCWlmIChsbGVuIDwgMCkKKwkJCQkvKiBvb3BzLi4uICovCisJCQkJZ290byBub3Rmb3VuZDsKKwkJCWxkZXN0W2xsZW5dID0gJ1wwJzsKKworCQkJLyoKKwkJCSAqIHJlc3RhcnQgaWYgc3ltbGluayB0YXJnZXQgaXMgYW4gYWJzb2x1dGUgcGF0aCwKKwkJCSAqIG90aGVyd2lzZSBjb250aW51ZSB3aXRoIGN1cnJlbnRseSByZXNvbHZlZCBwcmVmaXgKKwkJCSAqLworCQkJeHAgPSAobGRlc3RbMF0gPT0gJy8nKSA/IFhzdHJpbmcoeHMsIHhwKSA6CisJCQkgICAgWHJlc3Rwb3MoeHMsIHhwLCBwb3MpOworCQkJdHAgPSBzaGZfc21wcmludGYoIiVzJXMlcyIsIGxkZXN0LCAqaXAgPyAiLyIgOiAiIiwgaXApOworCQkJYWZyZWUoaXBhdGgsIEFURU1QKTsKKwkJCWlwID0gaXBhdGggPSB0cDsKKwkJfQorCQkvKiBvdGhlcndpc2UgKG5vIHN5bWxpbmspIG1lcmVseSBnbyBvbiAqLworCX0KKworCS8qCisJICogZWl0aGVyIGZvdW5kIHRoZSB0YXJnZXQgYW5kIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBpdCwKKwkgKiBvciBmb3VuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBhbmQgbWF5IGNyZWF0ZSBpdAorCSAqLworCWlmIChYbGVuZ3RoKHhzLCB4cCkgPT0gMCkKKwkJLyoKKwkJICogaWYgdGhlIHJlc29sdmVkIHBhdGhuYW1lIGlzICIiLCBtYWtlIGl0ICIvIiwKKwkJICogb3RoZXJ3aXNlIGRvIG5vdCBhZGQgYSB0cmFpbGluZyBzbGFzaAorCQkgKi8KKwkJWHB1dCh4cywgeHAsICcvJyk7CisJWHB1dCh4cywgeHAsICdcMCcpOworCisJLyoKKwkgKiBpZiBzb3VyY2UgcGF0aCBoYWQgYSB0cmFpbGluZyBzbGFzaCwgY2hlY2sgaWYgdGFyZ2V0IHBhdGgKKwkgKiBpcyBub3QgYSBub24tZGlyZWN0b3J5IGV4aXN0aW5nIGZpbGUKKwkgKi8KKwlpZiAoaXAgPiBpcGF0aCAmJiBpcFstMV0gPT0gJy8nKSB7CisJCWlmIChzdGF0KFhzdHJpbmcoeHMsIHhwKSwgJnNiKSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCQlnb3RvIG5vdGZvdW5kOworCQl9IGVsc2UgaWYgKCFTX0lTRElSKHNiLnN0X21vZGUpKSB7CisJCQllcnJubyA9IEVOT1RESVI7CisJCQlnb3RvIG5vdGZvdW5kOworCQl9CisJCS8qIHRhcmdldCBub3cgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIGEgZGlyZWN0b3J5ICovCisJfQorCisJLyogcmV0dXJuIHRhcmdldCBwYXRoICovCisJaWYgKGxkZXN0ICE9IE5VTEwpCisJCWFmcmVlKGxkZXN0LCBBVEVNUCk7CisJYWZyZWUoaXBhdGgsIEFURU1QKTsKKwlyZXR1cm4gKFhjbG9zZSh4cywgeHApKTsKKworIG5vdGZvdW5kOgorCWxsZW4gPSBlcnJubzsJLyogc2F2ZTsgZnJlZSgzKSBtaWdodCB0cmFzaCBpdCAqLworCWlmIChsZGVzdCAhPSBOVUxMKQorCQlhZnJlZShsZGVzdCwgQVRFTVApOworCWFmcmVlKGlwYXRoLCBBVEVNUCk7CisJWGZyZWUoeHMsIHhwKTsKKwllcnJubyA9IGxsZW47CisJcmV0dXJuIChOVUxMKTsKKworI3VuZGVmIHBhdGhsZW4KKyN1bmRlZiBwYXRoY25kCit9CisKK2ludAorY19jZChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IG9wdGMsIHJ2LCBwaHlzX3BhdGg7CisJYm9vbCBwaHlzaWNhbCA9IEZsYWcoRlBIWVNJQ0FMKSA/IHRydWUgOiBmYWxzZTsKKwlpbnQgY2Rub2RlOwkJCS8qIHdhcyBhIG5vZGUgZnJvbSBjZHBhdGggYWRkZWQgaW4/ICovCisJYm9vbCBwcmludHBhdGggPSBmYWxzZTsJCS8qIHByaW50IHdoZXJlIHdlIGNkJ2Q/ICovCisJc3RydWN0IHRibCAqcHdkX3MsICpvbGRwd2RfczsKKwlYU3RyaW5nIHhzOworCWNoYXIgKmRpciwgKmFsbG9jZCA9IE5VTEwsICp0cnlwLCAqcHdkLCAqY2RwYXRoOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiTFAiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdMJzoKKwkJCXBoeXNpY2FsID0gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlwaHlzaWNhbCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJaWYgKEZsYWcoRlJFU1RSSUNURUQpKSB7CisJCWJpX2Vycm9yZigicmVzdHJpY3RlZCBzaGVsbCAtIGNhbid0IGNkIik7CisJCXJldHVybiAoMSk7CisJfQorCisJcHdkX3MgPSBnbG9iYWwoIlBXRCIpOworCW9sZHB3ZF9zID0gZ2xvYmFsKCJPTERQV0QiKTsKKworCWlmICghd3BbMF0pIHsKKwkJLyogTm8gYXJndW1lbnRzIC0gZ28gaG9tZSAqLworCQlpZiAoKGRpciA9IHN0cl92YWwoZ2xvYmFsKCJIT01FIikpKSA9PSBudWxsKSB7CisJCQliaV9lcnJvcmYoIm5vIGhvbWUgZGlyZWN0b3J5IChIT01FIG5vdCBzZXQpIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfSBlbHNlIGlmICghd3BbMV0pIHsKKwkJLyogT25lIGFyZ3VtZW50OiAtIG9yIGRpciAqLworCQlzdHJkdXB4KGFsbG9jZCwgd3BbMF0sIEFURU1QKTsKKwkJaWYgKGtzaF9pc2Rhc2goKGRpciA9IGFsbG9jZCkpKSB7CisJCQlhZnJlZShhbGxvY2QsIEFURU1QKTsKKwkJCWFsbG9jZCA9IE5VTEw7CisJCQlkaXIgPSBzdHJfdmFsKG9sZHB3ZF9zKTsKKwkJCWlmIChkaXIgPT0gbnVsbCkgeworCQkJCWJpX2Vycm9yZigibm8gT0xEUFdEIik7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCXByaW50cGF0aCA9IHRydWU7CisJCX0KKwl9IGVsc2UgaWYgKCF3cFsyXSkgeworCQkvKiBUd28gYXJndW1lbnRzIC0gc3Vic3RpdHV0ZSBhcmcxIGluIFBXRCBmb3IgYXJnMiAqLworCQlpbnQgaWxlbiwgb2xlbiwgbmxlbiwgZWxlbjsKKwkJY2hhciAqY3A7CisKKwkJaWYgKCFjdXJyZW50X3dkWzBdKSB7CisJCQliaV9lcnJvcmYoImRvbid0IGtub3cgY3VycmVudCBkaXJlY3RvcnkiKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJLyogc3Vic3RpdHV0ZSBhcmcxIGZvciBhcmcyIGluIGN1cnJlbnQgcGF0aC4KKwkJICogaWYgdGhlIGZpcnN0IHN1YnN0aXR1dGlvbiBmYWlscyBiZWNhdXNlIHRoZSBjZCBmYWlscworCQkgKiB3ZSBjb3VsZCB0cnkgdG8gZmluZCBhbm90aGVyIHN1YnN0aXR1dGlvbi4gRm9yIG5vdworCQkgKiB3ZSBkb24ndAorCQkgKi8KKwkJaWYgKChjcCA9IHN0cnN0cihjdXJyZW50X3dkLCB3cFswXSkpID09IE5VTEwpIHsKKwkJCWJpX2Vycm9yZigiYmFkIHN1YnN0aXR1dGlvbiIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlpbGVuID0gY3AgLSBjdXJyZW50X3dkOworCQlvbGVuID0gc3RybGVuKHdwWzBdKTsKKwkJbmxlbiA9IHN0cmxlbih3cFsxXSk7CisJCWVsZW4gPSBzdHJsZW4oY3VycmVudF93ZCArIGlsZW4gKyBvbGVuKSArIDE7CisJCWRpciA9IGFsbG9jZCA9IGFsbG9jKGlsZW4gKyBubGVuICsgZWxlbiwgQVRFTVApOworCQltZW1jcHkoZGlyLCBjdXJyZW50X3dkLCBpbGVuKTsKKwkJbWVtY3B5KGRpciArIGlsZW4sIHdwWzFdLCBubGVuKTsKKwkJbWVtY3B5KGRpciArIGlsZW4gKyBubGVuLCBjdXJyZW50X3dkICsgaWxlbiArIG9sZW4sIGVsZW4pOworCQlwcmludHBhdGggPSB0cnVlOworCX0gZWxzZSB7CisJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCXJldHVybiAoMSk7CisJfQorCisjaWZkZWYgTk9fUEFUSF9NQVgKKwkvKiBvbmx5IGEgZmlyc3QgZ3Vlc3M7IG1ha2VfcGF0aCB3aWxsIGVubGFyZ2UgeHMgaWYgbmVjZXNzYXJ5ICovCisJWGluaXROKHhzLCAxMDI0LCBBVEVNUCk7CisjZWxzZQorCVhpbml0Tih4cywgUEFUSF9NQVgsIEFURU1QKTsKKyNlbmRpZgorCisJY2RwYXRoID0gc3RyX3ZhbChnbG9iYWwoIkNEUEFUSCIpKTsKKwlkbyB7CisJCWNkbm9kZSA9IG1ha2VfcGF0aChjdXJyZW50X3dkLCBkaXIsICZjZHBhdGgsICZ4cywgJnBoeXNfcGF0aCk7CisJCWlmIChwaHlzaWNhbCkKKwkJCXJ2ID0gY2hkaXIodHJ5cCA9IFhzdHJpbmcoeHMsIHhwKSArIHBoeXNfcGF0aCk7CisJCWVsc2UgeworCQkJc2ltcGxpZnlfcGF0aChYc3RyaW5nKHhzLCB4cCkpOworCQkJcnYgPSBjaGRpcih0cnlwID0gWHN0cmluZyh4cywgeHApKTsKKwkJfQorCX0gd2hpbGUgKHJ2IDwgMCAmJiBjZHBhdGggIT0gTlVMTCk7CisKKwlpZiAocnYgPCAwKSB7CisJCWlmIChjZG5vZGUpCisJCQliaV9lcnJvcmYoIiVzOiBiYWQgZGlyZWN0b3J5IiwgZGlyKTsKKwkJZWxzZQorCQkJYmlfZXJyb3JmKCIlcyAtICVzIiwgdHJ5cCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJYWZyZWUoYWxsb2NkLCBBVEVNUCk7CisJCXJldHVybiAoMSk7CisJfQorCisJLyogYWxsb2NkIChhYm92ZSkgPT4gZGlyLCB3aGljaCBpcyBubyBsb25nZXIgdXNlZCAqLworCWFmcmVlKGFsbG9jZCwgQVRFTVApOworCWFsbG9jZCA9IE5VTEw7CisKKwkvKiBDbGVhciBvdXQgdHJhY2tlZCBhbGlhc2VzIHdpdGggcmVsYXRpdmUgcGF0aHMgKi8KKwlmbHVzaGNvbSgwKTsKKworCS8qIFNldCBPTERQV0QgKG5vdGU6IHVuc2V0dGluZyBPTERQV0QgZG9lcyBub3QgZGlzYWJsZSB0aGlzCisJICogc2V0dGluZyBpbiBBVCZUIGtzaCkKKwkgKi8KKwlpZiAoY3VycmVudF93ZFswXSkKKwkJLyogSWdub3JlIGZhaWx1cmUgKGhhcHBlbnMgaWYgcmVhZG9ubHkgb3IgaW50ZWdlcikgKi8KKwkJc2V0c3RyKG9sZHB3ZF9zLCBjdXJyZW50X3dkLCBLU0hfUkVUVVJOX0VSUk9SKTsKKworCWlmIChYc3RyaW5nKHhzLCB4cClbMF0gIT0gJy8nKSB7CisJCXB3ZCA9IE5VTEw7CisJfSBlbHNlIGlmICghcGh5c2ljYWwgfHwgIShwd2QgPSBhbGxvY2QgPSBkb19yZWFscGF0aChYc3RyaW5nKHhzLCB4cCkpKSkKKwkJcHdkID0gWHN0cmluZyh4cywgeHApOworCisJLyogU2V0IFBXRCAqLworCWlmIChwd2QpIHsKKwkJY2hhciAqcHRtcCA9IHB3ZDsKKworCQlzZXRfY3VycmVudF93ZChwdG1wKTsKKwkJLyogSWdub3JlIGZhaWx1cmUgKGhhcHBlbnMgaWYgcmVhZG9ubHkgb3IgaW50ZWdlcikgKi8KKwkJc2V0c3RyKHB3ZF9zLCBwdG1wLCBLU0hfUkVUVVJOX0VSUk9SKTsKKwl9IGVsc2UgeworCQlzZXRfY3VycmVudF93ZChudWxsKTsKKwkJcHdkID0gWHN0cmluZyh4cywgeHApOworCQkvKiBYWFggdW5zZXQgJFBXRD8gKi8KKwl9CisJaWYgKHByaW50cGF0aCB8fCBjZG5vZGUpCisJCXNocHJpbnRmKCIlc1xuIiwgcHdkKTsKKworCWFmcmVlKGFsbG9jZCwgQVRFTVApOworCXJldHVybiAoMCk7Cit9CisKK2ludAorY19wd2QoY29uc3QgY2hhciAqKndwKQoreworCWludCBvcHRjOworCWJvb2wgcGh5c2ljYWwgPSBGbGFnKEZQSFlTSUNBTCkgPyB0cnVlIDogZmFsc2U7CisJY2hhciAqcCwgKmFsbG9jZCA9IE5VTEw7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJMUCIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ0wnOgorCQkJcGh5c2ljYWwgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCXBoeXNpY2FsID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlpZiAod3BbMF0pIHsKKwkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJcCA9IGN1cnJlbnRfd2RbMF0gPyAocGh5c2ljYWwgPyBhbGxvY2QgPSBkb19yZWFscGF0aChjdXJyZW50X3dkKSA6CisJICAgIGN1cnJlbnRfd2QpIDogTlVMTDsKKwlpZiAocCAmJiBhY2Nlc3MocCwgUl9PSykgPCAwKQorCQlwID0gTlVMTDsKKwlpZiAoIXAgJiYgIShwID0gYWxsb2NkID0ga3NoX2dldF93ZChOVUxMKSkpIHsKKwkJYmlfZXJyb3JmKCJjYW4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMSk7CisJfQorCXNocHJpbnRmKCIlc1xuIiwgcCk7CisJYWZyZWUoYWxsb2NkLCBBVEVNUCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNfcHRyOworc3RhdGljIGludCBzX2dldCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNfcHV0KGludCk7CisKK2ludAorY19wcmludChjb25zdCBjaGFyICoqd3ApCit7CisjZGVmaW5lIFBPX05MCQlCSVQoMCkJLyogcHJpbnQgbmV3bGluZSAqLworI2RlZmluZSBQT19FWFBBTkQJQklUKDEpCS8qIGV4cGFuZCBiYWNrc2xhc2ggc2VxdWVuY2VzICovCisjZGVmaW5lIFBPX1BNSU5VU01JTlVTCUJJVCgyKQkvKiBwcmludCBhIC0tIGFyZ3VtZW50ICovCisjZGVmaW5lIFBPX0hJU1QJCUJJVCgzKQkvKiBwcmludCB0byBoaXN0b3J5IGluc3RlYWQgb2Ygc3Rkb3V0ICovCisjZGVmaW5lIFBPX0NPUFJPQwlCSVQoNCkJLyogcHJpbnRpbmcgdG8gY29wcm9jZXNzOiBibG9jayBTSUdQSVBFICovCisJaW50IGZkID0gMSwgYzsKKwlpbnQgZmxhZ3MgPSBQT19FWFBBTkR8UE9fTkw7CisJY29uc3QgY2hhciAqcywgKmVtc2c7CisJWFN0cmluZyB4czsKKwljaGFyICp4cDsKKworCWlmICh3cFswXVswXSA9PSAnZScpIHsKKwkJLyogZWNobyBidWlsdGluICovCisJCXdwKys7CisJCWlmIChGbGFnKEZQT1NJWCkgfHwgRmxhZyhGU0gpKSB7CisJCQkvKiBEZWJpYW4gUG9saWN5IDEwLjQgY29tcGxpYW50ICJlY2hvIiBidWlsdGluICovCisJCQlpZiAoKndwICYmICFzdHJjbXAoKndwLCAiLW4iKSkgeworCQkJCS8qIHdlIHJlY29nbmlzZSAiLW4iIG9ubHkgYXMgdGhlIGZpcnN0IGFyZyAqLworCQkJCWZsYWdzID0gMDsKKwkJCQl3cCsrOworCQkJfSBlbHNlCisJCQkJLyogb3RoZXJ3aXNlLCB3ZSBwcmludCBldmVyeXRoaW5nIGFzLWlzICovCisJCQkJZmxhZ3MgPSBQT19OTDsKKwkJfSBlbHNlIHsKKwkJCWludCBuZmxhZ3MgPSBmbGFnczsKKworCQkJLyoqCisJCQkgKiBhIGNvbXByb21pc2UgYmV0d2VlbiBzeXNWIGFuZCBCU0QgZWNobyBjb21tYW5kczoKKwkJCSAqIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgYW5kIC1uLAorCQkJICogLWUgYW5kIC1FIGFyZSByZWNvZ25pc2VkIGlmIHRoZXkgYXBwZWFyIGluIGFyZ3UtCisJCQkgKiBtZW50cyB3aXRoIG5vIGlsbGVnYWwgb3B0aW9ucyAoaWUsIGVjaG8gLW5xIHdpbGwKKwkJCSAqIHByaW50IC1ucSkuCisJCQkgKiBEaWZmZXJlbnQgZnJvbSBzeXNWIGVjaG8gc2luY2Ugb3B0aW9ucyBhcmUgcmVjby0KKwkJCSAqIGduaXNlZCwgZGlmZmVyZW50IGZyb20gQlNEIGVjaG8gc2luY2UgZXNjYXBlIHNlLQorCQkJICogcXVlbmNlcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorCQkJICovCisKKwkJCXdoaWxlICgocyA9ICp3cCkgJiYgKnMgPT0gJy0nICYmIHNbMV0pIHsKKwkJCQl3aGlsZSAoKisrcykKKwkJCQkJaWYgKCpzID09ICduJykKKwkJCQkJCW5mbGFncyAmPSB+UE9fTkw7CisJCQkJCWVsc2UgaWYgKCpzID09ICdlJykKKwkJCQkJCW5mbGFncyB8PSBQT19FWFBBTkQ7CisJCQkJCWVsc2UgaWYgKCpzID09ICdFJykKKwkJCQkJCW5mbGFncyAmPSB+UE9fRVhQQU5EOworCQkJCQllbHNlCisJCQkJCQkvKgorCQkJCQkJICogYmFkIG9wdGlvbjogZG9uJ3QgdXNlCisJCQkJCQkgKiBuZmxhZ3MsIHByaW50IGFyZ3VtZW50CisJCQkJCQkgKi8KKwkJCQkJCWJyZWFrOworCisJCQkJaWYgKCpzKQorCQkJCQlicmVhazsKKwkJCQl3cCsrOworCQkJCWZsYWdzID0gbmZsYWdzOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaW50IG9wdGM7CisJCWNvbnN0IGNoYXIgKm9wdHMgPSAiUm5wcnN1LCI7CisKKwkJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBvcHRzKSkgIT0gLTEpCisJCQlzd2l0Y2ggKG9wdGMpIHsKKwkJCWNhc2UgJ1InOiAvKiBmYWtlIEJTRCBlY2hvIGNvbW1hbmQgKi8KKwkJCQlmbGFncyB8PSBQT19QTUlOVVNNSU5VUzsKKwkJCQlmbGFncyAmPSB+UE9fRVhQQU5EOworCQkJCW9wdHMgPSAibmUiOworCQkJCWJyZWFrOworCQkJY2FzZSAnZSc6CisJCQkJZmxhZ3MgfD0gUE9fRVhQQU5EOworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJZmxhZ3MgJj0gflBPX05MOworCQkJCWJyZWFrOworCQkJY2FzZSAncCc6CisJCQkJaWYgKChmZCA9IGNvcHJvY19nZXRmZChXX09LLCAmZW1zZykpIDwgMCkgeworCQkJCQliaV9lcnJvcmYoIi1wOiAlcyIsIGVtc2cpOworCQkJCQlyZXR1cm4gKDEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgorCQkJCWZsYWdzICY9IH5QT19FWFBBTkQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCQlmbGFncyB8PSBQT19ISVNUOworCQkJCWJyZWFrOworCQkJY2FzZSAndSc6CisJCQkJaWYgKCEqKHMgPSBidWlsdGluX29wdC5vcHRhcmcpKQorCQkJCQlmZCA9IDA7CisJCQkJZWxzZSBpZiAoKGZkID0gY2hlY2tfZmQocywgV19PSywgJmVtc2cpKSA8IDApIHsKKwkJCQkJYmlfZXJyb3JmKCItdTogJXM6ICVzIiwgcywgZW1zZyk7CisJCQkJCXJldHVybiAoMSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnPyc6CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKworCQlpZiAoIShidWlsdGluX29wdC5pbmZvICYgR0lfTUlOVVNNSU5VUykpIHsKKwkJCS8qIHRyZWF0IGEgbG9uZSAtIGxpa2UgLS0gKi8KKwkJCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdICYmCisJCQkgICAga3NoX2lzZGFzaCh3cFtidWlsdGluX29wdC5vcHRpbmRdKSkKKwkJCQlidWlsdGluX29wdC5vcHRpbmQrKzsKKwkJfSBlbHNlIGlmIChmbGFncyAmIFBPX1BNSU5VU01JTlVTKQorCQkJYnVpbHRpbl9vcHQub3B0aW5kLS07CisJCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwl9CisKKwlYaW5pdCh4cywgeHAsIDEyOCwgQVRFTVApOworCisJd2hpbGUgKCp3cCAhPSBOVUxMKSB7CisJCXMgPSAqd3A7CisJCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKwkJCVhjaGVjayh4cywgeHApOworCQkJaWYgKChmbGFncyAmIFBPX0VYUEFORCkgJiYgYyA9PSAnXFwnKSB7CisJCQkJc19wdHIgPSBzOworCQkJCWMgPSB1bmJrc2woZmFsc2UsIHNfZ2V0LCBzX3B1dCk7CisJCQkJcyA9IHNfcHRyOworCQkJCWlmIChjID09IC0xKSB7CisJCQkJCS8qIHJlamVjdGVkIGJ5IGdlbmVyaWMgZnVuY3Rpb24gKi8KKwkJCQkJc3dpdGNoICgoYyA9ICpzKyspKSB7CisJCQkJCWNhc2UgJ2MnOgorCQkJCQkJZmxhZ3MgJj0gflBPX05MOworCQkJCQkJLyogQVQmVCBicmFpbiBkYW1hZ2UgKi8KKwkJCQkJCWNvbnRpbnVlOworCQkJCQljYXNlICdcMCc6CisJCQkJCQlzLS07CisJCQkJCQljID0gJ1xcJzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJWHB1dCh4cywgeHAsICdcXCcpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICgodW5zaWduZWQgaW50KWMgPiAweEZGKSB7CisJCQkJCS8qIGdlbmVyaWMgZnVuY3Rpb24gcmV0dXJuZWQgVW5pY29kZSAqLworCQkJCQljaGFyIHRzWzRdOworCisJCQkJCWMgPSB1dGZfd2N0b21iKHRzLCBjIC0gMHgxMDApOworCQkJCQl0c1tjXSA9IDA7CisJCQkJCWZvciAoYyA9IDA7IHRzW2NdOyArK2MpCisJCQkJCQlYcHV0KHhzLCB4cCwgdHNbY10pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlYcHV0KHhzLCB4cCwgYyk7CisJCX0KKwkJaWYgKCorK3dwICE9IE5VTEwpCisJCQlYcHV0KHhzLCB4cCwgJyAnKTsKKwl9CisJaWYgKGZsYWdzICYgUE9fTkwpCisJCVhwdXQoeHMsIHhwLCAnXG4nKTsKKworCWlmIChmbGFncyAmIFBPX0hJU1QpIHsKKwkJWHB1dCh4cywgeHAsICdcMCcpOworCQloaXN0c2F2ZSgmc291cmNlLT5saW5lLCBYc3RyaW5nKHhzLCB4cCksIHRydWUsIGZhbHNlKTsKKwkJWGZyZWUoeHMsIHhwKTsKKwl9IGVsc2UgeworCQlpbnQgbGVuID0gWGxlbmd0aCh4cywgeHApOworCQlpbnQgb3BpcGUgPSAwOworCisJCS8qIEVuc3VyZSB3ZSBhcmVuJ3Qga2lsbGVkIGJ5IGEgU0lHUElQRSB3aGlsZSB3cml0aW5nIHRvCisJCSAqIGEgY29wcm9jZXNzLiBBVCZUIGtzaCBkb2Vzbid0IHNlZW0gdG8gZG8gdGhpcyAoc2VlbXMKKwkJICogdG8ganVzdCBjaGVjayB0aGF0IHRoZSBjby1wcm9jZXNzIGlzIGFsaXZlIHdoaWNoIGlzCisJCSAqIG5vdCBlbm91Z2gpLgorCQkgKi8KKwkJaWYgKGNvcHJvYy53cml0ZSA+PSAwICYmIGNvcHJvYy53cml0ZSA9PSBmZCkgeworCQkJZmxhZ3MgfD0gUE9fQ09QUk9DOworCQkJb3BpcGUgPSBibG9ja19waXBlKCk7CisJCX0KKwkJZm9yIChzID0gWHN0cmluZyh4cywgeHApOyBsZW4gPiAwOyApIHsKKwkJCWlmICgoYyA9IHdyaXRlKGZkLCBzLCBsZW4pKSA8IDApIHsKKwkJCQlpZiAoZmxhZ3MgJiBQT19DT1BST0MpCisJCQkJCXJlc3RvcmVfcGlwZShvcGlwZSk7CisJCQkJaWYgKGVycm5vID09IEVJTlRSKSB7CisJCQkJCS8qIGFsbG93IHVzZXIgdG8gXkMgb3V0ICovCisJCQkJCWludHJjaGVjaygpOworCQkJCQlpZiAoZmxhZ3MgJiBQT19DT1BST0MpCisJCQkJCQlvcGlwZSA9IGJsb2NrX3BpcGUoKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlzICs9IGM7CisJCQlsZW4gLT0gYzsKKwkJfQorCQlpZiAoZmxhZ3MgJiBQT19DT1BST0MpCisJCQlyZXN0b3JlX3BpcGUob3BpcGUpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3NfZ2V0KHZvaWQpCit7CisJcmV0dXJuICgqc19wdHIrKyk7Cit9CisKK3N0YXRpYyB2b2lkCitzX3B1dChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCS0tc19wdHI7Cit9CisKK2ludAorY193aGVuY2UoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCB0YmwgKnRwOworCWNvbnN0IGNoYXIgKmlkOworCWJvb2wgcGZsYWcgPSBmYWxzZSwgdmZsYWcgPSBmYWxzZSwgVmZsYWcgPSBmYWxzZTsKKwlpbnQgcnYgPSAwLCBvcHRjLCBmY2ZsYWdzOworCWJvb2wgaWFtX3doZW5jZSA9IHdwWzBdWzBdID09ICd3JzsKKwljb25zdCBjaGFyICpvcHRzID0gaWFtX3doZW5jZSA/ICJwdiIgOiAicHZWIjsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgb3B0cykpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAncCc6CisJCQlwZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl2ZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlWZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJZmNmbGFncyA9IEZDX0JJIHwgRkNfUEFUSCB8IEZDX0ZVTkM7CisJaWYgKCFpYW1fd2hlbmNlKSB7CisJCS8qIE5vdGUgdGhhdCAtcCBvbiBpdHMgb3duIGlzIGRlYWwgd2l0aCBpbiBjb21leGVjKCkgKi8KKwkJaWYgKHBmbGFnKQorCQkJZmNmbGFncyB8PSBGQ19ERUZQQVRIOworCQkvKiBDb252ZXJ0IGNvbW1hbmQgb3B0aW9ucyB0byB3aGVuY2Ugb3B0aW9ucyAtIG5vdGUgdGhhdAorCQkgKiBjb21tYW5kIC1wViB1c2VzIGEgZGlmZmVyZW50IHBhdGggc2VhcmNoIHRoYW4gd2hlbmNlIC12CisJCSAqIG9yIHdoZW5jZSAtcHYuIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBmZWF0dXJlLgorCQkgKi8KKwkJdmZsYWcgPSBWZmxhZzsKKwl9CisJaWYgKHBmbGFnKQorCQlmY2ZsYWdzICY9IH4oRkNfQkkgfCBGQ19GVU5DKTsKKworCXdoaWxlICgodmZsYWcgfHwgcnYgPT0gMCkgJiYgKGlkID0gKndwKyspICE9IE5VTEwpIHsKKwkJdWludDMyX3QgaCA9IDA7CisKKwkJdHAgPSBOVUxMOworCQlpZiAoKGlhbV93aGVuY2UgfHwgdmZsYWcpICYmICFwZmxhZykKKwkJCXRwID0ga3RzZWFyY2goJmtleXdvcmRzLCBpZCwgaCA9IGhhc2goaWQpKTsKKwkJaWYgKCF0cCAmJiAhcGZsYWcpIHsKKwkJCXRwID0ga3RzZWFyY2goJmFsaWFzZXMsIGlkLCBoID8gaCA6IGhhc2goaWQpKTsKKwkJCWlmICh0cCAmJiAhKHRwLT5mbGFnICYgSVNTRVQpKQorCQkJCXRwID0gTlVMTDsKKwkJfQorCQlpZiAoIXRwKQorCQkJdHAgPSBmaW5kY29tKGlkLCBmY2ZsYWdzKTsKKwkJaWYgKHZmbGFnIHx8ICh0cC0+dHlwZSAhPSBDQUxJQVMgJiYgdHAtPnR5cGUgIT0gQ0VYRUMgJiYKKwkJICAgIHRwLT50eXBlICE9IENUQUxJQVMpKQorCQkJc2hmX3B1dHMoaWQsIHNobF9zdGRvdXQpOworCQlzd2l0Y2ggKHRwLT50eXBlKSB7CisJCWNhc2UgQ0tFWVdEOgorCQkJaWYgKHZmbGFnKQorCQkJCXNoZl9wdXRzKCIgaXMgYSByZXNlcnZlZCB3b3JkIiwgc2hsX3N0ZG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBDQUxJQVM6CisJCQlpZiAodmZsYWcpCisJCQkJc2hwcmludGYoIiBpcyBhbiAlc2FsaWFzIGZvciAiLAorCQkJCSAgICAodHAtPmZsYWcgJiBFWFBPUlQpID8gImV4cG9ydGVkICIgOiBudWxsKTsKKwkJCWlmICghaWFtX3doZW5jZSAmJiAhdmZsYWcpCisJCQkJc2hwcmludGYoImFsaWFzICVzPSIsIGlkKTsKKwkJCXByaW50X3ZhbHVlX3F1b3RlZCh0cC0+dmFsLnMpOworCQkJYnJlYWs7CisJCWNhc2UgQ0ZVTkM6CisJCQlpZiAodmZsYWcpIHsKKwkJCQlzaGZfcHV0cygiIGlzIGEiLCBzaGxfc3Rkb3V0KTsKKwkJCQlpZiAodHAtPmZsYWcgJiBFWFBPUlQpCisJCQkJCXNoZl9wdXRzKCJuIGV4cG9ydGVkIiwgc2hsX3N0ZG91dCk7CisJCQkJaWYgKHRwLT5mbGFnICYgVFJBQ0UpCisJCQkJCXNoZl9wdXRzKCIgdHJhY2VkIiwgc2hsX3N0ZG91dCk7CisJCQkJaWYgKCEodHAtPmZsYWcgJiBJU1NFVCkpIHsKKwkJCQkJc2hmX3B1dHMoIiB1bmRlZmluZWQiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJaWYgKHRwLT51LmZwYXRoKQorCQkJCQkJc2hwcmludGYoIiAoYXV0b2xvYWQgZnJvbSAlcykiLAorCQkJCQkJICAgIHRwLT51LmZwYXRoKTsKKwkJCQl9CisJCQkJc2hmX3B1dHMoIiBmdW5jdGlvbiIsIHNobF9zdGRvdXQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ1NIRUxMOgorCQkJaWYgKHZmbGFnKQorCQkJCXNocHJpbnRmKCIgaXMgYSVzIHNoZWxsIGJ1aWx0aW4iLAorCQkJCSAgICAodHAtPmZsYWcgJiBTUEVDX0JJKSA/ICIgc3BlY2lhbCIgOiBudWxsKTsKKwkJCWJyZWFrOworCQljYXNlIENUQUxJQVM6CisJCWNhc2UgQ0VYRUM6CisJCQlpZiAodHAtPmZsYWcgJiBJU1NFVCkgeworCQkJCWlmICh2ZmxhZykgeworCQkJCQlzaGZfcHV0cygiIGlzICIsIHNobF9zdGRvdXQpOworCQkJCQlpZiAodHAtPnR5cGUgPT0gQ1RBTElBUykKKwkJCQkJCXNocHJpbnRmKCJhIHRyYWNrZWQgJXNhbGlhcyBmb3IgIiwKKwkJCQkJCSAgICAodHAtPmZsYWcgJiBFWFBPUlQpID8KKwkJCQkJCSAgICAiZXhwb3J0ZWQgIiA6IG51bGwpOworCQkJCX0KKwkJCQlzaGZfcHV0cyh0cC0+dmFsLnMsIHNobF9zdGRvdXQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodmZsYWcpCisJCQkJCXNoZl9wdXRzKCIgbm90IGZvdW5kIiwgc2hsX3N0ZG91dCk7CisJCQkJcnYgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzaHByaW50ZigiJXMgaXMgKkdPSyoiLCBpZCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAodmZsYWcgfHwgIXJ2KQorCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7CisJfQorCXJldHVybiAocnYpOworfQorCisvKiBEZWFsIHdpdGggY29tbWFuZCAtdlYgLSBjb21tYW5kIC1wIGRlYWx0IHdpdGggaW4gY29tZXhlYygpICovCitpbnQKK2NfY29tbWFuZChjb25zdCBjaGFyICoqd3ApCit7CisJLyogTGV0IGNfd2hlbmNlIGRvIHRoZSB3b3JrLiBOb3RlIHRoYXQgY19jb21tYW5kKCkgbXVzdCBiZQorCSAqIGEgZGlzdGluY3QgZnVuY3Rpb24gZnJvbSBjX3doZW5jZSgpICh0ZXN0ZWQgaW4gY29tZXhlYygpKS4KKwkgKi8KKwlyZXR1cm4gKGNfd2hlbmNlKHdwKSk7Cit9CisKKy8qIHR5cGVzZXQsIGV4cG9ydCwgYW5kIHJlYWRvbmx5ICovCitpbnQKK2NfdHlwZXNldChjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IGJsb2NrICpsOworCXN0cnVjdCB0YmwgKnZwLCAqKnA7CisJVGZsYWcgZnNldCA9IDAsIGZjbHIgPSAwLCBmbGFnOworCWludCB0aGluZyA9IDAsIGZpZWxkLCBiYXNlLCBvcHRjOworCWNvbnN0IGNoYXIgKm9wdHM7CisJY29uc3QgY2hhciAqZmllbGRzdHIsICpiYXNlc3RyOworCWJvb2wgbG9jYWx2ID0gZmFsc2UsIGZ1bmMgPSBmYWxzZSwgcGZsYWcgPSBmYWxzZSwgaXN0c2V0ID0gdHJ1ZTsKKworCXN3aXRjaCAoKip3cCkgeworCWNhc2UgJ2UnOgkJLyogZXhwb3J0ICovCisJCWZzZXQgfD0gRVhQT1JUOworCQlpc3RzZXQgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAncic6CQkvKiByZWFkb25seSAqLworCQlmc2V0IHw9IFJET05MWTsKKwkJaXN0c2V0ID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgJ3MnOgkJLyogc2V0ICovCisJCS8qIGNhbGxlZCB3aXRoICd0eXBlc2V0IC0nICovCisJCWJyZWFrOworCWNhc2UgJ3QnOgkJLyogdHlwZXNldCAqLworCQlsb2NhbHYgPSB0cnVlOworCQlicmVhazsKKwl9CisKKwkvKiBzZWUgY29tbWVudCBiZWxvdyByZWdhcmRpbmcgcG9zc2libGUgb3Bpb25zICovCisJb3B0cyA9IGlzdHNldCA/ICJMI1IjVVojYWZpI2xucHJ0dXgiIDogInAiOworCisJZmllbGRzdHIgPSBiYXNlc3RyID0gTlVMTDsKKwlidWlsdGluX29wdC5mbGFncyB8PSBHRl9QTFVTT1BUOworCS8qIEFUJlQga3NoIHNlZW1zIHRvIGhhdmUgMC05IGFzIG9wdGlvbnMgd2hpY2ggYXJlIG11bHRpcGxpZWQKKwkgKiB0byBnZXQgYSBudW1iZXIgdGhhdCBpcyB1c2VkIHdpdGggLUwsIC1SLCAtWiBvciAtaSAoZWcsIC0xUjIKKwkgKiBzZXRzIHJpZ2h0IGp1c3RpZnkgaW4gYSBmaWVsZCBvZiAxMikuIFRoaXMgYWxsb3dzIG9wdGlvbnMKKwkgKiB0byBiZSBncm91cGVkIGluIGFuIG9yZGVyIChlZywgLUx1MTIpLCBidXQgZGlzYWxsb3dzIC1pOCAtTDMgYW5kCisJICogZG9lcyBub3QgYWxsb3cgdGhlIG51bWJlciB0byBiZSBzcGVjaWZpZWQgYXMgYSBzZXBhcmF0ZSBhcmd1bWVudAorCSAqIEhlcmUsIHRoZSBudW1iZXIgbXVzdCBmb2xsb3cgdGhlIFJMWmkgb3B0aW9uLCBidXQgaXMgb3B0aW9uYWwKKwkgKiAoc2VlIHRoZSAjIGtsdWRnZSBpbiBrc2hfZ2V0b3B0KCkpLgorCSAqLworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgb3B0cykpICE9IC0xKSB7CisJCWZsYWcgPSAwOworCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnTCc6CisJCQlmbGFnID0gTEpVU1Q7CisJCQlmaWVsZHN0ciA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdSJzoKKwkJCWZsYWcgPSBSSlVTVDsKKwkJCWZpZWxkc3RyID0gYnVpbHRpbl9vcHQub3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1UnOgorCQkJLyogQVQmVCBrc2ggdXNlcyB1LCBidXQgdGhpcyBjb25mbGljdHMgd2l0aAorCQkJICogdXBwZXIvbG93ZXIgY2FzZS4gSWYgdGhpcyBvcHRpb24gaXMgY2hhbmdlZCwKKwkJCSAqIG5lZWQgdG8gY2hhbmdlIHRoZSAtVSBiZWxvdyBhcyB3ZWxsCisJCQkgKi8KKwkJCWZsYWcgPSBJTlRfVTsKKwkJCWJyZWFrOworCQljYXNlICdaJzoKKwkJCWZsYWcgPSBaRVJPRklMOworCQkJZmllbGRzdHIgPSBidWlsdGluX29wdC5vcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQkvKgorCQkJICogdGhpcyBpcyBzdXBwb3NlZCB0byBzZXQgKC1hKSBvciB1bnNldCAoK2EpIHRoZQorCQkJICogaW5kZXhlZCBhcnJheSBhdHRyaWJ1dGU7IGl0IGRvZXMgbm90aGluZyBvbiBhbgorCQkJICogZXhpc3RpbmcgcmVndWxhciBzdHJpbmcgb3IgaW5kZXhlZCBhcnJheSB0aG91Z2gKKwkJCSAqLworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZnVuYyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlmbGFnID0gSU5URUdFUjsKKwkJCWJhc2VzdHIgPSBidWlsdGluX29wdC5vcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlmbGFnID0gTENBU0VWOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJc2V0X3JlZmZsYWcgPSAoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX1BMVVMpID8gMiA6IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQkvKiBleHBvcnQsIHJlYWRvbmx5OiBQT1NJWCAtcCBmbGFnICovCisJCQkvKiB0eXBlc2V0OiBzaG93IHZhbHVlcyBhcyB3ZWxsICovCisJCQlwZmxhZyA9IHRydWU7CisJCQlpZiAoaXN0c2V0KQorCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJZmxhZyA9IFJET05MWTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWZsYWcgPSBUUkFDRTsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWZsYWcgPSBVQ0FTRVZfQUw7CS8qIHVwcGVyIGNhc2UgLyBhdXRvbG9hZCAqLworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJZmxhZyA9IEVYUE9SVDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJaWYgKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9QTFVTKSB7CisJCQlmY2xyIHw9IGZsYWc7CisJCQlmc2V0ICY9IH5mbGFnOworCQkJdGhpbmcgPSAnKyc7CisJCX0gZWxzZSB7CisJCQlmc2V0IHw9IGZsYWc7CisJCQlmY2xyICY9IH5mbGFnOworCQkJdGhpbmcgPSAnLSc7CisJCX0KKwl9CisKKwlmaWVsZCA9IDA7CisJaWYgKGZpZWxkc3RyICYmICFiaV9nZXRuKGZpZWxkc3RyLCAmZmllbGQpKQorCQlyZXR1cm4gKDEpOworCWJhc2UgPSAwOworCWlmIChiYXNlc3RyICYmICFiaV9nZXRuKGJhc2VzdHIsICZiYXNlKSkKKwkJcmV0dXJuICgxKTsKKworCWlmICghKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9NSU5VU01JTlVTKSAmJiB3cFtidWlsdGluX29wdC5vcHRpbmRdICYmCisJICAgICh3cFtidWlsdGluX29wdC5vcHRpbmRdWzBdID09ICctJyB8fAorCSAgICB3cFtidWlsdGluX29wdC5vcHRpbmRdWzBdID09ICcrJykgJiYKKwkgICAgd3BbYnVpbHRpbl9vcHQub3B0aW5kXVsxXSA9PSAnXDAnKSB7CisJCXRoaW5nID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXVswXTsKKwkJYnVpbHRpbl9vcHQub3B0aW5kKys7CisJfQorCisJaWYgKGZ1bmMgJiYgKCgoZnNldHxmY2xyKSAmIH4oVFJBQ0V8VUNBU0VWX0FMfEVYUE9SVCkpIHx8IHNldF9yZWZmbGFnKSkgeworCQliaV9lcnJvcmYoIm9ubHkgLXQsIC11IGFuZCAteCBvcHRpb25zIG1heSBiZSB1c2VkIHdpdGggLWYiKTsKKwkJc2V0X3JlZmZsYWcgPSAwOworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAod3BbYnVpbHRpbl9vcHQub3B0aW5kXSkgeworCQkvKiBUYWtlIGNhcmUgb2YgZXhjbHVzaW9ucy4KKwkJICogQXQgdGhpcyBwb2ludCwgZmxhZ3MgaW4gZnNldCBhcmUgY2xlYXJlZCBpbiBmY2xyIGFuZCB2aWNlCisJCSAqIHZlcnNhLiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBwcmVzZXJ2ZWQuCisJCSAqLworCQlpZiAoZnNldCAmIExDQVNFVikJLyogTENBU0VWIGhhcyBwcmlvcml0eSBvdmVyIFVDQVNFVl9BTCAqLworCQkJZnNldCAmPSB+VUNBU0VWX0FMOworCQlpZiAoZnNldCAmIExKVVNUKQkvKiBMSlVTVCBoYXMgcHJpb3JpdHkgb3ZlciBSSlVTVCAqLworCQkJZnNldCAmPSB+UkpVU1Q7CisJCWlmICgoZnNldCAmIChaRVJPRklMfExKVVNUKSkgPT0gWkVST0ZJTCkgeyAvKiAtWiBpbXBsaWVzIC1aUiAqLworCQkJZnNldCB8PSBSSlVTVDsKKwkJCWZjbHIgJj0gflJKVVNUOworCQl9CisJCS8qIFNldHRpbmcgdGhlc2UgYXR0cmlidXRlcyBjbGVhcnMgdGhlIG90aGVycywgdW5sZXNzIHRoZXkKKwkJICogYXJlIGFsc28gc2V0IGluIHRoaXMgY29tbWFuZAorCQkgKi8KKwkJaWYgKChmc2V0ICYgKExKVVNUIHwgUkpVU1QgfCBaRVJPRklMIHwgVUNBU0VWX0FMIHwgTENBU0VWIHwKKwkJICAgIElOVEVHRVIgfCBJTlRfVSB8IElOVF9MKSkgfHwgc2V0X3JlZmZsYWcpCisJCQlmY2xyIHw9IH5mc2V0ICYgKExKVVNUIHwgUkpVU1QgfCBaRVJPRklMIHwgVUNBU0VWX0FMIHwKKwkJCSAgICBMQ0FTRVYgfCBJTlRFR0VSIHwgSU5UX1UgfCBJTlRfTCk7CisJfQorCisJLyogc2V0IHZhcmlhYmxlcyBhbmQgYXR0cmlidXRlcyAqLworCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdKSB7CisJCWludCBpLCBydiA9IDA7CisJCXN0cnVjdCB0YmwgKmY7CisKKwkJaWYgKGxvY2FsdiAmJiAhZnVuYykKKwkJCWZzZXQgfD0gTE9DQUw7CisJCWZvciAoaSA9IGJ1aWx0aW5fb3B0Lm9wdGluZDsgd3BbaV07IGkrKykgeworCQkJaWYgKGZ1bmMpIHsKKwkJCQlmID0gZmluZGZ1bmMod3BbaV0sIGhhc2god3BbaV0pLAorCQkJCSAgICAoZnNldCZVQ0FTRVZfQUwpID8gdHJ1ZSA6IGZhbHNlKTsKKwkJCQlpZiAoIWYpIHsKKwkJCQkJLyogQVQmVCBrc2ggZG9lcyArK3J2OiBib2d1cyAqLworCQkJCQlydiA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoZnNldCB8IGZjbHIpIHsKKwkJCQkJZi0+ZmxhZyB8PSBmc2V0OworCQkJCQlmLT5mbGFnICY9IH5mY2xyOworCQkJCX0gZWxzZQorCQkJCQlmcHRyZWVmKHNobF9zdGRvdXQsIDAsCisJCQkJCSAgICBmLT5mbGFnICYgRktTSCA/CisJCQkJCSAgICAiZnVuY3Rpb24gJXMgJVRcbiIgOgorCQkJCQkgICAgIiVzKCkgJVRcbiIsIHdwW2ldLCBmLT52YWwudCk7CisJCQl9IGVsc2UgaWYgKCF0eXBlc2V0KHdwW2ldLCBmc2V0LCBmY2xyLCBmaWVsZCwgYmFzZSkpIHsKKwkJCQliaV9lcnJvcmYoIiVzOiBub3QgaWRlbnRpZmllciIsIHdwW2ldKTsKKwkJCQlzZXRfcmVmZmxhZyA9IDA7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJfQorCQlzZXRfcmVmZmxhZyA9IDA7CisJCXJldHVybiAocnYpOworCX0KKworCS8qIGxpc3QgdmFyaWFibGVzIGFuZCBhdHRyaWJ1dGVzICovCisJZmxhZyA9IGZzZXQgfCBmY2xyOyAvKiBubyBkaWZmZXJlbmNlIGF0IHRoaXMgcG9pbnQuLiAqLworCWlmIChmdW5jKSB7CisJCWZvciAobCA9IGUtPmxvYzsgbDsgbCA9IGwtPm5leHQpIHsKKwkJCWZvciAocCA9IGt0c29ydCgmbC0+ZnVucyk7ICh2cCA9ICpwKyspOyApIHsKKwkJCQlpZiAoZmxhZyAmJiAodnAtPmZsYWcgJiBmbGFnKSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAodGhpbmcgPT0gJy0nKQorCQkJCQlmcHRyZWVmKHNobF9zdGRvdXQsIDAsIHZwLT5mbGFnICYgRktTSCA/CisJCQkJCSAgICAiZnVuY3Rpb24gJXMgJVRcbiIgOiAiJXMoKSAlVFxuIiwKKwkJCQkJICAgIHZwLT5uYW1lLCB2cC0+dmFsLnQpOworCQkJCWVsc2UKKwkJCQkJc2hwcmludGYoIiVzXG4iLCB2cC0+bmFtZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGwgPSBlLT5sb2M7IGw7IGwgPSBsLT5uZXh0KSB7CisJCQlmb3IgKHAgPSBrdHNvcnQoJmwtPnZhcnMpOyAodnAgPSAqcCsrKTsgKSB7CisJCQkJc3RydWN0IHRibCAqdHZwOworCQkJCWJvb2wgYW55X3NldCA9IGZhbHNlOworCQkJCS8qCisJCQkJICogU2VlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgc2V0IChmb3IgYXJyYXlzLCBpZiBhbnkKKwkJCQkgKiBlbGVtZW50IGlzIHNldCkuCisJCQkJICovCisJCQkJZm9yICh0dnAgPSB2cDsgdHZwOyB0dnAgPSB0dnAtPnUuYXJyYXkpCisJCQkJCWlmICh0dnAtPmZsYWcgJiBJU1NFVCkgeworCQkJCQkJYW55X3NldCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBDaGVjayBhdHRyaWJ1dGVzIC0gbm90ZSB0aGF0IGFsbCBhcnJheSBlbGVtZW50cworCQkJCSAqIGhhdmUgKHNob3VsZCBoYXZlPykgdGhlIHNhbWUgYXR0cmlidXRlcywgc28gY2hlY2tpbmcKKwkJCQkgKiB0aGUgZmlyc3QgaXMgc3VmZmljaWVudC4KKwkJCQkgKgorCQkJCSAqIFJlcG9ydCBhbiB1bnNldCBwYXJhbSBvbmx5IGlmIHRoZSB1c2VyIGhhcworCQkJCSAqIGV4cGxpY2l0bHkgZ2l2ZW4gaXQgc29tZSBhdHRyaWJ1dGUgKGxpa2UgZXhwb3J0KTsKKwkJCQkgKiBvdGhlcndpc2UsIGFmdGVyICJlY2hvICRGT08iLCB3ZSB3b3VsZCByZXBvcnQgRk9PLi4uCisJCQkJICovCisJCQkJaWYgKCFhbnlfc2V0ICYmICEodnAtPmZsYWcgJiBVU0VSQVRUUklCKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGZsYWcgJiYgKHZwLT5mbGFnICYgZmxhZykgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJZm9yICg7IHZwOyB2cCA9IHZwLT51LmFycmF5KSB7CisJCQkJCS8qIElnbm9yZSBhcnJheSBlbGVtZW50cyB0aGF0IGFyZW4ndAorCQkJCQkgKiBzZXQgdW5sZXNzIHRoZXJlIGFyZSBubyBzZXQgZWxlbWVudHMsCisJCQkJCSAqIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IGlzIHJlcG9ydGVkIG9uICovCisJCQkJCWlmICgodnAtPmZsYWcmQVJSQVkpICYmIGFueV9zZXQgJiYKKwkJCQkJICAgICEodnAtPmZsYWcgJiBJU1NFVCkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJLyogbm8gYXJndW1lbnRzICovCisJCQkJCWlmICh0aGluZyA9PSAwICYmIGZsYWcgPT0gMCkgeworCQkJCQkJLyogQVQmVCBrc2ggcHJpbnRzIHRoaW5ncworCQkJCQkJICogbGlrZSBleHBvcnQsIGludGVnZXIsCisJCQkJCQkgKiBsZWZ0YWRqLCB6ZXJvZmlsbCwgZXRjLiwKKwkJCQkJCSAqIGJ1dCBQT1NJWCBzYXlzIG11c3QKKwkJCQkJCSAqIGJlIHN1aXRhYmxlIGZvciByZS1lbnRyeS4uLgorCQkJCQkJICovCisJCQkJCQlzaGZfcHV0cygidHlwZXNldCAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgoKHZwLT5mbGFnJihBUlJBWXxBU1NPQykpPT1BU1NPQykpCisJCQkJCQkJc2hmX3B1dHMoIi1uICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZJTlRFR0VSKSkKKwkJCQkJCQlzaGZfcHV0cygiLWkgIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJkVYUE9SVCkpCisJCQkJCQkJc2hmX3B1dHMoIi14ICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZSRE9OTFkpKQorCQkJCQkJCXNoZl9wdXRzKCItciAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmVFJBQ0UpKQorCQkJCQkJCXNoZl9wdXRzKCItdCAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmTEpVU1QpKQorCQkJCQkJCXNocHJpbnRmKCItTCVkICIsIHZwLT51Mi5maWVsZCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJlJKVVNUKSkKKwkJCQkJCQlzaHByaW50ZigiLVIlZCAiLCB2cC0+dTIuZmllbGQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZaRVJPRklMKSkKKwkJCQkJCQlzaGZfcHV0cygiLVogIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJkxDQVNFVikpCisJCQkJCQkJc2hmX3B1dHMoIi1sICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZVQ0FTRVZfQUwpKQorCQkJCQkJCXNoZl9wdXRzKCItdSAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmSU5UX1UpKQorCQkJCQkJCXNoZl9wdXRzKCItVSAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCXNoZl9wdXRzKHZwLT5uYW1lLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmIChwZmxhZykgeworCQkJCQkJCWNoYXIgKnMgPSBzdHJfdmFsKHZwKTsKKworCQkJCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7CisJCQkJCQkJLyogQVQmVCBrc2ggY2FuJ3QgaGF2ZQorCQkJCQkJCSAqIGp1c3RpZmllZCBpbnRlZ2Vycy4uICovCisJCQkJCQkJaWYgKCh2cC0+ZmxhZyAmCisJCQkJCQkJICAgIChJTlRFR0VSfExKVVNUfFJKVVNUKSkgPT0KKwkJCQkJCQkgICAgSU5URUdFUikKKwkJCQkJCQkJc2hmX3B1dHMocywgc2hsX3N0ZG91dCk7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwcmludF92YWx1ZV9xdW90ZWQocyk7CisJCQkJCQl9CisJCQkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICh2cC0+ZmxhZyAmIEFSUkFZKQorCQkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHBmbGFnKQorCQkJCQkJCXNoZl9wdXRzKGlzdHNldCA/CisJCQkJCQkJICAgICJ0eXBlc2V0ICIgOgorCQkJCQkJCSAgICAoZmxhZyAmIEVYUE9SVCkgPworCQkJCQkJCSAgICAiZXhwb3J0ICIgOgorCQkJCQkJCSAgICAicmVhZG9ubHkgIiwKKwkJCQkJCQkgICAgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJkFSUkFZKSAmJiBhbnlfc2V0KQorCQkJCQkJCXNocHJpbnRmKCIlc1slbHVdIiwKKwkJCQkJCQkgICAgdnAtPm5hbWUsCisJCQkJCQkJICAgIGFycmF5aW5kZXgodnApKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzaGZfcHV0cyh2cC0+bmFtZSwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAodGhpbmcgPT0gJy0nICYmICh2cC0+ZmxhZyZJU1NFVCkpIHsKKwkJCQkJCQljaGFyICpzID0gc3RyX3ZhbCh2cCk7CisKKwkJCQkJCQlzaGZfcHV0YygnPScsIHNobF9zdGRvdXQpOworCQkJCQkJCS8qIEFUJlQga3NoIGNhbid0IGhhdmUKKwkJCQkJCQkgKiBqdXN0aWZpZWQgaW50ZWdlcnMuLiAqLworCQkJCQkJCWlmICgodnAtPmZsYWcgJgorCQkJCQkJCSAgICAoSU5URUdFUnxMSlVTVHxSSlVTVCkpID09CisJCQkJCQkJICAgIElOVEVHRVIpCisJCQkJCQkJCXNoZl9wdXRzKHMsIHNobF9zdGRvdXQpOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcHJpbnRfdmFsdWVfcXVvdGVkKHMpOworCQkJCQkJfQorCQkJCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7CisJCQkJCX0KKwkJCQkJLyogT25seSByZXBvcnQgZmlyc3QgJ2VsZW1lbnQnIG9mIGFuIGFycmF5IHdpdGgKKwkJCQkJICogbm8gc2V0IGVsZW1lbnRzLgorCQkJCQkgKi8KKwkJCQkJaWYgKCFhbnlfc2V0KQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorY19hbGlhcyhjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IHRhYmxlICp0ID0gJmFsaWFzZXM7CisJaW50IHJ2ID0gMCwgcHJlZml4ID0gMDsKKwlib29sIHJmbGFnID0gZmFsc2UsIHRmbGFnLCBVZmxhZyA9IGZhbHNlLCBwZmxhZyA9IGZhbHNlOworCVRmbGFnIHhmbGFnID0gMDsKKwlpbnQgb3B0YzsKKworCWJ1aWx0aW5fb3B0LmZsYWdzIHw9IEdGX1BMVVNPUFQ7CisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiZHBydFV4IikpICE9IC0xKSB7CisJCXByZWZpeCA9IGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9QTFVTID8gJysnIDogJy0nOworCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnZCc6CisjaWZkZWYgTUtTSF9OT1BXTkFNCisJCQl0ID0gTlVMTDsJLyogZml4ICJhbGlhcyAtZHQiICovCisjZWxzZQorCQkJdCA9ICZob21lZGlyczsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcGZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJdCA9ICZ0YWxpYXNlczsKKwkJCWJyZWFrOworCQljYXNlICdVJzoKKwkJCS8qCisJCQkgKiBrbHVkZ2UgZm9yIHRyYWNrZWQgYWxpYXMgaW5pdGlhbGl6YXRpb24KKwkJCSAqIChkb24ndCBkbyBhIHBhdGggc2VhcmNoLCBqdXN0IG1ha2UgYW4gZW50cnkpCisJCQkgKi8KKwkJCVVmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCXhmbGFnID0gRVhQT1JUOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKyNpZmRlZiBNS1NIX05PUFdOQU0KKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworI2VuZGlmCisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJaWYgKCEoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX01JTlVTTUlOVVMpICYmICp3cCAmJgorCSAgICAod3BbMF1bMF0gPT0gJy0nIHx8IHdwWzBdWzBdID09ICcrJykgJiYgd3BbMF1bMV0gPT0gJ1wwJykgeworCQlwcmVmaXggPSB3cFswXVswXTsKKwkJd3ArKzsKKwl9CisKKwl0ZmxhZyA9IHQgPT0gJnRhbGlhc2VzOworCisJLyogImhhc2ggLXIiIG1lYW5zIHJlc2V0IGFsbCB0aGUgdHJhY2tlZCBhbGlhc2VzLi4gKi8KKwlpZiAocmZsYWcpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsKKwkJCSJ1bmFsaWFzIiwgIi10YSIsIE5VTEwKKwkJfTsKKworCQlpZiAoIXRmbGFnIHx8ICp3cCkgeworCQkJc2hmX3B1dHMoImFsaWFzOiAtciBmbGFnIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCAtdCIKKwkJCSAgICAiIGFuZCB3aXRob3V0IGFyZ3VtZW50c1xuIiwgc2hsX3N0ZG91dCk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWtzaF9nZXRvcHRfcmVzZXQoJmJ1aWx0aW5fb3B0LCBHRl9FUlJPUik7CisJCXJldHVybiAoY191bmFsaWFzKGFyZ3MpKTsKKwl9CisKKwlpZiAoKndwID09IE5VTEwpIHsKKwkJc3RydWN0IHRibCAqYXAsICoqcDsKKworCQlmb3IgKHAgPSBrdHNvcnQodCk7IChhcCA9ICpwKyspICE9IE5VTEw7ICkKKwkJCWlmICgoYXAtPmZsYWcgJiAoSVNTRVR8eGZsYWcpKSA9PSAoSVNTRVR8eGZsYWcpKSB7CisJCQkJaWYgKHBmbGFnKQorCQkJCQlzaGZfcHV0cygiYWxpYXMgIiwgc2hsX3N0ZG91dCk7CisJCQkJc2hmX3B1dHMoYXAtPm5hbWUsIHNobF9zdGRvdXQpOworCQkJCWlmIChwcmVmaXggIT0gJysnKSB7CisJCQkJCXNoZl9wdXRjKCc9Jywgc2hsX3N0ZG91dCk7CisJCQkJCXByaW50X3ZhbHVlX3F1b3RlZChhcC0+dmFsLnMpOworCQkJCX0KKwkJCQlzaGZfcHV0YygnXG4nLCBzaGxfc3Rkb3V0KTsKKwkJCX0KKwl9CisKKwlmb3IgKDsgKndwICE9IE5VTEw7IHdwKyspIHsKKwkJY29uc3QgY2hhciAqYWxpYXMgPSAqd3AsICp2YWwsICpuZXd2YWw7CisJCWNoYXIgKnhhbGlhcyA9IE5VTEw7CisJCXN0cnVjdCB0YmwgKmFwOworCQl1aW50MzJfdCBoOworCisJCWlmICgodmFsID0gY3N0cmNocihhbGlhcywgJz0nKSkpIHsKKwkJCXN0cm5kdXB4KHhhbGlhcywgYWxpYXMsIHZhbCsrIC0gYWxpYXMsIEFURU1QKTsKKwkJCWFsaWFzID0geGFsaWFzOworCQl9CisJCWggPSBoYXNoKGFsaWFzKTsKKwkJaWYgKHZhbCA9PSBOVUxMICYmICF0ZmxhZyAmJiAheGZsYWcpIHsKKwkJCWFwID0ga3RzZWFyY2godCwgYWxpYXMsIGgpOworCQkJaWYgKGFwICE9IE5VTEwgJiYgKGFwLT5mbGFnJklTU0VUKSkgeworCQkJCWlmIChwZmxhZykKKwkJCQkJc2hmX3B1dHMoImFsaWFzICIsIHNobF9zdGRvdXQpOworCQkJCXNoZl9wdXRzKGFwLT5uYW1lLCBzaGxfc3Rkb3V0KTsKKwkJCQlpZiAocHJlZml4ICE9ICcrJykgeworCQkJCQlzaGZfcHV0YygnPScsIHNobF9zdGRvdXQpOworCQkJCQlwcmludF92YWx1ZV9xdW90ZWQoYXAtPnZhbC5zKTsKKwkJCQl9CisJCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7CisJCQl9IGVsc2UgeworCQkJCXNocHJpbnRmKCIlcyBhbGlhcyBub3QgZm91bmRcbiIsIGFsaWFzKTsKKwkJCQlydiA9IDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlhcCA9IGt0ZW50ZXIodCwgYWxpYXMsIGgpOworCQlhcC0+dHlwZSA9IHRmbGFnID8gQ1RBTElBUyA6IENBTElBUzsKKwkJLyogQXJlIHdlIHNldHRpbmcgdGhlIHZhbHVlIG9yIGp1c3Qgc29tZSBmbGFncz8gKi8KKwkJaWYgKCh2YWwgJiYgIXRmbGFnKSB8fCAoIXZhbCAmJiB0ZmxhZyAmJiAhVWZsYWcpKSB7CisJCQlpZiAoYXAtPmZsYWcmQUxMT0MpIHsKKwkJCQlhcC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKKwkJCQlhZnJlZShhcC0+dmFsLnMsIEFQRVJNKTsKKwkJCX0KKwkJCS8qIGlnbm9yZSB2YWx1ZXMgZm9yIC10IChBVCZUIGtzaCBkb2VzIHRoaXMpICovCisJCQluZXd2YWwgPSB0ZmxhZyA/IHNlYXJjaChhbGlhcywgcGF0aCwgWF9PSywgTlVMTCkgOiB2YWw7CisJCQlpZiAobmV3dmFsKSB7CisJCQkJc3RyZHVweChhcC0+dmFsLnMsIG5ld3ZhbCwgQVBFUk0pOworCQkJCWFwLT5mbGFnIHw9IEFMTE9DfElTU0VUOworCQkJfSBlbHNlCisJCQkJYXAtPmZsYWcgJj0gfklTU0VUOworCQl9CisJCWFwLT5mbGFnIHw9IERFRklORUQ7CisJCWlmIChwcmVmaXggPT0gJysnKQorCQkJYXAtPmZsYWcgJj0gfnhmbGFnOworCQllbHNlCisJCQlhcC0+ZmxhZyB8PSB4ZmxhZzsKKwkJYWZyZWUoeGFsaWFzLCBBVEVNUCk7CisJfQorCisJcmV0dXJuIChydik7Cit9CisKK2ludAorY191bmFsaWFzKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3QgdGFibGUgKnQgPSAmYWxpYXNlczsKKwlzdHJ1Y3QgdGJsICphcDsKKwlpbnQgb3B0YywgcnYgPSAwOworCWJvb2wgYWxsID0gZmFsc2U7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJhZHQiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdhJzoKKwkJCWFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisjaWZkZWYgTUtTSF9OT1BXTkFNCisJCQl0ID0gTlVMTDsJLyogZml4ICJ1bmFsaWFzIC1kdCIgKi8KKyNlbHNlCisJCQl0ID0gJmhvbWVkaXJzOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQl0ID0gJnRhbGlhc2VzOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorI2lmZGVmIE1LU0hfTk9QV05BTQorCWlmICh0ID09IE5VTEwpCisJCXJldHVybiAoMCk7CisjZW5kaWYKKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlmb3IgKDsgKndwICE9IE5VTEw7IHdwKyspIHsKKwkJYXAgPSBrdHNlYXJjaCh0LCAqd3AsIGhhc2goKndwKSk7CisJCWlmIChhcCA9PSBOVUxMKSB7CisJCQlydiA9IDE7CS8qIFBPU0lYICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXAtPmZsYWcmQUxMT0MpIHsKKwkJCWFwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOworCQkJYWZyZWUoYXAtPnZhbC5zLCBBUEVSTSk7CisJCX0KKwkJYXAtPmZsYWcgJj0gfihERUZJTkVEfElTU0VUfEVYUE9SVCk7CisJfQorCisJaWYgKGFsbCkgeworCQlzdHJ1Y3QgdHN0YXRlIHRzOworCisJCWZvciAoa3R3YWxrKCZ0cywgdCk7IChhcCA9IGt0bmV4dCgmdHMpKTsgKSB7CisJCQlpZiAoYXAtPmZsYWcmQUxMT0MpIHsKKwkJCQlhcC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKKwkJCQlhZnJlZShhcC0+dmFsLnMsIEFQRVJNKTsKKwkJCX0KKwkJCWFwLT5mbGFnICY9IH4oREVGSU5FRHxJU1NFVHxFWFBPUlQpOworCQl9CisJfQorCisJcmV0dXJuIChydik7Cit9CisKK2ludAorY19sZXQoY29uc3QgY2hhciAqKndwKQoreworCWludCBydiA9IDE7CisJbWtzaF9hcmlfdCB2YWw7CisKKwlpZiAod3BbMV0gPT0gTlVMTCkgLyogQVQmVCBrc2ggZG9lcyB0aGlzICovCisJCWJpX2Vycm9yZigibm8gYXJndW1lbnRzIik7CisJZWxzZQorCQlmb3IgKHdwKys7ICp3cDsgd3ArKykKKwkJCWlmICghZXZhbHVhdGUoKndwLCAmdmFsLCBLU0hfUkVUVVJOX0VSUk9SLCB0cnVlKSkgeworCQkJCXJ2ID0gMjsJLyogZGlzdGluZ3Vpc2ggZXJyb3IgZnJvbSB6ZXJvIHJlc3VsdCAqLworCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJcnYgPSB2YWwgPT0gMDsKKwlyZXR1cm4gKHJ2KTsKK30KKworaW50CitjX2pvYnMoY29uc3QgY2hhciAqKndwKQoreworCWludCBvcHRjLCBmbGFnID0gMCwgbmZsYWcgPSAwLCBydiA9IDA7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJscG56IikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnbCc6CisJCQlmbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCWZsYWcgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJbmZsYWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3onOgkvKiBkZWJ1Z2dpbmc6IHByaW50IHpvbWJpZXMgKi8KKwkJCW5mbGFnID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCWlmICghKndwKSB7CisJCWlmIChqX2pvYnMoTlVMTCwgZmxhZywgbmZsYWcpKQorCQkJcnYgPSAxOworCX0gZWxzZSB7CisJCWZvciAoOyAqd3A7IHdwKyspCisJCQlpZiAoal9qb2JzKCp3cCwgZmxhZywgbmZsYWcpKQorCQkJCXJ2ID0gMTsKKwl9CisJcmV0dXJuIChydik7Cit9CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECitpbnQKK2NfZmdiZyhjb25zdCBjaGFyICoqd3ApCit7CisJYm9vbCBiZyA9IHN0cmNtcCgqd3AsICJiZyIpID09IDA7CisJaW50IHJ2ID0gMDsKKworCWlmICghRmxhZyhGTU9OSVRPUikpIHsKKwkJYmlfZXJyb3JmKCJqb2IgY29udHJvbCBub3QgZW5hYmxlZCIpOworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCWlmICgqd3ApCisJCWZvciAoOyAqd3A7IHdwKyspCisJCQlydiA9IGpfcmVzdW1lKCp3cCwgYmcpOworCWVsc2UKKwkJcnYgPSBqX3Jlc3VtZSgiJSUiLCBiZyk7CisJcmV0dXJuIChiZyA/IDAgOiBydik7Cit9CisjZW5kaWYKKworLyogZm9ybWF0IGEgc2luZ2xlIGtpbGwgaXRlbSAqLworc3RhdGljIGNoYXIgKgora2lsbF9mbXRfZW50cnkoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgaSwgY29uc3Qgdm9pZCAqYXJnKQoreworCWNvbnN0IHN0cnVjdCBraWxsX2luZm8gKmtpID0gKGNvbnN0IHN0cnVjdCBraWxsX2luZm8gKilhcmc7CisKKwlpKys7CisJc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJSpkICUqcyAlcyIsCisJICAgIGtpLT5udW1fd2lkdGgsIGksCisJICAgIGtpLT5uYW1lX3dpZHRoLCBzaWd0cmFwc1tpXS5uYW1lLAorCSAgICBzaWd0cmFwc1tpXS5tZXNzKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK2ludAorY19raWxsKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlUcmFwICp0ID0gTlVMTDsKKwljb25zdCBjaGFyICpwOworCWJvb2wgbGZsYWcgPSBmYWxzZTsKKwlpbnQgaSwgbiwgcnYsIHNpZzsKKworCS8qIGFzc3VtZSBvbGQgc3R5bGUgb3B0aW9ucyBpZiAtZGlnaXRzIG9yIC1VUFBFUkNBU0UgKi8KKwlpZiAoKHAgPSB3cFsxXSkgJiYgKnAgPT0gJy0nICYmIChrc2hfaXNkaWdpdChwWzFdKSB8fAorCSAgICBrc2hfaXN1cHBlcihwWzFdKSkpIHsKKwkJaWYgKCEodCA9IGdldHRyYXAocCArIDEsIHRydWUpKSkgeworCQkJYmlfZXJyb3JmKCJiYWQgc2lnbmFsICclcyciLCBwICsgMSk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWkgPSAod3BbMl0gJiYgc3RyY21wKHdwWzJdLCAiLS0iKSA9PSAwKSA/IDMgOiAyOworCX0gZWxzZSB7CisJCWludCBvcHRjOworCisJCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImxzOiIpKSAhPSAtMSkKKwkJCXN3aXRjaCAob3B0YykgeworCQkJY2FzZSAnbCc6CisJCQkJbGZsYWcgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJaWYgKCEodCA9IGdldHRyYXAoYnVpbHRpbl9vcHQub3B0YXJnLCB0cnVlKSkpIHsKKwkJCQkJYmlfZXJyb3JmKCJiYWQgc2lnbmFsICclcyciLAorCQkJCQkgICAgYnVpbHRpbl9vcHQub3B0YXJnKTsKKwkJCQkJcmV0dXJuICgxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICc/JzoKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQlpID0gYnVpbHRpbl9vcHQub3B0aW5kOworCX0KKwlpZiAoKGxmbGFnICYmIHQpIHx8ICghd3BbaV0gJiYgIWxmbGFnKSkgeworI2lmbmRlZiBNS1NIX1NNQUxMCisJCXNoZl9wdXRzKCJ1c2FnZTpcdGtpbGwgWy1zIHNpZ25hbWUgfCAtc2lnbnVtIHwgLXNpZ25hbWVdIgorCQkgICAgIiB7IGpvYiB8IHBpZCB8IHBncnAgfSAuLi5cbiIKKwkJICAgICJcdGtpbGwgLWwgW2V4aXRfc3RhdHVzIC4uLl1cbiIsIHNobF9vdXQpOworI2VuZGlmCisJCWJpX2Vycm9yZnooKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAobGZsYWcpIHsKKwkJaWYgKHdwW2ldKSB7CisJCQlmb3IgKDsgd3BbaV07IGkrKykgeworCQkJCWlmICghYmlfZ2V0bih3cFtpXSwgJm4pKQorCQkJCQlyZXR1cm4gKDEpOworCQkJCWlmIChuID4gMTI4ICYmIG4gPCAxMjggKyBOU0lHKQorCQkJCQluIC09IDEyODsKKwkJCQlpZiAobiA+IDAgJiYgbiA8IE5TSUcpCisJCQkJCXNocHJpbnRmKCIlc1xuIiwgc2lndHJhcHNbbl0ubmFtZSk7CisJCQkJZWxzZQorCQkJCQlzaHByaW50ZigiJWRcbiIsIG4pOworCQkJfQorCQl9IGVsc2UgeworCQkJaW50IHcsIGosIG1lc3NfY29scywgbWVzc19vY3RzOworCQkJc3RydWN0IGtpbGxfaW5mbyBraTsKKworCQkJZm9yIChqID0gTlNJRywga2kubnVtX3dpZHRoID0gMTsgaiA+PSAxMDsgaiAvPSAxMCkKKwkJCQlraS5udW1fd2lkdGgrKzsKKwkJCWtpLm5hbWVfd2lkdGggPSBtZXNzX2NvbHMgPSBtZXNzX29jdHMgPSAwOworCQkJZm9yIChqID0gMDsgaiA8IE5TSUc7IGorKykgeworCQkJCXcgPSBzdHJsZW4oc2lndHJhcHNbal0ubmFtZSk7CisJCQkJaWYgKHcgPiBraS5uYW1lX3dpZHRoKQorCQkJCQlraS5uYW1lX3dpZHRoID0gdzsKKwkJCQl3ID0gc3RybGVuKHNpZ3RyYXBzW2pdLm1lc3MpOworCQkJCWlmICh3ID4gbWVzc19vY3RzKQorCQkJCQltZXNzX29jdHMgPSB3OworCQkJCXcgPSB1dGZfbWJzd2lkdGgoc2lndHJhcHNbal0ubWVzcyk7CisJCQkJaWYgKHcgPiBtZXNzX2NvbHMpCisJCQkJCW1lc3NfY29scyA9IHc7CisJCQl9CisKKwkJCXByaW50X2NvbHVtbnMoc2hsX3N0ZG91dCwgTlNJRyAtIDEsCisJCQkgICAga2lsbF9mbXRfZW50cnksICh2b2lkICopJmtpLAorCQkJICAgIGtpLm51bV93aWR0aCArIDEgKyBraS5uYW1lX3dpZHRoICsgMSArIG1lc3Nfb2N0cywKKwkJCSAgICBraS5udW1fd2lkdGggKyAxICsga2kubmFtZV93aWR0aCArIDEgKyBtZXNzX2NvbHMsCisJCQkgICAgdHJ1ZSk7CisJCX0KKwkJcmV0dXJuICgwKTsKKwl9CisJcnYgPSAwOworCXNpZyA9IHQgPyB0LT5zaWduYWwgOiBTSUdURVJNOworCWZvciAoOyAocCA9IHdwW2ldKTsgaSsrKSB7CisJCWlmICgqcCA9PSAnJScpIHsKKwkJCWlmIChqX2tpbGwocCwgc2lnKSkKKwkJCQlydiA9IDE7CisJCX0gZWxzZSBpZiAoIWdldG4ocCwgJm4pKSB7CisJCQliaV9lcnJvcmYoIiVzOiBhcmd1bWVudHMgbXVzdCBiZSBqb2JzIG9yIHByb2Nlc3MgSURzIiwKKwkJCSAgICBwKTsKKwkJCXJ2ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChta3NoX2tpbGwobiwgc2lnKSA8IDApIHsKKwkJCQliaV9lcnJvcmYoIiVzOiAlcyIsIHAsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcnYgPSAxOworCQkJfQorCQl9CisJfQorCXJldHVybiAocnYpOworfQorCit2b2lkCitnZXRvcHRzX3Jlc2V0KGludCB2YWwpCit7CisJaWYgKHZhbCA+PSAxKSB7CisJCWtzaF9nZXRvcHRfcmVzZXQoJnVzZXJfb3B0LCBHRl9OT05BTUUgfCBHRl9QTFVTT1BUKTsKKwkJdXNlcl9vcHQub3B0aW5kID0gdXNlcl9vcHQudW9wdGluZCA9IHZhbDsKKwl9Cit9CisKK2ludAorY19nZXRvcHRzKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgYXJnYywgb3B0YywgcnY7CisJY29uc3QgY2hhciAqb3B0cywgKnZhcjsKKwljaGFyIGJ1ZlszXTsKKwlzdHJ1Y3QgdGJsICp2cSwgKnZvcHRhcmc7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJb3B0cyA9ICp3cCsrOworCWlmICghb3B0cykgeworCQliaV9lcnJvcmYoIm1pc3Npbmcgb3B0aW9ucyBhcmd1bWVudCIpOworCQlyZXR1cm4gKDEpOworCX0KKworCXZhciA9ICp3cCsrOworCWlmICghdmFyKSB7CisJCWJpX2Vycm9yZigibWlzc2luZyBuYW1lIGFyZ3VtZW50Iik7CisJCXJldHVybiAoMSk7CisJfQorCWlmICghKnZhciB8fCAqc2tpcF92YXJuYW1lKHZhciwgdHJ1ZSkpIHsKKwkJYmlfZXJyb3JmKCIlczogaXMgbm90IGFuIGlkZW50aWZpZXIiLCB2YXIpOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmIChlLT5sb2MtPm5leHQgPT0gTlVMTCkgeworCQlpbnRlcm5hbF93YXJuaW5nZigiY19nZXRvcHRzOiBubyBhcmd2Iik7CisJCXJldHVybiAoMSk7CisJfQorCS8qIFdoaWNoIGFyZ3VtZW50cyBhcmUgd2UgcGFyc2luZy4uLiAqLworCWlmICgqd3AgPT0gTlVMTCkKKwkJd3AgPSBlLT5sb2MtPm5leHQtPmFyZ3Y7CisJZWxzZQorCQkqLS13cCA9IGUtPmxvYy0+bmV4dC0+YXJndlswXTsKKworCS8qIENoZWNrIHRoYXQgb3VyIHNhdmVkIHN0YXRlIHdvbid0IGNhdXNlIGEgY29yZSBkdW1wLi4uICovCisJZm9yIChhcmdjID0gMDsgd3BbYXJnY107IGFyZ2MrKykKKwkJOworCWlmICh1c2VyX29wdC5vcHRpbmQgPiBhcmdjIHx8CisJICAgICh1c2VyX29wdC5wICE9IDAgJiYKKwkgICAgdXNlcl9vcHQucCA+IHN0cmxlbih3cFt1c2VyX29wdC5vcHRpbmQgLSAxXSkpKSB7CisJCWJpX2Vycm9yZigiYXJndW1lbnRzIGNoYW5nZWQgc2luY2UgbGFzdCBjYWxsIik7CisJCXJldHVybiAoMSk7CisJfQorCisJdXNlcl9vcHQub3B0YXJnID0gTlVMTDsKKwlvcHRjID0ga3NoX2dldG9wdCh3cCwgJnVzZXJfb3B0LCBvcHRzKTsKKworCWlmIChvcHRjID49IDAgJiYgb3B0YyAhPSAnPycgJiYgKHVzZXJfb3B0LmluZm8gJiBHSV9QTFVTKSkgeworCQlidWZbMF0gPSAnKyc7CisJCWJ1ZlsxXSA9IG9wdGM7CisJCWJ1ZlsyXSA9ICdcMCc7CisJfSBlbHNlIHsKKwkJLyogUE9TSVggc2F5cyB2YXIgaXMgc2V0IHRvID8gYXQgZW5kLW9mLW9wdGlvbnMsIEFUJlQga3NoCisJCSAqIHNldHMgaXQgdG8gbnVsbCAtIHdlIGdvIHdpdGggUE9TSVguLi4KKwkJICovCisJCWJ1ZlswXSA9IG9wdGMgPCAwID8gJz8nIDogb3B0YzsKKwkJYnVmWzFdID0gJ1wwJzsKKwl9CisKKwkvKiBBVCZUIGtzaDkzIGluIGZhY3QgZG9lcyBjaGFuZ2UgT1BUSU5EIGZvciB1bmtub3duIG9wdGlvbnMgdG9vICovCisJdXNlcl9vcHQudW9wdGluZCA9IHVzZXJfb3B0Lm9wdGluZDsKKworCXZvcHRhcmcgPSBnbG9iYWwoIk9QVEFSRyIpOworCXZvcHRhcmctPmZsYWcgJj0gflJET05MWTsJLyogQVQmVCBrc2ggY2xlYXJzIHJvIGFuZCBpbnQgKi8KKwkvKiBQYXJhbm9pYTogZW5zdXJlIG5vIGJpemFycmUgcmVzdWx0cy4gKi8KKwlpZiAodm9wdGFyZy0+ZmxhZyAmIElOVEVHRVIpCisJICAgIHR5cGVzZXQoIk9QVEFSRyIsIDAsIElOVEVHRVIsIDAsIDApOworCWlmICh1c2VyX29wdC5vcHRhcmcgPT0gTlVMTCkKKwkJdW5zZXQodm9wdGFyZywgMSk7CisJZWxzZQorCQkvKiBUaGlzIGNhbid0IGZhaWwgKGhhdmUgY2xlYXJlZCByZWFkb25seS9pbnRlZ2VyKSAqLworCQlzZXRzdHIodm9wdGFyZywgdXNlcl9vcHQub3B0YXJnLCBLU0hfUkVUVVJOX0VSUk9SKTsKKworCXJ2ID0gMDsKKworCXZxID0gZ2xvYmFsKHZhcik7CisJLyogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IHByaW50ZWQgKGludGVnZXIsIHJlYWRvbmx5KSAqLworCWlmICghc2V0c3RyKHZxLCBidWYsIEtTSF9SRVRVUk5fRVJST1IpKQorCQlydiA9IDE7CisJaWYgKEZsYWcoRkVYUE9SVCkpCisJCXR5cGVzZXQodmFyLCBFWFBPUlQsIDAsIDAsIDApOworCisJcmV0dXJuIChvcHRjIDwgMCA/IDEgOiBydik7Cit9CisKK2ludAorY19iaW5kKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgb3B0YywgcnYgPSAwOworI2lmbmRlZiBNS1NIX1NNQUxMCisJYm9vbCBtYWNybyA9IGZhbHNlOworI2VuZGlmCisJYm9vbCBsaXN0ID0gZmFsc2U7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqdXA7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsCisjaWZuZGVmIE1LU0hfU01BTEwKKwkgICAgImxtIgorI2Vsc2UKKwkgICAgImwiCisjZW5kaWYKKwkgICAgKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdsJzoKKwkJCWxpc3QgPSB0cnVlOworCQkJYnJlYWs7CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJY2FzZSAnbSc6CisJCQltYWNybyA9IHRydWU7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlpZiAoKndwID09IE5VTEwpCS8qIGxpc3QgYWxsICovCisJCXJ2ID0geF9iaW5kKE5VTEwsIE5VTEwsCisjaWZuZGVmIE1LU0hfU01BTEwKKwkJICAgIGZhbHNlLAorI2VuZGlmCisJCSAgICBsaXN0KTsKKworCWZvciAoOyAqd3AgIT0gTlVMTDsgd3ArKykgeworCQlpZiAoKGNwID0gY3N0cmNocigqd3AsICc9JykpID09IE5VTEwpCisJCQl1cCA9IE5VTEw7CisJCWVsc2UgeworCQkJc3RyZHVweCh1cCwgKndwLCBBVEVNUCk7CisJCQl1cFtjcCsrIC0gKndwXSA9ICdcMCc7CisJCX0KKwkJaWYgKHhfYmluZCh1cCA/IHVwIDogKndwLCBjcCwKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQkgICAgbWFjcm8sCisjZW5kaWYKKwkJICAgIGZhbHNlKSkKKwkJCXJ2ID0gMTsKKwkJYWZyZWUodXAsIEFURU1QKTsKKwl9CisKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogOiwgZmFsc2UgYW5kIHRydWUgKGFuZCB1bGltaXQgaWYgTUtTSF9OT19MSU1JVFMpICovCitpbnQKK2NfbGFiZWwoY29uc3QgY2hhciAqKndwKQoreworCXJldHVybiAod3BbMF1bMF0gPT0gJ2YnID8gMSA6IDApOworfQorCitpbnQKK2Nfc2hpZnQoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKKwlpbnQgbjsKKwlta3NoX2FyaV90IHZhbDsKKwljb25zdCBjaGFyICphcmc7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJYXJnID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKKworCWlmIChhcmcpIHsKKwkJZXZhbHVhdGUoYXJnLCAmdmFsLCBLU0hfVU5XSU5EX0VSUk9SLCBmYWxzZSk7CisJCW4gPSB2YWw7CisJfSBlbHNlCisJCW4gPSAxOworCWlmIChuIDwgMCkgeworCQliaV9lcnJvcmYoIiVzOiBiYWQgbnVtYmVyIiwgYXJnKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKGwtPmFyZ2MgPCBuKSB7CisJCWJpX2Vycm9yZigibm90aGluZyB0byBzaGlmdCIpOworCQlyZXR1cm4gKDEpOworCX0KKwlsLT5hcmd2W25dID0gbC0+YXJndlswXTsKKwlsLT5hcmd2ICs9IG47CisJbC0+YXJnYyAtPSBuOworCXJldHVybiAoMCk7Cit9CisKK2ludAorY191bWFzayhjb25zdCBjaGFyICoqd3ApCit7CisJaW50IGksIG9wdGM7CisJY29uc3QgY2hhciAqY3A7CisJYm9vbCBzeW1ib2xpYyA9IGZhbHNlOworCW1vZGVfdCBvbGRfdW1hc2s7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJTIikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnUyc6CisJCQlzeW1ib2xpYyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJY3AgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdOworCWlmIChjcCA9PSBOVUxMKSB7CisJCW9sZF91bWFzayA9IHVtYXNrKChtb2RlX3QpMCk7CisJCXVtYXNrKG9sZF91bWFzayk7CisJCWlmIChzeW1ib2xpYykgeworCQkJY2hhciBidWZbMThdLCAqcDsKKwkJCWludCBqOworCisJCQlvbGRfdW1hc2sgPSB+b2xkX3VtYXNrOworCQkJcCA9IGJ1ZjsKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkqcCsrID0gInVnbyJbaV07CisJCQkJKnArKyA9ICc9JzsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorCQkJCQlpZiAob2xkX3VtYXNrICYgKDEgPDwgKDggLSAoMyppICsgaikpKSkKKwkJCQkJCSpwKysgPSAicnd4IltqXTsKKwkJCQkqcCsrID0gJywnOworCQkJfQorCQkJcFstMV0gPSAnXDAnOworCQkJc2hwcmludGYoIiVzXG4iLCBidWYpOworCQl9IGVsc2UKKwkJCXNocHJpbnRmKCIlIzMuM29cbiIsICh1bnNpZ25lZCBpbnQpb2xkX3VtYXNrKTsKKwl9IGVsc2UgeworCQltb2RlX3QgbmV3X3VtYXNrOworCisJCWlmIChrc2hfaXNkaWdpdCgqY3ApKSB7CisJCQlmb3IgKG5ld191bWFzayA9IDA7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc3JzsgY3ArKykKKwkJCQluZXdfdW1hc2sgPSBuZXdfdW1hc2sgKiA4ICsgKCpjcCAtICcwJyk7CisJCQlpZiAoKmNwKSB7CisJCQkJYmlfZXJyb3JmKCJiYWQgbnVtYmVyIik7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHN5bWJvbGljIGZvcm1hdCAqLworCQkJaW50IHBvc2l0aW9ucywgbmV3X3ZhbDsKKwkJCWNoYXIgb3A7CisKKwkJCW9sZF91bWFzayA9IHVtYXNrKChtb2RlX3QpMCk7CisJCQl1bWFzayhvbGRfdW1hc2spOyAvKiBpbiBjYXNlIG9mIGVycm9yICovCisJCQlvbGRfdW1hc2sgPSB+b2xkX3VtYXNrOworCQkJbmV3X3VtYXNrID0gb2xkX3VtYXNrOworCQkJcG9zaXRpb25zID0gMDsKKwkJCXdoaWxlICgqY3ApIHsKKwkJCQl3aGlsZSAoKmNwICYmIHZzdHJjaHIoImF1Z28iLCAqY3ApKQorCQkJCQlzd2l0Y2ggKCpjcCsrKSB7CisJCQkJCWNhc2UgJ2EnOgorCQkJCQkJcG9zaXRpb25zIHw9IDAxMTE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAndSc6CisJCQkJCQlwb3NpdGlvbnMgfD0gMDEwMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdnJzoKKwkJCQkJCXBvc2l0aW9ucyB8PSAwMDEwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ28nOgorCQkJCQkJcG9zaXRpb25zIHw9IDAwMDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWlmICghcG9zaXRpb25zKQorCQkJCQlwb3NpdGlvbnMgPSAwMTExOyAvKiBkZWZhdWx0IGlzIGEgKi8KKwkJCQlpZiAoIXZzdHJjaHIoIj0rLSIsIG9wID0gKmNwKSkKKwkJCQkJYnJlYWs7CisJCQkJY3ArKzsKKwkJCQluZXdfdmFsID0gMDsKKwkJCQl3aGlsZSAoKmNwICYmIHZzdHJjaHIoInJ3eHVnb1hzIiwgKmNwKSkKKwkJCQkJc3dpdGNoICgqY3ArKykgeworCQkJCQljYXNlICdyJzogbmV3X3ZhbCB8PSAwNDsgYnJlYWs7CisJCQkJCWNhc2UgJ3cnOiBuZXdfdmFsIHw9IDAyOyBicmVhazsKKwkJCQkJY2FzZSAneCc6IG5ld192YWwgfD0gMDE7IGJyZWFrOworCQkJCQljYXNlICd1JzoKKwkJCQkJCW5ld192YWwgfD0gb2xkX3VtYXNrID4+IDY7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnZyc6CisJCQkJCQluZXdfdmFsIHw9IG9sZF91bWFzayA+PiAzOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ28nOgorCQkJCQkJbmV3X3ZhbCB8PSBvbGRfdW1hc2sgPj4gMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdYJzoKKwkJCQkJCWlmIChvbGRfdW1hc2sgJiAwMTExKQorCQkJCQkJCW5ld192YWwgfD0gMDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAncyc6CisJCQkJCQkvKiBpZ25vcmVkICovCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCW5ld192YWwgPSAobmV3X3ZhbCAmIDA3KSAqIHBvc2l0aW9uczsKKwkJCQlzd2l0Y2ggKG9wKSB7CisJCQkJY2FzZSAnLSc6CisJCQkJCW5ld191bWFzayAmPSB+bmV3X3ZhbDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnPSc6CisJCQkJCW5ld191bWFzayA9IG5ld192YWwgfAorCQkJCQkgICAgKG5ld191bWFzayAmIH4ocG9zaXRpb25zICogMDcpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKyc6CisJCQkJCW5ld191bWFzayB8PSBuZXdfdmFsOworCQkJCX0KKwkJCQlpZiAoKmNwID09ICcsJykgeworCQkJCQlwb3NpdGlvbnMgPSAwOworCQkJCQljcCsrOworCQkJCX0gZWxzZSBpZiAoIXZzdHJjaHIoIj0rLSIsICpjcCkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCpjcCkgeworCQkJCWJpX2Vycm9yZigiYmFkIG1hc2siKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJbmV3X3VtYXNrID0gfm5ld191bWFzazsKKwkJfQorCQl1bWFzayhuZXdfdW1hc2spOworCX0KKwlyZXR1cm4gKDApOworfQorCitpbnQKK2NfZG90KGNvbnN0IGNoYXIgKip3cCkKK3sKKwljb25zdCBjaGFyICpmaWxlLCAqY3AsICoqYXJndjsKKwlpbnQgYXJnYywgaSwgZXJyY29kZTsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKworCWlmICgoY3AgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdKSA9PSBOVUxMKSB7CisJCWJpX2Vycm9yZigibWlzc2luZyBhcmd1bWVudCIpOworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAoKGZpbGUgPSBzZWFyY2goY3AsIHBhdGgsIFJfT0ssICZlcnJjb2RlKSkgPT0gTlVMTCkgeworCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLAorCQkgICAgZXJyY29kZSA/IHN0cmVycm9yKGVycmNvZGUpIDogIm5vdCBmb3VuZCIpOworCQlyZXR1cm4gKDEpOworCX0KKworCS8qIFNldCBwb3NpdGlvbmFsIHBhcmFtZXRlcnM/ICovCisJaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZCArIDFdKSB7CisJCWFyZ3YgPSB3cCArIGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwkJYXJndlswXSA9IGUtPmxvYy0+YXJndlswXTsgLyogcHJlc2VydmUgJDAgKi8KKwkJZm9yIChhcmdjID0gMDsgYXJndlthcmdjICsgMV07IGFyZ2MrKykKKwkJCTsKKwl9IGVsc2UgeworCQlhcmdjID0gMDsKKwkJYXJndiA9IE5VTEw7CisJfQorCWlmICgoaSA9IGluY2x1ZGUoZmlsZSwgYXJnYywgYXJndiwgMCkpIDwgMCkgeworCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKGkpOworfQorCitpbnQKK2Nfd2FpdChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IHJ2ID0gMCwgc2lnOworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwlpZiAoKndwID09IE5VTEwpIHsKKwkJd2hpbGUgKHdhaXRmb3IoTlVMTCwgJnNpZykgPj0gMCkKKwkJCTsKKwkJcnYgPSBzaWc7CisJfSBlbHNlIHsKKwkJZm9yICg7ICp3cDsgd3ArKykKKwkJCXJ2ID0gd2FpdGZvcigqd3AsICZzaWcpOworCQlpZiAocnYgPCAwKQorCQkJcnYgPSBzaWcgPyBzaWcgOiAxMjc7IC8qIG1hZ2ljIGV4aXQgY29kZTogYmFkIGpvYi1pZCAqLworCX0KKwlyZXR1cm4gKHJ2KTsKK30KKworaW50CitjX3JlYWQoY29uc3QgY2hhciAqKndwKQoreworCWludCBjID0gMCwgZWNvZGUgPSAwLCBmZCA9IDAsIG9wdGM7CisJYm9vbCBleHBhbmRlID0gdHJ1ZSwgaGlzdG9yeXIgPSBmYWxzZSwgZXhwYW5kaW5nOworCWNvbnN0IGNoYXIgKmNwLCAqZW1zZzsKKwlzdHJ1Y3Qgc2hmICpzaGY7CisJWFN0cmluZyBjcywgeHMgPSB7IE5VTEwsIE5VTEwsIDAsIE5VTEx9OworCXN0cnVjdCB0YmwgKnZwOworCWNoYXIgKmNjcCwgKnhwID0gTlVMTCwgKndwYWxsb2MgPSBOVUxMOworCXN0YXRpYyBjaGFyIFJFUExZW10gPSAiUkVQTFkiOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAicHJzdSwiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdwJzoKKwkJCWlmICgoZmQgPSBjb3Byb2NfZ2V0ZmQoUl9PSywgJmVtc2cpKSA8IDApIHsKKwkJCQliaV9lcnJvcmYoIi1wOiAlcyIsIGVtc2cpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlleHBhbmRlID0gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQloaXN0b3J5ciA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlpZiAoISooY3AgPSBidWlsdGluX29wdC5vcHRhcmcpKQorCQkJCWZkID0gMDsKKwkJCWVsc2UgaWYgKChmZCA9IGNoZWNrX2ZkKGNwLCBSX09LLCAmZW1zZykpIDwgMCkgeworCQkJCWJpX2Vycm9yZigiLXU6ICVzOiAlcyIsIGNwLCBlbXNnKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWlmICgqd3AgPT0gTlVMTCkKKwkJKi0td3AgPSBSRVBMWTsKKworCS8qIFNpbmNlIHdlIGNhbid0IG5lY2Vzc2FyaWx5IHNlZWsgYmFja3dhcmRzIG9uIG5vbi1yZWd1bGFyIGZpbGVzLAorCSAqIGRvbid0IGJ1ZmZlciB0aGVtIHNvIHdlIGNhbid0IHJlYWQgdG9vIG11Y2guCisJICovCisJc2hmID0gc2hmX3Jlb3BlbihmZCwgU0hGX1JEIHwgU0hGX0lOVEVSUlVQVCB8IGNhbl9zZWVrKGZkKSwgc2hsX3NwYXJlKTsKKworCWlmICgoY3AgPSBjc3RyY2hyKCp3cCwgJz8nKSkgIT0gTlVMTCkgeworCQlzdHJkdXB4KHdwYWxsb2MsICp3cCwgQVRFTVApOworCQl3cGFsbG9jW2NwIC0gKndwXSA9ICdcMCc7CisJCSp3cCA9IHdwYWxsb2M7CisJCWlmIChpc2F0dHkoZmQpKSB7CisJCQkvKiBBVCZUIGtzaCBzYXlzIGl0IHByaW50cyBwcm9tcHQgb24gZmQgaWYgaXQncyBvcGVuCisJCQkgKiBmb3Igd3JpdGluZyBhbmQgaXMgYSB0dHksIGJ1dCBpdCBkb2Vzbid0IGRvIGl0CisJCQkgKiAoaXQgYWxzbyBkb2Vzbid0IGNoZWNrIHRoZSBpbnRlcmFjdGl2ZSBmbGFnLAorCQkJICogYXMgaXMgaW5kaWNhdGVkIGluIHRoZSBLb3Juc2hlbGwgYm9vaykuCisJCQkgKi8KKwkJCXNoZWxsZigiJXMiLCBjcCsxKTsKKwkJfQorCX0KKworCS8qIElmIHdlIGFyZSByZWFkaW5nIGZyb20gdGhlIGNvLXByb2Nlc3MgZm9yIHRoZSBmaXJzdCB0aW1lLAorCSAqIG1ha2Ugc3VyZSB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcGlwZSBpcyBjbG9zZWQgZmlyc3QuIFRoaXMgYWxsb3dzCisJICogdGhlIGRldGVjdGlvbiBvZiBlb2YuCisJICoKKwkgKiBUaGlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQVQmVCBrc2guLi4gdGhlIGZkIGlzIGtlcHQgc28gYW5vdGhlcgorCSAqIGNvcHJvYyBjYW4gYmUgc3RhcnRlZCB3aXRoIHNhbWUgb3V0cHV0LCBob3dldmVyLCB0aGlzIG1lYW5zIGVvZgorCSAqIGNhbid0IGJlIGRldGVjdGVkLi4uIFRoaXMgaXMgd2h5IGl0IGlzIGNsb3NlZCBoZXJlLgorCSAqIElmIHRoaXMgY2FsbCBpcyByZW1vdmVkLCByZW1vdmUgdGhlIGVvZiBjaGVjayBiZWxvdywgdG9vLgorCSAqIGNvcHJvY19yZWFkd19jbG9zZShmZCk7CisJICovCisKKwlpZiAoaGlzdG9yeXIpCisJCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7CisJZXhwYW5kaW5nID0gZmFsc2U7CisJWGluaXQoY3MsIGNjcCwgMTI4LCBBVEVNUCk7CisJZm9yICg7ICp3cCAhPSBOVUxMOyB3cCsrKSB7CisJCWZvciAoY2NwID0gWHN0cmluZyhjcywgY2NwKTsgOyApIHsKKwkJCWlmIChjID09ICdcbicgfHwgYyA9PSBFT0YpCisJCQkJYnJlYWs7CisJCQl3aGlsZSAoMSkgeworCQkJCWMgPSBzaGZfZ2V0YyhzaGYpOworCQkJCWlmIChjID09ICdcMCcpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChjID09IEVPRiAmJiBzaGZfZXJyb3Ioc2hmKSAmJgorCQkJCSAgICBzaGZfZXJybm8oc2hmKSA9PSBFSU5UUikgeworCQkJCQkvKiBXYXMgdGhlIG9mZmVuZGluZyBzaWduYWwgb25lIHRoYXQKKwkJCQkJICogd291bGQgbm9ybWFsbHkga2lsbCBhIHByb2Nlc3M/CisJCQkJCSAqIElmIHNvLCBwcmV0ZW5kIHRoZSByZWFkIHdhcyBraWxsZWQuCisJCQkJCSAqLworCQkJCQllY29kZSA9IGZhdGFsX3RyYXBfY2hlY2soKTsKKworCQkJCQkvKiBub24gZmF0YWwgKGVnLCBDSExEKSwgY2Fycnkgb24gKi8KKwkJCQkJaWYgKCFlY29kZSkgeworCQkJCQkJc2hmX2NsZWFyZXJyKHNoZik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChoaXN0b3J5cikgeworCQkJCVhjaGVjayh4cywgeHApOworCQkJCVhwdXQoeHMsIHhwLCBjKTsKKwkJCX0KKwkJCVhjaGVjayhjcywgY2NwKTsKKwkJCWlmIChleHBhbmRpbmcpIHsKKwkJCQlleHBhbmRpbmcgPSBmYWxzZTsKKwkJCQlpZiAoYyA9PSAnXG4nKSB7CisJCQkJCWMgPSAwOworCQkJCQlpZiAoRmxhZyhGVEFMS0lOR19JKSAmJiBpc2F0dHkoZmQpKSB7CisJCQkJCQkvKiBzZXQgcHJvbXB0IGluIGNhc2UgdGhpcyBpcworCQkJCQkJICogY2FsbGVkIGZyb20gLnByb2ZpbGUgb3IgJEVOVgorCQkJCQkJICovCisJCQkJCQlzZXRfcHJvbXB0KFBTMiwgTlVMTCk7CisJCQkJCQlwcHJvbXB0KHByb21wdCwgMCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGMgIT0gRU9GKQorCQkJCQlYcHV0KGNzLCBjY3AsIGMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGV4cGFuZGUgJiYgYyA9PSAnXFwnKSB7CisJCQkJZXhwYW5kaW5nID0gdHJ1ZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjID09ICdcbicgfHwgYyA9PSBFT0YpCisJCQkJYnJlYWs7CisJCQlpZiAoY3R5cGUoYywgQ19JRlMpKSB7CisJCQkJaWYgKFhsZW5ndGgoY3MsIGNjcCkgPT0gMCAmJiBjdHlwZShjLCBDX0lGU1dTKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHdwWzFdKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCVhwdXQoY3MsIGNjcCwgYyk7CisJCX0KKwkJLyogc3RyaXAgdHJhaWxpbmcgSUZTIHdoaXRlIHNwYWNlIGZyb20gbGFzdCB2YXJpYWJsZSAqLworCQlpZiAoIXdwWzFdKQorCQkJd2hpbGUgKFhsZW5ndGgoY3MsIGNjcCkgJiYgY3R5cGUoY2NwWy0xXSwgQ19JRlMpICYmCisJCQkgICAgY3R5cGUoY2NwWy0xXSwgQ19JRlNXUykpCisJCQkJY2NwLS07CisJCVhwdXQoY3MsIGNjcCwgJ1wwJyk7CisJCXZwID0gZ2xvYmFsKCp3cCk7CisJCS8qIE11c3QgYmUgZG9uZSBiZWZvcmUgc2V0dGluZyBleHBvcnQuICovCisJCWlmICh2cC0+ZmxhZyAmIFJET05MWSkgeworCQkJc2hmX2ZsdXNoKHNoZik7CisJCQliaV9lcnJvcmYoIiVzIGlzIHJlYWQgb25seSIsICp3cCk7CisJCQlhZnJlZSh3cGFsbG9jLCBBVEVNUCk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWlmIChGbGFnKEZFWFBPUlQpKQorCQkJdHlwZXNldCgqd3AsIEVYUE9SVCwgMCwgMCwgMCk7CisJCWlmICghc2V0c3RyKHZwLCBYc3RyaW5nKGNzLCBjY3ApLCBLU0hfUkVUVVJOX0VSUk9SKSkgeworCQkJc2hmX2ZsdXNoKHNoZik7CisJCQlhZnJlZSh3cGFsbG9jLCBBVEVNUCk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCisJc2hmX2ZsdXNoKHNoZik7CisJaWYgKGhpc3RvcnlyKSB7CisJCVhwdXQoeHMsIHhwLCAnXDAnKTsKKwkJaGlzdHNhdmUoJnNvdXJjZS0+bGluZSwgWHN0cmluZyh4cywgeHApLCB0cnVlLCBmYWxzZSk7CisJCVhmcmVlKHhzLCB4cCk7CisJfQorCS8qIGlmIHRoaXMgaXMgdGhlIGNvLXByb2Nlc3MgZmQsIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IKKwkgKiAoY2FuIGdldCBlb2YgaWYgYW5kIG9ubHkgaWYgYWxsIHByb2Nlc3NlcyBhcmUgaGF2ZSBkaWVkLCBpZSwKKwkgKiBjb3Byb2MubmpvYnMgaXMgMCBhbmQgdGhlIHBpcGUgaXMgY2xvc2VkKS4KKwkgKi8KKwlpZiAoYyA9PSBFT0YgJiYgIWVjb2RlKQorCQljb3Byb2NfcmVhZF9jbG9zZShmZCk7CisKKwlhZnJlZSh3cGFsbG9jLCBBVEVNUCk7CisJcmV0dXJuIChlY29kZSA/IGVjb2RlIDogYyA9PSBFT0YpOworfQorCitpbnQKK2NfZXZhbChjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IHNvdXJjZSAqcywgKnNhdmVzID0gc291cmNlOworCXVuc2lnbmVkIGNoYXIgc2F2ZWY7CisJaW50IHJ2OworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCXMgPSBwdXNocyhTV09SRFMsIEFURU1QKTsKKwlzLT51LnN0cnYgPSB3cCArIGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCS8qLQorCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21tYW5kIGlzCisJICogZW1wdHkgZHVlIHRvIGZhaWxlZCBjb21tYW5kIHN1YnN0aXR1dGlvbiwgZm9yIGV4YW1wbGUgYnkKKwkgKglldmFsICIkKGZhbHNlKSIKKwkgKiBUaGlzIGhhcyBoaXN0b3JpY2FsbHkgcmV0dXJuZWQgMSBieSBBVCZUIGtzaDg4LiBJbiB0aGlzCisJICogY2FzZSwgc2hlbGwoKSB3aWxsIG5vdCBzZXQgb3IgY2hhbmdlIGV4c3RhdCBiZWNhdXNlIHRoZQorCSAqIGNvbXBpbGVkIHRyZWUgaXMgZW1wdHksIHNvIGl0IHdpbGwgdXNlIHRoZSB2YWx1ZSB3ZSBwYXNzCisJICogZnJvbSBzdWJzdF9leHN0YXQsIHdoaWNoIGlzIGNsZWFyZWQgaW4gZXhlY3V0ZSgpLCBzbyBpdAorCSAqIHNob3VsZCBoYXZlIGJlZW4gMCBpZiB0aGVyZSB3ZXJlIG5vIHN1YnN0aXR1dGlvbnMuCisJICoKKwkgKiBQT1NJWCBob3dldmVyIHNheXMgd2UgZG9uJ3QgZG8gdGhpcywgZXZlbiB0aG91Z2ggaXQgaXMKKwkgKiB0cmFkaXRpb25hbGx5IGRvbmUuIEFUJlQga3NoOTMgYWdyZWVzIHdpdGggUE9TSVgsIHNvIHdlCisJICogZG8uIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhjZXJwdCBmcm9tIFNVU3Y0IFsxMDAzLjItMjAwOF06CisJICoKKwkgKiAyLjkuMTogU2ltcGxlIENvbW1hbmRzCisJICoJLi4uIElmIHRoZXJlIGlzIGEgY29tbWFuZCBuYW1lLCBleGVjdXRpb24gc2hhbGwKKwkgKgljb250aW51ZSBhcyBkZXNjcmliZWQgaW4gMi45LjEuMSBbQ29tbWFuZCBTZWFyY2gKKwkgKglhbmQgRXhlY3V0aW9uXS4gSWYgdGhlcmUgaXMgbm8gY29tbWFuZCBuYW1lLCBidXQKKwkgKgl0aGUgY29tbWFuZCBjb250YWluZWQgYSBjb21tYW5kIHN1YnN0aXR1dGlvbiwgdGhlCisJICoJY29tbWFuZCBzaGFsbCBjb21wbGV0ZSB3aXRoIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUKKwkgKglsYXN0IGNvbW1hbmQgc3Vic3RpdHV0aW9uIHBlcmZvcm1lZC4KKwkgKiAyLjkuMS4xOiBDb21tYW5kIFNlYXJjaCBhbmQgRXhlY3V0aW9uCisJICoJKDEpIGEuIElmIHRoZSBjb21tYW5kIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiBhCisJICoJc3BlY2lhbCBidWlsdC1pbiB1dGlsaXR5LCB0aGF0IHNwZWNpYWwgYnVpbHQtaW4KKwkgKgl1dGlsaXR5IHNoYWxsIGJlIGludm9rZWQuCisJICogMi4xNC41OiBldmFsCisJICoJSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgb3Igb25seSBudWxsIGFyZ3VtZW50cywKKwkgKglldmFsIHNoYWxsIHJldHVybiBhIHplcm8gZXhpdCBzdGF0dXM7IC4uLgorCSAqLworCS8qIGV4c3RhdCA9IHN1YnN0X2V4c3RhdDsgKi8JLyogQVQmVCBrc2g4OCAqLworCWV4c3RhdCA9IDA7CQkJLyogU1VTdjQgKi8KKworCXNhdmVmID0gRmxhZyhGRVJSRVhJVCk7CisJRmxhZyhGRVJSRVhJVCkgPSAwOworCXJ2ID0gc2hlbGwocywgZmFsc2UpOworCUZsYWcoRkVSUkVYSVQpID0gc2F2ZWY7CisJc291cmNlID0gc2F2ZXM7CisJYWZyZWUocywgQVRFTVApOworCXJldHVybiAocnYpOworfQorCitpbnQKK2NfdHJhcChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqczsKKwlUcmFwICpwOworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWlmICgqd3AgPT0gTlVMTCkgeworCQlmb3IgKHAgPSBzaWd0cmFwcywgaSA9IE5TSUcrMTsgLS1pID49IDA7IHArKykKKwkJCWlmIChwLT50cmFwICE9IE5VTEwpIHsKKwkJCQlzaGZfcHV0cygidHJhcCAtLSAiLCBzaGxfc3Rkb3V0KTsKKwkJCQlwcmludF92YWx1ZV9xdW90ZWQocC0+dHJhcCk7CisJCQkJc2hwcmludGYoIiAlc1xuIiwgcC0+bmFtZSk7CisJCQl9CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBVc2UgY2FzZSBzZW5zaXRpdmUgbG9va3VwIGZvciBmaXJzdCBhcmcgc28gdGhlCisJICogY29tbWFuZCAnZXhpdCcgaXNuJ3QgY29uZnVzZWQgd2l0aCB0aGUgcHNldWRvLXNpZ25hbAorCSAqICdFWElUJy4KKwkgKi8KKwlzID0gKGdldHRyYXAoKndwLCBmYWxzZSkgPT0gTlVMTCkgPyAqd3ArKyA6IE5VTEw7IC8qIGdldCBjb21tYW5kICovCisJaWYgKHMgIT0gTlVMTCAmJiBzWzBdID09ICctJyAmJiBzWzFdID09ICdcMCcpCisJCXMgPSBOVUxMOworCisJLyogc2V0L2NsZWFyIHRyYXBzICovCisJd2hpbGUgKCp3cCAhPSBOVUxMKSB7CisJCXAgPSBnZXR0cmFwKCp3cCsrLCB0cnVlKTsKKwkJaWYgKHAgPT0gTlVMTCkgeworCQkJYmlfZXJyb3JmKCJiYWQgc2lnbmFsICVzIiwgd3BbLTFdKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJc2V0dHJhcChwLCBzKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CitjX2V4aXRyZXR1cm4oY29uc3QgY2hhciAqKndwKQoreworCWludCBuLCBob3cgPSBMRVhJVDsKKwljb25zdCBjaGFyICphcmc7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisJYXJnID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKKworCWlmIChhcmcpIHsKKwkJaWYgKCFnZXRuKGFyZywgJm4pKSB7CisJCQlleHN0YXQgPSAxOworCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBiYWQgbnVtYmVyIiwgYXJnKTsKKwkJfSBlbHNlCisJCQlleHN0YXQgPSBuOworCX0KKwlpZiAod3BbMF1bMF0gPT0gJ3InKSB7IC8qIHJldHVybiAqLworCQlzdHJ1Y3QgZW52ICplcDsKKworCQkvKiBuZWVkIHRvIHRlbGwgaWYgdGhpcyBpcyBleGl0IG9yIHJldHVybiBzbyB0cmFwIGV4aXQgd2lsbAorCQkgKiB3b3JrIHJpZ2h0IChQT1NJWCkKKwkJICovCisJCWZvciAoZXAgPSBlOyBlcDsgZXAgPSBlcC0+b2VudikKKwkJCWlmIChTVE9QX1JFVFVSTihlcC0+dHlwZSkpIHsKKwkJCQlob3cgPSBMUkVUVVJOOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCWlmIChob3cgPT0gTEVYSVQgJiYgIXJlYWxseV9leGl0ICYmIGpfc3RvcHBlZF9ydW5uaW5nKCkpIHsKKwkJcmVhbGx5X2V4aXQgPSAxOworCQlob3cgPSBMU0hFTEw7CisJfQorCisJcXVpdGVudihOVUxMKTsJLyogZ2V0IHJpZCBvZiBhbnkgaS9vIHJlZGlyZWN0aW9ucyAqLworCXVud2luZChob3cpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworaW50CitjX2Jya2NvbnQoY29uc3QgY2hhciAqKndwKQoreworCWludCBuLCBxdWl0OworCXN0cnVjdCBlbnYgKmVwLCAqbGFzdF9lcCA9IE5VTEw7CisJY29uc3QgY2hhciAqYXJnOworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCWFyZyA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF07CisKKwlpZiAoIWFyZykKKwkJbiA9IDE7CisJZWxzZSBpZiAoIWJpX2dldG4oYXJnLCAmbikpCisJCXJldHVybiAoMSk7CisJcXVpdCA9IG47CisJaWYgKHF1aXQgPD0gMCkgeworCQkvKiBBVCZUIGtzaCBkb2VzIHRoaXMgZm9yIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbHMgb25seSAtIHdlaXJkICovCisJCWJpX2Vycm9yZigiJXM6IGJhZCB2YWx1ZSIsIGFyZyk7CisJCXJldHVybiAoMSk7CisJfQorCisJLyogU3RvcCBhdCBFX05PTkUsIEVfUEFSU0UsIEVfRlVOQywgb3IgRV9JTkNMICovCisJZm9yIChlcCA9IGU7IGVwICYmICFTVE9QX0JSS0NPTlQoZXAtPnR5cGUpOyBlcCA9IGVwLT5vZW52KQorCQlpZiAoZXAtPnR5cGUgPT0gRV9MT09QKSB7CisJCQlpZiAoLS1xdWl0ID09IDApCisJCQkJYnJlYWs7CisJCQllcC0+ZmxhZ3MgfD0gRUZfQlJLQ09OVF9QQVNTOworCQkJbGFzdF9lcCA9IGVwOworCQl9CisKKwlpZiAocXVpdCkgeworCQkvKiBBVCZUIGtzaCBkb2Vzbid0IHByaW50IGEgbWVzc2FnZSAtIGp1c3QgZG9lcyB3aGF0IGl0CisJCSAqIGNhbi4gV2UgcHJpbnQgYSBtZXNzYWdlICdjYXVzZSBpdCBoZWxwcyBpbiBkZWJ1Z2dpbmcKKwkJICogc2NyaXB0cywgYnV0IGRvbid0IGdlbmVyYXRlIGFuIGVycm9yIChpZSwga2VlcCBnb2luZykuCisJCSAqLworCQlpZiAobiA9PSBxdWl0KSB7CisJCQl3YXJuaW5nZih0cnVlLCAiJXM6IGNhbm5vdCAlcyIsIHdwWzBdLCB3cFswXSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCS8qIFBPU0lYIHNheXMgaWYgbiBpcyB0b28gYmlnLCB0aGUgbGFzdCBlbmNsb3NpbmcgbG9vcAorCQkgKiBzaGFsbCBiZSB1c2VkLiBEb2Vzbid0IHNheSB0byBwcmludCBhbiBlcnJvciBidXQgd2UKKwkJICogZG8gYW55d2F5ICdjYXVzZSB0aGUgdXNlciBtZXNzZWQgdXAuCisJCSAqLworCQlpZiAobGFzdF9lcCkKKwkJCWxhc3RfZXAtPmZsYWdzICY9IH5FRl9CUktDT05UX1BBU1M7CisJCXdhcm5pbmdmKHRydWUsICIlczogY2FuIG9ubHkgJXMgJWQgbGV2ZWwocykiLAorCQkgICAgd3BbMF0sIHdwWzBdLCBuIC0gcXVpdCk7CisJfQorCisJdW53aW5kKCp3cFswXSA9PSAnYicgPyBMQlJFQUsgOiBMQ09OVElOKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK2ludAorY19zZXQoY29uc3QgY2hhciAqKndwKQoreworCWludCBhcmdpOworCWJvb2wgc2V0YXJnczsKKwlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7CisJY29uc3QgY2hhciAqKm93cDsKKworCWlmICh3cFsxXSA9PSBOVUxMKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICphcmdzW10gPSB7ICJzZXQiLCAiLSIsIE5VTEwgfTsKKwkJcmV0dXJuIChjX3R5cGVzZXQoYXJncykpOworCX0KKworCWFyZ2kgPSBwYXJzZV9hcmdzKHdwLCBPRl9TRVQsICZzZXRhcmdzKTsKKwlpZiAoYXJnaSA8IDApCisJCXJldHVybiAoMSk7CisJLyogc2V0ICQjIGFuZCAkKiAqLworCWlmIChzZXRhcmdzKSB7CisJCXdwICs9IGFyZ2kgLSAxOworCQlvd3AgPSB3cDsKKwkJd3BbMF0gPSBsLT5hcmd2WzBdOyAvKiBzYXZlICQwICovCisJCXdoaWxlICgqKyt3cCAhPSBOVUxMKQorCQkJc3RyZHVweCgqd3AsICp3cCwgJmwtPmFyZWEpOworCQlsLT5hcmdjID0gd3AgLSBvd3AgLSAxOworCQlsLT5hcmd2ID0gYWxsb2MoKGwtPmFyZ2MgKyAyKSAqIHNpemVvZihjaGFyICopLCAmbC0+YXJlYSk7CisJCWZvciAod3AgPSBsLT5hcmd2OyAoKndwKysgPSAqb3dwKyspICE9IE5VTEw7ICkKKwkJCTsKKwl9CisJLyotCisJICogUE9TSVggc2F5cyBzZXQgZXhpdCBzdGF0dXMgaXMgMCwgYnV0IG9sZCBzY3JpcHRzIHRoYXQgdXNlCisJICogZ2V0b3B0KDEpIHVzZSB0aGUgY29uc3RydWN0CisJICoJc2V0IC0tICQoZ2V0b3B0IGFiOmMgIiRAIikKKwkgKiB3aGljaCBhc3N1bWVzIHRoZSBleGl0IHZhbHVlIHNldCB3aWxsIGJlIHRoYXQgb2YgdGhlICQoKQorCSAqIChzdWJzdF9leHN0YXQgaXMgY2xlYXJlZCBpbiBleGVjdXRlKCkgc28gdGhhdCBpdCB3aWxsIGJlIDAKKwkgKiBpZiB0aGVyZSBhcmUgbm8gY29tbWFuZCBzdWJzdGl0dXRpb25zKS4KKwkgKiBTd2l0Y2hlZCBrc2ggKCFwb3NpeCAhc2gpIHRvIFBPU0lYIGluIG1rc2ggUjM5Yi4KKwkgKi8KKwlyZXR1cm4gKEZsYWcoRlNIKSA/IHN1YnN0X2V4c3RhdCA6IDApOworfQorCitpbnQKK2NfdW5zZXQoY29uc3QgY2hhciAqKndwKQoreworCWNvbnN0IGNoYXIgKmlkOworCWludCBvcHRjOworCWJvb2wgdW5zZXRfdmFyID0gdHJ1ZTsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImZ2IikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnZic6CisJCQl1bnNldF92YXIgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXVuc2V0X3ZhciA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCWZvciAoOyAoaWQgPSAqd3ApICE9IE5VTEw7IHdwKyspCisJCWlmICh1bnNldF92YXIpIHsJLyogdW5zZXQgdmFyaWFibGUgKi8KKwkJCXN0cnVjdCB0YmwgKnZwOworCQkJY2hhciAqY3AgPSBOVUxMOworCQkJc2l6ZV90IG47CisKKwkJCW4gPSBzdHJsZW4oaWQpOworCQkJaWYgKG4gPiAzICYmIGlkW24tM10gPT0gJ1snICYmIGlkW24tMl0gPT0gJyonICYmCisJCQkgICAgaWRbbi0xXSA9PSAnXScpIHsKKwkJCQlzdHJuZHVweChjcCwgaWQsIG4gLSAzLCBBVEVNUCk7CisJCQkJaWQgPSBjcDsKKwkJCQlvcHRjID0gMzsKKwkJCX0gZWxzZQorCQkJCW9wdGMgPSB2c3RyY2hyKGlkLCAnWycpID8gMCA6IDE7CisKKwkJCXZwID0gZ2xvYmFsKGlkKTsKKwkJCWFmcmVlKGNwLCBBVEVNUCk7CisKKwkJCWlmICgodnAtPmZsYWcmUkRPTkxZKSkgeworCQkJCWJpX2Vycm9yZigiJXMgaXMgcmVhZCBvbmx5IiwgdnAtPm5hbWUpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQl1bnNldCh2cCwgb3B0Yyk7CisJCX0gZWxzZQkJCS8qIHVuc2V0IGZ1bmN0aW9uICovCisJCQlkZWZpbmUoaWQsIE5VTEwpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitwX3RpbWUoc3RydWN0IHNoZiAqc2hmLCBib29sIHBvc2l4LCBsb25nIHR2X3NlYywgaW50IHR2X3VzZWMsIGludCB3aWR0aCwKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKK3sKKwl0dl91c2VjIC89IDEwMDAwOworCWlmIChwb3NpeCkKKwkJc2hmX2ZwcmludGYoc2hmLCAiJXMlKmxkLiUwMmQlcyIsIHByZWZpeCwgd2lkdGgsCisJCSAgICB0dl9zZWMsIHR2X3VzZWMsIHN1ZmZpeCk7CisJZWxzZQorCQlzaGZfZnByaW50ZihzaGYsICIlcyUqbGRtJWQuJTAyZHMlcyIsIHByZWZpeCwgd2lkdGgsCisJCSAgICB0dl9zZWMgLyA2MCwgKGludCkodHZfc2VjICUgNjApLCB0dl91c2VjLCBzdWZmaXgpOworfQorCitpbnQKK2NfdGltZXMoY29uc3QgY2hhciAqKndwIE1LU0hfQV9VTlVTRUQpCit7CisJc3RydWN0IHJ1c2FnZSB1c2FnZTsKKworCWdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnVzYWdlKTsKKwlwX3RpbWUoc2hsX3N0ZG91dCwgZmFsc2UsIHVzYWdlLnJ1X3V0aW1lLnR2X3NlYywKKwkgICAgdXNhZ2UucnVfdXRpbWUudHZfdXNlYywgMCwgbnVsbCwgIiAiKTsKKwlwX3RpbWUoc2hsX3N0ZG91dCwgZmFsc2UsIHVzYWdlLnJ1X3N0aW1lLnR2X3NlYywKKwkgICAgdXNhZ2UucnVfc3RpbWUudHZfdXNlYywgMCwgbnVsbCwgIlxuIik7CisKKwlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmdXNhZ2UpOworCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfdXRpbWUudHZfc2VjLAorCSAgICB1c2FnZS5ydV91dGltZS50dl91c2VjLCAwLCBudWxsLCAiICIpOworCXBfdGltZShzaGxfc3Rkb3V0LCBmYWxzZSwgdXNhZ2UucnVfc3RpbWUudHZfc2VjLAorCSAgICB1c2FnZS5ydV9zdGltZS50dl91c2VjLCAwLCBudWxsLCAiXG4iKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiB0aW1lIHBpcGVsaW5lIChyZWFsbHkgYSBzdGF0ZW1lbnQsIG5vdCBhIGJ1aWx0LWluIGNvbW1hbmQpCisgKi8KK2ludAordGltZXgoc3RydWN0IG9wICp0LCBpbnQgZiwgdm9sYXRpbGUgaW50ICp4ZXJyb2spCit7CisjZGVmaW5lIFRGX05PQVJHUwlCSVQoMCkKKyNkZWZpbmUgVEZfTk9SRUFMCUJJVCgxKQkJLyogZG9uJ3QgcmVwb3J0IHJlYWwgdGltZSAqLworI2RlZmluZSBURl9QT1NJWAlCSVQoMikJCS8qIHJlcG9ydCBpbiBQT1NJWCBmb3JtYXQgKi8KKwlpbnQgcnYgPSAwLCB0ZiA9IDA7CisJc3RydWN0IHJ1c2FnZSBydTAsIHJ1MSwgY3J1MCwgY3J1MTsKKwlzdHJ1Y3QgdGltZXZhbCB1c3J0aW1lLCBzeXN0aW1lLCB0djAsIHR2MTsKKworCWdldHRpbWVvZmRheSgmdHYwLCBOVUxMKTsKKwlnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydTApOworCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZjcnUwKTsKKwlpZiAodC0+bGVmdCkgeworCQkvKgorCQkgKiBUd28gd2F5cyBvZiBnZXR0aW5nIGNwdSB1c2FnZSBvZiBhIGNvbW1hbmQ6IGp1c3QgdXNlIHQwCisJCSAqIGFuZCB0MSAod2hpY2ggd2lsbCBnZXQgY3B1IHVzYWdlIGZyb20gb3RoZXIgam9icyB0aGF0CisJCSAqIGZpbmlzaCB3aGlsZSB3ZSBhcmUgZXhlY3V0aW5nIHQtPmxlZnQpLCBvciBnZXQgdGhlCisJCSAqIGNwdSB1c2FnZSBvZiB0LT5sZWZ0LiBBVCZUIGtzaCBkb2VzIHRoZSBmb3JtZXIsIHdoaWxlCisJCSAqIHBka3NoIHRyaWVzIHRvIGRvIHRoZSBsYXRlciAodGhlIGpfdXNydGltZSBoYWNrIGRvZXNuJ3QKKwkJICogcmVhbGx5IHdvcmsgYXMgaXQgb25seSBjb3VudHMgdGhlIGxhc3Qgam9iKS4KKwkJICovCisJCXRpbWVyY2xlYXIoJmpfdXNydGltZSk7CisJCXRpbWVyY2xlYXIoJmpfc3lzdGltZSk7CisJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmIHwgWFRJTUUsIHhlcnJvayk7CisJCWlmICh0LT5sZWZ0LT50eXBlID09IFRDT00pCisJCQl0ZiB8PSB0LT5sZWZ0LT5zdHJbMF07CisJCWdldHRpbWVvZmRheSgmdHYxLCBOVUxMKTsKKwkJZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUxKTsKKwkJZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJmNydTEpOworCX0gZWxzZQorCQl0ZiA9IFRGX05PQVJHUzsKKworCWlmICh0ZiAmIFRGX05PQVJHUykgeyAvKiBrc2g5MyAtIHJlcG9ydCBzaGVsbCB0aW1lcyAoc2hlbGwra2lkcykgKi8KKwkJdGYgfD0gVEZfTk9SRUFMOworCQl0aW1lcmFkZCgmcnUwLnJ1X3V0aW1lLCAmY3J1MC5ydV91dGltZSwgJnVzcnRpbWUpOworCQl0aW1lcmFkZCgmcnUwLnJ1X3N0aW1lLCAmY3J1MC5ydV9zdGltZSwgJnN5c3RpbWUpOworCX0gZWxzZSB7CisJCXRpbWVyc3ViKCZydTEucnVfdXRpbWUsICZydTAucnVfdXRpbWUsICZ1c3J0aW1lKTsKKwkJdGltZXJhZGQoJnVzcnRpbWUsICZqX3VzcnRpbWUsICZ1c3J0aW1lKTsKKwkJdGltZXJzdWIoJnJ1MS5ydV9zdGltZSwgJnJ1MC5ydV9zdGltZSwgJnN5c3RpbWUpOworCQl0aW1lcmFkZCgmc3lzdGltZSwgJmpfc3lzdGltZSwgJnN5c3RpbWUpOworCX0KKworCWlmICghKHRmICYgVEZfTk9SRUFMKSkgeworCQl0aW1lcnN1YigmdHYxLCAmdHYwLCAmdHYxKTsKKwkJaWYgKHRmICYgVEZfUE9TSVgpCisJCQlwX3RpbWUoc2hsX291dCwgdHJ1ZSwgdHYxLnR2X3NlYywgdHYxLnR2X3VzZWMsCisJCQkgICAgNSwgInJlYWwgIiwgIlxuIik7CisJCWVsc2UKKwkJCXBfdGltZShzaGxfb3V0LCBmYWxzZSwgdHYxLnR2X3NlYywgdHYxLnR2X3VzZWMsCisJCQkgICAgNSwgbnVsbCwgIiByZWFsICIpOworCX0KKwlpZiAodGYgJiBURl9QT1NJWCkKKwkJcF90aW1lKHNobF9vdXQsIHRydWUsIHVzcnRpbWUudHZfc2VjLCB1c3J0aW1lLnR2X3VzZWMsCisJCSAgICA1LCAidXNlciAiLCAiXG4iKTsKKwllbHNlCisJCXBfdGltZShzaGxfb3V0LCBmYWxzZSwgdXNydGltZS50dl9zZWMsIHVzcnRpbWUudHZfdXNlYywKKwkJICAgIDUsIG51bGwsICIgdXNlciAiKTsKKwlpZiAodGYgJiBURl9QT1NJWCkKKwkJcF90aW1lKHNobF9vdXQsIHRydWUsIHN5c3RpbWUudHZfc2VjLCBzeXN0aW1lLnR2X3VzZWMsCisJCSAgICA1LCAic3lzICAiLCAiXG4iKTsKKwllbHNlCisJCXBfdGltZShzaGxfb3V0LCBmYWxzZSwgc3lzdGltZS50dl9zZWMsIHN5c3RpbWUudHZfdXNlYywKKwkJICAgIDUsIG51bGwsICIgc3lzdGVtXG4iKTsKKwlzaGZfZmx1c2goc2hsX291dCk7CisKKwlyZXR1cm4gKHJ2KTsKK30KKwordm9pZAordGltZXhfaG9vayhzdHJ1Y3Qgb3AgKnQsIGNoYXIgKip2b2xhdGlsZSAqYXBwKQoreworCWNoYXIgKip3cCA9ICphcHA7CisJaW50IG9wdGMsIGksIGo7CisJR2V0b3B0IG9wdDsKKworCWtzaF9nZXRvcHRfcmVzZXQoJm9wdCwgMCk7CisJb3B0Lm9wdGluZCA9IDA7CS8qIHN0YXJ0IGF0IHRoZSBzdGFydCAqLworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQoKGNvbnN0IGNoYXIgKiopd3AsICZvcHQsICI6cCIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ3AnOgorCQkJdC0+c3RyWzBdIHw9IFRGX1BPU0lYOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJZXJyb3JmKCJ0aW1lOiAtJXMgdW5rbm93biBvcHRpb24iLCBvcHQub3B0YXJnKTsKKwkJY2FzZSAnOic6CisJCQllcnJvcmYoInRpbWU6IC0lcyByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkgICAgb3B0Lm9wdGFyZyk7CisJCX0KKwkvKiBDb3B5IGNvbW1hbmQgd29yZHMgZG93biBvdmVyIG9wdGlvbnMuICovCisJaWYgKG9wdC5vcHRpbmQgIT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgb3B0Lm9wdGluZDsgaSsrKQorCQkJYWZyZWUod3BbaV0sIEFURU1QKTsKKwkJZm9yIChpID0gMCwgaiA9IG9wdC5vcHRpbmQ7ICh3cFtpXSA9IHdwW2pdKTsgaSsrLCBqKyspCisJCQk7CisJfQorCWlmICghd3BbMF0pCisJCXQtPnN0clswXSB8PSBURl9OT0FSR1M7CisJKmFwcCA9IHdwOworfQorCisvKiBleGVjIHdpdGggbm8gYXJncyAtIGFyZ3MgY2FzZSBpcyB0YWtlbiBjYXJlIG9mIGluIGNvbWV4ZWMoKSAqLworaW50CitjX2V4ZWMoY29uc3QgY2hhciAqKndwIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IGk7CisKKwkvKiBtYWtlIHN1cmUgcmVkaXJlY3RzIHN0YXkgaW4gcGxhY2UgKi8KKwlpZiAoZS0+c2F2ZWZkICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IE5VRklMRTsgaSsrKSB7CisJCQlpZiAoZS0+c2F2ZWZkW2ldID4gMCkKKwkJCQljbG9zZShlLT5zYXZlZmRbaV0pOworCQkJLyoKKwkJCSAqIGtlZXAgYWxsIGZpbGUgZGVzY3JpcHRvcnMgPiAyIHByaXZhdGUgZm9yIGtzaCwKKwkJCSAqIGJ1dCBub3QgZm9yIFBPU0lYIG9yIGxlZ2FjeS9rbHVkZ2Ugc2gKKwkJCSAqLworCQkJaWYgKCFGbGFnKEZQT1NJWCkgJiYgIUZsYWcoRlNIKSAmJiBpID4gMiAmJgorCQkJICAgIGUtPnNhdmVmZFtpXSkKKwkJCQlmY250bChpLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKwkJfQorCQllLT5zYXZlZmQgPSBOVUxMOworCX0KKwlyZXR1cm4gKDApOworfQorCisjaWYgSEFWRV9NS05PRAoraW50CitjX21rbm9kKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgYXJnYywgb3B0YywgcnYgPSAwOworCWJvb2wgaXNta2ZpZm8gPSBmYWxzZTsKKwljb25zdCBjaGFyICoqYXJndjsKKwl2b2lkICpzZXQgPSBOVUxMOworCW1vZGVfdCBtb2RlID0gMCwgb2xkbW9kZSA9IDA7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJtOiIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnbSc6CisJCQlzZXQgPSBzZXRtb2RlKGJ1aWx0aW5fb3B0Lm9wdGFyZyk7CisJCQlpZiAoc2V0ID09IE5VTEwpIHsKKwkJCQliaV9lcnJvcmYoImludmFsaWQgZmlsZSBtb2RlIik7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCW1vZGUgPSBnZXRtb2RlKHNldCwgKG1vZGVfdCkoREVGRklMRU1PREUpKTsKKwkJCWZyZWUoc2V0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBjX21rbm9kX3VzYWdlOworCQl9CisJfQorCWFyZ3YgPSAmd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKKwlpZiAoYXJndlswXSA9PSBOVUxMKQorCQlnb3RvIGNfbWtub2RfdXNhZ2U7CisJZm9yIChhcmdjID0gMDsgYXJndlthcmdjXTsgYXJnYysrKQorCQk7CisJaWYgKGFyZ2MgPT0gMiAmJiBhcmd2WzFdWzBdID09ICdwJykKKwkJaXNta2ZpZm8gPSB0cnVlOworCWVsc2UgaWYgKGFyZ2MgIT0gNCB8fCAoYXJndlsxXVswXSAhPSAnYicgJiYgYXJndlsxXVswXSAhPSAnYycpKQorCQlnb3RvIGNfbWtub2RfdXNhZ2U7CisKKwlpZiAoc2V0ICE9IE5VTEwpCisJCW9sZG1vZGUgPSB1bWFzaygobW9kZV90KTApOworCWVsc2UKKwkJbW9kZSA9IERFRkZJTEVNT0RFOworCisJbW9kZSB8PSAoYXJndlsxXVswXSA9PSAnYicpID8gU19JRkJMSyA6CisJICAgIChhcmd2WzFdWzBdID09ICdjJykgPyBTX0lGQ0hSIDogMDsKKworCWlmICghaXNta2ZpZm8pIHsKKwkJdW5zaWduZWQgbG9uZyBtYWpudW0sIG1pbm51bTsKKwkJZGV2X3QgZHY7CisJCWNoYXIgKmM7CisKKwkJbWFqbnVtID0gc3RydG91bChhcmd2WzJdLCAmYywgMCk7CisJCWlmICgoYyA9PSBhcmd2WzJdKSB8fCAoKmMgIT0gJ1wwJykpIHsKKwkJCWJpX2Vycm9yZigibm9uLW51bWVyaWMgZGV2aWNlIG1ham9yICclcyciLCBhcmd2WzJdKTsKKwkJCWdvdG8gY19ta25vZF9lcnI7CisJCX0KKwkJbWlubnVtID0gc3RydG91bChhcmd2WzNdLCAmYywgMCk7CisJCWlmICgoYyA9PSBhcmd2WzNdKSB8fCAoKmMgIT0gJ1wwJykpIHsKKwkJCWJpX2Vycm9yZigibm9uLW51bWVyaWMgZGV2aWNlIG1pbm9yICclcyciLCBhcmd2WzNdKTsKKwkJCWdvdG8gY19ta25vZF9lcnI7CisJCX0KKwkJZHYgPSBtYWtlZGV2KG1ham51bSwgbWlubnVtKTsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKShtYWpvcihkdikpICE9IG1ham51bSkgeworCQkJYmlfZXJyb3JmKCJkZXZpY2UgbWFqb3IgdG9vIGxhcmdlOiAlbHUiLCBtYWpudW0pOworCQkJZ290byBjX21rbm9kX2VycjsKKwkJfQorCQlpZiAoKHVuc2lnbmVkIGxvbmcpKG1pbm9yKGR2KSkgIT0gbWlubnVtKSB7CisJCQliaV9lcnJvcmYoImRldmljZSBtaW5vciB0b28gbGFyZ2U6ICVsdSIsIG1pbm51bSk7CisJCQlnb3RvIGNfbWtub2RfZXJyOworCQl9CisJCWlmIChta25vZChhcmd2WzBdLCBtb2RlLCBkdikpCisJCQlnb3RvIGNfbWtub2RfZmFpbGVkOworCX0gZWxzZSBpZiAobWtmaWZvKGFyZ3ZbMF0sIG1vZGUpKSB7CisgY19ta25vZF9mYWlsZWQ6CisJCWJpX2Vycm9yZigiJXM6ICVzIiwgKndwLCBzdHJlcnJvcihlcnJubykpOworIGNfbWtub2RfZXJyOgorCQlydiA9IDE7CisJfQorCisJaWYgKHNldCkKKwkJdW1hc2sob2xkbW9kZSk7CisJcmV0dXJuIChydik7CisgY19ta25vZF91c2FnZToKKwliaV9lcnJvcmYoInVzYWdlOiBta25vZCBbLW0gbW9kZV0gbmFtZSBifGMgbWFqb3IgbWlub3IiKTsKKwliaV9lcnJvcmYoInVzYWdlOiBta25vZCBbLW0gbW9kZV0gbmFtZSBwIik7CisJcmV0dXJuICgxKTsKK30KKyNlbmRpZgorCisvKiBkdW1teSBmdW5jdGlvbiwgc3BlY2lhbCBjYXNlIGluIGNvbWV4ZWMoKSAqLworaW50CitjX2J1aWx0aW4oY29uc3QgY2hhciAqKndwIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyogdGVzdCgxKSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKwlvZXhwcgk6Oj0gYWV4cHIgfCBhZXhwciAiLW8iIG9leHByIDsKKwlhZXhwcgk6Oj0gbmV4cHIgfCBuZXhwciAiLWEiIGFleHByIDsKKwluZXhwcgk6Oj0gcHJpbWFyeSB8ICIhIiBuZXhwciA7CisJcHJpbWFyeQk6Oj0gdW5hcnktb3BlcmF0b3Igb3BlcmFuZAorCQl8IG9wZXJhbmQgYmluYXJ5LW9wZXJhdG9yIG9wZXJhbmQKKwkJfCBvcGVyYW5kCisJCXwgIigiIG9leHByICIpIgorCQk7CisKKwl1bmFyeS1vcGVyYXRvciA6Oj0gIi1hInwiLXIifCItdyJ8Ii14InwiLWUifCItZiJ8Ii1kInwiLWMifCItYiJ8Ii1wInwKKwkJCSAgICItdSJ8Ii1nInwiLWsifCItcyJ8Ii10InwiLXoifCItbiJ8Ii1vInwiLU8ifCItRyJ8CisJCQkgICAiLUwifCItaCJ8Ii1TInwiLUgiOworCisJYmluYXJ5LW9wZXJhdG9yIDo6PSAiPSJ8Ij09InwiIT0ifCItZXEifCItbmUifCItZ2UifCItZ3QifCItbGUifCItbHQifAorCQkJICAgICItbnQifCItb3QifCItZWYifAorCQkJICAgICI8InwiPiIJIyBydWxlcyB1c2VkIGZvciBbWyAuLiBdXSBleHByZXNzaW9ucworCQkJICAgIDsKKwlvcGVyYW5kIDo6PSA8YW55IHRoaW5nPgorKi8KKworI2RlZmluZSBUX0VSUl9FWElUCTIJLyogUE9TSVggc2F5cyA+IDEgZm9yIGVycm9ycyAqLworCitpbnQKK2NfdGVzdChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IGFyZ2MsIHJlczsKKwlUZXN0X2VudiB0ZTsKKworCXRlLmZsYWdzID0gMDsKKwl0ZS5pc2EgPSBwdGVzdF9pc2E7CisJdGUuZ2V0b3BuZCA9IHB0ZXN0X2dldG9wbmQ7CisJdGUuZXZhbCA9IHRlc3RfZXZhbDsKKwl0ZS5lcnJvciA9IHB0ZXN0X2Vycm9yOworCisJZm9yIChhcmdjID0gMDsgd3BbYXJnY107IGFyZ2MrKykKKwkJOworCisJaWYgKHN0cmNtcCh3cFswXSwgIlsiKSA9PSAwKSB7CisJCWlmIChzdHJjbXAod3BbLS1hcmdjXSwgIl0iKSAhPSAwKSB7CisJCQliaV9lcnJvcmYoIm1pc3NpbmcgXSIpOworCQkJcmV0dXJuIChUX0VSUl9FWElUKTsKKwkJfQorCX0KKworCXRlLnBvcy53cCA9IHdwICsgMTsKKwl0ZS53cF9lbmQgPSB3cCArIGFyZ2M7CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlcyBmcm9tIFBPU0lYLjIsIHNlY3Rpb24gNC42Mi40LgorCSAqIEltcGxlbWVudGF0aW9uIG9mIGFsbCB0aGUgcnVsZXMgaXNuJ3QgbmVjZXNzYXJ5IHNpbmNlCisJICogb3VyIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBmb3IgdGhlIG9taXR0ZWQgc3RlcHMuCisJICovCisJaWYgKGFyZ2MgPD0gNSkgeworCQljb25zdCBjaGFyICoqb3dwID0gd3A7CisJCWludCBpbnZlcnQgPSAwOworCQlUZXN0X29wIG9wOworCQljb25zdCBjaGFyICpvcG5kMSwgKm9wbmQyOworCisJCXdoaWxlICgtLWFyZ2MgPj0gMCkgeworCQkJaWYgKCgqdGUuaXNhKSgmdGUsIFRNX0VORCkpCisJCQkJcmV0dXJuICghMCk7CisJCQlpZiAoYXJnYyA9PSAzKSB7CisJCQkJb3BuZDEgPSAoKnRlLmdldG9wbmQpKCZ0ZSwgVE9fTk9OT1AsIDEpOworCQkJCWlmICgob3AgPSAoKnRlLmlzYSkoJnRlLCBUTV9CSU5PUCkpKSB7CisJCQkJCW9wbmQyID0gKCp0ZS5nZXRvcG5kKSgmdGUsIG9wLCAxKTsKKwkJCQkJcmVzID0gKCp0ZS5ldmFsKSgmdGUsIG9wLCBvcG5kMSwKKwkJCQkJICAgIG9wbmQyLCAxKTsKKwkJCQkJaWYgKHRlLmZsYWdzICYgVEVGX0VSUk9SKQorCQkJCQkJcmV0dXJuIChUX0VSUl9FWElUKTsKKwkJCQkJaWYgKGludmVydCAmIDEpCisJCQkJCQlyZXMgPSAhcmVzOworCQkJCQlyZXR1cm4gKCFyZXMpOworCQkJCX0KKwkJCQkvKiBiYWNrIHVwIHRvIG9wbmQxICovCisJCQkJdGUucG9zLndwLS07CisJCQl9CisJCQlpZiAoYXJnYyA9PSAxKSB7CisJCQkJb3BuZDEgPSAoKnRlLmdldG9wbmQpKCZ0ZSwgVE9fTk9OT1AsIDEpOworCQkJCWlmIChzdHJjbXAob3BuZDEsICItdCIpID09IDApCisJCQkJICAgIGJyZWFrOworCQkJCXJlcyA9ICgqdGUuZXZhbCkoJnRlLCBUT19TVE5aRSwgb3BuZDEsCisJCQkJICAgIE5VTEwsIDEpOworCQkJCWlmIChpbnZlcnQgJiAxKQorCQkJCQlyZXMgPSAhcmVzOworCQkJCXJldHVybiAoIXJlcyk7CisJCQl9CisJCQlpZiAoKCp0ZS5pc2EpKCZ0ZSwgVE1fTk9UKSkgeworCQkJCWludmVydCsrOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CisJCX0KKwkJdGUucG9zLndwID0gb3dwICsgMTsKKwl9CisKKwlyZXR1cm4gKHRlc3RfcGFyc2UoJnRlKSk7Cit9CisKKy8qCisgKiBHZW5lcmljIHRlc3Qgcm91dGluZXMuCisgKi8KKworVGVzdF9vcAordGVzdF9pc29wKFRlc3RfbWV0YSBtZXRhLCBjb25zdCBjaGFyICpzKQoreworCWNoYXIgc2MxOworCWNvbnN0IHN0cnVjdCB0X29wICp0Ymw7CisKKwl0YmwgPSBtZXRhID09IFRNX1VOT1AgPyB1X29wcyA6IGJfb3BzOworCWlmICgqcykgeworCQlzYzEgPSBzWzFdOworCQlmb3IgKDsgdGJsLT5vcF90ZXh0WzBdOyB0YmwrKykKKwkJCWlmIChzYzEgPT0gdGJsLT5vcF90ZXh0WzFdICYmICFzdHJjbXAocywgdGJsLT5vcF90ZXh0KSkKKwkJCQlyZXR1cm4gKHRibC0+b3BfbnVtKTsKKwl9CisJcmV0dXJuIChUT19OT05PUCk7Cit9CisKK2ludAordGVzdF9ldmFsKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCwgY29uc3QgY2hhciAqb3BuZDEsIGNvbnN0IGNoYXIgKm9wbmQyLAorICAgIGJvb2wgZG9fZXZhbCkKK3sKKwlpbnQgaSwgczsKKwlzaXplX3QgazsKKwlzdHJ1Y3Qgc3RhdCBiMSwgYjI7CisJbWtzaF9hcmlfdCB2MSwgdjI7CisKKwlpZiAoIWRvX2V2YWwpCisJCXJldHVybiAoMCk7CisKKwlzd2l0Y2ggKChpbnQpb3ApIHsKKwkvKgorCSAqIFVuYXJ5IE9wZXJhdG9ycworCSAqLworCWNhc2UgVE9fU1ROWkU6IC8qIC1uICovCisJCXJldHVybiAoKm9wbmQxICE9ICdcMCcpOworCWNhc2UgVE9fU1RaRVI6IC8qIC16ICovCisJCXJldHVybiAoKm9wbmQxID09ICdcMCcpOworCWNhc2UgVE9fT1BUSU9OOiAvKiAtbyAqLworCQlpZiAoKGkgPSAqb3BuZDEpID09ICchJyB8fCBpID09ICc/JykKKwkJCW9wbmQxKys7CisJCWlmICgoayA9IG9wdGlvbihvcG5kMSkpID09IChzaXplX3QpLTEpCisJCQlyZXR1cm4gKDApOworCQlyZXR1cm4gKGkgPT0gJz8nID8gMSA6IGkgPT0gJyEnID8gIUZsYWcoaykgOiBGbGFnKGspKTsKKwljYXNlIFRPX0ZJTFJEOiAvKiAtciAqLworCQlyZXR1cm4gKHRlc3RfZWFjY2VzcyhvcG5kMSwgUl9PSykgPT0gMCk7CisJY2FzZSBUT19GSUxXUjogLyogLXcgKi8KKwkJcmV0dXJuICh0ZXN0X2VhY2Nlc3Mob3BuZDEsIFdfT0spID09IDApOworCWNhc2UgVE9fRklMRVg6IC8qIC14ICovCisJCXJldHVybiAodGVzdF9lYWNjZXNzKG9wbmQxLCBYX09LKSA9PSAwKTsKKwljYXNlIFRPX0ZJTEFYU1Q6IC8qIC1hICovCisJY2FzZSBUT19GSUxFWFNUOiAvKiAtZSAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCk7CisJY2FzZSBUT19GSUxSRUc6IC8qIC1yICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNSRUcoYjEuc3RfbW9kZSkpOworCWNhc2UgVE9fRklMSUQ6IC8qIC1kICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNESVIoYjEuc3RfbW9kZSkpOworCWNhc2UgVE9fRklMQ0RFVjogLyogLWMgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0NIUihiMS5zdF9tb2RlKSk7CisJY2FzZSBUT19GSUxCREVWOiAvKiAtYiAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTQkxLKGIxLnN0X21vZGUpKTsKKwljYXNlIFRPX0ZJTEZJRk86IC8qIC1wICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNGSUZPKGIxLnN0X21vZGUpKTsKKwljYXNlIFRPX0ZJTFNZTTogLyogLWggLUwgKi8KKwkJcmV0dXJuIChsc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNMTksoYjEuc3RfbW9kZSkpOworCWNhc2UgVE9fRklMU09DSzogLyogLVMgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU1NPQ0soYjEuc3RfbW9kZSkpOworCWNhc2UgVE9fRklMQ0RGOi8qIC1IIEhQIGNvbnRleHQgZGVwZW5kZW50IGZpbGVzIChkaXJlY3RvcmllcykgKi8KKwkJcmV0dXJuICgwKTsKKwljYXNlIFRPX0ZJTFNFVFU6IC8qIC11ICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmCisJCSAgICAoYjEuc3RfbW9kZSAmIFNfSVNVSUQpID09IFNfSVNVSUQpOworCWNhc2UgVE9fRklMU0VURzogLyogLWcgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKKwkJICAgIChiMS5zdF9tb2RlICYgU19JU0dJRCkgPT0gU19JU0dJRCk7CisJY2FzZSBUT19GSUxTVENLOiAvKiAtayAqLworI2lmZGVmIFNfSVNWVFgKKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKKwkJICAgIChiMS5zdF9tb2RlICYgU19JU1ZUWCkgPT0gU19JU1ZUWCk7CisjZWxzZQorCQlyZXR1cm4gKDApOworI2VuZGlmCisJY2FzZSBUT19GSUxHWjogLyogLXMgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgYjEuc3Rfc2l6ZSA+IDBMKTsKKwljYXNlIFRPX0ZJTFRUOiAvKiAtdCAqLworCQlpZiAob3BuZDEgJiYgIWJpX2dldG4ob3BuZDEsICZpKSkgeworCQkJdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKKwkJCWkgPSAwOworCQl9IGVsc2UKKwkJCWkgPSBpc2F0dHkob3BuZDEgPyBpIDogMCk7CisJCXJldHVybiAoaSk7CisJY2FzZSBUT19GSUxVSUQ6IC8qIC1PICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIGIxLnN0X3VpZCA9PSBrc2hldWlkKTsKKwljYXNlIFRPX0ZJTEdJRDogLyogLUcgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgYjEuc3RfZ2lkID09IGdldGVnaWQoKSk7CisJLyoKKwkgKiBCaW5hcnkgT3BlcmF0b3JzCisJICovCisJY2FzZSBUT19TVEVRTDogLyogPSAqLworCQlpZiAodGUtPmZsYWdzICYgVEVGX0RCUkFDS0VUKQorCQkJcmV0dXJuIChnbWF0Y2h4KG9wbmQxLCBvcG5kMiwgZmFsc2UpKTsKKwkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSA9PSAwKTsKKwljYXNlIFRPX1NUTkVROiAvKiAhPSAqLworCQlpZiAodGUtPmZsYWdzICYgVEVGX0RCUkFDS0VUKQorCQkJcmV0dXJuICghZ21hdGNoeChvcG5kMSwgb3BuZDIsIGZhbHNlKSk7CisJCXJldHVybiAoc3RyY21wKG9wbmQxLCBvcG5kMikgIT0gMCk7CisJY2FzZSBUT19TVExUOiAvKiA8ICovCisJCXJldHVybiAoc3RyY21wKG9wbmQxLCBvcG5kMikgPCAwKTsKKwljYXNlIFRPX1NUR1Q6IC8qID4gKi8KKwkJcmV0dXJuIChzdHJjbXAob3BuZDEsIG9wbmQyKSA+IDApOworCWNhc2UgVE9fSU5URVE6IC8qIC1lcSAqLworCWNhc2UgVE9fSU5UTkU6IC8qIC1uZSAqLworCWNhc2UgVE9fSU5UR0U6IC8qIC1nZSAqLworCWNhc2UgVE9fSU5UR1Q6IC8qIC1ndCAqLworCWNhc2UgVE9fSU5UTEU6IC8qIC1sZSAqLworCWNhc2UgVE9fSU5UTFQ6IC8qIC1sdCAqLworCQlpZiAoIWV2YWx1YXRlKG9wbmQxLCAmdjEsIEtTSF9SRVRVUk5fRVJST1IsIGZhbHNlKSB8fAorCQkgICAgIWV2YWx1YXRlKG9wbmQyLCAmdjIsIEtTSF9SRVRVUk5fRVJST1IsIGZhbHNlKSkgeworCQkJLyogZXJyb3IgYWxyZWFkeSBwcmludGVkLi4gKi8KKwkJCXRlLT5mbGFncyB8PSBURUZfRVJST1I7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCXN3aXRjaCAoKGludClvcCkgeworCQljYXNlIFRPX0lOVEVROgorCQkJcmV0dXJuICh2MSA9PSB2Mik7CisJCWNhc2UgVE9fSU5UTkU6CisJCQlyZXR1cm4gKHYxICE9IHYyKTsKKwkJY2FzZSBUT19JTlRHRToKKwkJCXJldHVybiAodjEgPj0gdjIpOworCQljYXNlIFRPX0lOVEdUOgorCQkJcmV0dXJuICh2MSA+IHYyKTsKKwkJY2FzZSBUT19JTlRMRToKKwkJCXJldHVybiAodjEgPD0gdjIpOworCQljYXNlIFRPX0lOVExUOgorCQkJcmV0dXJuICh2MSA8IHYyKTsKKwkJfQorCWNhc2UgVE9fRklMTlQ6IC8qIC1udCAqLworCQkvKiBrc2g4OC9rc2g5MyBzdWNjZWVkIGlmIGZpbGUyIGNhbid0IGJlIHN0YXRlZAorCQkgKiAoc3VidGx5IGRpZmZlcmVudCBmcm9tICdkb2VzIG5vdCBleGlzdCcpLgorCQkgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYKKwkJICAgICgoKHMgPSBzdGF0KG9wbmQyLCAmYjIpKSA9PSAwICYmCisJCSAgICBiMS5zdF9tdGltZSA+IGIyLnN0X210aW1lKSB8fCBzIDwgMCkpOworCWNhc2UgVE9fRklMT1Q6IC8qIC1vdCAqLworCQkvKiBrc2g4OC9rc2g5MyBzdWNjZWVkIGlmIGZpbGUxIGNhbid0IGJlIHN0YXRlZAorCQkgKiAoc3VidGx5IGRpZmZlcmVudCBmcm9tICdkb2VzIG5vdCBleGlzdCcpLgorCQkgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQyLCAmYjIpID09IDAgJiYKKwkJICAgICgoKHMgPSBzdGF0KG9wbmQxLCAmYjEpKSA9PSAwICYmCisJCSAgICBiMS5zdF9tdGltZSA8IGIyLnN0X210aW1lKSB8fCBzIDwgMCkpOworCWNhc2UgVE9fRklMRVE6IC8qIC1lZiAqLworCQlyZXR1cm4gKHN0YXQgKG9wbmQxLCAmYjEpID09IDAgJiYgc3RhdCAob3BuZDIsICZiMikgPT0gMCAmJgorCQkgICAgYjEuc3RfZGV2ID09IGIyLnN0X2RldiAmJiBiMS5zdF9pbm8gPT0gYjIuc3RfaW5vKTsKKwl9CisJKCp0ZS0+ZXJyb3IpKHRlLCAwLCAiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gb3AiKTsKKwlyZXR1cm4gKDEpOworfQorCisvKiBPbiBtb3N0L2FsbCB1bml4ZW4sIGFjY2VzcygpIHNheXMgZXZlcnl0aGluZyBpcyBleGVjdXRhYmxlIGZvciByb290Li4uICovCitzdGF0aWMgaW50Cit0ZXN0X2VhY2Nlc3MoY29uc3QgY2hhciAqcGF0aGwsIGludCBtb2RlKQoreworCWludCBydjsKKworCWlmICgocnYgPSBhY2Nlc3MocGF0aGwsIG1vZGUpKSA9PSAwICYmIGtzaGV1aWQgPT0gMCAmJiAobW9kZSAmIFhfT0spKSB7CisJCXN0cnVjdCBzdGF0IHN0YXRiOworCisJCWlmIChzdGF0KHBhdGhsLCAmc3RhdGIpIDwgMCkKKwkJCXJ2ID0gLTE7CisJCWVsc2UgaWYgKFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpCisJCQlydiA9IDA7CisJCWVsc2UKKwkJCXJ2ID0gKHN0YXRiLnN0X21vZGUgJiAoU19JWFVTUnxTX0lYR1JQfFNfSVhPVEgpKSA/CisJCQkgICAgMCA6IC0xOworCX0KKwlyZXR1cm4gKHJ2KTsKK30KKworaW50Cit0ZXN0X3BhcnNlKFRlc3RfZW52ICp0ZSkKK3sKKwlpbnQgcnY7CisKKwlydiA9IHRlc3Rfb2V4cHIodGUsIDEpOworCisJaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAhKCp0ZS0+aXNhKSh0ZSwgVE1fRU5EKSkKKwkJKCp0ZS0+ZXJyb3IpKHRlLCAwLCAidW5leHBlY3RlZCBvcGVyYXRvci9vcGVyYW5kIik7CisKKwlyZXR1cm4gKCh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpID8gVF9FUlJfRVhJVCA6ICFydik7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3Rfb2V4cHIoVGVzdF9lbnYgKnRlLCBib29sIGRvX2V2YWwpCit7CisJaW50IHJ2OworCisJaWYgKChydiA9IHRlc3RfYWV4cHIodGUsIGRvX2V2YWwpKSkKKwkJZG9fZXZhbCA9IGZhbHNlOworCWlmICghKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgJiYgKCp0ZS0+aXNhKSh0ZSwgVE1fT1IpKQorCQlyZXR1cm4gKHRlc3Rfb2V4cHIodGUsIGRvX2V2YWwpIHx8IHJ2KTsKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIGludAordGVzdF9hZXhwcihUZXN0X2VudiAqdGUsIGJvb2wgZG9fZXZhbCkKK3sKKwlpbnQgcnY7CisKKwlpZiAoIShydiA9IHRlc3RfbmV4cHIodGUsIGRvX2V2YWwpKSkKKwkJZG9fZXZhbCA9IGZhbHNlOworCWlmICghKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgJiYgKCp0ZS0+aXNhKSh0ZSwgVE1fQU5EKSkKKwkJcmV0dXJuICh0ZXN0X2FleHByKHRlLCBkb19ldmFsKSAmJiBydik7CisJcmV0dXJuIChydik7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RfbmV4cHIoVGVzdF9lbnYgKnRlLCBib29sIGRvX2V2YWwpCit7CisJaWYgKCEodGUtPmZsYWdzICYgVEVGX0VSUk9SKSAmJiAoKnRlLT5pc2EpKHRlLCBUTV9OT1QpKQorCQlyZXR1cm4gKCF0ZXN0X25leHByKHRlLCBkb19ldmFsKSk7CisJcmV0dXJuICh0ZXN0X3ByaW1hcnkodGUsIGRvX2V2YWwpKTsKK30KKworc3RhdGljIGludAordGVzdF9wcmltYXJ5KFRlc3RfZW52ICp0ZSwgYm9vbCBkb19ldmFsKQoreworCWNvbnN0IGNoYXIgKm9wbmQxLCAqb3BuZDI7CisJaW50IHJ2OworCVRlc3Rfb3Agb3A7CisKKwlpZiAodGUtPmZsYWdzICYgVEVGX0VSUk9SKQorCQlyZXR1cm4gKDApOworCWlmICgoKnRlLT5pc2EpKHRlLCBUTV9PUEFSRU4pKSB7CisJCXJ2ID0gdGVzdF9vZXhwcih0ZSwgZG9fZXZhbCk7CisJCWlmICh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpCisJCQlyZXR1cm4gKDApOworCQlpZiAoISgqdGUtPmlzYSkodGUsIFRNX0NQQVJFTikpIHsKKwkJCSgqdGUtPmVycm9yKSh0ZSwgMCwgIm1pc3NpbmcgY2xvc2luZyBwYXJlbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlyZXR1cm4gKHJ2KTsKKwl9CisJLyoKKwkgKiBCaW5hcnkgc2hvdWxkIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHVuYXJ5IGluIHRoaXMgY2FzZQorCSAqIHNvIHRoYXQgc29tZXRoaW5nIGxpa2UgdGVzdCBcKCAtZiA9IC1mIFwpIGlzIGFjY2VwdGVkCisJICovCisJaWYgKCh0ZS0+ZmxhZ3MgJiBURUZfREJSQUNLRVQpIHx8ICgmdGUtPnBvcy53cFsxXSA8IHRlLT53cF9lbmQgJiYKKwkgICAgIXRlc3RfaXNvcChUTV9CSU5PUCwgdGUtPnBvcy53cFsxXSkpKSB7CisJCWlmICgob3AgPSAoKnRlLT5pc2EpKHRlLCBUTV9VTk9QKSkpIHsKKwkJCS8qIHVuYXJ5IGV4cHJlc3Npb24gKi8KKwkJCW9wbmQxID0gKCp0ZS0+Z2V0b3BuZCkodGUsIG9wLCBkb19ldmFsKTsKKwkJCWlmICghb3BuZDEpIHsKKwkJCQkoKnRlLT5lcnJvcikodGUsIC0xLCAibWlzc2luZyBhcmd1bWVudCIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisKKwkJCXJldHVybiAoKCp0ZS0+ZXZhbCkodGUsIG9wLCBvcG5kMSwgTlVMTCwgZG9fZXZhbCkpOworCQl9CisJfQorCW9wbmQxID0gKCp0ZS0+Z2V0b3BuZCkodGUsIFRPX05PTk9QLCBkb19ldmFsKTsKKwlpZiAoIW9wbmQxKSB7CisJCSgqdGUtPmVycm9yKSh0ZSwgMCwgImV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKChvcCA9ICgqdGUtPmlzYSkodGUsIFRNX0JJTk9QKSkpIHsKKwkJLyogYmluYXJ5IGV4cHJlc3Npb24gKi8KKwkJb3BuZDIgPSAoKnRlLT5nZXRvcG5kKSh0ZSwgb3AsIGRvX2V2YWwpOworCQlpZiAoIW9wbmQyKSB7CisJCQkoKnRlLT5lcnJvcikodGUsIC0xLCAibWlzc2luZyBzZWNvbmQgYXJndW1lbnQiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQlyZXR1cm4gKCgqdGUtPmV2YWwpKHRlLCBvcCwgb3BuZDEsIG9wbmQyLCBkb19ldmFsKSk7CisJfQorCXJldHVybiAoKCp0ZS0+ZXZhbCkodGUsIFRPX1NUTlpFLCBvcG5kMSwgTlVMTCwgZG9fZXZhbCkpOworfQorCisvKgorICogUGxhaW4gdGVzdCAodGVzdCBhbmQgWyAuLiBdKSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqLworCisvKgorICogVGVzdCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHdoYXRldmVyLiBBY2NlcHRzIHRoZSBjdXJyZW50IHRva2VuIGlmCisgKiBpdCBpcy4gUmV0dXJucyAwIGlmIGl0IGlzIG5vdCwgbm9uLXplcm8gaWYgaXQgaXMgKGluIHRoZSBjYXNlIG9mCisgKiBUTV9VTk9QIGFuZCBUTV9CSU5PUCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgVGVzdF9vcCkuCisgKi8KK3N0YXRpYyBUZXN0X29wCitwdGVzdF9pc2EoVGVzdF9lbnYgKnRlLCBUZXN0X21ldGEgbWV0YSkKK3sKKwkvKiBPcmRlciBpbXBvcnRhbnQgLSBpbmRleGVkIGJ5IFRlc3RfbWV0YSB2YWx1ZXMgKi8KKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdG9rZW5zW10gPSB7CisJCSItbyIsICItYSIsICIhIiwgIigiLCAiKSIKKwl9OworCVRlc3Rfb3AgcnY7CisKKwlpZiAodGUtPnBvcy53cCA+PSB0ZS0+d3BfZW5kKQorCQlyZXR1cm4gKG1ldGEgPT0gVE1fRU5EID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QKTsKKworCWlmIChtZXRhID09IFRNX1VOT1AgfHwgbWV0YSA9PSBUTV9CSU5PUCkKKwkJcnYgPSB0ZXN0X2lzb3AobWV0YSwgKnRlLT5wb3Mud3ApOworCWVsc2UgaWYgKG1ldGEgPT0gVE1fRU5EKQorCQlydiA9IFRPX05PTk9QOworCWVsc2UKKwkJcnYgPSAhc3RyY21wKCp0ZS0+cG9zLndwLCB0b2tlbnNbKGludCltZXRhXSkgPworCQkgICAgVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCisJLyogQWNjZXB0IHRoZSB0b2tlbj8gKi8KKwlpZiAocnYgIT0gVE9fTk9OT1ApCisJCXRlLT5wb3Mud3ArKzsKKworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitwdGVzdF9nZXRvcG5kKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCwgYm9vbCBkb19ldmFsIE1LU0hfQV9VTlVTRUQpCit7CisJaWYgKHRlLT5wb3Mud3AgPj0gdGUtPndwX2VuZCkKKwkJcmV0dXJuIChvcCA9PSBUT19GSUxUVCA/ICIxIiA6IE5VTEwpOworCXJldHVybiAoKnRlLT5wb3Mud3ArKyk7Cit9CisKK3N0YXRpYyB2b2lkCitwdGVzdF9lcnJvcihUZXN0X2VudiAqdGUsIGludCBvZnMsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwljb25zdCBjaGFyICpvcDsKKworCXRlLT5mbGFncyB8PSBURUZfRVJST1I7CisJaWYgKChvcCA9IHRlLT5wb3Mud3AgKyBvZnMgPj0gdGUtPndwX2VuZCA/IE5VTEwgOiB0ZS0+cG9zLndwW29mc10pKQorCQliaV9lcnJvcmYoIiVzOiAlcyIsIG9wLCBtc2cpOworCWVsc2UKKwkJYmlfZXJyb3JmKCIlcyIsIG1zZyk7Cit9CisKKyNpZm5kZWYgTUtTSF9OT19MSU1JVFMKKyNkZWZpbmUgU09GVAkweDEKKyNkZWZpbmUgSEFSRAkweDIKKworc3RydWN0IGxpbWl0cyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgcmVzb3VyY2U7CQkvKiByZXNvdXJjZSB0byBnZXQvc2V0ICovCisJaW50IGZhY3RvcjsJCS8qIG11bHRpcGx5IGJ5IHRvIGdldCBybGltX3tjdXIsbWF4fSB2YWx1ZXMgKi8KKwljaGFyIG9wdGlvbjsKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICosIGludCk7CitzdGF0aWMgaW50IHNldF91bGltaXQoY29uc3Qgc3RydWN0IGxpbWl0cyAqLCBjb25zdCBjaGFyICosIGludCk7CisKKy8qIE1hZ2ljIHRvIGRpdmluZSB0aGUgJ20nIGFuZCAndicgbGltaXRzICovCisKKyNpZmRlZiBSTElNSVRfQVMKKyNpZiAhZGVmaW5lZChSTElNSVRfVk1FTSkgfHwgKFJMSU1JVF9WTUVNID09IFJMSU1JVF9BUykgfHwgXAorICAgICFkZWZpbmVkKFJMSU1JVF9SU1MpIHx8IChSTElNSVRfVk1FTSA9PSBSTElNSVRfUlNTKQorI2RlZmluZSBVTElNSVRfVl9JU19BUworI2VsaWYgZGVmaW5lZChSTElNSVRfVk1FTSkKKyNpZiAhZGVmaW5lZChSTElNSVRfUlNTKSB8fCAoUkxJTUlUX1JTUyA9PSBSTElNSVRfQVMpCisjZGVmaW5lIFVMSU1JVF9WX0lTX0FTCisjZWxzZQorI2RlZmluZSBVTElNSVRfVl9JU19WTUVNCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBSTElNSVRfUlNTCisjaWZkZWYgVUxJTUlUX1ZfSVNfVk1FTQorI2RlZmluZSBVTElNSVRfTV9JU19SU1MKKyNlbGlmIGRlZmluZWQoUkxJTUlUX1ZNRU0pICYmIChSTElNSVRfVk1FTSA9PSBSTElNSVRfUlNTKQorI2RlZmluZSBVTElNSVRfTV9JU19WTUVNCisjZWxzZQorI2RlZmluZSBVTElNSVRfTV9JU19SU1MKKyNlbmRpZgorI2lmIGRlZmluZWQoVUxJTUlUX01fSVNfUlNTKSAmJiBkZWZpbmVkKFJMSU1JVF9BUykgJiYgKFJMSU1JVF9SU1MgPT0gUkxJTUlUX0FTKQorI3VuZGVmIFVMSU1JVF9NX0lTX1JTUworI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFJMSU1JVF9BUykgJiYgIWRlZmluZWQoVUxJTUlUX01fSVNfVk1FTSkgJiYgZGVmaW5lZChSTElNSVRfVk1FTSkKKyNkZWZpbmUgVUxJTUlUX1ZfSVNfVk1FTQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChVTElNSVRfVl9JU19WTUVNKSAmJiBkZWZpbmVkKFJMSU1JVF9WTUVNKSAmJiBcCisgICAgKCFkZWZpbmVkKFJMSU1JVF9SU1MpIHx8IChkZWZpbmVkKFJMSU1JVF9BUykgJiYgKFJMSU1JVF9SU1MgPT0gUkxJTUlUX0FTKSkpCisjZGVmaW5lIFVMSU1JVF9NX0lTX1ZNRU0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChVTElNSVRfTV9JU19WTUVNKSAmJiBkZWZpbmVkKFJMSU1JVF9BUykgJiYgXAorICAgIChSTElNSVRfVk1FTSA9PSBSTElNSVRfQVMpCisjdW5kZWYgVUxJTUlUX01fSVNfVk1FTQorI2VuZGlmCisKKworaW50CitjX3VsaW1pdChjb25zdCBjaGFyICoqd3ApCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBsaW1pdHMgbGltaXRzW10gPSB7CisJCS8qIGRvIG5vdCB1c2Ugb3B0aW9ucyAtSCwgLVMgb3IgLWEgb3IgY2hhbmdlIHRoZSBvcmRlciAqLworI2lmZGVmIFJMSU1JVF9DUFUKKwkJeyAidGltZShjcHUtc2Vjb25kcykiLCBSTElNSVRfQ1BVLCAxLCAndCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9GU0laRQorCQl7ICJmaWxlKGJsb2NrcykiLCBSTElNSVRfRlNJWkUsIDUxMiwgJ2YnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQ09SRQorCQl7ICJjb3JlZHVtcChibG9ja3MpIiwgUkxJTUlUX0NPUkUsIDUxMiwgJ2MnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfREFUQQorCQl7ICJkYXRhKEtpQikiLCBSTElNSVRfREFUQSwgMTAyNCwgJ2QnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfU1RBQ0sKKwkJeyAic3RhY2soS2lCKSIsIFJMSU1JVF9TVEFDSywgMTAyNCwgJ3MnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTUVNTE9DSworCQl7ICJsb2NrZWRtZW0oS2lCKSIsIFJMSU1JVF9NRU1MT0NLLCAxMDI0LCAnbCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OT0ZJTEUKKwkJeyAibm9maWxlcyhkZXNjcmlwdG9ycykiLCBSTElNSVRfTk9GSUxFLCAxLCAnbicgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OUFJPQworCQl7ICJwcm9jZXNzZXMiLCBSTElNSVRfTlBST0MsIDEsICdwJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NXQVAKKwkJeyAic3dhcChLaUIpIiwgUkxJTUlUX1NXQVAsIDEwMjQsICd3JyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0xPQ0tTCisJCXsgImZsb2NrcyIsIFJMSU1JVF9MT0NLUywgLTEsICdMJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1RJTUUKKwkJeyAiaHVtYW50aW1lKHNlY29uZHMpIiwgUkxJTUlUX1RJTUUsIDEsICdUJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05PVk1PTgorCQl7ICJ2bm9kZW1vbml0b3JzIiwgUkxJTUlUX05PVk1PTiwgMSwgJ1YnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfU0lHUEVORElORworCQl7ICJzaWdwZW5kaW5nIiwgUkxJTUlUX1NJR1BFTkRJTkcsIDEsICdpJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX01TR1FVRVVFCisJCXsgIm1zZ3F1ZXVlKGJ5dGVzKSIsIFJMSU1JVF9NU0dRVUVVRSwgMSwgJ3EnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQUlPX01FTQorCQl7ICJBSU9sb2NrZWRtZW0oS2lCKSIsIFJMSU1JVF9BSU9fTUVNLCAxMDI0LCAnTScgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9BSU9fT1BTCisJCXsgIkFJT29wZXJhdGlvbnMiLCBSTElNSVRfQUlPX09QUywgMSwgJ08nIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfVENBQ0hFCisJCXsgImNhY2hlZHRocmVhZHMiLCBSTElNSVRfVENBQ0hFLCAxLCAnQycgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TQlNJWkUKKwkJeyAic29ja2J1ZnNpeihLaUIpIiwgUkxJTUlUX1NCU0laRSwgMTAyNCwgJ0InIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUFRIUkVBRAorCQl7ICJ0aHJlYWRzcGVycHJvY2VzcyIsIFJMSU1JVF9QVEhSRUFELCAxLCAnUCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OSUNFCisJCXsgIm1heG5pY2UiLCBSTElNSVRfTklDRSwgMSwgJ2UnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlRQUklPCisJCXsgIm1heHJ0cHJpbyIsIFJMSU1JVF9SVFBSSU8sIDEsICdyJyB9LAorI2VuZGlmCisjaWYgZGVmaW5lZChVTElNSVRfTV9JU19SU1MpCisJCXsgInJlc2lkZW50LXNldChLaUIpIiwgUkxJTUlUX1JTUywgMTAyNCwgJ20nIH0sCisjZWxpZiBkZWZpbmVkKFVMSU1JVF9NX0lTX1ZNRU0pCisJCXsgIm1lbW9yeShLaUIpIiwgUkxJTUlUX1ZNRU0sIDEwMjQsICdtJyB9LAorI2VuZGlmCisjaWYgZGVmaW5lZChVTElNSVRfVl9JU19WTUVNKQorCQl7ICJ2aXJ0dWFsLW1lbW9yeShLaUIpIiwgUkxJTUlUX1ZNRU0sIDEwMjQsICd2JyB9LAorI2VsaWYgZGVmaW5lZChVTElNSVRfVl9JU19BUykKKwkJeyAiYWRkcmVzcy1zcGFjZShLaUIpIiwgUkxJTUlUX0FTLCAxMDI0LCAndicgfSwKKyNlbmRpZgorCQl7IE5VTEwsIDAsIDAsIDAgfQorCX07CisJc3RhdGljIGNoYXIgb3B0c1szICsgTkVMRU0obGltaXRzKV07CisJaW50IGhvdyA9IFNPRlQgfCBIQVJELCBvcHRjLCB3aGF0ID0gJ2YnOworCWJvb2wgYWxsID0gZmFsc2U7CisJY29uc3Qgc3RydWN0IGxpbWl0cyAqbDsKKworCWlmICghb3B0c1swXSkgeworCQkvKiBidWlsZCBvcHRpb25zIHN0cmluZyBvbiBmaXJzdCBjYWxsIC0geXVjayAqLworCQljaGFyICpwID0gb3B0czsKKworCQkqcCsrID0gJ0gnOyAqcCsrID0gJ1MnOyAqcCsrID0gJ2EnOworCQlmb3IgKGwgPSBsaW1pdHM7IGwtPm5hbWU7IGwrKykKKwkJCSpwKysgPSBsLT5vcHRpb247CisJCSpwID0gJ1wwJzsKKwl9CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG9wdHMpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ0gnOgorCQkJaG93ID0gSEFSRDsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCWhvdyA9IFNPRlQ7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlhbGwgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJYmlfZXJyb3JmKCJ1c2FnZTogdWxpbWl0IFstYWNkZkhMbG1ucFNzVHR2d10gW3ZhbHVlXSIpOworCQkJcmV0dXJuICgxKTsKKwkJZGVmYXVsdDoKKwkJCXdoYXQgPSBvcHRjOworCQl9CisKKwlmb3IgKGwgPSBsaW1pdHM7IGwtPm5hbWUgJiYgbC0+b3B0aW9uICE9IHdoYXQ7IGwrKykKKwkJOworCWlmICghbC0+bmFtZSkgeworCQlpbnRlcm5hbF93YXJuaW5nZigidWxpbWl0OiAlYyIsIHdoYXQpOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmRdKSB7CisJCWlmIChhbGwgfHwgd3BbYnVpbHRpbl9vcHQub3B0aW5kICsgMV0pIHsKKwkJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCXJldHVybiAoc2V0X3VsaW1pdChsLCB3cFtidWlsdGluX29wdC5vcHRpbmRdLCBob3cpKTsKKwl9CisJaWYgKCFhbGwpCisJCXByaW50X3VsaW1pdChsLCBob3cpOworCWVsc2UgZm9yIChsID0gbGltaXRzOyBsLT5uYW1lOyBsKyspIHsKKwkJc2hwcmludGYoIiUtMjBzICIsIGwtPm5hbWUpOworCQlwcmludF91bGltaXQobCwgaG93KTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc2V0X3VsaW1pdChjb25zdCBzdHJ1Y3QgbGltaXRzICpsLCBjb25zdCBjaGFyICp2LCBpbnQgaG93KQoreworCXJsaW1fdCB2YWwgPSAocmxpbV90KTA7CisJc3RydWN0IHJsaW1pdCBsaW1pdDsKKworCWlmIChzdHJjbXAodiwgInVubGltaXRlZCIpID09IDApCisJCXZhbCA9IChybGltX3QpUkxJTV9JTkZJTklUWTsKKwllbHNlIHsKKwkJbWtzaF9hcmlfdCBydmFsOworCisJCWlmICghZXZhbHVhdGUodiwgJnJ2YWwsIEtTSF9SRVRVUk5fRVJST1IsIGZhbHNlKSkKKwkJCXJldHVybiAoMSk7CisJCS8qCisJCSAqIEF2b2lkIHByb2JsZW1zIGNhdXNlZCBieSB0eXBvcyB0aGF0IGV2YWx1YXRlIG1pc3NlcyBkdWUKKwkJICogdG8gZXZhbHVhdGluZyB1bnNldCBwYXJhbWV0ZXJzIHRvIDAuLi4KKwkJICogSWYgdGhpcyBjYXVzZXMgcHJvYmxlbXMsIHdpbGwgaGF2ZSB0byBhZGQgcGFyYW1ldGVyIHRvCisJCSAqIGV2YWx1YXRlKCkgdG8gY29udHJvbCBpZiB1bnNldCBwYXJhbXMgYXJlIDAgb3IgYW4gZXJyb3IuCisJCSAqLworCQlpZiAoIXJ2YWwgJiYgIWtzaF9pc2RpZ2l0KHZbMF0pKSB7CisJCQliaV9lcnJvcmYoImludmFsaWQgJXMgbGltaXQ6ICVzIiwgbC0+bmFtZSwgdik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCXZhbCA9IChybGltX3QpKChybGltX3QpcnZhbCAqIGwtPmZhY3Rvcik7CisJfQorCisJaWYgKGdldHJsaW1pdChsLT5yZXNvdXJjZSwgJmxpbWl0KSA8IDApIHsKKwkJLyogc29tZSBjYW5ub3QgYmUgcmVhZCwgZS5nLiBMaW51eCBSTElNSVRfTE9DS1MgKi8KKwkJbGltaXQucmxpbV9jdXIgPSBSTElNX0lORklOSVRZOworCQlsaW1pdC5ybGltX21heCA9IFJMSU1fSU5GSU5JVFk7CisJfQorCWlmIChob3cgJiBTT0ZUKQorCQlsaW1pdC5ybGltX2N1ciA9IHZhbDsKKwlpZiAoaG93ICYgSEFSRCkKKwkJbGltaXQucmxpbV9tYXggPSB2YWw7CisJaWYgKCFzZXRybGltaXQobC0+cmVzb3VyY2UsICZsaW1pdCkpCisJCXJldHVybiAoMCk7CisJaWYgKGVycm5vID09IEVQRVJNKQorCQliaV9lcnJvcmYoIiVzIGV4Y2VlZHMgYWxsb3dhYmxlICVzIGxpbWl0IiwgdiwgbC0+bmFtZSk7CisJZWxzZQorCQliaV9lcnJvcmYoImJhZCAlcyBsaW1pdDogJXMiLCBsLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF91bGltaXQoY29uc3Qgc3RydWN0IGxpbWl0cyAqbCwgaW50IGhvdykKK3sKKwlybGltX3QgdmFsID0gKHJsaW1fdCkwOworCXN0cnVjdCBybGltaXQgbGltaXQ7CisKKwlpZiAoZ2V0cmxpbWl0KGwtPnJlc291cmNlLCAmbGltaXQpKSB7CisJCXNoZl9wdXRzKCJ1bmtub3duXG4iLCBzaGxfc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaG93ICYgU09GVCkKKwkJdmFsID0gbGltaXQucmxpbV9jdXI7CisJZWxzZSBpZiAoaG93ICYgSEFSRCkKKwkJdmFsID0gbGltaXQucmxpbV9tYXg7CisJaWYgKHZhbCA9PSAocmxpbV90KVJMSU1fSU5GSU5JVFkpCisJCXNoZl9wdXRzKCJ1bmxpbWl0ZWRcbiIsIHNobF9zdGRvdXQpOworCWVsc2UKKwkJc2hwcmludGYoIiVsZFxuIiwgKGxvbmcpKHZhbCAvIGwtPmZhY3RvcikpOworfQorI2VuZGlmCisKK2ludAorY19yZW5hbWUoY29uc3QgY2hhciAqKndwKQoreworCWludCBydiA9IDE7CisKKwlpZiAod3AgPT0gTlVMTAkJLyogYXJndiAqLyB8fAorCSAgICB3cFswXSA9PSBOVUxMCS8qIG5hbWUgb2YgYnVpbHRpbiAqLyB8fAorCSAgICB3cFsxXSA9PSBOVUxMCS8qIGZpcnN0IGFyZ3VtZW50ICovIHx8CisJICAgIHdwWzJdID09IE5VTEwJLyogc2Vjb25kIGFyZ3VtZW50ICovIHx8CisJICAgIHdwWzNdICE9IE5VTEwJLyogbm8gZnVydGhlciBhcmdzIHBsZWFzZSAqLykKKwkJYmlfZXJyb3JmKFRfc3luZXJyKTsKKwllbHNlIGlmICgocnYgPSByZW5hbWUod3BbMV0sIHdwWzJdKSkgIT0gMCkgeworCQlydiA9IGVycm5vOworCQliaV9lcnJvcmYoImZhaWxlZDogJXMiLCBzdHJlcnJvcihydikpOworCX0KKworCXJldHVybiAocnYpOworfQorCitpbnQKK2NfcmVhbHBhdGgoY29uc3QgY2hhciAqKndwKQoreworCWludCBydiA9IDE7CisJY2hhciAqYnVmOworCisJaWYgKHdwICE9IE5VTEwgJiYgd3BbMF0gIT0gTlVMTCAmJiB3cFsxXSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAod3BbMV0sICItLSIpKSB7CisJCQlpZiAod3BbMl0gPT0gTlVMTCkgeworCQkJCXdwICs9IDE7CisJCQkJcnYgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHdwWzJdICE9IE5VTEwgJiYgd3BbM10gPT0gTlVMTCkgeworCQkJCXdwICs9IDI7CisJCQkJcnYgPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKHJ2KQorCQliaV9lcnJvcmYoVF9zeW5lcnIpOworCWVsc2UgaWYgKChidWYgPSBkb19yZWFscGF0aCgqd3ApKSA9PSBOVUxMKSB7CisJCXJ2ID0gZXJybm87CisJCWJpX2Vycm9yZigiJXM6ICVzIiwgKndwLCBzdHJlcnJvcihydikpOworCQlpZiAoKHVuc2lnbmVkIGludClydiA+IDI1NSkKKwkJCXJ2ID0gMjU1OworCX0gZWxzZSB7CisJCXNocHJpbnRmKCIlc1xuIiwgYnVmKTsKKwkJYWZyZWUoYnVmLCBBVEVNUCk7CisJfQorCisJcmV0dXJuIChydik7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9oaXN0cmFwLmMgYi9ta3NoL3NyYy9oaXN0cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjNGMzOAotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2hpc3RyYXAuYwpAQCAtMCwwICsxLDE0ODMgQEAKKy8qCSRPcGVuQlNEOiBoaXN0b3J5LmMsdiAxLjM5IDIwMTAvMDUvMTkgMTc6MzY6MDggamFzcGVyIEV4cCAkCSovCisvKgkkT3BlbkJTRDogdHJhcC5jLHYgMS4yMyAyMDEwLzA1LzE5IDE3OjM2OjA4IGphc3BlciBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2VuZGlmCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2hpc3RyYXAuYyx2IDEuOTggMjAxMC8wNy8yNCAxNzowODoyOSB0ZyBFeHAgJCIpOworCisvKi0KKyAqIE1pck9TOiBUaGlzIGlzIHRoZSBkZWZhdWx0IG1hcHBpbmcgdHlwZSwgYW5kIG5lZWQgbm90IGJlIHNwZWNpZmllZC4KKyAqIElSSVggZG9lc24ndCBoYXZlIHRoaXMgY29uc3RhbnQuCisgKi8KKyNpZm5kZWYgTUFQX0ZJTEUKKyNkZWZpbmUgTUFQX0ZJTEUJMAorI2VuZGlmCisKK1RyYXAgc2lndHJhcHNbTlNJRyArIDFdOworc3RhdGljIHN0cnVjdCBzaWdhY3Rpb24gU2lnYWN0X2lnbjsKKworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCitzdGF0aWMgaW50IGhpc3RfY291bnRfbGluZXModW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBoaXN0X3Nocmluayh1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqaGlzdF9za2lwX2JhY2sodW5zaWduZWQgY2hhciAqLGludCAqLGludCk7CitzdGF0aWMgdm9pZCBoaXN0bG9hZChTb3VyY2UgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgaGlzdGluc2VydChTb3VyY2UgKiwgaW50LCBjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgd3JpdGVoaXN0ZmlsZShpbnQsIGNoYXIgKik7CitzdGF0aWMgaW50IHNwcmlua2xlKGludCk7CisjZW5kaWYKKworc3RhdGljIGludCBoaXN0X2V4ZWN1dGUoY2hhciAqKTsKK3N0YXRpYyBpbnQgaGlzdF9yZXBsYWNlKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKK3N0YXRpYyBjaGFyICoqaGlzdF9nZXQoY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKK3N0YXRpYyBjaGFyICoqaGlzdF9nZXRfb2xkZXN0KHZvaWQpOworc3RhdGljIHZvaWQgaGlzdGJhY2t1cCh2b2lkKTsKKworc3RhdGljIGNoYXIgKipjdXJyZW50OwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBoaXN0b3J5W10gKi8KK3N0YXRpYyBpbnQgaHN0YXJ0ZWQ7CQkvKiBzZXQgYWZ0ZXIgaGlzdF9pbml0KCkgY2FsbGVkICovCitzdGF0aWMgU291cmNlICpoaXN0X3NvdXJjZTsKKworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCitzdGF0aWMgY2hhciAqaG5hbWU7CQkvKiBjdXJyZW50IG5hbWUgb2YgaGlzdG9yeSBmaWxlICovCitzdGF0aWMgaW50IGhpc3RmZDsKK3N0YXRpYyBpbnQgaHNpemU7CisjZW5kaWYKKworaW50CitjX2ZjKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3Qgc2hmICpzaGY7CisJc3RydWN0IHRlbXAgKnRmOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqZWRpdG9yID0gTlVMTDsKKwlib29sIGdmbGFnID0gZmFsc2UsIGxmbGFnID0gZmFsc2UsIG5mbGFnID0gZmFsc2UsIHJmbGFnID0gZmFsc2UsCisJICAgIHNmbGFnID0gZmFsc2U7CisJaW50IG9wdGM7CisJY29uc3QgY2hhciAqZmlyc3QgPSBOVUxMLCAqbGFzdCA9IE5VTEw7CisJY2hhciAqKmhmaXJzdCwgKipobGFzdCwgKipocDsKKworCWlmICghRmxhZyhGVEFMS0lOR19JKSkgeworCQliaV9lcnJvcmYoImhpc3RvcnkgZnVuY3Rpb25zIG5vdCBhdmFpbGFibGUiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsCisJICAgICJlOmdsbnJzMCwxLDIsMyw0LDUsNiw3LDgsOSwiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdlJzoKKwkJCXAgPSBidWlsdGluX29wdC5vcHRhcmc7CisJCQlpZiAoa3NoX2lzZGFzaChwKSkKKwkJCQlzZmxhZyA9IHRydWU7CisJCQllbHNlIHsKKwkJCQlzaXplX3QgbGVuID0gc3RybGVuKHApOworCQkJCWVkaXRvciA9IGFsbG9jKGxlbiArIDQsIEFURU1QKTsKKwkJCQltZW1jcHkoZWRpdG9yLCBwLCBsZW4pOworCQkJCW1lbWNweShlZGl0b3IgKyBsZW4sICIgJF8iLCA0KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdnJzogLyogbm9uLUFUJlQga3NoICovCisJCQlnZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlsZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQluZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CS8qIFBPU0lYIHZlcnNpb24gb2YgLWUgLSAqLworCQkJc2ZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCS8qIGtsdWRnZSBjaXR5IC0gYWNjZXB0IC1udW0gYXMgLS0gLW51bSAoa2luZCBvZikgKi8KKwkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorCQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJCQlwID0gc2hmX3NtcHJpbnRmKCItJWMlcyIsCisJCQkJCW9wdGMsIGJ1aWx0aW5fb3B0Lm9wdGFyZyk7CisJCQlpZiAoIWZpcnN0KQorCQkJCWZpcnN0ID0gcDsKKwkJCWVsc2UgaWYgKCFsYXN0KQorCQkJCWxhc3QgPSBwOworCQkJZWxzZSB7CisJCQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCS8qIFN1YnN0aXR1dGUgYW5kIGV4ZWN1dGUgY29tbWFuZCAqLworCWlmIChzZmxhZykgeworCQljaGFyICpwYXQgPSBOVUxMLCAqcmVwID0gTlVMTDsKKworCQlpZiAoZWRpdG9yIHx8IGxmbGFnIHx8IG5mbGFnIHx8IHJmbGFnKSB7CisJCQliaV9lcnJvcmYoImNhbid0IHVzZSAtZSwgLWwsIC1uLCAtciB3aXRoIC1zICgtZSAtKSIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCisJCS8qIENoZWNrIGZvciBwYXR0ZXJuIHJlcGxhY2VtZW50IGFyZ3VtZW50ICovCisJCWlmICgqd3AgJiYgKip3cCAmJiAocCA9IGNzdHJjaHIoKndwICsgMSwgJz0nKSkpIHsKKwkJCXN0cmR1cHgocGF0LCAqd3AsIEFURU1QKTsKKwkJCXJlcCA9IHBhdCArIChwIC0gKndwKTsKKwkJCSpyZXArKyA9ICdcMCc7CisJCQl3cCsrOworCQl9CisJCS8qIENoZWNrIGZvciBzZWFyY2ggcHJlZml4ICovCisJCWlmICghZmlyc3QgJiYgKGZpcnN0ID0gKndwKSkKKwkJCXdwKys7CisJCWlmIChsYXN0IHx8ICp3cCkgeworCQkJYmlfZXJyb3JmKCJ0b28gbWFueSBhcmd1bWVudHMiKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKworCQlocCA9IGZpcnN0ID8gaGlzdF9nZXQoZmlyc3QsIGZhbHNlLCBmYWxzZSkgOgorCQkgICAgaGlzdF9nZXRfbmV3ZXN0KGZhbHNlKTsKKwkJaWYgKCFocCkKKwkJCXJldHVybiAoMSk7CisJCXJldHVybiAoaGlzdF9yZXBsYWNlKGhwLCBwYXQsIHJlcCwgZ2ZsYWcpKTsKKwl9CisKKwlpZiAoZWRpdG9yICYmIChsZmxhZyB8fCBuZmxhZykpIHsKKwkJYmlfZXJyb3JmKCJjYW4ndCB1c2UgLWwsIC1uIHdpdGggLWUiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAoIWZpcnN0ICYmIChmaXJzdCA9ICp3cCkpCisJCXdwKys7CisJaWYgKCFsYXN0ICYmIChsYXN0ID0gKndwKSkKKwkJd3ArKzsKKwlpZiAoKndwKSB7CisJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCXJldHVybiAoMSk7CisJfQorCWlmICghZmlyc3QpIHsKKwkJaGZpcnN0ID0gbGZsYWcgPyBoaXN0X2dldCgiLTE2IiwgdHJ1ZSwgdHJ1ZSkgOgorCQkgICAgaGlzdF9nZXRfbmV3ZXN0KGZhbHNlKTsKKwkJaWYgKCFoZmlyc3QpCisJCQlyZXR1cm4gKDEpOworCQkvKiBjYW4ndCBmYWlsIGlmIGhmaXJzdCBkaWRuJ3QgZmFpbCAqLworCQlobGFzdCA9IGhpc3RfZ2V0X25ld2VzdChmYWxzZSk7CisJfSBlbHNlIHsKKwkJLyogUE9TSVggc2F5cyBub3QgYW4gZXJyb3IgaWYgZmlyc3QvbGFzdCBvdXQgb2YgYm91bmRzCisJCSAqIHdoZW4gcmFuZ2UgaXMgc3BlY2lmaWVkOyBBVCZUIGtzaCBhbmQgcGRrc2ggYWxsb3cgb3V0IG9mCisJCSAqIGJvdW5kcyBmb3IgLWwgYXMgd2VsbC4KKwkJICovCisJCWhmaXJzdCA9IGhpc3RfZ2V0KGZpcnN0LCAobGZsYWcgfHwgbGFzdCkgPyB0cnVlIDogZmFsc2UsIGxmbGFnKTsKKwkJaWYgKCFoZmlyc3QpCisJCQlyZXR1cm4gKDEpOworCQlobGFzdCA9IGxhc3QgPyBoaXN0X2dldChsYXN0LCB0cnVlLCBsZmxhZykgOgorCQkgICAgKGxmbGFnID8gaGlzdF9nZXRfbmV3ZXN0KGZhbHNlKSA6IGhmaXJzdCk7CisJCWlmICghaGxhc3QpCisJCQlyZXR1cm4gKDEpOworCX0KKwlpZiAoaGZpcnN0ID4gaGxhc3QpIHsKKwkJY2hhciAqKnRlbXA7CisKKwkJdGVtcCA9IGhmaXJzdDsgaGZpcnN0ID0gaGxhc3Q7IGhsYXN0ID0gdGVtcDsKKwkJcmZsYWcgPSAhcmZsYWc7IC8qIFBPU0lYICovCisJfQorCisJLyogTGlzdCBoaXN0b3J5ICovCisJaWYgKGxmbGFnKSB7CisJCWNoYXIgKnMsICp0OworCisJCWZvciAoaHAgPSByZmxhZyA/IGhsYXN0IDogaGZpcnN0OworCQkgICAgaHAgPj0gaGZpcnN0ICYmIGhwIDw9IGhsYXN0OyBocCArPSByZmxhZyA/IC0xIDogMSkgeworCQkJaWYgKCFuZmxhZykKKwkJCQlzaGZfZnByaW50ZihzaGxfc3Rkb3V0LCAiJWQiLAorCQkJCSAgICBoaXN0X3NvdXJjZS0+bGluZSAtIChpbnQpKGhpc3RwdHIgLSBocCkpOworCQkJc2hmX3B1dGMoJ1x0Jywgc2hsX3N0ZG91dCk7CisJCQkvKiBwcmludCBtdWx0aS1saW5lIGNvbW1hbmRzIGNvcnJlY3RseSAqLworCQkJcyA9ICpocDsKKwkJCXdoaWxlICgodCA9IHN0cmNocihzLCAnXG4nKSkpIHsKKwkJCQkqdCA9ICdcMCc7CisJCQkJc2hmX2ZwcmludGYoc2hsX3N0ZG91dCwgIiVzXG5cdCIsIHMpOworCQkJCSp0KysgPSAnXG4nOworCQkJCXMgPSB0OworCQkJfQorCQkJc2hmX2ZwcmludGYoc2hsX3N0ZG91dCwgIiVzXG4iLCBzKTsKKwkJfQorCQlzaGZfZmx1c2goc2hsX3N0ZG91dCk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyogUnVuIGVkaXRvciBvbiBzZWxlY3RlZCBsaW5lcywgdGhlbiBydW4gcmVzdWx0aW5nIGNvbW1hbmRzICovCisKKwl0ZiA9IG1ha2V0ZW1wKEFURU1QLCBUVF9ISVNUX0VESVQsICZlLT50ZW1wcyk7CisJaWYgKCEoc2hmID0gdGYtPnNoZikpIHsKKwkJYmlfZXJyb3JmKCJjYW5ub3QgY3JlYXRlIHRlbXAgZmlsZSAlcyAtICVzIiwKKwkJICAgIHRmLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKDEpOworCX0KKwlmb3IgKGhwID0gcmZsYWcgPyBobGFzdCA6IGhmaXJzdDsKKwkgICAgaHAgPj0gaGZpcnN0ICYmIGhwIDw9IGhsYXN0OyBocCArPSByZmxhZyA/IC0xIDogMSkKKwkJc2hmX2ZwcmludGYoc2hmLCAiJXNcbiIsICpocCk7CisJaWYgKHNoZl9jbG9zZShzaGYpID09IEVPRikgeworCQliaV9lcnJvcmYoImVycm9yIHdyaXRpbmcgdGVtcG9yYXJ5IGZpbGUgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoMSk7CisJfQorCisJLyogSWdub3JlIHNldHN0ciBlcnJvcnMgaGVyZSAoYXJiaXRyYXJ5KSAqLworCXNldHN0cihsb2NhbCgiXyIsIGZhbHNlKSwgdGYtPm5hbWUsIEtTSF9SRVRVUk5fRVJST1IpOworCisJLyogWFhYOiBzb3VyY2Ugc2hvdWxkIG5vdCBnZXQgdHJhc2hlZCBieSB0aGlzLi4gKi8KKwl7CisJCVNvdXJjZSAqc29sZCA9IHNvdXJjZTsKKwkJaW50IHJldDsKKworCQlyZXQgPSBjb21tYW5kKGVkaXRvciA/IGVkaXRvciA6ICIke0ZDRURJVDotL2Jpbi9lZH0gJF8iLCAwKTsKKwkJc291cmNlID0gc29sZDsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAocmV0KTsKKwl9CisKKwl7CisJCXN0cnVjdCBzdGF0IHN0YXRiOworCQlYU3RyaW5nIHhzOworCQljaGFyICp4cDsKKwkJaW50IG47CisKKwkJaWYgKCEoc2hmID0gc2hmX29wZW4odGYtPm5hbWUsIE9fUkRPTkxZLCAwLCAwKSkpIHsKKwkJCWJpX2Vycm9yZigiY2Fubm90IG9wZW4gdGVtcCBmaWxlICVzIiwgdGYtPm5hbWUpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCisJCW4gPSBzdGF0KHRmLT5uYW1lLCAmc3RhdGIpIDwgMCA/IDEyOCA6IHN0YXRiLnN0X3NpemUgKyAxOworCQlYaW5pdCh4cywgeHAsIG4sIGhpc3Rfc291cmNlLT5hcmVhcCk7CisJCXdoaWxlICgobiA9IHNoZl9yZWFkKHhwLCBYbmxlZnQoeHMsIHhwKSwgc2hmKSkgPiAwKSB7CisJCQl4cCArPSBuOworCQkJaWYgKFhubGVmdCh4cywgeHApIDw9IDApCisJCQkJWGNoZWNrTih4cywgeHAsIFhsZW5ndGgoeHMsIHhwKSk7CisJCX0KKwkJaWYgKG4gPCAwKSB7CisJCQliaV9lcnJvcmYoImVycm9yIHJlYWRpbmcgdGVtcCBmaWxlICVzIC0gJXMiLAorCQkJICAgIHRmLT5uYW1lLCBzdHJlcnJvcihzaGZfZXJybm8oc2hmKSkpOworCQkJc2hmX2Nsb3NlKHNoZik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCXNoZl9jbG9zZShzaGYpOworCQkqeHAgPSAnXDAnOworCQlzdHJpcF9udWxzKFhzdHJpbmcoeHMsIHhwKSwgWGxlbmd0aCh4cywgeHApKTsKKwkJcmV0dXJuIChoaXN0X2V4ZWN1dGUoWHN0cmluZyh4cywgeHApKSk7CisJfQorfQorCisvKiBTYXZlIGNtZCBpbiBoaXN0b3J5LCBleGVjdXRlIGNtZCAoY21kIGdldHMgdHJhc2hlZCkgKi8KK3N0YXRpYyBpbnQKK2hpc3RfZXhlY3V0ZShjaGFyICpjbWQpCit7CisJU291cmNlICpzb2xkOworCWludCByZXQ7CisJY2hhciAqcCwgKnE7CisKKwloaXN0YmFja3VwKCk7CisKKwlmb3IgKHAgPSBjbWQ7IHA7IHAgPSBxKSB7CisJCWlmICgocSA9IHN0cmNocihwLCAnXG4nKSkpIHsKKwkJCSpxKysgPSAnXDAnOyAvKiBraWxsIHRoZSBuZXdsaW5lICovCisJCQlpZiAoISpxKSAvKiBpZ25vcmUgdHJhaWxpbmcgbmV3bGluZSAqLworCQkJCXEgPSBOVUxMOworCQl9CisJCWhpc3RzYXZlKCZoaXN0X3NvdXJjZS0+bGluZSwgcCwgdHJ1ZSwgdHJ1ZSk7CisKKwkJc2hlbGxmKCIlc1xuIiwgcCk7IC8qIFBPU0lYIGRvZXNuJ3Qgc2F5IHRoaXMgaXMgZG9uZS4uLiAqLworCQlpZiAocSkJCS8qIHJlc3RvcmUgXG4gKHRyYWlsaW5nIFxuIG5vdCByZXN0b3JlZCkgKi8KKwkJCXFbLTFdID0gJ1xuJzsKKwl9CisKKwkvKgorCSAqIENvbW1hbmRzIGFyZSBleGVjdXRlZCBoZXJlIGluc3RlYWQgb2YgcHVzaGluZyB0aGVtIG9udG8gdGhlCisJICogaW5wdXQgJ2NhdXNlIFBPU0lYIHNheXMgdGhlIHJlZGlyZWN0aW9uIGFuZCB2YXJpYWJsZSBhc3NpZ25tZW50cworCSAqIGluCisJICoJWD15IGZjIC1lIC0gNDIgMj4gL2Rldi9udWxsCisJICogYXJlIHRvIGVmZmVjdCB0aGUgcmVwZWF0ZWQgY29tbWFuZHMgZW52aXJvbm1lbnQuCisJICovCisJLyogWFhYOiBzb3VyY2Ugc2hvdWxkIG5vdCBnZXQgdHJhc2hlZCBieSB0aGlzLi4gKi8KKwlzb2xkID0gc291cmNlOworCXJldCA9IGNvbW1hbmQoY21kLCAwKTsKKwlzb3VyY2UgPSBzb2xkOworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludAoraGlzdF9yZXBsYWNlKGNoYXIgKipocCwgY29uc3QgY2hhciAqcGF0LCBjb25zdCBjaGFyICpyZXAsIGJvb2wgZ2xvYnIpCit7CisJY2hhciAqbGluZTsKKworCWlmICghcGF0KQorCQlzdHJkdXB4KGxpbmUsICpocCwgQVRFTVApOworCWVsc2UgeworCQljaGFyICpzLCAqczE7CisJCWludCBwYXRfbGVuID0gc3RybGVuKHBhdCk7CisJCWludCByZXBfbGVuID0gc3RybGVuKHJlcCk7CisJCWludCBsZW47CisJCVhTdHJpbmcgeHM7CisJCWNoYXIgKnhwOworCQlib29sIGFueV9zdWJzdCA9IGZhbHNlOworCisJCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7CisJCWZvciAocyA9ICpocDsgKHMxID0gc3Ryc3RyKHMsIHBhdCkpICYmICghYW55X3N1YnN0IHx8IGdsb2JyKTsKKwkJICAgIHMgPSBzMSArIHBhdF9sZW4pIHsKKwkJCWFueV9zdWJzdCA9IHRydWU7CisJCQlsZW4gPSBzMSAtIHM7CisJCQlYY2hlY2tOKHhzLCB4cCwgbGVuICsgcmVwX2xlbik7CisJCQltZW1jcHkoeHAsIHMsIGxlbik7CQkvKiBmaXJzdCBwYXJ0ICovCisJCQl4cCArPSBsZW47CisJCQltZW1jcHkoeHAsIHJlcCwgcmVwX2xlbik7CS8qIHJlcGxhY2VtZW50ICovCisJCQl4cCArPSByZXBfbGVuOworCQl9CisJCWlmICghYW55X3N1YnN0KSB7CisJCQliaV9lcnJvcmYoInN1YnN0aXR1dGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJbGVuID0gc3RybGVuKHMpICsgMTsKKwkJWGNoZWNrTih4cywgeHAsIGxlbik7CisJCW1lbWNweSh4cCwgcywgbGVuKTsKKwkJeHAgKz0gbGVuOworCQlsaW5lID0gWGNsb3NlKHhzLCB4cCk7CisJfQorCXJldHVybiAoaGlzdF9leGVjdXRlKGxpbmUpKTsKK30KKworLyoKKyAqIGdldCBwb2ludGVyIHRvIGhpc3RvcnkgZ2l2ZW4gcGF0dGVybgorICogcGF0dGVybiBpcyBhIG51bWJlciBvciBzdHJpbmcKKyAqLworc3RhdGljIGNoYXIgKioKK2hpc3RfZ2V0KGNvbnN0IGNoYXIgKnN0ciwgYm9vbCBhcHByb3gsIGJvb2wgYWxsb3dfY3VyKQoreworCWNoYXIgKipocCA9IE5VTEw7CisJaW50IG47CisKKwlpZiAoZ2V0bihzdHIsICZuKSkgeworCQlocCA9IGhpc3RwdHIgKyAobiA8IDAgPyBuIDogKG4gLSBoaXN0X3NvdXJjZS0+bGluZSkpOworCQlpZiAoKHB0cmRpZmZfdClocCA8IChwdHJkaWZmX3QpaGlzdG9yeSkgeworCQkJaWYgKGFwcHJveCkKKwkJCQlocCA9IGhpc3RfZ2V0X29sZGVzdCgpOworCQkJZWxzZSB7CisJCQkJYmlfZXJyb3JmKCIlczogbm90IGluIGhpc3RvcnkiLCBzdHIpOworCQkJCWhwID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIGlmICgocHRyZGlmZl90KWhwID4gKHB0cmRpZmZfdCloaXN0cHRyKSB7CisJCQlpZiAoYXBwcm94KQorCQkJCWhwID0gaGlzdF9nZXRfbmV3ZXN0KGFsbG93X2N1cik7CisJCQllbHNlIHsKKwkJCQliaV9lcnJvcmYoIiVzOiBub3QgaW4gaGlzdG9yeSIsIHN0cik7CisJCQkJaHAgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKCFhbGxvd19jdXIgJiYgaHAgPT0gaGlzdHB0cikgeworCQkJYmlfZXJyb3JmKCIlczogaW52YWxpZCByYW5nZSIsIHN0cik7CisJCQlocCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgYW5jaG9yZWQgPSAqc3RyID09ICc/JyA/ICgrK3N0ciwgMCkgOiAxOworCisJCS8qIHRoZSAtMSBpcyB0byBhdm9pZCB0aGUgY3VycmVudCBmYyBjb21tYW5kICovCisJCWlmICgobiA9IGZpbmRoaXN0KGhpc3RwdHIgLSBoaXN0b3J5IC0gMSwgMCwgc3RyLCBhbmNob3JlZCkpIDwgMCkKKwkJCWJpX2Vycm9yZigiJXM6IG5vdCBpbiBoaXN0b3J5Iiwgc3RyKTsKKwkJZWxzZQorCQkJaHAgPSAmaGlzdG9yeVtuXTsKKwl9CisJcmV0dXJuIChocCk7Cit9CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ld2VzdCBjb21tYW5kIGluIHRoZSBoaXN0b3J5ICovCitjaGFyICoqCitoaXN0X2dldF9uZXdlc3QoYm9vbCBhbGxvd19jdXIpCit7CisJaWYgKGhpc3RwdHIgPCBoaXN0b3J5IHx8ICghYWxsb3dfY3VyICYmIGhpc3RwdHIgPT0gaGlzdG9yeSkpIHsKKwkJYmlfZXJyb3JmKCJubyBoaXN0b3J5ICh5ZXQpIik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXJldHVybiAoYWxsb3dfY3VyID8gaGlzdHB0ciA6IGhpc3RwdHIgLSAxKTsKK30KKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgb2xkZXN0IGNvbW1hbmQgaW4gdGhlIGhpc3RvcnkgKi8KK3N0YXRpYyBjaGFyICoqCitoaXN0X2dldF9vbGRlc3Qodm9pZCkKK3sKKwlpZiAoaGlzdHB0ciA8PSBoaXN0b3J5KSB7CisJCWJpX2Vycm9yZigibm8gaGlzdG9yeSAoeWV0KSIpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlyZXR1cm4gKGhpc3RvcnkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQmFjayB1cCBvdmVyIGxhc3QgaGlzdHNhdmUgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraGlzdGJhY2t1cCh2b2lkKQoreworCXN0YXRpYyBpbnQgbGFzdF9saW5lID0gLTE7CisKKwlpZiAoaGlzdHB0ciA+PSBoaXN0b3J5ICYmIGxhc3RfbGluZSAhPSBoaXN0X3NvdXJjZS0+bGluZSkgeworCQloaXN0X3NvdXJjZS0+bGluZS0tOworCQlhZnJlZSgqaGlzdHB0ciwgQVBFUk0pOworCQloaXN0cHRyLS07CisJCWxhc3RfbGluZSA9IGhpc3Rfc291cmNlLT5saW5lOworCX0KK30KKworLyoKKyAqIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqLworY2hhciAqKgoraGlzdHBvcyh2b2lkKQoreworCXJldHVybiAoY3VycmVudCk7Cit9CisKK2ludAoraGlzdG51bShpbnQgbikKK3sKKwlpbnQgbGFzdCA9IGhpc3RwdHIgLSBoaXN0b3J5OworCisJaWYgKG4gPCAwIHx8IG4gPj0gbGFzdCkgeworCQljdXJyZW50ID0gaGlzdHB0cjsKKwkJcmV0dXJuIChsYXN0KTsKKwl9IGVsc2UgeworCQljdXJyZW50ID0gJmhpc3Rvcnlbbl07CisJCXJldHVybiAobik7CisJfQorfQorCisvKgorICogVGhpcyB3aWxsIGJlY29tZSB1bm5lY2Vzc2FyeSBpZiBoaXN0X2dldCBpcyBtb2RpZmllZCB0byBhbGxvdworICogc2VhcmNoaW5nIGZyb20gcG9zaXRpb25zIG90aGVyIHRoYW4gdGhlIGVuZCwgYW5kIGluIGVpdGhlcgorICogZGlyZWN0aW9uLgorICovCitpbnQKK2ZpbmRoaXN0KGludCBzdGFydCwgaW50IGZ3ZCwgY29uc3QgY2hhciAqc3RyLCBpbnQgYW5jaG9yZWQpCit7CisJY2hhcgkqKmhwOworCWludAltYXhoaXN0ID0gaGlzdHB0ciAtIGhpc3Rvcnk7CisJaW50CWluY3IgPSBmd2QgPyAxIDogLTE7CisJaW50CWxlbiA9IHN0cmxlbihzdHIpOworCisJaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSBtYXhoaXN0KQorCQlzdGFydCA9IG1heGhpc3Q7CisKKwlocCA9ICZoaXN0b3J5W3N0YXJ0XTsKKwlmb3IgKDsgaHAgPj0gaGlzdG9yeSAmJiBocCA8PSBoaXN0cHRyOyBocCArPSBpbmNyKQorCQlpZiAoKGFuY2hvcmVkICYmIHN0cm5jbXAoKmhwLCBzdHIsIGxlbikgPT0gMCkgfHwKKwkJICAgICghYW5jaG9yZWQgJiYgc3Ryc3RyKCpocCwgc3RyKSkpCisJCQlyZXR1cm4gKGhwIC0gaGlzdG9yeSk7CisKKwlyZXR1cm4gKC0xKTsKK30KKworaW50CitmaW5kaGlzdHJlbChjb25zdCBjaGFyICpzdHIpCit7CisJaW50CW1heGhpc3QgPSBoaXN0cHRyIC0gaGlzdG9yeTsKKwlpbnQJc3RhcnQgPSBtYXhoaXN0IC0gMTsKKwlpbnQJcmVjOworCisJZ2V0bihzdHIsICZyZWMpOworCWlmIChyZWMgPT0gMCkKKwkJcmV0dXJuICgtMSk7CisJaWYgKHJlYyA+IDApIHsKKwkJaWYgKHJlYyA+IG1heGhpc3QpCisJCQlyZXR1cm4gKC0xKTsKKwkJcmV0dXJuIChyZWMgLSAxKTsKKwl9CisJaWYgKHJlYyA+IG1heGhpc3QpCisJCXJldHVybiAoLTEpOworCXJldHVybiAoc3RhcnQgKyByZWMgKyAxKTsKK30KKworLyoKKyAqCXNldCBoaXN0b3J5CisgKgl0aGlzIG1lYW5zIHJlYWxsb2NhdGluZyB0aGUgZGF0YXNwYWNlCisgKi8KK3ZvaWQKK3NldGhpc3RzaXplKGludCBuKQoreworCWlmIChuID4gMCAmJiBuICE9IGhpc3RzaXplKSB7CisJCWludCBjdXJzaXplID0gaGlzdHB0ciAtIGhpc3Rvcnk7CisKKwkJLyogc2F2ZSBtb3N0IHJlY2VudCBoaXN0b3J5ICovCisJCWlmIChuIDwgY3Vyc2l6ZSkgeworCQkJbWVtbW92ZShoaXN0b3J5LCBoaXN0cHRyIC0gbiwgbiAqIHNpemVvZihjaGFyICopKTsKKwkJCWN1cnNpemUgPSBuOworCQl9CisKKwkJaGlzdG9yeSA9IGFyZXNpemUoaGlzdG9yeSwgbiAqIHNpemVvZihjaGFyICopLCBBUEVSTSk7CisKKwkJaGlzdHNpemUgPSBuOworCQloaXN0cHRyID0gaGlzdG9yeSArIGN1cnNpemU7CisJfQorfQorCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKy8qCisgKglzZXQgaGlzdG9yeSBmaWxlCisgKglUaGlzIGNhbiBtZWFuIHJlbG9hZGluZy9yZXNldHRpbmcvc3RhcnRpbmcgaGlzdG9yeSBmaWxlCisgKgltYWludGVuYW5jZQorICovCit2b2lkCitzZXRoaXN0ZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCS8qIGlmIG5vdCBzdGFydGVkIHRoZW4gbm90aGluZyB0byBkbyAqLworCWlmIChoc3RhcnRlZCA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBpZiB0aGUgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSB3ZSBoYXZlICovCisJaWYgKGhuYW1lICYmIHN0cmNtcChobmFtZSwgbmFtZSkgPT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBpdHMgYSBuZXcgbmFtZSAtIHBvc3NpYmx5CisJICovCisJaWYgKGhpc3RmZCkgeworCQkvKiB5ZXMgdGhlIGZpbGUgaXMgb3BlbiAqLworCQkodm9pZCljbG9zZShoaXN0ZmQpOworCQloaXN0ZmQgPSAwOworCQloc2l6ZSA9IDA7CisJCWFmcmVlKGhuYW1lLCBBUEVSTSk7CisJCWhuYW1lID0gTlVMTDsKKwkJLyogbGV0J3MgcmVzZXQgdGhlIGhpc3RvcnkgKi8KKwkJaGlzdHB0ciA9IGhpc3RvcnkgLSAxOworCQloaXN0X3NvdXJjZS0+bGluZSA9IDA7CisJfQorCisJaGlzdF9pbml0KGhpc3Rfc291cmNlKTsKK30KKyNlbmRpZgorCisvKgorICoJaW5pdGlhbGlzZSB0aGUgaGlzdG9yeSB2ZWN0b3IKKyAqLwordm9pZAoraW5pdF9oaXN0dmVjKHZvaWQpCit7CisJaWYgKGhpc3RvcnkgPT0gKGNoYXIgKiopTlVMTCkgeworCQloaXN0c2l6ZSA9IEhJU1RPUllTSVpFOworCQloaXN0b3J5ID0gYWxsb2MoaGlzdHNpemUgKiBzaXplb2YoY2hhciAqKSwgQVBFUk0pOworCQloaXN0cHRyID0gaGlzdG9yeSAtIDE7CisJfQorfQorCisKKy8qCisgKglSb3V0aW5lcyBhZGRlZCBieSBQZXRlciBDb2xsaW5zb24gQlNESShFdXJvcGUpL0hpbGxzaWRlIFN5c3RlbXMgdG8KKyAqCWEpIHBlcm1pdCBISVNUU0laRSB0byBjb250cm9sIG51bWJlciBvZiBsaW5lcyBvZiBoaXN0b3J5IHN0b3JlZAorICoJYikgbWFpbnRhaW4gYSBwaHlzaWNhbCBoaXN0b3J5IGZpbGUKKyAqCisgKglJdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBpcyBhIGxvdCBvZiBnaGFzdGx5IGhhY2tlcnkgaGVyZQorICovCisKKyNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorLyogZG8gbm90IHNhdmUgY29tbWFuZCBpbiBoaXN0b3J5IGJ1dCBwb3NzaWJseSBzeW5jICovCitib29sCitoaXN0c3luYyh2b2lkKQoreworCWJvb2wgY2hhbmdlZCA9IGZhbHNlOworCisJaWYgKGhpc3RmZCkgeworCQlpbnQgbG5vID0gaGlzdF9zb3VyY2UtPmxpbmU7CisKKwkJaGlzdF9zb3VyY2UtPmxpbmUrKzsKKwkJd3JpdGVoaXN0ZmlsZSgwLCBOVUxMKTsKKwkJaGlzdF9zb3VyY2UtPmxpbmUtLTsKKworCQlpZiAobG5vICE9IGhpc3Rfc291cmNlLT5saW5lKQorCQkJY2hhbmdlZCA9IHRydWU7CisJfQorCisJcmV0dXJuIChjaGFuZ2VkKTsKK30KKyNlbmRpZgorCisvKgorICogc2F2ZSBjb21tYW5kIGluIGhpc3RvcnkKKyAqLwordm9pZAoraGlzdHNhdmUoaW50ICpsbnAsIGNvbnN0IGNoYXIgKmNtZCwgYm9vbCBkb3dyaXRlIE1LU0hfQV9VTlVTRUQsIGJvb2wgaWdub3JlZHVwcykKK3sKKwljaGFyICoqaHA7CisJY2hhciAqYywgKmNwOworCisJc3RyZHVweChjLCBjbWQsIEFQRVJNKTsKKwlpZiAoKGNwID0gc3RyY2hyKGMsICdcbicpKSAhPSBOVUxMKQorCQkqY3AgPSAnXDAnOworCisJaWYgKGlnbm9yZWR1cHMgJiYgIXN0cmNtcChjLCAqaGlzdHB0cikKKyNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCSAgICAmJiAhaGlzdHN5bmMoKQorI2VuZGlmCisJICAgICkgeworCQlhZnJlZShjLCBBUEVSTSk7CisJCXJldHVybjsKKwl9CisJKysqbG5wOworCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKwlpZiAoaGlzdGZkICYmIGRvd3JpdGUpCisJCXdyaXRlaGlzdGZpbGUoKmxucCwgYyk7CisjZW5kaWYKKworCWhwID0gaGlzdHB0cjsKKworCWlmICgrK2hwID49IGhpc3RvcnkgKyBoaXN0c2l6ZSkgeyAvKiByZW1vdmUgb2xkZXN0IGNvbW1hbmQgKi8KKwkJYWZyZWUoKmhpc3RvcnksIEFQRVJNKTsKKwkJZm9yIChocCA9IGhpc3Rvcnk7IGhwIDwgaGlzdG9yeSArIGhpc3RzaXplIC0gMTsgaHArKykKKwkJCWhwWzBdID0gaHBbMV07CisJfQorCSpocCA9IGM7CisJaGlzdHB0ciA9IGhwOworfQorCisvKgorICoJV3JpdGUgaGlzdG9yeSBkYXRhIHRvIGEgZmlsZSBub21pbmF0ZWQgYnkgSElTVEZJTEUKKyAqCWlmIEhJU1RGSUxFIGlzIHVuc2V0IHRoZW4gaGlzdG9yeSBzdGlsbCBoYXBwZW5zLCBidXQKKyAqCXRoZSBkYXRhIGlzIG5vdCB3cml0dGVuIHRvIGEgZmlsZQorICoJQWxsIGNvcGllcyBvZiBrc2ggbG9va2luZyBhdCB0aGUgZmlsZSB3aWxsIG1haW50YWluIHRoZQorICoJc2FtZSBoaXN0b3J5LiBUaGlzIGlzIGtzaCBiZWhhdmlvdXIuCisgKgorICoJVGhpcyBzdHVmZiB1c2VzIG1tYXAoKQorICoJaWYgeW91ciBzeXN0ZW0gYWluJ3QgZ290IGl0IC0gdGhlbiB5b3UnbGwgaGF2ZSB0byB1bmRlZiBISVNUT1JZRklMRQorICovCisKKy8qCisgKglPcGVuIGEgaGlzdG9yeSBmaWxlCisgKglGb3JtYXQgaXM6CisgKglCeXRlcyAxLCAyOgorICoJCUhNQUdJQyAtIGp1c3QgdG8gY2hlY2sgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKgkJdGhlIGNvcnJlY3Qgb2JqZWN0CisgKglUaGVuIGZvbGxvd3MgYSBudW1iZXIgb2Ygc3RvcmVkIGNvbW1hbmRzCisgKglFYWNoIGNvbW1hbmQgaXMKKyAqCTxjb21tYW5kIGJ5dGU+PGNvbW1hbmQgbnVtYmVyKDQgYnl0ZXMpPjxieXRlcz48bnVsbD4KKyAqLworI2RlZmluZSBITUFHSUMxCQkweGFiCisjZGVmaW5lIEhNQUdJQzIJCTB4Y2QKKyNkZWZpbmUgQ09NTUFORAkJMHhmZgorCit2b2lkCitoaXN0X2luaXQoU291cmNlICpzKQoreworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisJdW5zaWduZWQgY2hhciAqYmFzZTsKKwlpbnQgbGluZXMsIGZkLCBydiA9IDA7CisjZW5kaWYKKworCWlmIChGbGFnKEZUQUxLSU5HKSA9PSAwKQorCQlyZXR1cm47CisKKwloc3RhcnRlZCA9IDE7CisKKwloaXN0X3NvdXJjZSA9IHM7CisKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCWlmICgoaG5hbWUgPSBzdHJfdmFsKGdsb2JhbCgiSElTVEZJTEUiKSkpID09IE5VTEwpCisJCXJldHVybjsKKwlzdHJkdXB4KGhuYW1lLCBobmFtZSwgQVBFUk0pOworCisgcmV0cnk6CisJLyogd2UgaGF2ZSBhIGZpbGUgYW5kIGFyZSBpbnRlcmFjdGl2ZSAqLworCWlmICgoZmQgPSBvcGVuKGhuYW1lLCBPX1JEV1J8T19DUkVBVHxPX0FQUEVORCwgMDYwMCkpIDwgMCkKKwkJcmV0dXJuOworCisJaGlzdGZkID0gc2F2ZWZkKGZkKTsKKwlpZiAoaGlzdGZkICE9IGZkKQorCQljbG9zZShmZCk7CisKKwkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfRVgpOworCisJaHNpemUgPSBsc2VlayhoaXN0ZmQsIChvZmZfdCkwLCBTRUVLX0VORCk7CisKKwlpZiAoaHNpemUgPT0gMCkgeworCQkvKiBhZGQgbWFnaWMgKi8KKwkJaWYgKHNwcmlua2xlKGhpc3RmZCkpIHsKKwkJCWhpc3RfZmluaXNoKCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGhzaXplID4gMCkgeworCQkvKgorCQkgKiB3ZSBoYXZlIHNvbWUgZGF0YQorCQkgKi8KKwkJYmFzZSA9ICh2b2lkICopbW1hcChOVUxMLCBoc2l6ZSwgUFJPVF9SRUFELAorCQkgICAgTUFQX0ZJTEUgfCBNQVBfUFJJVkFURSwgaGlzdGZkLCAob2ZmX3QpMCk7CisJCS8qCisJCSAqIGNoZWNrIG9uIGl0cyB2YWxpZGl0eQorCQkgKi8KKwkJaWYgKGJhc2UgPT0gKHVuc2lnbmVkIGNoYXIgKilNQVBfRkFJTEVEIHx8CisJCSAgICAqYmFzZSAhPSBITUFHSUMxIHx8IGJhc2VbMV0gIT0gSE1BR0lDMikgeworCQkJaWYgKGJhc2UgIT0gKHVuc2lnbmVkIGNoYXIgKilNQVBfRkFJTEVEKQorCQkJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBoc2l6ZSk7CisJCQloaXN0X2ZpbmlzaCgpOworCQkJaWYgKHVubGluayhobmFtZSkgLyogZmFpbHMgKi8pCisJCQkJZ290byBoaW5pdGVycjsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJaWYgKGhzaXplID4gMikgeworCQkJbGluZXMgPSBoaXN0X2NvdW50X2xpbmVzKGJhc2UrMiwgaHNpemUtMik7CisJCQlpZiAobGluZXMgPiBoaXN0c2l6ZSkgeworCQkJCS8qIHdlIG5lZWQgdG8gbWFrZSB0aGUgZmlsZSBzbWFsbGVyICovCisJCQkJaWYgKGhpc3Rfc2hyaW5rKGJhc2UsIGhzaXplKSkKKwkJCQkJcnYgPSB1bmxpbmsoaG5hbWUpOworCQkJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBoc2l6ZSk7CisJCQkJaGlzdF9maW5pc2goKTsKKwkJCQlpZiAocnYpIHsKKyBoaW5pdGVycjoKKwkJCQkJYmlfZXJyb3JmKCJjYW5ub3QgdW5saW5rIEhJU1RGSUxFICVzIgorCQkJCQkgICAgIiAtICVzIiwgaG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCWhzaXplID0gMDsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQl9CisJCWhpc3Rsb2FkKGhpc3Rfc291cmNlLCBiYXNlKzIsIGhzaXplLTIpOworCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgaHNpemUpOworCX0KKwkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfVU4pOworCWhzaXplID0gbHNlZWsoaGlzdGZkLCAob2ZmX3QpMCwgU0VFS19FTkQpOworI2VuZGlmCit9CisKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQordHlwZWRlZiBlbnVtIHN0YXRlIHsKKwlzaGRyLAkJLyogZXhwZWN0aW5nIGEgaGVhZGVyICovCisJc2xpbmUsCQkvKiBsb29raW5nIGZvciBhIG51bGwgYnl0ZSB0byBlbmQgdGhlIGxpbmUgKi8KKwlzbjEsCQkvKiBieXRlcyAxIHRvIDQgb2YgYSBsaW5lIG5vICovCisJc24yLCBzbjMsIHNuNAorfSBTdGF0ZTsKKworc3RhdGljIGludAoraGlzdF9jb3VudF9saW5lcyh1bnNpZ25lZCBjaGFyICpiYXNlLCBpbnQgYnl0ZXMpCit7CisJU3RhdGUgc3RhdGUgPSBzaGRyOworCWludCBsaW5lcyA9IDA7CisKKwl3aGlsZSAoYnl0ZXMtLSkgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2Ugc2hkcjoKKwkJCWlmICgqYmFzZSA9PSBDT01NQU5EKQorCQkJCXN0YXRlID0gc24xOworCQkJYnJlYWs7CisJCWNhc2Ugc24xOgorCQkJc3RhdGUgPSBzbjI7IGJyZWFrOworCQljYXNlIHNuMjoKKwkJCXN0YXRlID0gc24zOyBicmVhazsKKwkJY2FzZSBzbjM6CisJCQlzdGF0ZSA9IHNuNDsgYnJlYWs7CisJCWNhc2Ugc240OgorCQkJc3RhdGUgPSBzbGluZTsgYnJlYWs7CisJCWNhc2Ugc2xpbmU6CisJCQlpZiAoKmJhc2UgPT0gJ1wwJykgeworCQkJCWxpbmVzKys7CisJCQkJc3RhdGUgPSBzaGRyOworCQkJfQorCQl9CisJCWJhc2UrKzsKKwl9CisJcmV0dXJuIChsaW5lcyk7Cit9CisKKy8qCisgKglTaHJpbmsgdGhlIGhpc3RvcnkgZmlsZSB0byBoaXN0c2l6ZSBsaW5lcworICovCitzdGF0aWMgaW50CitoaXN0X3Nocmluayh1bnNpZ25lZCBjaGFyICpvbGRiYXNlLCBpbnQgb2xkYnl0ZXMpCit7CisJaW50IGZkLCBydiA9IDA7CisJY2hhciAqbmZpbGUgPSBOVUxMOworCXN0cnVjdAlzdGF0IHN0YXRiOworCXVuc2lnbmVkIGNoYXIgKm5iYXNlID0gb2xkYmFzZTsKKwlpbnQgbmJ5dGVzID0gb2xkYnl0ZXM7CisKKwluYmFzZSA9IGhpc3Rfc2tpcF9iYWNrKG5iYXNlLCAmbmJ5dGVzLCBoaXN0c2l6ZSk7CisJaWYgKG5iYXNlID09IE5VTEwpCisJCXJldHVybiAoMSk7CisJaWYgKG5iYXNlID09IG9sZGJhc2UpCisJCXJldHVybiAoMCk7CisKKwkvKgorCSAqCWNyZWF0ZSB0ZW1wIGZpbGUKKwkgKi8KKwluZmlsZSA9IHNoZl9zbXByaW50ZigiJXMuJWQiLCBobmFtZSwgKGludClwcm9jcGlkKTsKKwlpZiAoKGZkID0gb3BlbihuZmlsZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgMDYwMCkpIDwgMCkKKwkJZ290byBlcnJvdXQ7CisJaWYgKGZzdGF0KGhpc3RmZCwgJnN0YXRiKSA+PSAwICYmCisJICAgIGNob3duKG5maWxlLCBzdGF0Yi5zdF91aWQsIHN0YXRiLnN0X2dpZCkpCisJCWdvdG8gZXJyb3V0OworCisJaWYgKHNwcmlua2xlKGZkKSB8fCB3cml0ZShmZCwgbmJhc2UsIG5ieXRlcykgIT0gbmJ5dGVzKQorCQlnb3RvIGVycm91dDsKKwljbG9zZShmZCk7CisJZmQgPSAtMTsKKworCS8qCisJICoJcmVuYW1lCisJICovCisJaWYgKHJlbmFtZShuZmlsZSwgaG5hbWUpIDwgMCkgeworIGVycm91dDoKKwkJaWYgKGZkID49IDApIHsKKwkJCWNsb3NlKGZkKTsKKwkJCWlmIChuZmlsZSkKKwkJCQl1bmxpbmsobmZpbGUpOworCQl9CisJCXJ2ID0gMTsKKwl9CisJYWZyZWUobmZpbGUsIEFURU1QKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCWZpbmQgYSBwb2ludGVyIHRvIHRoZSBkYXRhICdubycgYmFjayBmcm9tIHRoZSBlbmQgb2YgdGhlIGZpbGUKKyAqCXJldHVybiB0aGUgcG9pbnRlciBhbmQgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK2hpc3Rfc2tpcF9iYWNrKHVuc2lnbmVkIGNoYXIgKmJhc2UsIGludCAqYnl0ZXMsIGludCBubykKK3sKKwlpbnQgbGluZXMgPSAwOworCXVuc2lnbmVkIGNoYXIgKmVwOworCisJZm9yIChlcCA9IGJhc2UgKyAqYnl0ZXM7IC0tZXAgPiBiYXNlOyApIHsKKwkJLyoKKwkJICogdGhpcyBkb2Vzbid0IHJlYWxseSB3b3JrOiB0aGUgNCBieXRlIGxpbmUgbnVtYmVyIHRoYXQKKwkJICogaXMgZW5jb2RlZCBhZnRlciB0aGUgQ09NTUFORCBieXRlIGNhbiBpdHNlbGYgY29udGFpbgorCQkgKiB0aGUgQ09NTUFORCBieXRlLi4uLgorCQkgKi8KKwkJZm9yICg7IGVwID4gYmFzZSAmJiAqZXAgIT0gQ09NTUFORDsgZXAtLSkKKwkJCTsKKwkJaWYgKGVwID09IGJhc2UpCisJCQlicmVhazsKKwkJaWYgKCsrbGluZXMgPT0gbm8pIHsKKwkJCSpieXRlcyA9ICpieXRlcyAtICgoY2hhciAqKWVwIC0gKGNoYXIgKiliYXNlKTsKKwkJCXJldHVybiAoZXApOworCQl9CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKglsb2FkIHRoZSBoaXN0b3J5IHN0cnVjdHVyZSBmcm9tIHRoZSBzdG9yZWQgZGF0YQorICovCitzdGF0aWMgdm9pZAoraGlzdGxvYWQoU291cmNlICpzLCB1bnNpZ25lZCBjaGFyICpiYXNlLCBpbnQgYnl0ZXMpCit7CisJU3RhdGUgc3RhdGU7CisJaW50IGxubyA9IDA7CisJdW5zaWduZWQgY2hhciAqbGluZSA9IE5VTEw7CisKKwlmb3IgKHN0YXRlID0gc2hkcjsgYnl0ZXMtLSA+IDA7IGJhc2UrKykgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2Ugc2hkcjoKKwkJCWlmICgqYmFzZSA9PSBDT01NQU5EKQorCQkJCXN0YXRlID0gc24xOworCQkJYnJlYWs7CisJCWNhc2Ugc24xOgorCQkJbG5vID0gKCgoKmJhc2UpJjB4ZmYpPDwyNCk7CisJCQlzdGF0ZSA9IHNuMjsKKwkJCWJyZWFrOworCQljYXNlIHNuMjoKKwkJCWxubyB8PSAoKCgqYmFzZSkmMHhmZik8PDE2KTsKKwkJCXN0YXRlID0gc24zOworCQkJYnJlYWs7CisJCWNhc2Ugc24zOgorCQkJbG5vIHw9ICgoKCpiYXNlKSYweGZmKTw8OCk7CisJCQlzdGF0ZSA9IHNuNDsKKwkJCWJyZWFrOworCQljYXNlIHNuNDoKKwkJCWxubyB8PSAoKmJhc2UpJjB4ZmY7CisJCQlsaW5lID0gYmFzZSsxOworCQkJc3RhdGUgPSBzbGluZTsKKwkJCWJyZWFrOworCQljYXNlIHNsaW5lOgorCQkJaWYgKCpiYXNlID09ICdcMCcpIHsKKwkJCQkvKiB3b3JyeSBhYm91dCBsaW5lIG51bWJlcnMgKi8KKwkJCQlpZiAoaGlzdHB0ciA+PSBoaXN0b3J5ICYmIGxuby0xICE9IHMtPmxpbmUpIHsKKwkJCQkJLyogYSByZXBsYWNlbWVudCA/ICovCisJCQkJCWhpc3RpbnNlcnQocywgbG5vLCAoY2hhciAqKWxpbmUpOworCQkJCX0gZWxzZSB7CisJCQkJCXMtPmxpbmUgPSBsbm8tLTsKKwkJCQkJaGlzdHNhdmUoJmxubywgKGNoYXIgKilsaW5lLCBmYWxzZSwKKwkJCQkJICAgIGZhbHNlKTsKKwkJCQl9CisJCQkJc3RhdGUgPSBzaGRyOworCQkJfQorCQl9CisJfQorfQorCisvKgorICoJSW5zZXJ0IGEgbGluZSBpbnRvIHRoZSBoaXN0b3J5IGF0IGEgc3BlY2lmaWVkIG51bWJlcgorICovCitzdGF0aWMgdm9pZAoraGlzdGluc2VydChTb3VyY2UgKnMsIGludCBsbm8sIGNvbnN0IGNoYXIgKmxpbmUpCit7CisJY2hhciAqKmhwOworCisJaWYgKGxubyA+PSBzLT5saW5lIC0gKGhpc3RwdHIgLSBoaXN0b3J5KSAmJiBsbm8gPD0gcy0+bGluZSkgeworCQlocCA9ICZoaXN0cHRyW2xubyAtIHMtPmxpbmVdOworCQlpZiAoKmhwKQorCQkJYWZyZWUoKmhwLCBBUEVSTSk7CisJCXN0cmR1cHgoKmhwLCBsaW5lLCBBUEVSTSk7CisJfQorfQorCisvKgorICoJd3JpdGUgYSBjb21tYW5kIHRvIHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgZmlsZQorICoJVGhpcyAqTUFZKiBzZWVtIGVhc3kgYnV0IGl0J3MgYWxzbyBuZWNlc3NhcnkgdG8gY2hlY2sKKyAqCXRoYXQgdGhlIGhpc3RvcnkgZmlsZSBoYXMgbm90IGNoYW5nZWQgaW4gc2l6ZS4KKyAqCUlmIGl0IGhhcyAtIHRoZW4gc29tZSBvdGhlciBzaGVsbCBoYXMgd3JpdHRlbiB0byBpdAorICoJYW5kIHdlIHNob3VsZCByZWFkIHRob3NlIGNvbW1hbmRzIHRvIHVwZGF0ZSBvdXIgaGlzdG9yeQorICovCitzdGF0aWMgdm9pZAord3JpdGVoaXN0ZmlsZShpbnQgbG5vLCBjaGFyICpjbWQpCit7CisJaW50CXNpemVub3c7CisJdW5zaWduZWQgY2hhcgkqYmFzZTsKKwl1bnNpZ25lZCBjaGFyCSpuZXdzOworCWludAlieXRlczsKKwl1bnNpZ25lZCBjaGFyCWhkcls1XTsKKworCSh2b2lkKWZsb2NrKGhpc3RmZCwgTE9DS19FWCk7CisJc2l6ZW5vdyA9IGxzZWVrKGhpc3RmZCwgKG9mZl90KTAsIFNFRUtfRU5EKTsKKwlpZiAoc2l6ZW5vdyAhPSBoc2l6ZSkgeworCQkvKgorCQkgKglUaGluZ3MgaGF2ZSBjaGFuZ2VkCisJCSAqLworCQlpZiAoc2l6ZW5vdyA+IGhzaXplKSB7CisJCQkvKiBzb21lb25lIGhhcyBhZGRlZCBzb21lIGxpbmVzICovCisJCQlieXRlcyA9IHNpemVub3cgLSBoc2l6ZTsKKwkJCWJhc2UgPSAodm9pZCAqKW1tYXAoTlVMTCwgc2l6ZW5vdywgUFJPVF9SRUFELAorCQkJICAgIE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUsIGhpc3RmZCwgKG9mZl90KTApOworCQkJaWYgKGJhc2UgPT0gKHVuc2lnbmVkIGNoYXIgKilNQVBfRkFJTEVEKQorCQkJCWdvdG8gYmFkOworCQkJbmV3cyA9IGJhc2UgKyBoc2l6ZTsKKwkJCWlmICgqbmV3cyAhPSBDT01NQU5EKSB7CisJCQkJbXVubWFwKChjYWRkcl90KWJhc2UsIHNpemVub3cpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaGlzdF9zb3VyY2UtPmxpbmUtLTsKKwkJCWhpc3Rsb2FkKGhpc3Rfc291cmNlLCBuZXdzLCBieXRlcyk7CisJCQloaXN0X3NvdXJjZS0+bGluZSsrOworCQkJbG5vID0gaGlzdF9zb3VyY2UtPmxpbmU7CisJCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgc2l6ZW5vdyk7CisJCQloc2l6ZSA9IHNpemVub3c7CisJCX0gZWxzZSB7CisJCQkvKiBpdCBoYXMgc2hydW5rICovCisJCQkvKiBidXQgdG8gd2hhdD8gKi8KKwkJCS8qIHdlJ2xsIGdpdmUgdXAgZm9yIG5vdyAqLworCQkJZ290byBiYWQ7CisJCX0KKwl9CisJaWYgKGNtZCkgeworCQkvKgorCQkgKgl3ZSBjYW4gd3JpdGUgb3VyIGJpdCBub3cKKwkJICovCisJCWhkclswXSA9IENPTU1BTkQ7CisJCWhkclsxXSA9IChsbm8+PjI0KSYweGZmOworCQloZHJbMl0gPSAobG5vPj4xNikmMHhmZjsKKwkJaGRyWzNdID0gKGxubz4+OCkmMHhmZjsKKwkJaGRyWzRdID0gbG5vJjB4ZmY7CisJCWJ5dGVzID0gc3RybGVuKGNtZCkgKyAxOworCQlpZiAoKHdyaXRlKGhpc3RmZCwgaGRyLCA1KSAhPSA1KSB8fAorCQkgICAgKHdyaXRlKGhpc3RmZCwgY21kLCBieXRlcykgIT0gYnl0ZXMpKQorCQkJZ290byBiYWQ7CisJCWhzaXplID0gbHNlZWsoaGlzdGZkLCAob2ZmX3QpMCwgU0VFS19FTkQpOworCX0KKwkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfVU4pOworCXJldHVybjsKKyBiYWQ6CisJaGlzdF9maW5pc2goKTsKK30KKwordm9pZAoraGlzdF9maW5pc2godm9pZCkKK3sKKwkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfVU4pOworCSh2b2lkKWNsb3NlKGhpc3RmZCk7CisJaGlzdGZkID0gMDsKK30KKworLyoKKyAqCWFkZCBtYWdpYyB0byB0aGUgaGlzdG9yeSBmaWxlCisgKi8KK3N0YXRpYyBpbnQKK3Nwcmlua2xlKGludCBmZCkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtYWdbXSA9IHsgSE1BR0lDMSwgSE1BR0lDMiB9OworCisJcmV0dXJuICh3cml0ZShmZCwgbWFnLCAyKSAhPSAyKTsKK30KKyNlbmRpZgorCisjaWYgIUhBVkVfU1lTX1NJR05BTUUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWtzaF9zaWdwYWlyIHsKKwljb25zdCBjaGFyICpjb25zdCBuYW1lOworCWludCBucjsKK30gbWtzaF9zaWdwYWlyc1tdID0geworI2luY2x1ZGUgInNpZ25hbWVzLmluYyIKKwl7IE5VTEwsIDAgfQorfTsKKyNlbmRpZgorCit2b2lkCitpbml0dHJhcHModm9pZCkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpjczsKKworCS8qIFBvcHVsYXRlIHNpZ3RyYXBzIGJhc2VkIG9uIHN5c19zaWduYW1lIGFuZCBzeXNfc2lnbGlzdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDw9IE5TSUc7IGkrKykgeworCQlzaWd0cmFwc1tpXS5zaWduYWwgPSBpOworCQlpZiAoaSA9PSBTSUdFUlJfKSB7CisJCQlzaWd0cmFwc1tpXS5uYW1lID0gIkVSUiI7CisJCQlzaWd0cmFwc1tpXS5tZXNzID0gIkVycm9yIGhhbmRsZXIiOworCQl9IGVsc2UgeworI2lmIEhBVkVfU1lTX1NJR05BTUUKKwkJCWNzID0gc3lzX3NpZ25hbWVbaV07CisjZWxzZQorCQkJY29uc3Qgc3RydWN0IG1rc2hfc2lncGFpciAqcGFpciA9IG1rc2hfc2lncGFpcnM7CisJCQl3aGlsZSAoKHBhaXItPm5yICE9IGkpICYmIChwYWlyLT5uYW1lICE9IE5VTEwpKQorCQkJCSsrcGFpcjsKKwkJCWNzID0gcGFpci0+bmFtZTsKKyNlbmRpZgorCQkJaWYgKChjcyA9PSBOVUxMKSB8fAorCQkJICAgIChjc1swXSA9PSAnXDAnKSkKKwkJCQlzaWd0cmFwc1tpXS5uYW1lID0gc2hmX3NtcHJpbnRmKCIlZCIsIGkpOworCQkJZWxzZSB7CisJCQkJY2hhciAqczsKKworCQkJCWlmICghc3RybmNhc2VjbXAoY3MsICJTSUciLCAzKSkKKwkJCQkJY3MgKz0gMzsKKwkJCQlzdHJkdXB4KHMsIGNzLCBBUEVSTSk7CisJCQkJc2lndHJhcHNbaV0ubmFtZSA9IHM7CisJCQkJd2hpbGUgKCgqcyA9IGtzaF90b3VwcGVyKCpzKSkpCisJCQkJCSsrczsKKwkJCX0KKyNpZiBIQVZFX1NZU19TSUdMSVNUCisJCQlzaWd0cmFwc1tpXS5tZXNzID0gc3lzX3NpZ2xpc3RbaV07CisjZWxpZiBIQVZFX1NUUlNJR05BTAorCQkJc2lndHJhcHNbaV0ubWVzcyA9IHN0cnNpZ25hbChpKTsKKyNlbHNlCisJCQlzaWd0cmFwc1tpXS5tZXNzID0gTlVMTDsKKyNlbmRpZgorCQkJaWYgKChzaWd0cmFwc1tpXS5tZXNzID09IE5VTEwpIHx8CisJCQkgICAgKHNpZ3RyYXBzW2ldLm1lc3NbMF0gPT0gJ1wwJykpCisJCQkJc2lndHJhcHNbaV0ubWVzcyA9IHNoZl9zbXByaW50ZigiU2lnbmFsICVkIiwgaSk7CisJCX0KKwl9CisJc2lndHJhcHNbU0lHRVhJVF9dLm5hbWUgPSAiRVhJVCI7CS8qIG91ciBuYW1lIGZvciBzaWduYWwgMCAqLworCisJKHZvaWQpc2lnZW1wdHlzZXQoJlNpZ2FjdF9pZ24uc2FfbWFzayk7CisJU2lnYWN0X2lnbi5zYV9mbGFncyA9IDA7IC8qIGludGVycnVwdGlibGUgKi8KKwlTaWdhY3RfaWduLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworCisJc2lndHJhcHNbU0lHSU5UXS5mbGFncyB8PSBURl9ERkxfSU5UUiB8IFRGX1RUWV9JTlRSOworCXNpZ3RyYXBzW1NJR1FVSVRdLmZsYWdzIHw9IFRGX0RGTF9JTlRSIHwgVEZfVFRZX0lOVFI7CisJc2lndHJhcHNbU0lHVEVSTV0uZmxhZ3MgfD0gVEZfREZMX0lOVFI7Lyogbm90IGZhdGFsIGZvciBpbnRlcmFjdGl2ZSAqLworCXNpZ3RyYXBzW1NJR0hVUF0uZmxhZ3MgfD0gVEZfRkFUQUw7CisJc2lndHJhcHNbU0lHQ0hMRF0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKKworCS8qIHRoZXNlIGFyZSBhbHdheXMgY2F1Z2h0IHNvIHdlIGNhbiBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IGZpbGVzLiAqLworCXNldHNpZygmc2lndHJhcHNbU0lHSU5UXSwgdHJhcHNpZywgU1NfUkVTVE9SRV9PUklHKTsKKwlzZXRzaWcoJnNpZ3RyYXBzW1NJR1FVSVRdLCB0cmFwc2lnLCBTU19SRVNUT1JFX09SSUcpOworCXNldHNpZygmc2lndHJhcHNbU0lHVEVSTV0sIHRyYXBzaWcsIFNTX1JFU1RPUkVfT1JJRyk7CisJc2V0c2lnKCZzaWd0cmFwc1tTSUdIVVBdLCB0cmFwc2lnLCBTU19SRVNUT1JFX09SSUcpOworfQorCitzdGF0aWMgdm9pZCBhbGFybV9jYXRjaGVyKGludCBzaWcpOworCit2b2lkCithbGFybV9pbml0KHZvaWQpCit7CisJc2lndHJhcHNbU0lHQUxSTV0uZmxhZ3MgfD0gVEZfU0hFTExfVVNFUzsKKwlzZXRzaWcoJnNpZ3RyYXBzW1NJR0FMUk1dLCBhbGFybV9jYXRjaGVyLAorCQlTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0V8U1NfU0hUUkFQKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCithbGFybV9jYXRjaGVyKGludCBzaWcgTUtTSF9BX1VOVVNFRCkKK3sKKwkvKiB0aGlzIHJ1bnMgaW5zaWRlIGludGVycnVwdCBjb250ZXh0LCB3aXRoIGVycm5vIHNhdmVkICovCisKKwlpZiAoa3NoX3Rtb3V0X3N0YXRlID09IFRNT1VUX1JFQURJTkcpIHsKKwkJaW50IGxlZnQgPSBhbGFybSgwKTsKKworCQlpZiAobGVmdCA9PSAwKSB7CisJCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9MRUFWSU5HOworCQkJaW50cnNpZyA9IDE7CisJCX0gZWxzZQorCQkJYWxhcm0obGVmdCk7CisJfQorfQorCitUcmFwICoKK2dldHRyYXAoY29uc3QgY2hhciAqbmFtZSwgaW50IGlnbmNhc2UpCit7CisJaW50IG4gPSBOU0lHICsgMTsKKwlUcmFwICpwOworCWNvbnN0IGNoYXIgKm4yOworCWludCAoKmNtcGZ1bmMpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSA9IHN0cmNtcDsKKworCWlmIChrc2hfaXNkaWdpdCgqbmFtZSkpIHsKKwkJaWYgKGdldG4obmFtZSwgJm4pICYmIDAgPD0gbiAmJiBuIDwgTlNJRykKKwkJCXJldHVybiAoJnNpZ3RyYXBzW25dKTsKKwkJZWxzZQorCQkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwluMiA9IHN0cm5jYXNlY21wKG5hbWUsICJTSUciLCAzKSA/IE5VTEwgOiBuYW1lICsgMzsKKwlpZiAoaWduY2FzZSkKKwkJY21wZnVuYyA9IHN0cmNhc2VjbXA7CisJZm9yIChwID0gc2lndHJhcHM7IC0tbiA+PSAwOyBwKyspCisJCWlmICghY21wZnVuYyhwLT5uYW1lLCBuYW1lKSB8fCAobjIgJiYgIWNtcGZ1bmMocC0+bmFtZSwgbjIpKSkKKwkJCXJldHVybiAocCk7CisJcmV0dXJuIChOVUxMKTsKK30KKworLyoKKyAqIHRyYXAgc2lnbmFsIGhhbmRsZXIKKyAqLwordm9pZAordHJhcHNpZyhpbnQgaSkKK3sKKwlUcmFwICpwID0gJnNpZ3RyYXBzW2ldOworCWludCBlcnJub18gPSBlcnJubzsKKworCXRyYXAgPSBwLT5zZXQgPSAxOworCWlmIChwLT5mbGFncyAmIFRGX0RGTF9JTlRSKQorCQlpbnRyc2lnID0gMTsKKwlpZiAoKHAtPmZsYWdzICYgVEZfRkFUQUwpICYmICFwLT50cmFwKSB7CisJCWZhdGFsX3RyYXAgPSAxOworCQlpbnRyc2lnID0gMTsKKwl9CisJaWYgKHAtPnNodHJhcCkKKwkJKCpwLT5zaHRyYXApKGkpOworCWVycm5vID0gZXJybm9fOworfQorCisvKgorICogY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBhbGxvdyB0aGUgdXNlciB0byBeQyBvdXQgb2Ygc29tZXRoaW5nIC0gd29uJ3QKKyAqIHdvcmsgaWYgdXNlciBoYXMgdHJhcHBlZCBTSUdJTlQuCisgKi8KK3ZvaWQKK2ludHJjaGVjayh2b2lkKQoreworCWlmIChpbnRyc2lnKQorCQlydW50cmFwcyhURl9ERkxfSU5UUnxURl9GQVRBTCk7Cit9CisKKy8qCisgKiBjYWxsZWQgYWZ0ZXIgRUlOVFIgdG8gY2hlY2sgaWYgYSBzaWduYWwgd2l0aCBub3JtYWxseSBjYXVzZXMgcHJvY2VzcworICogdGVybWluYXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQuCisgKi8KK2ludAorZmF0YWxfdHJhcF9jaGVjayh2b2lkKQoreworCWludCBpOworCVRyYXAgKnA7CisKKwkvKiB0b2RvOiBzaG91bGQgY2hlY2sgaWYgc2lnbmFsIGlzIGZhdGFsLCBub3QgdGhlIFRGX0RGTF9JTlRSIGZsYWcgKi8KKwlmb3IgKHAgPSBzaWd0cmFwcywgaSA9IE5TSUcrMTsgLS1pID49IDA7IHArKykKKwkJaWYgKHAtPnNldCAmJiAocC0+ZmxhZ3MgJiAoVEZfREZMX0lOVFJ8VEZfRkFUQUwpKSkKKwkJCS8qIHJldHVybiB2YWx1ZSBpcyB1c2VkIGFzIGFuIGV4aXQgY29kZSAqLworCQkJcmV0dXJuICgxMjggKyBwLT5zaWduYWwpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIG9mIGFueSBwZW5kaW5nIHRyYXBzOiBpZSwgYSBzaWduYWwgd2hpY2ggaGFzCisgKiBvY2N1cnJlZCBmb3Igd2hpY2ggYSB0cmFwIGhhcyBiZWVuIHNldCBvciBmb3Igd2hpY2ggdGhlIFRGX0RGTF9JTlRSIGZsYWcKKyAqIGlzIHNldC4KKyAqLworaW50Cit0cmFwX3BlbmRpbmcodm9pZCkKK3sKKwlpbnQgaTsKKwlUcmFwICpwOworCisJZm9yIChwID0gc2lndHJhcHMsIGkgPSBOU0lHKzE7IC0taSA+PSAwOyBwKyspCisJCWlmIChwLT5zZXQgJiYgKChwLT50cmFwICYmIHAtPnRyYXBbMF0pIHx8CisJCSAgICAoKHAtPmZsYWdzICYgKFRGX0RGTF9JTlRSfFRGX0ZBVEFMKSkgJiYgIXAtPnRyYXApKSkKKwkJCXJldHVybiAocC0+c2lnbmFsKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcnVuIGFueSBwZW5kaW5nIHRyYXBzLiBJZiBpbnRyIGlzIHNldCwgb25seSBydW4gdHJhcHMgdGhhdAorICogY2FuIGludGVycnVwdCBjb21tYW5kcy4KKyAqLwordm9pZAorcnVudHJhcHMoaW50IGZsYWcpCit7CisJaW50IGk7CisJVHJhcCAqcDsKKworCWlmIChrc2hfdG1vdXRfc3RhdGUgPT0gVE1PVVRfTEVBVklORykgeworCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9FWEVDVVRJTkc7CisJCXdhcm5pbmdmKGZhbHNlLCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIGlucHV0Iik7CisJCXVud2luZChMRVhJVCk7CisJfSBlbHNlCisJCS8qCisJCSAqIFhYWDogdGhpcyBtZWFucyB0aGUgYWxhcm0gd2lsbCBoYXZlIG5vIGVmZmVjdCBpZiBhIHRyYXAKKwkJICogaXMgY2F1Z2h0IGFmdGVyIHRoZSBhbGFybSgpIHdhcyBzdGFydGVkLi4ubm90IGdvb2QuCisJCSAqLworCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9FWEVDVVRJTkc7CisJaWYgKCFmbGFnKQorCQl0cmFwID0gMDsKKwlpZiAoZmxhZyAmIFRGX0RGTF9JTlRSKQorCQlpbnRyc2lnID0gMDsKKwlpZiAoZmxhZyAmIFRGX0ZBVEFMKQorCQlmYXRhbF90cmFwID0gMDsKKwlmb3IgKHAgPSBzaWd0cmFwcywgaSA9IE5TSUcrMTsgLS1pID49IDA7IHArKykKKwkJaWYgKHAtPnNldCAmJiAoIWZsYWcgfHwKKwkJICAgICgocC0+ZmxhZ3MgJiBmbGFnKSAmJiBwLT50cmFwID09IE5VTEwpKSkKKwkJCXJ1bnRyYXAocCk7Cit9CisKK3ZvaWQKK3J1bnRyYXAoVHJhcCAqcCkKK3sKKwlpbnQJaSA9IHAtPnNpZ25hbDsKKwljaGFyCSp0cmFwc3RyID0gcC0+dHJhcDsKKwlpbnQJb2V4c3RhdDsKKwlpbnQJb2xkX2NoYW5nZWQgPSAwOworCisJcC0+c2V0ID0gMDsKKwlpZiAodHJhcHN0ciA9PSBOVUxMKSB7IC8qIFNJR19ERkwgKi8KKwkJaWYgKHAtPmZsYWdzICYgVEZfRkFUQUwpIHsKKwkJCS8qIGVnLCBTSUdIVVAgKi8KKwkJCWV4c3RhdCA9IDEyOCArIGk7CisJCQl1bndpbmQoTExFQVZFKTsKKwkJfQorCQlpZiAocC0+ZmxhZ3MgJiBURl9ERkxfSU5UUikgeworCQkJLyogZWcsIFNJR0lOVCwgU0lHUVVJVCwgU0lHVEVSTSwgZXRjLiAqLworCQkJZXhzdGF0ID0gMTI4ICsgaTsKKwkJCXVud2luZChMSU5UUik7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAodHJhcHN0clswXSA9PSAnXDAnKSAvKiBTSUdfSUdOICovCisJCXJldHVybjsKKwlpZiAoaSA9PSBTSUdFWElUXyB8fCBpID09IFNJR0VSUl8pIHsJLyogYXZvaWQgcmVjdXJzaW9uIG9uIHRoZXNlICovCisJCW9sZF9jaGFuZ2VkID0gcC0+ZmxhZ3MgJiBURl9DSEFOR0VEOworCQlwLT5mbGFncyAmPSB+VEZfQ0hBTkdFRDsKKwkJcC0+dHJhcCA9IE5VTEw7CisJfQorCW9leHN0YXQgPSBleHN0YXQ7CisJLyoKKwkgKiBOb3RlOiB0cmFwc3RyIGlzIGZ1bGx5IHBhcnNlZCBiZWZvcmUgYW55dGhpbmcgaXMgZXhlY3V0ZWQsIHRodXMKKwkgKiBubyBwcm9ibGVtIHdpdGggYWZyZWUocC0+dHJhcCkgaW4gc2V0dHJhcCgpIHdoaWxlIHN0aWxsIGluIHVzZS4KKwkgKi8KKwljb21tYW5kKHRyYXBzdHIsIGN1cnJlbnRfbGluZW5vKTsKKwlleHN0YXQgPSBvZXhzdGF0OworCWlmIChpID09IFNJR0VYSVRfIHx8IGkgPT0gU0lHRVJSXykgeworCQlpZiAocC0+ZmxhZ3MgJiBURl9DSEFOR0VEKQorCQkJLyogZG9uJ3QgY2xlYXIgVEZfQ0hBTkdFRCAqLworCQkJYWZyZWUodHJhcHN0ciwgQVBFUk0pOworCQllbHNlCisJCQlwLT50cmFwID0gdHJhcHN0cjsKKwkJcC0+ZmxhZ3MgfD0gb2xkX2NoYW5nZWQ7CisJfQorfQorCisvKiBjbGVhciBwZW5kaW5nIHRyYXBzIGFuZCByZXNldCB1c2VyJ3MgdHJhcCBoYW5kbGVyczsgdXNlZCBhZnRlciBmb3JrKDIpICovCit2b2lkCitjbGVhcnRyYXBzKHZvaWQpCit7CisJaW50IGk7CisJVHJhcCAqcDsKKworCXRyYXAgPSAwOworCWludHJzaWcgPSAwOworCWZhdGFsX3RyYXAgPSAwOworCWZvciAoaSA9IE5TSUcrMSwgcCA9IHNpZ3RyYXBzOyAtLWkgPj0gMDsgcCsrKSB7CisJCXAtPnNldCA9IDA7CisJCWlmICgocC0+ZmxhZ3MgJiBURl9VU0VSX1NFVCkgJiYgKHAtPnRyYXAgJiYgcC0+dHJhcFswXSkpCisJCQlzZXR0cmFwKHAsIE5VTEwpOworCX0KK30KKworLyogcmVzdG9yZSBzaWduYWxzIGp1c3QgYmVmb3JlIGFuIGV4ZWMoMikgKi8KK3ZvaWQKK3Jlc3RvcmVzaWdzKHZvaWQpCit7CisJaW50IGk7CisJVHJhcCAqcDsKKworCWZvciAoaSA9IE5TSUcrMSwgcCA9IHNpZ3RyYXBzOyAtLWkgPj0gMDsgcCsrKQorCQlpZiAocC0+ZmxhZ3MgJiAoVEZfRVhFQ19JR058VEZfRVhFQ19ERkwpKQorCQkJc2V0c2lnKHAsIChwLT5mbGFncyAmIFRGX0VYRUNfSUdOKSA/IFNJR19JR04gOiBTSUdfREZMLAorCQkJICAgIFNTX1JFU1RPUkVfQ1VSUnxTU19GT1JDRSk7Cit9CisKK3ZvaWQKK3NldHRyYXAoVHJhcCAqcCwgY29uc3QgY2hhciAqcykKK3sKKwlzaWdfdCBmOworCisJaWYgKHAtPnRyYXApCisJCWFmcmVlKHAtPnRyYXAsIEFQRVJNKTsKKwlzdHJkdXB4KHAtPnRyYXAsIHMsIEFQRVJNKTsgLyogaGFuZGxlcyBzID09IDAgKi8KKwlwLT5mbGFncyB8PSBURl9DSEFOR0VEOworCWYgPSAhcyA/IFNJR19ERkwgOiBzWzBdID8gdHJhcHNpZyA6IFNJR19JR047CisKKwlwLT5mbGFncyB8PSBURl9VU0VSX1NFVDsKKwlpZiAoKHAtPmZsYWdzICYgKFRGX0RGTF9JTlRSfFRGX0ZBVEFMKSkgJiYgZiA9PSBTSUdfREZMKQorCQlmID0gdHJhcHNpZzsKKwllbHNlIGlmIChwLT5mbGFncyAmIFRGX1NIRUxMX1VTRVMpIHsKKwkJaWYgKCEocC0+ZmxhZ3MgJiBURl9PUklHX0lHTikgfHwgRmxhZyhGVEFMS0lORykpIHsKKwkJCS8qIGRvIHdoYXQgdXNlciB3YW50cyBhdCBleGVjIHRpbWUgKi8KKwkJCXAtPmZsYWdzICY9IH4oVEZfRVhFQ19JR058VEZfRVhFQ19ERkwpOworCQkJaWYgKGYgPT0gU0lHX0lHTikKKwkJCQlwLT5mbGFncyB8PSBURl9FWEVDX0lHTjsKKwkJCWVsc2UKKwkJCQlwLT5mbGFncyB8PSBURl9FWEVDX0RGTDsKKwkJfQorCisJCS8qCisJCSAqIGFzc3VtZXMgaGFuZGxlciBhbHJlYWR5IHNldCB0byB3aGF0IHNoZWxsIHdhbnRzIGl0CisJCSAqIChub3JtYWxseSB0cmFwc2lnLCBidXQgY291bGQgYmUgal9zaWdjaGxkKCkgb3IgU0lHX0lHTikKKwkJICovCisJCXJldHVybjsKKwl9CisKKwkvKiB0b2RvOiBzaG91bGQgd2UgbGV0IHVzZXIga25vdyBzaWduYWwgaXMgaWdub3JlZD8gaG93PyAqLworCXNldHNpZyhwLCBmLCBTU19SRVNUT1JFX0NVUlJ8U1NfVVNFUik7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgY19wcmludCgpIHdoZW4gd3JpdGluZyB0byBhIGNvLXByb2Nlc3MgdG8gZW5zdXJlIFNJR1BJUEUgd29uJ3QKKyAqIGtpbGwgc2hlbGwgKHVubGVzcyB1c2VyIGNhdGNoZXMgaXQgYW5kIGV4aXRzKQorICovCitpbnQKK2Jsb2NrX3BpcGUodm9pZCkKK3sKKwlpbnQgcmVzdG9yZV9kZmwgPSAwOworCVRyYXAgKnAgPSAmc2lndHJhcHNbU0lHUElQRV07CisKKwlpZiAoIShwLT5mbGFncyAmIChURl9PUklHX0lHTnxURl9PUklHX0RGTCkpKSB7CisJCXNldHNpZyhwLCBTSUdfSUdOLCBTU19SRVNUT1JFX0NVUlIpOworCQlpZiAocC0+ZmxhZ3MgJiBURl9PUklHX0RGTCkKKwkJCXJlc3RvcmVfZGZsID0gMTsKKwl9IGVsc2UgaWYgKHAtPmN1cnNpZyA9PSBTSUdfREZMKSB7CisJCXNldHNpZyhwLCBTSUdfSUdOLCBTU19SRVNUT1JFX0NVUlIpOworCQlyZXN0b3JlX2RmbCA9IDE7IC8qIHJlc3RvcmUgdG8gU0lHX0RGTCAqLworCX0KKwlyZXR1cm4gKHJlc3RvcmVfZGZsKTsKK30KKworLyogQ2FsbGVkIGJ5IGNfcHJpbnQoKSB0byB1bmRvIHdoYXRldmVyIGJsb2NrX3BpcGUoKSBkaWQgKi8KK3ZvaWQKK3Jlc3RvcmVfcGlwZShpbnQgcmVzdG9yZV9kZmwpCit7CisJaWYgKHJlc3RvcmVfZGZsKQorCQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1BJUEVdLCBTSUdfREZMLCBTU19SRVNUT1JFX0NVUlIpOworfQorCisvKgorICogU2V0IGFjdGlvbiBmb3IgYSBzaWduYWwuIEFjdGlvbiBtYXkgbm90IGJlIHNldCBpZiBvcmlnaW5hbAorICogYWN0aW9uIHdhcyBTSUdfSUdOLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGZsYWdzIGFuZCBGVEFMS0lORy4KKyAqLworaW50CitzZXRzaWcoVHJhcCAqcCwgc2lnX3QgZiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2lnYWN0OworCisJaWYgKHAtPnNpZ25hbCA9PSBTSUdFWElUXyB8fCBwLT5zaWduYWwgPT0gU0lHRVJSXykKKwkJcmV0dXJuICgxKTsKKworCS8qCisJICogRmlyc3QgdGltZSBzZXR0aW5nIHRoaXMgc2lnbmFsPyBJZiBzbywgZ2V0IGFuZCBub3RlIHRoZSBjdXJyZW50CisJICogc2V0dGluZy4KKwkgKi8KKwlpZiAoIShwLT5mbGFncyAmIChURl9PUklHX0lHTnxURl9PUklHX0RGTCkpKSB7CisJCXNpZ2FjdGlvbihwLT5zaWduYWwsICZTaWdhY3RfaWduLCAmc2lnYWN0KTsKKwkJcC0+ZmxhZ3MgfD0gc2lnYWN0LnNhX2hhbmRsZXIgPT0gU0lHX0lHTiA/CisJCSAgICBURl9PUklHX0lHTiA6IFRGX09SSUdfREZMOworCQlwLT5jdXJzaWcgPSBTSUdfSUdOOworCX0KKworCS8qLQorCSAqIEdlbmVyYWxseSwgYW4gaWdub3JlZCBzaWduYWwgc3RheXMgaWdub3JlZCwgZXhjZXB0IGlmCisJICoJLSB0aGUgdXNlciBvZiBhbiBpbnRlcmFjdGl2ZSBzaGVsbCB3YW50cyB0byBjaGFuZ2UgaXQKKwkgKgktIHRoZSBzaGVsbCB3YW50cyBmb3IgZm9yY2UgYSBjaGFuZ2UKKwkgKi8KKwlpZiAoKHAtPmZsYWdzICYgVEZfT1JJR19JR04pICYmICEoZmxhZ3MgJiBTU19GT1JDRSkgJiYKKwkgICAgKCEoZmxhZ3MgJiBTU19VU0VSKSB8fCAhRmxhZyhGVEFMS0lORykpKQorCQlyZXR1cm4gKDApOworCisJc2V0ZXhlY3NpZyhwLCBmbGFncyAmIFNTX1JFU1RPUkVfTUFTSyk7CisKKwkvKgorCSAqIFRoaXMgaXMgaGVyZSAnY2F1c2UgdGhlcmUgc2hvdWxkIGJlIGEgd2F5IG9mIGNsZWFyaW5nCisJICogc2h0cmFwcywgYnV0IGRvbid0IGtub3cgaWYgdGhpcyBpcyBhIHNhbmUgd2F5IG9mIGRvaW5nCisJICogaXQuIEF0IHRoZSBtb21lbnQsIGFsbCB1c2VycyBvZiBzaHRyYXAgYXJlIGxpZmV0aW1lCisJICogdXNlcnMgKFNJR0FMUk0sIFNJR0NITEQsIFNJR1dJTkNIKS4KKwkgKi8KKwlpZiAoIShmbGFncyAmIFNTX1VTRVIpKQorCQlwLT5zaHRyYXAgPSAoc2lnX3QpTlVMTDsKKwlpZiAoZmxhZ3MgJiBTU19TSFRSQVApIHsKKwkJcC0+c2h0cmFwID0gZjsKKwkJZiA9IHRyYXBzaWc7CisJfQorCisJaWYgKHAtPmN1cnNpZyAhPSBmKSB7CisJCXAtPmN1cnNpZyA9IGY7CisJCSh2b2lkKXNpZ2VtcHR5c2V0KCZzaWdhY3Quc2FfbWFzayk7CisJCXNpZ2FjdC5zYV9mbGFncyA9IDAgLyogaW50ZXJydXB0aWJsZSAqLzsKKwkJc2lnYWN0LnNhX2hhbmRsZXIgPSBmOworCQlzaWdhY3Rpb24ocC0+c2lnbmFsLCAmc2lnYWN0LCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisvKiBjb250cm9sIHdoYXQgc2lnbmFsIGlzIHNldCB0byBiZWZvcmUgYW4gZXhlYygpICovCit2b2lkCitzZXRleGVjc2lnKFRyYXAgKnAsIGludCByZXN0b3JlKQoreworCS8qIFhYWCBkZWJ1Z2dpbmcgKi8KKwlpZiAoIShwLT5mbGFncyAmIChURl9PUklHX0lHTnxURl9PUklHX0RGTCkpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNldGV4ZWNzaWc6IHVuc2V0IHNpZ25hbCAlZCglcykiLAorCQkgICAgcC0+c2lnbmFsLCBwLT5uYW1lKTsKKworCS8qIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgZm9yIGV4ZWMnZCBraWRzICovCisJcC0+ZmxhZ3MgJj0gfihURl9FWEVDX0lHTnxURl9FWEVDX0RGTCk7CisJc3dpdGNoIChyZXN0b3JlICYgU1NfUkVTVE9SRV9NQVNLKSB7CisJY2FzZSBTU19SRVNUT1JFX0NVUlI6IC8qIGxlYXZlIHRoaW5ncyBhcyB0aGV5IGN1cnJlbnRseSBhcmUgKi8KKwkJYnJlYWs7CisJY2FzZSBTU19SRVNUT1JFX09SSUc6CisJCXAtPmZsYWdzIHw9IHAtPmZsYWdzICYgVEZfT1JJR19JR04gPyBURl9FWEVDX0lHTiA6IFRGX0VYRUNfREZMOworCQlicmVhazsKKwljYXNlIFNTX1JFU1RPUkVfREZMOgorCQlwLT5mbGFncyB8PSBURl9FWEVDX0RGTDsKKwkJYnJlYWs7CisJY2FzZSBTU19SRVNUT1JFX0lHTjoKKwkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19JR047CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2pvYnMuYyBiL21rc2gvc3JjL2pvYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzMyNmExCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvam9icy5jCkBAIC0wLDAgKzEsMTY0OCBAQAorLyoJJE9wZW5CU0Q6IGpvYnMuYyx2IDEuMzggMjAwOS8xMi8xMiAwNDoyODo0NCBkZXJhYWR0IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5CisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvam9icy5jLHYgMS42OSAyMDEwLzA3LzA0IDE3OjMzOjU0IHRnIEV4cCAkIik7CisKKyNpZiBIQVZFX0tJTExQRworI2RlZmluZSBta3NoX2tpbGxwZwkJa2lsbHBnCisjZWxzZQorLyogY3Jvc3MgZmluZ2VycyBhbmQgaG9wZSBraWxsIGlzIGtpbGxwZy1lbmRvd2VkICovCisjZGVmaW5lIG1rc2hfa2lsbHBnKHAscykJa2lsbCgtKHApLCAocykpCisjZW5kaWYKKworLyogT3JkZXIgaW1wb3J0YW50ISAqLworI2RlZmluZSBQUlVOTklORwkwCisjZGVmaW5lIFBFWElURUQJCTEKKyNkZWZpbmUgUFNJR05BTExFRAkyCisjZGVmaW5lIFBTVE9QUEVECTMKKwordHlwZWRlZiBzdHJ1Y3QgcHJvYwlQcm9jOworc3RydWN0IHByb2MgeworCVByb2MgKm5leHQ7CQkvKiBuZXh0IHByb2Nlc3MgaW4gcGlwZWxpbmUgKGlmIGFueSkgKi8KKwlwaWRfdCBwaWQ7CQkvKiBwcm9jZXNzIGlkICovCisJaW50IHN0YXRlOworCWludCBzdGF0dXM7CQkvKiB3YWl0IHN0YXR1cyAqLworCWNoYXIgY29tbWFuZFs0OF07CS8qIHByb2Nlc3MgY29tbWFuZCBzdHJpbmcgKi8KK307CisKKy8qIE5vdGlmeS9wcmludCBmbGFnIC0gal9wcmludCgpIGFyZ3VtZW50ICovCisjZGVmaW5lIEpQX05PTkUJCTAJLyogZG9uJ3QgcHJpbnQgYW55dGhpbmcgKi8KKyNkZWZpbmUgSlBfU0hPUlQJMQkvKiBwcmludCBzaWduYWxzIHByb2Nlc3NlcyB3ZXJlIGtpbGxlZCBieSAqLworI2RlZmluZSBKUF9NRURJVU0JMgkvKiBwcmludCBbam9iLW51bV0gLS8rIGNvbW1hbmQgKi8KKyNkZWZpbmUgSlBfTE9ORwkJMwkvKiBwcmludCBbam9iLW51bV0gLS8rIHBpZCBjb21tYW5kICovCisjZGVmaW5lIEpQX1BHUlAJCTQJLyogcHJpbnQgcGdycCAqLworCisvKiBwdXRfam9iKCkgZmxhZ3MgKi8KKyNkZWZpbmUgUEpfT05fRlJPTlQJMAkvKiBhdCB2ZXJ5IGZyb250ICovCisjZGVmaW5lIFBKX1BBU1RfU1RPUFBFRAkxCS8qIGp1c3QgcGFzdCBhbnkgc3RvcHBlZCBqb2JzICovCisKKy8qIEpvYi5mbGFncyB2YWx1ZXMgKi8KKyNkZWZpbmUgSkZfU1RBUlRFRAkweDAwMQkvKiBzZXQgd2hlbiBhbGwgcHJvY2Vzc2VzIGluIGpvYiBhcmUgc3RhcnRlZCAqLworI2RlZmluZSBKRl9XQUlUSU5HCTB4MDAyCS8qIHNldCBpZiBqX3dhaXRqKCkgaXMgd2FpdGluZyBvbiBqb2IgKi8KKyNkZWZpbmUgSkZfV19BU1lOQ05PVElGWSAweDAwNAkvKiBzZXQgaWYgd2FpdGluZyBhbmQgYXN5bmMgbm90aWZpY2F0aW9uIG9rICovCisjZGVmaW5lIEpGX1hYQ09NCTB4MDA4CS8qIHNldCBmb3IgJChjb21tYW5kKSBqb2JzICovCisjZGVmaW5lIEpGX0ZHCQkweDAxMAkvKiBydW5uaW5nIGluIGZvcmVncm91bmQgKGFsc28gaGFzIHR0eSBwZ3JwKSAqLworI2RlZmluZSBKRl9TQVZFRFRUWQkweDAyMAkvKiBqLT50dHlzdGF0ZSBpcyB2YWxpZCAqLworI2RlZmluZSBKRl9DSEFOR0VECTB4MDQwCS8qIHByb2Nlc3MgaGFzIGNoYW5nZWQgc3RhdGUgKi8KKyNkZWZpbmUgSkZfS05PV04JMHgwODAJLyogJCEgcmVmZXJlbmNlZCAqLworI2RlZmluZSBKRl9aT01CSUUJMHgxMDAJLyoga25vd24sIHVud2FpdGVkIHByb2Nlc3MgKi8KKyNkZWZpbmUgSkZfUkVNT1ZFCTB4MjAwCS8qIGZsYWdnZWQgZm9yIHJlbW92YWwgKGpfam9icygpL2pfbm9pdHlmKCkpICovCisjZGVmaW5lIEpGX1VTRVRUWU1PREUJMHg0MDAJLyogdHR5IG1vZGUgc2F2ZWQgaWYgcHJvY2VzcyBleGl0cyBub3JtYWxseSAqLworI2RlZmluZSBKRl9TQVZFRFRUWVBHUlAJMHg4MDAJLyogai0+c2F2ZWRfdHR5cGdycCBpcyB2YWxpZCAqLworCit0eXBlZGVmIHN0cnVjdCBqb2IgSm9iOworc3RydWN0IGpvYiB7CisJSm9iICpuZXh0OwkJLyogbmV4dCBqb2IgaW4gbGlzdCAqLworCVByb2MgKnByb2NfbGlzdDsJLyogcHJvY2VzcyBsaXN0ICovCisJUHJvYyAqbGFzdF9wcm9jOwkvKiBsYXN0IHByb2Nlc3MgaW4gbGlzdCAqLworCXN0cnVjdCB0aW1ldmFsIHN5c3RpbWU7CS8qIHN5c3RlbSB0aW1lIHVzZWQgYnkgam9iICovCisJc3RydWN0IHRpbWV2YWwgdXNydGltZTsJLyogdXNlciB0aW1lIHVzZWQgYnkgam9iICovCisJcGlkX3QgcGdycDsJCS8qIHByb2Nlc3MgZ3JvdXAgb2Ygam9iICovCisJcGlkX3QgcHBpZDsJCS8qIHBpZCBvZiBwcm9jZXNzIHRoYXQgZm9ya2VkIGpvYiAqLworCWludCBqb2I7CQkvKiBqb2IgbnVtYmVyOiAlbiAqLworCWludCBmbGFnczsJCS8qIHNlZSBKRl8qICovCisJdm9sYXRpbGUgaW50IHN0YXRlOwkvKiBqb2Igc3RhdGUgKi8KKwlpbnQgc3RhdHVzOwkJLyogZXhpdCBzdGF0dXMgb2YgbGFzdCBwcm9jZXNzICovCisJaW50MzJfdAlhZ2U7CQkvKiBudW1iZXIgb2Ygam9icyBzdGFydGVkICovCisJQ29wcm9jX2lkIGNvcHJvY19pZDsJLyogMCBvciBpZCBvZiBjb3Byb2Nlc3Mgb3V0cHV0IHBpcGUgKi8KKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJc3RydWN0IHRlcm1pb3MgdHR5c3RhdGU7Lyogc2F2ZWQgdHR5IHN0YXRlIGZvciBzdG9wcGVkIGpvYnMgKi8KKwlwaWRfdCBzYXZlZF90dHlwZ3JwOwkvKiBzYXZlZCB0dHkgcHJvY2VzcyBncm91cCBmb3Igc3RvcHBlZCBqb2JzICovCisjZW5kaWYKK307CisKKy8qIEZsYWdzIGZvciBqX3dhaXRqKCkgKi8KKyNkZWZpbmUgSldfTk9ORQkJMHgwMAorI2RlZmluZSBKV19JTlRFUlJVUFQJMHgwMQkvKiBeQyB3aWxsIHN0b3AgdGhlIHdhaXQgKi8KKyNkZWZpbmUgSldfQVNZTkNOT1RJRlkJMHgwMgkvKiBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIGR1cmluZyB3YWl0IG9rICovCisjZGVmaW5lIEpXX1NUT1BQRURXQUlUCTB4MDQJLyogd2FpdCBldmVuIGlmIGpvYiBzdG9wcGVkICovCisKKy8qIEVycm9yIGNvZGVzIGZvciBqX2xvb2t1cCgpICovCisjZGVmaW5lIEpMX09LCQkwCisjZGVmaW5lIEpMX05PU1VDSAkxCS8qIG5vIHN1Y2ggam9iICovCisjZGVmaW5lIEpMX0FNQklHCTIJLyogJWZvbyBvciAlP2ZvbyBpcyBhbWJpZ3VvdXMgKi8KKyNkZWZpbmUgSkxfSU5WQUxJRAkzCS8qIG5vbi1waWQsIG5vbi0lIGpvYiBpZCAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbG9va3VwX21zZ3NbXSA9IHsKKwludWxsLAorCSJubyBzdWNoIGpvYiIsCisJImFtYmlndW91cyIsCisJImFyZ3VtZW50IG11c3QgYmUgJWpvYiBvciBwcm9jZXNzIGlkIiwKKwlOVUxMCit9OworCitzdGF0aWMgSm9iICpqb2JfbGlzdDsJCS8qIGpvYiBsaXN0ICovCitzdGF0aWMgSm9iICpsYXN0X2pvYjsKK3N0YXRpYyBKb2IgKmFzeW5jX2pvYjsKK3N0YXRpYyBwaWRfdCBhc3luY19waWQ7CisKK3N0YXRpYyBpbnQgbnpvbWJpZTsJCS8qICMgb2Ygem9tYmllcyBvd25lZCBieSB0aGlzIHByb2Nlc3MgKi8KK3N0YXRpYyBpbnQzMl90IG5qb2JzOwkJLyogIyBvZiBqb2JzIHN0YXJ0ZWQgKi8KKworI2lmbmRlZiBDSElMRF9NQVgKKyNkZWZpbmUgQ0hJTERfTUFYCTI1CisjZW5kaWYKKworLyogaGVsZF9zaWdjaGxkIGlzIHNldCBpZiBzaWdjaGxkIG9jY3VycyBiZWZvcmUgYSBqb2IgaXMgY29tcGxldGVseSBzdGFydGVkICovCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IGhlbGRfc2lnY2hsZDsKKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKK3N0YXRpYyBzdHJ1Y3Qgc2hmCSpzaGxfajsKK3N0YXRpYyBib29sCQl0dHlwZ3JwX29rOwkvKiBzZXQgaWYgY2FuIHVzZSB0dHkgcGdycHMgKi8KK3N0YXRpYyBwaWRfdAkJcmVzdG9yZV90dHlwZ3JwID0gLTE7CitzdGF0aWMgaW50IGNvbnN0CXR0X3NpZ3NbXSA9IHsgU0lHVFNUUCwgU0lHVFRJTiwgU0lHVFRPVSB9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkCQlqX3NldF9hc3luYyhKb2IgKik7CitzdGF0aWMgdm9pZAkJal9zdGFydGpvYihKb2IgKik7CitzdGF0aWMgaW50CQlqX3dhaXRqKEpvYiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZAkJal9zaWdjaGxkKGludCk7CitzdGF0aWMgdm9pZAkJal9wcmludChKb2IgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOworc3RhdGljIEpvYgkJKmpfbG9va3VwKGNvbnN0IGNoYXIgKiwgaW50ICopOworc3RhdGljIEpvYgkJKm5ld19qb2Iodm9pZCk7CitzdGF0aWMgUHJvYwkJKm5ld19wcm9jKHZvaWQpOworc3RhdGljIHZvaWQJCWNoZWNrX2pvYihKb2IgKik7CitzdGF0aWMgdm9pZAkJcHV0X2pvYihKb2IgKiwgaW50KTsKK3N0YXRpYyB2b2lkCQlyZW1vdmVfam9iKEpvYiAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGludAkJa2lsbF9qb2IoSm9iICosIGludCk7CisKKy8qIGluaXRpYWxpc2Ugam9iIGNvbnRyb2wgKi8KK3ZvaWQKK2pfaW5pdCh2b2lkKQoreworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlib29sIG1mbGFnc2V0ID0gRmxhZyhGTU9OSVRPUikgIT0gMTI3OworCisJRmxhZyhGTU9OSVRPUikgPSAwOworI2VuZGlmCisKKwkodm9pZClzaWdlbXB0eXNldCgmc21fZGVmYXVsdCk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzbV9kZWZhdWx0LCBOVUxMKTsKKworCSh2b2lkKXNpZ2VtcHR5c2V0KCZzbV9zaWdjaGxkKTsKKwkodm9pZClzaWdhZGRzZXQoJnNtX3NpZ2NobGQsIFNJR0NITEQpOworCisJc2V0c2lnKCZzaWd0cmFwc1tTSUdDSExEXSwgal9zaWdjaGxkLAorCSAgICBTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0V8U1NfU0hUUkFQKTsKKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlpZiAoIW1mbGFnc2V0ICYmIEZsYWcoRlRBTEtJTkcpKQorCQlGbGFnKEZNT05JVE9SKSA9IDE7CisKKwkvKgorCSAqIHNobF9qIGlzIHVzZWQgdG8gZG8gYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiAodXNlZCBpbgorCSAqIGFuIGludGVycnVwdCBoYW5kbGVyLCBzbyBuZWVkIGEgZGlzdGluY3Qgc2hmKQorCSAqLworCXNobF9qID0gc2hmX2Zkb3BlbigyLCBTSEZfV1IsIE5VTEwpOworCisJaWYgKEZsYWcoRk1PTklUT1IpIHx8IEZsYWcoRlRBTEtJTkcpKSB7CisJCWludCBpOworCisJCS8qCisJCSAqIHRoZSBURl9TSEVMTF9VU0VTIHRlc3QgaXMgYSBrbHVkZ2UgdGhhdCBsZXRzIHVzIGtub3cgaWYKKwkJICogaWYgdGhlIHNpZ25hbHMgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdGhlIHNoZWxsLgorCQkgKi8KKwkJZm9yIChpID0gTkVMRU0odHRfc2lncyk7IC0taSA+PSAwOyApIHsKKwkJCXNpZ3RyYXBzW3R0X3NpZ3NbaV1dLmZsYWdzIHw9IFRGX1NIRUxMX1VTRVM7CisJCQkvKiBqX2NoYW5nZSgpIHNldHMgdGhpcyB0byBTU19SRVNUT1JFX0RGTCBpZiBGTU9OSVRPUiAqLworCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ldXSwgU0lHX0lHTiwKKwkJCSAgICBTU19SRVNUT1JFX0lHTnxTU19GT1JDRSk7CisJCX0KKwl9CisKKwkvKiBqX2NoYW5nZSgpIGNhbGxzIHR0eV9pbml0KCkgKi8KKwlpZiAoRmxhZyhGTU9OSVRPUikpCisJCWpfY2hhbmdlKCk7CisJZWxzZQorI2VuZGlmCisJICBpZiAoRmxhZyhGVEFMS0lORykpCisJCXR0eV9pbml0KHRydWUsIHRydWUpOworfQorCisvKiBqb2IgY2xlYW51cCBiZWZvcmUgc2hlbGwgZXhpdCAqLwordm9pZAoral9leGl0KHZvaWQpCit7CisJLyoga2lsbCBzdG9wcGVkLCBhbmQgcG9zc2libHkgcnVubmluZywgam9icyAqLworCUpvYgkqajsKKwlpbnQJa2lsbGVkID0gMDsKKworCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KSB7CisJCWlmIChqLT5wcGlkID09IHByb2NwaWQgJiYKKwkJICAgIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCB8fAorCQkgICAgKGotPnN0YXRlID09IFBSVU5OSU5HICYmCisJCSAgICAoKGotPmZsYWdzICYgSkZfRkcpIHx8CisJCSAgICAoRmxhZyhGTE9HSU4pICYmICFGbGFnKEZOT0hVUCkgJiYgcHJvY3BpZCA9PSBrc2hwaWQpKSkpKSB7CisJCQlraWxsZWQgPSAxOworCQkJaWYgKGotPnBncnAgPT0gMCkKKwkJCQlraWxsX2pvYihqLCBTSUdIVVApOworCQkJZWxzZQorCQkJCW1rc2hfa2lsbHBnKGotPnBncnAsIFNJR0hVUCk7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEKSB7CisJCQkJaWYgKGotPnBncnAgPT0gMCkKKwkJCQkJa2lsbF9qb2IoaiwgU0lHQ09OVCk7CisJCQkJZWxzZQorCQkJCQlta3NoX2tpbGxwZyhqLT5wZ3JwLCBTSUdDT05UKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCWlmIChraWxsZWQpCisJCXNsZWVwKDEpOworCWpfbm90aWZ5KCk7CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJaWYgKGtzaHBpZCA9PSBwcm9jcGlkICYmIHJlc3RvcmVfdHR5cGdycCA+PSAwKSB7CisJCS8qCisJCSAqIE5lZWQgdG8gcmVzdG9yZSB0aGUgdHR5IHBncnAgdG8gd2hhdCBpdCB3YXMgd2hlbiB0aGUKKwkJICogc2hlbGwgc3RhcnRlZCB1cCwgc28gdGhhdCB0aGUgcHJvY2VzcyB0aGF0IHN0YXJ0ZWQgdXMKKwkJICogd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgdHR5IHdoZW4gd2UgYXJlIGRvbmUuCisJCSAqIEFsc28gbmVlZCB0byByZXN0b3JlIG91ciBwcm9jZXNzIGdyb3VwIGluIGNhc2Ugd2UgYXJlCisJCSAqIGFib3V0IHRvIGRvIGFuIGV4ZWMgc28gdGhhdCBib3RoIG91ciBwYXJlbnQgYW5kIHRoZQorCQkgKiBwcm9jZXNzIHdlIGFyZSB0byBiZWNvbWUgd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgdHR5LgorCQkgKi8KKwkJdGNzZXRwZ3JwKHR0eV9mZCwgcmVzdG9yZV90dHlwZ3JwKTsKKwkJc2V0cGdpZCgwLCByZXN0b3JlX3R0eXBncnApOworCX0KKwlpZiAoRmxhZyhGTU9OSVRPUikpIHsKKwkJRmxhZyhGTU9OSVRPUikgPSAwOworCQlqX2NoYW5nZSgpOworCX0KKyNlbmRpZgorfQorCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorLyogdHVybiBqb2IgY29udHJvbCBvbiBvciBvZmYgYWNjb3JkaW5nIHRvIEZsYWcoRk1PTklUT1IpICovCit2b2lkCitqX2NoYW5nZSh2b2lkKQoreworCWludCBpOworCisJaWYgKEZsYWcoRk1PTklUT1IpKSB7CisJCWJvb2wgdXNlX3R0eSA9IEZsYWcoRlRBTEtJTkcpOworCisJCS8qIERvbid0IGNhbGwgdGNnZXRhdHRyKCkgJ3RpbCB3ZSBvd24gdGhlIHR0eSBwcm9jZXNzIGdyb3VwICovCisJCWlmICh1c2VfdHR5KQorCQkJdHR5X2luaXQoZmFsc2UsIHRydWUpOworCisJCS8qIG5vIGNvbnRyb2xsaW5nIHR0eSwgbm8gU0lHVCogKi8KKwkJaWYgKCh0dHlwZ3JwX29rID0gdXNlX3R0eSAmJiB0dHlfZmQgPj0gMCAmJiB0dHlfZGV2dHR5KSkgeworCQkJc2V0c2lnKCZzaWd0cmFwc1tTSUdUVElOXSwgU0lHX0RGTCwKKwkJCSAgICBTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0UpOworCQkJLyogd2FpdCB0byBiZSBnaXZlbiB0dHkgKFBPU0lYLjEsIEIuMiwgam9iIGNvbnRyb2wpICovCisJCQl3aGlsZSAoMSkgeworCQkJCXBpZF90IHR0eXBncnA7CisKKwkJCQlpZiAoKHR0eXBncnAgPSB0Y2dldHBncnAodHR5X2ZkKSkgPCAwKSB7CisJCQkJCXdhcm5pbmdmKGZhbHNlLAorCQkJCQkgICAgImpfaW5pdDogdGNnZXRwZ3JwKCkgZmFpbGVkOiAlcyIsCisJCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJCQl0dHlwZ3JwX29rID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodHR5cGdycCA9PSBrc2hwZ3JwKQorCQkJCQlicmVhazsKKwkJCQlraWxsKDAsIFNJR1RUSU4pOworCQkJfQorCQl9CisJCWZvciAoaSA9IE5FTEVNKHR0X3NpZ3MpOyAtLWkgPj0gMDsgKQorCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ldXSwgU0lHX0lHTiwKKwkJCSAgICBTU19SRVNUT1JFX0RGTHxTU19GT1JDRSk7CisJCWlmICh0dHlwZ3JwX29rICYmIGtzaHBncnAgIT0ga3NocGlkKSB7CisJCQlpZiAoc2V0cGdpZCgwLCBrc2hwaWQpIDwgMCkgeworCQkJCXdhcm5pbmdmKGZhbHNlLAorCQkJCSAgICAial9pbml0OiBzZXRwZ2lkKCkgZmFpbGVkOiAlcyIsCisJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJdHR5cGdycF9vayA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGNzZXRwZ3JwKHR0eV9mZCwga3NocGlkKSA8IDApIHsKKwkJCQkJd2FybmluZ2YoZmFsc2UsCisJCQkJCSAgICAial9pbml0OiB0Y3NldHBncnAoKSBmYWlsZWQ6ICVzIiwKKwkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXR0eXBncnBfb2sgPSBmYWxzZTsKKwkJCQl9IGVsc2UKKwkJCQkJcmVzdG9yZV90dHlwZ3JwID0ga3NocGdycDsKKwkJCQlrc2hwZ3JwID0ga3NocGlkOworCQkJfQorCQl9CisJCWlmICh1c2VfdHR5ICYmICF0dHlwZ3JwX29rKQorCQkJd2FybmluZ2YoZmFsc2UsICJ3YXJuaW5nOiB3b24ndCBoYXZlIGZ1bGwgam9iIGNvbnRyb2wiKTsKKwkJaWYgKHR0eV9mZCA+PSAwKQorCQkJdGNnZXRhdHRyKHR0eV9mZCwgJnR0eV9zdGF0ZSk7CisJfSBlbHNlIHsKKwkJdHR5cGdycF9vayA9IGZhbHNlOworCQlpZiAoRmxhZyhGVEFMS0lORykpCisJCQlmb3IgKGkgPSBORUxFTSh0dF9zaWdzKTsgLS1pID49IDA7ICkKKwkJCQlzZXRzaWcoJnNpZ3RyYXBzW3R0X3NpZ3NbaV1dLCBTSUdfSUdOLAorCQkJCSAgICBTU19SRVNUT1JFX0lHTnxTU19GT1JDRSk7CisJCWVsc2UKKwkJCWZvciAoaSA9IE5FTEVNKHR0X3NpZ3MpOyAtLWkgPj0gMDsgKSB7CisJCQkJaWYgKHNpZ3RyYXBzW3R0X3NpZ3NbaV1dLmZsYWdzICYKKwkJCQkgICAgKFRGX09SSUdfSUdOIHwgVEZfT1JJR19ERkwpKQorCQkJCQlzZXRzaWcoJnNpZ3RyYXBzW3R0X3NpZ3NbaV1dLAorCQkJCQkgICAgKHNpZ3RyYXBzW3R0X3NpZ3NbaV1dLmZsYWdzICYgVEZfT1JJR19JR04pID8KKwkJCQkJICAgIFNJR19JR04gOiBTSUdfREZMLAorCQkJCQkgICAgU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFKTsKKwkJCX0KKwkJaWYgKCFGbGFnKEZUQUxLSU5HKSkKKwkJCXR0eV9jbG9zZSgpOworCX0KK30KKyNlbmRpZgorCisvKiBleGVjdXRlIHRyZWUgaW4gY2hpbGQgc3VicHJvY2VzcyAqLworaW50CitleGNoaWxkKHN0cnVjdCBvcCAqdCwgaW50IGZsYWdzLAorICAgIHZvbGF0aWxlIGludCAqeGVycm9rLAorICAgIC8qIHVzZWQgaWYgWFBDTE9TRSBvciBYQ0NMT1NFICovIGludCBjbG9zZV9mZCkKK3sKKwlzdGF0aWMgUHJvYyAqbGFzdF9wcm9jOwkJLyogZm9yIHBpcGVsaW5lcyAqLworCisJaW50IHJ2ID0gMCwgZm9ya3NsZWVwOworCXNpZ3NldF90IG9tYXNrOworCXN0cnVjdCB7CisJCVByb2MgKnA7CisJCUpvYiAqajsKKwkJcGlkX3QgY2xkcGlkOworCX0gcGk7CisKKwlpZiAoZmxhZ3MgJiBYRVhFQykKKwkJLyoKKwkJICogQ2xlYXIgWEZPUkt8WFBDTE9TRXxYQ0NMT1NFfFhDT1BST0N8WFBJUEVPfFhQSVBFSXxYWENPTXxYQkdORAorCQkgKiAoYWxzbyBkb25lIGluIGFub3RoZXIgZXhlY3V0ZSgpIGJlbG93KQorCQkgKi8KKwkJcmV0dXJuIChleGVjdXRlKHQsIGZsYWdzICYgKFhFWEVDIHwgWEVSUk9LKSwgeGVycm9rKSk7CisKKwkvKiBubyBTSUdDSExEcyB3aGlsZSBtZXNzaW5nIHdpdGggam9iIGFuZCBwcm9jZXNzIGxpc3RzICovCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCXBpLnAgPSBuZXdfcHJvYygpOworCXBpLnAtPm5leHQgPSBOVUxMOworCXBpLnAtPnN0YXRlID0gUFJVTk5JTkc7CisJcGkucC0+c3RhdHVzID0gMDsKKwlwaS5wLT5waWQgPSAwOworCisJLyogbGluayBwcm9jZXNzIGludG8gam9icyBsaXN0ICovCisJaWYgKGZsYWdzICYgWFBJUEVJKSB7CisJCS8qIGNvbnRpbnVpbmcgd2l0aCBhIHBpcGUgKi8KKwkJaWYgKCFsYXN0X2pvYikKKwkJCWludGVybmFsX2Vycm9yZigKKwkJCSAgICAiZXhjaGlsZDogWFBJUEVJIGFuZCBubyBsYXN0X2pvYiAtIHBpZCAlZCIsCisJCQkgICAgKGludClwcm9jcGlkKTsKKwkJcGkuaiA9IGxhc3Rfam9iOworCQlpZiAobGFzdF9wcm9jKQorCQkJbGFzdF9wcm9jLT5uZXh0ID0gcGkucDsKKwkJbGFzdF9wcm9jID0gcGkucDsKKwl9IGVsc2UgeworCQlwaS5qID0gbmV3X2pvYigpOyAvKiBmaWxscyBpbiBwaS5qLT5qb2IgKi8KKwkJLyoKKwkJICogd2UgZG9uJ3QgY29uc2lkZXIgWFhDT01zIGZvcmVncm91bmQgc2luY2UgdGhleSBkb24ndCBnZXQKKwkJICogdHR5IHByb2Nlc3MgZ3JvdXAgYW5kIHdlIGRvbid0IHNhdmUgb3IgcmVzdG9yZSB0dHkgbW9kZXMuCisJCSAqLworCQlwaS5qLT5mbGFncyA9IChmbGFncyAmIFhYQ09NKSA/IEpGX1hYQ09NIDoKKwkJICAgICgoZmxhZ3MgJiBYQkdORCkgPyAwIDogKEpGX0ZHfEpGX1VTRVRUWU1PREUpKTsKKwkJdGltZXJjbGVhcigmcGkuai0+dXNydGltZSk7CisJCXRpbWVyY2xlYXIoJnBpLmotPnN5c3RpbWUpOworCQlwaS5qLT5zdGF0ZSA9IFBSVU5OSU5HOworCQlwaS5qLT5wZ3JwID0gMDsKKwkJcGkuai0+cHBpZCA9IHByb2NwaWQ7CisJCXBpLmotPmFnZSA9ICsrbmpvYnM7CisJCXBpLmotPnByb2NfbGlzdCA9IHBpLnA7CisJCXBpLmotPmNvcHJvY19pZCA9IDA7CisJCWxhc3Rfam9iID0gcGkuajsKKwkJbGFzdF9wcm9jID0gcGkucDsKKwkJcHV0X2pvYihwaS5qLCBQSl9QQVNUX1NUT1BQRUQpOworCX0KKworCXNucHRyZWVmKHBpLnAtPmNvbW1hbmQsIHNpemVvZihwaS5wLT5jb21tYW5kKSwgIiVUIiwgdCk7CisKKwkvKiBjcmVhdGUgY2hpbGQgcHJvY2VzcyAqLworCWZvcmtzbGVlcCA9IDE7CisJd2hpbGUgKChwaS5jbGRwaWQgPSBmb3JrKCkpIDwgMCAmJiBlcnJubyA9PSBFQUdBSU4gJiYgZm9ya3NsZWVwIDwgMzIpIHsKKwkJaWYgKGludHJzaWcpCSAvKiBhbGxvdyB1c2VyIHRvIF5DIG91dC4uLiAqLworCQkJYnJlYWs7CisJCXNsZWVwKGZvcmtzbGVlcCk7CisJCWZvcmtzbGVlcCA8PD0gMTsKKwl9CisJaWYgKHBpLmNsZHBpZCA8IDApIHsKKwkJa2lsbF9qb2IocGkuaiwgU0lHS0lMTCk7CisJCXJlbW92ZV9qb2IocGkuaiwgImZvcmsgZmFpbGVkIik7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQllcnJvcmYoImNhbm5vdCBmb3JrIC0gdHJ5IGFnYWluIik7CisJfQorCXBpLnAtPnBpZCA9IHBpLmNsZHBpZCA/IHBpLmNsZHBpZCA6IChwcm9jcGlkID0gZ2V0cGlkKCkpOworCisJLyoKKwkgKiBlbnN1cmUgbmV4dCBjaGlsZCBnZXRzIGEgKHNsaWdodGx5KSBkaWZmZXJlbnQgJFJBTkRPTSBzZXF1ZW5jZQorCSAqIGZyb20gaXRzIHBhcmVudCBwcm9jZXNzIGFuZCBvdGhlciBjaGlsZCBwcm9jZXNzZXMKKwkgKi8KKwljaGFuZ2VfcmFuZG9tKCZwaSwgc2l6ZW9mKHBpKSk7CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJLyogam9iIGNvbnRyb2wgc2V0IHVwICovCisJaWYgKEZsYWcoRk1PTklUT1IpICYmICEoZmxhZ3MmWFhDT00pKSB7CisJCWludAlkb3R0eSA9IDA7CisJCWlmIChwaS5qLT5wZ3JwID09IDApIHsJLyogRmlyc3QgcHJvY2VzcyAqLworCQkJcGkuai0+cGdycCA9IHBpLnAtPnBpZDsKKwkJCWRvdHR5ID0gMTsKKwkJfQorCisJCS8qIHNldCBwZ3JwIGluIGJvdGggcGFyZW50IGFuZCBjaGlsZCB0byBkZWFsIHdpdGggcmFjZQorCQkgKiBjb25kaXRpb24KKwkJICovCisJCXNldHBnaWQocGkucC0+cGlkLCBwaS5qLT5wZ3JwKTsKKwkJaWYgKHR0eXBncnBfb2sgJiYgZG90dHkgJiYgIShmbGFncyAmIFhCR05EKSkKKwkJCXRjc2V0cGdycCh0dHlfZmQsIHBpLmotPnBncnApOworCX0KKyNlbmRpZgorCisJLyogdXNlZCB0byBjbG9zZSBwaXBlIGlucHV0IGZkICovCisJaWYgKGNsb3NlX2ZkID49IDAgJiYgKCgoZmxhZ3MgJiBYUENMT1NFKSAmJiBwaS5jbGRwaWQpIHx8CisJICAgICgoZmxhZ3MgJiBYQ0NMT1NFKSAmJiAhcGkuY2xkcGlkKSkpCisJCWNsb3NlKGNsb3NlX2ZkKTsKKwlpZiAoIXBpLmNsZHBpZCkgeworCQkvKiBjaGlsZCAqLworCisJCS8qIERvIHRoaXMgYmVmb3JlIHJlc3RvcmluZyBzaWduYWwgKi8KKwkJaWYgKGZsYWdzICYgWENPUFJPQykKKwkJCWNvcHJvY19jbGVhbnVwKGZhbHNlKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWNsZWFudXBfcGFyZW50c19lbnYoKTsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCS8qIElmIEZNT05JVE9SIG9yIEZUQUxLSU5HIGlzIHNldCwgdGhlc2Ugc2lnbmFscyBhcmUgaWdub3JlZCwKKwkJICogaWYgbmVpdGhlciBGTU9OSVRPUiBub3IgRlRBTEtJTkcgYXJlIHNldCwgdGhlIHNpZ25hbHMgaGF2ZQorCQkgKiB0aGVpciBpbmhlcml0ZWQgdmFsdWVzLgorCQkgKi8KKwkJaWYgKEZsYWcoRk1PTklUT1IpICYmICEoZmxhZ3MgJiBYWENPTSkpIHsKKwkJCWZvciAoZm9ya3NsZWVwID0gTkVMRU0odHRfc2lncyk7IC0tZm9ya3NsZWVwID49IDA7ICkKKwkJCQlzZXRzaWcoJnNpZ3RyYXBzW3R0X3NpZ3NbZm9ya3NsZWVwXV0sIFNJR19ERkwsCisJCQkJICAgIFNTX1JFU1RPUkVfREZMfFNTX0ZPUkNFKTsKKwkJfQorI2VuZGlmCisjaWYgSEFWRV9OSUNFCisJCWlmIChGbGFnKEZCR05JQ0UpICYmIChmbGFncyAmIFhCR05EKSkKKwkJCSh2b2lkKW5pY2UoNCk7CisjZW5kaWYKKwkJaWYgKChmbGFncyAmIFhCR05EKQorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJICAgICYmICFGbGFnKEZNT05JVE9SKQorI2VuZGlmCisJCSAgICApIHsKKwkJCXNldHNpZygmc2lndHJhcHNbU0lHSU5UXSwgU0lHX0lHTiwKKwkJCSAgICBTU19SRVNUT1JFX0lHTnxTU19GT1JDRSk7CisJCQlzZXRzaWcoJnNpZ3RyYXBzW1NJR1FVSVRdLCBTSUdfSUdOLAorCQkJICAgIFNTX1JFU1RPUkVfSUdOfFNTX0ZPUkNFKTsKKwkJCWlmICgoIShmbGFncyAmIChYUElQRUkgfCBYQ09QUk9DKSkpICYmCisJCQkgICAgKChmb3Jrc2xlZXAgPSBvcGVuKCIvZGV2L251bGwiLCAwKSkgPiAwKSkgeworCQkJCSh2b2lkKWtzaF9kdXAyKGZvcmtzbGVlcCwgMCwgdHJ1ZSk7CisJCQkJY2xvc2UoZm9ya3NsZWVwKTsKKwkJCX0KKwkJfQorCQlyZW1vdmVfam9iKHBpLmosICJjaGlsZCIpOwkvKiBpbiBjYXNlIG9mICQoam9icykgY29tbWFuZCAqLworCQluem9tYmllID0gMDsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCXR0eXBncnBfb2sgPSBmYWxzZTsKKwkJRmxhZyhGTU9OSVRPUikgPSAwOworI2VuZGlmCisJCUZsYWcoRlRBTEtJTkcpID0gMDsKKwkJdHR5X2Nsb3NlKCk7CisJCWNsZWFydHJhcHMoKTsKKwkJLyogbm8gcmV0dXJuICovCisJCWV4ZWN1dGUodCwgKGZsYWdzICYgWEVSUk9LKSB8IFhFWEVDLCBOVUxMKTsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQlpZiAodC0+dHlwZSA9PSBUUElQRSkKKwkJCXVud2luZChMTEVBVkUpOworCQlpbnRlcm5hbF93YXJuaW5nZigiZXhjaGlsZDogZXhlY3V0ZSgpIHJldHVybmVkIik7CisJCWZwdHJlZWYoc2hsX291dCwgMiwgImV4Y2hpbGQ6IHRyaWVkIHRvIGV4ZWN1dGUge1xuJVRcbn1cbiIsIHQpOworCQlzaGZfZmx1c2goc2hsX291dCk7CisjZW5kaWYKKwkJdW53aW5kKExMRUFWRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwkvKiBzaGVsbCAocGFyZW50KSBzdHVmZiAqLworCWlmICghKGZsYWdzICYgWFBJUEVPKSkgewkvKiBsYXN0IHByb2Nlc3MgaW4gYSBqb2IgKi8KKwkJal9zdGFydGpvYihwaS5qKTsKKwkJaWYgKGZsYWdzICYgWENPUFJPQykgeworCQkJcGkuai0+Y29wcm9jX2lkID0gY29wcm9jLmlkOworCQkJLyogbiBqb2JzIHVzaW5nIGNvLXByb2Nlc3Mgb3V0cHV0ICovCisJCQljb3Byb2MubmpvYnMrKzsKKwkJCS8qIGogdXNpbmcgY28tcHJvY2VzcyBpbnB1dCAqLworCQkJY29wcm9jLmpvYiA9ICh2b2lkICopcGkuajsKKwkJfQorCQlpZiAoZmxhZ3MgJiBYQkdORCkgeworCQkJal9zZXRfYXN5bmMocGkuaik7CisJCQlpZiAoRmxhZyhGVEFMS0lORykpIHsKKwkJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiWyVkXSIsIHBpLmotPmpvYik7CisJCQkJZm9yIChwaS5wID0gcGkuai0+cHJvY19saXN0OyBwaS5wOworCQkJCSAgICBwaS5wID0gcGkucC0+bmV4dCkKKwkJCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiAlZCIsCisJCQkJCSAgICAoaW50KXBpLnAtPnBpZCk7CisJCQkJc2hmX3B1dGNoYXIoJ1xuJywgc2hsX291dCk7CisJCQkJc2hmX2ZsdXNoKHNobF9vdXQpOworCQkJfQorCQl9IGVsc2UKKwkJCXJ2ID0gal93YWl0aihwaS5qLCBKV19OT05FLCAianc6bGFzdCBwcm9jIik7CisJfQorCisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogc3RhcnQgdGhlIGxhc3Qgam9iOiBvbmx5IHVzZWQgZm9yICQoY29tbWFuZCkgam9icyAqLwordm9pZAorc3RhcnRsYXN0KHZvaWQpCit7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJaWYgKGxhc3Rfam9iKSB7IC8qIG5vIG5lZWQgdG8gcmVwb3J0IGVycm9yIC0gd2FpdGxhc3QoKSB3aWxsIGRvIGl0ICovCisJCS8qIGVuc3VyZSBpdCBpc24ndCByZW1vdmVkIGJ5IGNoZWNrX2pvYigpICovCisJCWxhc3Rfam9iLT5mbGFncyB8PSBKRl9XQUlUSU5HOworCQlqX3N0YXJ0am9iKGxhc3Rfam9iKTsKKwl9CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Cit9CisKKy8qIHdhaXQgZm9yIGxhc3Qgam9iOiBvbmx5IHVzZWQgZm9yICQoY29tbWFuZCkgam9icyAqLworaW50Cit3YWl0bGFzdCh2b2lkKQoreworCWludAlydjsKKwlKb2IJKmo7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJaiA9IGxhc3Rfam9iOworCWlmICghaiB8fCAhKGotPmZsYWdzICYgSkZfU1RBUlRFRCkpIHsKKwkJaWYgKCFqKQorCQkJd2FybmluZ2YodHJ1ZSwgIndhaXRsYXN0OiBubyBsYXN0IGpvYiIpOworCQllbHNlCisJCQlpbnRlcm5hbF93YXJuaW5nZigid2FpdGxhc3Q6IG5vdCBzdGFydGVkIik7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQlyZXR1cm4gKDEyNSk7IC8qIG5vdCBzbyBhcmJpdHJhcnksIG5vbi16ZXJvIHZhbHVlICovCisJfQorCisJcnYgPSBqX3dhaXRqKGosIEpXX05PTkUsICJqdzp3YWl0bGFzdCIpOworCisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogd2FpdCBmb3IgY2hpbGQsIGludGVycnVwdGFibGUuICovCitpbnQKK3dhaXRmb3IoY29uc3QgY2hhciAqY3AsIGludCAqc2lncCkKK3sKKwlpbnQJcnY7CisJSm9iCSpqOworCWludAllY29kZTsKKwlpbnQJZmxhZ3MgPSBKV19JTlRFUlJVUFR8SldfQVNZTkNOT1RJRlk7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJKnNpZ3AgPSAwOworCisJaWYgKGNwID09IE5VTEwpIHsKKwkJLyoKKwkJICogd2FpdCBmb3IgYW4gdW5zcGVjaWZpZWQgam9iIC0gYWx3YXlzIHJldHVybnMgMCwgc28KKwkJICogZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBleGl0ZWQvc2lnbmFsZWQgam9icworCQkgKi8KKwkJZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSBqLT5uZXh0KQorCQkJLyogQVQmVCBrc2ggd2lsbCB3YWl0IGZvciBzdG9wcGVkIGpvYnMgLSB3ZSBkb24ndCAqLworCQkJaWYgKGotPnBwaWQgPT0gcHJvY3BpZCAmJiBqLT5zdGF0ZSA9PSBQUlVOTklORykKKwkJCQlicmVhazsKKwkJaWYgKCFqKSB7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfSBlbHNlIGlmICgoaiA9IGpfbG9va3VwKGNwLCAmZWNvZGUpKSkgeworCQkvKiBkb24ndCByZXBvcnQgbm9ybWFsIGpvYiBjb21wbGV0aW9uICovCisJCWZsYWdzICY9IH5KV19BU1lOQ05PVElGWTsKKwkJaWYgKGotPnBwaWQgIT0gcHJvY3BpZCkgeworCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZSB7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQlpZiAoZWNvZGUgIT0gSkxfTk9TVUNIKQorCQkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgbG9va3VwX21zZ3NbZWNvZGVdKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyogQVQmVCBrc2ggd2lsbCB3YWl0IGZvciBzdG9wcGVkIGpvYnMgLSB3ZSBkb24ndCAqLworCXJ2ID0gal93YWl0aihqLCBmbGFncywgImp3OndhaXRmb3IiKTsKKworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCisJaWYgKHJ2IDwgMCkgLyogd2Ugd2VyZSBpbnRlcnJ1cHRlZCAqLworCQkqc2lncCA9IDEyOCArIC1ydjsKKworCXJldHVybiAocnYpOworfQorCisvKiBraWxsIChidWlsdC1pbikgYSBqb2IgKi8KK2ludAoral9raWxsKGNvbnN0IGNoYXIgKmNwLCBpbnQgc2lnKQoreworCUpvYgkqajsKKwlpbnQJcnYgPSAwOworCWludAllY29kZTsKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwlpZiAoKGogPSBqX2xvb2t1cChjcCwgJmVjb2RlKSkgPT0gTlVMTCkgeworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgbG9va3VwX21zZ3NbZWNvZGVdKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAoai0+cGdycCA9PSAwKSB7CS8qIHN0YXJ0ZWQgd2hlbiAhRmxhZyhGTU9OSVRPUikgKi8KKwkJaWYgKGtpbGxfam9iKGosIHNpZykgPCAwKSB7CisJCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBzdHJlcnJvcihlcnJubykpOworCQkJcnYgPSAxOworCQl9CisJfSBlbHNlIHsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCAmJiAoc2lnID09IFNJR1RFUk0gfHwgc2lnID09IFNJR0hVUCkpCisJCQlta3NoX2tpbGxwZyhqLT5wZ3JwLCBTSUdDT05UKTsKKyNlbmRpZgorCQlpZiAobWtzaF9raWxscGcoai0+cGdycCwgc2lnKSA8IDApIHsKKwkJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIHN0cmVycm9yKGVycm5vKSk7CisJCQlydiA9IDE7CisJCX0KKwl9CisKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKworCXJldHVybiAocnYpOworfQorCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorLyogZmcgYW5kIGJnIGJ1aWx0LWluczogY2FsbGVkIG9ubHkgaWYgRmxhZyhGTU9OSVRPUikgc2V0ICovCitpbnQKK2pfcmVzdW1lKGNvbnN0IGNoYXIgKmNwLCBpbnQgYmcpCit7CisJSm9iCSpqOworCVByb2MJKnA7CisJaW50CWVjb2RlOworCWludAlydW5uaW5nOworCWludAlydiA9IDA7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJaWYgKChqID0gal9sb29rdXAoY3AsICZlY29kZSkpID09IE5VTEwpIHsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIGxvb2t1cF9tc2dzW2Vjb2RlXSk7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKGotPnBncnAgPT0gMCkgeworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJYmlfZXJyb3JmKCJqb2Igbm90IGpvYi1jb250cm9sbGVkIik7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKGJnKQorCQlzaHByaW50ZigiWyVkXSAiLCBqLT5qb2IpOworCisJcnVubmluZyA9IDA7CisJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChwLT5zdGF0ZSA9PSBQU1RPUFBFRCkgeworCQkJcC0+c3RhdGUgPSBQUlVOTklORzsKKwkJCXAtPnN0YXR1cyA9IDA7CisJCQlydW5uaW5nID0gMTsKKwkJfQorCQlzaGZfcHV0cyhwLT5jb21tYW5kLCBzaGxfc3Rkb3V0KTsKKwkJaWYgKHAtPm5leHQpCisJCQlzaGZfcHV0cygifCAiLCBzaGxfc3Rkb3V0KTsKKwl9CisJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7CisJc2hmX2ZsdXNoKHNobF9zdGRvdXQpOworCWlmIChydW5uaW5nKQorCQlqLT5zdGF0ZSA9IFBSVU5OSU5HOworCisJcHV0X2pvYihqLCBQSl9QQVNUX1NUT1BQRUQpOworCWlmIChiZykKKwkJal9zZXRfYXN5bmMoaik7CisJZWxzZSB7CisJCS8qIGF0dGFjaCB0dHkgdG8gam9iICovCisJCWlmIChqLT5zdGF0ZSA9PSBQUlVOTklORykgeworCQkJaWYgKHR0eXBncnBfb2sgJiYgKGotPmZsYWdzICYgSkZfU0FWRURUVFkpKQorCQkJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJmotPnR0eXN0YXRlKTsKKwkJCS8qIFNlZSBjb21tZW50IGluIGpfd2FpdGogcmVnYXJkaW5nIHNhdmVkX3R0eXBncnAuICovCisJCQlpZiAodHR5cGdycF9vayAmJgorCQkJICAgIHRjc2V0cGdycCh0dHlfZmQsIChqLT5mbGFncyAmIEpGX1NBVkVEVFRZUEdSUCkgPworCQkJICAgIGotPnNhdmVkX3R0eXBncnAgOiBqLT5wZ3JwKSA8IDApIHsKKwkJCQlydiA9IGVycm5vOworCQkJCWlmIChqLT5mbGFncyAmIEpGX1NBVkVEVFRZKQorCQkJCQl0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRFJBSU4sICZ0dHlfc3RhdGUpOworCQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssCisJCQkJICAgIE5VTEwpOworCQkJCWJpX2Vycm9yZigiMXN0IHRjc2V0cGdycCglZCwgJWQpIGZhaWxlZDogJXMiLAorCQkJCSAgICB0dHlfZmQsCisJCQkJICAgIChpbnQpKChqLT5mbGFncyAmIEpGX1NBVkVEVFRZUEdSUCkgPworCQkJCSAgICBqLT5zYXZlZF90dHlwZ3JwIDogai0+cGdycCksCisJCQkJICAgIHN0cmVycm9yKHJ2KSk7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJfQorCQlqLT5mbGFncyB8PSBKRl9GRzsKKwkJai0+ZmxhZ3MgJj0gfkpGX0tOT1dOOworCQlpZiAoaiA9PSBhc3luY19qb2IpCisJCQlhc3luY19qb2IgPSBOVUxMOworCX0KKworCWlmIChqLT5zdGF0ZSA9PSBQUlVOTklORyAmJiBta3NoX2tpbGxwZyhqLT5wZ3JwLCBTSUdDT05UKSA8IDApIHsKKwkJaW50IGVyciA9IGVycm5vOworCisJCWlmICghYmcpIHsKKwkJCWotPmZsYWdzICY9IH5KRl9GRzsKKwkJCWlmICh0dHlwZ3JwX29rICYmIChqLT5mbGFncyAmIEpGX1NBVkVEVFRZKSkKKwkJCQl0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRFJBSU4sICZ0dHlfc3RhdGUpOworCQkJaWYgKHR0eXBncnBfb2sgJiYgdGNzZXRwZ3JwKHR0eV9mZCwga3NocGdycCkgPCAwKQorCQkJCXdhcm5pbmdmKHRydWUsCisJCQkJICAgICJmZzogMm5kIHRjc2V0cGdycCglZCwgJWxkKSBmYWlsZWQ6ICVzIiwKKwkJCQkgICAgdHR5X2ZkLCAobG9uZylrc2hwZ3JwLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQliaV9lcnJvcmYoImNhbm5vdCBjb250aW51ZSBqb2IgJXM6ICVzIiwKKwkJICAgIGNwLCBzdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKCFiZykgeworCQlpZiAodHR5cGdycF9vaykgeworCQkJai0+ZmxhZ3MgJj0gfihKRl9TQVZFRFRUWSB8IEpGX1NBVkVEVFRZUEdSUCk7CisJCX0KKwkJcnYgPSBqX3dhaXRqKGosIEpXX05PTkUsICJqdzpyZXN1bWUiKTsKKwl9CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJcmV0dXJuIChydik7Cit9CisjZW5kaWYKKworLyogYXJlIHRoZXJlIGFueSBydW5uaW5nIG9yIHN0b3BwZWQgam9icyA/ICovCitpbnQKK2pfc3RvcHBlZF9ydW5uaW5nKHZvaWQpCit7CisJSm9iCSpqOworCWludAl3aGljaCA9IDA7CisKKwlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkgeworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJaWYgKGotPnBwaWQgPT0gcHJvY3BpZCAmJiBqLT5zdGF0ZSA9PSBQU1RPUFBFRCkKKwkJCXdoaWNoIHw9IDE7CisjZW5kaWYKKwkJaWYgKEZsYWcoRkxPR0lOKSAmJiAhRmxhZyhGTk9IVVApICYmIHByb2NwaWQgPT0ga3NocGlkICYmCisJCSAgICBqLT5wcGlkID09IHByb2NwaWQgJiYgai0+c3RhdGUgPT0gUFJVTk5JTkcpCisJCQl3aGljaCB8PSAyOworCX0KKwlpZiAod2hpY2gpIHsKKwkJc2hlbGxmKCJZb3UgaGF2ZSAlcyVzJXMgam9ic1xuIiwKKwkJICAgIHdoaWNoICYgMSA/ICJzdG9wcGVkIiA6ICIiLAorCQkgICAgd2hpY2ggPT0gMyA/ICIgYW5kICIgOiAiIiwKKwkJICAgIHdoaWNoICYgMiA/ICJydW5uaW5nIiA6ICIiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2pfbmpvYnModm9pZCkKK3sKKwlKb2IgKmo7CisJaW50IG5qID0gMDsKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisJZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSBqLT5uZXh0KQorCQluaisrOworCisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJcmV0dXJuIChuaik7Cit9CisKKworLyogbGlzdCBqb2JzIGZvciBqb2JzIGJ1aWx0LWluICovCitpbnQKK2pfam9icyhjb25zdCBjaGFyICpjcCwgaW50IHNscCwKKyAgICBpbnQgbmZsYWcpCQkvKiAwOiBzaG9ydCwgMTogbG9uZywgMjogcGdycCAqLworeworCUpvYgkqaiwgKnRtcDsKKwlpbnQJaG93OworCWludAl6ZmxhZyA9IDA7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJaWYgKG5mbGFnIDwgMCkgeyAvKiBrbHVkZ2U6IHByaW50IHpvbWJpZXMgKi8KKwkJbmZsYWcgPSAwOworCQl6ZmxhZyA9IDE7CisJfQorCWlmIChjcCkgeworCQlpbnQJZWNvZGU7CisKKwkJaWYgKChqID0gal9sb29rdXAoY3AsICZlY29kZSkpID09IE5VTEwpIHsKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgbG9va3VwX21zZ3NbZWNvZGVdKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9IGVsc2UKKwkJaiA9IGpvYl9saXN0OworCWhvdyA9IHNscCA9PSAwID8gSlBfTUVESVVNIDogKHNscCA9PSAxID8gSlBfTE9ORyA6IEpQX1BHUlApOworCWZvciAoOyBqOyBqID0gai0+bmV4dCkgeworCQlpZiAoKCEoai0+ZmxhZ3MgJiBKRl9aT01CSUUpIHx8IHpmbGFnKSAmJgorCQkgICAgKCFuZmxhZyB8fCAoai0+ZmxhZ3MgJiBKRl9DSEFOR0VEKSkpIHsKKwkJCWpfcHJpbnQoaiwgaG93LCBzaGxfc3Rkb3V0KTsKKwkJCWlmIChqLT5zdGF0ZSA9PSBQRVhJVEVEIHx8IGotPnN0YXRlID09IFBTSUdOQUxMRUQpCisJCQkJai0+ZmxhZ3MgfD0gSkZfUkVNT1ZFOworCQl9CisJCWlmIChjcCkKKwkJCWJyZWFrOworCX0KKwkvKiBSZW1vdmUgam9icyBhZnRlciBwcmludGluZyBzbyB0aGVyZSB3b24ndCBiZSBtdWx0aXBsZSArIG9yIC0gam9icyAqLworCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gdG1wKSB7CisJCXRtcCA9IGotPm5leHQ7CisJCWlmIChqLT5mbGFncyAmIEpGX1JFTU9WRSkKKwkJCXJlbW92ZV9qb2IoaiwgImpvYnMiKTsKKwl9CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJcmV0dXJuICgwKTsKK30KKworLyogbGlzdCBqb2JzIGZvciB0b3AtbGV2ZWwgbm90aWZpY2F0aW9uICovCit2b2lkCitqX25vdGlmeSh2b2lkKQoreworCUpvYgkqaiwgKnRtcDsKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisJZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSBqLT5uZXh0KSB7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQlpZiAoRmxhZyhGTU9OSVRPUikgJiYgKGotPmZsYWdzICYgSkZfQ0hBTkdFRCkpCisJCQlqX3ByaW50KGosIEpQX01FRElVTSwgc2hsX291dCk7CisjZW5kaWYKKwkJLyogUmVtb3ZlIGpvYiBhZnRlciBkb2luZyByZXBvcnRzIHNvIHRoZXJlIGFyZW4ndAorCQkgKiBtdWx0aXBsZSArLy0gam9icy4KKwkJICovCisJCWlmIChqLT5zdGF0ZSA9PSBQRVhJVEVEIHx8IGotPnN0YXRlID09IFBTSUdOQUxMRUQpCisJCQlqLT5mbGFncyB8PSBKRl9SRU1PVkU7CisJfQorCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gdG1wKSB7CisJCXRtcCA9IGotPm5leHQ7CisJCWlmIChqLT5mbGFncyAmIEpGX1JFTU9WRSkKKwkJCXJlbW92ZV9qb2IoaiwgIm5vdGlmeSIpOworCX0KKwlzaGZfZmx1c2goc2hsX291dCk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7Cit9CisKKy8qIFJldHVybiBwaWQgb2YgbGFzdCBwcm9jZXNzIGluIGxhc3QgYXN5bmNocm9ub3VzIGpvYiAqLworcGlkX3QKK2pfYXN5bmModm9pZCkKK3sKKwlzaWdzZXRfdCBvbWFzazsKKworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwlpZiAoYXN5bmNfam9iKQorCQlhc3luY19qb2ItPmZsYWdzIHw9IEpGX0tOT1dOOworCisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisKKwlyZXR1cm4gKGFzeW5jX3BpZCk7Cit9CisKKy8qCisgKiBNYWtlIGogdGhlIGxhc3QgYXN5bmMgcHJvY2VzcworICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgdm9pZAoral9zZXRfYXN5bmMoSm9iICpqKQoreworCUpvYgkqamwsICpvbGRlc3Q7CisKKwlpZiAoYXN5bmNfam9iICYmIChhc3luY19qb2ItPmZsYWdzICYgKEpGX0tOT1dOfEpGX1pPTUJJRSkpID09IEpGX1pPTUJJRSkKKwkJcmVtb3ZlX2pvYihhc3luY19qb2IsICJhc3luYyIpOworCWlmICghKGotPmZsYWdzICYgSkZfU1RBUlRFRCkpIHsKKwkJaW50ZXJuYWxfd2FybmluZ2YoImpfYXN5bmM6IGpvYiBub3Qgc3RhcnRlZCIpOworCQlyZXR1cm47CisJfQorCWFzeW5jX2pvYiA9IGo7CisJYXN5bmNfcGlkID0gai0+bGFzdF9wcm9jLT5waWQ7CisJd2hpbGUgKG56b21iaWUgPiBDSElMRF9NQVgpIHsKKwkJb2xkZXN0ID0gTlVMTDsKKwkJZm9yIChqbCA9IGpvYl9saXN0OyBqbDsgamwgPSBqbC0+bmV4dCkKKwkJCWlmIChqbCAhPSBhc3luY19qb2IgJiYgKGpsLT5mbGFncyAmIEpGX1pPTUJJRSkgJiYKKwkJCSAgICAoIW9sZGVzdCB8fCBqbC0+YWdlIDwgb2xkZXN0LT5hZ2UpKQorCQkJCW9sZGVzdCA9IGpsOworCQlpZiAoIW9sZGVzdCkgeworCQkJLyogWFhYIGRlYnVnZ2luZyAqLworCQkJaWYgKCEoYXN5bmNfam9iLT5mbGFncyAmIEpGX1pPTUJJRSkgfHwgbnpvbWJpZSAhPSAxKSB7CisJCQkJaW50ZXJuYWxfd2FybmluZ2YoImpfYXN5bmM6IGJhZCBuem9tYmllICglZCkiLAorCQkJCSAgICBuem9tYmllKTsKKwkJCQluem9tYmllID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXJlbW92ZV9qb2Iob2xkZXN0LCAiem9tYmllIik7CisJfQorfQorCisvKgorICogU3RhcnQgYSBqb2I6IHNldCBTVEFSVEVELCBjaGVjayBmb3IgaGVsZCBzaWduYWxzIGFuZCBzZXQgai0+bGFzdF9wcm9jCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitqX3N0YXJ0am9iKEpvYiAqaikKK3sKKwlQcm9jCSpwOworCisJai0+ZmxhZ3MgfD0gSkZfU1RBUlRFRDsKKwlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAtPm5leHQ7IHAgPSBwLT5uZXh0KQorCQk7CisJai0+bGFzdF9wcm9jID0gcDsKKworCWlmIChoZWxkX3NpZ2NobGQpIHsKKwkJaGVsZF9zaWdjaGxkID0gMDsKKwkJLyogRG9uJ3QgY2FsbCBqX3NpZ2NobGQoKSBhcyBpdCBtYXkgcmVtb3ZlIGpvYi4uLiAqLworCQlraWxsKHByb2NwaWQsIFNJR0NITEQpOworCX0KK30KKworLyoKKyAqIHdhaXQgZm9yIGpvYiB0byBjb21wbGV0ZSBvciBjaGFuZ2Ugc3RhdGUKKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIGludAoral93YWl0aihKb2IgKmosCisgICAgaW50IGZsYWdzLAkJCS8qIHNlZSBKV18qICovCisgICAgY29uc3QgY2hhciAqd2hlcmUpCit7CisJaW50CXJ2OworCisJLyoKKwkgKiBObyBhdXRvLW5vdGlmeSBvbiB0aGUgam9iIHdlIGFyZSB3YWl0aW5nIG9uLgorCSAqLworCWotPmZsYWdzIHw9IEpGX1dBSVRJTkc7CisJaWYgKGZsYWdzICYgSldfQVNZTkNOT1RJRlkpCisJCWotPmZsYWdzIHw9IEpGX1dfQVNZTkNOT1RJRlk7CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJaWYgKCFGbGFnKEZNT05JVE9SKSkKKyNlbmRpZgorCQlmbGFncyB8PSBKV19TVE9QUEVEV0FJVDsKKworCXdoaWxlIChqLT5zdGF0ZSA9PSBQUlVOTklORyB8fAorCSAgICAoKGZsYWdzICYgSldfU1RPUFBFRFdBSVQpICYmIGotPnN0YXRlID09IFBTVE9QUEVEKSkgeworCQlzaWdzdXNwZW5kKCZzbV9kZWZhdWx0KTsKKwkJaWYgKGZhdGFsX3RyYXApIHsKKwkJCWludCBvbGRmID0gai0+ZmxhZ3MgJiAoSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKTsKKwkJCWotPmZsYWdzICY9IH4oSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKTsKKwkJCXJ1bnRyYXBzKFRGX0ZBVEFMKTsKKwkJCWotPmZsYWdzIHw9IG9sZGY7IC8qIG5vdCByZWFjaGVkLi4uICovCisJCX0KKwkJaWYgKChmbGFncyAmIEpXX0lOVEVSUlVQVCkgJiYgKHJ2ID0gdHJhcF9wZW5kaW5nKCkpKSB7CisJCQlqLT5mbGFncyAmPSB+KEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSk7CisJCQlyZXR1cm4gKC1ydik7CisJCX0KKwl9CisJai0+ZmxhZ3MgJj0gfihKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpOworCisJaWYgKGotPmZsYWdzICYgSkZfRkcpIHsKKwkJai0+ZmxhZ3MgJj0gfkpGX0ZHOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJaWYgKEZsYWcoRk1PTklUT1IpICYmIHR0eXBncnBfb2sgJiYgai0+cGdycCkgeworCQkJLyoKKwkJCSAqIFNhdmUgdGhlIHR0eSdzIGN1cnJlbnQgcGdycCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQKKwkJCSAqIHdoZW4gdGhlIGpvYiBpcyBmb3JlZ3JvdW5kZWQuIFRoaXMgaXMgdG8KKwkJCSAqIGRlYWwgd2l0aCB0aGluZ3MgbGlrZSB0aGUgR05VIHN1IHdoaWNoIGRvZXMKKwkJCSAqIGEgZm9yay9leGVjIGluc3RlYWQgb2YgYW4gZXhlYyAodGhlIGZvcmsgbWVhbnMKKwkJCSAqIHRoZSBleGVjZWQgc2hlbGwgZ2V0cyBhIGRpZmZlcmVudCBwaWQgZnJvbSBpdHMKKwkJCSAqIHBncnAsIHNvIG5hdHVyYWxseSBpdCBzZXRzIGl0cyBwZ3JwIGFuZCBnZXRzIGhvc2VkCisJCQkgKiB3aGVuIGl0IGdldHMgZm9yZWdyb3VuZGVkIGJ5IHRoZSBwYXJlbnQgc2hlbGwgd2hpY2gKKwkJCSAqIGhhcyByZXN0b3JlZCB0aGUgdHR5J3MgcGdycCB0byB0aGF0IG9mIHRoZSBzdQorCQkJICogcHJvY2VzcykuCisJCQkgKi8KKwkJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCAmJgorCQkJICAgIChqLT5zYXZlZF90dHlwZ3JwID0gdGNnZXRwZ3JwKHR0eV9mZCkpID49IDApCisJCQkJai0+ZmxhZ3MgfD0gSkZfU0FWRURUVFlQR1JQOworCQkJaWYgKHRjc2V0cGdycCh0dHlfZmQsIGtzaHBncnApIDwgMCkKKwkJCQl3YXJuaW5nZih0cnVlLAorCQkJCSAgICAial93YWl0ajogdGNzZXRwZ3JwKCVkLCAlbGQpIGZhaWxlZDogJXMiLAorCQkJCSAgICB0dHlfZmQsIChsb25nKWtzaHBncnAsIHN0cmVycm9yKGVycm5vKSk7CisJCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQpIHsKKwkJCQlqLT5mbGFncyB8PSBKRl9TQVZFRFRUWTsKKwkJCQl0Y2dldGF0dHIodHR5X2ZkLCAmai0+dHR5c3RhdGUpOworCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKHR0eV9mZCA+PSAwKSB7CisJCQkvKgorCQkJICogT25seSByZXN0b3JlIHR0eSBzZXR0aW5ncyBpZiBqb2Igd2FzIG9yaWdpbmFsbHkKKwkJCSAqIHN0YXJ0ZWQgaW4gdGhlIGZvcmVncm91bmQuIFByb2JsZW1zIGNhbiBiZQorCQkJICogY2F1c2VkIGJ5IHRoaW5ncyBsaWtlICdtb3JlIGZvb2JhciAmJyB3aGljaCB3aWxsCisJCQkgKiB0eXBpY2FsbHkgZ2V0IGFuZCBzYXZlIHRoZSBzaGVsbCdzIHZpL2VtYWNzIHR0eQorCQkJICogc2V0dGluZ3MgYmVmb3JlIHNldHRpbmcgdXAgdGhlIHR0eSBmb3IgaXRzZWxmOworCQkJICogd2hlbiBtb3JlIGV4aXRzLCBpdCByZXN0b3JlcyB0aGUgJ29yaWdpbmFsJworCQkJICogc2V0dGluZ3MsIGFuZCB0aGluZ3MgZ28gZG93biBoaWxsIGZyb20gdGhlcmUuLi4KKwkJCSAqLworCQkJaWYgKGotPnN0YXRlID09IFBFWElURUQgJiYgai0+c3RhdHVzID09IDAgJiYKKwkJCSAgICAoai0+ZmxhZ3MgJiBKRl9VU0VUVFlNT0RFKSkgeworCQkJCXRjZ2V0YXR0cih0dHlfZmQsICZ0dHlfc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQl0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRFJBSU4sICZ0dHlfc3RhdGUpOworCQkJCS8qLQorCQkJCSAqIERvbid0IHVzZSB0dHkgbW9kZSBpZiBqb2IgaXMgc3RvcHBlZCBhbmQKKwkJCQkgKiBsYXRlciByZXN0YXJ0ZWQgYW5kIGV4aXRzLiBDb25zaWRlcgorCQkJCSAqIHRoZSBzZXF1ZW5jZToKKwkJCQkgKgl2aSBmb28gKHN0b3BwZWQpCisJCQkJICoJLi4uCisJCQkJICoJc3R0eSBzb21ldGhpbmcKKwkJCQkgKgkuLi4KKwkJCQkgKglmZyAodmk7IFpaKQorCQkJCSAqIG1vZGUgc2hvdWxkIGJlIHRoYXQgb2YgdGhlIHN0dHksIG5vdCB3aGF0CisJCQkJICogd2FzIGJlZm9yZSB0aGUgdmkgc3RhcnRlZC4KKwkJCQkgKi8KKwkJCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQpCisJCQkJCWotPmZsYWdzICY9IH5KRl9VU0VUVFlNT0RFOworCQkJfQorCQl9CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQkvKgorCQkgKiBJZiBpdCBsb29rcyBsaWtlIHVzZXIgaGl0IF5DIHRvIGtpbGwgYSBqb2IsIHByZXRlbmQgd2UgZ290CisJCSAqIG9uZSB0b28gdG8gYnJlYWsgb3V0IG9mIGZvciBsb29wcywgZXRjLiAoQVQmVCBrc2ggZG9lcyB0aGlzCisJCSAqIGV2ZW4gd2hlbiBub3QgbW9uaXRvcmluZywgYnV0IHRoaXMgZG9lc24ndCBtYWtlIHNlbnNlIHNpbmNlCisJCSAqIGEgdHR5IGdlbmVyYXRlZCBeQyBnb2VzIHRvIHRoZSB3aG9sZSBwcm9jZXNzIGdyb3VwKQorCQkgKi8KKwkJeworCQkJaW50IHN0YXR1czsKKworCQkJc3RhdHVzID0gai0+bGFzdF9wcm9jLT5zdGF0dXM7CisJCQlpZiAoRmxhZyhGTU9OSVRPUikgJiYgai0+c3RhdGUgPT0gUFNJR05BTExFRCAmJgorCQkJICAgIFdJRlNJR05BTEVEKHN0YXR1cykgJiYKKwkJCSAgICAoc2lndHJhcHNbV1RFUk1TSUcoc3RhdHVzKV0uZmxhZ3MgJiBURl9UVFlfSU5UUikpCisJCQkJdHJhcHNpZyhXVEVSTVNJRyhzdGF0dXMpKTsKKwkJfQorI2VuZGlmCisJfQorCisJal91c3J0aW1lID0gai0+dXNydGltZTsKKwlqX3N5c3RpbWUgPSBqLT5zeXN0aW1lOworCXJ2ID0gai0+c3RhdHVzOworCisJaWYgKCEoZmxhZ3MgJiBKV19BU1lOQ05PVElGWSkKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJICAgICYmICghRmxhZyhGTU9OSVRPUikgfHwgai0+c3RhdGUgIT0gUFNUT1BQRUQpCisjZW5kaWYKKwkgICAgKSB7CisJCWpfcHJpbnQoaiwgSlBfU0hPUlQsIHNobF9vdXQpOworCQlzaGZfZmx1c2goc2hsX291dCk7CisJfQorCWlmIChqLT5zdGF0ZSAhPSBQU1RPUFBFRAorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkgICAgJiYgKCFGbGFnKEZNT05JVE9SKSB8fCAhKGZsYWdzICYgSldfQVNZTkNOT1RJRlkpKQorI2VuZGlmCisJICAgICkKKwkJcmVtb3ZlX2pvYihqLCB3aGVyZSk7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqIFNJR0NITEQgaGFuZGxlciB0byByZWFwIGNoaWxkcmVuIGFuZCB1cGRhdGUgam9iIHN0YXRlcworICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2pfc2lnY2hsZChpbnQgc2lnIE1LU0hfQV9VTlVTRUQpCit7CisJLyogdGhpcyBydW5zIGluc2lkZSBpbnRlcnJ1cHQgY29udGV4dCwgd2l0aCBlcnJubyBzYXZlZCAqLworCisJSm9iICpqOworCVByb2MgKnAgPSBOVUxMOworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBydXNhZ2UgcnUwLCBydTE7CisKKwkvKgorCSAqIERvbid0IHdhaXQgZm9yIGFueSBwcm9jZXNzZXMgaWYgYSBqb2IgaXMgcGFydGlhbGx5IHN0YXJ0ZWQuCisJICogVGhpcyBpcyBzbyB3ZSBkb24ndCBkbyBhd2F5IHdpdGggdGhlIHByb2Nlc3MgZ3JvdXAgbGVhZGVyCisJICogYmVmb3JlIGFsbCB0aGUgcHJvY2Vzc2VzIGluIGEgcGlwZSBsaW5lIGFyZSBzdGFydGVkIChzbyB0aGUKKwkgKiBzZXRwZ2lkKCkgd29uJ3QgZmFpbCkKKwkgKi8KKwlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IGotPm5leHQpCisJCWlmIChqLT5wcGlkID09IHByb2NwaWQgJiYgIShqLT5mbGFncyAmIEpGX1NUQVJURUQpKSB7CisJCQloZWxkX3NpZ2NobGQgPSAxOworCQkJcmV0dXJuOworCQl9CisKKwlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmcnUwKTsKKwlkbyB7CisJCXBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIChXTk9IQU5HfFdVTlRSQUNFRCkpOworCisJCS8qCisJCSAqIHJldHVybiBpZiB0aGlzIHdvdWxkIGJsb2NrICgwKSBvciBubyBjaGlsZHJlbgorCQkgKiBvciBpbnRlcnJ1cHRlZCAoLTEpCisJCSAqLworCQlpZiAocGlkIDw9IDApCisJCQlyZXR1cm47CisKKwkJZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJnJ1MSk7CisKKwkJLyogZmluZCBqb2IgYW5kIHByb2Nlc3Mgc3RydWN0dXJlcyBmb3IgdGhpcyBwaWQgKi8KKwkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCQlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJCQkJaWYgKHAtPnBpZCA9PSBwaWQpCisJCQkJCWdvdG8gZm91bmQ7CisgZm91bmQ6CisJCWlmIChqID09IE5VTEwpIHsKKwkJCS8qIENhbiBvY2N1ciBpZiBwcm9jZXNzIGhhcyBraWRzLCB0aGVuIGV4ZWNzIHNoZWxsCisJCQl3YXJuaW5nZih0cnVlLCAiYmFkIHByb2Nlc3Mgd2FpdGVkIGZvciAocGlkID0gJWQpIiwKKwkJCQlwaWQpOworCQkJICovCisJCQlydTAgPSBydTE7CisJCQljb250aW51ZTsKKwkJfQorCisJCXRpbWVyYWRkKCZqLT51c3J0aW1lLCAmcnUxLnJ1X3V0aW1lLCAmai0+dXNydGltZSk7CisJCXRpbWVyc3ViKCZqLT51c3J0aW1lLCAmcnUwLnJ1X3V0aW1lLCAmai0+dXNydGltZSk7CisJCXRpbWVyYWRkKCZqLT5zeXN0aW1lLCAmcnUxLnJ1X3N0aW1lLCAmai0+c3lzdGltZSk7CisJCXRpbWVyc3ViKCZqLT5zeXN0aW1lLCAmcnUwLnJ1X3N0aW1lLCAmai0+c3lzdGltZSk7CisJCXJ1MCA9IHJ1MTsKKwkJcC0+c3RhdHVzID0gc3RhdHVzOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSkKKwkJCXAtPnN0YXRlID0gUFNUT1BQRUQ7CisJCWVsc2UKKyNlbmRpZgorCQkgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorCQkJcC0+c3RhdGUgPSBQU0lHTkFMTEVEOworCQllbHNlCisJCQlwLT5zdGF0ZSA9IFBFWElURUQ7CisKKwkJY2hlY2tfam9iKGopOwkvKiBjaGVjayB0byBzZWUgaWYgZW50aXJlIGpvYiBpcyBkb25lICovCisJfSB3aGlsZSAoMSk7Cit9CisKKy8qCisgKiBDYWxsZWQgb25seSB3aGVuIGEgcHJvY2VzcyBpbiBqIGhhcyBleGl0ZWQvc3RvcHBlZCAoaWUsIGNhbGxlZCBvbmx5CisgKiBmcm9tIGpfc2lnY2hsZCgpKS4gSWYgbm8gcHJvY2Vzc2VzIGFyZSBydW5uaW5nLCB0aGUgam9iIHN0YXR1cworICogYW5kIHN0YXRlIGFyZSB1cGRhdGVkLCBhc3luY2hyb25vdXMgam9iIG5vdGlmaWNhdGlvbiBpcyBkb25lIGFuZCwKKyAqIGlmIHVubmVlZGVkLCB0aGUgam9iIGlzIHJlbW92ZWQuCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19qb2IoSm9iICpqKQoreworCWludAlqc3RhdGU7CisJUHJvYwkqcDsKKworCS8qIFhYWCBkZWJ1Z2dpbmcgKG5hc3R5IC0gaW50ZXJydXB0IHJvdXRpbmUgdXNpbmcgc2hsX291dCkgKi8KKwlpZiAoIShqLT5mbGFncyAmIEpGX1NUQVJURUQpKSB7CisJCWludGVybmFsX3dhcm5pbmdmKCJjaGVja19qb2I6IGpvYiBzdGFydGVkIChmbGFncyAweCV4KSIsCisJCSAgICBqLT5mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlqc3RhdGUgPSBQUlVOTklORzsKKwlmb3IgKHA9ai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChwLT5zdGF0ZSA9PSBQUlVOTklORykKKwkJCXJldHVybjsJLyogc29tZSBwcm9jZXNzZXMgc3RpbGwgcnVubmluZyAqLworCQlpZiAocC0+c3RhdGUgPiBqc3RhdGUpCisJCQlqc3RhdGUgPSBwLT5zdGF0ZTsKKwl9CisJai0+c3RhdGUgPSBqc3RhdGU7CisKKwlzd2l0Y2ggKGotPmxhc3RfcHJvYy0+c3RhdGUpIHsKKwljYXNlIFBFWElURUQ6CisJCWotPnN0YXR1cyA9IFdFWElUU1RBVFVTKGotPmxhc3RfcHJvYy0+c3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBQU0lHTkFMTEVEOgorCQlqLT5zdGF0dXMgPSAxMjggKyBXVEVSTVNJRyhqLT5sYXN0X3Byb2MtPnN0YXR1cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWotPnN0YXR1cyA9IDA7CisJCWJyZWFrOworCX0KKworCS8qCisJICogTm90ZSB3aGVuIGNvLXByb2Nlc3MgZGllczogY2FuJ3QgYmUgZG9uZSBpbiBqX3dhaXQoKSBub3IKKwkgKiByZW1vdmVfam9iKCkgc2luY2UgbmVpdGhlciBtYXkgYmUgY2FsbGVkIGZvciBub24taW50ZXJhY3RpdmUKKwkgKiBzaGVsbHMuCisJICovCisJaWYgKGotPnN0YXRlID09IFBFWElURUQgfHwgai0+c3RhdGUgPT0gUFNJR05BTExFRCkgeworCQkvKgorCQkgKiBObyBuZWVkIHRvIGtlZXAgY28tcHJvY2VzcyBpbnB1dCBhbnkgbW9yZQorCQkgKiAoYXQgbGVhc3QsIHRoaXMgaXMgd2hhdCBrc2g5M2QgdGhpbmtzKQorCQkgKi8KKwkJaWYgKGNvcHJvYy5qb2IgPT0gaikgeworCQkJY29wcm9jLmpvYiA9IE5VTEw7CisJCQkvKgorCQkJICogWFhYIHdvdWxkIGJlIG5pY2UgdG8gZ2V0IHRoZSBjbG9zZXMgb3V0IG9mIGhlcmUKKwkJCSAqIHNvIHRoZXkgYXJlbid0IGRvbmUgaW4gdGhlIHNpZ25hbCBoYW5kbGVyLgorCQkJICogV291bGQgbWVhbiBhIGNoZWNrIGluIGNvcHJvY19nZXRmZCgpIHRvCisJCQkgKiBkbyAiaWYgam9iID09IDAgJiYgd3JpdGUgPj0gMCwgY2xvc2Ugd3JpdGUiLgorCQkJICovCisJCQljb3Byb2Nfd3JpdGVfY2xvc2UoY29wcm9jLndyaXRlKTsKKwkJfQorCQkvKiBEbyB3ZSBuZWVkIHRvIGtlZXAgdGhlIG91dHB1dD8gKi8KKwkJaWYgKGotPmNvcHJvY19pZCAmJiBqLT5jb3Byb2NfaWQgPT0gY29wcm9jLmlkICYmCisJCSAgICAtLWNvcHJvYy5uam9icyA9PSAwKQorCQkJY29wcm9jX3JlYWR3X2Nsb3NlKGNvcHJvYy5yZWFkKTsKKwl9CisKKwlqLT5mbGFncyB8PSBKRl9DSEFOR0VEOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlpZiAoRmxhZyhGTU9OSVRPUikgJiYgIShqLT5mbGFncyAmIEpGX1hYQ09NKSkgeworCQkvKgorCQkgKiBPbmx5IHB1dCBzdG9wcGVkIGpvYnMgYXQgdGhlIGZyb250IHRvIGF2b2lkIGNvbmZ1c2luZworCQkgKiB0aGUgdXNlciAoZG9uJ3Qgd2FudCBmaW5pc2hlZCBqb2JzIGVmZmVjdGluZyAlKyBvciAlLSkKKwkJICovCisJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCkKKwkJCXB1dF9qb2IoaiwgUEpfT05fRlJPTlQpOworCQlpZiAoRmxhZyhGTk9USUZZKSAmJgorCQkgICAgKGotPmZsYWdzICYgKEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSkpICE9IEpGX1dBSVRJTkcpIHsKKwkJCS8qIExvb2sgZm9yIHRoZSByZWFsIGZpbGUgZGVzY3JpcHRvciAyICovCisJCQl7CisJCQkJc3RydWN0IGVudiAqZXA7CisJCQkJaW50IGZkID0gMjsKKworCQkJCWZvciAoZXAgPSBlOyBlcDsgZXAgPSBlcC0+b2VudikKKwkJCQkJaWYgKGVwLT5zYXZlZmQgJiYgZXAtPnNhdmVmZFsyXSkKKwkJCQkJCWZkID0gZXAtPnNhdmVmZFsyXTsKKwkJCQlzaGZfcmVvcGVuKGZkLCBTSEZfV1IsIHNobF9qKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBDYW4ndCBjYWxsIGpfbm90aWZ5KCkgYXMgaXQgcmVtb3ZlcyBqb2JzLiBUaGUgam9iCisJCQkgKiBtdXN0IHN0YXkgaW4gdGhlIGpvYiBsaXN0IGFzIGpfd2FpdGooKSBtYXkgYmUKKwkJCSAqIHJ1bm5pbmcgd2l0aCB0aGlzIGpvYi4KKwkJCSAqLworCQkJal9wcmludChqLCBKUF9NRURJVU0sIHNobF9qKTsKKwkJCXNoZl9mbHVzaChzaGxfaik7CisJCQlpZiAoIShqLT5mbGFncyAmIEpGX1dBSVRJTkcpICYmIGotPnN0YXRlICE9IFBTVE9QUEVEKQorCQkJCXJlbW92ZV9qb2IoaiwgIm5vdGlmeSIpOworCQl9CisJfQorI2VuZGlmCisJaWYgKAorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkgICAgIUZsYWcoRk1PTklUT1IpICYmCisjZW5kaWYKKwkgICAgIShqLT5mbGFncyAmIChKRl9XQUlUSU5HfEpGX0ZHKSkgJiYKKwkgICAgai0+c3RhdGUgIT0gUFNUT1BQRUQpIHsKKwkJaWYgKGogPT0gYXN5bmNfam9iIHx8IChqLT5mbGFncyAmIEpGX0tOT1dOKSkgeworCQkJai0+ZmxhZ3MgfD0gSkZfWk9NQklFOworCQkJai0+am9iID0gLTE7CisJCQluem9tYmllKys7CisJCX0gZWxzZQorCQkJcmVtb3ZlX2pvYihqLCAiY2hlY2tqb2IiKTsKKwl9Cit9CisKKy8qCisgKiBQcmludCBqb2Igc3RhdHVzIGluIGVpdGhlciBzaG9ydCwgbWVkaXVtIG9yIGxvbmcgZm9ybWF0LgorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgdm9pZAoral9wcmludChKb2IgKmosIGludCBob3csIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlQcm9jCSpwOworCWludAlzdGF0ZTsKKwlpbnQJc3RhdHVzOworCWludAljb3JlZHVtcGVkOworCWNoYXIJam9iY2hhciA9ICcgJzsKKwljaGFyCWJ1Zls2NF07CisJY29uc3QgY2hhciAqZmlsbGVyOworCWludAlvdXRwdXQgPSAwOworCisJaWYgKGhvdyA9PSBKUF9QR1JQKSB7CisJCS8qCisJCSAqIFBPU0lYIGRvZXNuJ3Qgc2F5IHdoYXQgdG8gZG8gaXQgdGhlcmUgaXMgbm8gcHJvY2VzcworCQkgKiBncm91cCBsZWFkZXIgKGllLCAhRk1PTklUT1IpLiBXZSBhcmJpdHJhcmlseSByZXR1cm4KKwkJICogbGFzdCBwaWQgKHdoaWNoIGlzIHdoYXQgJCEgcmV0dXJucykuCisJCSAqLworCQlzaGZfZnByaW50ZihzaGYsICIlZFxuIiwgKGludCkoai0+cGdycCA/IGotPnBncnAgOgorCQkgICAgKGotPmxhc3RfcHJvYyA/IGotPmxhc3RfcHJvYy0+cGlkIDogMCkpKTsKKwkJcmV0dXJuOworCX0KKwlqLT5mbGFncyAmPSB+SkZfQ0hBTkdFRDsKKwlmaWxsZXIgPSBqLT5qb2IgPiAxMCA/ICJcbiAgICAgICAiIDogIlxuICAgICAgIjsKKwlpZiAoaiA9PSBqb2JfbGlzdCkKKwkJam9iY2hhciA9ICcrJzsKKwllbHNlIGlmIChqID09IGpvYl9saXN0LT5uZXh0KQorCQlqb2JjaGFyID0gJy0nOworCisJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7KSB7CisJCWNvcmVkdW1wZWQgPSAwOworCQlzd2l0Y2ggKHAtPnN0YXRlKSB7CisJCWNhc2UgUFJVTk5JTkc6CisJCQltZW1jcHkoYnVmLCAiUnVubmluZyIsIDgpOworCQkJYnJlYWs7CisJCWNhc2UgUFNUT1BQRUQ6CisJCQlzdHJsY3B5KGJ1Ziwgc2lndHJhcHNbV1NUT1BTSUcocC0+c3RhdHVzKV0ubWVzcywKKwkJCSAgICBzaXplb2YoYnVmKSk7CisJCQlicmVhazsKKwkJY2FzZSBQRVhJVEVEOgorCQkJaWYgKGhvdyA9PSBKUF9TSE9SVCkKKwkJCQlidWZbMF0gPSAnXDAnOworCQkJZWxzZSBpZiAoV0VYSVRTVEFUVVMocC0+c3RhdHVzKSA9PSAwKQorCQkJCW1lbWNweShidWYsICJEb25lIiwgNSk7CisJCQllbHNlCisJCQkJc2hmX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJEb25lICglZCkiLAorCQkJCSAgICBXRVhJVFNUQVRVUyhwLT5zdGF0dXMpKTsKKwkJCWJyZWFrOworCQljYXNlIFBTSUdOQUxMRUQ6CisjaWZkZWYgV0NPUkVEVU1QCisJCQlpZiAoV0NPUkVEVU1QKHAtPnN0YXR1cykpCisJCQkJY29yZWR1bXBlZCA9IDE7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBrbHVkZ2UgZm9yIG5vdCByZXBvcnRpbmcgJ25vcm1hbCB0ZXJtaW5hdGlvbgorCQkJICogc2lnbmFscycgKGkuZS4gU0lHSU5ULCBTSUdQSVBFKQorCQkJICovCisJCQlpZiAoaG93ID09IEpQX1NIT1JUICYmICFjb3JlZHVtcGVkICYmCisJCQkgICAgKFdURVJNU0lHKHAtPnN0YXR1cykgPT0gU0lHSU5UIHx8CisJCQkgICAgV1RFUk1TSUcocC0+c3RhdHVzKSA9PSBTSUdQSVBFKSkgeworCQkJCWJ1ZlswXSA9ICdcMCc7CisJCQl9IGVsc2UKKwkJCQlzdHJsY3B5KGJ1Ziwgc2lndHJhcHNbV1RFUk1TSUcocC0+c3RhdHVzKV0ubWVzcywKKwkJCQkgICAgc2l6ZW9mKGJ1ZikpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaG93ICE9IEpQX1NIT1JUKSB7CisJCQlpZiAocCA9PSBqLT5wcm9jX2xpc3QpCisJCQkJc2hmX2ZwcmludGYoc2hmLCAiWyVkXSAlYyAiLCBqLT5qb2IsIGpvYmNoYXIpOworCQkJZWxzZQorCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVzIiwgZmlsbGVyKTsKKwkJfQorCisJCWlmIChob3cgPT0gSlBfTE9ORykKKwkJCXNoZl9mcHJpbnRmKHNoZiwgIiU1ZCAiLCAoaW50KXAtPnBpZCk7CisKKwkJaWYgKGhvdyA9PSBKUF9TSE9SVCkgeworCQkJaWYgKGJ1ZlswXSkgeworCQkJCW91dHB1dCA9IDE7CisJCQkJc2hmX2ZwcmludGYoc2hmLCAiJXMlcyAiLAorCQkJCSAgICBidWYsIGNvcmVkdW1wZWQgPyAiIChjb3JlIGR1bXBlZCkiIDogbnVsbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlvdXRwdXQgPSAxOworCQkJc2hmX2ZwcmludGYoc2hmLCAiJS0yMHMgJXMlcyVzIiwgYnVmLCBwLT5jb21tYW5kLAorCQkJICAgIHAtPm5leHQgPyAifCIgOiBudWxsLAorCQkJICAgIGNvcmVkdW1wZWQgPyAiIChjb3JlIGR1bXBlZCkiIDogbnVsbCk7CisJCX0KKworCQlzdGF0ZSA9IHAtPnN0YXRlOworCQlzdGF0dXMgPSBwLT5zdGF0dXM7CisJCXAgPSBwLT5uZXh0OworCQl3aGlsZSAocCAmJiBwLT5zdGF0ZSA9PSBzdGF0ZSAmJiBwLT5zdGF0dXMgPT0gc3RhdHVzKSB7CisJCQlpZiAoaG93ID09IEpQX0xPTkcpCisJCQkJc2hmX2ZwcmludGYoc2hmLCAiJXMlNWQgJS0yMHMgJXMlcyIsIGZpbGxlciwKKwkJCQkgICAgKGludClwLT5waWQsICIgIiwgcC0+Y29tbWFuZCwKKwkJCQkgICAgcC0+bmV4dCA/ICJ8IiA6IG51bGwpOworCQkJZWxzZSBpZiAoaG93ID09IEpQX01FRElVTSkKKwkJCQlzaGZfZnByaW50ZihzaGYsICIgJXMlcyIsIHAtPmNvbW1hbmQsCisJCQkJICAgIHAtPm5leHQgPyAifCIgOiBudWxsKTsKKwkJCXAgPSBwLT5uZXh0OworCQl9CisJfQorCWlmIChvdXRwdXQpCisJCXNoZl9wdXRjKCdcbicsIHNoZik7Cit9CisKKy8qCisgKiBDb252ZXJ0ICUgc2VxdWVuY2UgdG8gam9iCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyBKb2IgKgoral9sb29rdXAoY29uc3QgY2hhciAqY3AsIGludCAqZWNvZGVwKQoreworCUpvYgkJKmosICpsYXN0X21hdGNoOworCVByb2MJCSpwOworCWludAkJbGVuLCBqb2IgPSAwOworCisJaWYgKGtzaF9pc2RpZ2l0KCpjcCkpIHsKKwkJZ2V0bihjcCwgJmpvYik7CisJCS8qIExvb2sgZm9yIGxhc3RfcHJvYy0+cGlkICh3aGF0ICQhIHJldHVybnMpIGZpcnN0Li4uICovCisJCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQorCQkJaWYgKGotPmxhc3RfcHJvYyAmJiBqLT5sYXN0X3Byb2MtPnBpZCA9PSBqb2IpCisJCQkJcmV0dXJuIChqKTsKKwkJLyoKKwkJICogLi4udGhlbiBsb29rIGZvciBwcm9jZXNzIGdyb3VwICh0aGlzIGlzIG5vbi1QT1NJWCwKKwkJICogYnV0IHNob3VsZCBub3QgYnJlYWsgYW55dGhpbmcKKwkJICovCisJCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQorCQkJaWYgKGotPnBncnAgJiYgai0+cGdycCA9PSBqb2IpCisJCQkJcmV0dXJuIChqKTsKKwkJaWYgKGVjb2RlcCkKKwkJCSplY29kZXAgPSBKTF9OT1NVQ0g7CisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICgqY3AgIT0gJyUnKSB7CisJCWlmIChlY29kZXApCisJCQkqZWNvZGVwID0gSkxfSU5WQUxJRDsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJc3dpdGNoICgqKytjcCkgeworCWNhc2UgJ1wwJzogLyogbm9uLXN0YW5kYXJkICovCisJY2FzZSAnKyc6CisJY2FzZSAnJSc6CisJCWlmIChqb2JfbGlzdCAhPSBOVUxMKQorCQkJcmV0dXJuIChqb2JfbGlzdCk7CisJCWJyZWFrOworCisJY2FzZSAnLSc6CisJCWlmIChqb2JfbGlzdCAhPSBOVUxMICYmIGpvYl9saXN0LT5uZXh0KQorCQkJcmV0dXJuIChqb2JfbGlzdC0+bmV4dCk7CisJCWJyZWFrOworCisJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKwkJZ2V0bihjcCwgJmpvYik7CisJCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQorCQkJaWYgKGotPmpvYiA9PSBqb2IpCisJCQkJcmV0dXJuIChqKTsKKwkJYnJlYWs7CisKKwljYXNlICc/JzoJCS8qICU/c3RyaW5nICovCisJCWxhc3RfbWF0Y2ggPSBOVUxMOworCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKKwkJCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwkJCQlpZiAoc3Ryc3RyKHAtPmNvbW1hbmQsIGNwKzEpICE9IE5VTEwpIHsKKwkJCQkJaWYgKGxhc3RfbWF0Y2gpIHsKKwkJCQkJCWlmIChlY29kZXApCisJCQkJCQkJKmVjb2RlcCA9IEpMX0FNQklHOworCQkJCQkJcmV0dXJuIChOVUxMKTsKKwkJCQkJfQorCQkJCQlsYXN0X21hdGNoID0gajsKKwkJCQl9CisJCWlmIChsYXN0X21hdGNoKQorCQkJcmV0dXJuIChsYXN0X21hdGNoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLyogJXN0cmluZyAqLworCQlsZW4gPSBzdHJsZW4oY3ApOworCQlsYXN0X21hdGNoID0gTlVMTDsKKwkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCQlpZiAoc3RybmNtcChjcCwgai0+cHJvY19saXN0LT5jb21tYW5kLCBsZW4pID09IDApIHsKKwkJCQlpZiAobGFzdF9tYXRjaCkgeworCQkJCQlpZiAoZWNvZGVwKQorCQkJCQkJKmVjb2RlcCA9IEpMX0FNQklHOworCQkJCQlyZXR1cm4gKE5VTEwpOworCQkJCX0KKwkJCQlsYXN0X21hdGNoID0gajsKKwkJCX0KKwkJaWYgKGxhc3RfbWF0Y2gpCisJCQlyZXR1cm4gKGxhc3RfbWF0Y2gpOworCQlicmVhazsKKwl9CisJaWYgKGVjb2RlcCkKKwkJKmVjb2RlcCA9IEpMX05PU1VDSDsKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgSm9iCSpmcmVlX2pvYnM7CitzdGF0aWMgUHJvYwkqZnJlZV9wcm9jczsKKworLyoKKyAqIGFsbG9jYXRlIGEgbmV3IGpvYiBhbmQgZmlsbCBpbiB0aGUgam9iIG51bWJlci4KKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIEpvYiAqCituZXdfam9iKHZvaWQpCit7CisJaW50CWk7CisJSm9iCSpuZXdqLCAqajsKKworCWlmIChmcmVlX2pvYnMgIT0gTlVMTCkgeworCQluZXdqID0gZnJlZV9qb2JzOworCQlmcmVlX2pvYnMgPSBmcmVlX2pvYnMtPm5leHQ7CisJfSBlbHNlCisJCW5ld2ogPSBhbGxvYyhzaXplb2YoSm9iKSwgQVBFUk0pOworCisJLyogYnJ1dGUgZm9yY2UgbWV0aG9kICovCisJZm9yIChpID0gMTsgOyBpKyspIHsKKwkJZm9yIChqID0gam9iX2xpc3Q7IGogJiYgai0+am9iICE9IGk7IGogPSBqLT5uZXh0KQorCQkJOworCQlpZiAoaiA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCW5ld2otPmpvYiA9IGk7CisKKwlyZXR1cm4gKG5ld2opOworfQorCisvKgorICogQWxsb2NhdGUgbmV3IHByb2Nlc3Mgc3RydWN0CisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyBQcm9jICoKK25ld19wcm9jKHZvaWQpCit7CisJUHJvYwkqcDsKKworCWlmIChmcmVlX3Byb2NzICE9IE5VTEwpIHsKKwkJcCA9IGZyZWVfcHJvY3M7CisJCWZyZWVfcHJvY3MgPSBmcmVlX3Byb2NzLT5uZXh0OworCX0gZWxzZQorCQlwID0gYWxsb2Moc2l6ZW9mKFByb2MpLCBBUEVSTSk7CisKKwlyZXR1cm4gKHApOworfQorCisvKgorICogVGFrZSBqb2Igb3V0IG9mIGpvYl9saXN0IGFuZCBwdXQgb2xkIHN0cnVjdHVyZXMgaW50byBmcmVlIGxpc3QuCisgKiBLZWVwcyBuem9tYmllcywgbGFzdF9qb2IgYW5kIGFzeW5jX2pvYiB1cCB0byBkYXRlLgorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgdm9pZAorcmVtb3ZlX2pvYihKb2IgKmosIGNvbnN0IGNoYXIgKndoZXJlKQoreworCVByb2MJKnAsICp0bXA7CisJSm9iCSoqcHJldiwgKmN1cnI7CisKKwlwcmV2ID0gJmpvYl9saXN0OworCWN1cnIgPSAqcHJldjsKKwlmb3IgKDsgY3VyciAhPSBOVUxMICYmIGN1cnIgIT0gajsgcHJldiA9ICZjdXJyLT5uZXh0LCBjdXJyID0gKnByZXYpCisJCTsKKwlpZiAoY3VyciAhPSBqKSB7CisJCWludGVybmFsX3dhcm5pbmdmKCJyZW1vdmVfam9iOiBqb2Igbm90IGZvdW5kICglcykiLCB3aGVyZSk7CisJCXJldHVybjsKKwl9CisJKnByZXYgPSBjdXJyLT5uZXh0OworCisJLyogZnJlZSB1cCBwcm9jIHN0cnVjdHVyZXMgKi8KKwlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgKSB7CisJCXRtcCA9IHA7CisJCXAgPSBwLT5uZXh0OworCQl0bXAtPm5leHQgPSBmcmVlX3Byb2NzOworCQlmcmVlX3Byb2NzID0gdG1wOworCX0KKworCWlmICgoai0+ZmxhZ3MgJiBKRl9aT01CSUUpICYmIGotPnBwaWQgPT0gcHJvY3BpZCkKKwkJLS1uem9tYmllOworCWotPm5leHQgPSBmcmVlX2pvYnM7CisJZnJlZV9qb2JzID0gajsKKworCWlmIChqID09IGxhc3Rfam9iKQorCQlsYXN0X2pvYiA9IE5VTEw7CisJaWYgKGogPT0gYXN5bmNfam9iKQorCQlhc3luY19qb2IgPSBOVUxMOworfQorCisvKgorICogcHV0IGogaW4gYSBwYXJ0aWN1bGFyIGxvY2F0aW9uICh0YWtpbmcgaXQgb3V0IGpvYl9saXN0IGlmIGl0IGlzIHRoZXJlCisgKiBhbHJlYWR5KQorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgdm9pZAorcHV0X2pvYihKb2IgKmosIGludCB3aGVyZSkKK3sKKwlKb2IJKipwcmV2LCAqY3VycjsKKworCS8qIFJlbW92ZSBqb2IgZnJvbSBsaXN0IChpZiB0aGVyZSkgKi8KKwlwcmV2ID0gJmpvYl9saXN0OworCWN1cnIgPSBqb2JfbGlzdDsKKwlmb3IgKDsgY3VyciAmJiBjdXJyICE9IGo7IHByZXYgPSAmY3Vyci0+bmV4dCwgY3VyciA9ICpwcmV2KQorCQk7CisJaWYgKGN1cnIgPT0gaikKKwkJKnByZXYgPSBjdXJyLT5uZXh0OworCisJc3dpdGNoICh3aGVyZSkgeworCWNhc2UgUEpfT05fRlJPTlQ6CisJCWotPm5leHQgPSBqb2JfbGlzdDsKKwkJam9iX2xpc3QgPSBqOworCQlicmVhazsKKworCWNhc2UgUEpfUEFTVF9TVE9QUEVEOgorCQlwcmV2ID0gJmpvYl9saXN0OworCQljdXJyID0gam9iX2xpc3Q7CisJCWZvciAoOyBjdXJyICYmIGN1cnItPnN0YXRlID09IFBTVE9QUEVEOyBwcmV2ID0gJmN1cnItPm5leHQsCisJCSAgICBjdXJyID0gKnByZXYpCisJCQk7CisJCWotPm5leHQgPSBjdXJyOworCQkqcHJldiA9IGo7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIG51a2UgYSBqb2IgKGNhbGxlZCB3aGVuIHVuYWJsZSB0byBzdGFydCBmdWxsIGpvYikuCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQKK2tpbGxfam9iKEpvYiAqaiwgaW50IHNpZykKK3sKKwlQcm9jCSpwOworCWludAlydmFsID0gMDsKKworCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwkJaWYgKHAtPnBpZCAhPSAwKQorCQkJaWYgKGtpbGwocC0+cGlkLCBzaWcpIDwgMCkKKwkJCQlydmFsID0gLTE7CisJcmV0dXJuIChydmFsKTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2xhbGxvYy5jIGIvbWtzaC9zcmMvbGFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MjdkMQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2xhbGxvYy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKi0KKyAqIENvcHlyaWdodCDCqSAyMDA5CisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVu4oCQCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkIOKAnEFTIElT4oCdIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb27igJlzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9sYWxsb2MuYyx2IDEuMTEgMjAwOS8wOC8wOCAxMzowODo1MSB0ZyBFeHAgJCIpOworCisvKiBidWlsZCB3aXRoIENQUEZMQUdTKz0gLURVU0VfUkVBTExPQ19NQUxMT0M9MCBvbiBhbmNpZW50IHN5c3RlbXMgKi8KKyNpZiBkZWZpbmVkKFVTRV9SRUFMTE9DX01BTExPQykgJiYgKFVTRV9SRUFMTE9DX01BTExPQyA9PSAwKQorI2RlZmluZSByZW1hbGxvYyhwLG4pCSgocCkgPT0gTlVMTCA/IG1hbGxvYyhuKSA6IHJlYWxsb2MoKHApLCAobikpKQorI2Vsc2UKKyNkZWZpbmUgcmVtYWxsb2MocCxuKQlyZWFsbG9jKChwKSwgKG4pKQorI2VuZGlmCisKKyNkZWZpbmUgQUxMT0NfSVNVTkFMSUdORUQocCkgKCgocHRyZGlmZl90KShwKSkgJSBBTExPQ19TSVpFKQorCitzdGF0aWMgQUxMT0NfSVRFTSAqZmluZHB0cihBTExPQ19JVEVNICoqLCBjaGFyICosIEFyZWEgKik7CisKK3ZvaWQKK2Fpbml0KEFyZWEgKmFwKQoreworCS8qIGFyZWEgcG9pbnRlciBpcyBhbiBBTExPQ19JVEVNLCBqdXN0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisJYXAtPm5leHQgPSBOVUxMOworfQorCitzdGF0aWMgQUxMT0NfSVRFTSAqCitmaW5kcHRyKEFMTE9DX0lURU0gKipscHAsIGNoYXIgKnB0ciwgQXJlYSAqYXApCit7CisJdm9pZCAqbHA7CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWlmIChBTExPQ19JU1VOQUxJR05FRChwdHIpKQorCQlnb3RvIGZhaWw7CisjZW5kaWYKKwkvKiBnZXQgYWRkcmVzcyBvZiBBTExPQ19JVEVNIGZyb20gdXNlciBpdGVtICovCisJLyoKKwkgKiBub3RlOiB0aGUgYWxpZ25tZW50IG9mICJwdHIiIHRvIEFMTE9DX1NJWkUgaXMgY2hlY2tlZAorCSAqIGFib3ZlOyB0aGUgInZvaWQgKiIgZ2V0cyB1cyByaWQgb2YgYSBnY2MgMi45NSB3YXJuaW5nCisJICovCisJKmxwcCA9IChscCA9IHB0ciAtIEFMTE9DX1NJWkUpOworCS8qIHNlYXJjaCBmb3IgYWxsb2NhdGlvbiBpdGVtIGluIGdyb3VwIGxpc3QgKi8KKwl3aGlsZSAoYXAtPm5leHQgIT0gbHApCisJCWlmICgoYXAgPSBhcC0+bmV4dCkgPT0gTlVMTCkgeworI2lmbmRlZiBNS1NIX1NNQUxMCisgZmFpbDoKKyNlbmRpZgorCQkJaW50ZXJuYWxfZXJyb3JmKCJyb2d1ZSBwb2ludGVyICVwIiwgcHRyKTsKKwkJfQorCXJldHVybiAoYXApOworfQorCit2b2lkICoKK2FyZXNpemUodm9pZCAqcHRyLCBzaXplX3QgbnVtYiwgQXJlYSAqYXApCit7CisJQUxMT0NfSVRFTSAqbHAgPSBOVUxMOworCisJLyogcmVzaXppbmcgKHRydWUpIG9yIG5ld2x5IGFsbG9jYXRpbmc/ICovCisJaWYgKHB0ciAhPSBOVUxMKSB7CisJCUFMTE9DX0lURU0gKnBwOworCisJCXBwID0gZmluZHB0cigmbHAsIHB0ciwgYXApOworCQlwcC0+bmV4dCA9IGxwLT5uZXh0OworCX0KKworCWlmICgobnVtYiA+PSBTSVpFX01BWCAtIEFMTE9DX1NJWkUpIHx8CisJICAgIChscCA9IHJlbWFsbG9jKGxwLCBudW1iICsgQUxMT0NfU0laRSkpID09IE5VTEwKKyNpZm5kZWYgTUtTSF9TTUFMTAorCSAgICB8fCBBTExPQ19JU1VOQUxJR05FRChscCkKKyNlbmRpZgorCSAgICApCisJCWludGVybmFsX2Vycm9yZigiY2Fubm90IGFsbG9jYXRlICVsdSBkYXRhIGJ5dGVzIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKW51bWIpOworCS8qIHRoaXMgb25seSB3b3JrcyBiZWNhdXNlIEFyZWEgaXMgYW4gQUxMT0NfSVRFTSAqLworCWxwLT5uZXh0ID0gYXAtPm5leHQ7CisJYXAtPm5leHQgPSBscDsKKwkvKiByZXR1cm4gdXNlciBpdGVtIGFkZHJlc3MgKi8KKwlyZXR1cm4gKChjaGFyICopbHAgKyBBTExPQ19TSVpFKTsKK30KKwordm9pZAorYWZyZWUodm9pZCAqcHRyLCBBcmVhICphcCkKK3sKKwlpZiAocHRyICE9IE5VTEwpIHsKKwkJQUxMT0NfSVRFTSAqbHAsICpwcDsKKworCQlwcCA9IGZpbmRwdHIoJmxwLCBwdHIsIGFwKTsKKwkJLyogdW5ob29rICovCisJCXBwLT5uZXh0ID0gbHAtPm5leHQ7CisJCS8qIG5vdyBmcmVlIEFMTE9DX0lURU0gKi8KKwkJZnJlZShscCk7CisJfQorfQorCit2b2lkCithZnJlZWFsbChBcmVhICphcCkKK3sKKwlBTExPQ19JVEVNICpscDsKKworCS8qIHRyYXZlcnNlIGdyb3VwIChsaW5rZWQgbGlzdCkgKi8KKwl3aGlsZSAoKGxwID0gYXAtPm5leHQpICE9IE5VTEwpIHsKKwkJLyogbWFrZSBuZXh0IEFMTE9DX0lURU0gaGVhZCBvZiBsaXN0ICovCisJCWFwLT5uZXh0ID0gbHAtPm5leHQ7CisJCS8qIGZyZWUgb2xkIGhlYWQgKi8KKwkJZnJlZShscCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbGV4LmMgYi9ta3NoL3NyYy9sZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDIxOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvbGV4LmMKQEAgLTAsMCArMSwxNzgyIEBACisvKgkkT3BlbkJTRDogbGV4LmMsdiAxLjQ0IDIwMDgvMDcvMDMgMTc6NTI6MDggb3R0byBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2xleC5jLHYgMS4xMTggMjAxMC8wNy8yNSAxMTozNTo0MSB0ZyBFeHAgJCIpOworCisvKgorICogc3RhdGVzIHdoaWxlIGxleGluZyB3b3JkCisgKi8KKyNkZWZpbmUgU0JBU0UJCTAJLyogb3V0c2lkZSBhbnkgbGV4aWNhbCBjb25zdHJ1Y3RzICovCisjZGVmaW5lIFNXT1JECQkxCS8qIGltcGxpY2l0IHF1b3RpbmcgZm9yIHN1YnN0aXR1dGUoKSAqLworI2RlZmluZSBTTEVUUEFSRU4JMgkvKiBpbnNpZGUgKCggKSksIGltcGxpY2l0IHF1b3RpbmcgKi8KKyNkZWZpbmUgU1NRVU9URQkJMwkvKiBpbnNpZGUgJycgKi8KKyNkZWZpbmUgU0RRVU9URQkJNAkvKiBpbnNpZGUgIiIgKi8KKyNkZWZpbmUgU0VRVU9URQkJNQkvKiBpbnNpZGUgJCcnICovCisjZGVmaW5lIFNCUkFDRQkJNgkvKiBpbnNpZGUgJHt9ICovCisjZGVmaW5lIFNRQlJBQ0UJCTcJLyogaW5zaWRlICIke30iICovCisjZGVmaW5lIFNDU1BBUkVOCTgJLyogaW5zaWRlICQoKSAqLworI2RlZmluZSBTQlFVT1RFCQk5CS8qIGluc2lkZSBgYCAqLworI2RlZmluZSBTQVNQQVJFTgkxMAkvKiBpbnNpZGUgJCgoICkpICovCisjZGVmaW5lIFNIRVJFREVMSU0JMTEJLyogcGFyc2luZyA8PCw8PC0gZGVsaW1pdGVyICovCisjZGVmaW5lIFNIRVJFRFFVT1RFCTEyCS8qIHBhcnNpbmcgIiBpbiA8PCw8PC0gZGVsaW1pdGVyICovCisjZGVmaW5lIFNQQVRURVJOCTEzCS8qIHBhcnNpbmcgKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KKyNkZWZpbmUgU1RCUkFDRQkJMTQJLyogcGFyc2luZyAkey4uLlsjJV0uLi59ICovCisjZGVmaW5lIFNMRVRBUlJBWQkxNQkvKiBpbnNpZGUgPSggKSwganVzdCBjb3B5ICovCisjZGVmaW5lIFNBREVMSU0JCTE2CS8qIGxpa2UgU0JBU0UsIGxvb2tpbmcgZm9yIGRlbGltaXRlciAqLworI2RlZmluZSBTSEVSRVNUUklORwkxNwkvKiBwYXJzaW5nIDw8PCBzdHJpbmcgKi8KKworLyogU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxleGluZyBzdGF0ZSBhbmQgdGhlIHZhcmlvdXMgcGllY2VzIG9mIGluZm8KKyAqIG5lZWRlZCBmb3IgZWFjaCBwYXJ0aWN1bGFyIHN0YXRlLiAqLwordHlwZWRlZiBzdHJ1Y3QgbGV4X3N0YXRlIExleF9zdGF0ZTsKK3N0cnVjdCBsZXhfc3RhdGUgeworCWludCBsc19zdGF0ZTsKKwl1bmlvbiB7CisJCS8qICQoLi4uKSAqLworCQlzdHJ1Y3Qgc2NzcGFyZW5faW5mbyB7CisJCQlpbnQgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2lzICovCisJCQlpbnQgY3NzdGF0ZTsJLyogWFhYIHJlbW92ZSAqLworI2RlZmluZSBsc19zY3NwYXJlbiBsc19pbmZvLnVfc2NzcGFyZW4KKwkJfSB1X3Njc3BhcmVuOworCisJCS8qICQoKC4uLikpICovCisJCXN0cnVjdCBzYXNwYXJlbl9pbmZvIHsKKwkJCWludCBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzaXMgKi8KKwkJCWludCBzdGFydDsJLyogbWFya3Mgc3RhcnQgb2YgJCgoIGluIG91dHB1dCBzdHIgKi8KKyNkZWZpbmUgbHNfc2FzcGFyZW4gbHNfaW5mby51X3Nhc3BhcmVuCisJCX0gdV9zYXNwYXJlbjsKKworCQkvKiAoKC4uLikpICovCisJCXN0cnVjdCBzbGV0cGFyZW5faW5mbyB7CisJCQlpbnQgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2lzICovCisjZGVmaW5lIGxzX3NsZXRwYXJlbiBsc19pbmZvLnVfc2xldHBhcmVuCisJCX0gdV9zbGV0cGFyZW47CisKKwkJLyogYC4uLmAgKi8KKwkJc3RydWN0IHNicXVvdGVfaW5mbyB7CisJCQlpbnQgaW5kcXVvdGVzOwkvKiB0cnVlIGlmIGluIGRvdWJsZSBxdW90ZXM6ICJgLi4uYCIgKi8KKyNkZWZpbmUgbHNfc2JxdW90ZSBsc19pbmZvLnVfc2JxdW90ZQorCQl9IHVfc2JxdW90ZTsKKworI2lmbmRlZiBNS1NIX1NNQUxMCisJCS8qID0oLi4uKSAqLworCQlzdHJ1Y3Qgc2xldGFycmF5X2luZm8geworCQkJaW50IG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNlcyAqLworI2RlZmluZSBsc19zbGV0YXJyYXkgbHNfaW5mby51X3NsZXRhcnJheQorCQl9IHVfc2xldGFycmF5OworI2VuZGlmCisKKwkJLyogQURFTElNICovCisJCXN0cnVjdCBzYWRlbGltX2luZm8geworCQkJdW5zaWduZWQgY2hhciBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzZXMgKi8KKyNkZWZpbmUgU0FERUxJTV9CQVNICTAKKyNkZWZpbmUgU0FERUxJTV9NQUtFCTEKKwkJCXVuc2lnbmVkIGNoYXIgc3R5bGU7CisJCQl1bnNpZ25lZCBjaGFyIGRlbGltaXRlcjsKKwkJCXVuc2lnbmVkIGNoYXIgbnVtOworCQkJdW5zaWduZWQgY2hhciBmbGFnczsJLyogb2ZzLiBpbnRvIHNhZGVsaW1fZmxhZ3NbXSAqLworI2RlZmluZSBsc19zYWRlbGltIGxzX2luZm8udV9zYWRlbGltCisJCX0gdV9zYWRlbGltOworCisJCS8qICQnLi4uJyAqLworCQlzdHJ1Y3Qgc2VxdW90ZV9pbmZvIHsKKwkJCWJvb2wgZ290X05VTDsJLyogaWdub3JlIHJlc3Qgb2Ygc3RyaW5nICovCisjZGVmaW5lIGxzX3NlcXVvdGUgbHNfaW5mby51X3NlcXVvdGUKKwkJfSB1X3NlcXVvdGU7CisKKwkJTGV4X3N0YXRlICpiYXNlOwkvKiB1c2VkIHRvIHBvaW50IHRvIG5leHQgc3RhdGUgYmxvY2sgKi8KKwl9IGxzX2luZm87Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJTGV4X3N0YXRlICpiYXNlOworCUxleF9zdGF0ZSAqZW5kOworfSBTdGF0ZV9pbmZvOworCitzdGF0aWMgdm9pZCByZWFkaGVyZShzdHJ1Y3QgaW93b3JkICopOworc3RhdGljIGludCBnZXRzY19fKHZvaWQpOworc3RhdGljIHZvaWQgZ2V0c2NfbGluZShTb3VyY2UgKik7CitzdGF0aWMgaW50IGdldHNjX2JuKHZvaWQpOworc3RhdGljIGludCBzX2dldCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNfcHV0KGludCk7CitzdGF0aWMgY2hhciAqZ2V0X2JyYWNlX3ZhcihYU3RyaW5nICosIGNoYXIgKik7CitzdGF0aWMgaW50IGFycmF5c3ViKGNoYXIgKiopOworc3RhdGljIGNvbnN0IGNoYXIgKnVuZ2V0c2MoaW50KTsKK3N0YXRpYyB2b2lkIGdldGhlcmUoYm9vbCk7CitzdGF0aWMgTGV4X3N0YXRlICpwdXNoX3N0YXRlXyhTdGF0ZV9pbmZvICosIExleF9zdGF0ZSAqKTsKK3N0YXRpYyBMZXhfc3RhdGUgKnBvcF9zdGF0ZV8oU3RhdGVfaW5mbyAqLCBMZXhfc3RhdGUgKik7CisKK3N0YXRpYyBpbnQgZG9wcHJvbXB0KGNvbnN0IGNoYXIgKiwgaW50LCBib29sKTsKKworc3RhdGljIGludCBiYWNrc2xhc2hfc2tpcDsKK3N0YXRpYyBpbnQgaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lOworCisvKiBvcHRpbWlzZWQgZ2V0c2NfYm4oKSAqLworI2RlZmluZSBfZ2V0c2MoKQkoKnNvdXJjZS0+c3RyICE9ICdcMCcgJiYgKnNvdXJjZS0+c3RyICE9ICdcXCcgXAorCQkJICYmICFiYWNrc2xhc2hfc2tpcCAmJiAhKHNvdXJjZS0+ZmxhZ3MgJiBTRl9GSVJTVCkgXAorCQkJID8gKnNvdXJjZS0+c3RyKysgOiBnZXRzY19ibigpKQorLyogb3B0aW1pc2VkIGdldHNjX18oKSAqLworI2RlZmluZQlfZ2V0c2NfKCkJKCgqc291cmNlLT5zdHIgIT0gJ1wwJykgJiYgIShzb3VyY2UtPmZsYWdzICYgU0ZfRklSU1QpIFwKKwkJCSA/ICpzb3VyY2UtPnN0cisrIDogZ2V0c2NfXygpKQorCisjaWZkZWYgTUtTSF9TTUFMTAorc3RhdGljIGludCBnZXRzYyh2b2lkKTsKK3N0YXRpYyBpbnQgZ2V0c2NfKHZvaWQpOworCitzdGF0aWMgaW50CitnZXRzYyh2b2lkKQoreworCXJldHVybiAoX2dldHNjKCkpOworfQorCitzdGF0aWMgaW50CitnZXRzY18odm9pZCkKK3sKKwlyZXR1cm4gKF9nZXRzY18oKSk7Cit9CisjZWxzZQorLyogIU1LU0hfU01BTEw6IHVzZSB0aGVtIGlubGluZSAqLworI2RlZmluZSBnZXRzYygpCQlfZ2V0c2MoKQorI2RlZmluZSBnZXRzY18oKQlfZ2V0c2NfKCkKKyNlbmRpZgorCisjZGVmaW5lIFNUQVRFX0JTSVpFCTMyCisKKyNkZWZpbmUgUFVTSF9TVEFURShzKQlkbyB7CQkJCQlcCisJaWYgKCsrc3RhdGVwID09IHN0YXRlX2luZm8uZW5kKQkJCQlcCisJCXN0YXRlcCA9IHB1c2hfc3RhdGVfKCZzdGF0ZV9pbmZvLCBzdGF0ZXApOwlcCisJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0gKHMpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFBPUF9TVEFURSgpCWRvIHsJCQkJCVwKKwlpZiAoLS1zdGF0ZXAgPT0gc3RhdGVfaW5mby5iYXNlKQkJCVwKKwkJc3RhdGVwID0gcG9wX3N0YXRlXygmc3RhdGVfaW5mbywgc3RhdGVwKTsJXAorCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiBMZXhpY2FsIGFuYWx5c2VyCisgKgorICogdG9rZW5zIGFyZSBub3QgcmVndWxhciBleHByZXNzaW9ucywgdGhleSBhcmUgTEwoMSkuCisgKiBmb3IgZXhhbXBsZSwgIiR7dmFyOi0ke1BXRH19IiwgYW5kICIkKHNpemUgJCh3aGVuY2Uga3NoKSkiLgorICogaGVuY2UgdGhlIHN0YXRlIHN0YWNrLgorICovCisKK2ludAoreXlsZXgoaW50IGNmKQoreworCUxleF9zdGF0ZSBzdGF0ZXNbU1RBVEVfQlNJWkVdLCAqc3RhdGVwLCAqczIsICpiYXNlOworCVN0YXRlX2luZm8gc3RhdGVfaW5mbzsKKwlpbnQgYywgYzIsIHN0YXRlOworCVhTdHJpbmcgd3M7CQkvKiBleHBhbmRhYmxlIG91dHB1dCB3b3JkICovCisJY2hhciAqd3A7CQkvKiBvdXRwdXQgd29yZCBwb2ludGVyICovCisJY2hhciAqc3AsICpkcDsKKworIEFnYWluOgorCXN0YXRlc1swXS5sc19zdGF0ZSA9IC0xOworCXN0YXRlc1swXS5sc19pbmZvLmJhc2UgPSBOVUxMOworCXN0YXRlcCA9ICZzdGF0ZXNbMV07CisJc3RhdGVfaW5mby5iYXNlID0gc3RhdGVzOworCXN0YXRlX2luZm8uZW5kID0gJnN0YXRlX2luZm8uYmFzZVtTVEFURV9CU0laRV07CisKKwlYaW5pdCh3cywgd3AsIDY0LCBBVEVNUCk7CisKKwliYWNrc2xhc2hfc2tpcCA9IDA7CisJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lID0gMDsKKworCWlmIChjZiZPTkVXT1JEKQorCQlzdGF0ZSA9IFNXT1JEOworCWVsc2UgaWYgKGNmJkxFVEVYUFIpIHsKKwkJLyogZW5jbG9zZSBhcmd1bWVudHMgaW4gKGRvdWJsZSkgcXVvdGVzICovCisJCSp3cCsrID0gT1FVT1RFOworCQlzdGF0ZSA9IFNMRVRQQVJFTjsKKwkJc3RhdGVwLT5sc19zbGV0cGFyZW4ubnBhcmVuID0gMDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCX0gZWxzZSBpZiAoY2YmTEVUQVJSQVkpIHsKKwkJc3RhdGUgPSBTTEVUQVJSQVk7CisJCXN0YXRlcC0+bHNfc2xldGFycmF5Lm5wYXJlbiA9IDA7CisjZW5kaWYKKwl9IGVsc2UgewkJLyogbm9ybWFsIGxleGluZyAqLworCQlzdGF0ZSA9IChjZiAmIEhFUkVERUxJTSkgPyBTSEVSRURFTElNIDogU0JBU0U7CisJCXdoaWxlICgoYyA9IGdldHNjKCkpID09ICcgJyB8fCBjID09ICdcdCcpCisJCQk7CisJCWlmIChjID09ICcjJykgeworCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7CisJCQl3aGlsZSAoKGMgPSBnZXRzYygpKSAhPSAnXDAnICYmIGMgIT0gJ1xuJykKKwkJCQk7CisJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKKwkJfQorCQl1bmdldHNjKGMpOworCX0KKwlpZiAoc291cmNlLT5mbGFncyAmIFNGX0FMSUFTKSB7CS8qIHRyYWlsaW5nICcgJyBpbiBhbGlhcyBkZWZpbml0aW9uICovCisJCXNvdXJjZS0+ZmxhZ3MgJj0gflNGX0FMSUFTOworCQljZiB8PSBBTElBUzsKKwl9CisKKwkvKiBJbml0aWFsIHN0YXRlOiBvbmUgb2YgU0JBU0UgU0hFUkVERUxJTSBTV09SRCBTQVNQQVJFTiAqLworCXN0YXRlcC0+bHNfc3RhdGUgPSBzdGF0ZTsKKworCS8qIGNoZWNrIGZvciBoZXJlIHN0cmluZyAqLworCWlmIChzdGF0ZSA9PSBTSEVSRURFTElNKSB7CisJCWMgPSBnZXRzYygpOworCQlpZiAoYyA9PSAnPCcpIHsKKwkJCXN0YXRlID0gU0hFUkVTVFJJTkc7CisJCQl3aGlsZSAoKGMgPSBnZXRzYygpKSA9PSAnICcgfHwgYyA9PSAnXHQnKQorCQkJCTsKKwkJCXVuZ2V0c2MoYyk7CisJCQljID0gJzwnOworCQkJZ290byBhY2NlcHRfbm9ud29yZDsKKwkJfQorCQl1bmdldHNjKGMpOworCX0KKworCS8qIGNvbGxlY3Qgbm9uLXNwZWNpYWwgb3IgcXVvdGVkIGNoYXJhY3RlcnMgdG8gZm9ybSB3b3JkICovCisJd2hpbGUgKCEoKGMgPSBnZXRzYygpKSA9PSAwIHx8CisJICAgICgoc3RhdGUgPT0gU0JBU0UgfHwgc3RhdGUgPT0gU0hFUkVERUxJTSB8fCBzdGF0ZSA9PSBTSEVSRVNUUklORykgJiYKKwkgICAgY3R5cGUoYywgQ19MRVgxKSkpKSB7CisgYWNjZXB0X25vbndvcmQ6CisJCVhjaGVjayh3cywgd3ApOworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU0FERUxJTToKKwkJCWlmIChjID09ICcoJykKKwkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuKys7CisJCQllbHNlIGlmIChjID09ICcpJykKKwkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuLS07CisJCQllbHNlIGlmIChzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuID09IDAgJiYKKwkJCSAgICAoYyA9PSAvKnsqLyAnfScgfHwgYyA9PSBzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyKSkgeworCQkJCSp3cCsrID0gQURFTElNOworCQkJCSp3cCsrID0gYzsKKwkJCQlpZiAoYyA9PSAvKnsqLyAnfScgfHwgLS1zdGF0ZXAtPmxzX3NhZGVsaW0ubnVtID09IDApCisJCQkJCVBPUF9TVEFURSgpOworCQkJCWlmIChjID09IC8qeyovICd9JykKKwkJCQkJUE9QX1NUQVRFKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIFNCQVNFOgorCQkJaWYgKGMgPT0gJ1snICYmIChjZiAmIChWQVJBU058QVJSQVlWQVIpKSkgeworCQkJCSp3cCA9IEVPUzsJLyogdGVtcG9yYXJ5ICovCisJCQkJaWYgKGlzX3dkdmFybmFtZShYc3RyaW5nKHdzLCB3cCksIGZhbHNlKSkgeworCQkJCQljaGFyICpwLCAqdG1wOworCisJCQkJCWlmIChhcnJheXN1YigmdG1wKSkgeworCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJKndwKysgPSBjOworCQkJCQkJZm9yIChwID0gdG1wOyAqcDsgKSB7CisJCQkJCQkJWGNoZWNrKHdzLCB3cCk7CisJCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJCSp3cCsrID0gKnArKzsKKwkJCQkJCX0KKwkJCQkJCWFmcmVlKHRtcCwgQVRFTVApOworCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlTb3VyY2UgKnM7CisKKwkJCQkJCXMgPSBwdXNocyhTUkVSRUFELAorCQkJCQkJICAgIHNvdXJjZS0+YXJlYXApOworCQkJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPQorCQkJCQkJICAgIHMtPnUuZnJlZW1lID0gdG1wOworCQkJCQkJcy0+bmV4dCA9IHNvdXJjZTsKKwkJCQkJCXNvdXJjZSA9IHM7CisJCQkJCX0KKwkJCQl9CisJCQkJKndwKysgPSBDSEFSOworCQkJCSp3cCsrID0gYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZBTExUSFJPVUdIICovCisgU2Jhc2UxOgkJLyogaW5jbHVkZXMgKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KKwkJCWlmIChjID09ICcqJyB8fCBjID09ICdAJyB8fCBjID09ICcrJyB8fCBjID09ICc/JyB8fAorCQkJICAgIGMgPT0gJyEnKSB7CisJCQkJYzIgPSBnZXRzYygpOworCQkJCWlmIChjMiA9PSAnKCcgLyopKi8gKSB7CisJCQkJCSp3cCsrID0gT1BBVDsKKwkJCQkJKndwKysgPSBjOworCQkJCQlQVVNIX1NUQVRFKFNQQVRURVJOKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXVuZ2V0c2MoYzIpOworCQkJfQorCQkJLyogRkFMTFRIUk9VR0ggKi8KKyBTYmFzZTI6CQkvKiBkb2Vzbid0IGluY2x1ZGUgKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXFwnOgorIGdldHNjX3FjaGFyOgorCQkJCWlmICgoYyA9IGdldHNjKCkpKSB7CisJCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLworCQkJCQkqd3ArKyA9IFFDSEFSOworCQkJCQkqd3ArKyA9IGM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnXCcnOgorIG9wZW5fc3NxdW90ZToKKwkJCQkqd3ArKyA9IE9RVU9URTsKKwkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKKwkJCQlQVVNIX1NUQVRFKFNTUVVPVEUpOworCQkJCWJyZWFrOworCQkJY2FzZSAnIic6Cisgb3Blbl9zZHF1b3RlOgorCQkJCSp3cCsrID0gT1FVT1RFOworCQkJCVBVU0hfU1RBVEUoU0RRVU9URSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gU3Vic3Q7CisJCQl9CisJCQlicmVhazsKKworIFN1YnN0OgorCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdcXCc6CisJCQkJYyA9IGdldHNjKCk7CisJCQkJc3dpdGNoIChjKSB7CisJCQkJY2FzZSAnIic6CisJCQkJCWlmICgoY2YgJiBIRVJFRE9DKSkKKwkJCQkJCWdvdG8gaGVyZWRvY3F1b3RlOworCQkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJCWNhc2UgJ1xcJzoKKwkJCQljYXNlICckJzogY2FzZSAnYCc6Cisgc3RvcmVfcWNoYXI6CisJCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJCSp3cCsrID0gYzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKyBoZXJlZG9jcXVvdGU6CisJCQkJCVhjaGVjayh3cywgd3ApOworCQkJCQlpZiAoYykgeworCQkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCisJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkqd3ArKyA9ICdcXCc7CisJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkqd3ArKyA9IGM7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnJCc6Cisgc3Vic3RfZG9sbGFyOgorCQkJCWMgPSBnZXRzYygpOworCQkJCWlmIChjID09ICcoJykgLyopKi8geworCQkJCQljID0gZ2V0c2MoKTsKKwkJCQkJaWYgKGMgPT0gJygnKSAvKikqLyB7CisJCQkJCQlQVVNIX1NUQVRFKFNBU1BBUkVOKTsKKwkJCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuID0gMjsKKwkJCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4uc3RhcnQgPQorCQkJCQkJICAgIFhzYXZlcG9zKHdzLCB3cCk7CisJCQkJCQkqd3ArKyA9IEVYUFJTVUI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl1bmdldHNjKGMpOworCQkJCQkJUFVTSF9TVEFURShTQ1NQQVJFTik7CisJCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLm5wYXJlbiA9IDE7CisJCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAwOworCQkJCQkJKndwKysgPSBDT01TVUI7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGMgPT0gJ3snKSAvKn0qLyB7CisJCQkJCSp3cCsrID0gT1NVQlNUOworCQkJCQkqd3ArKyA9ICd7JzsgLyp9Ki8KKwkJCQkJd3AgPSBnZXRfYnJhY2VfdmFyKCZ3cywgd3ApOworCQkJCQljID0gZ2V0c2MoKTsKKwkJCQkJLyogYWxsb3cgOiMgYW5kIDolIChrc2g4OCBjb21wYXQpICovCisJCQkJCWlmIChjID09ICc6JykgeworCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJKndwKysgPSBjOworCQkJCQkJYyA9IGdldHNjKCk7CisJCQkJCQlpZiAoYyA9PSAnOicpIHsKKwkJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkJKndwKysgPSAnMCc7CisJCQkJCQkJKndwKysgPSBBREVMSU07CisJCQkJCQkJKndwKysgPSAnOic7CisJCQkJCQkJUFVTSF9TVEFURShTQlJBQ0UpOworCQkJCQkJCVBVU0hfU1RBVEUoU0FERUxJTSk7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLnN0eWxlID0gU0FERUxJTV9CQVNIOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5kZWxpbWl0ZXIgPSAnOic7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm51bSA9IDE7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9IGVsc2UgaWYgKGtzaF9pc2RpZ2l0KGMpIHx8CisJCQkJCQkgICAgYyA9PSAnKCcvKikqLyB8fCBjID09ICcgJyB8fAorCQkJCQkJICAgIGMgPT0gJyQnIC8qIFhYWCB3aGF0IGVsc2U/ICovKSB7CisJCQkJCQkJLyogc3Vic3RyaW5nIHN1YnN0LiAqLworCQkJCQkJCWlmIChjICE9ICcgJykgeworCQkJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkJCSp3cCsrID0gJyAnOworCQkJCQkJCX0KKwkJCQkJCQl1bmdldHNjKGMpOworCQkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKKwkJCQkJCQlQVVNIX1NUQVRFKFNBREVMSU0pOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5zdHlsZSA9IFNBREVMSU1fQkFTSDsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyID0gJzonOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5udW0gPSAyOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKGMgPT0gJy8nKSB7CisJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkqd3ArKyA9IGM7CisJCQkJCQlpZiAoKGMgPSBnZXRzYygpKSA9PSAnLycpIHsKKwkJCQkJCQkqd3ArKyA9IEFERUxJTTsKKwkJCQkJCQkqd3ArKyA9IGM7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQl1bmdldHNjKGMpOworCQkJCQkJUFVTSF9TVEFURShTQlJBQ0UpOworCQkJCQkJUFVTSF9TVEFURShTQURFTElNKTsKKwkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5zdHlsZSA9IFNBREVMSU1fQkFTSDsKKwkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5kZWxpbWl0ZXIgPSAnLyc7CisJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnVtID0gMTsKKwkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4gPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogSWYgdGhpcyBpcyBhIHRyaW0gb3BlcmF0aW9uLAorCQkJCQkgKiB0cmVhdCAoLHwsKSBzcGVjaWFsbHkgaW4gU1RCUkFDRS4KKwkJCQkJICovCisJCQkJCWlmIChjdHlwZShjLCBDX1NVQk9QMikpIHsKKwkJCQkJCXVuZ2V0c2MoYyk7CisJCQkJCQlQVVNIX1NUQVRFKFNUQlJBQ0UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdW5nZXRzYyhjKTsKKwkJCQkJCWlmIChzdGF0ZSA9PSBTRFFVT1RFKQorCQkJCQkJCVBVU0hfU1RBVEUoU1FCUkFDRSk7CisJCQkJCQllbHNlCisJCQkJCQkJUFVTSF9TVEFURShTQlJBQ0UpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChrc2hfaXNhbHBoeChjKSkgeworCQkJCQkqd3ArKyA9IE9TVUJTVDsKKwkJCQkJKndwKysgPSAnWCc7CisJCQkJCWRvIHsKKwkJCQkJCVhjaGVjayh3cywgd3ApOworCQkJCQkJKndwKysgPSBjOworCQkJCQkJYyA9IGdldHNjKCk7CisJCQkJCX0gd2hpbGUgKGtzaF9pc2FsbnV4KGMpKTsKKwkJCQkJKndwKysgPSAnXDAnOworCQkJCQkqd3ArKyA9IENTVUJTVDsKKwkJCQkJKndwKysgPSAnWCc7CisJCQkJCXVuZ2V0c2MoYyk7CisJCQkJfSBlbHNlIGlmIChjdHlwZShjLCBDX1ZBUjEgfCBDX0RJR0lUKSkgeworCQkJCQlYY2hlY2sod3MsIHdwKTsKKwkJCQkJKndwKysgPSBPU1VCU1Q7CisJCQkJCSp3cCsrID0gJ1gnOworCQkJCQkqd3ArKyA9IGM7CisJCQkJCSp3cCsrID0gJ1wwJzsKKwkJCQkJKndwKysgPSBDU1VCU1Q7CisJCQkJCSp3cCsrID0gJ1gnOworCQkJCX0gZWxzZSBpZiAoYyA9PSAnXCcnICYmIChzdGF0ZSA9PSBTQkFTRSkpIHsKKwkJCQkJLyogWFhYIHdoaWNoIG90aGVyIHN0YXRlcyBhcmUgdmFsaWQ/ICovCisJCQkJCSp3cCsrID0gT1FVT1RFOworCQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKKwkJCQkJUFVTSF9TVEFURShTRVFVT1RFKTsKKwkJCQkJc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJKndwKysgPSBDSEFSOworCQkJCQkqd3ArKyA9ICckJzsKKwkJCQkJdW5nZXRzYyhjKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdgJzoKKyBzdWJzdF9ncmF2aXM6CisJCQkJUFVTSF9TVEFURShTQlFVT1RFKTsKKwkJCQkqd3ArKyA9IENPTVNVQjsKKwkJCQkvKiBOZWVkIHRvIGtub3cgaWYgd2UgYXJlIGluc2lkZSBkb3VibGUgcXVvdGVzCisJCQkJICogc2luY2Ugc2gvQVQmVC1rc2ggdHJhbnNsYXRlIHRoZSBcIiB0byAiIGluCisJCQkJICogImAuLi5cIi4uLmAiLgorCQkJCSAqIFRoaXMgaXMgbm90IGRvbmUgaW4gUE9TSVggbW9kZSAoc2VjdGlvbgorCQkJCSAqIDMuMi4zLCBEb3VibGUgUXVvdGVzOiAiVGhlIGJhY2txdW90ZSBzaGFsbAorCQkJCSAqIHJldGFpbiBpdHMgc3BlY2lhbCBtZWFuaW5nIGludHJvZHVjaW5nIHRoZQorCQkJCSAqIG90aGVyIGZvcm0gb2YgY29tbWFuZCBzdWJzdGl0dXRpb24gKHNlZQorCQkJCSAqIDMuNi4zKS4gVGhlIHBvcnRpb24gb2YgdGhlIHF1b3RlZCBzdHJpbmcKKwkJCQkgKiBmcm9tIHRoZSBpbml0aWFsIGJhY2txdW90ZSBhbmQgdGhlCisJCQkJICogY2hhcmFjdGVycyB1cCB0byB0aGUgbmV4dCBiYWNrcXVvdGUgdGhhdAorCQkJCSAqIGlzIG5vdCBwcmVjZWRlZCBieSBhIGJhY2tzbGFzaCAoaGF2aW5nCisJCQkJICogZXNjYXBlIGNoYXJhY3RlcnMgcmVtb3ZlZCkgZGVmaW5lcyB0aGF0CisJCQkJICogY29tbWFuZCB3aG9zZSBvdXRwdXQgcmVwbGFjZXMgYC4uLmAgd2hlbgorCQkJCSAqIHRoZSB3b3JkIGlzIGV4cGFuZGVkLiIKKwkJCQkgKiBTZWN0aW9uIDMuNi4zLCBDb21tYW5kIFN1YnN0aXR1dGlvbjoKKwkJCQkgKiAiV2l0aGluIHRoZSBiYWNrcXVvdGVkIHN0eWxlIG9mIGNvbW1hbmQKKwkJCQkgKiBzdWJzdGl0dXRpb24sIGJhY2tzbGFzaCBzaGFsbCByZXRhaW4gaXRzCisJCQkJICogbGl0ZXJhbCBtZWFuaW5nLCBleGNlcHQgd2hlbiBmb2xsb3dlZCBieQorCQkJCSAqICQgYCBcLiIpLgorCQkJCSAqLworCQkJCXN0YXRlcC0+bHNfc2JxdW90ZS5pbmRxdW90ZXMgPSAwOworCQkJCXMyID0gc3RhdGVwOworCQkJCWJhc2UgPSBzdGF0ZV9pbmZvLmJhc2U7CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJZm9yICg7IHMyICE9IGJhc2U7IHMyLS0pIHsKKwkJCQkJCWlmIChzMi0+bHNfc3RhdGUgPT0gU0RRVU9URSkgeworCQkJCQkJCXN0YXRlcC0+bHNfc2JxdW90ZS5pbmRxdW90ZXMgPSAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChzMiAhPSBiYXNlKQorCQkJCQkJYnJlYWs7CisJCQkJCWlmICghKHMyID0gczItPmxzX2luZm8uYmFzZSkpCisJCQkJCQlicmVhazsKKwkJCQkJYmFzZSA9IHMyLS0gLSBTVEFURV9CU0laRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFFDSEFSOgorCQkJCWlmIChjZiAmIExRQ0hBUikgeworCQkJCQkqd3ArKyA9IFFDSEFSOworCQkJCQkqd3ArKyA9IGdldHNjKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJZGVmYXVsdDoKKyBzdG9yZV9jaGFyOgorCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkqd3ArKyA9IGM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNFUVVPVEU6CisJCQlpZiAoYyA9PSAnXCcnKSB7CisJCQkJUE9QX1NUQVRFKCk7CisJCQkJKndwKysgPSBDUVVPVEU7CisJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07CisJCQl9IGVsc2UgaWYgKGMgPT0gJ1xcJykgeworCQkJCWlmICgoYzIgPSB1bmJrc2wodHJ1ZSwgc19nZXQsIHNfcHV0KSkgPT0gLTEpCisJCQkJCWMyID0gc19nZXQoKTsKKwkJCQlpZiAoYzIgPT0gMCkKKwkJCQkJc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwgPSB0cnVlOworCQkJCWlmICghc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwpIHsKKwkJCQkJY2hhciB0c1s0XTsKKworCQkJCQlpZiAoKHVuc2lnbmVkIGludCljMiA8IDB4MTAwKSB7CisJCQkJCQkqd3ArKyA9IFFDSEFSOworCQkJCQkJKndwKysgPSBjMjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWMgPSB1dGZfd2N0b21iKHRzLCBjMiAtIDB4MTAwKTsKKwkJCQkJCXRzW2NdID0gMDsKKwkJCQkJCWZvciAoYyA9IDA7IHRzW2NdOyArK2MpIHsKKwkJCQkJCQkqd3ArKyA9IFFDSEFSOworCQkJCQkJCSp3cCsrID0gdHNbY107CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCkgeworCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJKndwKysgPSBjOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU1FVT1RFOgorCQkJaWYgKGMgPT0gJ1wnJykgeworCQkJCVBPUF9TVEFURSgpOworCQkJCSp3cCsrID0gQ1FVT1RFOworCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZS0tOworCQkJfSBlbHNlIHsKKwkJCQkqd3ArKyA9IFFDSEFSOworCQkJCSp3cCsrID0gYzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0RRVU9URToKKwkJCWlmIChjID09ICciJykgeworCQkJCVBPUF9TVEFURSgpOworCQkJCSp3cCsrID0gQ1FVT1RFOworCQkJfSBlbHNlCisJCQkJZ290byBTdWJzdDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NTUEFSRU46CS8qICQoIC4uLiApICovCisJCQkvKiB0b2RvOiBkZWFsIHdpdGggJCguLi4pIHF1b3RpbmcgcHJvcGVybHkKKwkJCSAqIGtsdWRnZSB0byBwYXJ0bHkgZmFrZSBxdW90aW5nIGluc2lkZSAkKC4uLik6IGRvZXNuJ3QKKwkJCSAqIHJlYWxseSB3b3JrIGJlY2F1c2UgbmVzdGVkICQoLi4uKSBvciAkey4uLn0gaW5zaWRlCisJCQkgKiBkb3VibGUgcXVvdGVzIGFyZW4ndCBkZWFsdCB3aXRoLgorCQkJICovCisJCQlzd2l0Y2ggKHN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSkgeworCQkJY2FzZSAwOgkvKiBub3JtYWwgKi8KKwkJCQlzd2l0Y2ggKGMpIHsKKwkJCQljYXNlICcoJzoKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4rKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKSc6CisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuLS07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xcJzoKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnIic6CisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wnJzoKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gNDsKKwkJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAxOgkvKiBiYWNrc2xhc2ggaW4gbm9ybWFsIG1vZGUgKi8KKwkJCWNhc2UgMzoJLyogYmFja3NsYXNoIGluIGRvdWJsZSBxdW90ZXMgKi8KKwkJCQktLXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgkvKiBkb3VibGUgcXVvdGVzICovCisJCQkJaWYgKGMgPT0gJyInKQorCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAwOworCQkJCWVsc2UgaWYgKGMgPT0gJ1xcJykKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMzsKKwkJCQlicmVhazsKKworCQkJY2FzZSA0OgkvKiBzaW5nbGUgcXVvdGVzICovCisJCQkJaWYgKGMgPT0gJ1wnJykgeworCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAwOworCQkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4gPT0gMCkgeworCQkJCVBPUF9TVEFURSgpOworCQkJCSp3cCsrID0gMDsJLyogZW5kIG9mIENPTVNVQiAqLworCQkJfSBlbHNlCisJCQkJKndwKysgPSBjOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQVNQQVJFTjoJLyogJCgoIC4uLiApKSAqLworCQkJLyogWFhYIHNob3VsZCBuZXN0IHVzaW5nIGV4aXN0aW5nIHN0YXRlIG1hY2hpbmUKKwkJCSAqIChlbWJlZCAiLi4uIiwgJCguLi4pLCBldGMuKSAqLworCQkJaWYgKGMgPT0gJygnKQorCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuKys7CisJCQllbHNlIGlmIChjID09ICcpJykgeworCQkJCXN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuLS07CisJCQkJaWYgKHN0YXRlcC0+bHNfc2FzcGFyZW4ubnBhcmVuID09IDEpIHsKKwkJCQkJLyooKi8KKwkJCQkJaWYgKChjMiA9IGdldHNjKCkpID09ICcpJykgeworCQkJCQkJUE9QX1NUQVRFKCk7CisJCQkJCQkvKiBlbmQgb2YgRVhQUlNVQiAqLworCQkJCQkJKndwKysgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljaGFyICpzOworCisJCQkJCQl1bmdldHNjKGMyKTsKKwkJCQkJCS8qIG1pc21hdGNoZWQgcGFyZW50aGVzaXMgLQorCQkJCQkJICogYXNzdW1lIHdlIHdlcmUgcmVhbGx5CisJCQkJCQkgKiBwYXJzaW5nIGEgJCguLi4pIGV4cHJlc3Npb24KKwkJCQkJCSAqLworCQkJCQkJcyA9IFhyZXN0cG9zKHdzLCB3cCwKKwkJCQkJCSAgICBzdGF0ZXAtPmxzX3Nhc3BhcmVuLnN0YXJ0KTsKKwkJCQkJCW1lbW1vdmUocyArIDEsIHMsIHdwIC0gcyk7CisJCQkJCQkqcysrID0gQ09NU1VCOworCQkJCQkJKnMgPSAnKCc7IC8qKSovCisJCQkJCQl3cCsrOworCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4gPSAxOworCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKKwkJCQkJCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9CisJCQkJCQkgICAgU0NTUEFSRU47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkqd3ArKyA9IGM7CisJCQlicmVhazsKKworCQljYXNlIFNRQlJBQ0U6CisJCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkJLyoKKwkJCQkgKiBwZXJmb3JtIFBPU0lYICJxdW90ZSByZW1vdmFsIiBpZiB0aGUgYmFjay0KKwkJCQkgKiBzbGFzaCBpcyAic3BlY2lhbCIsIGkuZS4gc2FtZSBjYXNlcyBhcyB0aGUKKwkJCQkgKiB7Y2FzZSAnXFwnOn0gaW4gU3Vic3Q6IHBsdXMgY2xvc2luZyBicmFjZTsKKwkJCQkgKiBpbiBta3NoIGNvZGUgInF1b3RlIHJlbW92YWwiIG9uICdcYycgbWVhbnMKKwkJCQkgKiB3cml0ZSBRQ0hBUitjLCBvdGhlcndpc2UgQ0hBUitcK0NIQVIrYyBhcmUKKwkJCQkgKiBlbWl0dGVkIChpbiBoZXJlZG9jcXVvdGU6KQorCQkJCSAqLworCQkJCWlmICgoYyA9IGdldHNjKCkpID09ICciJyB8fCBjID09ICdcXCcgfHwKKwkJCQkgICAgYyA9PSAnJCcgfHwgYyA9PSAnYCcgfHwgYyA9PSAvKnsqLyd9JykKKwkJCQkJZ290byBzdG9yZV9xY2hhcjsKKwkJCQlnb3RvIGhlcmVkb2NxdW90ZTsKKwkJCX0KKwkJCWdvdG8gY29tbW9uX1NRQlJBQ0U7CisKKwkJY2FzZSBTQlJBQ0U6CisJCQlpZiAoYyA9PSAnXCcnKQorCQkJCWdvdG8gb3Blbl9zc3F1b3RlOworCQkJZWxzZSBpZiAoYyA9PSAnXFwnKQorCQkJCWdvdG8gZ2V0c2NfcWNoYXI7CisgY29tbW9uX1NRQlJBQ0U6CisJCQlpZiAoYyA9PSAnIicpCisJCQkJZ290byBvcGVuX3NkcXVvdGU7CisJCQllbHNlIGlmIChjID09ICckJykKKwkJCQlnb3RvIHN1YnN0X2RvbGxhcjsKKwkJCWVsc2UgaWYgKGMgPT0gJ2AnKQorCQkJCWdvdG8gc3Vic3RfZ3JhdmlzOworCQkJZWxzZSBpZiAoYyAhPSAvKnsqLyAnfScpCisJCQkJZ290byBzdG9yZV9jaGFyOworCQkJUE9QX1NUQVRFKCk7CisJCQkqd3ArKyA9IENTVUJTVDsKKwkJCSp3cCsrID0gLyp7Ki8gJ30nOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVEJSQUNFOgorCQkJLyogU2FtZSBhcyBTQkFTRSwgZXhjZXB0ICgsfCwpIHRyZWF0ZWQgc3BlY2lhbGx5ICovCisJCQlpZiAoYyA9PSAvKnsqLyAnfScpIHsKKwkJCQlQT1BfU1RBVEUoKTsKKwkJCQkqd3ArKyA9IENTVUJTVDsKKwkJCQkqd3ArKyA9IC8qeyovICd9JzsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnfCcpIHsKKwkJCQkqd3ArKyA9IFNQQVQ7CisJCQl9IGVsc2UgaWYgKGMgPT0gJygnKSB7CisJCQkJKndwKysgPSBPUEFUOworCQkJCSp3cCsrID0gJyAnOwkvKiBzaW1pbGUgZm9yIEAgKi8KKwkJCQlQVVNIX1NUQVRFKFNQQVRURVJOKTsKKwkJCX0gZWxzZQorCQkJCWdvdG8gU2Jhc2UxOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQlFVT1RFOgorCQkJaWYgKGMgPT0gJ2AnKSB7CisJCQkJKndwKysgPSAwOworCQkJCVBPUF9TVEFURSgpOworCQkJfSBlbHNlIGlmIChjID09ICdcXCcpIHsKKwkJCQlzd2l0Y2ggKGMgPSBnZXRzYygpKSB7CisJCQkJY2FzZSAnXFwnOgorCQkJCWNhc2UgJyQnOiBjYXNlICdgJzoKKwkJCQkJKndwKysgPSBjOworCQkJCQlicmVhazsKKwkJCQljYXNlICciJzoKKwkJCQkJaWYgKHN0YXRlcC0+bHNfc2JxdW90ZS5pbmRxdW90ZXMpIHsKKwkJCQkJCSp3cCsrID0gYzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQkJZGVmYXVsdDoKKwkJCQkJaWYgKGMpIHsKKwkJCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLworCQkJCQkJKndwKysgPSAnXFwnOworCQkJCQkJKndwKysgPSBjOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCSp3cCsrID0gYzsKKwkJCWJyZWFrOworCisJCWNhc2UgU1dPUkQ6CS8qIE9ORVdPUkQgKi8KKwkJCWdvdG8gU3Vic3Q7CisKKwkJY2FzZSBTTEVUUEFSRU46CS8qIExFVEVYUFI6ICgoIC4uLiApKSAqLworCQkJLyooKi8KKwkJCWlmIChjID09ICcpJykgeworCQkJCWlmIChzdGF0ZXAtPmxzX3NsZXRwYXJlbi5ucGFyZW4gPiAwKQorCQkJCQktLXN0YXRlcC0+bHNfc2xldHBhcmVuLm5wYXJlbjsKKwkJCQllbHNlIGlmICgoYzIgPSBnZXRzYygpKSA9PSAvKigqLyAnKScpIHsKKwkJCQkJYyA9IDA7CisJCQkJCSp3cCsrID0gQ1FVT1RFOworCQkJCQlnb3RvIERvbmU7CisJCQkJfSBlbHNlIHsKKwkJCQkJU291cmNlICpzOworCisJCQkJCXVuZ2V0c2MoYzIpOworCQkJCQkvKiBtaXNtYXRjaGVkIHBhcmVudGhlc2lzIC0KKwkJCQkJICogYXNzdW1lIHdlIHdlcmUgcmVhbGx5CisJCQkJCSAqIHBhcnNpbmcgYSAkKC4uLikgZXhwcmVzc2lvbgorCQkJCQkgKi8KKwkJCQkJKndwID0gRU9TOworCQkJCQlzcCA9IFhzdHJpbmcod3MsIHdwKTsKKwkJCQkJZHAgPSB3ZHN0cmlwKHNwLCB0cnVlLCBmYWxzZSk7CisJCQkJCXMgPSBwdXNocyhTUkVSRUFELCBzb3VyY2UtPmFyZWFwKTsKKwkJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSBzLT51LmZyZWVtZSA9IGRwOworCQkJCQlzLT5uZXh0ID0gc291cmNlOworCQkJCQlzb3VyY2UgPSBzOworCQkJCQlyZXR1cm4gKCcoJy8qKSovKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGMgPT0gJygnKQorCQkJCS8qIHBhcmVudGhlc2lzIGluc2lkZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzCisJCQkJICogYXJlIGxvc3QsIGJ1dCBBVCZUIGtzaCBkb2Vzbid0IGNvdW50IHRoZW0KKwkJCQkgKiBlaXRoZXIKKwkJCQkgKi8KKwkJCQkrK3N0YXRlcC0+bHNfc2xldHBhcmVuLm5wYXJlbjsKKwkJCWdvdG8gU2Jhc2UyOworCisjaWZuZGVmIE1LU0hfU01BTEwKKwkJY2FzZSBTTEVUQVJSQVk6CS8qIExFVEFSUkFZOiA9KCAuLi4gKSAqLworCQkJaWYgKGMgPT0gJygnLyopKi8pCisJCQkJKytzdGF0ZXAtPmxzX3NsZXRhcnJheS5ucGFyZW47CisJCQllbHNlIGlmIChjID09IC8qKCovJyknKQorCQkJCWlmIChzdGF0ZXAtPmxzX3NsZXRhcnJheS5ucGFyZW4tLSA9PSAwKSB7CisJCQkJCWMgPSAwOworCQkJCQlnb3RvIERvbmU7CisJCQkJfQorCQkJKndwKysgPSBDSEFSOworCQkJKndwKysgPSBjOworCQkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlIFNIRVJFU1RSSU5HOgkvKiA8PDwgZGVsaW1pdGVyICovCisJCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkJYyA9IGdldHNjKCk7CisJCQkJaWYgKGMpIHsKKwkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCisJCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJCSp3cCsrID0gYzsKKwkJCQl9CisJCQkJLyogaW52b2tlIHF1b3RpbmcgbW9kZSAqLworCQkJCVhzdHJpbmcod3MsIHdwKVswXSA9IFFDSEFSOworCQkJfSBlbHNlIGlmIChjID09ICckJykgeworCQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSAnXCcnKSB7CisJCQkJCVBVU0hfU1RBVEUoU0VRVU9URSk7CisJCQkJCXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMID0gZmFsc2U7CisJCQkJCWdvdG8gc2hlcmVzdHJpbmdfcXVvdGVkOworCQkJCX0KKwkJCQl1bmdldHNjKGMyKTsKKwkJCQlnb3RvIHNoZXJlc3RyaW5nX3JlZ3VsYXI7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJykgeworCQkJCVBVU0hfU1RBVEUoU1NRVU9URSk7Cisgc2hlcmVzdHJpbmdfcXVvdGVkOgorCQkJCSp3cCsrID0gT1FVT1RFOworCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOworCQkJCS8qIGludm9rZSBxdW90aW5nIG1vZGUgKi8KKwkJCQlYc3RyaW5nKHdzLCB3cClbMF0gPSBRQ0hBUjsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKwkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPSBTSEVSRURRVU9URTsKKwkJCQkqd3ArKyA9IE9RVU9URTsKKwkJCQkvKiBqdXN0IGRvbid0IElGUyBzcGxpdDsgbm8gcXVvdGluZyBtb2RlICovCisJCQl9IGVsc2UgeworIHNoZXJlc3RyaW5nX3JlZ3VsYXI6CisJCQkJKndwKysgPSBDSEFSOworCQkJCSp3cCsrID0gYzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0hFUkVERUxJTToJLyogPDwsPDwtIGRlbGltaXRlciAqLworCQkJLyogWFhYIGNodWNrIHRoaXMgc3RhdGUgKGFuZCB0aGUgbmV4dCkgLSB1c2UKKwkJCSAqIHRoZSBleGlzdGluZyBzdGF0ZXMgKCQgYW5kIFxgLi4uYCBzaG91bGQgYmUKKwkJCSAqIHN0cmlwcGVkIG9mIHRoZWlyIHNwZWNpYWxuZXNzIGFmdGVyIHRoZQorCQkJICogZmFjdCkuCisJCQkgKi8KKwkJCS8qIGhlcmUgZGVsaW1pdGVycyBuZWVkIGEgc3BlY2lhbCBjYXNlIHNpbmNlCisJCQkgKiAkIGFuZCBgLi4uYCBhcmUgbm90IHRvIGJlIHRyZWF0ZWQgc3BlY2lhbGx5CisJCQkgKi8KKwkJCWlmIChjID09ICdcXCcpIHsKKwkJCQljID0gZ2V0c2MoKTsKKwkJCQlpZiAoYykgeworCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KKwkJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkJKndwKysgPSBjOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYyA9PSAnJCcpIHsKKwkJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gJ1wnJykgeworCQkJCQlQVVNIX1NUQVRFKFNFUVVPVEUpOworCQkJCQlzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCA9IGZhbHNlOworCQkJCQlnb3RvIHNoZXJlZGVsaW1fcXVvdGVkOworCQkJCX0KKwkJCQl1bmdldHNjKGMyKTsKKwkJCQlnb3RvIHNoZXJlZGVsaW1fcmVndWxhcjsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnXCcnKSB7CisJCQkJUFVTSF9TVEFURShTU1FVT1RFKTsKKyBzaGVyZWRlbGltX3F1b3RlZDoKKwkJCQkqd3ArKyA9IE9RVU9URTsKKwkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKwkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPSBTSEVSRURRVU9URTsKKwkJCQkqd3ArKyA9IE9RVU9URTsKKwkJCX0gZWxzZSB7Cisgc2hlcmVkZWxpbV9yZWd1bGFyOgorCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkqd3ArKyA9IGM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNIRVJFRFFVT1RFOgkvKiAiIGluIDw8LDw8LSBkZWxpbWl0ZXIgKi8KKwkJCWlmIChjID09ICciJykgeworCQkJCSp3cCsrID0gQ1FVT1RFOworCQkJCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9CisJCQkJICAgIC8qIGRwWzFdID09ICc8JyBtZWFucyBoZXJlIHN0cmluZyAqLworCQkJCSAgICBYc3RyaW5nKHdzLCB3cClbMV0gPT0gJzwnID8KKwkJCQkgICAgU0hFUkVTVFJJTkcgOiBTSEVSRURFTElNOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkJCXN3aXRjaCAoYyA9IGdldHNjKCkpIHsKKwkJCQkJY2FzZSAnXFwnOiBjYXNlICciJzoKKwkJCQkJY2FzZSAnJCc6IGNhc2UgJ2AnOgorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoYykgeworCQkJCQkJCS8qIHRyYWlsaW5nIFwgbG9zdCAqLworCQkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCQkqd3ArKyA9ICdcXCc7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkqd3ArKyA9IENIQVI7CisJCQkJKndwKysgPSBjOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTUEFUVEVSTjoJLyogaW4gKiguLi58Li4uKSBwYXR0ZXJuICgqKz9AISkgKi8KKwkJCWlmICggLyooKi8gYyA9PSAnKScpIHsKKwkJCQkqd3ArKyA9IENQQVQ7CisJCQkJUE9QX1NUQVRFKCk7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ3wnKSB7CisJCQkJKndwKysgPSBTUEFUOworCQkJfSBlbHNlIGlmIChjID09ICcoJykgeworCQkJCSp3cCsrID0gT1BBVDsKKwkJCQkqd3ArKyA9ICcgJzsJLyogc2ltaWxlIGZvciBAICovCisJCQkJUFVTSF9TVEFURShTUEFUVEVSTik7CisJCQl9IGVsc2UKKwkJCQlnb3RvIFNiYXNlMTsKKwkJCWJyZWFrOworCQl9CisJfQorIERvbmU6CisJWGNoZWNrKHdzLCB3cCk7CisJaWYgKHN0YXRlcCAhPSAmc3RhdGVzWzFdKQorCQkvKiBYWFggZmlndXJlIG91dCB3aGF0IGlzIG1pc3NpbmcgKi8KKwkJeXllcnJvcigibm8gY2xvc2luZyBxdW90ZVxuIik7CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWlmIChzdGF0ZSA9PSBTTEVUQVJSQVkgJiYgc3RhdGVwLT5sc19zbGV0YXJyYXkubnBhcmVuICE9IC0xKQorCQl5eWVycm9yKCIlczogJyknIG1pc3NpbmdcbiIsIFRfc3luZXJyKTsKKyNlbmRpZgorCisJLyogVGhpcyBkb25lIHRvIGF2b2lkIHRlc3RzIGZvciBTSEVSRURFTElNIHdoZXJldmVyIFNCQVNFIHRlc3RlZCAqLworCWlmIChzdGF0ZSA9PSBTSEVSRURFTElNIHx8IHN0YXRlID09IFNIRVJFU1RSSU5HKQorCQlzdGF0ZSA9IFNCQVNFOworCisJZHAgPSBYc3RyaW5nKHdzLCB3cCk7CisJaWYgKChjID09ICc8JyB8fCBjID09ICc+JyB8fCBjID09ICcmJykgJiYgc3RhdGUgPT0gU0JBU0UpIHsKKwkJc3RydWN0IGlvd29yZCAqaW9wID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3dvcmQpLCBBVEVNUCk7CisKKwkJaWYgKFhsZW5ndGgod3MsIHdwKSA9PSAwKQorCQkJaW9wLT51bml0ID0gYyA9PSAnPCcgPyAwIDogMTsKKwkJZWxzZSBmb3IgKGlvcC0+dW5pdCA9IDAsIGMyID0gMDsgYzIgPCBYbGVuZ3RoKHdzLCB3cCk7IGMyICs9IDIpIHsKKwkJCWlmIChkcFtjMl0gIT0gQ0hBUikKKwkJCQlnb3RvIG5vX2lvcDsKKwkJCWlmICgha3NoX2lzZGlnaXQoZHBbYzIgKyAxXSkpCisJCQkJZ290byBub19pb3A7CisJCQlpb3AtPnVuaXQgPSAoaW9wLT51bml0ICogMTApICsgZHBbYzIgKyAxXSAtICcwJzsKKwkJfQorCisJCWlmIChpb3AtPnVuaXQgPj0gRkRCQVNFKQorCQkJZ290byBub19pb3A7CisKKwkJaWYgKGMgPT0gJyYnKSB7CisJCQlpZiAoKGMyID0gZ2V0c2MoKSkgIT0gJz4nKSB7CisJCQkJdW5nZXRzYyhjMik7CisJCQkJZ290byBub19pb3A7CisJCQl9CisJCQljID0gYzI7CisJCQlpb3AtPmZsYWcgPSBJT0JBU0g7CisJCX0gZWxzZQorCQkJaW9wLT5mbGFnID0gMDsKKworCQljMiA9IGdldHNjKCk7CisJCS8qIDw8LCA+PiwgPD4gYXJlIG9rLCA+PCBpcyBub3QgKi8KKwkJaWYgKGMgPT0gYzIgfHwgKGMgPT0gJzwnICYmIGMyID09ICc+JykpIHsKKwkJCWlvcC0+ZmxhZyB8PSBjID09IGMyID8KKwkJCSAgICAoYyA9PSAnPicgPyBJT0NBVCA6IElPSEVSRSkgOiBJT1JEV1I7CisJCQlpZiAoaW9wLT5mbGFnID09IElPSEVSRSkgeworCQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSAnLScpCisJCQkJCWlvcC0+ZmxhZyB8PSBJT1NLSVA7CisJCQkJZWxzZQorCQkJCQl1bmdldHNjKGMyKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjMiA9PSAnJicpCisJCQlpb3AtPmZsYWcgfD0gSU9EVVAgfCAoYyA9PSAnPCcgPyBJT1JEVVAgOiAwKTsKKwkJZWxzZSB7CisJCQlpb3AtPmZsYWcgfD0gYyA9PSAnPicgPyBJT1dSSVRFIDogSU9SRUFEOworCQkJaWYgKGMgPT0gJz4nICYmIGMyID09ICd8JykKKwkJCQlpb3AtPmZsYWcgfD0gSU9DTE9COworCQkJZWxzZQorCQkJCXVuZ2V0c2MoYzIpOworCQl9CisKKwkJaW9wLT5uYW1lID0gTlVMTDsKKwkJaW9wLT5kZWxpbSA9IE5VTEw7CisJCWlvcC0+aGVyZWRvYyA9IE5VTEw7CisJCVhmcmVlKHdzLCB3cCk7CS8qIGZyZWUgd29yZCAqLworCQl5eWx2YWwuaW9wID0gaW9wOworCQlyZXR1cm4gKFJFRElSKTsKKyBub19pb3A6CisJCTsKKwl9CisKKwlpZiAod3AgPT0gZHAgJiYgc3RhdGUgPT0gU0JBU0UpIHsKKwkJWGZyZWUod3MsIHdwKTsJLyogZnJlZSB3b3JkICovCisJCS8qIG5vIHdvcmQsIHByb2Nlc3MgTEVYMSBjaGFyYWN0ZXIgKi8KKwkJaWYgKChjID09ICd8JykgfHwgKGMgPT0gJyYnKSB8fCAoYyA9PSAnOycpIHx8IChjID09ICcoJy8qKSovKSkgeworCQkJaWYgKChjMiA9IGdldHNjKCkpID09IGMpCisJCQkJYyA9IChjID09ICc7JykgPyBCUkVBSyA6CisJCQkJICAgIChjID09ICd8JykgPyBMT0dPUiA6CisJCQkJICAgIChjID09ICcmJykgPyBMT0dBTkQgOgorCQkJCSAgICAvKiBjID09ICcoJyApICovIE1EUEFSRU47CisJCQllbHNlIGlmIChjID09ICd8JyAmJiBjMiA9PSAnJicpCisJCQkJYyA9IENPUFJPQzsKKwkJCWVsc2UKKwkJCQl1bmdldHNjKGMyKTsKKwkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCWdldGhlcmUoZmFsc2UpOworCQkJaWYgKGNmICYgQ09OVElOKQorCQkJCWdvdG8gQWdhaW47CisJCX0gZWxzZSBpZiAoYyA9PSAnXDAnKQorCQkJLyogbmVlZCBoZXJlIHN0cmluZ3MgYXQgRU9GICovCisJCQlnZXRoZXJlKHRydWUpOworCQlyZXR1cm4gKGMpOworCX0KKworCSp3cCsrID0gRU9TOwkJLyogdGVybWluYXRlIHdvcmQgKi8KKwl5eWx2YWwuY3AgPSBYY2xvc2Uod3MsIHdwKTsKKwlpZiAoc3RhdGUgPT0gU1dPUkQgfHwgc3RhdGUgPT0gU0xFVFBBUkVOCisJICAgIC8qIFhYWCBPTkVXT1JEPyAqLworI2lmbmRlZiBNS1NIX1NNQUxMCisJICAgIHx8IHN0YXRlID09IFNMRVRBUlJBWQorI2VuZGlmCisJICAgICkKKwkJcmV0dXJuIChMV09SRCk7CisKKwkvKiB1bmdldCB0ZXJtaW5hdG9yICovCisJdW5nZXRzYyhjKTsKKworCS8qCisJICogbm90ZTogdGhlIGFsaWFzLXZzLWZ1bmN0aW9uIGNvZGUgYmVsb3cgZGVwZW5kcyBvbiBzZXZlcmFsCisJICogaW50ZXJuYTogc3RhcnRpbmcgZnJvbSBoZXJlLCBzb3VyY2UtPnN0ciBpcyBub3QgbW9kaWZpZWQ7CisJICogdGhlIHdheSBnZXRzYygpIGFuZCB1bmdldHNjKCkgb3BlcmF0ZTsgZXRjLgorCSAqLworCisJLyogY29weSB3b3JkIHRvIHVucHJlZml4ZWQgc3RyaW5nIGlkZW50ICovCisJc3AgPSB5eWx2YWwuY3A7CisJZHAgPSBpZGVudDsKKwlpZiAoKGNmICYgSEVSRURFTElNKSAmJiAoc3BbMV0gPT0gJzwnKSkKKwkJd2hpbGUgKGRwIDwgaWRlbnQrSURFTlQpIHsKKwkJCWlmICgoYyA9ICpzcCsrKSA9PSBDSEFSKQorCQkJCSpkcCsrID0gKnNwKys7CisJCQllbHNlIGlmICgoYyAhPSBPUVVPVEUpICYmIChjICE9IENRVU9URSkpCisJCQkJYnJlYWs7CisJCX0KKwllbHNlCisJCXdoaWxlIChkcCA8IGlkZW50K0lERU5UICYmIChjID0gKnNwKyspID09IENIQVIpCisJCQkqZHArKyA9ICpzcCsrOworCS8qIE1ha2Ugc3VyZSB0aGUgaWRlbnQgYXJyYXkgc3RheXMgJ1wwJyBwYWRkZWQgKi8KKwltZW1zZXQoZHAsIDAsIChpZGVudCtJREVOVCkgLSBkcCArIDEpOworCWlmIChjICE9IEVPUykKKwkJKmlkZW50ID0gJ1wwJzsJLyogd29yZCBpcyBub3QgdW5xdW90ZWQgKi8KKworCWlmICgqaWRlbnQgIT0gJ1wwJyAmJiAoY2YmKEtFWVdPUkR8QUxJQVMpKSkgeworCQlzdHJ1Y3QgdGJsICpwOworCQl1aW50MzJfdCBoID0gaGFzaChpZGVudCk7CisKKwkJLyogeyAqLworCQlpZiAoKGNmICYgS0VZV09SRCkgJiYgKHAgPSBrdHNlYXJjaCgma2V5d29yZHMsIGlkZW50LCBoKSkgJiYKKwkJICAgICghKGNmICYgRVNBQ09OTFkpIHx8IHAtPnZhbC5pID09IEVTQUMgfHwgcC0+dmFsLmkgPT0gJ30nKSkgeworCQkJYWZyZWUoeXlsdmFsLmNwLCBBVEVNUCk7CisJCQlyZXR1cm4gKHAtPnZhbC5pKTsKKwkJfQorCQlpZiAoKGNmICYgQUxJQVMpICYmIChwID0ga3RzZWFyY2goJmFsaWFzZXMsIGlkZW50LCBoKSkgJiYKKwkJICAgIChwLT5mbGFnICYgSVNTRVQpKSB7CisJCQkvKgorCQkJICogdGhpcyBzdGlsbCBwb2ludHMgdG8gdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZQorCQkJICogdW5nZXRzYydkIHRlcm1pbmF0b3IgZnJvbSBhYm92ZQorCQkJICovCisJCQljb25zdCBjaGFyICpjcCA9IHNvdXJjZS0+c3RyOworCisJCQkvKiBwcmVmZXIgUE9TSVggYnV0IG5vdCBLb3JuIGZ1bmN0aW9ucyBvdmVyIGFsaWFzZXMgKi8KKwkJCXdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKQorCQkJCS8qCisJCQkJICogdGhpcyBpcyBsaWtlIGdldHNjKCkgd2l0aG91dCBza2lwcGluZworCQkJCSAqIG92ZXIgU291cmNlIGJvdW5kYXJpZXMgKGluY2x1ZGluZyBub3QKKwkJCQkgKiBwYXJzaW5nIHVuZ2V0c2MnZCBjaGFyYWN0ZXJzIHRoYXQgZ290CisJCQkJICogcHVzaGVkIGludG8gYW4gU1JFUkVBRCkgd2hpY2ggaXMgd2hhdAorCQkJCSAqIHdlIHdhbnQgaGVyZSBhbnl3YXk6IGZpbmQgb3V0IHdoZXRoZXIKKwkJCQkgKiB0aGUgYWxpYXMgbmFtZSBpcyBmb2xsb3dlZCBieSBhIFBPU0lYCisJCQkJICogZnVuY3Rpb24gZGVmaW5pdGlvbiAob25seSB0aGUgb3BlbmluZworCQkJCSAqIHBhcmVudGhlc2lzIGlzIGNoZWNrZWQgdGhvdWdoKQorCQkJCSAqLworCQkJCSsrY3A7CisJCQkvKiBwcmVmZXIgZnVuY3Rpb25zIG92ZXIgYWxpYXNlcyAqLworCQkJaWYgKCpjcCA9PSAnKCcgLyopKi8pCisJCQkJLyoKKwkJCQkgKiBkZWxldGUgYWxpYXMgdXBvbiBlbmNvdW50ZXJpbmcgZnVuY3Rpb24KKwkJCQkgKiBkZWZpbml0aW9uCisJCQkJICovCisJCQkJa3RkZWxldGUocCk7CisJCQllbHNlIHsKKwkJCQlTb3VyY2UgKnMgPSBzb3VyY2U7CisKKwkJCQl3aGlsZSAocyAmJiAocy0+ZmxhZ3MgJiBTRl9IQVNBTElBUykpCisJCQkJCWlmIChzLT51LnRibHAgPT0gcCkKKwkJCQkJCXJldHVybiAoTFdPUkQpOworCQkJCQllbHNlCisJCQkJCQlzID0gcy0+bmV4dDsKKwkJCQkvKiBwdXNoIGFsaWFzIGV4cGFuc2lvbiAqLworCQkJCXMgPSBwdXNocyhTQUxJQVMsIHNvdXJjZS0+YXJlYXApOworCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gcC0+dmFsLnM7CisJCQkJcy0+dS50YmxwID0gcDsKKwkJCQlzLT5mbGFncyB8PSBTRl9IQVNBTElBUzsKKwkJCQlzLT5uZXh0ID0gc291cmNlOworCQkJCWlmIChzb3VyY2UtPnR5cGUgPT0gU0VPRikgeworCQkJCQkvKiBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBhdCBFT1MgKi8KKwkJCQkJc291cmNlLT51LnRibHAgPSBwOworCQkJCQlzb3VyY2UtPmZsYWdzIHw9IFNGX0hBU0FMSUFTOworCQkJCX0KKwkJCQlzb3VyY2UgPSBzOworCQkJCWFmcmVlKHl5bHZhbC5jcCwgQVRFTVApOworCQkJCWdvdG8gQWdhaW47CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gKExXT1JEKTsKK30KKworc3RhdGljIHZvaWQKK2dldGhlcmUoYm9vbCBpc2VvZikKK3sKKwlzdHJ1Y3QgaW93b3JkICoqcDsKKworCWZvciAocCA9IGhlcmVzOyBwIDwgaGVyZXA7IHArKykKKwkJaWYgKGlzZW9mICYmICgqcCktPmRlbGltWzFdICE9ICc8JykKKwkJCS8qIG9ubHkgaGVyZSBzdHJpbmdzIGF0IEVPRiAqLworCQkJcmV0dXJuOworCQllbHNlCisJCQlyZWFkaGVyZSgqcCk7CisJaGVyZXAgPSBoZXJlczsKK30KKworLyoKKyAqIHJlYWQgIjw8d29yZCIgdGV4dCBpbnRvIHRlbXAgZmlsZQorICovCisKK3N0YXRpYyB2b2lkCityZWFkaGVyZShzdHJ1Y3QgaW93b3JkICppb3ApCit7CisJaW50IGM7CisJY2hhciAqdm9sYXRpbGUgZW9mOworCWNoYXIgKmVvZnA7CisJaW50IHNraXB0YWJzOworCVhTdHJpbmcgeHM7CisJY2hhciAqeHA7CisJaW50IHhwb3M7CisKKwlpZiAoaW9wLT5kZWxpbVsxXSA9PSAnPCcpIHsKKwkJLyogcHJvY2VzcyB0aGUgaGVyZSBzdHJpbmcgKi8KKwkJeHAgPSBpb3AtPmhlcmVkb2MgPSBldmFsc3RyKGlvcC0+ZGVsaW0sIERPQkxBTkspOworCQljID0gc3RybGVuKHhwKSAtIDE7CisJCW1lbW1vdmUoeHAsIHhwICsgMSwgYyk7CisJCXhwW2NdID0gJ1xuJzsKKwkJcmV0dXJuOworCX0KKworCWVvZiA9IGV2YWxzdHIoaW9wLT5kZWxpbSwgMCk7CisKKwlpZiAoIShpb3AtPmZsYWcgJiBJT0VWQUwpKQorCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKKworCVhpbml0KHhzLCB4cCwgMjU2LCBBVEVNUCk7CisKKwlmb3IgKDs7KSB7CisJCWVvZnAgPSBlb2Y7CisJCXNraXB0YWJzID0gaW9wLT5mbGFnICYgSU9TS0lQOworCQl4cG9zID0gWHNhdmVwb3MoeHMsIHhwKTsKKwkJd2hpbGUgKChjID0gZ2V0c2MoKSkgIT0gMCkgeworCQkJaWYgKHNraXB0YWJzKSB7CisJCQkJaWYgKGMgPT0gJ1x0JykKKwkJCQkJY29udGludWU7CisJCQkJc2tpcHRhYnMgPSAwOworCQkJfQorCQkJaWYgKGMgIT0gKmVvZnApCisJCQkJYnJlYWs7CisJCQlYY2hlY2soeHMsIHhwKTsKKwkJCVhwdXQoeHMsIHhwLCBjKTsKKwkJCWVvZnArKzsKKwkJfQorCQkvKiBBbGxvdyBFT0YgaGVyZSBzbyBjb21tYW5kcyB3aXRoIG91dCB0cmFpbGluZyBuZXdsaW5lcworCQkgKiB3aWxsIHdvcmsgKGVnLCBrc2ggLWMgJy4uLicsICQoLi4uKSwgZXRjKS4KKwkJICovCisJCWlmICgqZW9mcCA9PSAnXDAnICYmIChjID09IDAgfHwgYyA9PSAnXG4nKSkgeworCQkJeHAgPSBYcmVzdHBvcyh4cywgeHAsIHhwb3MpOworCQkJYnJlYWs7CisJCX0KKwkJdW5nZXRzYyhjKTsKKwkJd2hpbGUgKChjID0gZ2V0c2MoKSkgIT0gJ1xuJykgeworCQkJaWYgKGMgPT0gMCkKKwkJCQl5eWVycm9yKCJoZXJlIGRvY3VtZW50ICclcycgdW5jbG9zZWRcbiIsIGVvZik7CisJCQlYY2hlY2soeHMsIHhwKTsKKwkJCVhwdXQoeHMsIHhwLCBjKTsKKwkJfQorCQlYY2hlY2soeHMsIHhwKTsKKwkJWHB1dCh4cywgeHAsIGMpOworCX0KKwlYcHV0KHhzLCB4cCwgJ1wwJyk7CisJaW9wLT5oZXJlZG9jID0gWGNsb3NlKHhzLCB4cCk7CisKKwlpZiAoIShpb3AtPmZsYWcgJiBJT0VWQUwpKQorCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKK30KKwordm9pZAoreXllcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJLyogcG9wIGFsaWFzZXMgYW5kIHJlLXJlYWRzICovCisJd2hpbGUgKHNvdXJjZS0+dHlwZSA9PSBTQUxJQVMgfHwgc291cmNlLT50eXBlID09IFNSRVJFQUQpCisJCXNvdXJjZSA9IHNvdXJjZS0+bmV4dDsKKwlzb3VyY2UtPnN0ciA9IG51bGw7CS8qIHphcCBwZW5kaW5nIGlucHV0ICovCisKKwllcnJvcl9wcmVmaXgodHJ1ZSk7CisJdmFfc3RhcnQodmEsIGZtdCk7CisJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CisJZXJyb3JmeigpOworfQorCisvKgorICogaW5wdXQgZm9yIHl5bGV4IHdpdGggYWxpYXMgZXhwYW5zaW9uCisgKi8KKworU291cmNlICoKK3B1c2hzKGludCB0eXBlLCBBcmVhICphcmVhcCkKK3sKKwlTb3VyY2UgKnM7CisKKwlzID0gYWxsb2Moc2l6ZW9mKFNvdXJjZSksIGFyZWFwKTsKKwltZW1zZXQocywgMCwgc2l6ZW9mKFNvdXJjZSkpOworCXMtPnR5cGUgPSB0eXBlOworCXMtPnN0ciA9IG51bGw7CisJcy0+YXJlYXAgPSBhcmVhcDsKKwlpZiAodHlwZSA9PSBTRklMRSB8fCB0eXBlID09IFNTVERJTikKKwkJWGluaXROKHMtPnhzLCAyNTYsIHMtPmFyZWFwKTsKKwlyZXR1cm4gKHMpOworfQorCitzdGF0aWMgaW50CitnZXRzY19fKHZvaWQpCit7CisJU291cmNlICpzID0gc291cmNlOworCWludCBjOworCisgZ2V0c2NfYWdhaW46CisJd2hpbGUgKChjID0gKnMtPnN0cisrKSA9PSAwKSB7CisJCXMtPnN0ciA9IE5VTEw7CQkvKiByZXR1cm4gMCBmb3IgRU9GIGJ5IGRlZmF1bHQgKi8KKwkJc3dpdGNoIChzLT50eXBlKSB7CisJCWNhc2UgU0VPRjoKKwkJCXMtPnN0ciA9IG51bGw7CisJCQlyZXR1cm4gKDApOworCisJCWNhc2UgU1NURElOOgorCQljYXNlIFNGSUxFOgorCQkJZ2V0c2NfbGluZShzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1dTVFI6CisJCQlicmVhazsKKworCQljYXNlIFNTVFJJTkc6CisJCQlicmVhazsKKworCQljYXNlIFNXT1JEUzoKKwkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gKnMtPnUuc3RydisrOworCQkJcy0+dHlwZSA9IFNXT1JEU0VQOworCQkJYnJlYWs7CisKKwkJY2FzZSBTV09SRFNFUDoKKwkJCWlmICgqcy0+dS5zdHJ2ID09IE5VTEwpIHsKKwkJCQlzLT5zdGFydCA9IHMtPnN0ciA9ICJcbiI7CisJCQkJcy0+dHlwZSA9IFNFT0Y7CisJCQl9IGVsc2UgeworCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gIiAiOworCQkJCXMtPnR5cGUgPSBTV09SRFM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNBTElBUzoKKwkJCWlmIChzLT5mbGFncyAmIFNGX0FMSUFTRU5EKSB7CisJCQkJLyogcGFzcyBvbiBhbiB1bnVzZWQgU0ZfQUxJQVMgZmxhZyAqLworCQkJCXNvdXJjZSA9IHMtPm5leHQ7CisJCQkJc291cmNlLT5mbGFncyB8PSBzLT5mbGFncyAmIFNGX0FMSUFTOworCQkJCXMgPSBzb3VyY2U7CisJCQl9IGVsc2UgaWYgKCpzLT51LnRibHAtPnZhbC5zICYmCisJCQkgICAgKGMgPSBzdHJudWwocy0+dS50YmxwLT52YWwucylbLTFdLCBrc2hfaXNzcGFjZShjKSkpIHsKKwkJCQlzb3VyY2UgPSBzID0gcy0+bmV4dDsJLyogcG9wIHNvdXJjZSBzdGFjayAqLworCQkJCS8qIE5vdGUgdGhhdCB0aGlzIGFsaWFzIGVuZGVkIHdpdGggYSBzcGFjZSwKKwkJCQkgKiBlbmFibGluZyBhbGlhcyBleHBhbnNpb24gb24gdGhlIGZvbGxvd2luZworCQkJCSAqIHdvcmQuCisJCQkJICovCisJCQkJcy0+ZmxhZ3MgfD0gU0ZfQUxJQVM7CisJCQl9IGVsc2UgeworCQkJCS8qIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8ga2VlcCB0aGUgY3VycmVudAorCQkJCSAqIGFsaWFzIGluIHRoZSBzb3VyY2UgbGlzdCBzbyByZWN1cnNpdmUKKwkJCQkgKiBhbGlhc2VzIGNhbiBiZSBkZXRlY3RlZCBhbmQgd2UgYWxzbyBuZWVkCisJCQkJICogdG8gcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3Rlci4gRG8gdGhpcworCQkJCSAqIGJ5IHRlbXBvcmFyaWx5IHBvcHBpbmcgdGhlIGFsaWFzIHRvIGdldAorCQkJCSAqIHRoZSBuZXh0IGNoYXJhY3RlciBhbmQgdGhlbiBwdXQgaXQgYmFjaworCQkJCSAqIGluIHRoZSBzb3VyY2UgbGlzdCB3aXRoIHRoZSBTRl9BTElBU0VORAorCQkJCSAqIGZsYWcgc2V0LgorCQkJCSAqLworCQkJCXNvdXJjZSA9IHMtPm5leHQ7CS8qIHBvcCBzb3VyY2Ugc3RhY2sgKi8KKwkJCQlzb3VyY2UtPmZsYWdzIHw9IHMtPmZsYWdzICYgU0ZfQUxJQVM7CisJCQkJYyA9IGdldHNjX18oKTsKKwkJCQlpZiAoYykgeworCQkJCQlzLT5mbGFncyB8PSBTRl9BTElBU0VORDsKKwkJCQkJcy0+dWdidWZbMF0gPSBjOyBzLT51Z2J1ZlsxXSA9ICdcMCc7CisJCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gcy0+dWdidWY7CisJCQkJCXMtPm5leHQgPSBzb3VyY2U7CisJCQkJCXNvdXJjZSA9IHM7CisJCQkJfSBlbHNlIHsKKwkJCQkJcyA9IHNvdXJjZTsKKwkJCQkJLyogYXZvaWQgcmVhZGluZyBlb2YgdHdpY2UgKi8KKwkJCQkJcy0+c3RyID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisKKwkJY2FzZSBTUkVSRUFEOgorCQkJaWYgKHMtPnN0YXJ0ICE9IHMtPnVnYnVmKQkvKiB5dWNrICovCisJCQkJYWZyZWUocy0+dS5mcmVlbWUsIEFURU1QKTsKKwkJCXNvdXJjZSA9IHMgPSBzLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHMtPnN0ciA9PSBOVUxMKSB7CisJCQlzLT50eXBlID0gU0VPRjsKKwkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gbnVsbDsKKwkJCXJldHVybiAoJ1wwJyk7CisJCX0KKwkJaWYgKHMtPmZsYWdzICYgU0ZfRUNITykgeworCQkJc2hmX3B1dHMocy0+c3RyLCBzaGxfb3V0KTsKKwkJCXNoZl9mbHVzaChzaGxfb3V0KTsKKwkJfQorCX0KKwkvKiBjaGVjayBmb3IgVVRGLTggYnl0ZSBvcmRlciBtYXJrICovCisJaWYgKHMtPmZsYWdzICYgU0ZfRklSU1QpIHsKKwkJcy0+ZmxhZ3MgJj0gflNGX0ZJUlNUOworCQlpZiAoKCh1bnNpZ25lZCBjaGFyKWMgPT0gMHhFRikgJiYKKwkJICAgICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocy0+c3RyKSlbMF0gPT0gMHhCQikgJiYKKwkJICAgICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocy0+c3RyKSlbMV0gPT0gMHhCRikpIHsKKwkJCXMtPnN0ciArPSAyOworCQkJVVRGTU9ERSA9IDE7CisJCQlnb3RvIGdldHNjX2FnYWluOworCQl9CisJfQorCXJldHVybiAoYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRzY19saW5lKFNvdXJjZSAqcykKK3sKKwljaGFyICp4cCA9IFhzdHJpbmcocy0+eHMsIHhwKSwgKmNwOworCWJvb2wgaW50ZXJhY3RpdmUgPSBGbGFnKEZUQUxLSU5HKSAmJiBzLT50eXBlID09IFNTVERJTjsKKwlpbnQgaGF2ZV90dHkgPSBpbnRlcmFjdGl2ZSAmJiAocy0+ZmxhZ3MgJiBTRl9UVFkpOworCisJLyogRG9uZSBoZXJlIHRvIGVuc3VyZSBub3RoaW5nIG9kZCBoYXBwZW5zIHdoZW4gYSB0aW1lb3V0IG9jY3VycyAqLworCVhjaGVja04ocy0+eHMsIHhwLCBMSU5FKTsKKwkqeHAgPSAnXDAnOworCXMtPnN0YXJ0ID0gcy0+c3RyID0geHA7CisKKwlpZiAoaGF2ZV90dHkgJiYga3NoX3Rtb3V0KSB7CisJCWtzaF90bW91dF9zdGF0ZSA9IFRNT1VUX1JFQURJTkc7CisJCWFsYXJtKGtzaF90bW91dCk7CisJfQorCWlmIChpbnRlcmFjdGl2ZSkKKwkJY2hhbmdlX3dpbnN6KCk7CisJaWYgKGhhdmVfdHR5ICYmICgKKyNpZiAhTUtTSF9TX05PVkkKKwkgICAgRmxhZyhGVkkpIHx8CisjZW5kaWYKKwkgICAgRmxhZyhGRU1BQ1MpIHx8IEZsYWcoRkdNQUNTKSkpIHsKKwkJaW50IG5yZWFkOworCisJCW5yZWFkID0geF9yZWFkKHhwLCBMSU5FKTsKKwkJaWYgKG5yZWFkIDwgMCkJLyogcmVhZCBlcnJvciAqLworCQkJbnJlYWQgPSAwOworCQl4cFtucmVhZF0gPSAnXDAnOworCQl4cCArPSBucmVhZDsKKwl9IGVsc2UgeworCQlpZiAoaW50ZXJhY3RpdmUpCisJCQlwcHJvbXB0KHByb21wdCwgMCk7CisJCWVsc2UKKwkJCXMtPmxpbmUrKzsKKworCQl3aGlsZSAoMSkgeworCQkJY2hhciAqcCA9IHNoZl9nZXRzZSh4cCwgWG5sZWZ0KHMtPnhzLCB4cCksIHMtPnUuc2hmKTsKKworCQkJaWYgKCFwICYmIHNoZl9lcnJvcihzLT51LnNoZikgJiYKKwkJCSAgICBzaGZfZXJybm8ocy0+dS5zaGYpID09IEVJTlRSKSB7CisJCQkJc2hmX2NsZWFyZXJyKHMtPnUuc2hmKTsKKwkJCQlpZiAodHJhcCkKKwkJCQkJcnVudHJhcHMoMCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXAgfHwgKHhwID0gcCwgeHBbLTFdID09ICdcbicpKQorCQkJCWJyZWFrOworCQkJLyogZG91YmxlIGJ1ZmZlciBzaXplICovCisJCQl4cCsrOwkvKiBtb3ZlIHBhc3QgTlVMIHNvIGRvdWJsaW5nIHdvcmtzLi4uICovCisJCQlYY2hlY2tOKHMtPnhzLCB4cCwgWGxlbmd0aChzLT54cywgeHApKTsKKwkJCXhwLS07CS8qIC4uLmFuZCBtb3ZlIGJhY2sgYWdhaW4gKi8KKwkJfQorCQkvKiBmbHVzaCBhbnkgdW53YW50ZWQgaW5wdXQgc28gb3RoZXIgcHJvZ3JhbXMvYnVpbHRpbnMKKwkJICogY2FuIHJlYWQgaXQuIE5vdCB2ZXJ5IG9wdGltYWwsIGJ1dCBsZXNzIGVycm9yIHByb25lCisJCSAqIHRoYW4gZmx1c2hpbmcgZWxzZSB3aGVyZSwgZGVhbGluZyB3aXRoIHJlZGlyZWN0aW9ucywKKwkJICogZXRjLgorCQkgKiB0b2RvOiByZWR1Y2Ugc2l6ZSBvZiBzaGYgYnVmZmVyICh+MTI4PykgaWYgU1NURElOCisJCSAqLworCQlpZiAocy0+dHlwZSA9PSBTU1RESU4pCisJCQlzaGZfZmx1c2gocy0+dS5zaGYpOworCX0KKwkvKiBYWFg6IHRlbXBvcmFyeSBrbHVkZ2UgdG8gcmVzdG9yZSBzb3VyY2UgYWZ0ZXIgYQorCSAqIHRyYXAgbWF5IGhhdmUgYmVlbiBleGVjdXRlZC4KKwkgKi8KKwlzb3VyY2UgPSBzOworCWlmIChoYXZlX3R0eSAmJiBrc2hfdG1vdXQpIHsKKwkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfRVhFQ1VUSU5HOworCQlhbGFybSgwKTsKKwl9CisJY3AgPSBYc3RyaW5nKHMtPnhzLCB4cCk7CisjaWZuZGVmIE1LU0hfU01BTEwKKwlpZiAoaW50ZXJhY3RpdmUgJiYgKmNwID09ICchJyAmJiBjdXJfcHJvbXB0ID09IFBTMSkgeworCQlpbnQgbGluZWxlbjsKKworCQlsaW5lbGVuID0gWGxlbmd0aChzLT54cywgeHApOworCQlYY2hlY2tOKHMtPnhzLCB4cCwgZmNfZV9uICsgLyogTlVMICovIDEpOworCQkvKiByZWxvYWQgYWZ0ZXIgcG90ZW50aWFsIHJlYWxsb2MgKi8KKwkJY3AgPSBYc3RyaW5nKHMtPnhzLCB4cCk7CisJCS8qIGNoYW5nZSBpbml0aWFsICchJyBpbnRvIHNwYWNlICovCisJCSpjcCA9ICcgJzsKKwkJLyogTlVMIHRlcm1pbmF0ZSB0aGUgY3VycmVudCBzdHJpbmcgKi8KKwkJKnhwID0gJ1wwJzsKKwkJLyogbW92ZSB0aGUgYWN0dWFsIHN0cmluZyBmb3J3YXJkICovCisJCW1lbW1vdmUoY3AgKyBmY19lX24sIGNwLCBsaW5lbGVuICsgLyogTlVMICovIDEpOworCQl4cCArPSBmY19lX247CisJCS8qIHByZXBlbmQgaXQgd2l0aCAiZmMgLWUgLSIgKi8KKwkJbWVtY3B5KGNwLCBmY19lXywgZmNfZV9uKTsKKwl9CisjZW5kaWYKKwlzLT5zdGFydCA9IHMtPnN0ciA9IGNwOworCXN0cmlwX251bHMoWHN0cmluZyhzLT54cywgeHApLCBYbGVuZ3RoKHMtPnhzLCB4cCkpOworCS8qIE5vdGU6IGlmIGlucHV0IGlzIGFsbCBudWxscywgdGhpcyBpcyBub3QgZW9mICovCisJaWYgKFhsZW5ndGgocy0+eHMsIHhwKSA9PSAwKSB7CisJCS8qIEVPRiAqLworCQlpZiAocy0+dHlwZSA9PSBTRklMRSkKKwkJCXNoZl9mZGNsb3NlKHMtPnUuc2hmKTsKKwkJcy0+c3RyID0gTlVMTDsKKwl9IGVsc2UgaWYgKGludGVyYWN0aXZlICYmICpzLT5zdHIgJiYKKwkgICAgKGN1cl9wcm9tcHQgIT0gUFMxIHx8ICFjdHlwZSgqcy0+c3RyLCBDX0lGUyB8IENfSUZTV1MpKSkgeworCQloaXN0c2F2ZSgmcy0+bGluZSwgcy0+c3RyLCB0cnVlLCB0cnVlKTsKKyNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCX0gZWxzZSBpZiAoaW50ZXJhY3RpdmUgJiYgY3VyX3Byb21wdCA9PSBQUzEpIHsKKwkJY3AgPSBYc3RyaW5nKHMtPnhzLCB4cCk7CisJCXdoaWxlICgqY3AgJiYgY3R5cGUoKmNwLCBDX0lGU1dTKSkKKwkJCSsrY3A7CisJCWlmICghKmNwKQorCQkJaGlzdHN5bmMoKTsKKyNlbmRpZgorCX0KKwlpZiAoaW50ZXJhY3RpdmUpCisJCXNldF9wcm9tcHQoUFMyLCBOVUxMKTsKK30KKwordm9pZAorc2V0X3Byb21wdChpbnQgdG8sIFNvdXJjZSAqcykKK3sKKwljdXJfcHJvbXB0ID0gdG87CisKKwlzd2l0Y2ggKHRvKSB7CisJY2FzZSBQUzE6CS8qIGNvbW1hbmQgKi8KKwkJLyogU3Vic3RpdHV0ZSAhIGFuZCAhISBoZXJlLCBiZWZvcmUgc3Vic3RpdHV0aW9ucyBhcmUgZG9uZQorCQkgKiBzbyAhIGluIGV4cGFuZGVkIHZhcmlhYmxlcyBhcmUgbm90IGV4cGFuZGVkLgorCQkgKiBOT1RFOiB0aGlzIGlzIG5vdCB3aGF0IEFUJlQga3NoIGRvZXMgKGl0IGRvZXMgaXQgYWZ0ZXIKKwkJICogc3Vic3RpdHV0aW9ucywgUE9TSVggZG9lc24ndCBzYXkgd2hpY2ggaXMgdG8gYmUgZG9uZS4KKwkJICovCisJCXsKKwkJCXN0cnVjdCBzaGYgKnNoZjsKKwkJCWNoYXIgKiB2b2xhdGlsZSBwczE7CisJCQlBcmVhICpzYXZlZF9hdGVtcDsKKworCQkJcHMxID0gc3RyX3ZhbChnbG9iYWwoIlBTMSIpKTsKKwkJCXNoZiA9IHNoZl9zb3BlbihOVUxMLCBzdHJsZW4ocHMxKSAqIDIsCisJCQkgICAgU0hGX1dSIHwgU0hGX0RZTkFNSUMsIE5VTEwpOworCQkJd2hpbGUgKCpwczEpCisJCQkJaWYgKCpwczEgIT0gJyEnIHx8ICorK3BzMSA9PSAnIScpCisJCQkJCXNoZl9wdXRjaGFyKCpwczErKywgc2hmKTsKKwkJCQllbHNlCisJCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVkIiwKKwkJCQkJCXMgPyBzLT5saW5lICsgMSA6IDApOworCQkJcHMxID0gc2hmX3NjbG9zZShzaGYpOworCQkJc2F2ZWRfYXRlbXAgPSBBVEVNUDsKKwkJCW5ld2VudihFX0VSUkgpOworCQkJaWYgKHNpZ3NldGptcChlLT5qYnVmLCAwKSkgeworCQkJCXByb21wdCA9IHNhZmVfcHJvbXB0OworCQkJCS8qIERvbid0IHByaW50IGFuIGVycm9yIC0gYXNzdW1lIGl0IGhhcyBhbHJlYWR5CisJCQkJICogYmVlbiBwcmludGVkLiBSZWFzb24gaXMgd2UgbWF5IGhhdmUgZm9ya2VkCisJCQkJICogdG8gcnVuIGEgY29tbWFuZCBhbmQgdGhlIGNoaWxkIG1heSBiZQorCQkJCSAqIHVud2luZGluZyBpdHMgc3RhY2sgdGhyb3VnaCB0aGlzIGNvZGUgYXMgaXQKKwkJCQkgKiBleGl0cy4KKwkJCQkgKi8KKwkJCX0gZWxzZSB7CisJCQkJY2hhciAqY3AgPSBzdWJzdGl0dXRlKHBzMSwgMCk7CisJCQkJc3RyZHVweChwcm9tcHQsIGNwLCBzYXZlZF9hdGVtcCk7CisJCQl9CisJCQlxdWl0ZW52KE5VTEwpOworCQl9CisJCWJyZWFrOworCWNhc2UgUFMyOgkvKiBjb21tYW5kIGNvbnRpbnVhdGlvbiAqLworCQlwcm9tcHQgPSBzdHJfdmFsKGdsb2JhbCgiUFMyIikpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2RvcHByb21wdChjb25zdCBjaGFyICpjcCwgaW50IG50cnVuY2F0ZSwgYm9vbCBkb3ByaW50KQoreworCWludCBjb2x1bW5zID0gMCwgbGluZXMgPSAwLCBpbmRlbGltaXQgPSAwOworCWNoYXIgZGVsaW1pdGVyID0gMDsKKworCS8qIFVuZG9jdW1lbnRlZCBBVCZUIGtzaCBmZWF0dXJlOgorCSAqIElmIHRoZSBzZWNvbmQgY2hhciBpbiB0aGUgcHJvbXB0IHN0cmluZyBpcyBcciB0aGVuIHRoZSBmaXJzdCBjaGFyCisJICogaXMgdGFrZW4gdG8gYmUgYSBub24tcHJpbnRpbmcgZGVsaW1pdGVyIGFuZCBhbnkgY2hhcnMgYmV0d2VlbiB0d28KKwkgKiBpbnN0YW5jZXMgb2YgdGhlIGRlbGltaXRlciBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZiB0aGUKKwkgKiBwcm9tcHQgbGVuZ3RoCisJICovCisJaWYgKCpjcCAmJiBjcFsxXSA9PSAnXHInKSB7CisJCWRlbGltaXRlciA9ICpjcDsKKwkJY3AgKz0gMjsKKwl9CisJZm9yICg7ICpjcDsgY3ArKykgeworCQlpZiAoaW5kZWxpbWl0ICYmICpjcCAhPSBkZWxpbWl0ZXIpCisJCQk7CisJCWVsc2UgaWYgKCpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnXHInKSB7CisJCQlsaW5lcyArPSBjb2x1bW5zIC8geF9jb2xzICsgKCgqY3AgPT0gJ1xuJykgPyAxIDogMCk7CisJCQljb2x1bW5zID0gMDsKKwkJfSBlbHNlIGlmICgqY3AgPT0gJ1x0JykgeworCQkJY29sdW1ucyA9IChjb2x1bW5zIHwgNykgKyAxOworCQl9IGVsc2UgaWYgKCpjcCA9PSAnXGInKSB7CisJCQlpZiAoY29sdW1ucyA+IDApCisJCQkJY29sdW1ucy0tOworCQl9IGVsc2UgaWYgKCpjcCA9PSBkZWxpbWl0ZXIpCisJCQlpbmRlbGltaXQgPSAhaW5kZWxpbWl0OworCQllbHNlIGlmIChVVEZNT0RFICYmICgodW5zaWduZWQgY2hhcikqY3AgPiAweDdGKSkgeworCQkJY29uc3QgY2hhciAqY3AyOworCQkJY29sdW1ucyArPSB1dGZfd2lkdGhhZGooY3AsICZjcDIpOworCQkJaWYgKGRvcHJpbnQgJiYgKGluZGVsaW1pdCB8fAorCQkJICAgIChudHJ1bmNhdGUgPCAoeF9jb2xzICogbGluZXMgKyBjb2x1bW5zKSkpKQorCQkJCXNoZl93cml0ZShjcCwgY3AyIC0gY3AsIHNobF9vdXQpOworCQkJY3AgPSBjcDIgLSAvKiBsb29wIGluY3JlbWVudCAqLyAxOworCQkJY29udGludWU7CisJCX0gZWxzZQorCQkJY29sdW1ucysrOworCQlpZiAoZG9wcmludCAmJiAoKmNwICE9IGRlbGltaXRlcikgJiYKKwkJICAgIChpbmRlbGltaXQgfHwgKG50cnVuY2F0ZSA8ICh4X2NvbHMgKiBsaW5lcyArIGNvbHVtbnMpKSkpCisJCQlzaGZfcHV0YygqY3AsIHNobF9vdXQpOworCX0KKwlpZiAoZG9wcmludCkKKwkJc2hmX2ZsdXNoKHNobF9vdXQpOworCXJldHVybiAoeF9jb2xzICogbGluZXMgKyBjb2x1bW5zKTsKK30KKworCit2b2lkCitwcHJvbXB0KGNvbnN0IGNoYXIgKmNwLCBpbnQgbnRydW5jYXRlKQoreworCWRvcHByb21wdChjcCwgbnRydW5jYXRlLCB0cnVlKTsKK30KKworaW50Citwcm9tcHRsZW4oY29uc3QgY2hhciAqY3ApCit7CisJcmV0dXJuIChkb3Bwcm9tcHQoY3AsIDAsIGZhbHNlKSk7Cit9CisKKy8qIFJlYWQgdGhlIHZhcmlhYmxlIHBhcnQgb2YgYSAkey4uLn0gZXhwcmVzc2lvbiAoaWUsIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nCisgKiB0aGUgOlstKz89IyVdIG9yIGNsb3NlLWJyYWNlLgorICovCitzdGF0aWMgY2hhciAqCitnZXRfYnJhY2VfdmFyKFhTdHJpbmcgKndzcCwgY2hhciAqd3ApCit7CisJZW51bSBwYXJzZV9zdGF0ZSB7CisJCVBTX0lOSVRJQUwsIFBTX1NBV19IQVNILCBQU19JREVOVCwKKwkJUFNfTlVNQkVSLCBQU19WQVIxCisJfSBzdGF0ZTsKKwljaGFyIGM7CisKKwlzdGF0ZSA9IFBTX0lOSVRJQUw7CisJd2hpbGUgKDEpIHsKKwkJYyA9IGdldHNjKCk7CisJCS8qIFN0YXRlIG1hY2hpbmUgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgdmFyaWFibGUgcGFydCBlbmRzLiAqLworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgUFNfSU5JVElBTDoKKwkJCWlmIChjID09ICcjJyB8fCBjID09ICchJyB8fCBjID09ICclJykgeworCQkJCXN0YXRlID0gUFNfU0FXX0hBU0g7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIFBTX1NBV19IQVNIOgorCQkJaWYgKGtzaF9pc2FscGh4KGMpKQorCQkJCXN0YXRlID0gUFNfSURFTlQ7CisJCQllbHNlIGlmIChrc2hfaXNkaWdpdChjKSkKKwkJCQlzdGF0ZSA9IFBTX05VTUJFUjsKKwkJCWVsc2UgaWYgKGN0eXBlKGMsIENfVkFSMSkpCisJCQkJc3RhdGUgPSBQU19WQVIxOworCQkJZWxzZQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCWNhc2UgUFNfSURFTlQ6CisJCQlpZiAoIWtzaF9pc2FsbnV4KGMpKSB7CisJCQkJaWYgKGMgPT0gJ1snKSB7CisJCQkJCWNoYXIgKnRtcCwgKnA7CisKKwkJCQkJaWYgKCFhcnJheXN1YigmdG1wKSkKKwkJCQkJCXl5ZXJyb3IoIm1pc3NpbmcgXVxuIik7CisJCQkJCSp3cCsrID0gYzsKKwkJCQkJZm9yIChwID0gdG1wOyAqcDsgKSB7CisJCQkJCQlYY2hlY2soKndzcCwgd3ApOworCQkJCQkJKndwKysgPSAqcCsrOworCQkJCQl9CisJCQkJCWFmcmVlKHRtcCwgQVRFTVApOworCQkJCQljID0gZ2V0c2MoKTsJLyogdGhlIF0gKi8KKwkJCQl9CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQU19OVU1CRVI6CisJCQlpZiAoIWtzaF9pc2RpZ2l0KGMpKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCWNhc2UgUFNfVkFSMToKKwkJCWdvdG8gb3V0OworCQl9CisJCVhjaGVjaygqd3NwLCB3cCk7CisJCSp3cCsrID0gYzsKKwl9Cisgb3V0OgorCSp3cCsrID0gJ1wwJzsJLyogZW5kIG9mIHZhcmlhYmxlIHBhcnQgKi8KKwl1bmdldHNjKGMpOworCXJldHVybiAod3ApOworfQorCisvKgorICogU2F2ZSBhbiBhcnJheSBzdWJzY3JpcHQgLSByZXR1cm5zIHRydWUgaWYgbWF0Y2hpbmcgYnJhY2tldCBmb3VuZCwgZmFsc2UKKyAqIGlmIGVvZiBvciBuZXdsaW5lIHdhcyBmb3VuZC4KKyAqIChSZXR1cm5lZCBzdHJpbmcgZG91YmxlIG51bGwgdGVybWluYXRlZCkKKyAqLworc3RhdGljIGludAorYXJyYXlzdWIoY2hhciAqKnN0cnApCit7CisJWFN0cmluZyB3czsKKwljaGFyCSp3cDsKKwljaGFyCWM7CisJaW50CWRlcHRoID0gMTsJLyogd2UgYXJlIGp1c3QgcGFzdCB0aGUgaW5pdGlhbCBbICovCisKKwlYaW5pdCh3cywgd3AsIDMyLCBBVEVNUCk7CisKKwlkbyB7CisJCWMgPSBnZXRzYygpOworCQlYY2hlY2sod3MsIHdwKTsKKwkJKndwKysgPSBjOworCQlpZiAoYyA9PSAnWycpCisJCQlkZXB0aCsrOworCQllbHNlIGlmIChjID09ICddJykKKwkJCWRlcHRoLS07CisJfSB3aGlsZSAoZGVwdGggPiAwICYmIGMgJiYgYyAhPSAnXG4nKTsKKworCSp3cCsrID0gJ1wwJzsKKwkqc3RycCA9IFhjbG9zZSh3cywgd3ApOworCisJcmV0dXJuIChkZXB0aCA9PSAwID8gMSA6IDApOworfQorCisvKiBVbmdldCBhIGNoYXI6IGhhbmRsZXMgY2FzZSB3aGVuIHdlIGFyZSBhbHJlYWR5IGF0IHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyICovCitzdGF0aWMgY29uc3QgY2hhciAqCit1bmdldHNjKGludCBjKQoreworCWlmIChiYWNrc2xhc2hfc2tpcCkKKwkJYmFja3NsYXNoX3NraXAtLTsKKwkvKiBEb24ndCB1bmdldCBlb2YuLi4gKi8KKwlpZiAoc291cmNlLT5zdHIgPT0gbnVsbCAmJiBjID09ICdcMCcpCisJCXJldHVybiAoc291cmNlLT5zdHIpOworCWlmIChzb3VyY2UtPnN0ciA+IHNvdXJjZS0+c3RhcnQpCisJCXNvdXJjZS0+c3RyLS07CisJZWxzZSB7CisJCVNvdXJjZSAqczsKKworCQlzID0gcHVzaHMoU1JFUkVBRCwgc291cmNlLT5hcmVhcCk7CisJCXMtPnVnYnVmWzBdID0gYzsgcy0+dWdidWZbMV0gPSAnXDAnOworCQlzLT5zdGFydCA9IHMtPnN0ciA9IHMtPnVnYnVmOworCQlzLT5uZXh0ID0gc291cmNlOworCQlzb3VyY2UgPSBzOworCX0KKwlyZXR1cm4gKHNvdXJjZS0+c3RyKTsKK30KKworCisvKiBDYWxsZWQgdG8gZ2V0IGEgY2hhciB0aGF0IGlzbid0IGEgXG5ld2xpbmUgc2VxdWVuY2UuICovCitzdGF0aWMgaW50CitnZXRzY19ibih2b2lkKQoreworCWludCBjLCBjMjsKKworCWlmIChpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUpCisJCXJldHVybiAoZ2V0c2NfKCkpOworCisJaWYgKGJhY2tzbGFzaF9za2lwID09IDEpIHsKKwkJYmFja3NsYXNoX3NraXAgPSAyOworCQlyZXR1cm4gKGdldHNjXygpKTsKKwl9CisKKwliYWNrc2xhc2hfc2tpcCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQljID0gZ2V0c2NfKCk7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWlmICgoYzIgPSBnZXRzY18oKSkgPT0gJ1xuJykKKwkJCQkvKiBpZ25vcmUgdGhlIFxuZXdsaW5lOyBnZXQgdGhlIG5leHQgY2hhci4uLiAqLworCQkJCWNvbnRpbnVlOworCQkJdW5nZXRzYyhjMik7CisJCQliYWNrc2xhc2hfc2tpcCA9IDE7CisJCX0KKwkJcmV0dXJuIChjKTsKKwl9Cit9CisKK3N0YXRpYyBMZXhfc3RhdGUgKgorcHVzaF9zdGF0ZV8oU3RhdGVfaW5mbyAqc2ksIExleF9zdGF0ZSAqb2xkX2VuZCkKK3sKKwlMZXhfc3RhdGUgKm5ld3MgPSBhbGxvYyhTVEFURV9CU0laRSAqIHNpemVvZihMZXhfc3RhdGUpLCBBVEVNUCk7CisKKwluZXdzWzBdLmxzX2luZm8uYmFzZSA9IG9sZF9lbmQ7CisJc2ktPmJhc2UgPSAmbmV3c1swXTsKKwlzaS0+ZW5kID0gJm5ld3NbU1RBVEVfQlNJWkVdOworCXJldHVybiAoJm5ld3NbMV0pOworfQorCitzdGF0aWMgTGV4X3N0YXRlICoKK3BvcF9zdGF0ZV8oU3RhdGVfaW5mbyAqc2ksIExleF9zdGF0ZSAqb2xkX2VuZCkKK3sKKwlMZXhfc3RhdGUgKm9sZF9iYXNlID0gc2ktPmJhc2U7CisKKwlzaS0+YmFzZSA9IG9sZF9lbmQtPmxzX2luZm8uYmFzZSAtIFNUQVRFX0JTSVpFOworCXNpLT5lbmQgPSBvbGRfZW5kLT5sc19pbmZvLmJhc2U7CisKKwlhZnJlZShvbGRfYmFzZSwgQVRFTVApOworCisJcmV0dXJuIChzaS0+YmFzZSArIFNUQVRFX0JTSVpFIC0gMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NfZ2V0KHZvaWQpCit7CisJcmV0dXJuIChnZXRzYygpKTsKK30KKworc3RhdGljIHZvaWQKK3NfcHV0KGludCBjKQoreworCXVuZ2V0c2MoYyk7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9tYWluLmMgYi9ta3NoL3NyYy9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2MmRkNAotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL21haW4uYwpAQCAtMCwwICsxLDE0NzkgQEAKKy8qCSRPcGVuQlNEOiBtYWluLmMsdiAxLjQ2IDIwMTAvMDUvMTkgMTc6MzY6MDggamFzcGVyIEV4cCAkCSovCisvKgkkT3BlbkJTRDogdHR5LmMsdiAxLjkgMjAwNi8wMy8xNCAyMjowODowMSBkZXJhYWR0IEV4cCAkCSovCisvKgkkT3BlbkJTRDogaW8uYyx2IDEuMjIgMjAwNi8wMy8xNyAxNjozMDoxMyBtaWxsZXJ0IEV4cCAkCSovCisvKgkkT3BlbkJTRDogdGFibGUuYyx2IDEuMTMgMjAwOS8wMS8xNyAyMjowNjo0NCBtaWxsZXJ0IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjZGVmaW5lCUVYVEVSTgorI2luY2x1ZGUgInNoLmgiCisKKyNpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKKyNpbmNsdWRlIDxsYW5naW5mby5oPgorI2VuZGlmCisjaWYgSEFWRV9TRVRMT0NBTEVfQ1RZUEUKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9tYWluLmMsdiAxLjE2NyAyMDEwLzA3LzA0IDE3OjQ1OjE1IHRnIEV4cCAkIik7CisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworI2lmICFIQVZFX1NFVFJFU1VHSUQKK2V4dGVybiB1aWRfdCBrc2h1aWQ7CitleHRlcm4gZ2lkX3Qga3NoZ2lkLCBrc2hlZ2lkOworI2VuZGlmCisKKyNpZm5kZWYgTUtTSFJDX1BBVEgKKyNkZWZpbmUgTUtTSFJDX1BBVEgJIn4vLm1rc2hyYyIKKyNlbmRpZgorCisjaWZuZGVmIE1LU0hfREVGQVVMVF9UTVBESVIKKyNkZWZpbmUgTUtTSF9ERUZBVUxUX1RNUERJUgkiL3RtcCIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZWNsYWltKHZvaWQpOworc3RhdGljIHZvaWQgcmVtb3ZlX3RlbXBzKHN0cnVjdCB0ZW1wICopOwordm9pZCBjaHZ0X3JlaW5pdCh2b2lkKTsKK1NvdXJjZSAqbWtzaF9pbml0KGludCwgY29uc3QgY2hhciAqW10pOworI2lmZGVmIFNJR1dJTkNICitzdGF0aWMgdm9pZCB4X3NpZ3dpbmNoKGludCk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgaW5pdGlmc1tdID0gIklGUz0gXHRcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGluaXRzdWJzW10gPQorICAgICIke1BTMj0+IH0gJHtQUzM9Iz8gfSAke1BTND0rIH0gJHtTRUNPTkRTPTB9ICR7VE1PVVQ9MH0iOworCitzdGF0aWMgY29uc3QgY2hhciAqaW5pdGNvbXNbXSA9IHsKKwlUX3R5cGVzZXQsICItciIsIGluaXR2c24sIE5VTEwsCisJVF90eXBlc2V0LCAiLXgiLCAiSE9NRSIsICJQQVRIIiwgIlJBTkRPTSIsICJTSEVMTCIsIE5VTEwsCisJVF90eXBlc2V0LCAiLWkxMCIsICJDT0xVTU5TIiwgIkxJTkVTIiwgIk9QVElORCIsICJQR1JQIiwgIlBQSUQiLAorCSAgICAiUkFORE9NIiwgIlNFQ09ORFMiLCAiVE1PVVQiLCAiVVNFUl9JRCIsIE5VTEwsCisJImFsaWFzIiwKKwkiaW50ZWdlcj10eXBlc2V0IC1pIiwKKwlUX2xvY2FsX3R5cGVzZXQsCisJImhhc2g9YWxpYXMgLXQiLAkvKiBub3QgImFsaWFzIC10IC0tIjogaGFzaCAtciBuZWVkcyB0byB3b3JrICovCisJInR5cGU9d2hlbmNlIC12IiwKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJInN1c3BlbmQ9a2lsbCAtU1RPUCAkJCIsCisjZW5kaWYKKwkiYXV0b2xvYWQ9dHlwZXNldCAtZnUiLAorCSJmdW5jdGlvbnM9dHlwZXNldCAtZiIsCisJImhpc3Rvcnk9ZmMgLWwiLAorCSJuYW1lcmVmPXR5cGVzZXQgLW4iLAorCSJub2h1cD1ub2h1cCAiLAorCXJfZmNfZV8sCisJInNvdXJjZT1QQVRIPSRQQVRIOi4gY29tbWFuZCAuIiwKKwkibG9naW49ZXhlYyBsb2dpbiIsCisJTlVMTCwKKwkgLyogdGhpcyBpcyB3aGF0IEFUJlQga3NoIHNlZW1zIHRvIHRyYWNrLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBlbWFjcyAqLworCSJhbGlhcyIsICItdFUiLAorCSJjYXQiLCAiY2MiLCAiY2htb2QiLCAiY3AiLCAiZGF0ZSIsICJlZCIsICJlbWFjcyIsICJncmVwIiwgImxzIiwKKwkibWFrZSIsICJtdiIsICJwciIsICJybSIsICJzZWQiLCAic2giLCAidmkiLCAid2hvIiwgTlVMTCwKKwlOVUxMCit9OworCitzdGF0aWMgaW50IGluaXRpb19kb25lOworCitzdHJ1Y3QgZW52ICplID0gJmtzaHN0YXRlX3YuZW52XzsKKwordm9pZAorY2h2dF9yZWluaXQodm9pZCkKK3sKKwlrc2hwaWQgPSBwcm9jcGlkID0gZ2V0cGlkKCk7CisJa3NoZXVpZCA9IGdldGV1aWQoKTsKKwlrc2hwZ3JwID0gZ2V0cGdycCgpOworCWtzaHBwaWQgPSBnZXRwcGlkKCk7Cit9CisKK1NvdXJjZSAqCitta3NoX2luaXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgYXJnaSwgaTsKKwlTb3VyY2UgKnM7CisJc3RydWN0IGJsb2NrICpsOworCXVuc2lnbmVkIGNoYXIgcmVzdHJpY3RlZCwgZXJyZXhpdCwgdXRmX2ZsYWc7CisJY29uc3QgY2hhciAqKndwOworCXN0cnVjdCB0YmwgKnZwOworCXN0cnVjdCBzdGF0IHNfc3RkaW47CisjaWYgIWRlZmluZWQoX1BBVEhfREVGUEFUSCkgJiYgZGVmaW5lZChfQ1NfUEFUSCkKKwlzaXplX3QgazsKKwljaGFyICpjcDsKKyNlbmRpZgorCisJLyogZG8gdGhpbmdzIGxpa2UgZ2V0cGdycCgpIGV0IGFsLiAqLworCWNodnRfcmVpbml0KCk7CisKKwkvKiBtYWtlIHN1cmUgYXJndltdIGlzIHNhbmUgKi8KKwlpZiAoISphcmd2KSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplbXB0eV9hcmd2W10gPSB7CisJCQkibWtzaCIsIE5VTEwKKwkJfTsKKworCQlhcmd2ID0gZW1wdHlfYXJndjsKKwkJYXJnYyA9IDE7CisJfQorCWtzaG5hbWUgPSAqYXJndjsKKworCWFpbml0KCZhcGVybSk7CQkvKiBpbml0aWFsaXNlIHBlcm1hbmVudCBBcmVhICovCisKKwkvKiBzZXQgdXAgYmFzZSBlbnZpcm9ubWVudCAqLworCWtzaHN0YXRlX3YuZW52Xy50eXBlID0gRV9OT05FOworCWFpbml0KCZrc2hzdGF0ZV92LmVudl8uYXJlYSk7CisJbmV3YmxvY2soKTsJCS8qIHNldCB1cCBnbG9iYWwgbC0+dmFycyBhbmQgbC0+ZnVucyAqLworCisJLyogRG8gdGhpcyBmaXJzdCBzbyBvdXRwdXQgcm91dGluZXMgKGVnLCBlcnJvcmYsIHNoZWxsZikgY2FuIHdvcmsgKi8KKwlpbml0aW8oKTsKKworCWFyZ2kgPSBwYXJzZV9hcmdzKGFyZ3YsIE9GX0ZJUlNUVElNRSwgTlVMTCk7CisJaWYgKGFyZ2kgPCAwKQorCQlyZXR1cm4gKE5VTEwpOworCisJaW5pdHZhcigpOworCisJaW5pdGN0eXBlcygpOworCisJaW5pdHRyYXBzKCk7CisKKwljb3Byb2NfaW5pdCgpOworCisJLyogc2V0IHVwIHZhcmlhYmxlIGFuZCBjb21tYW5kIGRpY3Rpb25hcmllcyAqLworCWt0aW5pdCgmdGFsaWFzZXMsIEFQRVJNLCAwKTsKKwlrdGluaXQoJmFsaWFzZXMsIEFQRVJNLCAwKTsKKyNpZm5kZWYgTUtTSF9OT1BXTkFNCisJa3Rpbml0KCZob21lZGlycywgQVBFUk0sIDApOworI2VuZGlmCisKKwkvKiBkZWZpbmUgc2hlbGwga2V5d29yZHMgKi8KKwlpbml0a2V5d29yZHMoKTsKKworCS8qIGRlZmluZSBidWlsdC1pbiBjb21tYW5kcyAqLworCWt0aW5pdCgmYnVpbHRpbnMsIEFQRVJNLAorCSAgICAvKiBtdXN0IGJlIDgwJSBvZiAyXm4gKGN1cnJlbnRseSA0NCBidWlsdGlucykgKi8gNjQpOworCWZvciAoaSA9IDA7IG1rc2hidWlsdGluc1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJYnVpbHRpbihta3NoYnVpbHRpbnNbaV0ubmFtZSwgbWtzaGJ1aWx0aW5zW2ldLmZ1bmMpOworCisJaW5pdF9oaXN0dmVjKCk7CisKKyNpZmRlZiBfUEFUSF9ERUZQQVRICisJZGVmX3BhdGggPSBfUEFUSF9ERUZQQVRIOworI2Vsc2UKKyNpZmRlZiBfQ1NfUEFUSAorCWlmICgoayA9IGNvbmZzdHIoX0NTX1BBVEgsIE5VTEwsIDApKSAhPSAoc2l6ZV90KS0xICYmIGsgPiAwICYmCisJICAgIGNvbmZzdHIoX0NTX1BBVEgsIGNwID0gYWxsb2MoayArIDEsIEFQRVJNKSwgayArIDEpID09IGsgKyAxKQorCQlkZWZfcGF0aCA9IGNwOworCWVsc2UKKyNlbmRpZgorCQkvKgorCQkgKiB0aGlzIGlzIHVuaWZvcm0gYWNyb3NzIGFsbCBPU2VzIHVubGVzcyBpdAorCQkgKiBicmVha3Mgc29tZXdoZXJlOyBkb24ndCB0cnkgdG8gb3B0aW1pc2UsCisJCSAqIGUuZy4gYWRkIHN0dWZmIGZvciBJbnRlcml4IG9yIHJlbW92ZSAvdXNyCisJCSAqIGZvciBIVVJELCBiZWNhdXNlIGUuZy4gRGViaWFuIEdOVS9IVVJEIGlzCisJCSAqICJrZWVwaW5nIGEgcmVndWxhciAvdXNyIjsgdGhpcyBpcyBzdXBwb3NlZAorCQkgKiB0byBiZSBhIHNhbmUgJ2Jhc2ljJyBkZWZhdWx0IFBBVEgKKwkJICovCisJCWRlZl9wYXRoID0gIi9iaW46L3Vzci9iaW46L3NiaW46L3Vzci9zYmluIjsKKyNlbmRpZgorCisJLyogU2V0IFBBVEggdG8gZGVmX3BhdGggKHdpbGwgc2V0IHRoZSBwYXRoIGdsb2JhbCB2YXJpYWJsZSkuCisJICogKGltcG9ydCBvZiBlbnZpcm9ubWVudCBiZWxvdyB3aWxsIHByb2JhYmx5IGNoYW5nZSB0aGlzIHNldHRpbmcpLgorCSAqLworCXZwID0gZ2xvYmFsKCJQQVRIIik7CisJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLworCXNldHN0cih2cCwgZGVmX3BhdGgsIEtTSF9SRVRVUk5fRVJST1IpOworCisJLyogVHVybiBvbiBub2h1cCBieSBkZWZhdWx0IGZvciBub3cgLSB3aWxsIGNoYW5nZSB0byBvZmYKKwkgKiBieSBkZWZhdWx0IG9uY2UgcGVvcGxlIGFyZSBhd2FyZSBvZiBpdHMgZXhpc3RlbmNlCisJICogKEFUJlQga3NoIGRvZXMgbm90IGhhdmUgYSBub2h1cCBvcHRpb24gLSBpdCBhbHdheXMgc2VuZHMKKwkgKiB0aGUgaHVwKS4KKwkgKi8KKwlGbGFnKEZOT0hVUCkgPSAxOworCisJLyogVHVybiBvbiBicmFjZSBleHBhbnNpb24gYnkgZGVmYXVsdC4gQVQmVCBrc2hzIHRoYXQgaGF2ZQorCSAqIGFsdGVybmF0aW9uIGFsd2F5cyBoYXZlIGl0IG9uLgorCSAqLworCUZsYWcoRkJSQUNFRVhQQU5EKSA9IDE7CisKKwkvKiBTZXQgZWRpdCBtb2RlIHRvIGVtYWNzIGJ5IGRlZmF1bHQsIG1heSBiZSBvdmVycmlkZGVuCisJICogYnkgdGhlIGVudmlyb25tZW50IG9yIHRoZSB1c2VyLiBBbHNvLCB3ZSB3YW50IHRhYiBjb21wbGV0aW9uCisJICogb24gaW4gdmkgYnkgZGVmYXVsdC4gKi8KKwljaGFuZ2VfZmxhZyhGRU1BQ1MsIE9GX1NQRUNJQUwsIDEpOworI2lmICFNS1NIX1NfTk9WSQorCUZsYWcoRlZJVEFCQ09NUExFVEUpID0gMTsKKyNlbmRpZgorCisjaWZkZWYgTUtTSF9CSU5TSFJFRFVDRUQKKwkvKiBzZXQgRlNIIGlmIHdlJ3JlIGNhbGxlZCBhcyAtc2ggb3IgL2Jpbi9zaCBvciBzbyAqLworCXsKKwkJY29uc3QgY2hhciAqY2M7CisKKwkJY2MgPSBrc2huYW1lOworCQlpID0gMDsgYXJnaSA9IDA7CisJCXdoaWxlIChjY1tpXSAhPSAnXDAnKQorCQkJLyogdGhlIGZvbGxvd2luZyBsaW5lIG1hdGNoZXMgJy0nIGFuZCAnLycgOy0pICovCisJCQlpZiAoKGNjW2krK10gfCAyKSA9PSAnLycpCisJCQkJYXJnaSA9IGk7CisJCWlmICgoKGNjW2FyZ2ldIHwgMHgyMCkgPT0gJ3MnKSAmJiAoKGNjW2FyZ2kgKyAxXSB8IDB4MjApID09ICdoJykpCisJCQljaGFuZ2VfZmxhZyhGU0gsIE9GX0ZJUlNUVElNRSwgMSk7CisJfQorI2VuZGlmCisKKwkvKiBpbXBvcnQgZW52aXJvbm1lbnQgKi8KKwlpZiAoZW52aXJvbiAhPSBOVUxMKQorCQlmb3IgKHdwID0gKGNvbnN0IGNoYXIgKiopZW52aXJvbjsgKndwICE9IE5VTEw7IHdwKyspCisJCQl0eXBlc2V0KCp3cCwgSU1QT1JUIHwgRVhQT1JULCAwLCAwLCAwKTsKKworCXR5cGVzZXQoaW5pdGlmcywgMCwgMCwgMCwgMCk7CS8qIGZvciBzZWN1cml0eSAqLworCisJLyogYXNzaWduIGRlZmF1bHQgc2hlbGwgdmFyaWFibGUgdmFsdWVzICovCisJc3Vic3RpdHV0ZShpbml0c3VicywgMCk7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBzZXQgJFBXRCAqLworCXsKKwkJc3RydWN0IHN0YXQgc19wd2QsIHNfZG90OworCQlzdHJ1Y3QgdGJsICpwd2RfdiA9IGdsb2JhbCgiUFdEIik7CisJCWNoYXIgKnB3ZCA9IHN0cl92YWwocHdkX3YpOworCQljaGFyICpwd2R4ID0gcHdkOworCisJCS8qIFRyeSB0byB1c2UgZXhpc3RpbmcgJFBXRCBpZiBpdCBpcyB2YWxpZCAqLworCQlpZiAocHdkWzBdICE9ICcvJyB8fAorCQkgICAgc3RhdChwd2QsICZzX3B3ZCkgPCAwIHx8IHN0YXQoIi4iLCAmc19kb3QpIDwgMCB8fAorCQkgICAgc19wd2Quc3RfZGV2ICE9IHNfZG90LnN0X2RldiB8fAorCQkgICAgc19wd2Quc3RfaW5vICE9IHNfZG90LnN0X2lubykKKwkJCXB3ZHggPSBOVUxMOworCQlzZXRfY3VycmVudF93ZChwd2R4KTsKKwkJaWYgKGN1cnJlbnRfd2RbMF0pCisJCQlzaW1wbGlmeV9wYXRoKGN1cnJlbnRfd2QpOworCQkvKiBPbmx5IHNldCBwd2QgaWYgd2Uga25vdyB3aGVyZSB3ZSBhcmUgb3IgaWYgaXQgaGFkIGEKKwkJICogYm9ndXMgdmFsdWUKKwkJICovCisJCWlmIChjdXJyZW50X3dkWzBdIHx8IHB3ZCAhPSBudWxsKQorCQkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLworCQkJc2V0c3RyKHB3ZF92LCBjdXJyZW50X3dkLCBLU0hfUkVUVVJOX0VSUk9SKTsKKwl9CisKKwlmb3IgKHdwID0gaW5pdGNvbXM7ICp3cCAhPSBOVUxMOyB3cCsrKSB7CisJCXNoY29tZXhlYyh3cCk7CisJCXdoaWxlICgqd3AgIT0gTlVMTCkKKwkJCXdwKys7CisJfQorCXNldGludChnbG9iYWwoIkNPTFVNTlMiKSwgMCk7CisJc2V0aW50KGdsb2JhbCgiTElORVMiKSwgMCk7CisJc2V0aW50KGdsb2JhbCgiT1BUSU5EIiksIDEpOworCisJc2FmZV9wcm9tcHQgPSBrc2hldWlkID8gIiQgIiA6ICIjICI7CisJdnAgPSBnbG9iYWwoIlBTMSIpOworCS8qIFNldCBQUzEgaWYgdW5zZXQgb3Igd2UgYXJlIHJvb3QgYW5kIHByb21wdCBkb2Vzbid0IGNvbnRhaW4gYSAjICovCisJaWYgKCEodnAtPmZsYWcgJiBJU1NFVCkgfHwKKwkgICAgKCFrc2hldWlkICYmICFzdHJjaHIoc3RyX3ZhbCh2cCksICcjJykpKQorCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCisJCXNldHN0cih2cCwgc2FmZV9wcm9tcHQsIEtTSF9SRVRVUk5fRVJST1IpOworCXNldGludCgodnAgPSBnbG9iYWwoIlBHUlAiKSksIChta3NoX3VhcmlfdClrc2hwZ3JwKTsKKwl2cC0+ZmxhZyB8PSBJTlRfVTsKKwlzZXRpbnQoKHZwID0gZ2xvYmFsKCJQUElEIikpLCAobWtzaF91YXJpX3Qpa3NocHBpZCk7CisJdnAtPmZsYWcgfD0gSU5UX1U7CisJc2V0aW50KCh2cCA9IGdsb2JhbCgiUkFORE9NIikpLCAobWtzaF91YXJpX3QpZXZpbGhhc2goa3NobmFtZSkpOworCXZwLT5mbGFnIHw9IElOVF9VOworCXNldGludCgodnAgPSBnbG9iYWwoIlVTRVJfSUQiKSksIChta3NoX3VhcmlfdClrc2hldWlkKTsKKwl2cC0+ZmxhZyB8PSBJTlRfVTsKKworCS8qIFNldCB0aGlzIGJlZm9yZSBwYXJzaW5nIGFyZ3VtZW50cyAqLworI2lmIEhBVkVfU0VUUkVTVUdJRAorCUZsYWcoRlBSSVZJTEVHRUQpID0gZ2V0dWlkKCkgIT0ga3NoZXVpZCB8fCBnZXRnaWQoKSAhPSBnZXRlZ2lkKCk7CisjZWxzZQorCUZsYWcoRlBSSVZJTEVHRUQpID0gKGtzaHVpZCA9IGdldHVpZCgpKSAhPSBrc2hldWlkIHx8CisJICAgIChrc2hnaWQgPSBnZXRnaWQoKSkgIT0gKGtzaGVnaWQgPSBnZXRlZ2lkKCkpOworI2VuZGlmCisKKwkvKiB0aGlzIHRvIG5vdGUgaWYgbW9uaXRvciBpcyBzZXQgb24gY29tbWFuZCBsaW5lIChzZWUgYmVsb3cpICovCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCUZsYWcoRk1PTklUT1IpID0gMTI3OworI2VuZGlmCisJLyogdGhpcyB0byBub3RlIGlmIHV0Zi04IG1vZGUgaXMgc2V0IG9uIGNvbW1hbmQgbGluZSAoc2VlIGJlbG93KSAqLworCVVURk1PREUgPSAyOworCisJYXJnaSA9IHBhcnNlX2FyZ3MoYXJndiwgT0ZfQ01ETElORSwgTlVMTCk7CisJaWYgKGFyZ2kgPCAwKQorCQlyZXR1cm4gKE5VTEwpOworCisJLyogcHJvY2VzcyB0aGlzIGxhdGVyIG9ubHksIGRlZmF1bHQgdG8gb2ZmIChoeXN0ZXJpY2FsIHJhaXNpbnMpICovCisJdXRmX2ZsYWcgPSBVVEZNT0RFOworCVVURk1PREUgPSAwOworCisJaWYgKEZsYWcoRkNPTU1BTkQpKSB7CisJCXMgPSBwdXNocyhTU1RSSU5HLCBBVEVNUCk7CisJCWlmICghKHMtPnN0YXJ0ID0gcy0+c3RyID0gYXJndlthcmdpKytdKSkKKwkJCWVycm9yZigiLWMgcmVxdWlyZXMgYW4gYXJndW1lbnQiKTsKKyNpZmRlZiBNS1NIX01JRE5JR0hUQlNEMDFBU0hfQ09NUEFUCisJCS8qIGNvbXBhdGliaWxpdHkgdG8gTWlkbmlnaHRCU0QgMC4xIC9iaW4vc2ggKGtsdWRnZSkgKi8KKwkJaWYgKEZsYWcoRlNIKSAmJiBhcmd2W2FyZ2ldICYmICFzdHJjbXAoYXJndlthcmdpXSwgIi0tIikpCisJCQkrK2FyZ2k7CisjZW5kaWYKKwkJaWYgKGFyZ3ZbYXJnaV0pCisJCQlrc2huYW1lID0gYXJndlthcmdpKytdOworCX0gZWxzZSBpZiAoYXJnaSA8IGFyZ2MgJiYgIUZsYWcoRlNURElOKSkgeworCQlzID0gcHVzaHMoU0ZJTEUsIEFURU1QKTsKKwkJcy0+ZmlsZSA9IGFyZ3ZbYXJnaSsrXTsKKwkJcy0+dS5zaGYgPSBzaGZfb3BlbihzLT5maWxlLCBPX1JET05MWSwgMCwKKwkJICAgIFNIRl9NQVBISSB8IFNIRl9DTEVYRUMpOworCQlpZiAocy0+dS5zaGYgPT0gTlVMTCkgeworCQkJc2hsX3N0ZG91dF9vayA9IDA7CisJCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIiwgcy0+ZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCS8qIG1hbmRhdGVkIGJ5IFNVU3Y0ICovCisJCQlleHN0YXQgPSAxMjc7CisJCQl1bndpbmQoTEVSUk9SKTsKKwkJfQorCQlrc2huYW1lID0gcy0+ZmlsZTsKKwl9IGVsc2UgeworCQlGbGFnKEZTVERJTikgPSAxOworCQlzID0gcHVzaHMoU1NURElOLCBBVEVNUCk7CisJCXMtPmZpbGUgPSAiPHN0ZGluPiI7CisJCXMtPnUuc2hmID0gc2hmX2Zkb3BlbigwLCBTSEZfUkQgfCBjYW5fc2VlaygwKSwKKwkJICAgIE5VTEwpOworCQlpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgyKSkgeworCQkJRmxhZyhGVEFMS0lORykgPSBGbGFnKEZUQUxLSU5HX0kpID0gMTsKKwkJCS8qIFRoZSBmb2xsb3dpbmcgb25seSBpZiBpc2F0dHkoMCkgKi8KKwkJCXMtPmZsYWdzIHw9IFNGX1RUWTsKKwkJCXMtPnUuc2hmLT5mbGFncyB8PSBTSEZfSU5URVJSVVBUOworCQkJcy0+ZmlsZSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiB0aGlzIGJpemFycmVuZXNzIGlzIG1hbmRhdGVkIGJ5IFBPU0lYICovCisJaWYgKGZzdGF0KDAsICZzX3N0ZGluKSA+PSAwICYmIFNfSVNDSFIoc19zdGRpbi5zdF9tb2RlKSAmJgorCSAgICBGbGFnKEZUQUxLSU5HKSkKKwkJcmVzZXRfbm9uYmxvY2soMCk7CisKKwkvKiBpbml0aWFsaXNlIGpvYiBjb250cm9sICovCisJal9pbml0KCk7CisJLyogc2V0OiAwLzE7IHVuc2V0OiAyLT4wICovCisJVVRGTU9ERSA9IHV0Zl9mbGFnICYgMTsKKwkvKiBEbyB0aGlzIGFmdGVyIGpfaW5pdCgpLCBhcyB0dHlfZmQgaXMgbm90IGluaXRpYWxpc2VkIHVudGlsIHRoZW4gKi8KKwlpZiAoRmxhZyhGVEFMS0lORykpIHsKKwkJaWYgKHV0Zl9mbGFnID09IDIpIHsKKyNpZm5kZWYgTUtTSF9BU1NVTUVfVVRGOAorI2RlZmluZSBpc3VjKHgpCSgoKHgpICE9IE5VTEwpICYmIFwKKwkJICAgIChzdHJpc3RyKCh4KSwgIlVURi04IikgfHwgc3RyaXN0cigoeCksICJ1dGY4IikpKQorCQkvKiBDaGVjayBpZiB3ZSdyZSBpbiBhIFVURi04IGxvY2FsZSAqLworCQkJY29uc3QgY2hhciAqY2NwOworCisjaWYgSEFWRV9TRVRMT0NBTEVfQ1RZUEUKKwkJCWNjcCA9IHNldGxvY2FsZShMQ19DVFlQRSwgIiIpOworI2lmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAorCQkJaWYgKCFpc3VjKGNjcCkpCisJCQkJY2NwID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CisjZW5kaWYKKyNlbHNlCisJCQkvKiB0aGVzZSB3ZXJlIGltcG9ydGVkIGZyb20gZW52aXJvbiBlYXJsaWVyICovCisJCQljY3AgPSBzdHJfdmFsKGdsb2JhbCgiTENfQUxMIikpOworCQkJaWYgKGNjcCA9PSBudWxsKQorCQkJCWNjcCA9IHN0cl92YWwoZ2xvYmFsKCJMQ19DVFlQRSIpKTsKKwkJCWlmIChjY3AgPT0gbnVsbCkKKwkJCQljY3AgPSBzdHJfdmFsKGdsb2JhbCgiTEFORyIpKTsKKyNlbmRpZgorCQkJVVRGTU9ERSA9IGlzdWMoY2NwKTsKKyN1bmRlZiBpc3VjCisjZWxpZiBNS1NIX0FTU1VNRV9VVEY4CisJCQlVVEZNT0RFID0gMTsKKyNlbHNlCisJCQlVVEZNT0RFID0gMDsKKyNlbmRpZgorCQl9CisJCXhfaW5pdCgpOworCX0KKworI2lmZGVmIFNJR1dJTkNICisJc2lndHJhcHNbU0lHV0lOQ0hdLmZsYWdzIHw9IFRGX1NIRUxMX1VTRVM7CisJc2V0c2lnKCZzaWd0cmFwc1tTSUdXSU5DSF0sIHhfc2lnd2luY2gsCisJICAgIFNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRXxTU19TSFRSQVApOworI2VuZGlmCisKKwlsID0gZS0+bG9jOworCWwtPmFyZ3YgPSAmYXJndlthcmdpIC0gMV07CisJbC0+YXJnYyA9IGFyZ2MgLSBhcmdpOworCWwtPmFyZ3ZbMF0gPSBrc2huYW1lOworCWdldG9wdHNfcmVzZXQoMSk7CisKKwkvKiBEaXNhYmxlIGR1cmluZyAucHJvZmlsZS9FTlYgcmVhZGluZyAqLworCXJlc3RyaWN0ZWQgPSBGbGFnKEZSRVNUUklDVEVEKTsKKwlGbGFnKEZSRVNUUklDVEVEKSA9IDA7CisJZXJyZXhpdCA9IEZsYWcoRkVSUkVYSVQpOworCUZsYWcoRkVSUkVYSVQpID0gMDsKKworCS8qIERvIHRoaXMgYmVmb3JlIHByb2ZpbGUvJEVOViBzbyB0aGF0IGlmIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiB0aGVtLAorCSAqIHVzZXIgd2lsbCBrbm93IHdoeSB0aGluZ3MgYnJva2UuCisJICovCisJaWYgKCFjdXJyZW50X3dkWzBdICYmIEZsYWcoRlRBTEtJTkcpKQorCQl3YXJuaW5nZihmYWxzZSwgIkNhbm5vdCBkZXRlcm1pbmUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIpOworCisJaWYgKEZsYWcoRkxPR0lOKSkgeworCQlpbmNsdWRlKEtTSF9TWVNURU1fUFJPRklMRSwgMCwgTlVMTCwgMSk7CisJCWlmICghRmxhZyhGUFJJVklMRUdFRCkpCisJCQlpbmNsdWRlKHN1YnN0aXR1dGUoIiRIT01FLy5wcm9maWxlIiwgMCksIDAsCisJCQkgICAgTlVMTCwgMSk7CisJfQorCWlmIChGbGFnKEZQUklWSUxFR0VEKSkKKwkJaW5jbHVkZSgiL2V0Yy9zdWlkX3Byb2ZpbGUiLCAwLCBOVUxMLCAxKTsKKwllbHNlIGlmIChGbGFnKEZUQUxLSU5HKSkgeworCQljaGFyICplbnZfZmlsZTsKKworCQkvKiBpbmNsdWRlICRFTlYgKi8KKwkJZW52X2ZpbGUgPSBzdWJzdGl0dXRlKHN1YnN0aXR1dGUoIiR7RU5WOi0iIE1LU0hSQ19QQVRIICJ9IiwgMCksCisJCSAgICBET1RJTERFKTsKKwkJaWYgKCplbnZfZmlsZSAhPSAnXDAnKQorCQkJaW5jbHVkZShlbnZfZmlsZSwgMCwgTlVMTCwgMSk7CisJfQorCisJaWYgKHJlc3RyaWN0ZWQpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKnJlc3RyX2NvbVtdID0geworCQkJVF90eXBlc2V0LCAiLXIiLCAiUEFUSCIsCisJCQkiRU5WIiwgIlNIRUxMIiwKKwkJCU5VTEwKKwkJfTsKKwkJc2hjb21leGVjKHJlc3RyX2NvbSk7CisJCS8qIEFmdGVyIHR5cGVzZXQgY29tbWFuZC4uLiAqLworCQlGbGFnKEZSRVNUUklDVEVEKSA9IDE7CisJfQorCUZsYWcoRkVSUkVYSVQpID0gZXJyZXhpdDsKKworCWlmIChGbGFnKEZUQUxLSU5HKSkgeworCQloaXN0X2luaXQocyk7CisJCWFsYXJtX2luaXQoKTsKKwl9IGVsc2UKKwkJRmxhZyhGVFJBQ0tBTEwpID0gMTsJLyogc2V0IGFmdGVyIEVOViAqLworCisJcmV0dXJuIChzKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCit7CisJU291cmNlICpzOworCisJa3Noc3RhdGVfdi5sY2dfc3RhdGVfID0gNTM4MTsKKworCWlmICgocyA9IG1rc2hfaW5pdChhcmdjLCBhcmd2KSkpIHsKKwkJLyogcHV0IG1vcmUgZW50cm9weSBpbnRvIHRoZSBMQ0cgKi8KKwkJY2hhbmdlX3JhbmRvbShzLCBzaXplb2YoKnMpKTsKKwkJLyogZG9lc27igJl0IHJldHVybiAqLworCQlzaGVsbChzLCB0cnVlKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworaW50CitpbmNsdWRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgaW50IGludHJfb2spCit7CisJU291cmNlICp2b2xhdGlsZSBzID0gTlVMTDsKKwlzdHJ1Y3Qgc2hmICpzaGY7CisJY29uc3QgY2hhciAqKnZvbGF0aWxlIG9sZF9hcmd2OworCXZvbGF0aWxlIGludCBvbGRfYXJnYzsKKwlpbnQgaTsKKworCXNoZiA9IHNoZl9vcGVuKG5hbWUsIE9fUkRPTkxZLCAwLCBTSEZfTUFQSEkgfCBTSEZfQ0xFWEVDKTsKKwlpZiAoc2hmID09IE5VTEwpCisJCXJldHVybiAoLTEpOworCisJaWYgKGFyZ3YpIHsKKwkJb2xkX2FyZ3YgPSBlLT5sb2MtPmFyZ3Y7CisJCW9sZF9hcmdjID0gZS0+bG9jLT5hcmdjOworCX0gZWxzZSB7CisJCW9sZF9hcmd2ID0gTlVMTDsKKwkJb2xkX2FyZ2MgPSAwOworCX0KKwluZXdlbnYoRV9JTkNMKTsKKwlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCWlmIChpKSB7CisJCXF1aXRlbnYocyA/IHMtPnUuc2hmIDogTlVMTCk7CisJCWlmIChvbGRfYXJndikgeworCQkJZS0+bG9jLT5hcmd2ID0gb2xkX2FyZ3Y7CisJCQllLT5sb2MtPmFyZ2MgPSBvbGRfYXJnYzsKKwkJfQorCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSBMUkVUVVJOOgorCQljYXNlIExFUlJPUjoKKwkJCXJldHVybiAoZXhzdGF0ICYgMHhmZik7IC8qIHNlZSBiZWxvdyAqLworCQljYXNlIExJTlRSOgorCQkJLyogaW50cl9vayBpcyBzZXQgaWYgd2UgYXJlIGluY2x1ZGluZyAucHJvZmlsZSBvciAkRU5WLgorCQkJICogSWYgdXNlciBeQ3Mgb3V0LCB3ZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlIHNoZWxsLi4uCisJCQkgKi8KKwkJCWlmIChpbnRyX29rICYmIChleHN0YXQgLSAxMjgpICE9IFNJR1RFUk0pCisJCQkJcmV0dXJuICgxKTsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgTEVYSVQ6CisJCWNhc2UgTExFQVZFOgorCQljYXNlIExTSEVMTDoKKwkJCXVud2luZChpKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJZGVmYXVsdDoKKwkJCWludGVybmFsX2Vycm9yZigiaW5jbHVkZTogJWQiLCBpKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKwlpZiAoYXJndikgeworCQllLT5sb2MtPmFyZ3YgPSBhcmd2OworCQllLT5sb2MtPmFyZ2MgPSBhcmdjOworCX0KKwlzID0gcHVzaHMoU0ZJTEUsIEFURU1QKTsKKwlzLT51LnNoZiA9IHNoZjsKKwlzdHJkdXB4KHMtPmZpbGUsIG5hbWUsIEFURU1QKTsKKwlpID0gc2hlbGwocywgZmFsc2UpOworCXF1aXRlbnYocy0+dS5zaGYpOworCWlmIChvbGRfYXJndikgeworCQllLT5sb2MtPmFyZ3YgPSBvbGRfYXJndjsKKwkJZS0+bG9jLT5hcmdjID0gb2xkX2FyZ2M7CisJfQorCXJldHVybiAoaSAmIDB4ZmYpOwkvKiAmIDB4ZmYgdG8gZW5zdXJlIHZhbHVlIG5vdCAtMSAqLworfQorCisvKiBzcGF3biBhIGNvbW1hbmQgaW50byBhIHNoZWxsIG9wdGlvbmFsbHkga2VlcGluZyB0cmFjayBvZiB0aGUgbGluZSBudW1iZXIgKi8KK2ludAorY29tbWFuZChjb25zdCBjaGFyICpjb21tLCBpbnQgbGluZSkKK3sKKwlTb3VyY2UgKnM7CisKKwlzID0gcHVzaHMoU1NUUklORywgQVRFTVApOworCXMtPnN0YXJ0ID0gcy0+c3RyID0gY29tbTsKKwlzLT5saW5lID0gbGluZTsKKwlyZXR1cm4gKHNoZWxsKHMsIGZhbHNlKSk7Cit9CisKKy8qCisgKiBydW4gdGhlIGNvbW1hbmRzIGZyb20gdGhlIGlucHV0IHNvdXJjZSwgcmV0dXJuaW5nIHN0YXR1cy4KKyAqLworaW50CitzaGVsbChTb3VyY2UgKiB2b2xhdGlsZSBzLCB2b2xhdGlsZSBpbnQgdG9wbGV2ZWwpCit7CisJc3RydWN0IG9wICp0OworCXZvbGF0aWxlIGludCB3YXN0dHkgPSBzLT5mbGFncyAmIFNGX1RUWTsKKwl2b2xhdGlsZSBpbnQgYXR0ZW1wdHMgPSAxMzsKKwl2b2xhdGlsZSBpbnQgaW50ZXJhY3RpdmUgPSBGbGFnKEZUQUxLSU5HKSAmJiB0b3BsZXZlbDsKKwlTb3VyY2UgKnZvbGF0aWxlIG9sZF9zb3VyY2UgPSBzb3VyY2U7CisJaW50IGk7CisKKwlzLT5mbGFncyB8PSBTRl9GSVJTVDsJLyogZW5hYmxlIFVURi04IEJPTSBjaGVjayAqLworCisJbmV3ZW52KEVfUEFSU0UpOworCWlmIChpbnRlcmFjdGl2ZSkKKwkJcmVhbGx5X2V4aXQgPSAwOworCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJaWYgKGkpIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgTElOVFI6IC8qIHdlIGdldCBoZXJlIGlmIFNJR0lOVCBub3QgY2F1Z2h0IG9yIGlnbm9yZWQgKi8KKwkJY2FzZSBMRVJST1I6CisJCWNhc2UgTFNIRUxMOgorCQkJaWYgKGludGVyYWN0aXZlKSB7CisJCQkJaWYgKGkgPT0gTElOVFIpCisJCQkJCXNoZWxsZigiXG4iKTsKKwkJCQkvKiBSZXNldCBhbnkgZW9mIHRoYXQgd2FzIHJlYWQgYXMgcGFydCBvZiBhCisJCQkJICogbXVsdGlsaW5lIGNvbW1hbmQuCisJCQkJICovCisJCQkJaWYgKEZsYWcoRklHTk9SRUVPRikgJiYgcy0+dHlwZSA9PSBTRU9GICYmCisJCQkJICAgIHdhc3R0eSkKKwkJCQkJcy0+dHlwZSA9IFNTVERJTjsKKwkJCQkvKiBVc2VkIGJ5IGV4aXQgY29tbWFuZCB0byBnZXQgYmFjayB0bworCQkJCSAqIHRvcCBsZXZlbCBzaGVsbC4gS2luZCBvZiBzdHJhbmdlIHNpbmNlCisJCQkJICogaW50ZXJhY3RpdmUgaXMgc2V0IGlmIHdlIGFyZSByZWFkaW5nIGZyb20KKwkJCQkgKiBhIHR0eSwgYnV0IHRvIGhhdmUgc3RvcHBlZCBqb2JzLCBvbmUgb25seQorCQkJCSAqIG5lZWRzIEZNT05JVE9SIHNldCAobm90IEZUQUxLSU5HL1NGX1RUWSkuLi4KKwkJCQkgKi8KKwkJCQkvKiB0b3NzIGFueSBpbnB1dCB3ZSBoYXZlIHNvIGZhciAqLworCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gbnVsbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgTEVYSVQ6CisJCWNhc2UgTExFQVZFOgorCQljYXNlIExSRVRVUk46CisJCQlzb3VyY2UgPSBvbGRfc291cmNlOworCQkJcXVpdGVudihOVUxMKTsKKwkJCXVud2luZChpKTsJLyoga2VlcCBvbiBnb2luZyAqLworCQkJLyogTk9UUkVBQ0hFRCAqLworCQlkZWZhdWx0OgorCQkJc291cmNlID0gb2xkX3NvdXJjZTsKKwkJCXF1aXRlbnYoTlVMTCk7CisJCQlpbnRlcm5hbF9lcnJvcmYoInNoZWxsOiAlZCIsIGkpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJfQorCXdoaWxlICgxKSB7CisJCWlmICh0cmFwKQorCQkJcnVudHJhcHMoMCk7CisKKwkJaWYgKHMtPm5leHQgPT0gTlVMTCkgeworCQkJaWYgKEZsYWcoRlZFUkJPU0UpKQorCQkJCXMtPmZsYWdzIHw9IFNGX0VDSE87CisJCQllbHNlCisJCQkJcy0+ZmxhZ3MgJj0gflNGX0VDSE87CisJCX0KKwkJaWYgKGludGVyYWN0aXZlKSB7CisJCQlqX25vdGlmeSgpOworCQkJc2V0X3Byb21wdChQUzEsIHMpOworCQl9CisJCXQgPSBjb21waWxlKHMpOworCQlpZiAodCAhPSBOVUxMICYmIHQtPnR5cGUgPT0gVEVPRikgeworCQkJaWYgKHdhc3R0eSAmJiBGbGFnKEZJR05PUkVFT0YpICYmIC0tYXR0ZW1wdHMgPiAwKSB7CisJCQkJc2hlbGxmKCJVc2UgJ2V4aXQnIHRvIGxlYXZlIGtzaFxuIik7CisJCQkJcy0+dHlwZSA9IFNTVERJTjsKKwkJCX0gZWxzZSBpZiAod2FzdHR5ICYmICFyZWFsbHlfZXhpdCAmJgorCQkJICAgIGpfc3RvcHBlZF9ydW5uaW5nKCkpIHsKKwkJCQlyZWFsbHlfZXhpdCA9IDE7CisJCQkJcy0+dHlwZSA9IFNTVERJTjsKKwkJCX0gZWxzZSB7CisJCQkJLyogdGhpcyBmb3IgUE9TSVggd2hpY2ggc2F5cyBFWElUIHRyYXBzCisJCQkJICogc2hhbGwgYmUgdGFrZW4gaW4gdGhlIGVudmlyb25tZW50CisJCQkJICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGxhc3QgY29tbWFuZAorCQkJCSAqIGV4ZWN1dGVkLgorCQkJCSAqLworCQkJCWlmICh0b3BsZXZlbCkKKwkJCQkJdW53aW5kKExFWElUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodCAmJiAoIUZsYWcoRk5PRVhFQykgfHwgKHMtPmZsYWdzICYgU0ZfVFRZKSkpCisJCQlleHN0YXQgPSBleGVjdXRlKHQsIDAsIE5VTEwpOworCisJCWlmICh0ICE9IE5VTEwgJiYgdC0+dHlwZSAhPSBURU9GICYmIGludGVyYWN0aXZlICYmIHJlYWxseV9leGl0KQorCQkJcmVhbGx5X2V4aXQgPSAwOworCisJCXJlY2xhaW0oKTsKKwl9CisJcXVpdGVudihOVUxMKTsKKwlzb3VyY2UgPSBvbGRfc291cmNlOworCXJldHVybiAoZXhzdGF0KTsKK30KKworLyogcmV0dXJuIHRvIGNsb3Nlc3QgZXJyb3IgaGFuZGxlciBvciBzaGVsbCgpLCBleGl0IGlmIG5vbmUgZm91bmQgKi8KK3ZvaWQKK3Vud2luZChpbnQgaSkKK3sKKwkvKiBvcmRlcmluZyBmb3IgRVhJVCB2cyBFUlIgaXMgYSBiaXQgb2RkICh0aGlzIGlzIHdoYXQgQVQmVCBrc2ggZG9lcykgKi8KKwlpZiAoaSA9PSBMRVhJVCB8fCAoRmxhZyhGRVJSRVhJVCkgJiYgKGkgPT0gTEVSUk9SIHx8IGkgPT0gTElOVFIpICYmCisJICAgIHNpZ3RyYXBzW1NJR0VYSVRfXS50cmFwKSkgeworCQlydW50cmFwKCZzaWd0cmFwc1tTSUdFWElUX10pOworCQlpID0gTExFQVZFOworCX0gZWxzZSBpZiAoRmxhZyhGRVJSRVhJVCkgJiYgKGkgPT0gTEVSUk9SIHx8IGkgPT0gTElOVFIpKSB7CisJCXJ1bnRyYXAoJnNpZ3RyYXBzW1NJR0VSUl9dKTsKKwkJaSA9IExMRUFWRTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJc3dpdGNoIChlLT50eXBlKSB7CisJCWNhc2UgRV9QQVJTRToKKwkJY2FzZSBFX0ZVTkM6CisJCWNhc2UgRV9JTkNMOgorCQljYXNlIEVfTE9PUDoKKwkJY2FzZSBFX0VSUkg6CisJCQlzaWdsb25nam1wKGUtPmpidWYsIGkpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQljYXNlIEVfTk9ORToKKwkJCWlmIChpID09IExJTlRSKQorCQkJCWUtPmZsYWdzIHw9IEVGX0ZBS0VfU0lHRElFOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCXF1aXRlbnYoTlVMTCk7CisJCX0KKwl9Cit9CisKK3ZvaWQKK25ld2VudihpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZW52ICplcDsKKwljaGFyICpjcDsKKworCS8qCisJICogc3RydWN0IGVudiBpbmNsdWRlcyBBTExPQ19JVEVNIGZvciBhbGlnbm1lbnQgY29uc3RyYWludHMKKwkgKiBzbyBmaXJzdCBnZXQgdGhlIGFjdHVhbGx5IHVzZWQgbWVtb3J5LCB0aGVuIGFzc2lnbiBpdAorCSAqLworCWNwID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbnYpIC0gQUxMT0NfU0laRSwgQVRFTVApOworCWVwID0gKHZvaWQgKikoY3AgLSBBTExPQ19TSVpFKTsJLyogdW5kbyB3aGF0IGFsbG9jKCkgZGlkICovCisJLyogaW5pdGlhbGlzZSBwdWJsaWMgbWVtYmVycyBvZiBzdHJ1Y3QgZW52IChub3QgdGhlIEFMTE9DX0lURU0pICovCisJYWluaXQoJmVwLT5hcmVhKTsKKwllcC0+b2VudiA9IGU7CisJZXAtPmxvYyA9IGUtPmxvYzsKKwllcC0+c2F2ZWZkID0gTlVMTDsKKwllcC0+dGVtcHMgPSBOVUxMOworCWVwLT50eXBlID0gdHlwZTsKKwllcC0+ZmxhZ3MgPSAwOworCS8qIGp1bXAgYnVmZmVyIGlzIGludmFsaWQgYmVjYXVzZSBmbGFncyA9PSAwICovCisJZSA9IGVwOworfQorCit2b2lkCitxdWl0ZW52KHN0cnVjdCBzaGYgKnNoZikKK3sKKwlzdHJ1Y3QgZW52ICplcCA9IGU7CisJY2hhciAqY3A7CisJaW50IGZkOworCisJaWYgKGVwLT5vZW52ICYmIGVwLT5vZW52LT5sb2MgIT0gZXAtPmxvYykKKwkJcG9wYmxvY2soKTsKKwlpZiAoZXAtPnNhdmVmZCAhPSBOVUxMKSB7CisJCWZvciAoZmQgPSAwOyBmZCA8IE5VRklMRTsgZmQrKykKKwkJCS8qIGlmIGVwLT5zYXZlZmRbZmRdIDwgMCwgbWVhbnMgZmQgd2FzIGNsb3NlZCAqLworCQkJaWYgKGVwLT5zYXZlZmRbZmRdKQorCQkJCXJlc3RmZChmZCwgZXAtPnNhdmVmZFtmZF0pOworCQlpZiAoZXAtPnNhdmVmZFsyXSkJLyogQ2xlYXIgYW55IHdyaXRlIGVycm9ycyAqLworCQkJc2hmX3Jlb3BlbigyLCBTSEZfV1IsIHNobF9vdXQpOworCX0KKwkvKiBCb3R0b20gb2YgdGhlIHN0YWNrLgorCSAqIEVpdGhlciBtYWluIHNoZWxsIGlzIGV4aXRpbmcgb3IgY2xlYW51cF9wYXJlbnRzX2VudigpIHdhcyBjYWxsZWQuCisJICovCisJaWYgKGVwLT5vZW52ID09IE5VTEwpIHsKKwkJaWYgKGVwLT50eXBlID09IEVfTk9ORSkgewkvKiBNYWluIHNoZWxsIGV4aXRpbmc/ICovCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKwkJCWlmIChGbGFnKEZUQUxLSU5HKSkKKwkJCQloaXN0X2ZpbmlzaCgpOworI2VuZGlmCisJCQlqX2V4aXQoKTsKKwkJCWlmIChlcC0+ZmxhZ3MgJiBFRl9GQUtFX1NJR0RJRSkgeworCQkJCWludCBzaWcgPSBleHN0YXQgLSAxMjg7CisKKwkJCQkvKiBoYW0gdXAgb3VyIGRlYXRoIGEgYml0IChBVCZUIGtzaAorCQkJCSAqIG9ubHkgc2VlbXMgdG8gZG8gdGhpcyBmb3IgU0lHVEVSTSkKKwkJCQkgKiBEb24ndCBkbyBpdCBmb3IgU0lHUVVJVCwgc2luY2Ugd2UnZAorCQkJCSAqIGR1bXAgYSBjb3JlLi4KKwkJCQkgKi8KKwkJCQlpZiAoKHNpZyA9PSBTSUdJTlQgfHwgc2lnID09IFNJR1RFUk0pICYmCisJCQkJICAgIChrc2hwZ3JwID09IGtzaHBpZCkpIHsKKwkJCQkJc2V0c2lnKCZzaWd0cmFwc1tzaWddLCBTSUdfREZMLAorCQkJCQkgICAgU1NfUkVTVE9SRV9DVVJSIHwgU1NfRk9SQ0UpOworCQkJCQlraWxsKDAsIHNpZyk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzaGYpCisJCQlzaGZfY2xvc2Uoc2hmKTsKKwkJcmVjbGFpbSgpOworCQlleGl0KGV4c3RhdCk7CisJfQorCWlmIChzaGYpCisJCXNoZl9jbG9zZShzaGYpOworCXJlY2xhaW0oKTsKKworCWUgPSBlLT5vZW52OworCisJLyogZnJlZSB0aGUgc3RydWN0IGVudiAtIHRyaWNreSBkdWUgdG8gdGhlIEFMTE9DX0lURU0gaW5zaWRlICovCisJY3AgPSAodm9pZCAqKWVwOworCWFmcmVlKGNwICsgQUxMT0NfU0laRSwgQVRFTVApOworfQorCisvKiBDYWxsZWQgYWZ0ZXIgYSBmb3JrIHRvIGNsZWFudXAgc3R1ZmYgbGVmdCBvdmVyIGZyb20gcGFyZW50cyBlbnZpcm9ubWVudCAqLwordm9pZAorY2xlYW51cF9wYXJlbnRzX2Vudih2b2lkKQoreworCXN0cnVjdCBlbnYgKmVwOworCWludCBmZDsKKworCW1rc3NlcnQoZSAhPSBOVUxMKTsKKworCS8qCisJICogRG9uJ3QgY2xlYW4gdXAgdGVtcG9yYXJ5IGZpbGVzIC0gcGFyZW50IHdpbGwgcHJvYmFibHkgbmVlZCB0aGVtLgorCSAqIEFsc28sIGNhbid0IGVhc2lseSByZWNsYWltIG1lbW9yeSBzaW5jZSB2YXJpYWJsZXMsIGV0Yy4gY291bGQgYmUKKwkgKiBhbnl3aGVyZS4KKwkgKi8KKworCS8qIGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGhpZGluZyBpbiBzYXZlZmQgKi8KKwlmb3IgKGVwID0gZTsgZXA7IGVwID0gZXAtPm9lbnYpIHsKKwkJaWYgKGVwLT5zYXZlZmQpIHsKKwkJCWZvciAoZmQgPSAwOyBmZCA8IE5VRklMRTsgZmQrKykKKwkJCQlpZiAoZXAtPnNhdmVmZFtmZF0gPiAwKQorCQkJCQljbG9zZShlcC0+c2F2ZWZkW2ZkXSk7CisJCQlhZnJlZShlcC0+c2F2ZWZkLCAmZXAtPmFyZWEpOworCQkJZXAtPnNhdmVmZCA9IE5VTEw7CisJCX0KKwl9CisJZS0+b2VudiA9IE5VTEw7Cit9CisKKy8qIENhbGxlZCBqdXN0IGJlZm9yZSBhbiBleGVjdmUgY2xlYW51cCBzdHVmZiB0ZW1wb3JhcnkgZmlsZXMgKi8KK3ZvaWQKK2NsZWFudXBfcHJvY19lbnYodm9pZCkKK3sKKwlzdHJ1Y3QgZW52ICplcDsKKworCWZvciAoZXAgPSBlOyBlcDsgZXAgPSBlcC0+b2VudikKKwkJcmVtb3ZlX3RlbXBzKGVwLT50ZW1wcyk7Cit9CisKKy8qIHJlbW92ZSB0ZW1wIGZpbGVzIGFuZCBmcmVlIEFURU1QIEFyZWEgKi8KK3N0YXRpYyB2b2lkCityZWNsYWltKHZvaWQpCit7CisJcmVtb3ZlX3RlbXBzKGUtPnRlbXBzKTsKKwllLT50ZW1wcyA9IE5VTEw7CisJYWZyZWVhbGwoJmUtPmFyZWEpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3RlbXBzKHN0cnVjdCB0ZW1wICp0cCkKK3sKKwlmb3IgKDsgdHAgIT0gTlVMTDsgdHAgPSB0cC0+bmV4dCkKKwkJaWYgKHRwLT5waWQgPT0gcHJvY3BpZCkKKwkJCXVubGluayh0cC0+bmFtZSk7Cit9CisKKy8qIEluaXRpYWxpc2UgdHR5X2ZkLiBVc2VkIGZvciBzYXZpbmcvcmVzZXRpbmcgdHR5IG1vZGVzIHVwb24KKyAqIGZvcmVncm91bmQgam9iIGNvbXBsZXRpb24gYW5kIGZvciBzZXR0aW5nIHVwIHR0eSBwcm9jZXNzIGdyb3VwLgorICovCit2b2lkCit0dHlfaW5pdChib29sIGluaXRfdHR5c3RhdGUsIGJvb2wgbmVlZF90dHkpCit7CisJYm9vbCBkb19jbG9zZSA9IHRydWU7CisJaW50IHRmZDsKKworCWlmICh0dHlfZmQgPj0gMCkgeworCQljbG9zZSh0dHlfZmQpOworCQl0dHlfZmQgPSAtMTsKKwl9CisJdHR5X2RldnR0eSA9IDE7CisKKyNpZmRlZiBfVVdJTgorCS8qIFhYWCBpbWFrZSBzdHlsZSAqLworCWlmIChpc2F0dHkoMykpCisJCXRmZCA9IDM7CisJZWxzZQorI2VuZGlmCisJaWYgKCh0ZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiwgMCkpIDwgMCkgeworCQl0dHlfZGV2dHR5ID0gMDsKKwkJaWYgKG5lZWRfdHR5KQorCQkJd2FybmluZ2YoZmFsc2UsCisJCQkgICAgIk5vIGNvbnRyb2xsaW5nIHR0eSAob3BlbiAvZGV2L3R0eTogJXMpIiwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0KKwlpZiAodGZkIDwgMCkgeworCQlkb19jbG9zZSA9IGZhbHNlOworCQlpZiAoaXNhdHR5KDApKQorCQkJdGZkID0gMDsKKwkJZWxzZSBpZiAoaXNhdHR5KDIpKQorCQkJdGZkID0gMjsKKwkJZWxzZSB7CisJCQlpZiAobmVlZF90dHkpCisJCQkJd2FybmluZ2YoZmFsc2UsCisJCQkJICAgICJDYW4ndCBmaW5kIHR0eSBmaWxlIGRlc2NyaXB0b3IiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoKHR0eV9mZCA9IGZjbnRsKHRmZCwgRl9EVVBGRCwgRkRCQVNFKSkgPCAwKSB7CisJCWlmIChuZWVkX3R0eSkKKwkJCXdhcm5pbmdmKGZhbHNlLCAial90dHlpbml0OiBkdXAgb2YgdHR5IGZkIGZhaWxlZDogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJfSBlbHNlIGlmIChmY250bCh0dHlfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpIDwgMCkgeworCQlpZiAobmVlZF90dHkpCisJCQl3YXJuaW5nZihmYWxzZSwKKwkJCSAgICAial90dHlpbml0OiBjYW4ndCBzZXQgY2xvc2Utb24tZXhlYyBmbGFnOiAlcyIsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UodHR5X2ZkKTsKKwkJdHR5X2ZkID0gLTE7CisJfSBlbHNlIGlmIChpbml0X3R0eXN0YXRlKQorCQl0Y2dldGF0dHIodHR5X2ZkLCAmdHR5X3N0YXRlKTsKKwlpZiAoZG9fY2xvc2UpCisJCWNsb3NlKHRmZCk7Cit9CisKK3ZvaWQKK3R0eV9jbG9zZSh2b2lkKQoreworCWlmICh0dHlfZmQgPj0gMCkgeworCQljbG9zZSh0dHlfZmQpOworCQl0dHlfZmQgPSAtMTsKKwl9Cit9CisKKy8qIEEgc2hlbGwgZXJyb3Igb2NjdXJyZWQgKGVnLCBzeW50YXggZXJyb3IsIGV0Yy4pICovCit2b2lkCitlcnJvcmYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCXNobF9zdGRvdXRfb2sgPSAwOwkvKiBkZWJ1Z2dpbmc6IG5vdGUgdGhhdCBzdGRvdXQgbm90IHZhbGlkICovCisJZXhzdGF0ID0gMTsKKwlpZiAoKmZtdCAhPSAxKSB7CisJCWVycm9yX3ByZWZpeCh0cnVlKTsKKwkJdmFfc3RhcnQodmEsIGZtdCk7CisJCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIHZhKTsKKwkJdmFfZW5kKHZhKTsKKwkJc2hmX3B1dGNoYXIoJ1xuJywgc2hsX291dCk7CisJfQorCXNoZl9mbHVzaChzaGxfb3V0KTsKKwl1bndpbmQoTEVSUk9SKTsKK30KKworLyogbGlrZSBlcnJvcmYoKSwgYnV0IG5vIHVud2luZCBpcyBkb25lICovCit2b2lkCit3YXJuaW5nZihib29sIGZpbGVsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJZXJyb3JfcHJlZml4KGZpbGVsaW5lKTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKKwlzaGZfcHV0Y2hhcignXG4nLCBzaGxfb3V0KTsKKwlzaGZfZmx1c2goc2hsX291dCk7Cit9CisKKy8qIFVzZWQgYnkgYnVpbHQtaW4gdXRpbGl0aWVzIHRvIHByZWZpeCBzaGVsbCBhbmQgdXRpbGl0eSBuYW1lIHRvIG1lc3NhZ2UKKyAqIChhbHNvIHVud2luZHMgZW52aXJvbm1lbnRzIGZvciBzcGVjaWFsIGJ1aWx0aW5zKS4KKyAqLwordm9pZAorYmlfZXJyb3JmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwlzaGxfc3Rkb3V0X29rID0gMDsJLyogZGVidWdnaW5nOiBub3RlIHRoYXQgc3Rkb3V0IG5vdCB2YWxpZCAqLworCWV4c3RhdCA9IDE7CisJaWYgKCpmbXQgIT0gMSkgeworCQllcnJvcl9wcmVmaXgodHJ1ZSk7CisJCS8qIG5vdCBzZXQgd2hlbiBtYWluKCkgY2FsbHMgcGFyc2VfYXJncygpICovCisJCWlmIChidWlsdGluX2FyZ3YwKQorCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzOiAiLCBidWlsdGluX2FyZ3YwKTsKKwkJdmFfc3RhcnQodmEsIGZtdCk7CisJCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIHZhKTsKKwkJdmFfZW5kKHZhKTsKKwkJc2hmX3B1dGNoYXIoJ1xuJywgc2hsX291dCk7CisJfQorCXNoZl9mbHVzaChzaGxfb3V0KTsKKwkvKiBQT1NJWCBzcGVjaWFsIGJ1aWx0aW5zIGFuZCBrc2ggc3BlY2lhbCBidWlsdGlucyBjYXVzZQorCSAqIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbHMgdG8gZXhpdC4KKwkgKiBYWFggb2RkIHVzZSBvZiBLRUVQQVNOOyBhbHNvIG1heSBub3Qgd2FudCBMRVJST1IgaGVyZQorCSAqLworCWlmIChidWlsdGluX2ZsYWcgJiBTUEVDX0JJKSB7CisJCWJ1aWx0aW5fYXJndjAgPSBOVUxMOworCQl1bndpbmQoTEVSUk9SKTsKKwl9Cit9CisKKy8qIENhbGxlZCB3aGVuIHNvbWV0aGluZyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gZG9lcyAqLwordm9pZAoraW50ZXJuYWxfdmVycm9yZihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJc2hmX2ZwcmludGYoc2hsX291dCwgImludGVybmFsIGVycm9yOiAiKTsKKwlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCBhcCk7CisJc2hmX3B1dGNoYXIoJ1xuJywgc2hsX291dCk7CisJc2hmX2ZsdXNoKHNobF9vdXQpOworfQorCit2b2lkCitpbnRlcm5hbF9lcnJvcmYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCXZhX3N0YXJ0KHZhLCBmbXQpOworCWludGVybmFsX3ZlcnJvcmYoZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKKwl1bndpbmQoTEVSUk9SKTsKK30KKwordm9pZAoraW50ZXJuYWxfd2FybmluZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCXZhX3N0YXJ0KHZhLCBmbXQpOworCWludGVybmFsX3ZlcnJvcmYoZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKK30KKworLyogdXNlZCBieSBlcnJvciByZXBvcnRpbmcgZnVuY3Rpb25zIHRvIHByaW50ICJrc2g6IC5rc2hyY1syNV06ICIgKi8KK3ZvaWQKK2Vycm9yX3ByZWZpeChib29sIGZpbGVsaW5lKQoreworCS8qIEF2b2lkIGZvbzogZm9vWzJdOiAuLi4gKi8KKwlpZiAoIWZpbGVsaW5lIHx8ICFzb3VyY2UgfHwgIXNvdXJjZS0+ZmlsZSB8fAorCSAgICBzdHJjbXAoc291cmNlLT5maWxlLCBrc2huYW1lKSAhPSAwKQorCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXM6ICIsIGtzaG5hbWUgKyAoKmtzaG5hbWUgPT0gJy0nKSk7CisJaWYgKGZpbGVsaW5lICYmIHNvdXJjZSAmJiBzb3VyY2UtPmZpbGUgIT0gTlVMTCkgeworCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXNbJWRdOiAiLCBzb3VyY2UtPmZpbGUsCisJCSAgICBzb3VyY2UtPmVycmxpbmUgPiAwID8gc291cmNlLT5lcnJsaW5lIDogc291cmNlLT5saW5lKTsKKwkJc291cmNlLT5lcnJsaW5lID0gMDsKKwl9Cit9CisKKy8qIHByaW50ZiB0byBzaGxfb3V0IChzdGRlcnIpIHdpdGggZmx1c2ggKi8KK3ZvaWQKK3NoZWxsZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJaWYgKCFpbml0aW9fZG9uZSkgLyogc2hsX291dCBtYXkgbm90IGJlIHNldCB1cCB5ZXQuLi4gKi8KKwkJcmV0dXJuOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworCXNoZl9mbHVzaChzaGxfb3V0KTsKK30KKworLyogcHJpbnRmIHRvIHNobF9zdGRvdXQgKHN0ZG91dCkgKi8KK3ZvaWQKK3NocHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoIXNobF9zdGRvdXRfb2spCisJCWludGVybmFsX2Vycm9yZigic2hsX3N0ZG91dCBub3QgdmFsaWQiKTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzaGZfdmZwcmludGYoc2hsX3N0ZG91dCwgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKK30KKworLyogdGVzdCBpZiB3ZSBjYW4gc2VlayBiYWNrd2FyZHMgZmQgKHJldHVybnMgMCBvciBTSEZfVU5CVUYpICovCitpbnQKK2Nhbl9zZWVrKGludCBmZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCXJldHVybiAoZnN0YXQoZmQsICZzdGF0YikgPT0gMCAmJiAhU19JU1JFRyhzdGF0Yi5zdF9tb2RlKSA/CisJICAgIFNIRl9VTkJVRiA6IDApOworfQorCitzdHJ1Y3Qgc2hmIHNoZl9pb2JbM107CisKK3ZvaWQKK2luaXRpbyh2b2lkKQoreworCXNoZl9mZG9wZW4oMSwgU0hGX1dSLCBzaGxfc3Rkb3V0KTsJLyogZm9yY2UgYnVmZmVyIGFsbG9jYXRpb24gKi8KKwlzaGZfZmRvcGVuKDIsIFNIRl9XUiwgc2hsX291dCk7CisJc2hmX2Zkb3BlbigyLCBTSEZfV1IsIHNobF9zcGFyZSk7CS8qIGZvcmNlIGJ1ZmZlciBhbGxvY2F0aW9uICovCisJaW5pdGlvX2RvbmUgPSAxOworfQorCisvKiBBIGR1cDIoKSB3aXRoIGVycm9yIGNoZWNraW5nICovCitpbnQKK2tzaF9kdXAyKGludCBvZmQsIGludCBuZmQsIGJvb2wgZXJyb2spCit7CisJaW50IHJ2OworCisJaWYgKCgocnYgPSBkdXAyKG9mZCwgbmZkKSkgPCAwKSAmJiAhZXJyb2sgJiYgKGVycm5vICE9IEVCQURGKSkKKwkJZXJyb3JmKCJ0b28gbWFueSBmaWxlcyBvcGVuIGluIHNoZWxsIik7CisKKyNpZmRlZiBfX3VsdHJpeAorCS8qIFhYWCBpbWFrZSBzdHlsZSAqLworCWlmIChydiA+PSAwKQorCQlmY250bChuZmQsIEZfU0VURkQsIDApOworI2VuZGlmCisKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqIG1vdmUgZmQgZnJvbSB1c2VyIHNwYWNlICgwPD1mZDwxMCkgdG8gc2hlbGwgc3BhY2UgKGZkPj0xMCksCisgKiBzZXQgY2xvc2Utb24tZXhlYyBmbGFnLgorICovCitzaG9ydAorc2F2ZWZkKGludCBmZCkKK3sKKwlpbnQgbmZkID0gZmQ7CisKKwlpZiAoZmQgPCBGREJBU0UgJiYgKG5mZCA9IGZjbnRsKGZkLCBGX0RVUEZELCBGREJBU0UpKSA8IDAgJiYKKwkgICAgZXJybm8gPT0gRUJBREYpCisJCXJldHVybiAoLTEpOworCWlmIChuZmQgPCAwIHx8IG5mZCA+IFNIUlRfTUFYKQorCQllcnJvcmYoInRvbyBtYW55IGZpbGVzIG9wZW4gaW4gc2hlbGwiKTsKKwlmY250bChuZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCXJldHVybiAoKHNob3J0KW5mZCk7Cit9CisKK3ZvaWQKK3Jlc3RmZChpbnQgZmQsIGludCBvZmQpCit7CisJaWYgKGZkID09IDIpCisJCXNoZl9mbHVzaCgmc2hmX2lvYltmZF0pOworCWlmIChvZmQgPCAwKQkJLyogb3JpZ2luYWwgZmQgY2xvc2VkICovCisJCWNsb3NlKGZkKTsKKwllbHNlIGlmIChmZCAhPSBvZmQpIHsKKwkJa3NoX2R1cDIob2ZkLCBmZCwgdHJ1ZSk7IC8qIFhYWDogd2hhdCB0byBkbyBpZiB0aGlzIGZhaWxzPyAqLworCQljbG9zZShvZmQpOworCX0KK30KKwordm9pZAorb3BlbnBpcGUoaW50ICpwdikKK3sKKwlpbnQgbHB2WzJdOworCisJaWYgKHBpcGUobHB2KSA8IDApCisJCWVycm9yZigiY2FuJ3QgY3JlYXRlIHBpcGUgLSB0cnkgYWdhaW4iKTsKKwlwdlswXSA9IHNhdmVmZChscHZbMF0pOworCWlmIChwdlswXSAhPSBscHZbMF0pCisJCWNsb3NlKGxwdlswXSk7CisJcHZbMV0gPSBzYXZlZmQobHB2WzFdKTsKKwlpZiAocHZbMV0gIT0gbHB2WzFdKQorCQljbG9zZShscHZbMV0pOworfQorCit2b2lkCitjbG9zZXBpcGUoaW50ICpwdikKK3sKKwljbG9zZShwdlswXSk7CisJY2xvc2UocHZbMV0pOworfQorCisvKiBDYWxsZWQgYnkgaW9zZXR1cCgpIChkZWFscyB3aXRoIDI+JjQsIGV0Yy4pLCBjX3JlYWQsIGNfcHJpbnQgdG8gdHVybgorICogYSBzdHJpbmcgKHRoZSBYIGluIDI+JlgsIHJlYWQgLXVYLCBwcmludCAtdVgpIGludG8gYSBmaWxlIGRlc2NyaXB0b3IuCisgKi8KK2ludAorY2hlY2tfZmQoY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUsIGNvbnN0IGNoYXIgKiplbXNncCkKK3sKKwlpbnQgZmQsIGZsOworCisJaWYgKG5hbWVbMF0gPT0gJ3AnICYmICFuYW1lWzFdKQorCQlyZXR1cm4gKGNvcHJvY19nZXRmZChtb2RlLCBlbXNncCkpOworCWZvciAoZmQgPSAwOyBrc2hfaXNkaWdpdCgqbmFtZSk7ICsrbmFtZSkKKwkJZmQgPSAoZmQgKiAxMCkgKyAqbmFtZSAtICcwJzsKKwlpZiAoKm5hbWUgfHwgZmQgPj0gRkRCQVNFKSB7CisJCWlmIChlbXNncCkKKwkJCSplbXNncCA9ICJpbGxlZ2FsIGZpbGUgZGVzY3JpcHRvciBuYW1lIjsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmICgoZmwgPSBmY250bChmZCwgRl9HRVRGTCwgMCkpIDwgMCkgeworCQlpZiAoZW1zZ3ApCisJCQkqZW1zZ3AgPSAiYmFkIGZpbGUgZGVzY3JpcHRvciI7CisJCXJldHVybiAoLTEpOworCX0KKwlmbCAmPSBPX0FDQ01PREU7CisJLyogWF9PSyBpcyBhIGtsdWRnZSB0byBkaXNhYmxlIHRoaXMgY2hlY2sgZm9yIGR1cHMgKHg8JjEpOgorCSAqIGhpc3RvcmljYWwgc2hlbGxzIG5ldmVyIGRpZCB0aGlzIGNoZWNrIChYWFggZG9uJ3Qga25vdyB3aGF0CisJICogUE9TSVggaGFzIHRvIHNheSkuCisJICovCisJaWYgKCEobW9kZSAmIFhfT0spICYmIGZsICE9IE9fUkRXUiAmJiAoCisJICAgICgobW9kZSAmIFJfT0spICYmIGZsICE9IE9fUkRPTkxZKSB8fAorCSAgICAoKG1vZGUgJiBXX09LKSAmJiBmbCAhPSBPX1dST05MWSkpKSB7CisJCWlmIChlbXNncCkKKwkJCSplbXNncCA9IChmbCA9PSBPX1dST05MWSkgPworCQkJICAgICJmZCBub3Qgb3BlbiBmb3IgcmVhZGluZyIgOgorCQkJICAgICJmZCBub3Qgb3BlbiBmb3Igd3JpdGluZyI7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKGZkKTsKK30KKworLyogQ2FsbGVkIG9uY2UgZnJvbSBtYWluICovCit2b2lkCitjb3Byb2NfaW5pdCh2b2lkKQoreworCWNvcHJvYy5yZWFkID0gY29wcm9jLnJlYWR3ID0gY29wcm9jLndyaXRlID0gLTE7CisJY29wcm9jLm5qb2JzID0gMDsKKwljb3Byb2MuaWQgPSAwOworfQorCisvKiBDYWxsZWQgYnkgY19yZWFkKCkgd2hlbiBlb2YgaXMgcmVhZCAtIGNsb3NlIGZkIGlmIGl0IGlzIHRoZSBjby1wcm9jZXNzIGZkICovCit2b2lkCitjb3Byb2NfcmVhZF9jbG9zZShpbnQgZmQpCit7CisJaWYgKGNvcHJvYy5yZWFkID49IDAgJiYgZmQgPT0gY29wcm9jLnJlYWQpIHsKKwkJY29wcm9jX3JlYWR3X2Nsb3NlKGZkKTsKKwkJY2xvc2UoY29wcm9jLnJlYWQpOworCQljb3Byb2MucmVhZCA9IC0xOworCX0KK30KKworLyogQ2FsbGVkIGJ5IGNfcmVhZCgpIGFuZCBieSBpb3NldHVwKCkgdG8gY2xvc2UgdGhlIG90aGVyIHNpZGUgb2YgdGhlCisgKiByZWFkIHBpcGUsIHNvIHJlYWRzIHdpbGwgYWN0dWFsbHkgdGVybWluYXRlLgorICovCit2b2lkCitjb3Byb2NfcmVhZHdfY2xvc2UoaW50IGZkKQoreworCWlmIChjb3Byb2MucmVhZHcgPj0gMCAmJiBjb3Byb2MucmVhZCA+PSAwICYmIGZkID09IGNvcHJvYy5yZWFkKSB7CisJCWNsb3NlKGNvcHJvYy5yZWFkdyk7CisJCWNvcHJvYy5yZWFkdyA9IC0xOworCX0KK30KKworLyogQ2FsbGVkIGJ5IGNfcHJpbnQgd2hlbiBhIHdyaXRlIHRvIGEgZmQgZmFpbHMgd2l0aCBFUElQRSBhbmQgYnkgaW9zZXR1cAorICogd2hlbiBjby1wcm9jZXNzIGlucHV0IGlzIGR1cCdkCisgKi8KK3ZvaWQKK2NvcHJvY193cml0ZV9jbG9zZShpbnQgZmQpCit7CisJaWYgKGNvcHJvYy53cml0ZSA+PSAwICYmIGZkID09IGNvcHJvYy53cml0ZSkgeworCQljbG9zZShjb3Byb2Mud3JpdGUpOworCQljb3Byb2Mud3JpdGUgPSAtMTsKKwl9Cit9CisKKy8qIENhbGxlZCB0byBjaGVjayBmb3IgZXhpc3RlbmNlIG9mL3ZhbHVlIG9mIHRoZSBjby1wcm9jZXNzIGZpbGUgZGVzY3JpcHRvci4KKyAqIChVc2VkIGJ5IGNoZWNrX2ZkKCkgYW5kIGJ5IGNfcmVhZC9jX3ByaW50IHRvIGRlYWwgd2l0aCAtcCBvcHRpb24pLgorICovCitpbnQKK2NvcHJvY19nZXRmZChpbnQgbW9kZSwgY29uc3QgY2hhciAqKmVtc2dwKQoreworCWludCBmZCA9IChtb2RlICYgUl9PSykgPyBjb3Byb2MucmVhZCA6IGNvcHJvYy53cml0ZTsKKworCWlmIChmZCA+PSAwKQorCQlyZXR1cm4gKGZkKTsKKwlpZiAoZW1zZ3ApCisJCSplbXNncCA9ICJubyBjb3Byb2Nlc3MiOworCXJldHVybiAoLTEpOworfQorCisvKiBjYWxsZWQgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyByZWxhdGVkIHRvIHRoZSBjb3Byb2Nlc3MgKGlmIGFueSkKKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBTSUdDSExEIGJsb2NrZWQuCisgKi8KK3ZvaWQKK2NvcHJvY19jbGVhbnVwKGludCByZXVzZSkKK3sKKwkvKiBUaGlzIHRvIGFsbG93IGNvLXByb2Nlc3NlcyB0byBzaGFyZSBvdXRwdXQgcGlwZSAqLworCWlmICghcmV1c2UgfHwgY29wcm9jLnJlYWR3IDwgMCB8fCBjb3Byb2MucmVhZCA8IDApIHsKKwkJaWYgKGNvcHJvYy5yZWFkID49IDApIHsKKwkJCWNsb3NlKGNvcHJvYy5yZWFkKTsKKwkJCWNvcHJvYy5yZWFkID0gLTE7CisJCX0KKwkJaWYgKGNvcHJvYy5yZWFkdyA+PSAwKSB7CisJCQljbG9zZShjb3Byb2MucmVhZHcpOworCQkJY29wcm9jLnJlYWR3ID0gLTE7CisJCX0KKwl9CisJaWYgKGNvcHJvYy53cml0ZSA+PSAwKSB7CisJCWNsb3NlKGNvcHJvYy53cml0ZSk7CisJCWNvcHJvYy53cml0ZSA9IC0xOworCX0KK30KKworc3RydWN0IHRlbXAgKgorbWFrZXRlbXAoQXJlYSAqYXAsIFRlbXBfdHlwZSB0eXBlLCBzdHJ1Y3QgdGVtcCAqKnRsaXN0KQoreworCXN0cnVjdCB0ZW1wICp0cDsKKwlpbnQgbGVuOworCWludCBmZDsKKwljaGFyICpwYXRobmFtZTsKKwljb25zdCBjaGFyICpkaXI7CisKKwlkaXIgPSB0bXBkaXIgPyB0bXBkaXIgOiBNS1NIX0RFRkFVTFRfVE1QRElSOworI2lmIEhBVkVfTUtTVEVNUAorCWxlbiA9IHN0cmxlbihkaXIpICsgNiArIDEwICsgMTsKKyNlbHNlCisJcGF0aG5hbWUgPSB0ZW1wbmFtKGRpciwgIm1rc2guIik7CisJbGVuID0gKChwYXRobmFtZSA9PSBOVUxMKSA/IDAgOiBzdHJsZW4ocGF0aG5hbWUpKSArIDE7CisjZW5kaWYKKwl0cCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgdGVtcCkgKyBsZW4sIGFwKTsKKwl0cC0+bmFtZSA9IChjaGFyICopJnRwWzFdOworI2lmICFIQVZFX01LU1RFTVAKKwlpZiAocGF0aG5hbWUgPT0gTlVMTCkKKwkJdHAtPm5hbWVbMF0gPSAnXDAnOworCWVsc2UgeworCQltZW1jcHkodHAtPm5hbWUsIHBhdGhuYW1lLCBsZW4pOworCQlmcmVlKHBhdGhuYW1lKTsKKwl9CisjZW5kaWYKKwlwYXRobmFtZSA9IHRwLT5uYW1lOworCXRwLT5zaGYgPSBOVUxMOworCXRwLT50eXBlID0gdHlwZTsKKyNpZiBIQVZFX01LU1RFTVAKKwlzaGZfc25wcmludGYocGF0aG5hbWUsIGxlbiwgIiVzL21rc2guWFhYWFhYWFhYWCIsIGRpcik7CisJaWYgKChmZCA9IG1rc3RlbXAocGF0aG5hbWUpKSA+PSAwKQorI2Vsc2UKKwlpZiAodHAtPm5hbWVbMF0gJiYgKGZkID0gb3Blbih0cC0+bmFtZSwgT19DUkVBVCB8IE9fUkRXUiwgMDYwMCkpID49IDApCisjZW5kaWYKKwkJdHAtPnNoZiA9IHNoZl9mZG9wZW4oZmQsIFNIRl9XUiwgTlVMTCk7CisJdHAtPnBpZCA9IHByb2NwaWQ7CisKKwl0cC0+bmV4dCA9ICp0bGlzdDsKKwkqdGxpc3QgPSB0cDsKKwlyZXR1cm4gKHRwKTsKK30KKworLyoKKyAqIFdlIHVzZSBhIHNpbWlsYXIgY29sbGlzaW9uIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIFB5dGhvbiAyLjUuNAorICogYnV0IHdpdGggYSBzbGlnaHRseSB0d2Vha2VkIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gZnJvbSBzY3JhdGNoLgorICovCisKKyNkZWZpbmUJSU5JVF9UQkxTCTgJLyogaW5pdGlhbCB0YWJsZSBzaXplIChwb3dlciBvZiAyKSAqLworI2RlZmluZSBQRVJUVVJCX1NISUZUCTUJLyogc2VlIFB5dGhvbiAyLjUuNCBPYmplY3RzL2RpY3RvYmplY3QuYyAqLworCitzdGF0aWMgdm9pZCB0ZXhwYW5kKHN0cnVjdCB0YWJsZSAqLCBzaXplX3QpOworc3RhdGljIGludCB0bmFtZWNtcChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHRibCAqa3RzY2FuKHN0cnVjdCB0YWJsZSAqLCBjb25zdCBjaGFyICosIHVpbnQzMl90LAorICAgIHN0cnVjdCB0YmwgKioqKTsKKworc3RhdGljIHZvaWQKK3RleHBhbmQoc3RydWN0IHRhYmxlICp0cCwgc2l6ZV90IG5zaXplKQoreworCXNpemVfdCBpLCBqLCBvc2l6ZSA9IHRwLT5zaXplLCBwZXJ0dXJiOworCXN0cnVjdCB0YmwgKnRibHAsICoqcHA7CisJc3RydWN0IHRibCAqKm50YmxwLCAqKm90YmxwID0gdHAtPnRibHM7CisKKwludGJscCA9IGFsbG9jKG5zaXplICogc2l6ZW9mKHN0cnVjdCB0YmwgKiksIHRwLT5hcmVhcCk7CisJZm9yIChpID0gMDsgaSA8IG5zaXplOyBpKyspCisJCW50YmxwW2ldID0gTlVMTDsKKwl0cC0+c2l6ZSA9IG5zaXplOworCXRwLT5uZnJlZSA9IChuc2l6ZSAqIDQpIC8gNTsJLyogdGFibGUgY2FuIGdldCA4MCUgZnVsbCAqLworCXRwLT50YmxzID0gbnRibHA7CisJaWYgKG90YmxwID09IE5VTEwpCisJCXJldHVybjsKKwluc2l6ZS0tOwkJCS8qIGZyb20gaGVyZSBvbiBuc2l6ZSA6PSBtYXNrICovCisJZm9yIChpID0gMDsgaSA8IG9zaXplOyBpKyspCisJCWlmICgodGJscCA9IG90YmxwW2ldKSAhPSBOVUxMKSB7CisJCQlpZiAoKHRibHAtPmZsYWcgJiBERUZJTkVEKSkgeworCQkJCS8qIHNlYXJjaCBmb3IgZnJlZSBoYXNoIHRhYmxlIHNsb3QgKi8KKwkJCQlqID0gKHBlcnR1cmIgPSB0YmxwLT51YS5odmFsKSAmIG5zaXplOworCQkJCWdvdG8gZmluZF9maXJzdF9lbXB0eV9zbG90OworIGZpbmRfbmV4dF9lbXB0eV9zbG90OgorCQkJCWogPSAoaiA8PCAyKSArIGogKyBwZXJ0dXJiICsgMTsKKwkJCQlwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUOworIGZpbmRfZmlyc3RfZW1wdHlfc2xvdDoKKwkJCQlwcCA9ICZudGJscFtqICYgbnNpemVdOworCQkJCWlmICgqcHAgIT0gTlVMTCkKKwkJCQkJZ290byBmaW5kX25leHRfZW1wdHlfc2xvdDsKKwkJCQkvKiBmb3VuZCBhbiBlbXB0eSBoYXNoIHRhYmxlIHNsb3QgKi8KKwkJCQkqcHAgPSB0YmxwOworCQkJCXRwLT5uZnJlZS0tOworCQkJfSBlbHNlIGlmICghKHRibHAtPmZsYWcgJiBGSU5VU0UpKSB7CisJCQkJYWZyZWUodGJscCwgdHAtPmFyZWFwKTsKKwkJCX0KKwkJfQorCWFmcmVlKG90YmxwLCB0cC0+YXJlYXApOworfQorCit2b2lkCitrdGluaXQoc3RydWN0IHRhYmxlICp0cCwgQXJlYSAqYXAsIHNpemVfdCB0c2l6ZSkKK3sKKwl0cC0+YXJlYXAgPSBhcDsKKwl0cC0+dGJscyA9IE5VTEw7CisJdHAtPnNpemUgPSB0cC0+bmZyZWUgPSAwOworCWlmICh0c2l6ZSkKKwkJdGV4cGFuZCh0cCwgdHNpemUpOworfQorCisvKiB0YWJsZSwgbmFtZSAoa2V5KSB0byBzZWFyY2ggZm9yLCBoYXNoKG5hbWUpLCBydiBwb2ludGVyIHRvIHRibCBwdHIgKi8KK3N0YXRpYyBzdHJ1Y3QgdGJsICoKK2t0c2NhbihzdHJ1Y3QgdGFibGUgKnRwLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBoLCBzdHJ1Y3QgdGJsICoqKnBwcCkKK3sKKwlzaXplX3QgaiwgcGVydHVyYiwgbWFzazsKKwlzdHJ1Y3QgdGJsICoqcHAsICpwOworCisJbWFzayA9IHRwLT5zaXplIC0gMTsKKwkvKiBzZWFyY2ggZm9yIGhhc2ggdGFibGUgc2xvdCBtYXRjaGluZyBuYW1lICovCisJaiA9IChwZXJ0dXJiID0gaCkgJiBtYXNrOworCWdvdG8gZmluZF9maXJzdF9zbG90OworIGZpbmRfbmV4dF9zbG90OgorCWogPSAoaiA8PCAyKSArIGogKyBwZXJ0dXJiICsgMTsKKwlwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUOworIGZpbmRfZmlyc3Rfc2xvdDoKKwlwcCA9ICZ0cC0+dGJsc1tqICYgbWFza107CisJaWYgKChwID0gKnBwKSAhPSBOVUxMICYmIChwLT51YS5odmFsICE9IGggfHwgIShwLT5mbGFnICYgREVGSU5FRCkgfHwKKwkgICAgc3RyY21wKHAtPm5hbWUsIG5hbWUpKSkKKwkJZ290byBmaW5kX25leHRfc2xvdDsKKwkvKiBwID09IE5VTEwgaWYgbm90IGZvdW5kLCBjb3JyZWN0IGZvdW5kIGVudHJ5IG90aGVyd2lzZSAqLworCWlmIChwcHApCisJCSpwcHAgPSBwcDsKKwlyZXR1cm4gKHApOworfQorCisvKiB0YWJsZSwgbmFtZSAoa2V5KSB0byBzZWFyY2ggZm9yLCBoYXNoKG4pICovCitzdHJ1Y3QgdGJsICoKK2t0c2VhcmNoKHN0cnVjdCB0YWJsZSAqdHAsIGNvbnN0IGNoYXIgKm4sIHVpbnQzMl90IGgpCit7CisJcmV0dXJuICh0cC0+c2l6ZSA/IGt0c2Nhbih0cCwgbiwgaCwgTlVMTCkgOiBOVUxMKTsKK30KKworLyogdGFibGUsIG5hbWUgKGtleSkgdG8gZW50ZXIsIGhhc2gobikgKi8KK3N0cnVjdCB0YmwgKgora3RlbnRlcihzdHJ1Y3QgdGFibGUgKnRwLCBjb25zdCBjaGFyICpuLCB1aW50MzJfdCBoKQoreworCXN0cnVjdCB0YmwgKipwcCwgKnA7CisJaW50IGxlbjsKKworCWlmICh0cC0+c2l6ZSA9PSAwKQorCQl0ZXhwYW5kKHRwLCBJTklUX1RCTFMpOworIFNlYXJjaDoKKwlpZiAoKHAgPSBrdHNjYW4odHAsIG4sIGgsICZwcCkpKQorCQlyZXR1cm4gKHApOworCisJaWYgKHRwLT5uZnJlZSA8PSAwKSB7CisJCS8qIHRvbyBmdWxsICovCisJCXRleHBhbmQodHAsIDIgKiB0cC0+c2l6ZSk7CisJCWdvdG8gU2VhcmNoOworCX0KKworCS8qIGNyZWF0ZSBuZXcgdGJsIGVudHJ5ICovCisJbGVuID0gc3RybGVuKG4pICsgMTsKKwlwID0gYWxsb2Mob2Zmc2V0b2Yoc3RydWN0IHRibCwgbmFtZVswXSkgKyBsZW4sIHRwLT5hcmVhcCk7CisJcC0+ZmxhZyA9IDA7CisJcC0+dHlwZSA9IDA7CisJcC0+YXJlYXAgPSB0cC0+YXJlYXA7CisJcC0+dWEuaHZhbCA9IGg7CisJcC0+dTIuZmllbGQgPSAwOworCXAtPnUuYXJyYXkgPSBOVUxMOworCW1lbWNweShwLT5uYW1lLCBuLCBsZW4pOworCisJLyogZW50ZXIgaW4gdHAtPnRibHMgKi8KKwl0cC0+bmZyZWUtLTsKKwkqcHAgPSBwOworCXJldHVybiAocCk7Cit9CisKK3ZvaWQKK2t0d2FsayhzdHJ1Y3QgdHN0YXRlICp0cywgc3RydWN0IHRhYmxlICp0cCkKK3sKKwl0cy0+bGVmdCA9IHRwLT5zaXplOworCXRzLT5uZXh0ID0gdHAtPnRibHM7Cit9CisKK3N0cnVjdCB0YmwgKgora3RuZXh0KHN0cnVjdCB0c3RhdGUgKnRzKQoreworCXdoaWxlICgtLXRzLT5sZWZ0ID49IDApIHsKKwkJc3RydWN0IHRibCAqcCA9ICp0cy0+bmV4dCsrOworCQlpZiAocCAhPSBOVUxMICYmIChwLT5mbGFnICYgREVGSU5FRCkpCisJCQlyZXR1cm4gKHApOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgaW50Cit0bmFtZWNtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJY29uc3Qgc3RydWN0IHRibCAqYSA9ICooKGNvbnN0IHN0cnVjdCB0YmwgKiBjb25zdCAqKXAxKTsKKwljb25zdCBzdHJ1Y3QgdGJsICpiID0gKigoY29uc3Qgc3RydWN0IHRibCAqIGNvbnN0ICopcDIpOworCisJcmV0dXJuIChzdHJjbXAoYS0+bmFtZSwgYi0+bmFtZSkpOworfQorCitzdHJ1Y3QgdGJsICoqCitrdHNvcnQoc3RydWN0IHRhYmxlICp0cCkKK3sKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgdGJsICoqcCwgKipzcCwgKipkcDsKKworCXAgPSBhbGxvYygodHAtPnNpemUgKyAxKSAqIHNpemVvZihzdHJ1Y3QgdGJsICopLCBBVEVNUCk7CisJc3AgPSB0cC0+dGJsczsJCS8qIHNvdXJjZSAqLworCWRwID0gcDsJCQkvKiBkZXN0ICovCisJaSA9IChzaXplX3QpdHAtPnNpemU7CisJd2hpbGUgKGktLSkKKwkJaWYgKCgqZHAgPSAqc3ArKykgIT0gTlVMTCAmJiAoKCgqZHApLT5mbGFnICYgREVGSU5FRCkgfHwKKwkJICAgICgoKmRwKS0+ZmxhZyAmIEFSUkFZKSkpCisJCQlkcCsrOworCXFzb3J0KHAsIChpID0gZHAgLSBwKSwgc2l6ZW9mKHZvaWQgKiksIHRuYW1lY21wKTsKKwlwW2ldID0gTlVMTDsKKwlyZXR1cm4gKHApOworfQorCisjaWZkZWYgU0lHV0lOQ0gKK3N0YXRpYyB2b2lkCit4X3NpZ3dpbmNoKGludCBzaWcgTUtTSF9BX1VOVVNFRCkKK3sKKwkvKiB0aGlzIHJ1bnMgaW5zaWRlIGludGVycnVwdCBjb250ZXh0LCB3aXRoIGVycm5vIHNhdmVkICovCisKKwlnb3Rfd2luY2ggPSAxOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9taXNjLmMgYi9ta3NoL3NyYy9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhNGRlMQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL21pc2MuYwpAQCAtMCwwICsxLDE1NzkgQEAKKy8qCSRPcGVuQlNEOiBtaXNjLmMsdiAxLjM3IDIwMDkvMDQvMTkgMjA6MzQ6MDUgc3RoZW4gRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBwYXRoLmMsdiAxLjEyIDIwMDUvMDMvMzAgMTc6MTY6MzcgZGVyYWFkdCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisjaWYgIUhBVkVfR0VUUlVTQUdFCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZW5kaWYKKyNpZiBIQVZFX0dSUF9ICisjaW5jbHVkZSA8Z3JwLmg+CisjZW5kaWYKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvbWlzYy5jLHYgMS4xNDEgMjAxMC8wNy8xNyAyMjowOTozNiB0ZyBFeHAgJCIpOworCit1bnNpZ25lZCBjaGFyIGNodHlwZXNbVUNIQVJfTUFYICsgMV07CS8qIHR5cGUgYml0cyBmb3IgdW5zaWduZWQgY2hhciAqLworCisjaWYgIUhBVkVfU0VUUkVTVUdJRAordWlkX3Qga3NodWlkOworZ2lkX3Qga3NoZ2lkLCBrc2hlZ2lkOworI2VuZGlmCisKK3N0YXRpYyBpbnQgZG9fZ21hdGNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqKTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICpjY2xhc3MoY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworI2lmZGVmIFRJT0NTQ1RUWQorc3RhdGljIHZvaWQgY2h2dChjb25zdCBjaGFyICopOworI2VuZGlmCisKKy8qCisgKiBGYXN0IGNoYXJhY3RlciBjbGFzc2VzCisgKi8KK3ZvaWQKK3NldGN0eXBlcyhjb25zdCBjaGFyICpzLCBpbnQgdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICh0ICYgQ19JRlMpIHsKKwkJZm9yIChpID0gMDsgaSA8IFVDSEFSX01BWCArIDE7IGkrKykKKwkJCWNodHlwZXNbaV0gJj0gfkNfSUZTOworCQljaHR5cGVzWzBdIHw9IENfSUZTOyAvKiBpbmNsdWRlIFwwIGluIENfSUZTICovCisJfQorCXdoaWxlICgqcyAhPSAwKQorCQljaHR5cGVzWyh1bnNpZ25lZCBjaGFyKSpzKytdIHw9IHQ7Cit9CisKK3ZvaWQKK2luaXRjdHlwZXModm9pZCkKK3sKKwlpbnQgYzsKKworCWZvciAoYyA9ICdhJzsgYyA8PSAneic7IGMrKykKKwkJY2h0eXBlc1tjXSB8PSBDX0FMUEhBOworCWZvciAoYyA9ICdBJzsgYyA8PSAnWic7IGMrKykKKwkJY2h0eXBlc1tjXSB8PSBDX0FMUEhBOworCWNodHlwZXNbJ18nXSB8PSBDX0FMUEhBOworCXNldGN0eXBlcygiMDEyMzQ1Njc4OSIsIENfRElHSVQpOworCXNldGN0eXBlcygiIFx0XG58Jjs8PigpIiwgQ19MRVgxKTsgLyogXDAgYWRkZWQgYXV0b21hdGljYWxseSAqLworCXNldGN0eXBlcygiKkAjISQtPyIsIENfVkFSMSk7CisJc2V0Y3R5cGVzKCIgXHRcbiIsIENfSUZTV1MpOworCXNldGN0eXBlcygiPS0rPyIsIENfU1VCT1AxKTsKKwlzZXRjdHlwZXMoIlx0XG4gXCIjJCYnKCkqOzw9Pj9bXFxdYHwiLCBDX1FVT1RFKTsKK30KKworLyogY2FsbGVkIGZyb20gWGNoZWNrTigpIHRvIGdyb3cgYnVmZmVyICovCitjaGFyICoKK1hjaGVja19ncm93XyhYU3RyaW5nICp4c3AsIGNvbnN0IGNoYXIgKnhwLCB1bnNpZ25lZCBpbnQgbW9yZSkKK3sKKwljb25zdCBjaGFyICpvbGRfYmVnID0geHNwLT5iZWc7CisKKwl4c3AtPmxlbiArPSBtb3JlID4geHNwLT5sZW4gPyBtb3JlIDogeHNwLT5sZW47CisJeHNwLT5iZWcgPSBhcmVzaXplKHhzcC0+YmVnLCB4c3AtPmxlbiArIDgsIHhzcC0+YXJlYXApOworCXhzcC0+ZW5kID0geHNwLT5iZWcgKyB4c3AtPmxlbjsKKwlyZXR1cm4gKHhzcC0+YmVnICsgKHhwIC0gb2xkX2JlZykpOworfQorCisjZGVmaW5lIFNIRkxBR1NfREVGTlMKKyNpbmNsdWRlICJzaF9mbGFncy5oIgorCitjb25zdCBzdHJ1Y3Qgc2hvcHRpb24gb3B0aW9uc1tdID0geworI2RlZmluZSBTSEZMQUdTX0lURU1TCisjaW5jbHVkZSAic2hfZmxhZ3MuaCIKK307CisKKy8qCisgKiB0cmFuc2xhdGUgLW8gb3B0aW9uIGludG8gRiogY29uc3RhbnQgKGFsc28gdXNlZCBmb3IgdGVzdCAtbyBvcHRpb24pCisgKi8KK3NpemVfdAorb3B0aW9uKGNvbnN0IGNoYXIgKm4pCit7CisJc2l6ZV90IGk7CisKKwlpZiAoKG5bMF0gPT0gJy0nIHx8IG5bMF0gPT0gJysnKSAmJiBuWzFdICYmICFuWzJdKSB7CisJCWZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQorCQkJaWYgKG9wdGlvbnNbaV0uYyA9PSBuWzFdKQorCQkJCXJldHVybiAoaSk7CisJfSBlbHNlIGZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQorCQlpZiAob3B0aW9uc1tpXS5uYW1lICYmIHN0cmNtcChvcHRpb25zW2ldLm5hbWUsIG4pID09IDApCisJCQlyZXR1cm4gKGkpOworCisJcmV0dXJuICgoc2l6ZV90KS0xKTsKK30KKworc3RydWN0IG9wdGlvbnNfaW5mbyB7CisJaW50IG9wdF93aWR0aDsKKwlpbnQgb3B0c1tORUxFTShvcHRpb25zKV07Cit9OworCitzdGF0aWMgY2hhciAqb3B0aW9uc19mbXRfZW50cnkoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIHByaW50b3B0aW9ucyhib29sKTsKKworLyogZm9ybWF0IGEgc2luZ2xlIHNlbGVjdCBtZW51IGl0ZW0gKi8KK3N0YXRpYyBjaGFyICoKK29wdGlvbnNfZm10X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGksIGNvbnN0IHZvaWQgKmFyZykKK3sKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uc19pbmZvICpvaSA9IChjb25zdCBzdHJ1Y3Qgb3B0aW9uc19pbmZvICopYXJnOworCisJc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJS0qcyAlcyIsCisJICAgIG9pLT5vcHRfd2lkdGgsIG9wdGlvbnNbb2ktPm9wdHNbaV1dLm5hbWUsCisJICAgIEZsYWcob2ktPm9wdHNbaV0pID8gIm9uIiA6ICJvZmYiKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludG9wdGlvbnMoYm9vbCB2ZXJib3NlKQoreworCWludCBpID0gMDsKKworCWlmICh2ZXJib3NlKSB7CisJCWludCBuID0gMCwgbGVuLCBvY3RzID0gMDsKKwkJc3RydWN0IG9wdGlvbnNfaW5mbyBvaTsKKworCQkvKiB2ZXJib3NlIHZlcnNpb24gKi8KKwkJc2hmX3B1dHMoIkN1cnJlbnQgb3B0aW9uIHNldHRpbmdzXG4iLCBzaGxfc3Rkb3V0KTsKKworCQlvaS5vcHRfd2lkdGggPSAwOworCQl3aGlsZSAoaSA8IChpbnQpTkVMRU0ob3B0aW9ucykpIHsKKwkJCWlmIChvcHRpb25zW2ldLm5hbWUpIHsKKwkJCQlvaS5vcHRzW24rK10gPSBpOworCQkJCWxlbiA9IHN0cmxlbihvcHRpb25zW2ldLm5hbWUpOworCQkJCWlmIChsZW4gPiBvY3RzKQorCQkJCQlvY3RzID0gbGVuOworCQkJCWxlbiA9IHV0Zl9tYnN3aWR0aChvcHRpb25zW2ldLm5hbWUpOworCQkJCWlmIChsZW4gPiBvaS5vcHRfd2lkdGgpCisJCQkJCW9pLm9wdF93aWR0aCA9IGxlbjsKKwkJCX0KKwkJCSsraTsKKwkJfQorCQlwcmludF9jb2x1bW5zKHNobF9zdGRvdXQsIG4sIG9wdGlvbnNfZm10X2VudHJ5LCAmb2ksCisJCSAgICBvY3RzICsgNCwgb2kub3B0X3dpZHRoICsgNCwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJLyogc2hvcnQgdmVyc2lvbiDDoSBsYSBBVCZUIGtzaDkzICovCisJCXNoZl9wdXRzKCJzZXQiLCBzaGxfc3Rkb3V0KTsKKwkJd2hpbGUgKGkgPCAoaW50KU5FTEVNKG9wdGlvbnMpKSB7CisJCQlpZiAoRmxhZyhpKSAmJiBvcHRpb25zW2ldLm5hbWUpCisJCQkJc2hwcmludGYoIiAtbyAlcyIsIG9wdGlvbnNbaV0ubmFtZSk7CisJCQkrK2k7CisJCX0KKwkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7CisJfQorfQorCitjaGFyICoKK2dldG9wdGlvbnModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyIG1bKGludCkgRk5GTEFHUyArIDFdOworCWNoYXIgKmNwID0gbTsKKworCWZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQorCQlpZiAob3B0aW9uc1tpXS5jICYmIEZsYWcoaSkpCisJCQkqY3ArKyA9IG9wdGlvbnNbaV0uYzsKKwlzdHJuZHVweChjcCwgbSwgY3AgLSBtLCBBVEVNUCk7CisJcmV0dXJuIChjcCk7Cit9CisKKy8qIGNoYW5nZSBhIEZsYWcoKikgdmFsdWU7IHRha2VzIGNhcmUgb2Ygc3BlY2lhbCBhY3Rpb25zICovCit2b2lkCitjaGFuZ2VfZmxhZyhlbnVtIHNoX2ZsYWcgZiwgaW50IHdoYXQsIHVuc2lnbmVkIGludCBuZXd2YWwpCit7CisJdW5zaWduZWQgY2hhciBvbGR2YWw7CisKKwlvbGR2YWwgPSBGbGFnKGYpOworCUZsYWcoZikgPSBuZXd2YWwgPyAxIDogMDsJLyogbmVlZGVkIGZvciB0cmlzdGF0ZXMgKi8KKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJaWYgKGYgPT0gRk1PTklUT1IpIHsKKwkJaWYgKHdoYXQgIT0gT0ZfQ01ETElORSAmJiBuZXd2YWwgIT0gb2xkdmFsKQorCQkJal9jaGFuZ2UoKTsKKwl9IGVsc2UKKyNlbmRpZgorCSAgaWYgKCgKKyNpZiAhTUtTSF9TX05PVkkKKwkgICAgZiA9PSBGVkkgfHwKKyNlbmRpZgorCSAgICBmID09IEZFTUFDUyB8fCBmID09IEZHTUFDUykgJiYgbmV3dmFsKSB7CisjaWYgIU1LU0hfU19OT1ZJCisJCUZsYWcoRlZJKSA9CisjZW5kaWYKKwkJICAgIEZsYWcoRkVNQUNTKSA9IEZsYWcoRkdNQUNTKSA9IDA7CisJCUZsYWcoZikgPSAodW5zaWduZWQgY2hhciluZXd2YWw7CisJfSBlbHNlIGlmIChmID09IEZQUklWSUxFR0VEICYmIG9sZHZhbCAmJiAhbmV3dmFsKSB7CisJCS8qIFR1cm5pbmcgb2ZmIC1wPyAqLworI2lmIEhBVkVfU0VUUkVTVUdJRAorCQlnaWRfdCBrc2hlZ2lkID0gZ2V0Z2lkKCk7CisKKwkJc2V0cmVzZ2lkKGtzaGVnaWQsIGtzaGVnaWQsIGtzaGVnaWQpOworI2lmIEhBVkVfU0VUR1JPVVBTCisJCXNldGdyb3VwcygxLCAma3NoZWdpZCk7CisjZW5kaWYKKwkJc2V0cmVzdWlkKGtzaGV1aWQsIGtzaGV1aWQsIGtzaGV1aWQpOworI2Vsc2UKKwkJc2V0ZXVpZChrc2hldWlkID0ga3NodWlkID0gZ2V0dWlkKCkpOworCQlzZXR1aWQoa3NoZXVpZCk7CisJCXNldGVnaWQoa3NoZWdpZCA9IGtzaGdpZCA9IGdldGdpZCgpKTsKKwkJc2V0Z2lkKGtzaGVnaWQpOworI2VuZGlmCisJfSBlbHNlIGlmICgoZiA9PSBGUE9TSVggfHwgZiA9PSBGU0gpICYmIG5ld3ZhbCkgeworCQlGbGFnKEZQT1NJWCkgPSBGbGFnKEZTSCkgPSBGbGFnKEZCUkFDRUVYUEFORCkgPSAwOworCQlGbGFnKGYpID0gKHVuc2lnbmVkIGNoYXIpbmV3dmFsOworCX0KKwkvKiBDaGFuZ2luZyBpbnRlcmFjdGl2ZSBmbGFnPyAqLworCWlmIChmID09IEZUQUxLSU5HKSB7CisJCWlmICgod2hhdCA9PSBPRl9DTURMSU5FIHx8IHdoYXQgPT0gT0ZfU0VUKSAmJiBwcm9jcGlkID09IGtzaHBpZCkKKwkJCUZsYWcoRlRBTEtJTkdfSSkgPSAodW5zaWduZWQgY2hhciluZXd2YWw7CisJfQorfQorCisvKiBQYXJzZSBjb21tYW5kIGxpbmUgJiBzZXQgY29tbWFuZCBhcmd1bWVudHMuIFJldHVybnMgdGhlIGluZGV4IG9mCisgKiBub24tb3B0aW9uIGFyZ3VtZW50cywgLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKi8KK2ludAorcGFyc2VfYXJncyhjb25zdCBjaGFyICoqYXJndiwKKyAgICBpbnQgd2hhdCwJCQkvKiBPRl9DTURMSU5FIG9yIE9GX1NFVCAqLworICAgIGJvb2wgKnNldGFyZ3NwKQoreworCXN0YXRpYyBjaGFyIGNtZF9vcHRzW05FTEVNKG9wdGlvbnMpICsgNV07IC8qIG86VDpcMCAqLworCXN0YXRpYyBjaGFyIHNldF9vcHRzW05FTEVNKG9wdGlvbnMpICsgNl07IC8qIEE6bztzXDAgKi8KKwljaGFyIHNldCwgKm9wdHM7CisJY29uc3QgY2hhciAqYXJyYXkgPSBOVUxMOworCUdldG9wdCBnbzsKKwlzaXplX3QgaTsKKwlpbnQgb3B0Yywgc29ydGFyZ3MgPSAwLCBhcnJheXNldCA9IDA7CisKKwkvKiBGaXJzdCBjYWxsPyBCdWlsZCBvcHRpb24gc3RyaW5ncy4uLiAqLworCWlmIChjbWRfb3B0c1swXSA9PSAnXDAnKSB7CisJCWNoYXIgKnAgPSBjbWRfb3B0cywgKnEgPSBzZXRfb3B0czsKKworCQkvKiBzZWUgY21kX29wdHNbXSBkZWNsYXJhdGlvbiAqLworCQkqcCsrID0gJ28nOworCQkqcCsrID0gJzonOworI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpIHx8IGRlZmluZWQoVElPQ1NDVFRZKQorCQkqcCsrID0gJ1QnOworCQkqcCsrID0gJzonOworI2VuZGlmCisJCS8qIHNlZSBzZXRfb3B0c1tdIGRlY2xhcmF0aW9uICovCisJCSpxKysgPSAnQSc7CisJCSpxKysgPSAnOic7CisJCSpxKysgPSAnbyc7CisJCSpxKysgPSAnOyc7CisJCSpxKysgPSAncyc7CisKKwkJZm9yIChpID0gMDsgaSA8IE5FTEVNKG9wdGlvbnMpOyBpKyspIHsKKwkJCWlmIChvcHRpb25zW2ldLmMpIHsKKwkJCQlpZiAob3B0aW9uc1tpXS5mbGFncyAmIE9GX0NNRExJTkUpCisJCQkJCSpwKysgPSBvcHRpb25zW2ldLmM7CisJCQkJaWYgKG9wdGlvbnNbaV0uZmxhZ3MgJiBPRl9TRVQpCisJCQkJCSpxKysgPSBvcHRpb25zW2ldLmM7CisJCQl9CisJCX0KKwkJKnAgPSAnXDAnOworCQkqcSA9ICdcMCc7CisJfQorCisJaWYgKHdoYXQgPT0gT0ZfQ01ETElORSkgeworCQljb25zdCBjaGFyICpwID0gYXJndlswXSwgKnE7CisJCS8qIFNldCBGTE9HSU4gYmVmb3JlIHBhcnNpbmcgb3B0aW9ucyBzbyB1c2VyIGNhbiBjbGVhcgorCQkgKiBmbGFnIHVzaW5nICtsLgorCQkgKi8KKwkJaWYgKCpwICE9ICctJykKKwkJCWZvciAocSA9IHA7ICpxOyApCisJCQkJaWYgKCpxKysgPT0gJy8nKQorCQkJCQlwID0gcTsKKwkJRmxhZyhGTE9HSU4pID0gKCpwID09ICctJyk7CisJCW9wdHMgPSBjbWRfb3B0czsKKwl9IGVsc2UgaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKSB7CisJCW9wdHMgPSBjbWRfb3B0czsKKwl9IGVsc2UKKwkJb3B0cyA9IHNldF9vcHRzOworCWtzaF9nZXRvcHRfcmVzZXQoJmdvLCBHRl9FUlJPUnxHRl9QTFVTT1BUKTsKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KGFyZ3YsICZnbywgb3B0cykpICE9IC0xKSB7CisJCXNldCA9IChnby5pbmZvICYgR0lfUExVUykgPyAwIDogMTsKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ0EnOgorCQkJaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKQorCQkJCWJyZWFrOworCQkJYXJyYXlzZXQgPSBzZXQgPyAxIDogLTE7CisJCQlhcnJheSA9IGdvLm9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ28nOgorCQkJaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKQorCQkJCWJyZWFrOworCQkJaWYgKGdvLm9wdGFyZyA9PSBOVUxMKSB7CisJCQkJLyogbG9uZSAtbzogcHJpbnQgb3B0aW9ucworCQkJCSAqCisJCQkJICogTm90ZSB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUsIC1vIHJlcXVpcmVzCisJCQkJICogYW4gb3B0aW9uIChpZSwgY2FuJ3QgZ2V0IGhlcmUgaWYgd2hhdCBpcworCQkJCSAqIE9GX0NNRExJTkUpLgorCQkJCSAqLworCQkJCXByaW50b3B0aW9ucyhzZXQpOworCQkJCWJyZWFrOworCQkJfQorCQkJaSA9IG9wdGlvbihnby5vcHRhcmcpOworCQkJaWYgKChlbnVtIHNoX2ZsYWcpaSA9PSBGQVJDNFJBTkRPTSkgeworCQkJCXdhcm5pbmdmKHRydWUsICJEbyBub3QgdXNlIHNldCDCsW8gYXJjNHJhbmRvbSwiCisJCQkJICAgICIgaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24iCisJCQkJICAgICIgb2YgbWtzaCEiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKChpICE9IChzaXplX3QpLTEpICYmIHNldCA9PSBGbGFnKGkpKQorCQkJCS8qIERvbid0IGNoZWNrIHRoZSBjb250ZXh0IGlmIHRoZSBmbGFnCisJCQkJICogaXNuJ3QgY2hhbmdpbmcgLSBtYWtlcyAic2V0IC1vIGludGVyYWN0aXZlIgorCQkJCSAqIHdvcmsgaWYgeW91J3JlIGFscmVhZHkgaW50ZXJhY3RpdmUuIE5lZWRlZAorCQkJCSAqIGlmIHRoZSBvdXRwdXQgb2YgInNldCArbyIgaXMgdG8gYmUgdXNlZC4KKwkJCQkgKi8KKwkJCQk7CisJCQllbHNlIGlmICgoaSAhPSAoc2l6ZV90KS0xKSAmJiAob3B0aW9uc1tpXS5mbGFncyAmIHdoYXQpKQorCQkJCWNoYW5nZV9mbGFnKChlbnVtIHNoX2ZsYWcpaSwgd2hhdCwgc2V0KTsKKwkJCWVsc2UgeworCQkJCWJpX2Vycm9yZigiJXM6IGJhZCBvcHRpb24iLCBnby5vcHRhcmcpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJYnJlYWs7CisKKyNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSB8fCBkZWZpbmVkKFRJT0NTQ1RUWSkKKwkJY2FzZSAnVCc6CisJCQlpZiAod2hhdCAhPSBPRl9GSVJTVFRJTUUpCisJCQkJYnJlYWs7CisjaWZuZGVmIFRJT0NTQ1RUWQorCQkJZXJyb3JmKCJubyBUSU9DU0NUVFkgaW9jdGwiKTsKKyNlbHNlCisJCQljaGFuZ2VfZmxhZyhGVEFMS0lORywgT0ZfQ01ETElORSwgMSk7CisJCQljaHZ0KGdvLm9wdGFyZyk7CisJCQlicmVhazsKKyNlbmRpZgorI2VuZGlmCisKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKC0xKTsKKworCQlkZWZhdWx0OgorCQkJaWYgKHdoYXQgPT0gT0ZfRklSU1RUSU1FKQorCQkJCWJyZWFrOworCQkJLyogLXM6IHNvcnQgcG9zaXRpb25hbCBwYXJhbXMgKEFUJlQga3NoIHN0dXBpZGl0eSkgKi8KKwkJCWlmICh3aGF0ID09IE9GX1NFVCAmJiBvcHRjID09ICdzJykgeworCQkJCXNvcnRhcmdzID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKQorCQkJCWlmIChvcHRjID09IG9wdGlvbnNbaV0uYyAmJgorCQkJCSAgICAod2hhdCAmIG9wdGlvbnNbaV0uZmxhZ3MpKSB7CisJCQkJCWNoYW5nZV9mbGFnKChlbnVtIHNoX2ZsYWcpaSwgd2hhdCwgc2V0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJaWYgKGkgPT0gTkVMRU0ob3B0aW9ucykpCisJCQkJaW50ZXJuYWxfZXJyb3JmKCJwYXJzZV9hcmdzOiAnJWMnIiwgb3B0Yyk7CisJCX0KKwl9CisJaWYgKCEoZ28uaW5mbyAmIEdJX01JTlVTTUlOVVMpICYmIGFyZ3ZbZ28ub3B0aW5kXSAmJgorCSAgICAoYXJndltnby5vcHRpbmRdWzBdID09ICctJyB8fCBhcmd2W2dvLm9wdGluZF1bMF0gPT0gJysnKSAmJgorCSAgICBhcmd2W2dvLm9wdGluZF1bMV0gPT0gJ1wwJykgeworCQkvKiBsb25lIC0gY2xlYXJzIC12IGFuZCAteCBmbGFncyAqLworCQlpZiAoYXJndltnby5vcHRpbmRdWzBdID09ICctJykKKwkJCUZsYWcoRlZFUkJPU0UpID0gRmxhZyhGWFRSQUNFKSA9IDA7CisJCS8qIHNldCBza2lwcyBsb25lIC0gb3IgKyBvcHRpb24gKi8KKwkJZ28ub3B0aW5kKys7CisJfQorCWlmIChzZXRhcmdzcCkKKwkJLyogLS0gbWVhbnMgc2V0ICQjLyQqIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cyAqLworCQkqc2V0YXJnc3AgPSAhYXJyYXlzZXQgJiYgKChnby5pbmZvICYgR0lfTUlOVVNNSU5VUykgfHwKKwkJICAgIGFyZ3ZbZ28ub3B0aW5kXSk7CisKKwlpZiAoYXJyYXlzZXQgJiYgKCEqYXJyYXkgfHwgKnNraXBfdmFybmFtZShhcnJheSwgZmFsc2UpKSkgeworCQliaV9lcnJvcmYoIiVzOiBpcyBub3QgYW4gaWRlbnRpZmllciIsIGFycmF5KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChzb3J0YXJncykgeworCQlmb3IgKGkgPSBnby5vcHRpbmQ7IGFyZ3ZbaV07IGkrKykKKwkJCTsKKwkJcXNvcnQoJmFyZ3ZbZ28ub3B0aW5kXSwgaSAtIGdvLm9wdGluZCwgc2l6ZW9mKHZvaWQgKiksCisJCSAgICB4c3RyY21wKTsKKwl9CisJaWYgKGFycmF5c2V0KQorCQlnby5vcHRpbmQgKz0gc2V0X2FycmF5KGFycmF5LCBhcnJheXNldCA+IDAgPyB0cnVlIDogZmFsc2UsCisJCSAgICBhcmd2ICsgZ28ub3B0aW5kKTsKKworCXJldHVybiAoZ28ub3B0aW5kKTsKK30KKworLyogcGFyc2UgYSBkZWNpbWFsIG51bWJlcjogcmV0dXJucyAwIGlmIHN0cmluZyBpc24ndCBhIG51bWJlciwgMSBvdGhlcndpc2UgKi8KK2ludAorZ2V0bihjb25zdCBjaGFyICpzLCBpbnQgKmFpKQoreworCWludCBpLCBjLCBydiA9IDA7CisJYm9vbCBuZWcgPSBmYWxzZTsKKworCWRvIHsKKwkJYyA9ICpzKys7CisJfSB3aGlsZSAoa3NoX2lzc3BhY2UoYykpOworCWlmIChjID09ICctJykgeworCQluZWcgPSB0cnVlOworCQljID0gKnMrKzsKKwl9IGVsc2UgaWYgKGMgPT0gJysnKQorCQljID0gKnMrKzsKKwkqYWkgPSBpID0gMDsKKwlkbyB7CisJCWlmICgha3NoX2lzZGlnaXQoYykpCisJCQlnb3RvIGdldG5fb3V0OworCQlpICo9IDEwOworCQlpZiAoaSA8ICphaSkKKwkJCS8qIG92ZXJmbG93ICovCisJCQlnb3RvIGdldG5fb3V0OworCQlpICs9IGMgLSAnMCc7CisJCSphaSA9IGk7CisJfSB3aGlsZSAoKGMgPSAqcysrKSk7CisJcnYgPSAxOworCisgZ2V0bl9vdXQ6CisJaWYgKG5lZykKKwkJKmFpID0gLSphaTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogZ2V0bigpIHRoYXQgcHJpbnRzIGVycm9yICovCitpbnQKK2JpX2dldG4oY29uc3QgY2hhciAqYXMsIGludCAqYWkpCit7CisJaW50IHJ2OworCisJaWYgKCEocnYgPSBnZXRuKGFzLCBhaSkpKQorCQliaV9lcnJvcmYoIiVzOiBiYWQgbnVtYmVyIiwgYXMpOworCXJldHVybiAocnYpOworfQorCisvKiAtLS0tLS0tLSBnbWF0Y2guYyAtLS0tLS0tLSAqLworCisvKgorICogaW50IGdtYXRjaChzdHJpbmcsIHBhdHRlcm4pCisgKiBjaGFyICpzdHJpbmcsICpwYXR0ZXJuOworICoKKyAqIE1hdGNoIGEgcGF0dGVybiBhcyBpbiBzaCgxKS4KKyAqIHBhdHRlcm4gY2hhcmFjdGVyIGFyZSBwcmVmaXhlZCB3aXRoIE1BR0lDIGJ5IGV4cGFuZC4KKyAqLworCitpbnQKK2dtYXRjaHgoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcCwgYm9vbCBpc2ZpbGUpCit7CisJY29uc3QgY2hhciAqc2UsICpwZTsKKworCWlmIChzID09IE5VTEwgfHwgcCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCisJc2UgPSBzICsgc3RybGVuKHMpOworCXBlID0gcCArIHN0cmxlbihwKTsKKwkvKiBpc2ZpbGUgaXMgZmFsc2UgaWZmIG5vIHN5bnRheCBjaGVjayBoYXMgYmVlbiBkb25lIG9uCisJICogdGhlIHBhdHRlcm4uIElmIGNoZWNrIGZhaWxzLCBqdXN0IHRvIGEgc3RyY21wKCkuCisJICovCisJaWYgKCFpc2ZpbGUgJiYgIWhhc19nbG9iYmluZyhwLCBwZSkpIHsKKwkJc2l6ZV90IGxlbiA9IHBlIC0gcCArIDE7CisJCWNoYXIgdGJ1Zls2NF07CisJCWNoYXIgKnQgPSBsZW4gPD0gc2l6ZW9mKHRidWYpID8gdGJ1ZiA6IGFsbG9jKGxlbiwgQVRFTVApOworCQlkZWJ1bmsodCwgcCwgbGVuKTsKKwkJcmV0dXJuICghc3RyY21wKHQsIHMpKTsKKwl9CisJcmV0dXJuIChkb19nbWF0Y2goKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc2UsCisJICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHAsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHBlKSk7Cit9CisKKy8qIFJldHVybnMgaWYgcCBpcyBhIHN5bnRhY3RpY2x5IGNvcnJlY3QgZ2xvYmJpbmcgcGF0dGVybiwgZmFsc2UKKyAqIGlmIGl0IGNvbnRhaW5zIG5vIHBhdHRlcm4gY2hhcmFjdGVycyBvciBpZiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvci4KKyAqIFN5bnRheCBlcnJvcnMgYXJlOgorICoJLSBbIHdpdGggbm8gY2xvc2luZyBdCisgKgktIGltYmFsYW5jZWQgJCguLi4pIGV4cHJlc3Npb24KKyAqCS0gWy4uLl0gYW5kICooLi4uKSBub3QgbmVzdGVkIChlZywgW2EkKGJ8XWMpLCAqKGFbYnxjXWQpKQorICovCisvKlhYWAorLSBpZiBubyBtYWdpYywKKwlpZiBkZXN0IGdpdmVuLCBjb3B5IHRvIGRzdAorCXJldHVybiA/CistIGlmIG1hZ2ljICYmIChubyBnbG9iYmluZyB8fCBzeW50YXggZXJyb3IpCisJZGVidW5rIHRvIGRzdAorCXJldHVybiA/CistIHJldHVybiA/CisqLworaW50CitoYXNfZ2xvYmJpbmcoY29uc3QgY2hhciAqeHAsIGNvbnN0IGNoYXIgKnhwZSkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgeHA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcGUgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB4cGU7CisJaW50IGM7CisJaW50IG5lc3QgPSAwLCBibmVzdCA9IDA7CisJaW50IHNhd19nbG9iID0gMDsKKwlpbnQgaW5fYnJhY2tldCA9IDA7IC8qIGluc2lkZSBbLi4uXSAqLworCisJZm9yICg7IHAgPCBwZTsgcCsrKSB7CisJCWlmICghSVNNQUdJQygqcCkpCisJCQljb250aW51ZTsKKwkJaWYgKChjID0gKisrcCkgPT0gJyonIHx8IGMgPT0gJz8nKQorCQkJc2F3X2dsb2IgPSAxOworCQllbHNlIGlmIChjID09ICdbJykgeworCQkJaWYgKCFpbl9icmFja2V0KSB7CisJCQkJc2F3X2dsb2IgPSAxOworCQkJCWluX2JyYWNrZXQgPSAxOworCQkJCWlmIChJU01BR0lDKHBbMV0pICYmIHBbMl0gPT0gTk9UKQorCQkJCQlwICs9IDI7CisJCQkJaWYgKElTTUFHSUMocFsxXSkgJiYgcFsyXSA9PSAnXScpCisJCQkJCXAgKz0gMjsKKwkJCX0KKwkJCS8qIFhYWCBEbyB3ZSBuZWVkIHRvIGNoZWNrIHJhbmdlcyBoZXJlPyBQT1NJWCBRICovCisJCX0gZWxzZSBpZiAoYyA9PSAnXScpIHsKKwkJCWlmIChpbl9icmFja2V0KSB7CisJCQkJaWYgKGJuZXN0KQkJLyogW2EqKGJdKSAqLworCQkJCQlyZXR1cm4gKDApOworCQkJCWluX2JyYWNrZXQgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKChjICYgMHg4MCkgJiYgdnN0cmNocigiKis/QCEgIiwgYyAmIDB4N2YpKSB7CisJCQlzYXdfZ2xvYiA9IDE7CisJCQlpZiAoaW5fYnJhY2tldCkKKwkJCQlibmVzdCsrOworCQkJZWxzZQorCQkJCW5lc3QrKzsKKwkJfSBlbHNlIGlmIChjID09ICd8JykgeworCQkJaWYgKGluX2JyYWNrZXQgJiYgIWJuZXN0KQkvKiAqKGFbZm9vfGJhcl0pICovCisJCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlIGlmIChjID09IC8qKCovICcpJykgeworCQkJaWYgKGluX2JyYWNrZXQpIHsKKwkJCQlpZiAoIWJuZXN0LS0pCQkvKiAqKGFbYiljXSAqLworCQkJCQlyZXR1cm4gKDApOworCQkJfSBlbHNlIGlmIChuZXN0KQorCQkJCW5lc3QtLTsKKwkJfQorCQkvKgorCQkgKiBlbHNlIG11c3QgYmUgYSBNQUdJQy1NQUdJQywgb3IgTUFHSUMtISwKKwkJICogTUFHSUMtLSwgTUFHSUMtXSwgTUFHSUMteywgTUFHSUMtLCBNQUdJQy19CisJCSAqLworCX0KKwlyZXR1cm4gKHNhd19nbG9iICYmICFpbl9icmFja2V0ICYmICFuZXN0KTsKK30KKworLyogRnVuY3Rpb24gbXVzdCByZXR1cm4gZWl0aGVyIDAgb3IgMSAoYXNzdW1lZCBieSBjb2RlIGZvciAweDgwfCchJykgKi8KK3N0YXRpYyBpbnQKK2RvX2dtYXRjaChjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwZSkKK3sKKwlpbnQgc2MsIHBjOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnByZXN0LCAqcHN1YiwgKnBuZXh0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyZXN0OworCisJaWYgKHMgPT0gTlVMTCB8fCBwID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJd2hpbGUgKHAgPCBwZSkgeworCQlwYyA9ICpwKys7CisJCXNjID0gcyA8IHNlID8gKnMgOiAnXDAnOworCQlzKys7CisJCWlmICghSVNNQUdJQyhwYykpIHsKKwkJCWlmIChzYyAhPSBwYykKKwkJCQlyZXR1cm4gKDApOworCQkJY29udGludWU7CisJCX0KKwkJc3dpdGNoICgqcCsrKSB7CisJCWNhc2UgJ1snOgorCQkJaWYgKHNjID09IDAgfHwgKHAgPSBjY2xhc3MocCwgc2MpKSA9PSBOVUxMKQorCQkJCXJldHVybiAoMCk7CisJCQlicmVhazsKKworCQljYXNlICc/JzoKKwkJCWlmIChzYyA9PSAwKQorCQkJCXJldHVybiAoMCk7CisJCQlpZiAoVVRGTU9ERSkgeworCQkJCS0tczsKKwkJCQlzICs9IHV0Zl9wdHJhZGooKGNvbnN0IHZvaWQgKilzKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJyonOgorCQkJaWYgKHAgPT0gcGUpCisJCQkJcmV0dXJuICgxKTsKKwkJCXMtLTsKKwkJCWRvIHsKKwkJCQlpZiAoZG9fZ21hdGNoKHMsIHNlLCBwLCBwZSkpCisJCQkJCXJldHVybiAoMSk7CisJCQl9IHdoaWxlIChzKysgPCBzZSk7CisJCQlyZXR1cm4gKDApOworCisJCS8qKgorCQkgKiBbKis/QCFdKHBhdHRlcm58cGF0dGVybnwuLikKKwkJICogVGhpcyBpcyBhbHNvIG5lZWRlZCBmb3IgJHsuLiUuLn0sIGV0Yy4KKwkJICovCisJCWNhc2UgMHg4MHwnKyc6IC8qIG1hdGNoZXMgb25lIG9yIG1vcmUgdGltZXMgKi8KKwkJY2FzZSAweDgwfCcqJzogLyogbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgdGltZXMgKi8KKwkJCWlmICghKHByZXN0ID0gcGF0X3NjYW4ocCwgcGUsIDApKSkKKwkJCQlyZXR1cm4gKDApOworCQkJcy0tOworCQkJLyogdGFrZSBjYXJlIG9mIHplcm8gbWF0Y2hlcyAqLworCQkJaWYgKHBbLTFdID09ICgweDgwIHwgJyonKSAmJgorCQkJICAgIGRvX2dtYXRjaChzLCBzZSwgcHJlc3QsIHBlKSkKKwkJCQlyZXR1cm4gKDEpOworCQkJZm9yIChwc3ViID0gcDsgOyBwc3ViID0gcG5leHQpIHsKKwkJCQlwbmV4dCA9IHBhdF9zY2FuKHBzdWIsIHBlLCAxKTsKKwkJCQlmb3IgKHNyZXN0ID0gczsgc3Jlc3QgPD0gc2U7IHNyZXN0KyspIHsKKwkJCQkJaWYgKGRvX2dtYXRjaChzLCBzcmVzdCwgcHN1YiwgcG5leHQgLSAyKSAmJgorCQkJCQkgICAgKGRvX2dtYXRjaChzcmVzdCwgc2UsIHByZXN0LCBwZSkgfHwKKwkJCQkJICAgIChzICE9IHNyZXN0ICYmIGRvX2dtYXRjaChzcmVzdCwKKwkJCQkJICAgIHNlLCBwIC0gMiwgcGUpKSkpCisJCQkJCQlyZXR1cm4gKDEpOworCQkJCX0KKwkJCQlpZiAocG5leHQgPT0gcHJlc3QpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuICgwKTsKKworCQljYXNlIDB4ODB8Jz8nOiAvKiBtYXRjaGVzIHplcm8gb3Igb25jZSAqLworCQljYXNlIDB4ODB8J0AnOiAvKiBtYXRjaGVzIG9uZSBvZiB0aGUgcGF0dGVybnMgKi8KKwkJY2FzZSAweDgwfCcgJzogLyogc2ltaWxlIGZvciBAICovCisJCQlpZiAoIShwcmVzdCA9IHBhdF9zY2FuKHAsIHBlLCAwKSkpCisJCQkJcmV0dXJuICgwKTsKKwkJCXMtLTsKKwkJCS8qIFRha2UgY2FyZSBvZiB6ZXJvIG1hdGNoZXMgKi8KKwkJCWlmIChwWy0xXSA9PSAoMHg4MCB8ICc/JykgJiYKKwkJCSAgICBkb19nbWF0Y2gocywgc2UsIHByZXN0LCBwZSkpCisJCQkJcmV0dXJuICgxKTsKKwkJCWZvciAocHN1YiA9IHA7IDsgcHN1YiA9IHBuZXh0KSB7CisJCQkJcG5leHQgPSBwYXRfc2Nhbihwc3ViLCBwZSwgMSk7CisJCQkJc3Jlc3QgPSBwcmVzdCA9PSBwZSA/IHNlIDogczsKKwkJCQlmb3IgKDsgc3Jlc3QgPD0gc2U7IHNyZXN0KyspIHsKKwkJCQkJaWYgKGRvX2dtYXRjaChzLCBzcmVzdCwgcHN1YiwgcG5leHQgLSAyKSAmJgorCQkJCQkgICAgZG9fZ21hdGNoKHNyZXN0LCBzZSwgcHJlc3QsIHBlKSkKKwkJCQkJCXJldHVybiAoMSk7CisJCQkJfQorCQkJCWlmIChwbmV4dCA9PSBwcmVzdCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlyZXR1cm4gKDApOworCisJCWNhc2UgMHg4MHwnISc6IC8qIG1hdGNoZXMgbm9uZSBvZiB0aGUgcGF0dGVybnMgKi8KKwkJCWlmICghKHByZXN0ID0gcGF0X3NjYW4ocCwgcGUsIDApKSkKKwkJCQlyZXR1cm4gKDApOworCQkJcy0tOworCQkJZm9yIChzcmVzdCA9IHM7IHNyZXN0IDw9IHNlOyBzcmVzdCsrKSB7CisJCQkJaW50IG1hdGNoZWQgPSAwOworCisJCQkJZm9yIChwc3ViID0gcDsgOyBwc3ViID0gcG5leHQpIHsKKwkJCQkJcG5leHQgPSBwYXRfc2Nhbihwc3ViLCBwZSwgMSk7CisJCQkJCWlmIChkb19nbWF0Y2gocywgc3Jlc3QsIHBzdWIsCisJCQkJCSAgICBwbmV4dCAtIDIpKSB7CisJCQkJCQltYXRjaGVkID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChwbmV4dCA9PSBwcmVzdCkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoIW1hdGNoZWQgJiYKKwkJCQkgICAgZG9fZ21hdGNoKHNyZXN0LCBzZSwgcHJlc3QsIHBlKSkKKwkJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChzYyAhPSBwWy0xXSkKKwkJCQlyZXR1cm4gKDApOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChzID09IHNlKTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKgorY2NsYXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBzdWIpCit7CisJaW50IGMsIGQsIG5vdHAsIGZvdW5kID0gMDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpvcmlnX3AgPSBwOworCisJaWYgKChub3RwID0gKElTTUFHSUMoKnApICYmICorK3AgPT0gTk9UKSkpCisJCXArKzsKKwlkbyB7CisJCWMgPSAqcCsrOworCQlpZiAoSVNNQUdJQyhjKSkgeworCQkJYyA9ICpwKys7CisJCQlpZiAoKGMgJiAweDgwKSAmJiAhSVNNQUdJQyhjKSkgeworCQkJCWMgJj0gMHg3ZjsvKiBleHRlbmRlZCBwYXR0ZXJuIG1hdGNoaW5nOiAqKz9AISAqLworCQkJCS8qIFhYWCB0aGUgKCBjaGFyIGlzbid0IGhhbmRsZWQgYXMgcGFydCBvZiBbXSAqLworCQkJCWlmIChjID09ICcgJykgLyogc2ltaWxlIGZvciBAOiBwbGFpbiAoLi4pICovCisJCQkJCWMgPSAnKCcgLyopKi87CisJCQl9CisJCX0KKwkJaWYgKGMgPT0gJ1wwJykKKwkJCS8qIE5vIGNsb3NpbmcgXSAtIGFjdCBhcyBpZiB0aGUgb3BlbmluZyBbIHdhcyBxdW90ZWQgKi8KKwkJCXJldHVybiAoc3ViID09ICdbJyA/IG9yaWdfcCA6IE5VTEwpOworCQlpZiAoSVNNQUdJQyhwWzBdKSAmJiBwWzFdID09ICctJyAmJgorCQkgICAgKCFJU01BR0lDKHBbMl0pIHx8IHBbM10gIT0gJ10nKSkgeworCQkJcCArPSAyOyAvKiBNQUdJQy0gKi8KKwkJCWQgPSAqcCsrOworCQkJaWYgKElTTUFHSUMoZCkpIHsKKwkJCQlkID0gKnArKzsKKwkJCQlpZiAoKGQgJiAweDgwKSAmJiAhSVNNQUdJQyhkKSkKKwkJCQkJZCAmPSAweDdmOworCQkJfQorCQkJLyogUE9TSVggc2F5cyB0aGlzIGlzIGFuIGludmFsaWQgZXhwcmVzc2lvbiAqLworCQkJaWYgKGMgPiBkKQorCQkJCXJldHVybiAoTlVMTCk7CisJCX0gZWxzZQorCQkJZCA9IGM7CisJCWlmIChjID09IHN1YiB8fCAoYyA8PSBzdWIgJiYgc3ViIDw9IGQpKQorCQkJZm91bmQgPSAxOworCX0gd2hpbGUgKCEoSVNNQUdJQyhwWzBdKSAmJiBwWzFdID09ICddJykpOworCisJcmV0dXJuICgoZm91bmQgIT0gbm90cCkgPyBwKzIgOiBOVUxMKTsKK30KKworLyogTG9vayBmb3IgbmV4dCApIG9yIHwgKGlmIG1hdGNoX3NlcCkgaW4gKihmb298YmFyKSBwYXR0ZXJuICovCitjb25zdCB1bnNpZ25lZCBjaGFyICoKK3BhdF9zY2FuKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlLCBpbnQgbWF0Y2hfc2VwKQoreworCWludCBuZXN0ID0gMDsKKworCWZvciAoOyBwIDwgcGU7IHArKykgeworCQlpZiAoIUlTTUFHSUMoKnApKQorCQkJY29udGludWU7CisJCWlmICgoKisrcCA9PSAvKigqLyAnKScgJiYgbmVzdC0tID09IDApIHx8CisJCSAgICAoKnAgPT0gJ3wnICYmIG1hdGNoX3NlcCAmJiBuZXN0ID09IDApKQorCQkJcmV0dXJuIChwICsgMSk7CisJCWlmICgoKnAgJiAweDgwKSAmJiB2c3RyY2hyKCIqKz9AISAiLCAqcCAmIDB4N2YpKQorCQkJbmVzdCsrOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitpbnQKK3hzdHJjbXAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworCXJldHVybiAoc3RyY21wKCooY29uc3QgY2hhciAqIGNvbnN0ICopcDEsICooY29uc3QgY2hhciAqIGNvbnN0ICopcDIpKTsKK30KKworLyogSW5pdGlhbGlzZSBhIEdldG9wdCBzdHJ1Y3R1cmUgKi8KK3ZvaWQKK2tzaF9nZXRvcHRfcmVzZXQoR2V0b3B0ICpnbywgaW50IGZsYWdzKQoreworCWdvLT5vcHRpbmQgPSAxOworCWdvLT5vcHRhcmcgPSBOVUxMOworCWdvLT5wID0gMDsKKwlnby0+ZmxhZ3MgPSBmbGFnczsKKwlnby0+aW5mbyA9IDA7CisJZ28tPmJ1ZlsxXSA9ICdcMCc7Cit9CisKKworLyogZ2V0b3B0KCkgdXNlZCBmb3Igc2hlbGwgYnVpbHQtaW4gY29tbWFuZHMsIHRoZSBnZXRvcHRzIGNvbW1hbmQsIGFuZAorICogY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgKiBBIGxlYWRpbmcgJzonIGluIG9wdGlvbnMgbWVhbnMgZG9uJ3QgcHJpbnQgZXJyb3JzLCBpbnN0ZWFkIHJldHVybiAnPycKKyAqIG9yICc6JyBhbmQgc2V0IGdvLT5vcHRhcmcgdG8gdGhlIG9mZmVuZGluZyBvcHRpb24gY2hhcmFjdGVyLgorICogSWYgR0ZfRVJST1IgaXMgc2V0IChhbmQgb3B0aW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCA6KSwgZXJyb3JzIHJlc3VsdCBpbgorICogYSBjYWxsIHRvIGJpX2Vycm9yZigpLgorICoKKyAqIE5vbi1zdGFuZGFyZCBmZWF0dXJlczoKKyAqCS0gJzsnIGlzIGxpa2UgJzonIGluIG9wdGlvbnMsIGV4Y2VwdCB0aGUgYXJndW1lbnQgaXMgb3B0aW9uYWwKKyAqCSAgKGlmIGl0IGlzbid0IHByZXNlbnQsIG9wdGFyZyBpcyBzZXQgdG8gMCkuCisgKgkgIFVzZWQgZm9yICdzZXQgLW8nLgorICoJLSAnLCcgaXMgbGlrZSAnOicgaW4gb3B0aW9ucywgZXhjZXB0IHRoZSBhcmd1bWVudCBhbHdheXMgaW1tZWRpYXRlbHkKKyAqCSAgZm9sbG93cyB0aGUgb3B0aW9uIGNoYXJhY3RlciAob3B0YXJnIGlzIHNldCB0byB0aGUgbnVsbCBzdHJpbmcgaWYKKyAqCSAgdGhlIG9wdGlvbiBpcyBtaXNzaW5nKS4KKyAqCSAgVXNlZCBmb3IgJ3JlYWQgLXUyJywgJ3ByaW50IC11MicgYW5kIGZjIC00MC4KKyAqCS0gJyMnIGlzIGxpa2UgJzonIGluIG9wdGlvbnMsIGV4cGVjdCB0aGF0IHRoZSBhcmd1bWVudCBpcyBvcHRpb25hbAorICoJICBhbmQgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQuIElmIHRoZSBhcmd1bWVudCBkb2Vzbid0IHN0YXJ0IHdpdGggYQorICoJICBkaWdpdCwgaXQgaXMgYXNzdW1lZCB0byBiZSBtaXNzaW5nIGFuZCBub3JtYWwgb3B0aW9uIHByb2Nlc3NpbmcKKyAqCSAgY29udGludWVzIChvcHRhcmcgaXMgc2V0IHRvIDAgaWYgdGhlIG9wdGlvbiBpcyBtaXNzaW5nKS4KKyAqCSAgVXNlZCBmb3IgJ3R5cGVzZXQgLUxaNCcuCisgKgktIGFjY2VwdHMgK2MgYXMgd2VsbCBhcyAtYyBJRiB0aGUgR0ZfUExVU09QVCBmbGFnIGlzIHByZXNlbnQuIElmIGFuCisgKgkgIG9wdGlvbiBzdGFydGluZyB3aXRoICsgaXMgYWNjZXB0ZWQsIHRoZSBHSV9QTFVTIGZsYWcgd2lsbCBiZSBzZXQKKyAqCSAgaW4gZ28tPmluZm8uCisgKi8KK2ludAora3NoX2dldG9wdChjb25zdCBjaGFyICoqYXJndiwgR2V0b3B0ICpnbywgY29uc3QgY2hhciAqb3B0aW9uc3ApCit7CisJY2hhciBjOworCWNvbnN0IGNoYXIgKm87CisKKwlpZiAoZ28tPnAgPT0gMCB8fCAoYyA9IGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkgPT0gJ1wwJykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2dvLT5vcHRpbmRdLCBmbGFnID0gYXJnID8gKmFyZyA6ICdcMCc7CisKKwkJZ28tPnAgPSAxOworCQlpZiAoZmxhZyA9PSAnLScgJiYgYXJnWzFdID09ICctJyAmJiBhcmdbMl0gPT0gJ1wwJykgeworCQkJZ28tPm9wdGluZCsrOworCQkJZ28tPnAgPSAwOworCQkJZ28tPmluZm8gfD0gR0lfTUlOVVNNSU5VUzsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChhcmcgPT0gTlVMTCB8fAorCQkgICAgKChmbGFnICE9ICctJyApICYmIC8qIG5laXRoZXIgYSAtIG5vciBhICsgKGlmICsgYWxsb3dlZCkgKi8KKwkJICAgICghKGdvLT5mbGFncyAmIEdGX1BMVVNPUFQpIHx8IGZsYWcgIT0gJysnKSkgfHwKKwkJICAgIChjID0gYXJnWzFdKSA9PSAnXDAnKSB7CisJCQlnby0+cCA9IDA7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlnby0+b3B0aW5kKys7CisJCWdvLT5pbmZvICY9IH4oR0lfTUlOVVN8R0lfUExVUyk7CisJCWdvLT5pbmZvIHw9IGZsYWcgPT0gJy0nID8gR0lfTUlOVVMgOiBHSV9QTFVTOworCX0KKwlnby0+cCsrOworCWlmIChjID09ICc/JyB8fCBjID09ICc6JyB8fCBjID09ICc7JyB8fCBjID09ICcsJyB8fCBjID09ICcjJyB8fAorCSAgICAhKG8gPSBjc3RyY2hyKG9wdGlvbnNwLCBjKSkpIHsKKwkJaWYgKG9wdGlvbnNwWzBdID09ICc6JykgeworCQkJZ28tPmJ1ZlswXSA9IGM7CisJCQlnby0+b3B0YXJnID0gZ28tPmJ1ZjsKKwkJfSBlbHNlIHsKKwkJCXdhcm5pbmdmKHRydWUsICIlcyVzLSVjOiB1bmtub3duIG9wdGlvbiIsCisJCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6IGFyZ3ZbMF0sCisJCQkgICAgKGdvLT5mbGFncyAmIEdGX05PTkFNRSkgPyAiIiA6ICI6ICIsIGMpOworCQkJaWYgKGdvLT5mbGFncyAmIEdGX0VSUk9SKQorCQkJCWJpX2Vycm9yZnooKTsKKwkJfQorCQlyZXR1cm4gKCc/Jyk7CisJfQorCS8qIDogbWVhbnMgYXJndW1lbnQgbXVzdCBiZSBwcmVzZW50LCBtYXkgYmUgcGFydCBvZiBvcHRpb24gYXJndW1lbnQKKwkgKiAgIG9yIHRoZSBuZXh0IGFyZ3VtZW50CisJICogOyBzYW1lIGFzIDogYnV0IGFyZ3VtZW50IG1heSBiZSBtaXNzaW5nCisJICogLCBtZWFucyBhcmd1bWVudCBpcyBwYXJ0IG9mIG9wdGlvbiBhcmd1bWVudCwgYW5kIG1heSBiZSBudWxsLgorCSAqLworCWlmICgqKytvID09ICc6JyB8fCAqbyA9PSAnOycpIHsKKwkJaWYgKGFyZ3ZbZ28tPm9wdGluZCAtIDFdW2dvLT5wXSkKKwkJCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQgLSAxXSArIGdvLT5wOworCQllbHNlIGlmIChhcmd2W2dvLT5vcHRpbmRdKQorCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCsrXTsKKwkJZWxzZSBpZiAoKm8gPT0gJzsnKQorCQkJZ28tPm9wdGFyZyA9IE5VTEw7CisJCWVsc2UgeworCQkJaWYgKG9wdGlvbnNwWzBdID09ICc6JykgeworCQkJCWdvLT5idWZbMF0gPSBjOworCQkJCWdvLT5vcHRhcmcgPSBnby0+YnVmOworCQkJCXJldHVybiAoJzonKTsKKwkJCX0KKwkJCXdhcm5pbmdmKHRydWUsICIlcyVzLSclYycgcmVxdWlyZXMgYXJndW1lbnQiLAorCQkJICAgIChnby0+ZmxhZ3MgJiBHRl9OT05BTUUpID8gIiIgOiBhcmd2WzBdLAorCQkJICAgIChnby0+ZmxhZ3MgJiBHRl9OT05BTUUpID8gIiIgOiAiOiAiLCBjKTsKKwkJCWlmIChnby0+ZmxhZ3MgJiBHRl9FUlJPUikKKwkJCQliaV9lcnJvcmZ6KCk7CisJCQlyZXR1cm4gKCc/Jyk7CisJCX0KKwkJZ28tPnAgPSAwOworCX0gZWxzZSBpZiAoKm8gPT0gJywnKSB7CisJCS8qIGFyZ3VtZW50IGlzIGF0dGFjaGVkIHRvIG9wdGlvbiBjaGFyYWN0ZXIsIGV2ZW4gaWYgbnVsbCAqLworCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kIC0gMV0gKyBnby0+cDsKKwkJZ28tPnAgPSAwOworCX0gZWxzZSBpZiAoKm8gPT0gJyMnKSB7CisJCS8qIGFyZ3VtZW50IGlzIG9wdGlvbmFsIGFuZCBtYXkgYmUgYXR0YWNoZWQgb3IgdW5hdHRhY2hlZAorCQkgKiBidXQgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQuIG9wdGFyZyBpcyBzZXQgdG8gMCBpZiB0aGUKKwkJICogYXJndW1lbnQgaXMgbWlzc2luZy4KKwkJICovCisJCWlmIChhcmd2W2dvLT5vcHRpbmQgLSAxXVtnby0+cF0pIHsKKwkJCWlmIChrc2hfaXNkaWdpdChhcmd2W2dvLT5vcHRpbmQgLSAxXVtnby0+cF0pKSB7CisJCQkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCAtIDFdICsgZ28tPnA7CisJCQkJZ28tPnAgPSAwOworCQkJfSBlbHNlCisJCQkJZ28tPm9wdGFyZyA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlpZiAoYXJndltnby0+b3B0aW5kXSAmJiBrc2hfaXNkaWdpdChhcmd2W2dvLT5vcHRpbmRdWzBdKSkgeworCQkJCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQrK107CisJCQkJZ28tPnAgPSAwOworCQkJfSBlbHNlCisJCQkJZ28tPm9wdGFyZyA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIChjKTsKK30KKworLyogcHJpbnQgdmFyaWFibGUvYWxpYXMgdmFsdWUgdXNpbmcgbmVjZXNzYXJ5IHF1b3RlcworICogKFBPU0lYIHNheXMgdGhleSBzaG91bGQgYmUgc3VpdGFibGUgZm9yIHJlLWVudHJ5Li4uKQorICogTm8gdHJhaWxpbmcgbmV3bGluZSBpcyBwcmludGVkLgorICovCit2b2lkCitwcmludF92YWx1ZV9xdW90ZWQoY29uc3QgY2hhciAqcykKK3sKKwljb25zdCBjaGFyICpwOworCWludCBpbnF1b3RlID0gMDsKKworCS8qIFRlc3QgaWYgYW55IHF1b3RlcyBhcmUgbmVlZGVkICovCisJZm9yIChwID0gczsgKnA7IHArKykKKwkJaWYgKGN0eXBlKCpwLCBDX1FVT1RFKSkKKwkJCWJyZWFrOworCWlmICghKnApIHsKKwkJc2hmX3B1dHMocywgc2hsX3N0ZG91dCk7CisJCXJldHVybjsKKwl9CisJZm9yIChwID0gczsgKnA7IHArKykgeworCQlpZiAoKnAgPT0gJ1wnJykgeworCQkJaWYgKGlucXVvdGUpCisJCQkJc2hmX3B1dGMoJ1wnJywgc2hsX3N0ZG91dCk7CisJCQlzaGZfcHV0YygnXFwnLCBzaGxfc3Rkb3V0KTsKKwkJCWlucXVvdGUgPSAwOworCQl9IGVsc2UgaWYgKCFpbnF1b3RlKSB7CisJCQlzaGZfcHV0YygnXCcnLCBzaGxfc3Rkb3V0KTsKKwkJCWlucXVvdGUgPSAxOworCQl9CisJCXNoZl9wdXRjKCpwLCBzaGxfc3Rkb3V0KTsKKwl9CisJaWYgKGlucXVvdGUpCisJCXNoZl9wdXRjKCdcJycsIHNobF9zdGRvdXQpOworfQorCisvKgorICogUHJpbnQgdGhpbmdzIGluIGNvbHVtbnMgYW5kIHJvd3MgLSBmdW5jKCkgaXMgY2FsbGVkIHRvIGZvcm1hdAorICogdGhlIGktdGggZWxlbWVudAorICovCit2b2lkCitwcmludF9jb2x1bW5zKHN0cnVjdCBzaGYgKnNoZiwgaW50IG4sCisgICAgY2hhciAqKCpmdW5jKShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopLAorICAgIGNvbnN0IHZvaWQgKmFyZywgaW50IG1heF9vY3QsIGludCBtYXhfY29sLCBib29sIHByZWZjb2wpCit7CisJaW50IGksIHIsIGMsIHJvd3MsIGNvbHMsIG5zcGFjZTsKKwljaGFyICpzdHI7CisKKwlpZiAobiA8PSAwKSB7CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJaW50ZXJuYWxfd2FybmluZ2YoInByaW50X2NvbHVtbnMgY2FsbGVkIHdpdGggbj0lZCA8PSAwIiwgbik7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCSsrbWF4X29jdDsKKwlzdHIgPSBhbGxvYyhtYXhfb2N0LCBBVEVNUCk7CisKKwkvKiBlbnN1cmUgeF9jb2xzIGlzIHZhbGlkIGZpcnN0ICovCisJaWYgKHhfY29scyA8IE1JTl9DT0xTKQorCQljaGFuZ2Vfd2luc3ooKTsKKworCS8qCisJICogV2UgdXNlIChtYXhfY29sICsgMSkgdG8gY29uc2lkZXIgdGhlIHNwYWNlIHNlcGFyYXRvci4KKwkgKiBOb3RlIHRoYXQgbm8gc3BhY2UgaXMgcHJpbnRlZCBhZnRlciB0aGUgbGFzdCBjb2x1bW4KKwkgKiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHRlcm1pbmFscyB0aGF0IGhhdmUgYXV0by13cmFwLgorCSAqLworCWNvbHMgPSB4X2NvbHMgLyAobWF4X2NvbCArIDEpOworCisJLyogaWYgd2UgY2FuIG9ubHkgcHJpbnQgb25lIGNvbHVtbiBhbnl3YXksIHNraXAgdGhlIGdvbyAqLworCWlmIChjb2xzIDwgMikgeworCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQkJc2hmX2ZwcmludGYoc2hmLCAiJXMgXG4iLAorCQkJICAgICgqZnVuYykoc3RyLCBtYXhfb2N0LCBpLCBhcmcpKTsKKwkJZ290byBvdXQ7CisJfQorCisJcm93cyA9IChuICsgY29scyAtIDEpIC8gY29sczsKKwlpZiAocHJlZmNvbCAmJiBjb2xzID4gcm93cykgeworCQlpID0gcm93czsKKwkJcm93cyA9IGNvbHMgPiBuID8gbiA6IGNvbHM7CisJCWNvbHMgPSBpOworCX0KKworCW1heF9jb2wgPSAtbWF4X2NvbDsKKwluc3BhY2UgPSAoeF9jb2xzICsgbWF4X2NvbCAqIGNvbHMpIC8gY29sczsKKwlpZiAobnNwYWNlIDw9IDApCisJCW5zcGFjZSA9IDE7CisJZm9yIChyID0gMDsgciA8IHJvd3M7IHIrKykgeworCQlmb3IgKGMgPSAwOyBjIDwgY29sczsgYysrKSB7CisJCQlpID0gYyAqIHJvd3MgKyByOworCQkJaWYgKGkgPCBuKSB7CisJCQkJc2hmX2ZwcmludGYoc2hmLCAiJSpzIiwgbWF4X2NvbCwKKwkJCQkgICAgKCpmdW5jKShzdHIsIG1heF9vY3QsIGksIGFyZykpOworCQkJCWlmIChjICsgMSA8IGNvbHMpCisJCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiUqcyIsIG5zcGFjZSwgbnVsbCk7CisJCQl9CisJCX0KKwkJc2hmX3B1dGNoYXIoJ1xuJywgc2hmKTsKKwl9Cisgb3V0OgorCWFmcmVlKHN0ciwgQVRFTVApOworfQorCisvKiBTdHJpcCBhbnkgbnVsIGJ5dGVzIGZyb20gYnVmIC0gcmV0dXJucyBuZXcgbGVuZ3RoIChuYnl0ZXMgLSAjIG9mIG51bHMpICovCit2b2lkCitzdHJpcF9udWxzKGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKK3sKKwljaGFyICpkc3Q7CisKKwkvKiBuYnl0ZXMgY2hlY2sgYmVjYXVzZSBzb21lIHN5c3RlbXMgKG9sZGVyIEZyZWVCU0RzKSBoYXZlIGEgYnVnZ3kKKwkgKiBtZW1jaHIoKQorCSAqLworCWlmIChuYnl0ZXMgJiYgKGRzdCA9IG1lbWNocihidWYsICdcMCcsIG5ieXRlcykpKSB7CisJCWNoYXIgKmVuZCA9IGJ1ZiArIG5ieXRlczsKKwkJY2hhciAqcCwgKnE7CisKKwkJZm9yIChwID0gZHN0OyBwIDwgZW5kOyBwID0gcSkgeworCQkJLyogc2tpcCBhIGJsb2NrIG9mIG51bGxzICovCisJCQl3aGlsZSAoKytwIDwgZW5kICYmICpwID09ICdcMCcpCisJCQkJOworCQkJLyogZmluZCBlbmQgb2Ygbm9uLW51bGwgYmxvY2sgKi8KKwkJCWlmICghKHEgPSBtZW1jaHIocCwgJ1wwJywgZW5kIC0gcCkpKQorCQkJCXEgPSBlbmQ7CisJCQltZW1tb3ZlKGRzdCwgcCwgcSAtIHApOworCQkJZHN0ICs9IHEgLSBwOworCQl9CisJCSpkc3QgPSAnXDAnOworCX0KK30KKworLyogTGlrZSByZWFkKDIpLCBidXQgaWYgcmVhZCBmYWlscyBkdWUgdG8gbm9uLWJsb2NraW5nIGZsYWcsIHJlc2V0cyBmbGFnCisgKiBhbmQgcmVzdGFydHMgcmVhZC4KKyAqLworaW50CitibG9ja2luZ19yZWFkKGludCBmZCwgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWludCByZXQ7CisJaW50IHRyaWVkX3Jlc2V0ID0gMDsKKworCXdoaWxlICgocmV0ID0gcmVhZChmZCwgYnVmLCBuYnl0ZXMpKSA8IDApIHsKKwkJaWYgKCF0cmllZF9yZXNldCAmJiBlcnJubyA9PSBFQUdBSU4pIHsKKwkJCWlmIChyZXNldF9ub25ibG9jayhmZCkgPiAwKSB7CisJCQkJdHJpZWRfcmVzZXQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZXJybm8gPSBFQUdBSU47CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAocmV0KTsKK30KKworLyogUmVzZXQgdGhlIG5vbi1ibG9ja2luZyBmbGFnIG9uIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgorICogUmV0dXJucyAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IsIDAgaWYgbm9uLWJsb2NraW5nIHdhc24ndCBzZXQsCisgKiAxIGlmIGl0IHdhcy4KKyAqLworaW50CityZXNldF9ub25ibG9jayhpbnQgZmQpCit7CisJaW50IGZsYWdzOworCisJaWYgKChmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKSkgPCAwKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoIShmbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm4gKDApOworCWZsYWdzICY9IH5PX05PTkJMT0NLOworCWlmIChmY250bChmZCwgRl9TRVRGTCwgZmxhZ3MpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJcmV0dXJuICgxKTsKK30KKworCisvKiBMaWtlIGdldGN3ZCgpLCBleGNlcHQgYnNpemUgaXMgaWdub3JlZCBpZiBidWYgaXMgMCAoUEFUSF9NQVggaXMgdXNlZCkgKi8KK2NoYXIgKgora3NoX2dldF93ZChzaXplX3QgKmRsZW4pCit7CisJY2hhciAqcmV0LCAqYjsKKwlzaXplX3QgbGVuID0gMTsKKworI2lmZGVmIE5PX1BBVEhfTUFYCisJaWYgKChiID0gZ2V0X2N1cnJlbnRfZGlyX25hbWUoKSkpIHsKKwkJbGVuID0gc3RybGVuKGIpICsgMTsKKwkJc3RybmR1cHgocmV0LCBiLCBsZW4gLSAxLCBBVEVNUCk7CisJCWZyZWUoYik7CisJfSBlbHNlCisJCXJldCA9IE5VTEw7CisjZWxzZQorCWlmICgocmV0ID0gZ2V0Y3dkKChiID0gYWxsb2MoUEFUSF9NQVggKyAxLCBBVEVNUCkpLCBQQVRIX01BWCkpKQorCQlyZXQgPSBhcmVzaXplKGIsIGxlbiA9IChzdHJsZW4oYikgKyAxKSwgQVRFTVApOworCWVsc2UKKwkJYWZyZWUoYiwgQVRFTVApOworI2VuZGlmCisKKwlpZiAoZGxlbikKKwkJKmRsZW4gPSBsZW47CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICoJTWFrZXMgYSBmaWxlbmFtZSBpbnRvIHJlc3VsdCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobS4KKyAqCS0gbWFrZSByZXN1bHQgTlVMTAorICoJLSBpZiBmaWxlIHN0YXJ0cyB3aXRoICcvJywgYXBwZW5kIGZpbGUgdG8gcmVzdWx0ICYgc2V0IGNkcGF0aHAgdG8gTlVMTAorICoJLSBpZiBmaWxlIHN0YXJ0cyB3aXRoIC4vIG9yIC4uLyBhcHBlbmQgY3dkIGFuZCBmaWxlIHRvIHJlc3VsdAorICoJICBhbmQgc2V0IGNkcGF0aHAgdG8gTlVMTAorICoJLSBpZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBjZHBhdGhwIGRvZXNudCBzdGFydCB3aXRoIGEgJy8nIHh4IG9yICcuJyB4eAorICoJICB0aGVuIGN3ZCBpcyBhcHBlbmRlZCB0byByZXN1bHQuCisgKgktIHRoZSBmaXJzdCBlbGVtZW50IG9mIGNkcGF0aHAgaXMgYXBwZW5kZWQgdG8gcmVzdWx0CisgKgktIGZpbGUgaXMgYXBwZW5kZWQgdG8gcmVzdWx0CisgKgktIGNkcGF0aHAgaXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBlbGVtZW50IGluIGNkcGF0aHAgKG9yIE5VTEwKKyAqCSAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMuCisgKglUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGEgbm9uLW51bGwgZWxlbWVudCBmcm9tIGNkcGF0aHAKKyAqCXdhcyBhcHBlbmRlZCB0byByZXN1bHQuCisgKi8KK2ludAorbWFrZV9wYXRoKGNvbnN0IGNoYXIgKmN3ZCwgY29uc3QgY2hhciAqZmlsZSwKKyAgICBjaGFyICoqY2RwYXRocCwJCS8qICYgb2YgOiBzZXBhcmF0ZWQgbGlzdCAqLworICAgIFhTdHJpbmcgKnhzcCwKKyAgICBpbnQgKnBoeXNfcGF0aHApCit7CisJaW50IHJ2YWwgPSAwOworCWJvb2wgdXNlX2NkcGF0aCA9IHRydWU7CisJY2hhciAqcGxpc3Q7CisJaW50IGxlbiwgcGxlbiA9IDA7CisJY2hhciAqeHAgPSBYc3RyaW5nKCp4c3AsIHhwKTsKKworCWlmICghZmlsZSkKKwkJZmlsZSA9IG51bGw7CisKKwlpZiAoZmlsZVswXSA9PSAnLycpIHsKKwkJKnBoeXNfcGF0aHAgPSAwOworCQl1c2VfY2RwYXRoID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJaWYgKGZpbGVbMF0gPT0gJy4nKSB7CisJCQljaGFyIGMgPSBmaWxlWzFdOworCisJCQlpZiAoYyA9PSAnLicpCisJCQkJYyA9IGZpbGVbMl07CisJCQlpZiAoYyA9PSAnLycgfHwgYyA9PSAnXDAnKQorCQkJCXVzZV9jZHBhdGggPSBmYWxzZTsKKwkJfQorCisJCXBsaXN0ID0gKmNkcGF0aHA7CisJCWlmICghcGxpc3QpCisJCQl1c2VfY2RwYXRoID0gZmFsc2U7CisJCWVsc2UgaWYgKHVzZV9jZHBhdGgpIHsKKwkJCWNoYXIgKnBlbmQ7CisKKwkJCWZvciAocGVuZCA9IHBsaXN0OyAqcGVuZCAmJiAqcGVuZCAhPSAnOic7IHBlbmQrKykKKwkJCQk7CisJCQlwbGVuID0gcGVuZCAtIHBsaXN0OworCQkJKmNkcGF0aHAgPSAqcGVuZCA/IHBlbmQgKyAxIDogTlVMTDsKKwkJfQorCisJCWlmICgoIXVzZV9jZHBhdGggfHwgIXBsZW4gfHwgcGxpc3RbMF0gIT0gJy8nKSAmJgorCQkgICAgKGN3ZCAmJiAqY3dkKSkgeworCQkJbGVuID0gc3RybGVuKGN3ZCk7CisJCQlYY2hlY2tOKCp4c3AsIHhwLCBsZW4pOworCQkJbWVtY3B5KHhwLCBjd2QsIGxlbik7CisJCQl4cCArPSBsZW47CisJCQlpZiAoY3dkW2xlbiAtIDFdICE9ICcvJykKKwkJCQlYcHV0KCp4c3AsIHhwLCAnLycpOworCQl9CisJCSpwaHlzX3BhdGhwID0gWGxlbmd0aCgqeHNwLCB4cCk7CisJCWlmICh1c2VfY2RwYXRoICYmIHBsZW4pIHsKKwkJCVhjaGVja04oKnhzcCwgeHAsIHBsZW4pOworCQkJbWVtY3B5KHhwLCBwbGlzdCwgcGxlbik7CisJCQl4cCArPSBwbGVuOworCQkJaWYgKHBsaXN0W3BsZW4gLSAxXSAhPSAnLycpCisJCQkJWHB1dCgqeHNwLCB4cCwgJy8nKTsKKwkJCXJ2YWwgPSAxOworCQl9CisJfQorCisJbGVuID0gc3RybGVuKGZpbGUpICsgMTsKKwlYY2hlY2tOKCp4c3AsIHhwLCBsZW4pOworCW1lbWNweSh4cCwgZmlsZSwgbGVuKTsKKworCWlmICghdXNlX2NkcGF0aCkKKwkJKmNkcGF0aHAgPSBOVUxMOworCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIFNpbXBsaWZ5IHBhdGhuYW1lcyBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyaWVzLgorICogaWUsIHNpbXBsaWZ5X3BhdGgoIi9hL2IvYy8uLy4uL2QvLi4iKSByZXR1cm5zICIvYS9iIgorICovCit2b2lkCitzaW1wbGlmeV9wYXRoKGNoYXIgKnBhdGhsKQoreworCWNoYXIgKmN1ciwgKnQ7CisJYm9vbCBpc3Jvb3RlZDsKKwljaGFyICp2ZXJ5X3N0YXJ0ID0gcGF0aGwsICpzdGFydDsKKworCWlmICghKnBhdGhsKQorCQlyZXR1cm47CisKKwlpZiAoKGlzcm9vdGVkID0gcGF0aGxbMF0gPT0gJy8nKSkKKwkJdmVyeV9zdGFydCsrOworCisJLyogQmVmb3JlCQkJQWZ0ZXIKKwkgKiAvZm9vLwkJCS9mb28KKwkgKiAvZm9vLy4uLy4uL2JhcgkJL2JhcgorCSAqIC9mb28vLi9ibGFoLy4uCQkvZm9vCisJICogLgkJCQkuCisJICogLi4JCQkJLi4KKwkgKiAuL2ZvbwkJCWZvbworCSAqIGZvby8uLi8uLi8uLi9iYXIJCS4uLy4uL2JhcgorCSAqLworCisJZm9yIChjdXIgPSB0ID0gc3RhcnQgPSB2ZXJ5X3N0YXJ0OyA7ICkgeworCQkvKiB0cmVhdCBtdWx0aXBsZSAnLydzIGFzIG9uZSAnLycgKi8KKwkJd2hpbGUgKCp0ID09ICcvJykKKwkJCXQrKzsKKworCQlpZiAoKnQgPT0gJ1wwJykgeworCQkJaWYgKGN1ciA9PSBwYXRobCkKKwkJCQkvKiBjb252ZXJ0IGVtcHR5IHBhdGggdG8gZG90ICovCisJCQkJKmN1cisrID0gJy4nOworCQkJKmN1ciA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0WzBdID09ICcuJykgeworCQkJaWYgKCF0WzFdIHx8IHRbMV0gPT0gJy8nKSB7CisJCQkJdCArPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICh0WzFdID09ICcuJyAmJiAoIXRbMl0gfHwgdFsyXSA9PSAnLycpKSB7CisJCQkJaWYgKCFpc3Jvb3RlZCAmJiBjdXIgPT0gc3RhcnQpIHsKKwkJCQkJaWYgKGN1ciAhPSB2ZXJ5X3N0YXJ0KQorCQkJCQkJKmN1cisrID0gJy8nOworCQkJCQkqY3VyKysgPSAnLic7CisJCQkJCSpjdXIrKyA9ICcuJzsKKwkJCQkJc3RhcnQgPSBjdXI7CisJCQkJfSBlbHNlIGlmIChjdXIgIT0gc3RhcnQpCisJCQkJCXdoaWxlICgtLWN1ciA+IHN0YXJ0ICYmICpjdXIgIT0gJy8nKQorCQkJCQkJOworCQkJCXQgKz0gMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmIChjdXIgIT0gdmVyeV9zdGFydCkKKwkJCSpjdXIrKyA9ICcvJzsKKworCQkvKiBmaW5kL2NvcHkgbmV4dCBjb21wb25lbnQgb2YgcGF0aG5hbWUgKi8KKwkJd2hpbGUgKCp0ICYmICp0ICE9ICcvJykKKwkJCSpjdXIrKyA9ICp0Kys7CisJfQorfQorCisKK3ZvaWQKK3NldF9jdXJyZW50X3dkKGNoYXIgKnBhdGhsKQoreworCXNpemVfdCBsZW4gPSAxOworCWNoYXIgKnAgPSBwYXRobDsKKworCWlmIChwID09IE5VTEwpIHsKKwkJaWYgKChwID0ga3NoX2dldF93ZCgmbGVuKSkgPT0gTlVMTCkKKwkJCXAgPSBudWxsOworCX0gZWxzZQorCQlsZW4gPSBzdHJsZW4ocCkgKyAxOworCisJaWYgKGxlbiA+IGN1cnJlbnRfd2Rfc2l6ZSkgeworCQlhZnJlZShjdXJyZW50X3dkLCBBUEVSTSk7CisJCWN1cnJlbnRfd2QgPSBhbGxvYyhjdXJyZW50X3dkX3NpemUgPSBsZW4sIEFQRVJNKTsKKwl9CisJbWVtY3B5KGN1cnJlbnRfd2QsIHAsIGxlbik7CisJaWYgKHAgIT0gcGF0aGwgJiYgcCAhPSBudWxsKQorCQlhZnJlZShwLCBBVEVNUCk7Cit9CisKKyNpZmRlZiBUSU9DU0NUVFkKK2V4dGVybiB2b2lkIGNodnRfcmVpbml0KHZvaWQpOworCitzdGF0aWMgdm9pZAorY2h2dChjb25zdCBjaGFyICpmbikKK3sKKwljaGFyIGR2WzIwXTsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwlpbnQgZmQ7CisKKwkvKiBmb3IgZW50cm9weSAqLworCWtzaHN0YXRlX2YuaCA9IGV2aWxoYXNoKGZuKTsKKworCWlmICgqZm4gPT0gJy0nKSB7CisJCW1lbWNweShkdiwgIi0vZGV2L251bGwiLCBzaXplb2YoIi0vZGV2L251bGwiKSk7CisJCWZuID0gZHYgKyAxOworCX0gZWxzZSB7CisJCWlmIChzdGF0KGZuLCAmc2IpKSB7CisJCQltZW1jcHkoZHYsICIvZGV2L3R0eUMiLCA5KTsKKwkJCXN0cmxjcHkoZHYgKyA5LCBmbiwgc2l6ZW9mKGR2KSAtIDkpOworCQkJaWYgKHN0YXQoZHYsICZzYikpIHsKKwkJCQlzdHJsY3B5KGR2ICsgOCwgZm4sIHNpemVvZihkdikgLSA4KTsKKwkJCQlpZiAoc3RhdChkdiwgJnNiKSkKKwkJCQkJZXJyb3JmKCJjaHZ0OiBjYW4ndCBmaW5kIHR0eSAlcyIsIGZuKTsKKwkJCX0KKwkJCWZuID0gZHY7CisJCX0KKwkJaWYgKCEoc2Iuc3RfbW9kZSAmIFNfSUZDSFIpKQorCQkJZXJyb3JmKCJjaHZ0OiBub3QgYSBjaGFyIGRldmljZTogJXMiLCBmbik7CisJCWlmICgoc2Iuc3RfdWlkICE9IDApICYmIGNob3duKGZuLCAwLCAwKSkKKwkJCXdhcm5pbmdmKGZhbHNlLCAiY2h2dDogY2Fubm90IGNob3duIHJvb3QgJXMiLCBmbik7CisJCWlmICgoKHNiLnN0X21vZGUgJiAwNzc3NykgIT0gMDYwMCkgJiYgY2htb2QoZm4sIChtb2RlX3QpMDYwMCkpCisJCQl3YXJuaW5nZihmYWxzZSwgImNodnQ6IGNhbm5vdCBjaG1vZCAwNjAwICVzIiwgZm4pOworI2lmIEhBVkVfUkVWT0tFCisJCWlmIChyZXZva2UoZm4pKQorI2VuZGlmCisJCQl3YXJuaW5nZihmYWxzZSwgImNodnQ6IGNhbm5vdCByZXZva2UgJXMsIG5ldyBzaGVsbCBpcyIKKwkJCSAgICAiIHBvdGVudGlhbGx5IGluc2VjdXJlIiwgZm4pOworCX0KKwlpZiAoKGZkID0gb3BlbihmbiwgT19SRFdSKSkgPT0gLTEpIHsKKwkJc2xlZXAoMSk7CisJCWlmICgoZmQgPSBvcGVuKGZuLCBPX1JEV1IpKSA9PSAtMSkKKwkJCWVycm9yZigiY2h2dDogY2Fubm90IG9wZW4gJXMiLCBmbik7CisJfQorCXN3aXRjaCAoZm9yaygpKSB7CisJY2FzZSAtMToKKwkJZXJyb3JmKCJjaHZ0OiAlcyBmYWlsZWQiLCAiZm9yayIpOworCWNhc2UgMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXhpdCgwKTsKKwl9CisJaWYgKHNldHNpZCgpID09IC0xKQorCQllcnJvcmYoImNodnQ6ICVzIGZhaWxlZCIsICJzZXRzaWQiKTsKKwlpZiAoZm4gIT0gZHYgKyAxKSB7CisJCWlmIChpb2N0bChmZCwgVElPQ1NDVFRZLCBOVUxMKSA9PSAtMSkKKwkJCWVycm9yZigiY2h2dDogJXMgZmFpbGVkIiwgIlRJT0NTQ1RUWSIpOworCQlpZiAodGNmbHVzaChmZCwgVENJT0ZMVVNIKSkKKwkJCWVycm9yZigiY2h2dDogJXMgZmFpbGVkIiwgIlRDSU9GTFVTSCIpOworCX0KKwlrc2hfZHVwMihmZCwgMCwgZmFsc2UpOworCWtzaF9kdXAyKGZkLCAxLCBmYWxzZSk7CisJa3NoX2R1cDIoZmQsIDIsIGZhbHNlKTsKKwlpZiAoZmQgPiAyKQorCQljbG9zZShmZCk7CisJY2h2dF9yZWluaXQoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgREVCVUcKK2NoYXIgbG9uZ3NpemVzX2FyZV9va2F5W3NpemVvZihsb25nKSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykgPyAxIDogLTFdOworY2hhciBhcmlzaXplX2lzX29rYXlbc2l6ZW9mKG1rc2hfYXJpX3QpID09IDQgPyAxIDogLTFdOworY2hhciB1YXJpc2l6ZV9pc19va2F5W3NpemVvZihta3NoX3VhcmlfdCkgPT0gNCA/IDEgOiAtMV07CisKK2NoYXIgKgorc3RyY2hyKGNoYXIgKnAsIGludCBjaCkKK3sKKwlmb3IgKDs7ICsrcCkgeworCQlpZiAoKnAgPT0gY2gpCisJCQlyZXR1cm4gKHApOworCQlpZiAoISpwKQorCQkJcmV0dXJuIChOVUxMKTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitjaGFyICoKK3N0cnN0cihjaGFyICpiLCBjb25zdCBjaGFyICpsKQoreworCWNoYXIgZmlyc3QsIGM7CisJc2l6ZV90IG47CisKKwlpZiAoKGZpcnN0ID0gKmwrKykgPT0gJ1wwJykKKwkJcmV0dXJuIChiKTsKKwluID0gc3RybGVuKGwpOworIHN0cnN0cl9sb29rOgorCXdoaWxlICgoYyA9ICpiKyspICE9IGZpcnN0KQorCQlpZiAoYyA9PSAnXDAnKQorCQkJcmV0dXJuIChOVUxMKTsKKwlpZiAoc3RybmNtcChiLCBsLCBuKSkKKwkJZ290byBzdHJzdHJfbG9vazsKKwlyZXR1cm4gKGIgLSAxKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIE1LU0hfQVNTVU1FX1VURjgKKyNpZiAhSEFWRV9TVFJDQVNFU1RSCitjb25zdCBjaGFyICoKK3N0cmlzdHIoY29uc3QgY2hhciAqYiwgY29uc3QgY2hhciAqbCkKK3sKKwljaGFyIGZpcnN0LCBjOworCXNpemVfdCBuOworCisJaWYgKChmaXJzdCA9ICpsKyspLCAoKGZpcnN0ID0ga3NoX3RvbG93ZXIoZmlyc3QpKSA9PSAnXDAnKSkKKwkJcmV0dXJuIChiKTsKKwluID0gc3RybGVuKGwpOworIHN0cmlzdHJfbG9vazoKKwl3aGlsZSAoKGMgPSAqYisrKSwgKChjID0ga3NoX3RvbG93ZXIoYykpICE9IGZpcnN0KSkKKwkJaWYgKGMgPT0gJ1wwJykKKwkJCXJldHVybiAoTlVMTCk7CisJaWYgKHN0cm5jYXNlY21wKGIsIGwsIG4pKQorCQlnb3RvIHN0cmlzdHJfbG9vazsKKwlyZXR1cm4gKGIgLSAxKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNS1NIX1NNQUxMCitjaGFyICoKK3N0cm5kdXBfKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGxlbiwgQXJlYSAqYXApCit7CisJY2hhciAqZHN0ID0gTlVMTDsKKworCWlmIChzcmMgIT0gTlVMTCkgeworCQlkc3QgPSBhbGxvYyhsZW4gKyAxLCBhcCk7CisJCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwkJZHN0W2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gKGRzdCk7Cit9CisKK2NoYXIgKgorc3RyZHVwXyhjb25zdCBjaGFyICpzcmMsIEFyZWEgKmFwKQoreworCXJldHVybiAoc3JjID09IE5VTEwgPyBOVUxMIDogc3RybmR1cF8oc3JjLCBzdHJsZW4oc3JjKSwgYXApKTsKK30KKyNlbmRpZgorCisjaWYgIUhBVkVfR0VUUlVTQUdFCisjZGVmaW5lIElOVlRDSyhyLHQpCWRvIHsJCQkJCQlcCisJci50dl91c2VjID0gKCh0KSAlICgxMDAwMDAwIC8gQ0xLX1RDSykpICogKDEwMDAwMDAgLyBDTEtfVENLKTsJXAorCXIudHZfc2VjID0gKHQpIC8gQ0xLX1RDSzsJCQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorCitpbnQKK2dldHJ1c2FnZShpbnQgd2hhdCwgc3RydWN0IHJ1c2FnZSAqcnUpCit7CisJc3RydWN0IHRtcyB0bXM7CisJY2xvY2tfdCB1LCBzOworCisJaWYgKC8qIHJ1ID09IE5VTEwgfHwgKi8gdGltZXMoJnRtcykgPT0gKGNsb2NrX3QpLTEpCisJCXJldHVybiAoLTEpOworCisJc3dpdGNoICh3aGF0KSB7CisJY2FzZSBSVVNBR0VfU0VMRjoKKwkJdSA9IHRtcy50bXNfdXRpbWU7CisJCXMgPSB0bXMudG1zX3N0aW1lOworCQlicmVhazsKKwljYXNlIFJVU0FHRV9DSElMRFJFTjoKKwkJdSA9IHRtcy50bXNfY3V0aW1lOworCQlzID0gdG1zLnRtc19jc3RpbWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gKC0xKTsKKwl9CisJSU5WVENLKHJ1LT5ydV91dGltZSwgdSk7CisJSU5WVENLKHJ1LT5ydV9zdGltZSwgcyk7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKgorICogcHJvY2VzcyB0aGUgc3RyaW5nIGF2YWlsYWJsZSB2aWEgZmcgKGdldCBhIGNoYXIpCisgKiBhbmQgZnAgKHB1dCBiYWNrIGEgY2hhcikgZm9yIGJhY2tzbGFzaCBlc2NhcGVzLAorICogYXNzdW1pbmcgdGhlIGZpcnN0IGNhbGwgdG8gKmZnIGdldHMgdGhlIGNoYXIgZGktCisgKiByZWN0bHkgYWZ0ZXIgdGhlIGJhY2tzbGFzaDsgcmV0dXJuIHRoZSBjaGFyYWN0ZXIKKyAqICgwLi4weEZGKSwgVW5pY29kZSAod2MgKyAweDEwMCksIG9yIC0xIGlmIG5vIGtub3duCisgKiBlc2NhcGUgc2VxdWVuY2Ugd2FzIGZvdW5kCisgKi8KK2ludAordW5ia3NsKGJvb2wgY3N0eWxlLCBpbnQgKCpmZykodm9pZCksIHZvaWQgKCpmcCkoaW50KSkKK3sKKwlpbnQgd2MsIGksIGMsIGZjOworCisJZmMgPSAoKmZnKSgpOworCXN3aXRjaCAoZmMpIHsKKwljYXNlICdhJzoKKwkJLyoKKwkJICogYWNjb3JkaW5nIHRvIHRoZSBjb21tZW50cyBpbiBwZGtzaCwgXDAwNyBzZWVtcworCQkgKiB0byBiZSBtb3JlIHBvcnRhYmxlIHRoYW4gXGEgKGR1ZSB0byBIUC1VWCBjYywKKwkJICogVWx0cml4IGNjLCBvbGQgcGNjLCBldGMuKSBzbyB3ZSBhdm9pZCB0aGUgZXNjYXBlCisJCSAqIHNlcXVlbmNlIGFsdG9nZXRoZXIgaW4gbWtzaCBhbmQgYXNzdW1lIEFTQ0lJCisJCSAqLworCQl3YyA9IDc7CisJCWJyZWFrOworCWNhc2UgJ2InOgorCQl3YyA9ICdcYic7CisJCWJyZWFrOworCWNhc2UgJ2MnOgorCQlpZiAoIWNzdHlsZSkKKwkJCWdvdG8gdW5rbm93bl9lc2NhcGU7CisJCWMgPSAoKmZnKSgpOworCQl3YyA9IENUUkwoYyk7CisJCWJyZWFrOworCWNhc2UgJ0UnOgorCWNhc2UgJ2UnOgorCQl3YyA9IDAzMzsKKwkJYnJlYWs7CisJY2FzZSAnZic6CisJCXdjID0gJ1xmJzsKKwkJYnJlYWs7CisJY2FzZSAnbic6CisJCXdjID0gJ1xuJzsKKwkJYnJlYWs7CisJY2FzZSAncic6CisJCXdjID0gJ1xyJzsKKwkJYnJlYWs7CisJY2FzZSAndCc6CisJCXdjID0gJ1x0JzsKKwkJYnJlYWs7CisJY2FzZSAndic6CisJCS8qIGFzc3VtZSBBU0NJSSBoZXJlIGFzIHdlbGwgKi8KKwkJd2MgPSAxMTsKKwkJYnJlYWs7CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJY2FzZSAnMyc6CisJY2FzZSAnNCc6CisJY2FzZSAnNSc6CisJY2FzZSAnNic6CisJY2FzZSAnNyc6CisJCWlmICghY3N0eWxlKQorCQkJZ290byB1bmtub3duX2VzY2FwZTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlICcwJzoKKwkJaWYgKGNzdHlsZSkKKwkJCSgqZnApKGZjKTsKKwkJLyoKKwkJICogbG9vayBmb3IgYW4gb2N0YWwgbnVtYmVyIHdpdGggdXAgdG8gdGhyZWUKKwkJICogZGlnaXRzLCBub3QgY291bnRpbmcgdGhlIGxlYWRpbmcgemVybzsKKwkJICogY29udmVydCBpdCB0byBhIHJhdyBvY3RldAorCQkgKi8KKwkJd2MgPSAwOworCQlpID0gMzsKKwkJd2hpbGUgKGktLSkKKwkJCWlmICgoYyA9ICgqZmcpKCkpID49ICcwJyAmJiBjIDw9ICc3JykKKwkJCQl3YyA9ICh3YyA8PCAzKSArIChjIC0gJzAnKTsKKwkJCWVsc2UgeworCQkJCSgqZnApKGMpOworCQkJCWJyZWFrOworCQkJfQorCQlicmVhazsKKwljYXNlICdVJzoKKwkJaSA9IDg7CisJCWlmICgwKQorCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgJ3UnOgorCQlpID0gNDsKKwkJaWYgKDApCisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAneCc6CisJCWkgPSBjc3R5bGUgPyAtMSA6IDI7CisJCS8qCisJCSAqIHg6CWxvb2sgZm9yIGEgaGV4YWRlY2ltYWwgbnVtYmVyIHdpdGggdXAgdG8KKwkJICoJdHdvIChDIHN0eWxlOiBhcmJpdHJhcnkpIGRpZ2l0czsgY29udmVydAorCQkgKgl0byByYXcgb2N0ZXQgKEMgc3R5bGU6IFVuaWNvZGUgaWYgPjB4RkYpCisJCSAqIHUvVToJbG9vayBmb3IgYSBoZXhhZGVjaW1hbCBudW1iZXIgd2l0aCB1cCB0bworCQkgKglmb3VyIChVOiBlaWdodCkgZGlnaXRzOyBjb252ZXJ0IHRvIFVuaWNvZGUKKwkJICovCisJCXdjID0gMDsKKwkJd2hpbGUgKGktLSkgeworCQkJd2MgPDw9IDQ7CisJCQlpZiAoKGMgPSAoKmZnKSgpKSA+PSAnMCcgJiYgYyA8PSAnOScpCisJCQkJd2MgKz0gYyAtICcwJzsKKwkJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQkJCXdjICs9IGMgLSAnQScgKyAxMDsKKwkJCWVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQkJCXdjICs9IGMgLSAnYScgKyAxMDsKKwkJCWVsc2UgeworCQkJCXdjID4+PSA0OworCQkJCSgqZnApKGMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICgoY3N0eWxlICYmIHdjID4gMHhGRikgfHwgZmMgIT0gJ3gnKQorCQkJLyogVW5pY29kZSBtYXJrZXIgKi8KKwkJCXdjICs9IDB4MTAwOworCQlicmVhazsKKwljYXNlICdcJyc6CisJCWlmICghY3N0eWxlKQorCQkJZ290byB1bmtub3duX2VzY2FwZTsKKwkJd2MgPSAnXCcnOworCQlicmVhazsKKwljYXNlICdcXCc6CisJCXdjID0gJ1xcJzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKyB1bmtub3duX2VzY2FwZToKKwkJKCpmcCkoZmMpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlyZXR1cm4gKHdjKTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3NoLmggYi9ta3NoL3NyYy9zaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTg4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9zaC5oCkBAIC0wLDAgKzEsMTc1MiBAQAorLyoJJE9wZW5CU0Q6IHNoLmgsdiAxLjMwIDIwMTAvMDEvMDQgMTg6MDc6MTEgZGVyYWFkdCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHNoZi5oLHYgMS42IDIwMDUvMTIvMTEgMTg6NTM6NTEgZGVyYWFkdCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHRhYmxlLmgsdiAxLjcgMjAwNS8xMi8xMSAyMDozMToyMSBvdHRvIEV4cCAkCSovCisvKgkkT3BlbkJTRDogdHJlZS5oLHYgMS4xMCAyMDA1LzAzLzI4IDIxOjI4OjIyIGRlcmFhZHQgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBleHBhbmQuaCx2IDEuNiAyMDA1LzAzLzMwIDE3OjE2OjM3IGRlcmFhZHQgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBsZXguaCx2IDEuMTEgMjAwNi8wNS8yOSAxODoyMjoyNCBvdHRvIEV4cCAkCSovCisvKgkkT3BlbkJTRDogcHJvdG8uaCx2IDEuMzMgMjAxMC8wNS8xOSAxNzozNjowOCBqYXNwZXIgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBjX3Rlc3QuaCx2IDEuNCAyMDA0LzEyLzIwIDExOjM0OjI2IG90dG8gRXhwICQJKi8KKy8qCSRPcGVuQlNEOiB0dHkuaCx2IDEuNSAyMDA0LzEyLzIwIDExOjM0OjI2IG90dG8gRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpZmRlZiBfX2RpZXRsaWJjX18KKy8qIFhYWCBpbWFrZSBzdHlsZSAqLworI2RlZmluZSBfQlNEX1NPVVJDRQkvKiBsaXZlLCBCU0QsIGxpdmUhICovCisjZW5kaWYKKworI2lmIEhBVkVfU1lTX1BBUkFNX0gKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaWYgSEFWRV9TWVNfU1lTTUFDUk9TX0gKKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19NTUFOX0gKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZiBIQVZFX0xJQkdFTl9ICisjaW5jbHVkZSA8bGliZ2VuLmg+CisjZW5kaWYKKyNpZiBIQVZFX0xJQlVUSUxfSAorI2luY2x1ZGUgPGxpYnV0aWwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmIEhBVkVfUEFUSFNfSAorI2luY2x1ZGUgPHBhdGhzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZiBIQVZFX1NUREJPT0xfSAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfVUxJTUlUX0gKKyNpbmNsdWRlIDx1bGltaXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmIEhBVkVfVkFMVUVTX0gKKyNpbmNsdWRlIDx2YWx1ZXMuaD4KKyNlbmRpZgorCisjdW5kZWYgX19hdHRyaWJ1dGVfXworI2lmIEhBVkVfQVRUUklCVVRFX0JPVU5ERUQKKyNkZWZpbmUgTUtTSF9BX0JPVU5ERUQoeCx5LHopCV9fYXR0cmlidXRlX18oKGJvdW5kZWQgKHgsIHksIHopKSkKKyNlbHNlCisjZGVmaW5lIE1LU0hfQV9CT1VOREVEKHgseSx6KQkvKiBub3RoaW5nICovCisjZW5kaWYKKyNpZiBIQVZFX0FUVFJJQlVURV9GT1JNQVQKKyNkZWZpbmUgTUtTSF9BX0ZPUk1BVCh4LHkseikJX19hdHRyaWJ1dGVfXygoZm9ybWF0ICh4LCB5LCB6KSkpCisjZWxzZQorI2RlZmluZSBNS1NIX0FfRk9STUFUKHgseSx6KQkvKiBub3RoaW5nICovCisjZW5kaWYKKyNpZiBIQVZFX0FUVFJJQlVURV9OT05OVUxMCisjZGVmaW5lIE1LU0hfQV9OT05OVUxMKGEpCV9fYXR0cmlidXRlX18oYSkKKyNlbHNlCisjZGVmaW5lIE1LU0hfQV9OT05OVUxMKGEpCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorI2lmIEhBVkVfQVRUUklCVVRFX05PUkVUVVJOCisjZGVmaW5lIE1LU0hfQV9OT1JFVFVSTgkJX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorI2Vsc2UKKyNkZWZpbmUgTUtTSF9BX05PUkVUVVJOCQkvKiBub3RoaW5nICovCisjZW5kaWYKKyNpZiBIQVZFX0FUVFJJQlVURV9VTlVTRUQKKyNkZWZpbmUgTUtTSF9BX1VOVVNFRAkJX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIE1LU0hfQV9VTlVTRUQJCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorI2lmIEhBVkVfQVRUUklCVVRFX1VTRUQKKyNkZWZpbmUgTUtTSF9BX1VTRUQJCV9fYXR0cmlidXRlX18oKHVzZWQpKQorI2Vsc2UKKyNkZWZpbmUgTUtTSF9BX1VTRUQJCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChNaXJCU0QpICYmIChNaXJCU0QgPj0gMHgwOUExKSAmJiBcCisgICAgZGVmaW5lZChfX0VMRl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCisgICAgIWRlZmluZWQoX19sbHZtX18pICYmICFkZWZpbmVkKF9fTldDQ19fKQorLyoKKyAqIFdlIGdvdCB1c2FibGUgX19JRFNUUklORyBfX0NPUFlSSUdIVCBfX1JDU0lEIF9fU0NDU0lEIG1hY3JvcworICogd2hpY2ggd29yayBmb3IgYWxsIGNhc2VzOyBubyBuZWVkIHRvIHJlZGVmaW5lIHRoZW0gdXNpbmcgdGhlCisgKiAicG9ydGFibGUiIG1hY3JvcyBmcm9tIGJlbG93IHdoZW4gd2UgbWlnaHQgaGF2ZSB0aGUgImJldHRlciIKKyAqIGdjYytFTEYgc3BlY2lmaWMgbWFjcm9zIG9yIG90aGVyIHN5c3RlbSBkZXBlbmRlbnQgb25lcy4KKyAqLworI2Vsc2UKKyN1bmRlZiBfX0lEU1RSSU5HCisjdW5kZWYgX19JRFNUUklOR19DT05DQVQKKyN1bmRlZiBfX0lEU1RSSU5HX0VYUEFORAorI3VuZGVmIF9fQ09QWVJJR0hUCisjdW5kZWYgX19SQ1NJRAorI3VuZGVmIF9fU0NDU0lECisjZGVmaW5lIF9fSURTVFJJTkdfQ09OQ0FUKGwscCkJCV9fTElOVEVEX18gIyMgbCAjIyBfICMjIHAKKyNkZWZpbmUgX19JRFNUUklOR19FWFBBTkQobCxwKQkJX19JRFNUUklOR19DT05DQVQobCxwKQorI2RlZmluZSBfX0lEU1RSSU5HKHByZWZpeCwgc3RyaW5nKQkJCQlcCisJc3RhdGljIGNvbnN0IGNoYXIgX19JRFNUUklOR19FWFBBTkQoX19MSU5FX18scHJlZml4KSBbXQlcCisJICAgIE1LU0hfQV9VU0VEID0gIkAoIiIjKSIgI3ByZWZpeCAiOiAiIHN0cmluZworI2RlZmluZSBfX0NPUFlSSUdIVCh4KQkJX19JRFNUUklORyhjb3B5cmlnaHQseCkKKyNkZWZpbmUgX19SQ1NJRCh4KQkJX19JRFNUUklORyhyY3NpZCx4KQorI2RlZmluZSBfX1NDQ1NJRCh4KQkJX19JRFNUUklORyhzY2NzaWQseCkKKyNlbmRpZgorCisjaWZkZWYgRVhURVJOCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9zaC5oLHYgMS40MDUgMjAxMC8wOC8yNCAxNToxOTo1NCB0ZyBFeHAgJCIpOworI2VuZGlmCisjZGVmaW5lIE1LU0hfVkVSU0lPTiAiUjM5IDIwMTAvMDgvMjQiCisKKyNpZm5kZWYgTUtTSF9JTkNMVURFU19PTkxZCisKKy8qIGV4dHJhIHR5cGVzICovCisKKyNpZiAhSEFWRV9HRVRSVVNBR0UKKyN1bmRlZiBydXNhZ2UKKyN1bmRlZiBSVVNBR0VfU0VMRgorI3VuZGVmIFJVU0FHRV9DSElMRFJFTgorI2RlZmluZSBydXNhZ2UgbWtzaF9ydXNhZ2UKKyNkZWZpbmUgUlVTQUdFX1NFTEYJMAorI2RlZmluZSBSVVNBR0VfQ0hJTERSRU4JLTEKKworc3RydWN0IHJ1c2FnZSB7CisJc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7CisJc3RydWN0IHRpbWV2YWwgcnVfc3RpbWU7Cit9OworI2VuZGlmCisKKyNpZiAhSEFWRV9STElNX1QKK3R5cGVkZWYgbG9uZyBybGltX3Q7CisjZW5kaWYKKworI2lmICFIQVZFX1NJR19UCisjdW5kZWYgc2lnX3QKK3R5cGVkZWYgdm9pZCAoKnNpZ190KShpbnQpOworI2VuZGlmCisKKyNpZiAhSEFWRV9TVERCT09MX0gKKy8qIGtsdWRnZSwgYnV0IGVub3VnaCBmb3IgbWtzaCAqLwordHlwZWRlZiBpbnQgYm9vbDsKKyNkZWZpbmUgZmFsc2UgMAorI2RlZmluZSB0cnVlIDEKKyNlbmRpZgorCisjaWYgIUhBVkVfQ0FOX0lOVFRZUEVTCisjaWYgIUhBVkVfQ0FOX1VDQklOVFMKK3R5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7CisjZWxzZQordHlwZWRlZiB1X2ludDMyX3QgdWludDMyX3Q7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgIUhBVkVfQ0FOX0lOVDhUWVBFCisjaWYgIUhBVkVfQ0FOX1VDQklOVDgKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworI2Vsc2UKK3R5cGVkZWYgdV9pbnQ4X3QgdWludDhfdDsKKyNlbmRpZgorI2VuZGlmCisKKy8qIGV4dHJhIG1hY3JvcyAqLworCisjaWZuZGVmIHRpbWVyY2xlYXIKKyNkZWZpbmUgdGltZXJjbGVhcih0dnApCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCSh0dnApLT50dl9zZWMgPSAodHZwKS0+dHZfdXNlYyA9IDA7CQkJXAorCX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2VuZGlmCisjaWZuZGVmIHRpbWVyYWRkCisjZGVmaW5lIHRpbWVyYWRkKHR2cCwgdXZwLCB2dnApCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJKHZ2cCktPnR2X3NlYyA9ICh0dnApLT50dl9zZWMgKyAodXZwKS0+dHZfc2VjOwkJXAorCQkodnZwKS0+dHZfdXNlYyA9ICh0dnApLT50dl91c2VjICsgKHV2cCktPnR2X3VzZWM7CVwKKwkJaWYgKCh2dnApLT50dl91c2VjID49IDEwMDAwMDApIHsJCQlcCisJCQkodnZwKS0+dHZfc2VjKys7CQkJCVwKKwkJCSh2dnApLT50dl91c2VjIC09IDEwMDAwMDA7CQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNlbmRpZgorI2lmbmRlZiB0aW1lcnN1YgorI2RlZmluZSB0aW1lcnN1Yih0dnAsIHV2cCwgdnZwKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCSh2dnApLT50dl9zZWMgPSAodHZwKS0+dHZfc2VjIC0gKHV2cCktPnR2X3NlYzsJCVwKKwkJKHZ2cCktPnR2X3VzZWMgPSAodHZwKS0+dHZfdXNlYyAtICh1dnApLT50dl91c2VjOwlcCisJCWlmICgodnZwKS0+dHZfdXNlYyA8IDApIHsJCQkJXAorCQkJKHZ2cCktPnR2X3NlYy0tOwkJCQlcCisJCQkodnZwKS0+dHZfdXNlYyArPSAxMDAwMDAwOwkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZW5kaWYKKworI2RlZmluZSBrc2hfaXNkaWdpdChjKQkoKChjKSA+PSAnMCcpICYmICgoYykgPD0gJzknKSkKKyNkZWZpbmUga3NoX2lzbG93ZXIoYykJKCgoYykgPj0gJ2EnKSAmJiAoKGMpIDw9ICd6JykpCisjZGVmaW5lIGtzaF9pc3VwcGVyKGMpCSgoKGMpID49ICdBJykgJiYgKChjKSA8PSAnWicpKQorI2RlZmluZSBrc2hfdG9sb3dlcihjKQkoKChjKSA+PSAnQScpICYmICgoYykgPD0gJ1onKSA/IChjKSAtICdBJyArICdhJyA6IChjKSkKKyNkZWZpbmUga3NoX3RvdXBwZXIoYykJKCgoYykgPj0gJ2EnKSAmJiAoKGMpIDw9ICd6JykgPyAoYykgLSAnYScgKyAnQScgOiAoYykpCisjZGVmaW5lIGtzaF9pc2Rhc2gocykJKCgocykgIT0gTlVMTCkgJiYgKChzKVswXSA9PSAnLScpICYmICgocylbMV0gPT0gJ1wwJykpCisjZGVmaW5lIGtzaF9pc3NwYWNlKGMpCSgoKChjKSA+PSAweDA5KSAmJiAoKGMpIDw9IDB4MEQpKSB8fCAoKGMpID09IDB4MjApKQorCisjaWZkZWYgTk9fUEFUSF9NQVgKKyN1bmRlZiBQQVRIX01BWAorI2Vsc2UKKyNpZm5kZWYgUEFUSF9NQVgKKyNkZWZpbmUgUEFUSF9NQVgJMTAyNAorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgU0laRV9NQVgKKyNpZmRlZiBTSVpFX1RfTUFYCisjZGVmaW5lIFNJWkVfTUFYCVNJWkVfVF9NQVgKKyNlbHNlCisjZGVmaW5lIFNJWkVfTUFYCSgoc2l6ZV90KS0xKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgU19JU0xOSworI2RlZmluZSBTX0lTTE5LKG0pCSgobSAmIDAxNzAwMDApID09IDAxMjAwMDApCisjZW5kaWYKKyNpZm5kZWYgU19JU1NPQ0sKKyNkZWZpbmUgU19JU1NPQ0sobSkJKChtICYgMDE3MDAwMCkgPT0gMDE0MDAwMCkKKyNlbmRpZgorI2lmbmRlZiBERUZGSUxFTU9ERQorI2RlZmluZSBERUZGSUxFTU9ERQkoU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JV0dSUHxTX0lST1RIfFNfSVdPVEgpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE1BUF9GQUlMRUQpCisvKiBYWFggaW1ha2Ugc3R5bGUgKi8KKyMgIGlmIGRlZmluZWQoX19saW51eCkKKyNkZWZpbmUgTUFQX0ZBSUxFRAkoKHZvaWQgKiktMSkKKyMgIGVsaWYgZGVmaW5lZChfX2JzZGlfXykgfHwgZGVmaW5lZChfX29zZl9fKSB8fCBkZWZpbmVkKF9fdWx0cml4KQorI2RlZmluZSBNQVBfRkFJTEVECSgoY2FkZHJfdCktMSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBOU0lHCisjaWYgZGVmaW5lZChfTlNJRykKKyNkZWZpbmUgTlNJRwkJX05TSUcKKyNlbGlmIGRlZmluZWQoU0lHTUFYKQorI2RlZmluZSBOU0lHCQkoU0lHTUFYKzEpCisjZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgQkFECQkvKiBBSVggZGVmaW5lcyB0aGF0IHNvbWV3aGVyZSAqLworCisvKiBPUy1kZXBlbmRlbnQgYWRkaXRpb25zIChmdW5jdGlvbnMsIHZhcmlhYmxlcywgYnkgT1MpICovCisKKyNpZiAhSEFWRV9GTE9DS19ERUNMCitleHRlcm4gaW50IGZsb2NrKGludCwgaW50KTsKKyNlbmRpZgorCisjaWYgIUhBVkVfR0VUUlVTQUdFCitleHRlcm4gaW50IGdldHJ1c2FnZShpbnQsIHN0cnVjdCBydXNhZ2UgKik7CisjZW5kaWYKKworI2lmICFIQVZFX1JFVk9LRV9ERUNMCitleHRlcm4gaW50IHJldm9rZShjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZiAhSEFWRV9TRVRNT0RFCittb2RlX3QgZ2V0bW9kZShjb25zdCB2b2lkICosIG1vZGVfdCk7Cit2b2lkICpzZXRtb2RlKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmZGVmIF9fdWx0cml4CisvKiBYWFggaW1ha2Ugc3R5bGUgKi8KK2ludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWYgIUhBVkVfU1RSQ0FTRVNUUgorY29uc3QgY2hhciAqc3RyaXN0cihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmICFIQVZFX1NUUkxDUFkKK3NpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisKKyNpZiAhSEFWRV9TWVNfU0lHTElTVF9ERUNMCitleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX3NpZ2xpc3RbXTsKKyNlbmRpZgorCisjaWZkZWYgX19JTlRFUklYCisvKiBYWFggaW1ha2Ugc3R5bGUgKi8KKyNkZWZpbmUgbWFrZWRldiBta2RldgorZXh0ZXJuIGludCBfX2NkZWNsIHNldGV1aWQodWlkX3QpOworZXh0ZXJuIGludCBfX2NkZWNsIHNldGVnaWQoZ2lkX3QpOworI2VuZGlmCisKKy8qIHJlbW92ZSByZWR1bmRhbmNlcyAqLworCisjaWYgZGVmaW5lZChNaXJCU0QpICYmIChNaXJCU0QgPj0gMHgwOEE4KQorI2RlZmluZSBNS1NIX21pcmJzZF93Y3dpZHRoCisjZGVmaW5lIHV0Zl93Y3dpZHRoKGkpIHdjd2lkdGgoKF9fV0NIQVJfVFlQRV9fKWkpCitleHRlcm4gaW50IHdjd2lkdGgoX19XQ0hBUl9UWVBFX18pOworI2VuZGlmCisKKworLyogc29tZSB1c2VmdWwgI2RlZmluZXMgKi8KKyNpZmRlZiBFWFRFUk4KKyMgZGVmaW5lIElfXyhpKSA9IGkKKyNlbHNlCisjIGRlZmluZSBJX18oaSkKKyMgZGVmaW5lIEVYVEVSTiBleHRlcm4KKyMgZGVmaW5lIEVYVEVSTl9ERUZJTkVECisjZW5kaWYKKworI2RlZmluZSBORUxFTShhKQkoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjZGVmaW5lIEJJVChpKQkJKDEgPDwgKGkpKQkvKiBkZWZpbmUgYml0IGluIGZsYWcgKi8KKworLyogVGFibGUgZmxhZyB0eXBlIC0gbmVlZHMgPiAxNiBhbmQgPCAzMiBiaXRzICovCit0eXBlZGVmIGludDMyX3QgVGZsYWc7CisKKy8qIGFyaXRobWV0aWNzIHR5cGVzICovCit0eXBlZGVmIGludDMyX3QgbWtzaF9hcmlfdDsKK3R5cGVkZWYgdWludDMyX3QgbWtzaF91YXJpX3Q7CisKKy8qIHRoZXNlIHNoYWxsIGJlIHNtYWxsZXIgdGhhbiAxMDAgKi8KKyNpZmRlZiBNS1NIX0NPTlNFUlZBVElWRV9GRFMKKyNkZWZpbmUgTlVGSUxFCQkzMgkvKiBOdW1iZXIgb2YgdXNlci1hY2Nlc3NpYmxlIGZpbGVzICovCisjZGVmaW5lIEZEQkFTRQkJMTAJLyogRmlyc3QgZmlsZSB1c2FibGUgYnkgU2hlbGwgKi8KKyNlbHNlCisjZGVmaW5lIE5VRklMRQkJNTYJLyogTnVtYmVyIG9mIHVzZXItYWNjZXNzaWJsZSBmaWxlcyAqLworI2RlZmluZSBGREJBU0UJCTI0CS8qIEZpcnN0IGZpbGUgdXNhYmxlIGJ5IFNoZWxsICovCisjZW5kaWYKKworLyogTWFrZSBNQUdJQyBhIGNoYXIgdGhhdCBtaWdodCBiZSBwcmludGVkIHRvIG1ha2UgYnVncyBtb3JlIG9idmlvdXMsIGJ1dAorICogbm90IGEgY2hhciB0aGF0IGlzIHVzZWQgb2Z0ZW4uIEFsc28sIGNhbid0IHVzZSB0aGUgaGlnaCBiaXQgYXMgaXQgY2F1c2VzCisgKiBwb3J0YWJpbGl0eSBwcm9ibGVtcyAoY2FsbGluZyBzdHJjaHIoeCwgMHg4MHwneCcpIGlzIGVycm9yIHByb25lKS4KKyAqLworI2RlZmluZSBNQUdJQwkJKDcpCS8qIHByZWZpeCBmb3IgKj9bIXssfSBkdXJpbmcgZXhwYW5kICovCisjZGVmaW5lIElTTUFHSUMoYykJKCh1bnNpZ25lZCBjaGFyKShjKSA9PSBNQUdJQykKKyNkZWZpbmUgTk9UCQknIScJLyogbWlnaHQgdXNlIF4gKGllLCBbIS4uLl0gdnMgW14uLl0pICovCisKKyNkZWZpbmUgTElORQkJNDA5NgkvKiBpbnB1dCBsaW5lIHNpemUgKi8KKworRVhURVJOIGNvbnN0IGNoYXIgKnNhZmVfcHJvbXB0OyAvKiBzYWZlIHByb21wdCBpZiBQUzEgc3Vic3RpdHV0aW9uIGZhaWxzICovCitFWFRFUk4gY29uc3QgY2hhciBpbml0dnNuW10gSV9fKCJLU0hfVkVSU0lPTj1AKCMpTUlSQlNEIEtTSCAiIE1LU0hfVkVSU0lPTik7CisjZGVmaW5lIEtTSF9WRVJTSU9OCShpbml0dnNuICsgLyogIktTSF9WRVJTSU9OPUAoIykiICovIDE2KQorCitFWFRFUk4gY29uc3QgY2hhciBkaWdpdHNfdWNbXSBJX18oIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpOworRVhURVJOIGNvbnN0IGNoYXIgZGlnaXRzX2xjW10gSV9fKCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKTsKKworLyoKKyAqIEV2aWwgaGFjayBmb3IgY29uc3QgY29ycmVjdG5lc3MgZHVlIHRvIEFQSSBicm9rZW5uZXNzCisgKi8KK3VuaW9uIG1rc2hfY2NoYWNrIHsKKwljaGFyICpydzsKKwljb25zdCBjaGFyICpybzsKK307Cit1bmlvbiBta3NoX2NjcGhhY2sgeworCWNoYXIgKipydzsKKwljb25zdCBjaGFyICoqcm87Cit9OworCisvKiBmb3IgY29uc3QgZGVidWdnaW5nICovCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JQ0MpICYmIFwKKyAgICAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX1NVTlBST19DKQorY2hhciAqdWNzdHJjaHIoY2hhciAqLCBpbnQpOworY2hhciAqdWNzdHJzdHIoY2hhciAqLCBjb25zdCBjaGFyICopOworI3VuZGVmIHN0cmNocgorI2RlZmluZSBzdHJjaHIgdWNzdHJjaHIKKyNkZWZpbmUgc3Ryc3RyIHVjc3Ryc3RyCisjZGVmaW5lIGNzdHJjaHIocyxjKSAoewkJCVwKKwl1bmlvbiBta3NoX2NjaGFjayBpbiwgb3V0OwlcCisJCQkJCVwKKwlpbi5ybyA9IChzKTsJCQlcCisJb3V0LnJ3ID0gdWNzdHJjaHIoaW4ucncsIChjKSk7CVwKKwkob3V0LnJvKTsJCQlcCit9KQorI2RlZmluZSBjc3Ryc3RyKGIsbCkgKHsJCQlcCisJdW5pb24gbWtzaF9jY2hhY2sgaW4sIG91dDsJXAorCQkJCQlcCisJaW4ucm8gPSAoYik7CQkJXAorCW91dC5ydyA9IHVjc3Ryc3RyKGluLnJ3LCAobCkpOwlcCisJKG91dC5ybyk7CQkJXAorfSkKKyNkZWZpbmUgdnN0cmNocihzLGMpCShjc3RyY2hyKChzKSwgKGMpKSAhPSBOVUxMKQorI2RlZmluZSB2c3Ryc3RyKGIsbCkJKGNzdHJzdHIoKGIpLCAobCkpICE9IE5VTEwpCisjZGVmaW5lIG1rc3NlcnQoZSkJKChlKSA/ICh2b2lkKTAgOiBleGl0KDI1NSkpCisjZWxzZSAvKiAhREVCVUcsICFnY2MgKi8KKyNkZWZpbmUgY3N0cmNocihzLGMpCSgoY29uc3QgY2hhciAqKXN0cmNocigocyksIChjKSkpCisjZGVmaW5lIGNzdHJzdHIocyxjKQkoKGNvbnN0IGNoYXIgKilzdHJzdHIoKHMpLCAoYykpKQorI2RlZmluZSB2c3RyY2hyKHMsYykJKHN0cmNocigocyksIChjKSkgIT0gTlVMTCkKKyNkZWZpbmUgdnN0cnN0cihiLGwpCShzdHJzdHIoKGIpLCAobCkpICE9IE5VTEwpCisjZGVmaW5lIG1rc3NlcnQoZSkJKCh2b2lkKTApCisjZW5kaWYKKworLyogdXNlIHRoaXMgaXB2IHN0cmNocihzLCAwKSBidXQgbm8gc2lkZSBlZmZlY3RzIGluIHMhICovCisjZGVmaW5lIHN0cm51bChzKQkoKHMpICsgc3RybGVuKHMpKQorCisjZGVmaW5lIHV0Zl9wdHJhZGp4KHNyYywgZHN0KSBkbyB7CQkJCQlcCisJKGRzdCkgPSAoc3JjKSArIHV0Zl9wdHJhZGooc3JjKTsJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisKKyNpZmRlZiBNS1NIX1NNQUxMCisjZGVmaW5lIHN0cmR1cHgoZCwgcywgYXApIGRvIHsgXAorCShkKSA9IHN0cmR1cF8oKHMpLCAoYXApKTsgXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZGVmaW5lIHN0cm5kdXB4KGQsIHMsIG4sIGFwKSBkbyB7IFwKKwkoZCkgPSBzdHJuZHVwXygocyksIChuKSwgKGFwKSk7IFwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2Vsc2UKKy8qIGJlIGNhcmVmdWwgdG8gZXZhbHVhdGUgYXJndW1lbnRzIG9ubHkgb25jZSEgKi8KKyNkZWZpbmUgc3RyZHVweChkLCBzLCBhcCkgZG8gewkJCQkJCVwKKwljb25zdCBjaGFyICpzdHJkdXBfc3JjID0gKHMpOwkJCQkJXAorCWNoYXIgKnN0cmR1cF9kc3QgPSBOVUxMOwkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChzdHJkdXBfc3JjICE9IE5VTEwpIHsJCQkJCVwKKwkJc2l6ZV90IHN0cmR1cF9sZW4gPSBzdHJsZW4oc3RyZHVwX3NyYykgKyAxOwkJXAorCQlzdHJkdXBfZHN0ID0gYWxsb2Moc3RyZHVwX2xlbiwgKGFwKSk7CQkJXAorCQltZW1jcHkoc3RyZHVwX2RzdCwgc3RyZHVwX3NyYywgc3RyZHVwX2xlbik7CQlcCisJfQkJCQkJCQkJXAorCShkKSA9IHN0cmR1cF9kc3Q7CQkJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZGVmaW5lIHN0cm5kdXB4KGQsIHMsIG4sIGFwKSBkbyB7CQkJCQlcCisJY29uc3QgY2hhciAqc3RyZHVwX3NyYyA9IChzKTsJCQkJCVwKKwljaGFyICpzdHJkdXBfZHN0ID0gTlVMTDsJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoc3RyZHVwX3NyYyAhPSBOVUxMKSB7CQkJCQlcCisJCXNpemVfdCBzdHJuZHVwX2xlbiA9IChuKTsJCQkJXAorCQlzdHJkdXBfZHN0ID0gYWxsb2Moc3RybmR1cF9sZW4gKyAxLCAoYXApKTsJCVwKKwkJbWVtY3B5KHN0cmR1cF9kc3QsIHN0cmR1cF9zcmMsIHN0cm5kdXBfbGVuKTsJCVwKKwkJc3RyZHVwX2RzdFtzdHJuZHVwX2xlbl0gPSAnXDAnOwkJCQlcCisJfQkJCQkJCQkJXAorCShkKSA9IHN0cmR1cF9kc3Q7CQkJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZW5kaWYKKworI2lmIEhBVkVfU1RSQ0FTRVNUUgorI2RlZmluZSBzdHJpc3RyKGIsbCkJKChjb25zdCBjaGFyICopc3RyY2FzZXN0cigoYiksIChsKSkpCisjZW5kaWYKKworI2lmZGVmIE1LU0hfU01BTEwKKyNpZm5kZWYgTUtTSF9DT05TRVJWQVRJVkVfRkRTCisjZGVmaW5lIE1LU0hfQ09OU0VSVkFUSVZFX0ZEUwkvKiBkZWZpbmVkICovCisjZW5kaWYKKyNpZm5kZWYgTUtTSF9OT1BXTkFNCisjZGVmaW5lIE1LU0hfTk9QV05BTQkJLyogZGVmaW5lZCAqLworI2VuZGlmCisjaWZuZGVmIE1LU0hfU19OT1ZJCisjZGVmaW5lIE1LU0hfU19OT1ZJCQkxCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1LU0hfU19OT1ZJCisjZGVmaW5lIE1LU0hfU19OT1ZJCQkwCisjZW5kaWYKKworLyoKKyAqIHNpbXBsZSBncm91cGluZyBhbGxvY2F0b3IKKyAqLworCisvKiAxLiBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBsYWxsb2MgeworCXN0cnVjdCBsYWxsb2MgKm5leHQ7Cit9OworCisvKiAyLiBzaXplcyAqLworI2RlZmluZSBBTExPQ19JVEVNCXN0cnVjdCBsYWxsb2MKKyNkZWZpbmUgQUxMT0NfU0laRQkoc2l6ZW9mKEFMTE9DX0lURU0pKQorCisvKiAzLiBncm91cCBzdHJ1Y3R1cmUgKG9ubHkgdGhlIHNhbWUgZm9yIGxhbGxvYy5jKSAqLwordHlwZWRlZiBzdHJ1Y3QgbGFsbG9jIEFyZWE7CisKKworRVhURVJOIEFyZWEgYXBlcm07CQkvKiBwZXJtYW5lbnQgb2JqZWN0IHNwYWNlICovCisjZGVmaW5lIEFQRVJNCSZhcGVybQorI2RlZmluZSBBVEVNUAkmZS0+YXJlYQorCisvKgorICogZmxhZ3MgKHRoZSBvcmRlciBvZiB0aGVzZSBlbnVtcyBNVVNUIG1hdGNoIHRoZSBvcmRlciBpbiBtaXNjLmMob3B0aW9uc1tdKSkKKyAqLworZW51bSBzaF9mbGFnIHsKKyNkZWZpbmUgU0hGTEFHU19FTlVNUworI2luY2x1ZGUgInNoX2ZsYWdzLmgiCisJRk5GTEFHUwkJLyogKHBsYWNlIGhvbGRlcjogaG93IG1hbnkgZmxhZ3MgYXJlIHRoZXJlKSAqLworfTsKKworI2RlZmluZSBGbGFnKGYpCShrc2hzdGF0ZV92LnNoZWxsX2ZsYWdzX1soaW50KShmKV0pCisjZGVmaW5lIFVURk1PREUJRmxhZyhGVU5JQ09ERSkKKworLyoKKyAqIHBhcnNpbmcgJiBleGVjdXRpb24gZW52aXJvbm1lbnQKKyAqLworZXh0ZXJuIHN0cnVjdCBlbnYgeworCUFMTE9DX0lURU0gX19hbGxvY19pOwkvKiBpbnRlcm5hbCwgZG8gbm90IHRvdWNoICovCisJQXJlYSBhcmVhOwkJLyogdGVtcG9yYXJ5IGFsbG9jYXRpb24gYXJlYSAqLworCXN0cnVjdCBlbnYgKm9lbnY7CS8qIGxpbmsgdG8gcHJldmlvdXMgZW52aXJvbm1lbnQgKi8KKwlzdHJ1Y3QgYmxvY2sgKmxvYzsJLyogbG9jYWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgKi8KKwlzaG9ydCAqc2F2ZWZkOwkJLyogb3JpZ2luYWwgcmVkaXJlY3RlZCBmZHMgKi8KKwlzdHJ1Y3QgdGVtcCAqdGVtcHM7CS8qIHRlbXAgZmlsZXMgKi8KKwlzaWdqbXBfYnVmIGpidWY7CS8qIGxvbmcganVtcCBiYWNrIHRvIGVudiBjcmVhdG9yICovCisJc2hvcnQgdHlwZTsJCS8qIGVudmlyb25tZW50IHR5cGUgLSBzZWUgYmVsb3cgKi8KKwlzaG9ydCBmbGFnczsJCS8qIEVGXyogKi8KK30gKmU7CisKKy8qIHN0cnVjdCBlbnYudHlwZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRV9OT05FCTAJLyogZHVtbXkgZW52aXJvbm1lbnQgKi8KKyNkZWZpbmUgRV9QQVJTRQkxCS8qIHBhcnNpbmcgY29tbWFuZCAjICovCisjZGVmaW5lIEVfRlVOQwkyCS8qIGV4ZWN1dGluZyBmdW5jdGlvbiAjICovCisjZGVmaW5lIEVfSU5DTAkzCS8qIGluY2x1ZGluZyBhIGZpbGUgdmlhIC4gIyAqLworI2RlZmluZSBFX0VYRUMJNAkvKiBleGVjdXRpbmcgY29tbWFuZCB0cmVlICovCisjZGVmaW5lIEVfTE9PUAk1CS8qIGV4ZWN1dGluZyBmb3Ivd2hpbGUgIyAqLworI2RlZmluZSBFX0VSUkgJNgkvKiBnZW5lcmFsIGVycm9yIGhhbmRsZXIgIyAqLworLyogIyBpbmRpY2F0ZXMgZW52IGhhcyB2YWxpZCBqYnVmIChzZWUgdW53aW5kKCkpICovCisKKy8qIHN0cnVjdCBlbnYuZmxhZyB2YWx1ZXMgKi8KKyNkZWZpbmUgRUZfRlVOQ19QQVJTRQlCSVQoMCkJLyogZnVuY3Rpb24gYmVpbmcgcGFyc2VkICovCisjZGVmaW5lIEVGX0JSS0NPTlRfUEFTUwlCSVQoMSkJLyogc2V0IGlmIEVfTE9PUCBtdXN0IHBhc3MgYnJlYWsvY29udGludWUgb24gKi8KKyNkZWZpbmUgRUZfRkFLRV9TSUdESUUJQklUKDIpCS8qIGhhY2sgdG8gZ2V0IGluZm8gZnJvbSB1bndpbmQgdG8gcXVpdGVudiAqLworCisvKiBEbyBicmVha3MvY29udGludWVzIHN0b3AgYXQgZW52IHR5cGUgZT8gKi8KKyNkZWZpbmUgU1RPUF9CUktDT05UKHQpCSgodCkgPT0gRV9OT05FIHx8ICh0KSA9PSBFX1BBUlNFIFwKKwkJCSB8fCAodCkgPT0gRV9GVU5DIHx8ICh0KSA9PSBFX0lOQ0wpCisvKiBEbyByZXR1cm5zIHN0b3AgYXQgZW52IHR5cGUgZT8gKi8KKyNkZWZpbmUgU1RPUF9SRVRVUk4odCkJKCh0KSA9PSBFX0ZVTkMgfHwgKHQpID09IEVfSU5DTCkKKworLyogdmFsdWVzIGZvciBzaWdsb25nam1wKGUtPmpidWYsIDApICovCisjZGVmaW5lIExSRVRVUk4JMQkvKiByZXR1cm4gc3RhdGVtZW50ICovCisjZGVmaW5lIExFWElUCTIJLyogZXhpdCBzdGF0ZW1lbnQgKi8KKyNkZWZpbmUgTEVSUk9SCTMJLyogZXJyb3JmKCkgY2FsbGVkICovCisjZGVmaW5lIExMRUFWRQk0CS8qIHVudHJhcHBhYmxlIGV4aXQvZXJyb3IgKi8KKyNkZWZpbmUgTElOVFIJNQkvKiBeQyBub3RpY2VkICovCisjZGVmaW5lIExCUkVBSwk2CS8qIGJyZWFrIHN0YXRlbWVudCAqLworI2RlZmluZSBMQ09OVElOCTcJLyogY29udGludWUgc3RhdGVtZW50ICovCisjZGVmaW5lIExTSEVMTAk4CS8qIHJldHVybiB0byBpbnRlcmFjdGl2ZSBzaGVsbCgpICovCisjZGVmaW5lIExBRVhQUgk5CS8qIGVycm9yIGluIGFyaXRobWV0aWMgZXhwcmVzc2lvbiAqLworCisvKgorICogc29tZSBraW5kIG9mIGdsb2JhbCBzaGVsbCBzdGF0ZSwgZm9yIGNoYW5nZV9yYW5kb20oKSBtb3N0bHkKKyAqLworCitFWFRFUk4gc3RydWN0IG1rc2hfa3Noc3RhdGVfdiB7CisJLyogZm9yIGNoYW5nZV9yYW5kb20gKi8KKwlzdHJ1Y3QgdGltZXZhbCBjcl90djsJLyogdGltZXN0YW1wICovCisJY29uc3Qgdm9pZCAqY3JfZHA7CS8qIGFyZ3VtZW50IGFkZHJlc3MgKi8KKwlzaXplX3QgY3JfZHN6OwkJLyogYXJndW1lbnQgbGVuZ3RoICovCisJdWludDMyX3QgbGNnX3N0YXRlXzsJLyogcHJldmlvdXMgTENHIHN0YXRlICovCisJLyogZ2xvYmFsIHN0YXRlICovCisJcGlkX3QgcHJvY3BpZF87CQkvKiBQSUQgb2YgZXhlY3V0aW5nIHByb2Nlc3MgKi8KKwlpbnQgZXhzdGF0XzsJCS8qIGV4aXQgc3RhdHVzICovCisJaW50IHN1YnN0X2V4c3RhdF87CS8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgJCguLikvYC4uYCAqLworCXN0cnVjdCBlbnYgZW52XzsJLyogdG9wLWxldmVsIHBhcnNpbmcgJiBleGVjdXRpb24gZW52LiAqLworCXVpbnQ4X3Qgc2hlbGxfZmxhZ3NfW0ZORkxBR1NdOworfSBrc2hzdGF0ZV92OworRVhURVJOIHN0cnVjdCBta3NoX2tzaHN0YXRlX2YgeworCWNvbnN0IGNoYXIgKmtzaG5hbWVfOwkvKiAkMCAqLworCXBpZF90IGtzaHBpZF87CQkvKiAkJCwgc2hlbGwgUElEICovCisJcGlkX3Qga3NocGdycF87CQkvKiBwcm9jZXNzIGdyb3VwIG9mIHNoZWxsICovCisJdWlkX3Qga3NoZXVpZF87CQkvKiBlZmZlY3RpdmUgVUlEIG9mIHNoZWxsICovCisJcGlkX3Qga3NocHBpZF87CQkvKiBQSUQgb2YgcGFyZW50IG9mIHNoZWxsICovCisJdWludDMyX3QgaDsJCS8qIHNvbWUga2luZCBvZiBoYXNoICovCit9IGtzaHN0YXRlX2Y7CisjZGVmaW5lIGtzaG5hbWUJCWtzaHN0YXRlX2Yua3NobmFtZV8KKyNkZWZpbmUga3NocGlkCQlrc2hzdGF0ZV9mLmtzaHBpZF8KKyNkZWZpbmUgcHJvY3BpZAkJa3Noc3RhdGVfdi5wcm9jcGlkXworI2RlZmluZSBrc2hwZ3JwCQlrc2hzdGF0ZV9mLmtzaHBncnBfCisjZGVmaW5lIGtzaGV1aWQJCWtzaHN0YXRlX2Yua3NoZXVpZF8KKyNkZWZpbmUga3NocHBpZAkJa3Noc3RhdGVfZi5rc2hwcGlkXworI2RlZmluZSBleHN0YXQJCWtzaHN0YXRlX3YuZXhzdGF0XworI2RlZmluZSBzdWJzdF9leHN0YXQJa3Noc3RhdGVfdi5zdWJzdF9leHN0YXRfCisKKy8qIGV2aWwgaGFjazogcmV0dXJuIGhhc2goa3Noc3RhdGVfZiBjb25jYXQgKGtzaHN0YXRlX2YnLmg6PWhhc2goYXJnKSkpICovCit1aW50MzJfdCBldmlsaGFzaChjb25zdCBjaGFyICopOworCisKKy8qIG9wdGlvbiBwcm9jZXNzaW5nICovCisjZGVmaW5lIE9GX0NNRExJTkUJMHgwMQkvKiBjb21tYW5kIGxpbmUgKi8KKyNkZWZpbmUgT0ZfU0VUCQkweDAyCS8qIHNldCBidWlsdGluICovCisjZGVmaW5lIE9GX1NQRUNJQUwJMHgwNAkvKiBhIHNwZWNpYWwgdmFyaWFibGUgY2hhbmdpbmcgKi8KKyNkZWZpbmUgT0ZfSU5URVJOQUwJMHgwOAkvKiBzZXQgaW50ZXJuYWxseSBieSBzaGVsbCAqLworI2RlZmluZSBPRl9GSVJTVFRJTUUJMHgxMAkvKiBhcyBlYXJseSBhcyBwb3NzaWJsZSwgb25jZSAqLworI2RlZmluZSBPRl9BTlkJCShPRl9DTURMSU5FIHwgT0ZfU0VUIHwgT0ZfU1BFQ0lBTCB8IE9GX0lOVEVSTkFMKQorCitzdHJ1Y3Qgc2hvcHRpb24geworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIGxvbmcgbmFtZSBvZiBvcHRpb24gKi8KKwljaGFyIGM7CQkJLyogY2hhcmFjdGVyIGZsYWcgKGlmIGFueSkgKi8KKwl1bnNpZ25lZCBjaGFyIGZsYWdzOwkvKiBPRl8qICovCit9OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaG9wdGlvbiBvcHRpb25zW107CisKKy8qIG51bGwgdmFsdWUgZm9yIHZhcmlhYmxlOyBjb21wYXJpc2lvbiBwb2ludGVyIGZvciB1bnNldCAqLworRVhURVJOIGNoYXIgbnVsbFtdIElfXygiIik7CisvKiBoZWxwZXJzIGZvciBzdHJpbmcgcG9vbGluZyAqLworI2RlZmluZSBUX3N5bmVyciAic3ludGF4IGVycm9yIgorRVhURVJOIGNvbnN0IGNoYXIgcl9mY19lX1tdIElfXygicj1mYyAtZSAtIik7CisjZGVmaW5lIGZjX2VfCQkocl9mY19lXyArIDIpCQkvKiAiZmMgLWUgLSIgKi8KKyNkZWZpbmUgZmNfZV9uCQk3CQkJLyogc3RybGVuKGZjX2VfKSAqLworRVhURVJOIGNvbnN0IGNoYXIgVF9sb2NhbF90eXBlc2V0W10gSV9fKCJsb2NhbD10eXBlc2V0Iik7CisjZGVmaW5lIFRfX3R5cGVzZXQJKFRfbG9jYWxfdHlwZXNldCArIDUpCS8qICI9dHlwZXNldCIgKi8KKyNkZWZpbmUgVF90eXBlc2V0CShUX2xvY2FsX3R5cGVzZXQgKyA2KQkvKiAidHlwZXNldCIgKi8KKworZW51bSB0ZW1wX3R5cGUgeworCVRUX0hFUkVET0NfRVhQLAkvKiBleHBhbmRlZCBoZXJlZG9jICovCisJVFRfSElTVF9FRElUCS8qIHRlbXAgZmlsZSB1c2VkIGZvciBoaXN0b3J5IGVkaXRpbmcgKGZjIC1lKSAqLworfTsKK3R5cGVkZWYgZW51bSB0ZW1wX3R5cGUgVGVtcF90eXBlOworLyogdGVtcC9oZXJlZG9jIGZpbGVzLiBUaGUgZmlsZSBpcyByZW1vdmVkIHdoZW4gdGhlIHN0cnVjdCBpcyBmcmVlZC4gKi8KK3N0cnVjdCB0ZW1wIHsKKwlzdHJ1Y3QgdGVtcCAqbmV4dDsKKwlzdHJ1Y3Qgc2hmICpzaGY7CisJY2hhciAqbmFtZTsKKwlpbnQgcGlkOwkvKiBwaWQgb2YgcHJvY2VzcyBwYXJzZWQgaGVyZS1kb2MgKi8KKwlUZW1wX3R5cGUgdHlwZTsKK307CisKKy8qCisgKiBzdGRpbyBhbmQgb3VyIElPIHJvdXRpbmVzCisgKi8KKworI2RlZmluZSBzaGxfc3BhcmUJKCZzaGZfaW9iWzBdKQkvKiBmb3IgY19yZWFkKCkvY19wcmludCgpICovCisjZGVmaW5lIHNobF9zdGRvdXQJKCZzaGZfaW9iWzFdKQorI2RlZmluZSBzaGxfb3V0CQkoJnNoZl9pb2JbMl0pCitFWFRFUk4gaW50IHNobF9zdGRvdXRfb2s7CisKKy8qCisgKiB0cmFwIGhhbmRsZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHRyYXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIHNob3J0IG5hbWUgKi8KKwljb25zdCBjaGFyICptZXNzOwkvKiBkZXNjcmlwdGl2ZSBuYW1lICovCisJY2hhciAqdHJhcDsJCS8qIHRyYXAgY29tbWFuZCAqLworCXNpZ190IGN1cnNpZzsJCS8qIGN1cnJlbnQgaGFuZGxlciAodmFsaWQgaWYgVEZfT1JJR18qIHNldCkgKi8KKwlzaWdfdCBzaHRyYXA7CQkvKiBzaGVsbCBzaWduYWwgaGFuZGxlciAqLworCWludCBzaWduYWw7CQkvKiBzaWduYWwgbnVtYmVyICovCisJaW50IGZsYWdzOwkJLyogVEZfKiAqLworCXZvbGF0aWxlIHNpZ19hdG9taWNfdCBzZXQ7IC8qIHRyYXAgcGVuZGluZyAqLworfSBUcmFwOworCisvKiB2YWx1ZXMgZm9yIFRyYXAuZmxhZ3MgKi8KKyNkZWZpbmUgVEZfU0hFTExfVVNFUwlCSVQoMCkJLyogc2hlbGwgdXNlcyBzaWduYWwsIHVzZXIgY2FuJ3QgY2hhbmdlICovCisjZGVmaW5lIFRGX1VTRVJfU0VUCUJJVCgxKQkvKiB1c2VyIGhhcyAodHJpZWQgdG8pIHNldCB0cmFwICovCisjZGVmaW5lIFRGX09SSUdfSUdOCUJJVCgyKQkvKiBvcmlnaW5hbCBhY3Rpb24gd2FzIFNJR19JR04gKi8KKyNkZWZpbmUgVEZfT1JJR19ERkwJQklUKDMpCS8qIG9yaWdpbmFsIGFjdGlvbiB3YXMgU0lHX0RGTCAqLworI2RlZmluZSBURl9FWEVDX0lHTglCSVQoNCkJLyogcmVzdG9yZSBTSUdfSUdOIGp1c3QgYmVmb3JlIGV4ZWMgKi8KKyNkZWZpbmUgVEZfRVhFQ19ERkwJQklUKDUpCS8qIHJlc3RvcmUgU0lHX0RGTCBqdXN0IGJlZm9yZSBleGVjICovCisjZGVmaW5lIFRGX0RGTF9JTlRSCUJJVCg2KQkvKiB3aGVuIHJlY2VpdmVkLCBkZWZhdWx0IGFjdGlvbiBpcyBMSU5UUiAqLworI2RlZmluZSBURl9UVFlfSU5UUglCSVQoNykJLyogdHR5IGdlbmVyYXRlZCBzaWduYWwgKHNlZSBqX3dhaXRqKSAqLworI2RlZmluZSBURl9DSEFOR0VECUJJVCg4KQkvKiB1c2VkIGJ5IHJ1bnRyYXAoKSB0byBkZXRlY3QgdHJhcCBjaGFuZ2VzICovCisjZGVmaW5lIFRGX0ZBVEFMCUJJVCg5KQkvKiBjYXVzZXMgdGVybWluYXRpb24gaWYgbm90IHRyYXBwZWQgKi8KKworLyogdmFsdWVzIGZvciBzZXRzaWcoKS9zZXRleGVjc2lnKCkgZmxhZ3MgYXJndW1lbnQgKi8KKyNkZWZpbmUgU1NfUkVTVE9SRV9NQVNLCTB4MwkvKiBob3cgdG8gcmVzdG9yZSBhIHNpZ25hbCBiZWZvcmUgYW4gZXhlYygpICovCisjZGVmaW5lIFNTX1JFU1RPUkVfQ1VSUgkwCS8qIGxlYXZlIGN1cnJlbnQgaGFuZGxlciBpbiBwbGFjZSAqLworI2RlZmluZSBTU19SRVNUT1JFX09SSUcJMQkvKiByZXN0b3JlIG9yaWdpbmFsIGhhbmRsZXIgKi8KKyNkZWZpbmUgU1NfUkVTVE9SRV9ERkwJMgkvKiByZXN0b3JlIHRvIFNJR19ERkwgKi8KKyNkZWZpbmUgU1NfUkVTVE9SRV9JR04JMwkvKiByZXN0b3JlIHRvIFNJR19JR04gKi8KKyNkZWZpbmUgU1NfRk9SQ0UJQklUKDMpCS8qIHNldCBzaWduYWwgZXZlbiBpZiBvcmlnaW5hbCBzaWduYWwgaWdub3JlZCAqLworI2RlZmluZSBTU19VU0VSCQlCSVQoNCkJLyogdXNlciBpcyBkb2luZyB0aGUgc2V0IChpZSwgdHJhcCBjb21tYW5kKSAqLworI2RlZmluZSBTU19TSFRSQVAJQklUKDUpCS8qIHRyYXAgZm9yIGludGVybmFsIHVzZSAoQUxSTSwgQ0hMRCwgV0lOQ0gpICovCisKKyNkZWZpbmUgU0lHRVhJVF8JMAkvKiBmb3IgdHJhcCBFWElUICovCisjZGVmaW5lIFNJR0VSUl8JCU5TSUcJLyogZm9yIHRyYXAgRVJSICovCisKK0VYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgdHJhcDsJLyogdHJhcHMgcGVuZGluZz8gKi8KK0VYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgaW50cnNpZzsJLyogcGVuZGluZyB0cmFwIGludGVycnVwdHMgY29tbWFuZCAqLworRVhURVJOIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBmYXRhbF90cmFwOy8qIHJlY2VpdmVkIGEgZmF0YWwgc2lnbmFsICovCitleHRlcm4JVHJhcAlzaWd0cmFwc1tOU0lHKzFdOworCisvKiBnb3Rfd2luY2ggPSAxIHdoZW4gd2UgbmVlZCB0byByZS1hZGp1c3QgdGhlIHdpbmRvdyBzaXplICovCisjaWZkZWYgU0lHV0lOQ0gKK0VYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgZ290X3dpbmNoIElfXygxKTsKKyNlbHNlCisjZGVmaW5lIGdvdF93aW5jaAl0cnVlCisjZW5kaWYKKworLyoKKyAqIFRNT1VUIHN1cHBvcnQKKyAqLworLyogdmFsdWVzIGZvciBrc2hfdG1vdXRfc3RhdGUgKi8KK2VudW0gdG1vdXRfZW51bSB7CisJVE1PVVRfRVhFQ1VUSU5HID0gMCwJLyogZXhlY3V0aW5nIGNvbW1hbmRzICovCisJVE1PVVRfUkVBRElORywJCS8qIHdhaXRpbmcgZm9yIGlucHV0ICovCisJVE1PVVRfTEVBVklORwkJLyogaGF2ZSB0aW1lZCBvdXQgKi8KK307CitFWFRFUk4gdW5zaWduZWQgaW50IGtzaF90bW91dDsKK0VYVEVSTiBlbnVtIHRtb3V0X2VudW0ga3NoX3Rtb3V0X3N0YXRlIElfXyhUTU9VVF9FWEVDVVRJTkcpOworCisvKiBGb3IgIllvdSBoYXZlIHN0b3BwZWQgam9icyIgbWVzc2FnZSAqLworRVhURVJOIGludCByZWFsbHlfZXhpdDsKKworLyoKKyAqIGZhc3QgY2hhcmFjdGVyIGNsYXNzZXMKKyAqLworI2RlZmluZSBDX0FMUEhBCSBCSVQoMCkJCS8qIGEtel9BLVogKi8KKyNkZWZpbmUgQ19ESUdJVAkgQklUKDEpCQkvKiAwLTkgKi8KKyNkZWZpbmUgQ19MRVgxCSBCSVQoMikJCS8qIFx0IFxuXDB8Jjs8PigpICovCisjZGVmaW5lIENfVkFSMQkgQklUKDMpCQkvKiAqQCMhJC0/ICovCisjZGVmaW5lIENfSUZTV1MJIEJJVCg0KQkJLyogXHQgXG4gKElGUyB3aGl0ZSBzcGFjZSkgKi8KKyNkZWZpbmUgQ19TVUJPUDEgQklUKDUpCQkvKiAiPS0rPyIgKi8KKyNkZWZpbmUgQ19RVU9URQkgQklUKDYpCQkvKiBcdFxuICIjJCYnKCkqOzw9Pj9bXF1gfCAobmVlZGluZyBxdW90aW5nKSAqLworI2RlZmluZSBDX0lGUwkgQklUKDcpCQkvKiAkSUZTICovCisjZGVmaW5lIENfU1VCT1AyIEJJVCg4KQkJLyogIiMlIiAobWFnaWMsIHNlZSBiZWxvdykgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2h0eXBlc1tdOworCisjZGVmaW5lIGN0eXBlKGMsIHQpCSEhKCAoKHQpID09IENfU1VCT1AyKSA/CQkJCVwKKwkJCSAgICAoKChjKSA9PSAnIycgfHwgKGMpID09ICclJykgPyAxIDogMCkgOglcCisJCQkgICAgKGNodHlwZXNbKHVuc2lnbmVkIGNoYXIpKGMpXSYodCkpICkKKyNkZWZpbmUga3NoX2lzYWxwaHgoYykJY3R5cGUoKGMpLCBDX0FMUEhBKQorI2RlZmluZSBrc2hfaXNhbG51eChjKQljdHlwZSgoYyksIENfQUxQSEEgfCBDX0RJR0lUKQorCitFWFRFUk4gaW50IGlmczAgSV9fKCcgJyk7CS8qIGZvciAiJCoiICovCisKKy8qIEFyZ3VtZW50IHBhcnNpbmcgZm9yIGJ1aWx0LWluIGNvbW1hbmRzIGFuZCBnZXRvcHRzIGNvbW1hbmQgKi8KKworLyogVmFsdWVzIGZvciBHZXRvcHQuZmxhZ3MgKi8KKyNkZWZpbmUgR0ZfRVJST1IJQklUKDApCS8qIGNhbGwgZXJyb3JmKCkgaWYgdGhlcmUgaXMgYW4gZXJyb3IgKi8KKyNkZWZpbmUgR0ZfUExVU09QVAlCSVQoMSkJLyogYWxsb3cgK2MgYXMgYW4gb3B0aW9uICovCisjZGVmaW5lIEdGX05PTkFNRQlCSVQoMikJLyogZG9uJ3QgcHJpbnQgYXJndlswXSBpbiBlcnJvcnMgKi8KKworLyogVmFsdWVzIGZvciBHZXRvcHQuaW5mbyAqLworI2RlZmluZSBHSV9NSU5VUwlCSVQoMCkJLyogYW4gb3B0aW9uIHN0YXJ0ZWQgd2l0aCAtLi4uICovCisjZGVmaW5lIEdJX1BMVVMJCUJJVCgxKQkvKiBhbiBvcHRpb24gc3RhcnRlZCB3aXRoICsuLi4gKi8KKyNkZWZpbmUgR0lfTUlOVVNNSU5VUwlCSVQoMikJLyogYXJndW1lbnRzIHdlcmUgZW5kZWQgd2l0aCAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3QgY2hhcgkqb3B0YXJnOworCWludAkJb3B0aW5kOworCWludAkJdW9wdGluZDsvKiB3aGF0IHVzZXIgc2VlcyBpbiAkT1BUSU5EICovCisJaW50CQlmbGFnczsJLyogc2VlIEdGXyogKi8KKwlpbnQJCWluZm87CS8qIHNlZSBHSV8qICovCisJdW5zaWduZWQgaW50CXA7CS8qIDAgb3IgaW5kZXggaW50byBhcmd2W29wdGluZCAtIDFdICovCisJY2hhcgkJYnVmWzJdOwkvKiBmb3IgYmFkIG9wdGlvbiBPUFRBUkcgdmFsdWUgKi8KK30gR2V0b3B0OworCitFWFRFUk4gR2V0b3B0IGJ1aWx0aW5fb3B0OwkvKiBmb3Igc2hlbGwgYnVpbHRpbiBjb21tYW5kcyAqLworRVhURVJOIEdldG9wdCB1c2VyX29wdDsJCS8qIHBhcnNpbmcgc3RhdGUgZm9yIGdldG9wdHMgYnVpbHRpbiBjb21tYW5kICovCisKKy8qIFRoaXMgZm9yIGNvLXByb2Nlc3NlcyAqLworCit0eXBlZGVmIGludDMyX3QgQ29wcm9jX2lkOyAvKiBzb21ldGhpbmcgdGhhdCB3b24ndCAocmVhbGlzdGljbHkpIHdyYXAgKi8KK3N0cnVjdCBjb3Byb2MgeworCXZvaWQgKmpvYjsJLyogMCBvciBqb2Igb2YgY28tcHJvY2VzcyB1c2luZyBpbnB1dCBwaXBlICovCisJaW50IHJlYWQ7CS8qIHBpcGUgZnJvbSBjby1wcm9jZXNzJ3Mgc3Rkb3V0ICovCisJaW50IHJlYWR3OwkvKiBvdGhlciBzaWRlIG9mIHJlYWQgKHNhdmVkIHRlbXBvcmFyaWx5KSAqLworCWludCB3cml0ZTsJLyogcGlwZSB0byBjby1wcm9jZXNzJ3Mgc3RkaW4gKi8KKwlpbnQgbmpvYnM7CS8qIG51bWJlciBvZiBsaXZlIGpvYnMgdXNpbmcgb3V0cHV0IHBpcGUgKi8KKwlDb3Byb2NfaWQgaWQ7CS8qIGlkIG9mIGN1cnJlbnQgb3V0cHV0IHBpcGUgKi8KK307CitFWFRFUk4gc3RydWN0IGNvcHJvYyBjb3Byb2M7CisKKy8qIFVzZWQgaW4gam9icy5jIGFuZCBieSBjb3Byb2Nlc3Mgc3R1ZmYgaW4gZXhlYy5jICovCitFWFRFUk4gc2lnc2V0X3QJCXNtX2RlZmF1bHQsIHNtX3NpZ2NobGQ7CisKKy8qIG5hbWUgb2YgY2FsbGVkIGJ1aWx0aW4gZnVuY3Rpb24gKHVzZWQgYnkgZXJyb3IgZnVuY3Rpb25zKSAqLworRVhURVJOIGNvbnN0IGNoYXIgKmJ1aWx0aW5fYXJndjA7CitFWFRFUk4gVGZsYWcgYnVpbHRpbl9mbGFnOwkvKiBmbGFncyBvZiBjYWxsZWQgYnVpbHRpbiAoU1BFQ19CSSwgZXRjLikgKi8KKworLyogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHNpemUgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3Igc2FtZSAqLworRVhURVJOIGNoYXIJKmN1cnJlbnRfd2Q7CitFWFRFUk4gc2l6ZV90CWN1cnJlbnRfd2Rfc2l6ZTsKKworLyogTWluaW11bSByZXF1aXJlZCBzcGFjZSB0byB3b3JrIHdpdGggb24gYSBsaW5lIC0gaWYgdGhlIHByb21wdCBsZWF2ZXMgbGVzcworICogc3BhY2UgdGhhbiB0aGlzIG9uIGEgbGluZSwgdGhlIHByb21wdCBpcyB0cnVuY2F0ZWQuCisgKi8KKyNkZWZpbmUgTUlOX0VESVRfU1BBQ0UJNworLyogTWluaW11bSBhbGxvd2VkIHZhbHVlIGZvciB4X2NvbHM6IDIgZm9yIHByb21wdCwgMyBmb3IgIiA8ICIgYXQgZW5kIG9mIGxpbmUKKyAqLworI2RlZmluZSBNSU5fQ09MUwkoMiArIE1JTl9FRElUX1NQQUNFICsgMykKKyNkZWZpbmUgTUlOX0xJTlMJMworRVhURVJOIG1rc2hfYXJpX3QgeF9jb2xzIElfXyg4MCk7CS8qIHR0eSBjb2x1bW5zICovCitFWFRFUk4gbWtzaF9hcmlfdCB4X2xpbnMgSV9fKC0xKTsJLyogdHR5IGxpbmVzICovCisKKy8qIFRoZXNlIHRvIGF2b2lkIGJyYWNrZXQgbWF0Y2hpbmcgcHJvYmxlbXMgKi8KKyNkZWZpbmUgT1BBUkVOCScoJworI2RlZmluZSBDUEFSRU4JJyknCisjZGVmaW5lIE9CUkFDSwknWycKKyNkZWZpbmUgQ0JSQUNLCSddJworI2RlZmluZSBPQlJBQ0UJJ3snCisjZGVmaW5lIENCUkFDRQknfScKKworLyogRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3lzdGVtIChjb21tb24pIHByb2ZpbGUgKi8KKyNkZWZpbmUgS1NIX1NZU1RFTV9QUk9GSUxFICIvZXRjL3Byb2ZpbGUiCisKKy8qIFVzZWQgYnkgdl9ldmFsdWF0ZSgpIGFuZCBzZXRzdHIoKSB0byBjb250cm9sIGFjdGlvbiB3aGVuIGVycm9yIG9jY3VycyAqLworI2RlZmluZSBLU0hfVU5XSU5EX0VSUk9SCTAJLyogdW53aW5kIHRoZSBzdGFjayAobG9uZ2ptcCkgKi8KKyNkZWZpbmUgS1NIX1JFVFVSTl9FUlJPUgkxCS8qIHJldHVybiAxLzAgZm9yIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogU2hlbGwgZmlsZSBJL08gcm91dGluZXMKKyAqLworCisjZGVmaW5lIFNIRl9CU0laRQk1MTIKKworI2RlZmluZSBzaGZfZmlsZW5vKHNoZikJKChzaGYpLT5mZCkKKyNkZWZpbmUgc2hmX3NldGZpbGVubyhzaGYsbmZkKQkoKHNoZiktPmZkID0gKG5mZCkpCisjaWZkZWYgTUtTSF9TTUFMTAoraW50IHNoZl9nZXRjKHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX3B1dGMoaW50LCBzdHJ1Y3Qgc2hmICopOworI2Vsc2UKKyNkZWZpbmUgc2hmX2dldGMoc2hmKQkJKChzaGYpLT5ybmxlZnQgPiAwID8gXAorCQkJCSAgICAoc2hmKS0+cm5sZWZ0LS0sICooc2hmKS0+cnArKyA6IFwKKwkJCQkgICAgc2hmX2dldGNoYXIoc2hmKSkKKyNkZWZpbmUgc2hmX3B1dGMoYywgc2hmKQkoKHNoZiktPndubGVmdCA9PSAwID8gXAorCQkJCSAgICBzaGZfcHV0Y2hhcigoYyksIChzaGYpKSA6IFwKKwkJCQkgICAgKChzaGYpLT53bmxlZnQtLSwgKihzaGYpLT53cCsrID0gKGMpKSkKKyNlbmRpZgorI2RlZmluZSBzaGZfZW9mKHNoZikJCSgoc2hmKS0+ZmxhZ3MgJiBTSEZfRU9GKQorI2RlZmluZSBzaGZfZXJyb3Ioc2hmKQkJKChzaGYpLT5mbGFncyAmIFNIRl9FUlJPUikKKyNkZWZpbmUgc2hmX2Vycm5vKHNoZikJCSgoc2hmKS0+ZXJybm9fKQorI2RlZmluZSBzaGZfY2xlYXJlcnIoc2hmKQkoKHNoZiktPmZsYWdzICY9IH4oU0hGX0VPRiB8IFNIRl9FUlJPUikpCisKKy8qIEZsYWdzIHBhc3NlZCB0byBzaGZfKm9wZW4oKSAqLworI2RlZmluZSBTSEZfUkQJCTB4MDAwMQorI2RlZmluZSBTSEZfV1IJCTB4MDAwMgorI2RlZmluZSBTSEZfUkRXUgkoU0hGX1JEfFNIRl9XUikKKyNkZWZpbmUgU0hGX0FDQ01PREUJMHgwMDAzCQkvKiBtYXNrICovCisjZGVmaW5lIFNIRl9HRVRGTAkweDAwMDQJCS8qIHVzZSBmY250bCgpIHRvIGZpZ3VyZSBSRC9XUiBmbGFncyAqLworI2RlZmluZSBTSEZfVU5CVUYJMHgwMDA4CQkvKiB1bmJ1ZmZlcmVkIEkvTyAqLworI2RlZmluZSBTSEZfQ0xFWEVDCTB4MDAxMAkJLyogc2V0IGNsb3NlIG9uIGV4ZWMgZmxhZyAqLworI2RlZmluZSBTSEZfTUFQSEkJMHgwMDIwCQkvKiBtYWtlIGZkID4gRkRCQVNFIChhbmQgY2xvc2Ugb3JpZykKKwkJCQkJICogKHNoZl9vcGVuKCkgb25seSkgKi8KKyNkZWZpbmUgU0hGX0RZTkFNSUMJMHgwMDQwCQkvKiBzdHJpbmc6IGluY3JlYXNlIGJ1ZmZlciBhcyBuZWVkZWQgKi8KKyNkZWZpbmUgU0hGX0lOVEVSUlVQVAkweDAwODAJCS8qIEVJTlRSIGluIHJlYWQvd3JpdGUgY2F1c2VzIGVycm9yICovCisvKiBGbGFncyB1c2VkIGludGVybmFsbHkgKi8KKyNkZWZpbmUgU0hGX1NUUklORwkweDAxMDAJCS8qIGEgc3RyaW5nLCBub3QgYSBmaWxlICovCisjZGVmaW5lIFNIRl9BTExPQ1MJMHgwMjAwCQkvKiBzaGYgYW5kIHNoZi0+YnVmIHdlcmUgYWxsb2MoKWVkICovCisjZGVmaW5lIFNIRl9BTExPQ0IJMHgwNDAwCQkvKiBzaGYtPmJ1ZiB3YXMgYWxsb2MoKWVkICovCisjZGVmaW5lIFNIRl9FUlJPUgkweDA4MDAJCS8qIHJlYWQoKS93cml0ZSgpIGVycm9yICovCisjZGVmaW5lIFNIRl9FT0YJCTB4MTAwMAkJLyogcmVhZCBlb2YgKHN0aWNreSkgKi8KKyNkZWZpbmUgU0hGX1JFQURJTkcJMHgyMDAwCQkvKiBjdXJyZW50bHkgcmVhZGluZzogcm5sZWZ0LHJwIHZhbGlkICovCisjZGVmaW5lIFNIRl9XUklUSU5HCTB4NDAwMAkJLyogY3VycmVudGx5IHdyaXRpbmc6IHdubGVmdCx3cCB2YWxpZCAqLworCisKK3N0cnVjdCBzaGYgeworCUFyZWEgKmFyZWFwOwkJLyogYXJlYSBzaGYvYnVmIHdlcmUgYWxsb2NhdGVkIGluICovCisJdW5zaWduZWQgY2hhciAqcnA7CS8qIHJlYWQ6IGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAqd3A7CS8qIHdyaXRlOiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsJLyogYnVmZmVyICovCisJaW50IGZsYWdzOwkJLyogc2VlIFNIRl8qICovCisJaW50IHJic2l6ZTsJCS8qIHNpemUgb2YgYnVmZmVyICgxIGlmIFNIRl9VTkJVRikgKi8KKwlpbnQgcm5sZWZ0OwkJLyogcmVhZDogaG93IG11Y2ggZGF0YSBsZWZ0IGluIGJ1ZmZlciAqLworCWludCB3YnNpemU7CQkvKiBzaXplIG9mIGJ1ZmZlciAoMCBpZiBTSEZfVU5CVUYpICovCisJaW50IHdubGVmdDsJCS8qIHdyaXRlOiBob3cgbXVjaCBzcGFjZSBsZWZ0IGluIGJ1ZmZlciAqLworCWludCBmZDsJCQkvKiBmaWxlIGRlc2NyaXB0b3IgKi8KKwlpbnQgZXJybm9fOwkJLyogc2F2ZWQgdmFsdWUgb2YgZXJybm8gYWZ0ZXIgZXJyb3IgKi8KKwlpbnQgYnNpemU7CQkvKiBhY3R1YWwgc2l6ZSBvZiBidWYgKi8KK307CisKK2V4dGVybiBzdHJ1Y3Qgc2hmIHNoZl9pb2JbXTsKKworc3RydWN0IHRhYmxlIHsKKwlBcmVhICphcmVhcDsJCS8qIGFyZWEgdG8gYWxsb2NhdGUgZW50cmllcyAqLworCXN0cnVjdCB0YmwgKip0YmxzOwkvKiBoYXNoZWQgdGFibGUgaXRlbXMgKi8KKwlzaG9ydCBzaXplLCBuZnJlZTsJLyogaGFzaCBzaXplIChhbHdheXMgMl5ebiksIGZyZWUgZW50cmllcyAqLworfTsKKworc3RydWN0IHRibCB7CQkJLyogdGFibGUgaXRlbSAqLworCUFyZWEgKmFyZWFwOwkJLyogYXJlYSB0byBhbGxvY2F0ZSBmcm9tICovCisJdW5pb24geworCQljaGFyICpzOwkJLyogc3RyaW5nICovCisJCW1rc2hfYXJpX3QgaTsJCS8qIGludGVnZXIgKi8KKwkJbWtzaF91YXJpX3QgdTsJCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KKwkJaW50ICgqZikoY29uc3QgY2hhciAqKik7LyogaW50IGZ1bmN0aW9uICovCisJCXN0cnVjdCBvcCAqdDsJCS8qICJmdW5jdGlvbiIgdHJlZSAqLworCX0gdmFsOwkJCS8qIHZhbHVlICovCisJdW5pb24geworCQlzdHJ1Y3QgdGJsICphcnJheTsJLyogYXJyYXkgdmFsdWVzICovCisJCWNvbnN0IGNoYXIgKmZwYXRoOwkvKiB0ZW1wb3JhcnkgcGF0aCB0byB1bmRlZiBmdW5jdGlvbiAqLworCX0gdTsKKwl1bmlvbiB7CisJCWludCBmaWVsZDsJLyogZmllbGQgd2l0aCBmb3IgLUwvLVIvLVogKi8KKwkJaW50IGVycm5vXzsJLyogQ0VYRUMvQ1RBTElBUyAqLworCX0gdTI7CisJaW50IHR5cGU7CQkvKiBjb21tYW5kIHR5cGUgKHNlZSBiZWxvdyksIGJhc2UgKGlmIElOVEVHRVIpLAorCQkJCSAqIG9yIG9mZnNldCBmcm9tIHZhbC5zIG9mIHZhbHVlIChpZiBFWFBPUlQpICovCisJVGZsYWcgZmxhZzsJCS8qIGZsYWdzICovCisJdW5pb24geworCQl1aW50MzJfdCBodmFsOwkJLyogaGFzaChuYW1lKSAqLworCQl1aW50MzJfdCBpbmRleDsJCS8qIGluZGV4IGZvciBhbiBhcnJheSAqLworCX0gdWE7CisJY2hhciBuYW1lWzRdOwkJLyogbmFtZSAtLSB2YXJpYWJsZSBsZW5ndGggKi8KK307CisKKy8qIGNvbW1vbiBmbGFnIGJpdHMgKi8KKyNkZWZpbmUgQUxMT0MJCUJJVCgwKQkvKiB2YWwucyBoYXMgYmVlbiBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgREVGSU5FRAkJQklUKDEpCS8qIGlzIGRlZmluZWQgaW4gYmxvY2sgKi8KKyNkZWZpbmUgSVNTRVQJCUJJVCgyKQkvKiBoYXMgdmFsdWUsIHZwLT52YWwuW3NpXSAqLworI2RlZmluZSBFWFBPUlQJCUJJVCgzKQkvKiBleHBvcnRlZCB2YXJpYWJsZS9mdW5jdGlvbiAqLworI2RlZmluZSBUUkFDRQkJQklUKDQpCS8qIHZhcjogdXNlciBmbGFnZ2VkLCBmdW5jOiBleGVjdXRpb24gdHJhY2luZyAqLworLyogKHN0YXJ0IG5vbi1jb21tb24gZmxhZ3MgYXQgOCkgKi8KKy8qIGZsYWcgYml0cyB1c2VkIGZvciB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgU1BFQ0lBTAkJQklUKDgpCS8qIFBBVEgsIElGUywgU0VDT05EUywgZXRjICovCisjZGVmaW5lIElOVEVHRVIJCUJJVCg5KQkvKiB2YWwuaSBjb250YWlucyBpbnRlZ2VyIHZhbHVlICovCisjZGVmaW5lIFJET05MWQkJQklUKDEwKQkvKiByZWFkLW9ubHkgdmFyaWFibGUgKi8KKyNkZWZpbmUgTE9DQUwJCUJJVCgxMSkJLyogZm9yIGxvY2FsIHR5cGVzZXQoKSAqLworI2RlZmluZSBBUlJBWQkJQklUKDEzKQkvKiBhcnJheSAqLworI2RlZmluZSBMSlVTVAkJQklUKDE0KQkvKiBsZWZ0IGp1c3RpZnkgKi8KKyNkZWZpbmUgUkpVU1QJCUJJVCgxNSkJLyogcmlnaHQganVzdGlmeSAqLworI2RlZmluZSBaRVJPRklMCQlCSVQoMTYpCS8qIDAgZmlsbGVkIGlmIFJKVVNUSUZZLCBzdHJpcCAwcyBpZiBMSlVTVElGWSAqLworI2RlZmluZSBMQ0FTRVYJCUJJVCgxNykJLyogY29udmVydCB0byBsb3dlciBjYXNlICovCisjZGVmaW5lIFVDQVNFVl9BTAlCSVQoMTgpIC8qIGNvbnZlcnQgdG8gdXBwZXIgY2FzZSAvIGF1dG9sb2FkIGZ1bmN0aW9uICovCisjZGVmaW5lIElOVF9VCQlCSVQoMTkpCS8qIHVuc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgSU5UX0wJCUJJVCgyMCkJLyogbG9uZyBpbnRlZ2VyIChuby1vcCkgKi8KKyNkZWZpbmUgSU1QT1JUCQlCSVQoMjEpCS8qIGZsYWcgdG8gdHlwZXNldCgpOiBubyBhcnJheXMsIG11c3QgaGF2ZSA9ICovCisjZGVmaW5lIExPQ0FMX0NPUFkJQklUKDIyKQkvKiB3aXRoIExPQ0FMIC0gY29weSBhdHRycyBmcm9tIGV4aXN0aW5nIHZhciAqLworI2RlZmluZSBFWFBSSU5FVkFMCUJJVCgyMykJLyogY29udGVudHMgY3VycmVudGx5IGJlaW5nIGV2YWx1YXRlZCAqLworI2RlZmluZSBFWFBSTFZBTFVFCUJJVCgyNCkJLyogdXNlYWJsZSBhcyBsdmFsdWUgKHRlbXAgZmxhZykgKi8KKyNkZWZpbmUgQUlOREVYCQlCSVQoMjUpIC8qIGFycmF5IGluZGV4ID4wID0gdWEuaW5kZXggZmlsbGVkIGluICovCisjZGVmaW5lIEFTU09DCQlCSVQoMjYpIC8qIEFSUkFZID8gYXNzb2NpYXRpdmUgOiByZWZlcmVuY2UgKi8KKy8qIGZsYWcgYml0cyB1c2VkIGZvciB0YWxpYXNlcy9idWlsdGlucy9hbGlhc2VzL2tleXdvcmRzL2Z1bmN0aW9ucyAqLworI2RlZmluZSBLRUVQQVNOCQlCSVQoOCkJLyoga2VlcCBjb21tYW5kIGFzc2lnbm1lbnRzIChlZywgdmFyPXggY21kKSAqLworI2RlZmluZSBGSU5VU0UJCUJJVCg5KQkvKiBmdW5jdGlvbiBiZWluZyBleGVjdXRlZCAqLworI2RlZmluZSBGREVMRVRFCQlCSVQoMTApCS8qIGZ1bmN0aW9uIGRlbGV0ZWQgd2hpbGUgaXQgd2FzIGV4ZWN1dGluZyAqLworI2RlZmluZSBGS1NICQlCSVQoMTEpCS8qIGZ1bmN0aW9uIGRlZmluZWQgd2l0aCBmdW5jdGlvbiB4ICh2cyB4KCkpICovCisjZGVmaW5lIFNQRUNfQkkJCUJJVCgxMikJLyogYSBQT1NJWCBzcGVjaWFsIGJ1aWx0aW4gKi8KKyNkZWZpbmUgUkVHX0JJCQlCSVQoMTMpCS8qIGEgUE9TSVggcmVndWxhciBidWlsdGluICovCisvKiBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciAodXNlZCB0byBkZWNpZGUgaWYgYW4gdW5zZXQgcGFyYW0KKyAqIHNob3VsZCBiZSByZXBvdGVkIGJ5IHNldC90eXBlc2V0KS4gRG9lcyBub3QgaW5jbHVkZSBBUlJBWSBvciBMT0NBTC4KKyAqLworI2RlZmluZSBVU0VSQVRUUklCCShFWFBPUlR8SU5URUdFUnxSRE9OTFl8TEpVU1R8UkpVU1R8WkVST0ZJTHxcCisJCQkgICAgTENBU0VWfFVDQVNFVl9BTHxJTlRfVXxJTlRfTCkKKworI2RlZmluZSBhcnJheWluZGV4KHZwKQkoKHVuc2lnbmVkIGxvbmcpKCh2cCktPmZsYWcgJiBBSU5ERVggPyBcCisJCQkgICAgKHZwKS0+dWEuaW5kZXggOiAwKSkKKworLyogY29tbWFuZCB0eXBlcyAqLworI2RlZmluZSBDTk9ORQkJMAkvKiB1bmRlZmluZWQgKi8KKyNkZWZpbmUgQ1NIRUxMCQkxCS8qIGJ1aWx0LWluICovCisjZGVmaW5lIENGVU5DCQkyCS8qIGZ1bmN0aW9uICovCisjZGVmaW5lIENFWEVDCQk0CS8qIGV4ZWN1dGFibGUgY29tbWFuZCAqLworI2RlZmluZSBDQUxJQVMJCTUJLyogYWxpYXMgKi8KKyNkZWZpbmUgQ0tFWVdECQk2CS8qIGtleXdvcmQgKi8KKyNkZWZpbmUgQ1RBTElBUwkJNwkvKiB0cmFja2VkIGFsaWFzICovCisKKy8qIEZsYWdzIGZvciBmaW5kY29tKCkvY29tZXhlYygpICovCisjZGVmaW5lIEZDX1NQRUNCSQlCSVQoMCkJLyogc3BlY2lhbCBidWlsdGluICovCisjZGVmaW5lIEZDX0ZVTkMJCUJJVCgxKQkvKiBmdW5jdGlvbiBidWlsdGluICovCisjZGVmaW5lIEZDX1JFR0JJCUJJVCgyKQkvKiByZWd1bGFyIGJ1aWx0aW4gKi8KKyNkZWZpbmUgRkNfVU5SRUdCSQlCSVQoMykJLyogdW4tcmVndWxhciBidWlsdGluICghc3BlY2lhbCwhcmVndWxhcikgKi8KKyNkZWZpbmUgRkNfQkkJCShGQ19TUEVDQkl8RkNfUkVHQkl8RkNfVU5SRUdCSSkKKyNkZWZpbmUgRkNfUEFUSAkJQklUKDQpCS8qIGRvIHBhdGggc2VhcmNoICovCisjZGVmaW5lIEZDX0RFRlBBVEgJQklUKDUpCS8qIHVzZSBkZWZhdWx0IHBhdGggaW4gcGF0aCBzZWFyY2ggKi8KKworCisjZGVmaW5lIEFGX0FSR1ZfQUxMT0MJMHgxCS8qIGFyZ3ZbXSBhcnJheSBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgQUZfQVJHU19BTExPQ0VECTB4MgkvKiBhcmd1bWVudCBzdHJpbmdzIGFsbG9jYXRlZCAqLworI2RlZmluZSBBSV9BUkdWKGEsIGkpCSgoaSkgPT0gMCA/IChhKS5hcmd2WzBdIDogKGEpLmFyZ3ZbKGkpIC0gKGEpLnNraXBdKQorI2RlZmluZSBBSV9BUkdDKGEpCSgoYSkuYXJnY18gLSAoYSkuc2tpcCkKKworLyogQXJndW1lbnQgaW5mby4gVXNlZCBmb3IgJCMsICQqIGZvciBzaGVsbCwgZnVuY3Rpb25zLCBpbmNsdWRlcywgZXRjLiAqLworc3RydWN0IGFyZ19pbmZvIHsKKwljb25zdCBjaGFyICoqYXJndjsKKwlpbnQgZmxhZ3M7CS8qIEFGXyogKi8KKwlpbnQgYXJnY187CisJaW50IHNraXA7CS8qIGZpcnN0IGFyZyBpcyBhcmd2WzBdLCBzZWNvbmQgaXMgYXJndlsxICsgc2tpcF0gKi8KK307CisKKy8qCisgKiBhY3RpdmF0aW9uIHJlY29yZCBmb3IgZnVuY3Rpb24gYmxvY2tzCisgKi8KK3N0cnVjdCBibG9jayB7CisJQXJlYSBhcmVhOwkJLyogYXJlYSB0byBhbGxvY2F0ZSB0aGluZ3MgKi8KKwljb25zdCBjaGFyICoqYXJndjsKKwljaGFyICplcnJvcjsJCS8qIGVycm9yIGhhbmRsZXIgKi8KKwljaGFyICpleGl0OwkJLyogZXhpdCBoYW5kbGVyICovCisJc3RydWN0IGJsb2NrICpuZXh0OwkvKiBlbmNsb3NpbmcgYmxvY2sgKi8KKwlzdHJ1Y3QgdGFibGUgdmFyczsJLyogbG9jYWwgdmFyaWFibGVzICovCisJc3RydWN0IHRhYmxlIGZ1bnM7CS8qIGxvY2FsIGZ1bmN0aW9ucyAqLworCUdldG9wdCBnZXRvcHRzX3N0YXRlOworCWludCBhcmdjOworCWludCBmbGFnczsJCS8qIHNlZSBCRl8qICovCit9OworCisvKiBWYWx1ZXMgZm9yIHN0cnVjdCBibG9jay5mbGFncyAqLworI2RlZmluZSBCRl9ET0dFVE9QVFMJQklUKDApCS8qIHNhdmUvcmVzdG9yZSBnZXRvcHRzIHN0YXRlICovCisKKy8qCisgKiBVc2VkIGJ5IGt0d2FsaygpIGFuZCBrdG5leHQoKSByb3V0aW5lcy4KKyAqLworc3RydWN0IHRzdGF0ZSB7CisJc3RydWN0IHRibCAqKm5leHQ7CisJc3NpemVfdCBsZWZ0OworfTsKKworRVhURVJOIHN0cnVjdCB0YWJsZSB0YWxpYXNlczsJLyogdHJhY2tlZCBhbGlhc2VzICovCitFWFRFUk4gc3RydWN0IHRhYmxlIGJ1aWx0aW5zOwkvKiBidWlsdC1pbiBjb21tYW5kcyAqLworRVhURVJOIHN0cnVjdCB0YWJsZSBhbGlhc2VzOwkvKiBhbGlhc2VzICovCitFWFRFUk4gc3RydWN0IHRhYmxlIGtleXdvcmRzOwkvKiBrZXl3b3JkcyAqLworI2lmbmRlZiBNS1NIX05PUFdOQU0KK0VYVEVSTiBzdHJ1Y3QgdGFibGUgaG9tZWRpcnM7CS8qIGhvbWVkaXIoKSBjYWNoZSAqLworI2VuZGlmCisKK3N0cnVjdCBidWlsdGluIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKmZ1bmMpKGNvbnN0IGNoYXIgKiopOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBidWlsdGluIG1rc2hidWlsdGluc1tdOworCisvKiB2YWx1ZXMgZm9yIHNldF9wcm9tcHQoKSAqLworI2RlZmluZSBQUzEJMAkvKiBjb21tYW5kICovCisjZGVmaW5lIFBTMgkxCS8qIGNvbW1hbmQgY29udGludWF0aW9uICovCisKK0VYVEVSTiBjaGFyICpwYXRoOwkJLyogY29weSBvZiBlaXRoZXIgUEFUSCBvciBkZWZfcGF0aCAqLworRVhURVJOIGNvbnN0IGNoYXIgKmRlZl9wYXRoOwkvKiBwYXRoIHRvIHVzZSBpZiBQQVRIIG5vdCBzZXQgKi8KK0VYVEVSTiBjaGFyICp0bXBkaXI7CQkvKiBUTVBESVIgdmFsdWUgKi8KK0VYVEVSTiBjb25zdCBjaGFyICpwcm9tcHQ7CitFWFRFUk4gaW50IGN1cl9wcm9tcHQ7CQkvKiBQUzEgb3IgUFMyICovCitFWFRFUk4gaW50IGN1cnJlbnRfbGluZW5vOwkvKiBMSU5FTk8gdmFsdWUgKi8KKworI2RlZmluZSBOT0JMT0NLCSgoc3RydWN0IG9wICopTlVMTCkKKyNkZWZpbmUgTk9XT1JECSgoY2hhciAqKU5VTEwpCisjZGVmaW5lIE5PV09SRFMJKChjaGFyICoqKU5VTEwpCisKKy8qCisgKiBEZXNjcmlwdGlvbiBvZiBhIGNvbW1hbmQgb3IgYW4gb3BlcmF0aW9uIG9uIGNvbW1hbmRzLgorICovCitzdHJ1Y3Qgb3AgeworCWNvbnN0IGNoYXIgKiphcmdzOwkJLyogYXJndW1lbnRzIHRvIGEgY29tbWFuZCAqLworCWNoYXIgKip2YXJzOwkJCS8qIHZhcmlhYmxlIGFzc2lnbm1lbnRzICovCisJc3RydWN0IGlvd29yZCAqKmlvYWN0OwkJLyogSU8gYWN0aW9ucyAoZWcsIDwgPiA+PikgKi8KKwlzdHJ1Y3Qgb3AgKmxlZnQsICpyaWdodDsJLyogZGVzY2VuZGVudHMgKi8KKwljaGFyICpzdHI7CQkJLyogd29yZCBmb3IgY2FzZTsgaWRlbnRpZmllciBmb3IgZm9yLAorCQkJCQkgKiBzZWxlY3QsIGFuZCBmdW5jdGlvbnM7CisJCQkJCSAqIHBhdGggdG8gZXhlY3V0ZSBmb3IgVEVYRUM7CisJCQkJCSAqIHRpbWUgaG9vayBmb3IgVENPTS4KKwkJCQkJICovCisJaW50IGxpbmVubzsJCQkvKiBUQ09NL1RGVU5DOiBMSU5FTk8gZm9yIHRoaXMgKi8KKwlzaG9ydCB0eXBlOwkJCS8qIG9wZXJhdGlvbiB0eXBlLCBzZWUgYmVsb3cgKi8KKwl1bmlvbiB7IC8qIFdBUk5JTkc6IG5ld3RwKCksIHRjb3B5KCkgdXNlIGV2YWxmbGFncyA9IDAgdG8gY2xlYXIgdW5pb24gKi8KKwkJc2hvcnQgZXZhbGZsYWdzOwkvKiBUQ09NOiBhcmcgZXhwYW5zaW9uIGV2YWwoKSBmbGFncyAqLworCQlzaG9ydCBrc2hfZnVuYzsJCS8qIFRGVU5DOiBmdW5jdGlvbiB4ICh2cyB4KCkpICovCisJfSB1OworfTsKKworLyogVHJlZS50eXBlIHZhbHVlcyAqLworI2RlZmluZSBURU9GCQkwCisjZGVmaW5lIFRDT00JCTEJLyogY29tbWFuZCAqLworI2RlZmluZSBUUEFSRU4JCTIJLyogKGMtbGlzdCkgKi8KKyNkZWZpbmUgVFBJUEUJCTMJLyogYSB8IGIgKi8KKyNkZWZpbmUgVExJU1QJCTQJLyogYSA7IGIgKi8KKyNkZWZpbmUgVE9SCQk1CS8qIHx8ICovCisjZGVmaW5lIFRBTkQJCTYJLyogJiYgKi8KKyNkZWZpbmUgVEJBTkcJCTcJLyogISAqLworI2RlZmluZSBUREJSQUNLRVQJOAkvKiBbWyAuLiBdXSAqLworI2RlZmluZSBURk9SCQk5CisjZGVmaW5lIFRTRUxFQ1QJCTEwCisjZGVmaW5lIFRDQVNFCQkxMQorI2RlZmluZSBUSUYJCTEyCisjZGVmaW5lIFRXSElMRQkJMTMKKyNkZWZpbmUgVFVOVElMCQkxNAorI2RlZmluZSBURUxJRgkJMTUKKyNkZWZpbmUgVFBBVAkJMTYJLyogcGF0dGVybiBpbiBjYXNlICovCisjZGVmaW5lIFRCUkFDRQkJMTcJLyoge2MtbGlzdH0gKi8KKyNkZWZpbmUgVEFTWU5DCQkxOAkvKiBjICYgKi8KKyNkZWZpbmUgVEZVTkNUCQkxOQkvKiBmdW5jdGlvbiBuYW1lIHsgY29tbWFuZDsgfSAqLworI2RlZmluZSBUVElNRQkJMjAJLyogdGltZSBwaXBlbGluZSAqLworI2RlZmluZSBURVhFQwkJMjEJLyogZm9yay9leGVjIGV2YWwnZCBUQ09NICovCisjZGVmaW5lIFRDT1BST0MJCTIyCS8qIGNvcHJvY2VzcyB8JiAqLworCisvKgorICogcHJlZml4IGNvZGVzIGZvciB3b3JkcyBpbiBjb21tYW5kIHRyZWUKKyAqLworI2RlZmluZSBFT1MJMAkvKiBlbmQgb2Ygc3RyaW5nICovCisjZGVmaW5lIENIQVIJMQkvKiB1bnF1b3RlZCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgUUNIQVIJMgkvKiBxdW90ZWQgY2hhcmFjdGVyICovCisjZGVmaW5lIENPTVNVQgkzCS8qICQoKSBzdWJzdGl0dXRpb24gKDAgdGVybWluYXRlZCkgKi8KKyNkZWZpbmUgRVhQUlNVQgk0CS8qICQoKCkpIHN1YnN0aXR1dGlvbiAoMCB0ZXJtaW5hdGVkKSAqLworI2RlZmluZSBPUVVPVEUJNQkvKiBvcGVuaW5nICIgb3IgJyAqLworI2RlZmluZSBDUVVPVEUJNgkvKiBjbG9zaW5nICIgb3IgJyAqLworI2RlZmluZSBPU1VCU1QJNwkvKiBvcGVuaW5nICR7IHN1YnN0IChmb2xsb3dlZCBieSB7IG9yIFgpICovCisjZGVmaW5lIENTVUJTVAk4CS8qIGNsb3NpbmcgfSBvZiBhYm92ZSAoZm9sbG93ZWQgYnkgfSBvciBYKSAqLworI2RlZmluZSBPUEFUCTkJLyogb3BlbiBwYXR0ZXJuOiAqKCwgQCgsIGV0Yy4gKi8KKyNkZWZpbmUgU1BBVAkxMAkvKiBzZXBhcmF0ZSBwYXR0ZXJuOiB8ICovCisjZGVmaW5lIENQQVQJMTEJLyogY2xvc2UgcGF0dGVybjogKSAqLworI2RlZmluZSBBREVMSU0JMTIJLyogYXJiaXRyYXJ5IGRlbGltaXRlcjogJHtmb286MjozfSAke2Zvby9iYXIvYmF6fSAqLworCisvKgorICogSU8gcmVkaXJlY3Rpb24KKyAqLworc3RydWN0IGlvd29yZCB7CisJaW50CXVuaXQ7CS8qIHVuaXQgYWZmZWN0ZWQgKi8KKwlpbnQJZmxhZzsJLyogYWN0aW9uIChiZWxvdykgKi8KKwljaGFyCSpuYW1lOwkvKiBmaWxlIG5hbWUgKHVudXNlZCBpZiBoZXJlZG9jKSAqLworCWNoYXIJKmRlbGltOwkvKiBkZWxpbWl0ZXIgZm9yIDw8LDw8LSAqLworCWNoYXIJKmhlcmVkb2M7LyogY29udGVudCBvZiBoZXJlZG9jICovCit9OworCisvKiBpb3dvcmQuZmxhZyAtIHR5cGUgb2YgcmVkaXJlY3Rpb24gKi8KKyNkZWZpbmUgSU9UWVBFCTB4RgkvKiB0eXBlOiBiaXRzIDA6MyAqLworI2RlZmluZSBJT1JFQUQJMHgxCS8qIDwgKi8KKyNkZWZpbmUgSU9XUklURQkweDIJLyogPiAqLworI2RlZmluZSBJT1JEV1IJMHgzCS8qIDw+OiB0b2RvICovCisjZGVmaW5lIElPSEVSRQkweDQJLyogPDwgKGhlcmUgZmlsZSkgKi8KKyNkZWZpbmUgSU9DQVQJMHg1CS8qID4+ICovCisjZGVmaW5lIElPRFVQCTB4NgkvKiA8Ji8+JiAqLworI2RlZmluZSBJT0VWQUwJQklUKDQpCS8qIGV4cGFuZCBpbiA8PCAqLworI2RlZmluZSBJT1NLSVAJQklUKDUpCS8qIDw8LSwgc2tpcCBeXHQqICovCisjZGVmaW5lIElPQ0xPQglCSVQoNikJLyogPnwsIG92ZXJyaWRlIC1vIG5vY2xvYmJlciAqLworI2RlZmluZSBJT1JEVVAJQklUKDcpCS8qIHg8JnkgKGFzIG9wcG9zZWQgdG8geD4meSkgKi8KKyNkZWZpbmUgSU9OQU1FWFAgQklUKDgpCS8qIG5hbWUgaGFzIGJlZW4gZXhwYW5kZWQgKi8KKyNkZWZpbmUgSU9CQVNICUJJVCg5KQkvKiAmPiBldGMuICovCisKKy8qIGV4ZWN1dGUvZXhjaGlsZCBmbGFncyAqLworI2RlZmluZSBYRVhFQwlCSVQoMCkJCS8qIGV4ZWN1dGUgd2l0aG91dCBmb3JraW5nICovCisjZGVmaW5lIFhGT1JLCUJJVCgxKQkJLyogZm9yayBiZWZvcmUgZXhlY3V0aW5nICovCisjZGVmaW5lIFhCR05ECUJJVCgyKQkJLyogY29tbWFuZCAmICovCisjZGVmaW5lIFhQSVBFSQlCSVQoMykJCS8qIGlucHV0IGlzIHBpcGUgKi8KKyNkZWZpbmUgWFBJUEVPCUJJVCg0KQkJLyogb3V0cHV0IGlzIHBpcGUgKi8KKyNkZWZpbmUgWFBJUEUJKFhQSVBFSXxYUElQRU8pCS8qIG1lbWJlciBvZiBwaXBlICovCisjZGVmaW5lIFhYQ09NCUJJVCg1KQkJLyogYC4uLmAgY29tbWFuZCAqLworI2RlZmluZSBYUENMT1NFCUJJVCg2KQkJLyogZXhjaGlsZDogY2xvc2UgY2xvc2VfZmQgaW4gcGFyZW50ICovCisjZGVmaW5lIFhDQ0xPU0UJQklUKDcpCQkvKiBleGNoaWxkOiBjbG9zZSBjbG9zZV9mZCBpbiBjaGlsZCAqLworI2RlZmluZSBYRVJST0sJQklUKDgpCQkvKiBub24temVybyBleGl0IG9rIChmb3Igc2V0IC1lKSAqLworI2RlZmluZSBYQ09QUk9DIEJJVCg5KQkJLyogc3RhcnRpbmcgYSBjby1wcm9jZXNzICovCisjZGVmaW5lIFhUSU1FCUJJVCgxMCkJCS8qIHRpbWluZyBUQ09NIGNvbW1hbmQgKi8KKworLyoKKyAqIGZsYWdzIHRvIGNvbnRyb2wgZXhwYW5zaW9uIG9mIHdvcmRzIChhc3N1bWVkIGJ5IHQtPmV2YWxmbGFncyB0byBmaXQKKyAqIGluIGEgc2hvcnQpCisgKi8KKyNkZWZpbmUgRE9CTEFOSwlCSVQoMCkJCS8qIHBlcmZvcm0gYmxhbmsgaW50ZXJwcmV0YXRpb24gKi8KKyNkZWZpbmUgRE9HTE9CCUJJVCgxKQkJLyogZXhwYW5kIFs/KiAqLworI2RlZmluZSBET1BBVAlCSVQoMikJCS8qIHF1b3RlICo/WyAqLworI2RlZmluZSBET1RJTERFCUJJVCgzKQkJLyogbm9ybWFsIH4gZXhwYW5zaW9uIChmaXJzdCBjaGFyKSAqLworI2RlZmluZSBET05UUlVOQ09NTUFORCBCSVQoNCkJLyogZG8gbm90IHJ1biAkKGNvbW1hbmQpIHRoaW5ncyAqLworI2RlZmluZSBET0FTTlRJTERFIEJJVCg1KQkvKiBhc3NpZ25tZW50IH4gZXhwYW5zaW9uIChhZnRlciA9LCA6KSAqLworI2RlZmluZSBET0JSQUNFXyBCSVQoNikJCS8qIHVzZWQgYnkgZXhwYW5kKCk6IGRvIGJyYWNlIGV4cGFuc2lvbiAqLworI2RlZmluZSBET01BR0lDXyBCSVQoNykJCS8qIHVzZWQgYnkgZXhwYW5kKCk6IHN0cmluZyBjb250YWlucyBNQUdJQyAqLworI2RlZmluZSBET1RFTVBfCUJJVCg4KQkJLyogZGl0dG8gOiBpbiB3b3JkIHBhcnQgb2YgJHsuLlslIz0/XS4ufSAqLworI2RlZmluZSBET1ZBQ0hFQ0sgQklUKDkpCS8qIHZhciBhc3NpZ24gY2hlY2sgKGZvciB0eXBlc2V0LCBzZXQsIGV0YykgKi8KKyNkZWZpbmUgRE9NQVJLRElSUyBCSVQoMTApCS8qIGZvcmNlIG1hcmtkaXJzIGJlaGF2aW91ciAqLworCisvKgorICogVGhlIGFyZ3VtZW50cyBvZiBbWyAuLiBdXSBleHByZXNzaW9ucyBhcmUga2VwdCBpbiB0LT5hcmdzW10gYW5kIGZsYWdzCisgKiBpbmRpY2F0aW5nIGhvdyB0aGUgYXJndW1lbnRzIGhhdmUgYmVlbiBtdW5nZWQgYXJlIGtlcHQgaW4gdC0+dmFyc1tdLgorICogVGhlIGNvbnRlbnRzIG9mIHQtPnZhcnNbXSBhcmUgc3R1ZmZlZCBzdHJpbmdzIChzbyB0aGV5IGNhbiBiZSB0cmVhdGVkCisgKiBsaWtlIGFsbCBvdGhlciB0LT52YXJzW10pIGluIHdoaWNoIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzIHRoZSBvbmUgdGhhdAorICogaXMgZXhhbWluZWQuIFRoZSBEQl8qIGRlZmluZXMgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZXNlIHNlY29uZCBjaGFyYWN0ZXJzLgorICovCisjZGVmaW5lIERCX05PUk0JMQkvKiBub3JtYWwgYXJndW1lbnQgKi8KKyNkZWZpbmUgREJfT1IJMgkvKiB8fCAtPiAtbyBjb252ZXJzaW9uICovCisjZGVmaW5lIERCX0FORAkzCS8qICYmIC0+IC1hIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgREJfQkUJNAkvKiBhbiBpbnNlcnRlZCAtQkUgKi8KKyNkZWZpbmUgREJfUEFUCTUJLyogYSBwYXR0ZXJuIGFyZ3VtZW50ICovCisKKyNkZWZpbmUgWF9FWFRSQQk4CS8qIHRoaXMgbWFueSBleHRyYSBieXRlcyBpbiBYIHN0cmluZyAqLworCit0eXBlZGVmIHN0cnVjdCBYU3RyaW5nIHsKKwljaGFyICplbmQsICpiZWc7CS8qIGVuZCwgYmVnaW4gb2Ygc3RyaW5nICovCisJc2l6ZV90IGxlbjsJCS8qIGxlbmd0aCAqLworCUFyZWEgKmFyZWFwOwkJLyogYXJlYSB0byBhbGxvY2F0ZS9mcmVlIGZyb20gKi8KK30gWFN0cmluZzsKKwordHlwZWRlZiBjaGFyICpYU3RyaW5nUDsKKworLyogaW5pdGlhbGlzZSBleHBhbmRhYmxlIHN0cmluZyAqLworI2RlZmluZSBYaW5pdE4oeHMsIGxlbmd0aCwgYXJlYSkgZG8gewkJCQlcCisJKHhzKS5sZW4gPSAobGVuZ3RoKTsJCQkJCVwKKwkoeHMpLmFyZWFwID0gKGFyZWEpOwkJCQkJXAorCSh4cykuYmVnID0gYWxsb2MoKHhzKS5sZW4gKyBYX0VYVFJBLCAoeHMpLmFyZWFwKTsJXAorCSh4cykuZW5kID0gKHhzKS5iZWcgKyAoeHMpLmxlbjsJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZGVmaW5lIFhpbml0KHhzLCB4cCwgbGVuZ3RoLCBhcmVhKSBkbyB7CQkJXAorCVhpbml0TigoeHMpLCAobGVuZ3RoKSwgKGFyZWEpKTsJCQkJXAorCSh4cCkgPSAoeHMpLmJlZzsJCQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorCisvKiBzdHVmZiBjaGFyIGludG8gc3RyaW5nICovCisjZGVmaW5lIFhwdXQoeHMsIHhwLCBjKQkoKnhwKysgPSAoYykpCisKKy8qIGNoZWNrIGlmIHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJ5dGVzIGxlZnQgKi8KKyNkZWZpbmUgWGNoZWNrTih4cywgeHAsIG4pIGRvIHsJCQkJCVwKKwlpbnQgbW9yZSA9ICgoeHApICsgKG4pKSAtICh4cykuZW5kOwkJCVwKKwlpZiAobW9yZSA+IDApCQkJCQkJXAorCQkoeHApID0gWGNoZWNrX2dyb3dfKCYoeHMpLCAoeHApLCBtb3JlKTsJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorCisvKiBjaGVjayBmb3Igb3ZlcmZsb3csIGV4cGFuZCBzdHJpbmcgKi8KKyNkZWZpbmUgWGNoZWNrKHhzLCB4cCkJWGNoZWNrTigoeHMpLCAoeHApLCAxKQorCisvKiBmcmVlIHN0cmluZyAqLworI2RlZmluZSBYZnJlZSh4cywgeHApCWFmcmVlKCh4cykuYmVnLCAoeHMpLmFyZWFwKQorCisvKiBjbG9zZSwgcmV0dXJuIHN0cmluZyAqLworI2RlZmluZSBYY2xvc2UoeHMsIHhwKQlhcmVzaXplKCh4cykuYmVnLCAoeHApIC0gKHhzKS5iZWcsICh4cykuYXJlYXApCisKKy8qIGJlZ2luIG9mIHN0cmluZyAqLworI2RlZmluZSBYc3RyaW5nKHhzLCB4cCkJKCh4cykuYmVnKQorCisjZGVmaW5lIFhubGVmdCh4cywgeHApCSgoeHMpLmVuZCAtICh4cCkpCS8qIG1heSBiZSBsZXNzIHRoYW4gMCAqLworI2RlZmluZSBYbGVuZ3RoKHhzLCB4cCkJKCh4cCkgLSAoeHMpLmJlZykKKyNkZWZpbmUgWHNpemUoeHMsIHhwKQkoKHhzKS5lbmQgLSAoeHMpLmJlZykKKyNkZWZpbmUgWHNhdmVwb3MoeHMsIHhwKQkoKHhwKSAtICh4cykuYmVnKQorI2RlZmluZSBYcmVzdHBvcyh4cywgeHAsIG4pCSgoeHMpLmJlZyArIChuKSkKKworY2hhciAqWGNoZWNrX2dyb3dfKFhTdHJpbmcgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQpOworCisvKgorICogZXhwYW5kYWJsZSB2ZWN0b3Igb2YgZ2VuZXJpYyBwb2ludGVycworICovCisKK3R5cGVkZWYgc3RydWN0IFhQdHJWIHsKKwl2b2lkICoqY3VyOwkJLyogbmV4dCBhdmFpbCBwb2ludGVyICovCisJdm9pZCAqKmJlZywgKiplbmQ7CS8qIGJlZ2luLCBlbmQgb2YgdmVjdG9yICovCit9IFhQdHJWOworCisjZGVmaW5lIFhQaW5pdCh4LCBuKSBkbyB7CQkJCQlcCisJdm9pZCAqKnZwX187CQkJCQkJXAorCXZwX18gPSBhbGxvYygobikgKiBzaXplb2Yodm9pZCAqKSwgQVRFTVApOwkJXAorCSh4KS5jdXIgPSAoeCkuYmVnID0gdnBfXzsJCQkJXAorCSh4KS5lbmQgPSB2cF9fICsgKG4pOwkJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisKKyNkZWZpbmUgWFBwdXQoeCwgcCkgZG8gewkJCQkJXAorCWlmICgoeCkuY3VyID49ICh4KS5lbmQpIHsJCQkJXAorCQlzaXplX3QgbiA9IFhQc2l6ZSh4KTsJCQkJXAorCQkoeCkuYmVnID0gYXJlc2l6ZSgoeCkuYmVnLAkJCVwKKwkJICAgIG4gKiAyICogc2l6ZW9mKHZvaWQgKiksIEFURU1QKTsJCVwKKwkJKHgpLmN1ciA9ICh4KS5iZWcgKyBuOwkJCQlcCisJCSh4KS5lbmQgPSAoeCkuY3VyICsgbjsJCQkJXAorCX0JCQkJCQkJXAorCSooeCkuY3VyKysgPSAocCk7CQkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKworI2RlZmluZSBYUHB0cnYoeCkJKCh4KS5iZWcpCisjZGVmaW5lIFhQc2l6ZSh4KQkoKHgpLmN1ciAtICh4KS5iZWcpCisjZGVmaW5lIFhQY2xvc2UoeCkJYXJlc2l6ZSgoeCkuYmVnLCBYUHNpemUoeCkgKiBzaXplb2Yodm9pZCAqKSwgQVRFTVApCisjZGVmaW5lIFhQZnJlZSh4KQlhZnJlZSgoeCkuYmVnLCBBVEVNUCkKKworI2RlZmluZSBJREVOVAk2NAorCit0eXBlZGVmIHN0cnVjdCBzb3VyY2UgU291cmNlOworc3RydWN0IHNvdXJjZSB7CisJY29uc3QgY2hhciAqc3RyOwkvKiBpbnB1dCBwb2ludGVyICovCisJY29uc3QgY2hhciAqc3RhcnQ7CS8qIHN0YXJ0IG9mIGN1cnJlbnQgYnVmZmVyICovCisJdW5pb24geworCQljb25zdCBjaGFyICoqc3RydjsJLyogc3RyaW5nIFtdICovCisJCXN0cnVjdCBzaGYgKnNoZjsJLyogc2hlbGwgZmlsZSAqLworCQlzdHJ1Y3QgdGJsICp0YmxwOwkvKiBhbGlhcyAoU0ZfSEFTQUxJQVMpICovCisJCWNoYXIgKmZyZWVtZTsJCS8qIGFsc28gZm9yIFNSRVJFQUQgKi8KKwl9IHU7CisJY29uc3QgY2hhciAqZmlsZTsJLyogaW5wdXQgZmlsZSBuYW1lICovCisJaW50CXR5cGU7CQkvKiBpbnB1dCB0eXBlICovCisJaW50CWxpbmU7CQkvKiBsaW5lIG51bWJlciAqLworCWludAllcnJsaW5lOwkvKiBsaW5lIHRoZSBlcnJvciBvY2N1cnJlZCBvbiAoMCBpZiBub3Qgc2V0KSAqLworCWludAlmbGFnczsJCS8qIFNGXyogKi8KKwlBcmVhCSphcmVhcDsKKwlTb3VyY2UgKm5leHQ7CQkvKiBzdGFja2VkIHNvdXJjZSAqLworCVhTdHJpbmcJeHM7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwljaGFyCXVnYnVmWzJdOwkvKiBidWZmZXIgZm9yIHVuZ2V0c2MoKSAoU1JFUkVBRCkgYW5kCisJCQkJICogYWxpYXMgKFNBTElBUykgKi8KK307CisKKy8qIFNvdXJjZS50eXBlIHZhbHVlcyAqLworI2RlZmluZSBTRU9GCQkwCS8qIGlucHV0IEVPRiAqLworI2RlZmluZSBTRklMRQkJMQkvKiBmaWxlIGlucHV0ICovCisjZGVmaW5lIFNTVERJTgkJMgkvKiByZWFkIHN0ZGluICovCisjZGVmaW5lIFNTVFJJTkcJCTMJLyogc3RyaW5nICovCisjZGVmaW5lIFNXU1RSCQk0CS8qIHN0cmluZyB3aXRob3V0IFxuICovCisjZGVmaW5lIFNXT1JEUwkJNQkvKiBzdHJpbmdbXSAqLworI2RlZmluZSBTV09SRFNFUAk2CS8qIHN0cmluZ1tdIHNlcGFyYXRvciAqLworI2RlZmluZSBTQUxJQVMJCTcJLyogYWxpYXMgZXhwYW5zaW9uICovCisjZGVmaW5lIFNSRVJFQUQJCTgJLyogcmVhZCBhaGVhZCB0byBiZSByZS1zY2FubmVkICovCisKKy8qIFNvdXJjZS5mbGFncyB2YWx1ZXMgKi8KKyNkZWZpbmUgU0ZfRUNITwkJQklUKDApCS8qIGVjaG8gaW5wdXQgdG8gc2hsb3V0ICovCisjZGVmaW5lIFNGX0FMSUFTCUJJVCgxKQkvKiBmYWtpbmcgc3BhY2UgYXQgZW5kIG9mIGFsaWFzICovCisjZGVmaW5lIFNGX0FMSUFTRU5ECUJJVCgyKQkvKiBmYWtpbmcgc3BhY2UgYXQgZW5kIG9mIGFsaWFzICovCisjZGVmaW5lIFNGX1RUWQkJQklUKDMpCS8qIHR5cGUgPT0gU1NURElOICYgaXQgaXMgYSB0dHkgKi8KKyNkZWZpbmUgU0ZfRklSU1QJQklUKDQpCS8qIGluaXRpYWwgc3RhdGUgKHRvIGlnbm9yZSBVVEYtOCBCT00pICovCisjZGVmaW5lIFNGX0hBU0FMSUFTCUJJVCg1KQkvKiB1LnRibHAgdmFsaWQgKFNBTElBUywgU0VPRikgKi8KKwordHlwZWRlZiB1bmlvbiB7CisJaW50IGk7CisJY2hhciAqY3A7CisJY2hhciAqKndwOworCXN0cnVjdCBvcCAqbzsKKwlzdHJ1Y3QgaW93b3JkICppb3A7Cit9IFlZU1RZUEU7CisKKy8qIElmIHNvbWV0aGluZyBpcyBhZGRlZCBoZXJlLCBhZGQgaXQgdG8gdG9rZW50YWJbXSBpbiBzeW4uYyBhcyB3ZWxsICovCisjZGVmaW5lIExXT1JECQkyNTYKKyNkZWZpbmUgTE9HQU5ECQkyNTcJLyogJiYgKi8KKyNkZWZpbmUgTE9HT1IJCTI1OAkvKiB8fCAqLworI2RlZmluZSBCUkVBSwkJMjU5CS8qIDs7ICovCisjZGVmaW5lIElGCQkyNjAKKyNkZWZpbmUgVEhFTgkJMjYxCisjZGVmaW5lIEVMU0UJCTI2MgorI2RlZmluZSBFTElGCQkyNjMKKyNkZWZpbmUgRkkJCTI2NAorI2RlZmluZSBDQVNFCQkyNjUKKyNkZWZpbmUgRVNBQwkJMjY2CisjZGVmaW5lIEZPUgkJMjY3CisjZGVmaW5lIFNFTEVDVAkJMjY4CisjZGVmaW5lIFdISUxFCQkyNjkKKyNkZWZpbmUgVU5USUwJCTI3MAorI2RlZmluZSBETwkJMjcxCisjZGVmaW5lIERPTkUJCTI3MgorI2RlZmluZSBJTgkJMjczCisjZGVmaW5lIEZVTkNUSU9OCTI3NAorI2RlZmluZSBUSU1FCQkyNzUKKyNkZWZpbmUgUkVESVIJCTI3NgorI2RlZmluZSBNRFBBUkVOCQkyNzcJLyogKCggKSkgKi8KKyNkZWZpbmUgQkFORwkJMjc4CS8qICEgKi8KKyNkZWZpbmUgREJSQUNLRVQJMjc5CS8qIFtbIC4uIF1dICovCisjZGVmaW5lIENPUFJPQwkJMjgwCS8qIHwmICovCisjZGVmaW5lIFlZRVJSQ09ERQkzMDAKKworLyogZmxhZ3MgdG8geXlsZXggKi8KKyNkZWZpbmUgQ09OVElOCQlCSVQoMCkJLyogc2tpcCBuZXcgbGluZXMgdG8gY29tcGxldGUgY29tbWFuZCAqLworI2RlZmluZSBPTkVXT1JECQlCSVQoMSkJLyogc2luZ2xlIHdvcmQgZm9yIHN1YnN0aXR1dGUoKSAqLworI2RlZmluZSBBTElBUwkJQklUKDIpCS8qIHJlY29nbmlzZSBhbGlhcyAqLworI2RlZmluZSBLRVlXT1JECQlCSVQoMykJLyogcmVjb2duaXNlIGtleXdvcmRzICovCisjZGVmaW5lIExFVEVYUFIJCUJJVCg0KQkvKiBnZXQgZXhwcmVzc2lvbiBpbnNpZGUgKCggKSkgKi8KKyNkZWZpbmUgVkFSQVNOCQlCSVQoNSkJLyogY2hlY2sgZm9yIHZhcj13b3JkICovCisjZGVmaW5lIEFSUkFZVkFSCUJJVCg2KQkvKiBwYXJzZSB4WzEgJiAyXSBhcyBvbmUgd29yZCAqLworI2RlZmluZSBFU0FDT05MWQlCSVQoNykJLyogb25seSBhY2NlcHQgZXNhYyBrZXl3b3JkICovCisjZGVmaW5lIENNRFdPUkQJCUJJVCg4KQkvKiBwYXJzaW5nIHNpbXBsZSBjb21tYW5kIChhbGlhcyByZWxhdGVkKSAqLworI2RlZmluZSBIRVJFREVMSU0JQklUKDkpCS8qIHBhcnNpbmcgPDwsPDwtIGRlbGltaXRlciAqLworI2RlZmluZSBMUUNIQVIJCUJJVCgxMCkJLyogc291cmNlIHN0cmluZyBjb250YWlucyBRQ0hBUiAqLworI2RlZmluZSBIRVJFRE9DCQlCSVQoMTEpCS8qIHBhcnNpbmcgYSBoZXJlIGRvY3VtZW50ICovCisjZGVmaW5lIExFVEFSUkFZCUJJVCgxMikJLyogY29weSBleHByZXNzaW9uIGluc2lkZSA9KCApICovCisKKyNkZWZpbmUgSEVSRVMJMTAJCS8qIG1heCA8PCBpbiBsaW5lICovCisKKyN1bmRlZiBDVFJMCisjZGVmaW5lCUNUUkwoeCkJCSgoeCkgPT0gJz8nID8gMHg3RiA6ICh4KSAmIDB4MUYpCS8qIEFTQ0lJICovCisjZGVmaW5lCVVOQ1RSTCh4KQkoKHgpIF4gMHg0MCkJCQkJLyogQVNDSUkgKi8KKworRVhURVJOIFNvdXJjZSAqc291cmNlOwkJLyogeXlwYXJzZS95eWxleCBzb3VyY2UgKi8KK0VYVEVSTiBZWVNUWVBFCXl5bHZhbDsJCS8qIHJlc3VsdCBmcm9tIHl5bGV4ICovCitFWFRFUk4gc3RydWN0IGlvd29yZCAqaGVyZXMgW0hFUkVTXSwgKipoZXJlcDsKK0VYVEVSTiBjaGFyCWlkZW50IFtJREVOVCsxXTsKKworI2RlZmluZSBISVNUT1JZU0laRQk1MDAJLyogc2l6ZSBvZiBzYXZlZCBoaXN0b3J5ICovCisKK0VYVEVSTiBjaGFyICoqaGlzdG9yeTsJLyogc2F2ZWQgY29tbWFuZHMgKi8KK0VYVEVSTiBjaGFyICoqaGlzdHB0cjsJLyogbGFzdCBoaXN0b3J5IGl0ZW0gKi8KK0VYVEVSTiBpbnQgaGlzdHNpemU7CS8qIGhpc3Rvcnkgc2l6ZSAqLworCisvKiB1c2VyIGFuZCBzeXN0ZW0gdGltZSBvZiBsYXN0IGpfd2FpdGplZCBqb2IgKi8KK0VYVEVSTiBzdHJ1Y3QgdGltZXZhbCBqX3VzcnRpbWUsIGpfc3lzdGltZTsKKworLyogbGFsbG9jLmMgKi8KK3ZvaWQgYWluaXQoQXJlYSAqKTsKK3ZvaWQgYWZyZWVhbGwoQXJlYSAqKTsKKy8qIHRoZXNlIGNhbm5vdCBmYWlsIGFuZCBjYW4gdGFrZSBOVUxMIChub3QgZm9yIGFwKSAqLworI2RlZmluZSBhbGxvYyhuLCBhcCkJYXJlc2l6ZShOVUxMLCAobiksIChhcCkpCit2b2lkICphcmVzaXplKHZvaWQgKiwgc2l6ZV90LCBBcmVhICopOwordm9pZCBhZnJlZSh2b2lkICosIEFyZWEgKik7CS8qIGNhbiB0YWtlIE5VTEwgKi8KKy8qIGVkaXQuYyAqLworI2lmbmRlZiBNS1NIX1NNQUxMCitpbnQgeF9iaW5kKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKKyNlbHNlCitpbnQgeF9iaW5kKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKKyNlbmRpZgordm9pZCB4X2luaXQodm9pZCk7CitpbnQgeF9yZWFkKGNoYXIgKiwgc2l6ZV90KTsKKy8qIGV2YWwuYyAqLworY2hhciAqc3Vic3RpdHV0ZShjb25zdCBjaGFyICosIGludCk7CitjaGFyICoqZXZhbChjb25zdCBjaGFyICoqLCBpbnQpOworY2hhciAqZXZhbHN0cihjb25zdCBjaGFyICpjcCwgaW50KTsKK2NoYXIgKmV2YWxvbmVzdHIoY29uc3QgY2hhciAqY3AsIGludCk7CitjaGFyICpkZWJ1bmsoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Cit2b2lkIGV4cGFuZChjb25zdCBjaGFyICosIFhQdHJWICosIGludCk7CitpbnQgZ2xvYl9zdHIoY2hhciAqLCBYUHRyViAqLCBpbnQpOworLyogZXhlYy5jICovCitpbnQgZXhlY3V0ZShzdHJ1Y3Qgb3AgKiB2b2xhdGlsZSwgdm9sYXRpbGUgaW50LCB2b2xhdGlsZSBpbnQgKiB2b2xhdGlsZSk7CitpbnQgc2hjb21leGVjKGNvbnN0IGNoYXIgKiopOworc3RydWN0IHRibCAqZmluZGZ1bmMoY29uc3QgY2hhciAqLCB1aW50MzJfdCwgYm9vbCk7CitpbnQgZGVmaW5lKGNvbnN0IGNoYXIgKiwgc3RydWN0IG9wICopOwordm9pZCBidWlsdGluKGNvbnN0IGNoYXIgKiwgaW50ICgqKShjb25zdCBjaGFyICoqKSk7CitzdHJ1Y3QgdGJsICpmaW5kY29tKGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQgZmx1c2hjb20oaW50KTsKK2NvbnN0IGNoYXIgKnNlYXJjaChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQgKik7CitpbnQgc2VhcmNoX2FjY2Vzcyhjb25zdCBjaGFyICosIGludCwgaW50ICopOworaW50IHByX21lbnUoY29uc3QgY2hhciAqIGNvbnN0ICopOworaW50IHByX2xpc3QoY2hhciAqIGNvbnN0ICopOworLyogZXhwci5jICovCitpbnQgZXZhbHVhdGUoY29uc3QgY2hhciAqLCBta3NoX2FyaV90ICosIGludCwgYm9vbCk7CitpbnQgdl9ldmFsdWF0ZShzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKiwgdm9sYXRpbGUgaW50LCBib29sKTsKKy8qIFVURi04IHN0dWZmICovCitzaXplX3QgdXRmX21idG93Yyh1bnNpZ25lZCBpbnQgKiwgY29uc3QgY2hhciAqKTsKK3NpemVfdCB1dGZfd2N0b21iKGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK2ludCB1dGZfd2lkdGhhZGooY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqKTsKK2ludCB1dGZfbWJzd2lkdGgoY29uc3QgY2hhciAqKTsKK2NvbnN0IGNoYXIgKnV0Zl9za2lwY29scyhjb25zdCBjaGFyICosIGludCk7CitzaXplX3QgdXRmX3B0cmFkaihjb25zdCBjaGFyICopOworI2lmbmRlZiBNS1NIX21pcmJzZF93Y3dpZHRoCitpbnQgdXRmX3djd2lkdGgodW5zaWduZWQgaW50KTsKKyNlbmRpZgorLyogZnVuY3MuYyAqLworaW50IGNfaGFzaChjb25zdCBjaGFyICoqKTsKK2ludCBjX2NkKGNvbnN0IGNoYXIgKiopOworaW50IGNfcHdkKGNvbnN0IGNoYXIgKiopOworaW50IGNfcHJpbnQoY29uc3QgY2hhciAqKik7CisjaWZkZWYgTUtTSF9QUklOVEZfQlVJTFRJTgoraW50IGNfcHJpbnRmKGNvbnN0IGNoYXIgKiopOworI2VuZGlmCitpbnQgY193aGVuY2UoY29uc3QgY2hhciAqKik7CitpbnQgY19jb21tYW5kKGNvbnN0IGNoYXIgKiopOworaW50IGNfdHlwZXNldChjb25zdCBjaGFyICoqKTsKK2ludCBjX2FsaWFzKGNvbnN0IGNoYXIgKiopOworaW50IGNfdW5hbGlhcyhjb25zdCBjaGFyICoqKTsKK2ludCBjX2xldChjb25zdCBjaGFyICoqKTsKK2ludCBjX2pvYnMoY29uc3QgY2hhciAqKik7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAoraW50IGNfZmdiZyhjb25zdCBjaGFyICoqKTsKKyNlbmRpZgoraW50IGNfa2lsbChjb25zdCBjaGFyICoqKTsKK3ZvaWQgZ2V0b3B0c19yZXNldChpbnQpOworaW50IGNfZ2V0b3B0cyhjb25zdCBjaGFyICoqKTsKK2ludCBjX2JpbmQoY29uc3QgY2hhciAqKik7CitpbnQgY19sYWJlbChjb25zdCBjaGFyICoqKTsKK2ludCBjX3NoaWZ0KGNvbnN0IGNoYXIgKiopOworaW50IGNfdW1hc2soY29uc3QgY2hhciAqKik7CitpbnQgY19kb3QoY29uc3QgY2hhciAqKik7CitpbnQgY193YWl0KGNvbnN0IGNoYXIgKiopOworaW50IGNfcmVhZChjb25zdCBjaGFyICoqKTsKK2ludCBjX2V2YWwoY29uc3QgY2hhciAqKik7CitpbnQgY190cmFwKGNvbnN0IGNoYXIgKiopOworaW50IGNfYnJrY29udChjb25zdCBjaGFyICoqKTsKK2ludCBjX2V4aXRyZXR1cm4oY29uc3QgY2hhciAqKik7CitpbnQgY19zZXQoY29uc3QgY2hhciAqKik7CitpbnQgY191bnNldChjb25zdCBjaGFyICoqKTsKK2ludCBjX3VsaW1pdChjb25zdCBjaGFyICoqKTsKK2ludCBjX3RpbWVzKGNvbnN0IGNoYXIgKiopOworaW50IHRpbWV4KHN0cnVjdCBvcCAqLCBpbnQsIHZvbGF0aWxlIGludCAqKTsKK3ZvaWQgdGltZXhfaG9vayhzdHJ1Y3Qgb3AgKiwgY2hhciAqKiB2b2xhdGlsZSAqKTsKK2ludCBjX2V4ZWMoY29uc3QgY2hhciAqKik7CitpbnQgY19idWlsdGluKGNvbnN0IGNoYXIgKiopOworaW50IGNfdGVzdChjb25zdCBjaGFyICoqKTsKKyNpZiBIQVZFX01LTk9ECitpbnQgY19ta25vZChjb25zdCBjaGFyICoqKTsKKyNlbmRpZgoraW50IGNfcmVhbHBhdGgoY29uc3QgY2hhciAqKik7CitpbnQgY19yZW5hbWUoY29uc3QgY2hhciAqKik7CisvKiBoaXN0cmFwLmMgKi8KK3ZvaWQgaW5pdF9oaXN0dmVjKHZvaWQpOwordm9pZCBoaXN0X2luaXQoU291cmNlICopOworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCit2b2lkIGhpc3RfZmluaXNoKHZvaWQpOworI2VuZGlmCit2b2lkIGhpc3RzYXZlKGludCAqLCBjb25zdCBjaGFyICosIGJvb2wsIGJvb2wpOworI2lmICFkZWZpbmVkKE1LU0hfU01BTEwpICYmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCitib29sIGhpc3RzeW5jKHZvaWQpOworI2VuZGlmCitpbnQgY19mYyhjb25zdCBjaGFyICoqKTsKK3ZvaWQgc2V0aGlzdHNpemUoaW50KTsKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQordm9pZCBzZXRoaXN0ZmlsZShjb25zdCBjaGFyICopOworI2VuZGlmCitjaGFyICoqaGlzdHBvcyh2b2lkKTsKK2ludCBoaXN0bnVtKGludCk7CitpbnQgZmluZGhpc3QoaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBmaW5kaGlzdHJlbChjb25zdCBjaGFyICopOworY2hhciAqKmhpc3RfZ2V0X25ld2VzdChib29sKTsKK3ZvaWQgaW5pdHRyYXBzKHZvaWQpOwordm9pZCBhbGFybV9pbml0KHZvaWQpOworVHJhcCAqZ2V0dHJhcChjb25zdCBjaGFyICosIGludCk7Cit2b2lkIHRyYXBzaWcoaW50KTsKK3ZvaWQgaW50cmNoZWNrKHZvaWQpOworaW50IGZhdGFsX3RyYXBfY2hlY2sodm9pZCk7CitpbnQgdHJhcF9wZW5kaW5nKHZvaWQpOwordm9pZCBydW50cmFwcyhpbnQgaW50cik7Cit2b2lkIHJ1bnRyYXAoVHJhcCAqKTsKK3ZvaWQgY2xlYXJ0cmFwcyh2b2lkKTsKK3ZvaWQgcmVzdG9yZXNpZ3Modm9pZCk7Cit2b2lkIHNldHRyYXAoVHJhcCAqLCBjb25zdCBjaGFyICopOworaW50IGJsb2NrX3BpcGUodm9pZCk7Cit2b2lkIHJlc3RvcmVfcGlwZShpbnQpOworaW50IHNldHNpZyhUcmFwICosIHNpZ190LCBpbnQpOwordm9pZCBzZXRleGVjc2lnKFRyYXAgKiwgaW50KTsKKy8qIGpvYnMuYyAqLwordm9pZCBqX2luaXQodm9pZCk7Cit2b2lkIGpfZXhpdCh2b2lkKTsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECit2b2lkIGpfY2hhbmdlKHZvaWQpOworI2VuZGlmCitpbnQgZXhjaGlsZChzdHJ1Y3Qgb3AgKiwgaW50LCB2b2xhdGlsZSBpbnQgKiwgaW50KTsKK3ZvaWQgc3RhcnRsYXN0KHZvaWQpOworaW50IHdhaXRsYXN0KHZvaWQpOworaW50IHdhaXRmb3IoY29uc3QgY2hhciAqLCBpbnQgKik7CitpbnQgal9raWxsKGNvbnN0IGNoYXIgKiwgaW50KTsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECitpbnQgal9yZXN1bWUoY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCitpbnQgal9qb2JzKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworaW50IGpfbmpvYnModm9pZCk7Cit2b2lkIGpfbm90aWZ5KHZvaWQpOworcGlkX3Qgal9hc3luYyh2b2lkKTsKK2ludCBqX3N0b3BwZWRfcnVubmluZyh2b2lkKTsKKy8qIGxleC5jICovCitpbnQgeXlsZXgoaW50KTsKK3ZvaWQgeXllcnJvcihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfTk9SRVRVUk4KKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7CitTb3VyY2UgKnB1c2hzKGludCwgQXJlYSAqKTsKK3ZvaWQgc2V0X3Byb21wdChpbnQsIFNvdXJjZSAqKTsKK3ZvaWQgcHByb21wdChjb25zdCBjaGFyICosIGludCk7CitpbnQgcHJvbXB0bGVuKGNvbnN0IGNoYXIgKik7CisvKiBtYWluLmMgKi8KK2ludCBpbmNsdWRlKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqLCBpbnQpOworaW50IGNvbW1hbmQoY29uc3QgY2hhciAqLCBpbnQpOworaW50IHNoZWxsKFNvdXJjZSAqdm9sYXRpbGUsIGludCB2b2xhdGlsZSk7Cit2b2lkIHVud2luZChpbnQpIE1LU0hfQV9OT1JFVFVSTjsKK3ZvaWQgbmV3ZW52KGludCk7Cit2b2lkIHF1aXRlbnYoc3RydWN0IHNoZiAqKTsKK3ZvaWQgY2xlYW51cF9wYXJlbnRzX2Vudih2b2lkKTsKK3ZvaWQgY2xlYW51cF9wcm9jX2Vudih2b2lkKTsKK3ZvaWQgZXJyb3JmKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9OT1JFVFVSTgorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK3ZvaWQgd2FybmluZ2YoYm9vbCwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDIsIDMpOwordm9pZCBiaV9lcnJvcmYoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOworI2RlZmluZSBlcnJvcmZ6KCkJZXJyb3JmKCJcMSIpCisjZGVmaW5lIGJpX2Vycm9yZnooKQliaV9lcnJvcmYoIlwxIikKK3ZvaWQgaW50ZXJuYWxfdmVycm9yZihjb25zdCBjaGFyICosIHZhX2xpc3QpCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDApOwordm9pZCBpbnRlcm5hbF9lcnJvcmYoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX05PUkVUVVJOCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwordm9pZCBpbnRlcm5hbF93YXJuaW5nZihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Cit2b2lkIGVycm9yX3ByZWZpeChib29sKTsKK3ZvaWQgc2hlbGxmKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK3ZvaWQgc2hwcmludGYoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOworaW50IGNhbl9zZWVrKGludCk7Cit2b2lkIGluaXRpbyh2b2lkKTsKK2ludCBrc2hfZHVwMihpbnQsIGludCwgYm9vbCk7CitzaG9ydCBzYXZlZmQoaW50KTsKK3ZvaWQgcmVzdGZkKGludCwgaW50KTsKK3ZvaWQgb3BlbnBpcGUoaW50ICopOwordm9pZCBjbG9zZXBpcGUoaW50ICopOworaW50IGNoZWNrX2ZkKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqKTsKK3ZvaWQgY29wcm9jX2luaXQodm9pZCk7Cit2b2lkIGNvcHJvY19yZWFkX2Nsb3NlKGludCk7Cit2b2lkIGNvcHJvY19yZWFkd19jbG9zZShpbnQpOwordm9pZCBjb3Byb2Nfd3JpdGVfY2xvc2UoaW50KTsKK2ludCBjb3Byb2NfZ2V0ZmQoaW50LCBjb25zdCBjaGFyICoqKTsKK3ZvaWQgY29wcm9jX2NsZWFudXAoaW50KTsKK3N0cnVjdCB0ZW1wICptYWtldGVtcChBcmVhICosIFRlbXBfdHlwZSwgc3RydWN0IHRlbXAgKiopOworI2RlZmluZSBoYXNoKHMpIG9hYXRoYXNoX2Z1bGwoKGNvbnN0IHVpbnQ4X3QgKikocykpCit1aW50MzJfdCBvYWF0aGFzaF9mdWxsKHJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QgKik7Cit1aW50MzJfdCBoYXNobWVtKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQga3Rpbml0KHN0cnVjdCB0YWJsZSAqLCBBcmVhICosIHNpemVfdCk7CitzdHJ1Y3QgdGJsICprdHNlYXJjaChzdHJ1Y3QgdGFibGUgKiwgY29uc3QgY2hhciAqLCB1aW50MzJfdCk7CitzdHJ1Y3QgdGJsICprdGVudGVyKHN0cnVjdCB0YWJsZSAqLCBjb25zdCBjaGFyICosIHVpbnQzMl90KTsKKyNkZWZpbmUga3RkZWxldGUocCkJZG8geyBwLT5mbGFnID0gMDsgfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCit2b2lkIGt0d2FsayhzdHJ1Y3QgdHN0YXRlICosIHN0cnVjdCB0YWJsZSAqKTsKK3N0cnVjdCB0YmwgKmt0bmV4dChzdHJ1Y3QgdHN0YXRlICopOworc3RydWN0IHRibCAqKmt0c29ydChzdHJ1Y3QgdGFibGUgKik7CisvKiBtaXNjLmMgKi8KK3ZvaWQgc2V0Y3R5cGVzKGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQgaW5pdGN0eXBlcyh2b2lkKTsKK3NpemVfdCBvcHRpb24oY29uc3QgY2hhciAqKTsKK2NoYXIgKmdldG9wdGlvbnModm9pZCk7Cit2b2lkIGNoYW5nZV9mbGFnKGVudW0gc2hfZmxhZywgaW50LCB1bnNpZ25lZCBpbnQpOworaW50IHBhcnNlX2FyZ3MoY29uc3QgY2hhciAqKiwgaW50LCBib29sICopOworaW50IGdldG4oY29uc3QgY2hhciAqLCBpbnQgKik7CitpbnQgYmlfZ2V0bihjb25zdCBjaGFyICosIGludCAqKTsKK2ludCBnbWF0Y2h4KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKK2ludCBoYXNfZ2xvYmJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworY29uc3QgdW5zaWduZWQgY2hhciAqcGF0X3NjYW4oY29uc3QgdW5zaWduZWQgY2hhciAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CitpbnQgeHN0cmNtcChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7Cit2b2lkIGtzaF9nZXRvcHRfcmVzZXQoR2V0b3B0ICosIGludCk7CitpbnQga3NoX2dldG9wdChjb25zdCBjaGFyICoqLCBHZXRvcHQgKiwgY29uc3QgY2hhciAqKTsKK3ZvaWQgcHJpbnRfdmFsdWVfcXVvdGVkKGNvbnN0IGNoYXIgKik7Cit2b2lkIHByaW50X2NvbHVtbnMoc3RydWN0IHNoZiAqLCBpbnQsCisgICAgY2hhciAqKCopKGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKiksCisgICAgY29uc3Qgdm9pZCAqLCBpbnQsIGludCwgYm9vbCk7Cit2b2lkIHN0cmlwX251bHMoY2hhciAqLCBpbnQpOworaW50IGJsb2NraW5nX3JlYWQoaW50LCBjaGFyICosIGludCkKKyAgICBNS1NIX0FfQk9VTkRFRChidWZmZXIsIDIsIDMpOworaW50IHJlc2V0X25vbmJsb2NrKGludCk7CitjaGFyICprc2hfZ2V0X3dkKHNpemVfdCAqKTsKK2ludCBtYWtlX3BhdGgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiosIFhTdHJpbmcgKiwgaW50ICopOwordm9pZCBzaW1wbGlmeV9wYXRoKGNoYXIgKik7Cit2b2lkIHNldF9jdXJyZW50X3dkKGNoYXIgKik7CisjaWZkZWYgTUtTSF9TTUFMTAorY2hhciAqc3RyZHVwXyhjb25zdCBjaGFyICosIEFyZWEgKik7CitjaGFyICpzdHJuZHVwXyhjb25zdCBjaGFyICosIHNpemVfdCwgQXJlYSAqKTsKKyNlbmRpZgoraW50IHVuYmtzbChib29sLCBpbnQgKCopKHZvaWQpLCB2b2lkICgqKShpbnQpKTsKKy8qIHNoZi5jICovCitzdHJ1Y3Qgc2hmICpzaGZfb3Blbihjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpOworc3RydWN0IHNoZiAqc2hmX2Zkb3BlbihpbnQsIGludCwgc3RydWN0IHNoZiAqKTsKK3N0cnVjdCBzaGYgKnNoZl9yZW9wZW4oaW50LCBpbnQsIHN0cnVjdCBzaGYgKik7CitzdHJ1Y3Qgc2hmICpzaGZfc29wZW4oY2hhciAqLCBpbnQsIGludCwgc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfY2xvc2Uoc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfZmRjbG9zZShzdHJ1Y3Qgc2hmICopOworY2hhciAqc2hmX3NjbG9zZShzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9mbHVzaChzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9yZWFkKGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOworY2hhciAqc2hmX2dldHNlKGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9nZXRjaGFyKHN0cnVjdCBzaGYgKnMpOworaW50IHNoZl91bmdldGMoaW50LCBzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9wdXRjaGFyKGludCwgc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfcHV0cyhjb25zdCBjaGFyICosIHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX3dyaXRlKGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9mcHJpbnRmKHN0cnVjdCBzaGYgKiwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDIsIDMpOworaW50IHNoZl9zbnByaW50ZihjaGFyICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDMsIDQpCisgICAgTUtTSF9BX0JPVU5ERUQoc3RyaW5nLCAxLCAyKTsKK2NoYXIgKnNoZl9zbXByaW50Zihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7CitpbnQgc2hmX3ZmcHJpbnRmKHN0cnVjdCBzaGYgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAyLCAwKTsKKy8qIHN5bi5jICovCit2b2lkIGluaXRrZXl3b3Jkcyh2b2lkKTsKK3N0cnVjdCBvcCAqY29tcGlsZShTb3VyY2UgKik7CisvKiB0cmVlLmMgKi8KK2ludCBmcHRyZWVmKHN0cnVjdCBzaGYgKiwgaW50LCBjb25zdCBjaGFyICosIC4uLik7CitjaGFyICpzbnB0cmVlZihjaGFyICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pOworc3RydWN0IG9wICp0Y29weShzdHJ1Y3Qgb3AgKiwgQXJlYSAqKTsKK2NoYXIgKndkY29weShjb25zdCBjaGFyICosIEFyZWEgKik7Citjb25zdCBjaGFyICp3ZHNjYW4oY29uc3QgY2hhciAqLCBpbnQpOworY2hhciAqd2RzdHJpcChjb25zdCBjaGFyICosIGJvb2wsIGJvb2wpOwordm9pZCB0ZnJlZShzdHJ1Y3Qgb3AgKiwgQXJlYSAqKTsKKy8qIHZhci5jICovCit2b2lkIG5ld2Jsb2NrKHZvaWQpOwordm9pZCBwb3BibG9jayh2b2lkKTsKK3ZvaWQgaW5pdHZhcih2b2lkKTsKK3N0cnVjdCB0YmwgKmdsb2JhbChjb25zdCBjaGFyICopOworc3RydWN0IHRibCAqbG9jYWwoY29uc3QgY2hhciAqLCBib29sKTsKK2NoYXIgKnN0cl92YWwoc3RydWN0IHRibCAqKTsKK2ludCBzZXRzdHIoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICosIGludCk7CitzdHJ1Y3QgdGJsICpzZXRpbnRfdihzdHJ1Y3QgdGJsICosIHN0cnVjdCB0YmwgKiwgYm9vbCk7Cit2b2lkIHNldGludChzdHJ1Y3QgdGJsICosIG1rc2hfYXJpX3QpOworc3RydWN0IHRibCAqdHlwZXNldChjb25zdCBjaGFyICosIFRmbGFnLCBUZmxhZywgaW50LCBpbnQpCisgICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDEpKSk7Cit2b2lkIHVuc2V0KHN0cnVjdCB0YmwgKiwgaW50KTsKK2NvbnN0IGNoYXIgKnNraXBfdmFybmFtZShjb25zdCBjaGFyICosIGludCk7Citjb25zdCBjaGFyICpza2lwX3dkdmFybmFtZShjb25zdCBjaGFyICosIGludCk7CitpbnQgaXNfd2R2YXJuYW1lKGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBpc193ZHZhcmFzc2lnbihjb25zdCBjaGFyICopOworY2hhciAqKm1ha2Vudih2b2lkKTsKK3ZvaWQgY2hhbmdlX3JhbmRvbShjb25zdCB2b2lkICosIHNpemVfdCk7Cit2b2lkIGNoYW5nZV93aW5zeih2b2lkKTsKK2ludCBhcnJheV9yZWZfbGVuKGNvbnN0IGNoYXIgKik7CitjaGFyICphcnJheW5hbWUoY29uc3QgY2hhciAqKTsKK21rc2hfdWFyaV90IHNldF9hcnJheShjb25zdCBjaGFyICosIGJvb2wsIGNvbnN0IGNoYXIgKiopOworCitlbnVtIFRlc3Rfb3AgeworCVRPX05PTk9QID0gMCwJLyogbm9uLW9wZXJhdG9yICovCisJLyogdW5hcnkgb3BlcmF0b3JzICovCisJVE9fU1ROWkUsIFRPX1NUWkVSLCBUT19PUFRJT04sCisJVE9fRklMQVhTVCwKKwlUT19GSUxFWFNULAorCVRPX0ZJTFJFRywgVE9fRklMQkRFViwgVE9fRklMQ0RFViwgVE9fRklMU1lNLCBUT19GSUxGSUZPLCBUT19GSUxTT0NLLAorCVRPX0ZJTENERiwgVE9fRklMSUQsIFRPX0ZJTEdJRCwgVE9fRklMU0VURywgVE9fRklMU1RDSywgVE9fRklMVUlELAorCVRPX0ZJTFJELCBUT19GSUxHWiwgVE9fRklMVFQsIFRPX0ZJTFNFVFUsIFRPX0ZJTFdSLCBUT19GSUxFWCwKKwkvKiBiaW5hcnkgb3BlcmF0b3JzICovCisJVE9fU1RFUUwsIFRPX1NUTkVRLCBUT19TVExULCBUT19TVEdULCBUT19JTlRFUSwgVE9fSU5UTkUsIFRPX0lOVEdULAorCVRPX0lOVEdFLCBUT19JTlRMVCwgVE9fSU5UTEUsIFRPX0ZJTEVRLCBUT19GSUxOVCwgVE9fRklMT1QsCisJLyogbm90IGFuIG9wZXJhdG9yICovCisJVE9fTk9OTlVMTAkvKiAhVE9fTk9OT1AgKi8KK307Cit0eXBlZGVmIGVudW0gVGVzdF9vcCBUZXN0X29wOworCisvKiBVc2VkIGJ5IFRlc3RfZW52LmlzYSgpIChvcmRlciBpbXBvcnRhbnQgLSB1c2VkIHRvIGluZGV4ICpfdG9rZW5zW10gYXJyYXlzKSAqLworZW51bSBUZXN0X21ldGEgeworCVRNX09SLAkJLyogLW8gb3IgfHwgKi8KKwlUTV9BTkQsCQkvKiAtYSBvciAmJiAqLworCVRNX05PVCwJCS8qICEgKi8KKwlUTV9PUEFSRU4sCS8qICggKi8KKwlUTV9DUEFSRU4sCS8qICkgKi8KKwlUTV9VTk9QLAkvKiB1bmFyeSBvcGVyYXRvciAqLworCVRNX0JJTk9QLAkvKiBiaW5hcnkgb3BlcmF0b3IgKi8KKwlUTV9FTkQJCS8qIGVuZCBvZiBpbnB1dCAqLworfTsKK3R5cGVkZWYgZW51bSBUZXN0X21ldGEgVGVzdF9tZXRhOworCisjZGVmaW5lIFRFRl9FUlJPUglCSVQoMCkJCS8qIHNldCBpZiB3ZSd2ZSBoaXQgYW4gZXJyb3IgKi8KKyNkZWZpbmUgVEVGX0RCUkFDS0VUCUJJVCgxKQkJLyogc2V0IGlmIFtbIC4uIF1dIHRlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdGVzdF9lbnYgeworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqKndwOy8qIHVzZWQgYnkgcHRlc3RfKiAqLworCQlYUHRyViAqYXY7CS8qIHVzZWQgYnkgZGJ0ZXN0cF8qICovCisJfSBwb3M7CisJY29uc3QgY2hhciAqKndwX2VuZDsJLyogdXNlZCBieSBwdGVzdF8qICovCisJVGVzdF9vcCAoKmlzYSkoc3RydWN0IHRlc3RfZW52ICosIFRlc3RfbWV0YSk7CisJY29uc3QgY2hhciAqKCpnZXRvcG5kKSAoc3RydWN0IHRlc3RfZW52ICosIFRlc3Rfb3AsIGJvb2wpOworCWludCAoKmV2YWwpKHN0cnVjdCB0ZXN0X2VudiAqLCBUZXN0X29wLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7CisJdm9pZCAoKmVycm9yKShzdHJ1Y3QgdGVzdF9lbnYgKiwgaW50LCBjb25zdCBjaGFyICopOworCWludCBmbGFnczsJCS8qIFRFRl8qICovCit9IFRlc3RfZW52OworCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZGJ0ZXN0X3Rva2Vuc1tdOworCitUZXN0X29wCXRlc3RfaXNvcChUZXN0X21ldGEsIGNvbnN0IGNoYXIgKik7CitpbnQgdGVzdF9ldmFsKFRlc3RfZW52ICosIFRlc3Rfb3AsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sKTsKK2ludCB0ZXN0X3BhcnNlKFRlc3RfZW52ICopOworCitFWFRFUk4gaW50IHR0eV9mZCBJX18oLTEpOwkvKiBkdXAnZCB0dHkgZmlsZSBkZXNjcmlwdG9yICovCitFWFRFUk4gaW50IHR0eV9kZXZ0dHk7CQkvKiB0cnVlIGlmIHR0eV9mZCBpcyBmcm9tIC9kZXYvdHR5ICovCitFWFRFUk4gc3RydWN0IHRlcm1pb3MgdHR5X3N0YXRlOwkvKiBzYXZlZCB0dHkgc3RhdGUgKi8KKworZXh0ZXJuIHZvaWQgdHR5X2luaXQoYm9vbCwgYm9vbCk7CitleHRlcm4gdm9pZCB0dHlfY2xvc2Uodm9pZCk7CisKKy8qIGJlIHN1cmUgbm90IHRvIGludGVyZmVyZSB3aXRoIGFueW9uZSBlbHNlJ3MgaWRlYSBhYm91dCBFWFRFUk4gKi8KKyNpZmRlZiBFWFRFUk5fREVGSU5FRAorIyB1bmRlZiBFWFRFUk5fREVGSU5FRAorIyB1bmRlZiBFWFRFUk4KKyNlbmRpZgorI3VuZGVmIElfXworCisjZW5kaWYgLyogIU1LU0hfSU5DTFVERVNfT05MWSAqLwpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvc2hfZmxhZ3MuaCBiL21rc2gvc3JjL3NoX2ZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1NDgxZQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL3NoX2ZsYWdzLmgKQEAgLTAsMCArMSwxNDUgQEAKKyNpZiBkZWZpbmVkKFNIRkxBR1NfREVGTlMpCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9zaF9mbGFncy5oLHYgMS43IDIwMTAvMDcvMTMgMTM6MDc6NTggdGcgRXhwICQiKTsKKyNkZWZpbmUgRk4oc25hbWUsY25hbWUsb2NoYXIsZmxhZ3MpCS8qIG5vdGhpbmcgKi8KKyNlbGlmIGRlZmluZWQoU0hGTEFHU19FTlVNUykKKyNkZWZpbmUgRk4oc25hbWUsY25hbWUsb2NoYXIsZmxhZ3MpCWNuYW1lLAorI2RlZmluZSBGMChzbmFtZSxjbmFtZSxvY2hhcixmbGFncykJY25hbWUgPSAwLAorI2VsaWYgZGVmaW5lZChTSEZMQUdTX0lURU1TKQorI2RlZmluZSBGTihzbmFtZSxjbmFtZSxvY2hhcixmbGFncykJeyBzbmFtZSwgb2NoYXIsIGZsYWdzIH0sCisjZW5kaWYKKworI2lmbmRlZiBGMAorI2RlZmluZSBGMCBGTgorI2VuZGlmCisKKy8qCisgKiBzcGVjaWFsIGNhc2VzIChzZWUgcGFyc2VfYXJncygpKTogLUEsIC1vLCAtcworICoKKyAqIG9wdGlvbnMgYXJlIHNvcnRlZCBieSB0aGVpciBsb25nbmFtZXMKKyAqLworCisvKiAtYQlhbGwgbmV3IHBhcmFtZXRlcnMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgZXhwb3J0IGF0dHJpYnV0ZSAqLworRjAoImFsbGV4cG9ydCIsIEZFWFBPUlQsICdhJywgT0ZfQU5ZKQorCisvKiAuLy4JYmFja3dhcmRzIGNvbXBhdDogZHVtbXksIGVtaXRzIGEgd2FybmluZyAqLworRk4oImFyYzRyYW5kb20iLCBGQVJDNFJBTkRPTSwgMCwgT0ZfQU5ZKQorCisjaWYgSEFWRV9OSUNFCisvKiAuLy4JYmduaWNlICovCitGTigiYmduaWNlIiwgRkJHTklDRSwgMCwgT0ZfQU5ZKQorI2VuZGlmCisKKy8qIC4vLgllbmFibGUge30gZ2xvYmJpbmcgKG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJicmFjZWV4cGFuZCIsIEZCUkFDRUVYUEFORCwgMCwgT0ZfQU5ZKQorCisvKiAuLy4JRW1hY3MgY29tbWFuZCBsaW5lIGVkaXRpbmcgbW9kZSAqLworRk4oImVtYWNzIiwgRkVNQUNTLCAwLCBPRl9BTlkpCisKKy8qIC1lCXF1aXQgb24gZXJyb3IgKi8KK0ZOKCJlcnJleGl0IiwgRkVSUkVYSVQsICdlJywgT0ZfQU5ZKQorCisvKiAuLy4JRW1hY3MgY29tbWFuZCBsaW5lIGVkaXRpbmcgbW9kZSwgZ21hY3MgdmFyaWFudCAqLworRk4oImdtYWNzIiwgRkdNQUNTLCAwLCBPRl9BTlkpCisKKy8qIC4vLglyZWFkaW5nIEVPRiBkb2VzIG5vdCBleGl0ICovCitGTigiaWdub3JlZW9mIiwgRklHTk9SRUVPRiwgMCwgT0ZfQU5ZKQorCisvKiAtaQlpbnRlcmFjdGl2ZSBzaGVsbCAqLworRk4oImludGVyYWN0aXZlIiwgRlRBTEtJTkcsICdpJywgT0ZfQ01ETElORSkKKworLyogLWsJbmFtZT12YWx1ZSBhcmUgcmVjb2duaXNlZCBhbnl3aGVyZSAqLworRk4oImtleXdvcmQiLCBGS0VZV09SRCwgJ2snLCBPRl9BTlkpCisKKy8qIC1sCWxvZ2luIHNoZWxsICovCitGTigibG9naW4iLCBGTE9HSU4sICdsJywgT0ZfQ01ETElORSkKKworLyogLVgJbWFyayBkaXJzIHdpdGggLyBpbiBmaWxlIG5hbWUgY29tcGxldGlvbiAqLworRk4oIm1hcmtkaXJzIiwgRk1BUktESVJTLCAnWCcsIE9GX0FOWSkKKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKy8qIC1tCWpvYiBjb250cm9sIG1vbml0b3JpbmcgKi8KK0ZOKCJtb25pdG9yIiwgRk1PTklUT1IsICdtJywgT0ZfQU5ZKQorI2VuZGlmCisKKy8qIC1DCWRvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyAqLworRk4oIm5vY2xvYmJlciIsIEZOT0NMT0JCRVIsICdDJywgT0ZfQU5ZKQorCisvKiAtbglkb24ndCBleGVjdXRlIGFueSBjb21tYW5kcyAqLworRk4oIm5vZXhlYyIsIEZOT0VYRUMsICduJywgT0ZfQU5ZKQorCisvKiAtZglkb24ndCBkbyBmaWxlIGdsb2JiaW5nICovCitGTigibm9nbG9iIiwgRk5PR0xPQiwgJ2YnLCBPRl9BTlkpCisKKy8qIC4vLglkb24ndCBraWxsIHJ1bm5pbmcgam9icyB3aGVuIGxvZ2luIHNoZWxsIGV4aXRzICovCitGTigibm9odXAiLCBGTk9IVVAsIDAsIE9GX0FOWSkKKworLyogLi8uCWRvbid0IHNhdmUgZnVuY3Rpb25zIGluIGhpc3RvcnkgKG5vIGVmZmVjdCkgKi8KK0ZOKCJub2xvZyIsIEZOT0xPRywgMCwgT0ZfQU5ZKQorCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorLyogLWIJYXN5bmNocm9ub3VzIGpvYiBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiAqLworRk4oIm5vdGlmeSIsIEZOT1RJRlksICdiJywgT0ZfQU5ZKQorI2VuZGlmCisKKy8qIC11CXVzaW5nIGFuIHVuc2V0IHZhcmlhYmxlIGlzIGFuIGVycm9yICovCitGTigibm91bnNldCIsIEZOT1VOU0VULCAndScsIE9GX0FOWSkKKworLyogLi8uCWRvbid0IGRvIGxvZ2ljYWwgY2RzL3B3ZHMgKG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJwaHlzaWNhbCIsIEZQSFlTSUNBTCwgMCwgT0ZfQU5ZKQorCisvKiAuLy4JcGRrc2ggY29tcGF0OiBzb21ld2hhdCBtb3JlIFBPU0lYaXNoIG1vZGUgKG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJwb3NpeCIsIEZQT1NJWCwgMCwgT0ZfQU5ZKQorCisvKiAtcAl1c2Ugc3VpZF9wcm9maWxlOyBwcml2aWxlZ2VkIHNoZWxsICovCitGTigicHJpdmlsZWdlZCIsIEZQUklWSUxFR0VELCAncCcsIE9GX0FOWSkKKworLyogLXIJcmVzdHJpY3RlZCBzaGVsbCAqLworRk4oInJlc3RyaWN0ZWQiLCBGUkVTVFJJQ1RFRCwgJ3InLCBPRl9DTURMSU5FKQorCisvKiAuLy4JcGRrc2ggY29tcGF0OiBjYWxsZWQgYXMgc2ggbm90IG1rc2g7IGtsdWRnZSBtb2RlIChub24tc3RhbmRhcmQpICovCitGTigic2giLCBGU0gsIDAsIE9GX0FOWSkKKworLyogLXMJKGludm9jYXRpb24pIHBhcnNlIHN0ZGluIChwc2V1ZG8gbm9uLXN0YW5kYXJkKSAqLworRk4oInN0ZGluIiwgRlNURElOLCAncycsIE9GX0NNRExJTkUpCisKKy8qIC1oCWNyZWF0ZSB0cmFja2VkIGFsaWFzZXMgZm9yIGFsbCBjb21tYW5kcyAqLworRk4oInRyYWNrYWxsIiwgRlRSQUNLQUxMLCAnaCcsIE9GX0FOWSkKKworLyogLVUJZW5hYmxlIFVURi04IHByb2Nlc3NpbmcgKG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJ1dGY4LW1vZGUiLCBGVU5JQ09ERSwgJ1UnLCBPRl9BTlkpCisKKy8qIC12CWVjaG8gaW5wdXQgKi8KK0ZOKCJ2ZXJib3NlIiwgRlZFUkJPU0UsICd2JywgT0ZfQU5ZKQorCisjaWYgIU1LU0hfU19OT1ZJCisvKiAuLy4JVmkgY29tbWFuZCBsaW5lIGVkaXRpbmcgbW9kZSAqLworRk4oInZpIiwgRlZJLCAwLCBPRl9BTlkpCisKKy8qIC4vLgllbmFibGUgRVNDIGFzIGZpbGUgbmFtZSBjb21wbGV0aW9uIGNoYXJhY3RlciAobm9uLXN0YW5kYXJkKSAqLworRk4oInZpLWVzY2NvbXBsZXRlIiwgRlZJRVNDQ09NUExFVEUsIDAsIE9GX0FOWSkKKworLyogLi8uCWVuYWJsZSBUYWIgYXMgZmlsZSBuYW1lIGNvbXBsZXRpb24gY2hhcmFjdGVyIChub24tc3RhbmRhcmQpICovCitGTigidmktdGFiY29tcGxldGUiLCBGVklUQUJDT01QTEVURSwgMCwgT0ZfQU5ZKQorCisvKiAuLy4JYWx3YXlzIHJlYWQgaW4gcmF3IG1vZGUgKG5vIGVmZmVjdCkgKi8KK0ZOKCJ2aXJhdyIsIEZWSVJBVywgMCwgT0ZfQU5ZKQorI2VuZGlmCisKKy8qIC14CWV4ZWN1dGlvbiB0cmFjZSAoZGlzcGxheSBjb21tYW5kcyBhcyB0aGV5IGFyZSBydW4pICovCitGTigieHRyYWNlIiwgRlhUUkFDRSwgJ3gnLCBPRl9BTlkpCisKKy8qIC1jCShpbnZvY2F0aW9uKSBleGVjdXRlIHNwZWNpZmllZCBjb21tYW5kICovCitGTihOVUxMLCBGQ09NTUFORCwgJ2MnLCBPRl9DTURMSU5FKQorCisvKgorICogYW5vbnltb3VzIGZsYWdzOiB1c2VkIGludGVybmFsbHkgYnkgc2hlbGwgb25seSAobm90IHZpc2libGUgdG8gdXNlcikKKyAqLworCisvKiAuLy4JKGludGVybmFsKSBpbml0aWFsIHNoZWxsIHdhcyBpbnRlcmFjdGl2ZSAqLworRk4oTlVMTCwgRlRBTEtJTkdfSSwgMCwgT0ZfSU5URVJOQUwpCisKKyN1bmRlZiBGTgorI3VuZGVmIEYwCisjdW5kZWYgU0hGTEFHU19ERUZOUworI3VuZGVmIFNIRkxBR1NfRU5VTVMKKyN1bmRlZiBTSEZMQUdTX0lURU1TCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9zaGYuYyBiL21rc2gvc3JjL3NoZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjI3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9zaGYuYwpAQCAtMCwwICsxLDEwNDIgQEAKKy8qCSRPcGVuQlNEOiBzaGYuYyx2IDEuMTUgMjAwNi8wNC8wMiAwMDo0ODozMyBkZXJhYWR0IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5CisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc2hmLmMsdiAxLjM2IDIwMTAvMDcvMTkgMjI6NDE6MDQgdGcgRXhwICQiKTsKKworLyogZmxhZ3MgdG8gc2hmX2VtcHR5YnVmKCkgKi8KKyNkZWZpbmUgRUJfUkVBRFNXCTB4MDEJLyogYWJvdXQgdG8gc3dpdGNoIHRvIHJlYWRpbmcgKi8KKyNkZWZpbmUgRUJfR1JPVwkJMHgwMgkvKiBncm93IGJ1ZmZlciBpZiBuZWNlc3NhcnkgKFNUUklORytEWU5BTUlDKSAqLworCisvKgorICogUmVwbGFjZW1lbnQgc3RkaW8gcm91dGluZXMuIFN0ZGlvIGlzIHRvbyBmbGFrZXkgb24gdG9vIG1hbnkgbWFjaGluZXMKKyAqIHRvIGJlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIG11bHRpcGxlIHByb2Nlc3NlcyB1c2luZyB0aGUgc2FtZSB1bmRlcmx5aW5nCisgKiBmaWxlIGRlc2NyaXB0b3JzLgorICovCisKK3N0YXRpYyBpbnQgc2hmX2ZpbGxidWYoc3RydWN0IHNoZiAqKTsKK3N0YXRpYyBpbnQgc2hmX2VtcHR5YnVmKHN0cnVjdCBzaGYgKiwgaW50KTsKKworLyogT3BlbiBhIGZpbGUuIEZpcnN0IHRocmVlIGFyZ3MgYXJlIGZvciBvcGVuKCksIGxhc3QgYXJnIGlzIGZsYWdzIGZvcgorICogdGhpcyBwYWNrYWdlLiBSZXR1cm5zIE5VTEwgaWYgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCBvciBpZiBhIGR1cAorICogZmFpbHMuCisgKi8KK3N0cnVjdCBzaGYgKgorc2hmX29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG9mbGFncywgaW50IG1vZGUsIGludCBzZmxhZ3MpCit7CisJc3RydWN0IHNoZiAqc2hmOworCWludCBic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IChzZmxhZ3MgJiBTSEZfUkQgPyAxIDogMCkgOiBTSEZfQlNJWkU7CisJaW50IGZkOworCisJLyogRG9uZSBiZWZvcmUgb3BlbiBzbyBpZiBhbGxvY2EgZmFpbHMsIGZkIHdvbid0IGJlIGxvc3QuICovCisJc2hmID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGYpICsgYnNpemUsIEFURU1QKTsKKwlzaGYtPmFyZWFwID0gQVRFTVA7CisJc2hmLT5idWYgPSAodW5zaWduZWQgY2hhciAqKSZzaGZbMV07CisJc2hmLT5ic2l6ZSA9IGJzaXplOworCXNoZi0+ZmxhZ3MgPSBTSEZfQUxMT0NTOworCS8qIFJlc3QgZmlsbGVkIGluIGJ5IHJlb3Blbi4gKi8KKworCWZkID0gb3BlbihuYW1lLCBvZmxhZ3MsIG1vZGUpOworCWlmIChmZCA8IDApIHsKKwkJYWZyZWUoc2hmLCBzaGYtPmFyZWFwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJaWYgKChzZmxhZ3MgJiBTSEZfTUFQSEkpICYmIGZkIDwgRkRCQVNFKSB7CisJCWludCBuZmQ7CisKKwkJbmZkID0gZmNudGwoZmQsIEZfRFVQRkQsIEZEQkFTRSk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKG5mZCA8IDApIHsKKwkJCWFmcmVlKHNoZiwgc2hmLT5hcmVhcCk7CisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJCWZkID0gbmZkOworCX0KKwlzZmxhZ3MgJj0gflNIRl9BQ0NNT0RFOworCXNmbGFncyB8PSAob2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSA/IFNIRl9SRCA6CisJICAgICgob2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSA/IFNIRl9XUiA6IFNIRl9SRFdSKTsKKworCXJldHVybiAoc2hmX3Jlb3BlbihmZCwgc2ZsYWdzLCBzaGYpKTsKK30KKworLyogU2V0IHVwIHRoZSBzaGYgc3RydWN0dXJlIGZvciBhIGZpbGUgZGVzY3JpcHRvci4gRG9lc24ndCBmYWlsLiAqLworc3RydWN0IHNoZiAqCitzaGZfZmRvcGVuKGludCBmZCwgaW50IHNmbGFncywgc3RydWN0IHNoZiAqc2hmKQoreworCWludCBic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IChzZmxhZ3MgJiBTSEZfUkQgPyAxIDogMCkgOiBTSEZfQlNJWkU7CisKKwkvKiB1c2UgZmNudGwoKSB0byBmaWd1cmUgb3V0IGNvcnJlY3QgcmVhZC93cml0ZSBmbGFncyAqLworCWlmIChzZmxhZ3MgJiBTSEZfR0VURkwpIHsKKwkJaW50IGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOworCisJCWlmIChmbGFncyA8IDApCisJCQkvKiB3aWxsIGdldCBhbiBlcnJvciBvbiBmaXJzdCByZWFkL3dyaXRlICovCisJCQlzZmxhZ3MgfD0gU0hGX1JEV1I7CisJCWVsc2UgeworCQkJc3dpdGNoIChmbGFncyAmIE9fQUNDTU9ERSkgeworCQkJY2FzZSBPX1JET05MWToKKwkJCQlzZmxhZ3MgfD0gU0hGX1JEOworCQkJCWJyZWFrOworCQkJY2FzZSBPX1dST05MWToKKwkJCQlzZmxhZ3MgfD0gU0hGX1dSOworCQkJCWJyZWFrOworCQkJY2FzZSBPX1JEV1I6CisJCQkJc2ZsYWdzIHw9IFNIRl9SRFdSOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCEoc2ZsYWdzICYgKFNIRl9SRCB8IFNIRl9XUikpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9mZG9wZW46IG1pc3NpbmcgcmVhZC93cml0ZSIpOworCisJaWYgKHNoZikgeworCQlpZiAoYnNpemUpIHsKKwkJCXNoZi0+YnVmID0gYWxsb2MoYnNpemUsIEFURU1QKTsKKwkJCXNmbGFncyB8PSBTSEZfQUxMT0NCOworCQl9IGVsc2UKKwkJCXNoZi0+YnVmID0gTlVMTDsKKwl9IGVsc2UgeworCQlzaGYgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHNoZikgKyBic2l6ZSwgQVRFTVApOworCQlzaGYtPmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopJnNoZlsxXTsKKwkJc2ZsYWdzIHw9IFNIRl9BTExPQ1M7CisJfQorCXNoZi0+YXJlYXAgPSBBVEVNUDsKKwlzaGYtPmZkID0gZmQ7CisJc2hmLT5ycCA9IHNoZi0+d3AgPSBzaGYtPmJ1ZjsKKwlzaGYtPnJubGVmdCA9IDA7CisJc2hmLT5yYnNpemUgPSBic2l6ZTsKKwlzaGYtPndubGVmdCA9IDA7IC8qIGZvcmNlIGNhbGwgdG8gc2hmX2VtcHR5YnVmKCkgKi8KKwlzaGYtPndic2l6ZSA9IHNmbGFncyAmIFNIRl9VTkJVRiA/IDAgOiBic2l6ZTsKKwlzaGYtPmZsYWdzID0gc2ZsYWdzOworCXNoZi0+ZXJybm9fID0gMDsKKwlzaGYtPmJzaXplID0gYnNpemU7CisJaWYgKHNmbGFncyAmIFNIRl9DTEVYRUMpCisJCWZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKwlyZXR1cm4gKHNoZik7Cit9CisKKy8qIFNldCB1cCBhbiBleGlzdGluZyBzaGYgKGFuZCBidWZmZXIpIHRvIHVzZSB0aGUgZ2l2ZW4gZmQgKi8KK3N0cnVjdCBzaGYgKgorc2hmX3Jlb3BlbihpbnQgZmQsIGludCBzZmxhZ3MsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpbnQgYnNpemUgPSBzZmxhZ3MgJiBTSEZfVU5CVUYgPyAoc2ZsYWdzICYgU0hGX1JEID8gMSA6IDApIDogU0hGX0JTSVpFOworCisJLyogdXNlIGZjbnRsKCkgdG8gZmlndXJlIG91dCBjb3JyZWN0IHJlYWQvd3JpdGUgZmxhZ3MgKi8KKwlpZiAoc2ZsYWdzICYgU0hGX0dFVEZMKSB7CisJCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKKworCQlpZiAoZmxhZ3MgPCAwKQorCQkJLyogd2lsbCBnZXQgYW4gZXJyb3Igb24gZmlyc3QgcmVhZC93cml0ZSAqLworCQkJc2ZsYWdzIHw9IFNIRl9SRFdSOworCQllbHNlIHsKKwkJCXN3aXRjaCAoZmxhZ3MgJiBPX0FDQ01PREUpIHsKKwkJCWNhc2UgT19SRE9OTFk6CisJCQkJc2ZsYWdzIHw9IFNIRl9SRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT19XUk9OTFk6CisJCQkJc2ZsYWdzIHw9IFNIRl9XUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT19SRFdSOgorCQkJCXNmbGFncyB8PSBTSEZfUkRXUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghKHNmbGFncyAmIChTSEZfUkQgfCBTSEZfV1IpKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcmVvcGVuOiBtaXNzaW5nIHJlYWQvd3JpdGUiKTsKKwlpZiAoIXNoZiB8fCAhc2hmLT5idWYgfHwgc2hmLT5ic2l6ZSA8IGJzaXplKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZW9wZW46IGJhZCBzaGYvYnVmL2JzaXplIik7CisKKwkvKiBhc3N1bWVzIHNoZi0+YnVmIGFuZCBzaGYtPmJzaXplIGFscmVhZHkgc2V0IHVwICovCisJc2hmLT5mZCA9IGZkOworCXNoZi0+cnAgPSBzaGYtPndwID0gc2hmLT5idWY7CisJc2hmLT5ybmxlZnQgPSAwOworCXNoZi0+cmJzaXplID0gYnNpemU7CisJc2hmLT53bmxlZnQgPSAwOyAvKiBmb3JjZSBjYWxsIHRvIHNoZl9lbXB0eWJ1ZigpICovCisJc2hmLT53YnNpemUgPSBzZmxhZ3MgJiBTSEZfVU5CVUYgPyAwIDogYnNpemU7CisJc2hmLT5mbGFncyA9IChzaGYtPmZsYWdzICYgKFNIRl9BTExPQ1MgfCBTSEZfQUxMT0NCKSkgfCBzZmxhZ3M7CisJc2hmLT5lcnJub18gPSAwOworCWlmIChzZmxhZ3MgJiBTSEZfQ0xFWEVDKQorCQlmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisJcmV0dXJuIChzaGYpOworfQorCisvKiBPcGVuIGEgc3RyaW5nIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIElmIHJlYWRpbmcsIGJzaXplIGlzIHRoZSBudW1iZXIKKyAqIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQuIElmIHdyaXRpbmcsIGJzaXplIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICogYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbi4gSWYgc2hmIGlzIG5vdCBudWxsLCBpdCBpcyBmaWxsZWQgaW4gYW5kCisgKiByZXR1cm5lZCwgaWYgaXQgaXMgbnVsbCwgc2hmIGlzIGFsbG9jYXRlZC4gSWYgd3JpdGluZyBhbmQgYnVmIGlzIG51bGwKKyAqIGFuZCBTSEZfRFlOQU1JQyBpcyBzZXQsIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIChpZiBic2l6ZSA+IDAsIGl0IGlzCisgKiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzaXplKS4gRG9lc24ndCBmYWlsLgorICogV2hlbiB3cml0aW5nLCBhIGJ5dGUgaXMgcmVzZXJ2ZWQgZm9yIGEgdHJhaWxpbmcgbnVsbCAtIHNlZSBzaGZfc2Nsb3NlKCkuCisgKi8KK3N0cnVjdCBzaGYgKgorc2hmX3NvcGVuKGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBpbnQgc2ZsYWdzLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJLyogY2FuJ3QgaGF2ZSBhIHJlYWQrd3JpdGUgc3RyaW5nICovCisJaWYgKCEoIShzZmxhZ3MgJiBTSEZfUkQpIF4gIShzZmxhZ3MgJiBTSEZfV1IpKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfc29wZW46IGZsYWdzIDB4JXgiLCBzZmxhZ3MpOworCisJaWYgKCFzaGYpIHsKKwkJc2hmID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGYpLCBBVEVNUCk7CisJCXNmbGFncyB8PSBTSEZfQUxMT0NTOworCX0KKwlzaGYtPmFyZWFwID0gQVRFTVA7CisJaWYgKCFidWYgJiYgKHNmbGFncyAmIFNIRl9XUikgJiYgKHNmbGFncyAmIFNIRl9EWU5BTUlDKSkgeworCQlpZiAoYnNpemUgPD0gMCkKKwkJCWJzaXplID0gNjQ7CisJCXNmbGFncyB8PSBTSEZfQUxMT0NCOworCQlidWYgPSBhbGxvYyhic2l6ZSwgc2hmLT5hcmVhcCk7CisJfQorCXNoZi0+ZmQgPSAtMTsKKwlzaGYtPmJ1ZiA9IHNoZi0+cnAgPSBzaGYtPndwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7CisJc2hmLT5ybmxlZnQgPSBic2l6ZTsKKwlzaGYtPnJic2l6ZSA9IGJzaXplOworCXNoZi0+d25sZWZ0ID0gYnNpemUgLSAxOwkvKiBzcGFjZSBmb3IgYSAnXDAnICovCisJc2hmLT53YnNpemUgPSBic2l6ZTsKKwlzaGYtPmZsYWdzID0gc2ZsYWdzIHwgU0hGX1NUUklORzsKKwlzaGYtPmVycm5vXyA9IDA7CisJc2hmLT5ic2l6ZSA9IGJzaXplOworCisJcmV0dXJuIChzaGYpOworfQorCisvKiBGbHVzaCBhbmQgY2xvc2UgZmlsZSBkZXNjcmlwdG9yLCBmcmVlIHRoZSBzaGYgc3RydWN0dXJlICovCitpbnQKK3NoZl9jbG9zZShzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc2hmLT5mZCA+PSAwKSB7CisJCXJldCA9IHNoZl9mbHVzaChzaGYpOworCQlpZiAoY2xvc2Uoc2hmLT5mZCkgPCAwKQorCQkJcmV0ID0gRU9GOworCX0KKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9BTExPQ1MpCisJCWFmcmVlKHNoZiwgc2hmLT5hcmVhcCk7CisJZWxzZSBpZiAoc2hmLT5mbGFncyAmIFNIRl9BTExPQ0IpCisJCWFmcmVlKHNoZi0+YnVmLCBzaGYtPmFyZWFwKTsKKworCXJldHVybiAocmV0KTsKK30KKworLyogRmx1c2ggYW5kIGNsb3NlIGZpbGUgZGVzY3JpcHRvciwgZG9uJ3QgZnJlZSBmaWxlIHN0cnVjdHVyZSAqLworaW50CitzaGZfZmRjbG9zZShzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc2hmLT5mZCA+PSAwKSB7CisJCXJldCA9IHNoZl9mbHVzaChzaGYpOworCQlpZiAoY2xvc2Uoc2hmLT5mZCkgPCAwKQorCQkJcmV0ID0gRU9GOworCQlzaGYtPnJubGVmdCA9IDA7CisJCXNoZi0+cnAgPSBzaGYtPmJ1ZjsKKwkJc2hmLT53bmxlZnQgPSAwOworCQlzaGYtPmZkID0gLTE7CisJfQorCisJcmV0dXJuIChyZXQpOworfQorCisvKiBDbG9zZSBhIHN0cmluZyAtIGlmIGl0IHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcsIGl0IGlzIG51bGwgdGVybWluYXRlZDsKKyAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgYW5kIGZyZWVzIHNoZiBpZiBpdCB3YXMgYWxsb2NhdGVkCisgKiAoZG9lcyBub3QgZnJlZSBzdHJpbmcgaWYgaXQgd2FzIGFsbG9jYXRlZCkuCisgKi8KK2NoYXIgKgorc2hmX3NjbG9zZShzdHJ1Y3Qgc2hmICpzaGYpCit7CisJdW5zaWduZWQgY2hhciAqcyA9IHNoZi0+YnVmOworCisJLyogbnVsbCB0ZXJtaW5hdGUgKi8KKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9XUikgeworCQlzaGYtPndubGVmdCsrOworCQlzaGZfcHV0YygnXDAnLCBzaGYpOworCX0KKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9BTExPQ1MpCisJCWFmcmVlKHNoZiwgc2hmLT5hcmVhcCk7CisJcmV0dXJuICgoY2hhciAqKXMpOworfQorCisvKiBVbi1yZWFkIHdoYXQgaGFzIGJlZW4gcmVhZCBidXQgbm90IGV4YW1pbmVkLCBvciB3cml0ZSB3aGF0IGhhcyBiZWVuCisgKiBidWZmZXJlZC4gUmV0dXJucyAwIGZvciBzdWNjZXNzLCBFT0YgZm9yICh3cml0ZSkgZXJyb3IuCisgKi8KK2ludAorc2hmX2ZsdXNoKHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpCisJCXJldHVybiAoKHNoZi0+ZmxhZ3MgJiBTSEZfV1IpID8gRU9GIDogMCk7CisKKwlpZiAoc2hmLT5mZCA8IDApCisJCWludGVybmFsX2Vycm9yZigic2hmX2ZsdXNoOiBubyBmZCIpOworCisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpIHsKKwkJZXJybm8gPSBzaGYtPmVycm5vXzsKKwkJcmV0dXJuIChFT0YpOworCX0KKworCWlmIChzaGYtPmZsYWdzICYgU0hGX1JFQURJTkcpIHsKKwkJc2hmLT5mbGFncyAmPSB+KFNIRl9FT0YgfCBTSEZfUkVBRElORyk7CisJCWlmIChzaGYtPnJubGVmdCA+IDApIHsKKwkJCWxzZWVrKHNoZi0+ZmQsIChvZmZfdCktc2hmLT5ybmxlZnQsIFNFRUtfQ1VSKTsKKwkJCXNoZi0+cm5sZWZ0ID0gMDsKKwkJCXNoZi0+cnAgPSBzaGYtPmJ1ZjsKKwkJfQorCQlyZXR1cm4gKDApOworCX0gZWxzZSBpZiAoc2hmLT5mbGFncyAmIFNIRl9XUklUSU5HKQorCQlyZXR1cm4gKHNoZl9lbXB0eWJ1ZihzaGYsIDApKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIFdyaXRlIG91dCBhbnkgYnVmZmVyZWQgZGF0YS4gSWYgY3VycmVudGx5IHJlYWRpbmcsIGZsdXNoZXMgdGhlIHJlYWQKKyAqIGJ1ZmZlci4gUmV0dXJucyAwIGZvciBzdWNjZXNzLCBFT0YgZm9yICh3cml0ZSkgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK3NoZl9lbXB0eWJ1ZihzdHJ1Y3Qgc2hmICpzaGYsIGludCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSAmJiBzaGYtPmZkIDwgMCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZW1wdHlidWY6IG5vIGZkIik7CisKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9FUlJPUikgeworCQllcnJubyA9IHNoZi0+ZXJybm9fOworCQlyZXR1cm4gKEVPRik7CisJfQorCisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfUkVBRElORykgeworCQlpZiAoZmxhZ3MgJiBFQl9SRUFEU1cpIC8qIGRvZXNuJ3QgaGFwcGVuICovCisJCQlyZXR1cm4gKDApOworCQlyZXQgPSBzaGZfZmx1c2goc2hmKTsKKwkJc2hmLT5mbGFncyAmPSB+U0hGX1JFQURJTkc7CisJfQorCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykgeworCQl1bnNpZ25lZCBjaGFyICpuYnVmOworCisJCS8qIE5vdGUgdGhhdCB3ZSBhc3N1bWUgU0hGX0FMTE9DUyBpcyBub3Qgc2V0IGlmIFNIRl9BTExPQ0IKKwkJICogaXMgc2V0Li4uIChjaGFuZ2luZyB0aGUgc2hmIHBvaW50ZXIgY291bGQgY2F1c2UgcHJvYmxlbXMpCisJCSAqLworCQlpZiAoIShmbGFncyAmIEVCX0dST1cpIHx8ICEoc2hmLT5mbGFncyAmIFNIRl9EWU5BTUlDKSB8fAorCQkgICAgIShzaGYtPmZsYWdzICYgU0hGX0FMTE9DQikpCisJCQlyZXR1cm4gKEVPRik7CisJCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgZm9yIGJ1ZmZlciAqLworCQluYnVmID0gYXJlc2l6ZShzaGYtPmJ1ZiwgMiAqIHNoZi0+d2JzaXplLCBzaGYtPmFyZWFwKTsKKwkJc2hmLT5ycCA9IG5idWYgKyAoc2hmLT5ycCAtIHNoZi0+YnVmKTsKKwkJc2hmLT53cCA9IG5idWYgKyAoc2hmLT53cCAtIHNoZi0+YnVmKTsKKwkJc2hmLT5yYnNpemUgKz0gc2hmLT53YnNpemU7CisJCXNoZi0+d25sZWZ0ICs9IHNoZi0+d2JzaXplOworCQlzaGYtPndic2l6ZSAqPSAyOworCQlzaGYtPmJ1ZiA9IG5idWY7CisJfSBlbHNlIHsKKwkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfV1JJVElORykgeworCQkJaW50IG50b3dyaXRlID0gc2hmLT53cCAtIHNoZi0+YnVmOworCQkJdW5zaWduZWQgY2hhciAqYnVmID0gc2hmLT5idWY7CisJCQlpbnQgbjsKKworCQkJd2hpbGUgKG50b3dyaXRlID4gMCkgeworCQkJCW4gPSB3cml0ZShzaGYtPmZkLCBidWYsIG50b3dyaXRlKTsKKwkJCQlpZiAobiA8IDApIHsKKwkJCQkJaWYgKGVycm5vID09IEVJTlRSICYmCisJCQkJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlzaGYtPmZsYWdzIHw9IFNIRl9FUlJPUjsKKwkJCQkJc2hmLT5lcnJub18gPSBlcnJubzsKKwkJCQkJc2hmLT53bmxlZnQgPSAwOworCQkJCQlpZiAoYnVmICE9IHNoZi0+YnVmKSB7CisJCQkJCQkvKiBhbGxvdyBhIHNlY29uZCBmbHVzaAorCQkJCQkJICogdG8gd29yayAqLworCQkJCQkJbWVtbW92ZShzaGYtPmJ1ZiwgYnVmLAorCQkJCQkJICAgIG50b3dyaXRlKTsKKwkJCQkJCXNoZi0+d3AgPSBzaGYtPmJ1ZiArIG50b3dyaXRlOworCQkJCQl9CisJCQkJCXJldHVybiAoRU9GKTsKKwkJCQl9CisJCQkJYnVmICs9IG47CisJCQkJbnRvd3JpdGUgLT0gbjsKKwkJCX0KKwkJCWlmIChmbGFncyAmIEVCX1JFQURTVykgeworCQkJCXNoZi0+d3AgPSBzaGYtPmJ1ZjsKKwkJCQlzaGYtPndubGVmdCA9IDA7CisJCQkJc2hmLT5mbGFncyAmPSB+U0hGX1dSSVRJTkc7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJfQorCQlzaGYtPndwID0gc2hmLT5idWY7CisJCXNoZi0+d25sZWZ0ID0gc2hmLT53YnNpemU7CisJfQorCXNoZi0+ZmxhZ3MgfD0gU0hGX1dSSVRJTkc7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIEZpbGwgdXAgYSByZWFkIGJ1ZmZlci4gUmV0dXJucyBFT0YgZm9yIGEgcmVhZCBlcnJvciwgMCBvdGhlcndpc2UuICovCitzdGF0aWMgaW50CitzaGZfZmlsbGJ1ZihzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKQorCQlyZXR1cm4gKDApOworCisJaWYgKHNoZi0+ZmQgPCAwKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9maWxsYnVmOiBubyBmZCIpOworCisJaWYgKHNoZi0+ZmxhZ3MgJiAoU0hGX0VPRiB8IFNIRl9FUlJPUikpIHsKKwkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpCisJCQllcnJubyA9IHNoZi0+ZXJybm9fOworCQlyZXR1cm4gKEVPRik7CisJfQorCisJaWYgKChzaGYtPmZsYWdzICYgU0hGX1dSSVRJTkcpICYmIHNoZl9lbXB0eWJ1ZihzaGYsIEVCX1JFQURTVykgPT0gRU9GKQorCQlyZXR1cm4gKEVPRik7CisKKwlzaGYtPmZsYWdzIHw9IFNIRl9SRUFESU5HOworCisJc2hmLT5ycCA9IHNoZi0+YnVmOworCXdoaWxlICgxKSB7CisJCXNoZi0+cm5sZWZ0ID0gYmxvY2tpbmdfcmVhZChzaGYtPmZkLCAoY2hhciAqKSBzaGYtPmJ1ZiwKKwkJICAgIHNoZi0+cmJzaXplKTsKKwkJaWYgKHNoZi0+cm5sZWZ0IDwgMCAmJiBlcnJubyA9PSBFSU5UUiAmJgorCQkgICAgIShzaGYtPmZsYWdzICYgU0hGX0lOVEVSUlVQVCkpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCWlmIChzaGYtPnJubGVmdCA8PSAwKSB7CisJCWlmIChzaGYtPnJubGVmdCA8IDApIHsKKwkJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VSUk9SOworCQkJc2hmLT5lcnJub18gPSBlcnJubzsKKwkJCXNoZi0+cm5sZWZ0ID0gMDsKKwkJCXNoZi0+cnAgPSBzaGYtPmJ1ZjsKKwkJCXJldHVybiAoRU9GKTsKKwkJfQorCQlzaGYtPmZsYWdzIHw9IFNIRl9FT0Y7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qIFJlYWQgYSBidWZmZXIgZnJvbSBzaGYuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGludG8gYnVmLAorICogaWYgbm8gYnl0ZXMgd2VyZSByZWFkLCByZXR1cm5zIDAgaWYgZW5kIG9mIGZpbGUgd2FzIHNlZW4sIEVPRiBpZgorICogYSByZWFkIGVycm9yIG9jY3VycmVkLgorICovCitpbnQKK3NoZl9yZWFkKGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaW50IG9yaWdfYnNpemUgPSBic2l6ZTsKKwlpbnQgbmNvcHk7CisKKwlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1JEKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcmVhZDogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKKworCWlmIChic2l6ZSA8PSAwKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9yZWFkOiBic2l6ZSAlZCIsIGJzaXplKTsKKworCXdoaWxlIChic2l6ZSA+IDApIHsKKwkJaWYgKHNoZi0+cm5sZWZ0ID09IDAgJiYKKwkJICAgIChzaGZfZmlsbGJ1ZihzaGYpID09IEVPRiB8fCBzaGYtPnJubGVmdCA9PSAwKSkKKwkJCWJyZWFrOworCQluY29weSA9IHNoZi0+cm5sZWZ0OworCQlpZiAobmNvcHkgPiBic2l6ZSkKKwkJCW5jb3B5ID0gYnNpemU7CisJCW1lbWNweShidWYsIHNoZi0+cnAsIG5jb3B5KTsKKwkJYnVmICs9IG5jb3B5OworCQlic2l6ZSAtPSBuY29weTsKKwkJc2hmLT5ycCArPSBuY29weTsKKwkJc2hmLT5ybmxlZnQgLT0gbmNvcHk7CisJfQorCS8qIE5vdGU6IGZyZWFkKDNTKSByZXR1cm5zIDAgZm9yIGVycm9ycyAtIHRoaXMgZG9lc24ndCAqLworCXJldHVybiAob3JpZ19ic2l6ZSA9PSBic2l6ZSA/IChzaGZfZXJyb3Ioc2hmKSA/IEVPRiA6IDApIDoKKwkgICAgb3JpZ19ic2l6ZSAtIGJzaXplKTsKK30KKworLyogUmVhZCB1cCB0byBhIG5ld2xpbmUgb3IgRU9GLiBUaGUgbmV3bGluZSBpcyBwdXQgaW4gYnVmOyBidWYgaXMgYWx3YXlzCisgKiBudWxsIHRlcm1pbmF0ZWQuIFJldHVybnMgTlVMTCBvbiByZWFkIGVycm9yIG9yIGlmIG5vdGhpbmcgd2FzIHJlYWQgYmVmb3JlCisgKiBlbmQgb2YgZmlsZSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG51bGwgYnl0ZSBpbiBidWYgb3RoZXJ3aXNlLgorICovCitjaGFyICoKK3NoZl9nZXRzZShjaGFyICpidWYsIGludCBic2l6ZSwgc3RydWN0IHNoZiAqc2hmKQoreworCXVuc2lnbmVkIGNoYXIgKmVuZDsKKwlpbnQgbmNvcHk7CisJY2hhciAqb3JpZ19idWYgPSBidWY7CisKKwlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1JEKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZ2V0c2U6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7CisKKwlpZiAoYnNpemUgPD0gMCkKKwkJcmV0dXJuIChOVUxMKTsKKworCS0tYnNpemU7CS8qIHNhdmUgcm9vbSBmb3IgbnVsbCAqLworCWRvIHsKKwkJaWYgKHNoZi0+cm5sZWZ0ID09IDApIHsKKwkJCWlmIChzaGZfZmlsbGJ1ZihzaGYpID09IEVPRikKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJaWYgKHNoZi0+cm5sZWZ0ID09IDApIHsKKwkJCQkqYnVmID0gJ1wwJzsKKwkJCQlyZXR1cm4gKGJ1ZiA9PSBvcmlnX2J1ZiA/IE5VTEwgOiBidWYpOworCQkJfQorCQl9CisJCWVuZCA9ICh1bnNpZ25lZCBjaGFyICopbWVtY2hyKChjaGFyICopIHNoZi0+cnAsICdcbicsCisJCSAgICBzaGYtPnJubGVmdCk7CisJCW5jb3B5ID0gZW5kID8gZW5kIC0gc2hmLT5ycCArIDEgOiBzaGYtPnJubGVmdDsKKwkJaWYgKG5jb3B5ID4gYnNpemUpCisJCQluY29weSA9IGJzaXplOworCQltZW1jcHkoYnVmLCAoY2hhciAqKSBzaGYtPnJwLCBuY29weSk7CisJCXNoZi0+cnAgKz0gbmNvcHk7CisJCXNoZi0+cm5sZWZ0IC09IG5jb3B5OworCQlidWYgKz0gbmNvcHk7CisJCWJzaXplIC09IG5jb3B5OworCX0gd2hpbGUgKCFlbmQgJiYgYnNpemUpOworCSpidWYgPSAnXDAnOworCXJldHVybiAoYnVmKTsKK30KKworLyogUmV0dXJucyB0aGUgY2hhciByZWFkLiBSZXR1cm5zIEVPRiBmb3IgZXJyb3IgYW5kIGVuZCBvZiBmaWxlLiAqLworaW50CitzaGZfZ2V0Y2hhcihzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9SRCkpCisJCWludGVybmFsX2Vycm9yZigic2hmX2dldGNoYXI6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7CisKKwlpZiAoc2hmLT5ybmxlZnQgPT0gMCAmJiAoc2hmX2ZpbGxidWYoc2hmKSA9PSBFT0YgfHwgc2hmLT5ybmxlZnQgPT0gMCkpCisJCXJldHVybiAoRU9GKTsKKwktLXNoZi0+cm5sZWZ0OworCXJldHVybiAoKnNoZi0+cnArKyk7Cit9CisKKy8qIFB1dCBhIGNoYXJhY3RlciBiYWNrIGluIHRoZSBpbnB1dCBzdHJlYW0uIFJldHVybnMgdGhlIGNoYXJhY3RlciBpZgorICogc3VjY2Vzc2Z1bCwgRU9GIGlmIHRoZXJlIGlzIG5vIHJvb20uCisgKi8KK2ludAorc2hmX3VuZ2V0YyhpbnQgYywgc3RydWN0IHNoZiAqc2hmKQoreworCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfUkQpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl91bmdldGM6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7CisKKwlpZiAoKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpIHx8IGMgPT0gRU9GIHx8CisJICAgIChzaGYtPnJwID09IHNoZi0+YnVmICYmIHNoZi0+cm5sZWZ0KSkKKwkJcmV0dXJuIChFT0YpOworCisJaWYgKChzaGYtPmZsYWdzICYgU0hGX1dSSVRJTkcpICYmIHNoZl9lbXB0eWJ1ZihzaGYsIEVCX1JFQURTVykgPT0gRU9GKQorCQlyZXR1cm4gKEVPRik7CisKKwlpZiAoc2hmLT5ycCA9PSBzaGYtPmJ1ZikKKwkJc2hmLT5ycCA9IHNoZi0+YnVmICsgc2hmLT5yYnNpemU7CisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7CisJCS8qIENhbiB1bmdldCB3aGF0IHdhcyByZWFkLCBidXQgbm90IHNvbWV0aGluZyBkaWZmZXJlbnQgLSB3ZQorCQkgKiBkb24ndCB3YW50IHRvIG1vZGlmeSBhIHN0cmluZy4KKwkJICovCisJCWlmIChzaGYtPnJwWy0xXSAhPSBjKQorCQkJcmV0dXJuIChFT0YpOworCQlzaGYtPmZsYWdzICY9IH5TSEZfRU9GOworCQlzaGYtPnJwLS07CisJCXNoZi0+cm5sZWZ0Kys7CisJCXJldHVybiAoYyk7CisJfQorCXNoZi0+ZmxhZ3MgJj0gflNIRl9FT0Y7CisJKi0tKHNoZi0+cnApID0gYzsKKwlzaGYtPnJubGVmdCsrOworCXJldHVybiAoYyk7Cit9CisKKy8qIFdyaXRlIGEgY2hhcmFjdGVyLiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaWYgc3VjY2Vzc2Z1bCwgRU9GIGlmCisgKiB0aGUgY2hhciBjb3VsZCBub3QgYmUgd3JpdHRlbi4KKyAqLworaW50CitzaGZfcHV0Y2hhcihpbnQgYywgc3RydWN0IHNoZiAqc2hmKQoreworCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfV1IpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9wdXRjaGFyOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOworCisJaWYgKGMgPT0gRU9GKQorCQlyZXR1cm4gKEVPRik7CisKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9VTkJVRikgeworCQl1bnNpZ25lZCBjaGFyIGNjID0gKHVuc2lnbmVkIGNoYXIpYzsKKwkJaW50IG47CisKKwkJaWYgKHNoZi0+ZmQgPCAwKQorCQkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcHV0Y2hhcjogbm8gZmQiKTsKKwkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpIHsKKwkJCWVycm5vID0gc2hmLT5lcnJub187CisJCQlyZXR1cm4gKEVPRik7CisJCX0KKwkJd2hpbGUgKChuID0gd3JpdGUoc2hmLT5mZCwgJmNjLCAxKSkgIT0gMSkKKwkJCWlmIChuIDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFSU5UUiAmJgorCQkJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKKwkJCQkJY29udGludWU7CisJCQkJc2hmLT5mbGFncyB8PSBTSEZfRVJST1I7CisJCQkJc2hmLT5lcnJub18gPSBlcnJubzsKKwkJCQlyZXR1cm4gKEVPRik7CisJCQl9CisJfSBlbHNlIHsKKwkJLyogRmx1c2ggZGVhbHMgd2l0aCBzdHJpbmdzIGFuZCBzdGlja3kgZXJyb3JzICovCisJCWlmIChzaGYtPndubGVmdCA9PSAwICYmIHNoZl9lbXB0eWJ1ZihzaGYsIEVCX0dST1cpID09IEVPRikKKwkJCXJldHVybiAoRU9GKTsKKwkJc2hmLT53bmxlZnQtLTsKKwkJKnNoZi0+d3ArKyA9IGM7CisJfQorCisJcmV0dXJuIChjKTsKK30KKworLyogV3JpdGUgYSBzdHJpbmcuIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlmIHN1Y2Nlc3NmdWwsIEVPRiBpZgorICogdGhlIHN0cmluZyBjb3VsZCBub3QgYmUgd3JpdHRlbi4KKyAqLworaW50CitzaGZfcHV0cyhjb25zdCBjaGFyICpzLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaWYgKCFzKQorCQlyZXR1cm4gKEVPRik7CisKKwlyZXR1cm4gKHNoZl93cml0ZShzLCBzdHJsZW4ocyksIHNoZikpOworfQorCisvKiBXcml0ZSBhIGJ1ZmZlci4gUmV0dXJucyBuYnl0ZXMgaWYgc3VjY2Vzc2Z1bCwgRU9GIGlmIHRoZXJlIGlzIGFuIGVycm9yLiAqLworaW50CitzaGZfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaW50IG4sIG5jb3B5LCBvcmlnX25ieXRlcyA9IG5ieXRlczsKKworCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfV1IpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl93cml0ZTogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKKworCWlmIChuYnl0ZXMgPCAwKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl93cml0ZTogbmJ5dGVzICVkIiwgbmJ5dGVzKTsKKworCS8qIERvbid0IGJ1ZmZlciBpZiBidWZmZXIgaXMgZW1wdHkgYW5kIHdlJ3JlIHdyaXR0aW5nIGEgbGFyZ2UgYW1vdW50LiAqLworCWlmICgobmNvcHkgPSBzaGYtPndubGVmdCkgJiYKKwkgICAgKHNoZi0+d3AgIT0gc2hmLT5idWYgfHwgbmJ5dGVzIDwgc2hmLT53bmxlZnQpKSB7CisJCWlmIChuY29weSA+IG5ieXRlcykKKwkJCW5jb3B5ID0gbmJ5dGVzOworCQltZW1jcHkoc2hmLT53cCwgYnVmLCBuY29weSk7CisJCW5ieXRlcyAtPSBuY29weTsKKwkJYnVmICs9IG5jb3B5OworCQlzaGYtPndwICs9IG5jb3B5OworCQlzaGYtPndubGVmdCAtPSBuY29weTsKKwl9CisJaWYgKG5ieXRlcyA+IDApIHsKKwkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7CisJCQkvKiByZXNpemUgYnVmZmVyIHVudGlsIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGxlZnQgKi8KKwkJCXdoaWxlIChuYnl0ZXMgPiBzaGYtPndubGVmdCkKKwkJCQlpZiAoc2hmX2VtcHR5YnVmKHNoZiwgRUJfR1JPVykgPT0gRU9GKQorCQkJCQlyZXR1cm4gKEVPRik7CisJCQkvKiB0aGVuIHdyaXRlIGV2ZXJ5dGhpbmcgaW50byB0aGUgYnVmZmVyICovCisJCX0gZWxzZSB7CisJCQkvKiBmbHVzaCBkZWFscyB3aXRoIHN0aWNreSBlcnJvcnMgKi8KKwkJCWlmIChzaGZfZW1wdHlidWYoc2hmLCBFQl9HUk9XKSA9PSBFT0YpCisJCQkJcmV0dXJuIChFT0YpOworCQkJLyogd3JpdGUgY2h1bmtzIGxhcmdlciB0aGFuIHdpbmRvdyBzaXplIGRpcmVjdGx5ICovCisJCQlpZiAobmJ5dGVzID4gc2hmLT53YnNpemUpIHsKKwkJCQluY29weSA9IG5ieXRlczsKKwkJCQlpZiAoc2hmLT53YnNpemUpCisJCQkJCW5jb3B5IC09IG5ieXRlcyAlIHNoZi0+d2JzaXplOworCQkJCW5ieXRlcyAtPSBuY29weTsKKwkJCQl3aGlsZSAobmNvcHkgPiAwKSB7CisJCQkJCW4gPSB3cml0ZShzaGYtPmZkLCBidWYsIG5jb3B5KTsKKwkJCQkJaWYgKG4gPCAwKSB7CisJCQkJCQlpZiAoZXJybm8gPT0gRUlOVFIgJiYKKwkJCQkJCSAgICAhKHNoZi0+ZmxhZ3MgJiBTSEZfSU5URVJSVVBUKSkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VSUk9SOworCQkJCQkJc2hmLT5lcnJub18gPSBlcnJubzsKKwkJCQkJCXNoZi0+d25sZWZ0ID0gMDsKKwkJCQkJCS8qCisJCQkJCQkgKiBOb3RlOiBmd3JpdGUoMykgcmV0dXJucyAwCisJCQkJCQkgKiBmb3IgZXJyb3JzIC0gdGhpcyBkb2Vzbid0CisJCQkJCQkgKi8KKwkJCQkJCXJldHVybiAoRU9GKTsKKwkJCQkJfQorCQkJCQlidWYgKz0gbjsKKwkJCQkJbmNvcHkgLT0gbjsKKwkJCQl9CisJCQl9CisJCQkvKiAuLi4gYW5kIGJ1ZmZlciB0aGUgcmVzdCAqLworCQl9CisJCWlmIChuYnl0ZXMgPiAwKSB7CisJCQkvKiB3cml0ZSByZW1haW5pbmcgYnl0ZXMgdG8gYnVmZmVyICovCisJCQltZW1jcHkoc2hmLT53cCwgYnVmLCBuYnl0ZXMpOworCQkJc2hmLT53cCArPSBuYnl0ZXM7CisJCQlzaGYtPndubGVmdCAtPSBuYnl0ZXM7CisJCX0KKwl9CisKKwlyZXR1cm4gKG9yaWdfbmJ5dGVzKTsKK30KKworaW50CitzaGZfZnByaW50ZihzdHJ1Y3Qgc2hmICpzaGYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbiA9IHNoZl92ZnByaW50ZihzaGYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChuKTsKK30KKworaW50CitzaGZfc25wcmludGYoY2hhciAqYnVmLCBpbnQgYnNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBzaGYgc2hmOworCXZhX2xpc3QgYXJnczsKKwlpbnQgbjsKKworCWlmICghYnVmIHx8IGJzaXplIDw9IDApCisJCWludGVybmFsX2Vycm9yZigic2hmX3NucHJpbnRmOiBidWYgJXAsIGJzaXplICVkIiwgYnVmLCBic2l6ZSk7CisKKwlzaGZfc29wZW4oYnVmLCBic2l6ZSwgU0hGX1dSLCAmc2hmKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCW4gPSBzaGZfdmZwcmludGYoJnNoZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJc2hmX3NjbG9zZSgmc2hmKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCisJcmV0dXJuIChuKTsKK30KKworY2hhciAqCitzaGZfc21wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IHNoZiBzaGY7CisJdmFfbGlzdCBhcmdzOworCisJc2hmX3NvcGVuKE5VTEwsIDAsIFNIRl9XUnxTSEZfRFlOQU1JQywgJnNoZik7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlzaGZfdmZwcmludGYoJnNoZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIChzaGZfc2Nsb3NlKCZzaGYpKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCit9CisKKyN1bmRlZiBGUAkJCS8qIGlmIHlvdSB3YW50IGZsb2F0aW5nIHBvaW50IHN0dWZmICovCisKKyNpZm5kZWYgRE1BWEVYUAorIyBkZWZpbmUgRE1BWEVYUAkxMjgJLyogc2hvdWxkIGJlIGJpZyBlbm91Z2ggKi8KKyNlbmRpZgorCisjZGVmaW5lIEJVRl9TSVpFCTEyOAorLyogbXVzdCBiZSA+IE1BWChETUFYRVhQLCBsb2cxMChwb3coMiwgRFNJR05JRikpKSArIGNlaWwobG9nMTAoRE1BWEVYUCkpICsgOAorICogKEkgdGhpbmspOyBzaW5jZSBpdCdzIGhhcmQgdG8gZXhwcmVzcyBhcyBhIGNvbnN0YW50LCBqdXN0IHVzZSBhIGxhcmdlIGJ1ZmZlcgorICovCisjZGVmaW5lIEZQQlVGX1NJWkUJKERNQVhFWFArMTYpCisKKyNkZWZpbmUJRkxfSEFTSAkJMHgwMDEJLyogJyMnIHNlZW4gKi8KKyNkZWZpbmUgRkxfUExVUwkJMHgwMDIJLyogJysnIHNlZW4gKi8KKyNkZWZpbmUgRkxfUklHSFQJMHgwMDQJLyogJy0nIHNlZW4gKi8KKyNkZWZpbmUgRkxfQkxBTksJMHgwMDgJLyogJyAnIHNlZW4gKi8KKyNkZWZpbmUgRkxfU0hPUlQJMHgwMTAJLyogJ2gnIHNlZW4gKi8KKyNkZWZpbmUgRkxfTE9ORwkJMHgwMjAJLyogJ2wnIHNlZW4gKi8KKyNkZWZpbmUgRkxfWkVSTwkJMHgwNDAJLyogJzAnIHNlZW4gKi8KKyNkZWZpbmUgRkxfRE9UCQkweDA4MAkvKiAnLicgc2VlbiAqLworI2RlZmluZSBGTF9VUFBFUgkweDEwMAkvKiBmb3JtYXQgY2hhcmFjdGVyIHdhcyB1cHBlcmNhc2UgKi8KKyNkZWZpbmUgRkxfTlVNQkVSCTB4MjAwCS8qIGEgbnVtYmVyIHdhcyBmb3JtYXRlZCAlW2RvdXhlZmddICovCisKKworaW50CitzaGZfdmZwcmludGYoc3RydWN0IHNoZiAqc2hmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwljb25zdCBjaGFyICpzOworCWNoYXIgYywgKmNwOworCWludCB0bXAgPSAwLCBmaWVsZCwgcHJlY2lzaW9uLCBsZW4sIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbG51bTsKKwkvKiAlI28gcHJvZHVjZXMgdGhlIGxvbmdlc3Qgb3V0cHV0ICovCisJY2hhciBudW1idWZbKDggKiBzaXplb2YobG9uZykgKyAyKSAvIDMgKyAxXTsKKwkvKiB0aGlzIHN0dWZmIGZvciBkZWFsaW5nIHdpdGggdGhlIGJ1ZmZlciAqLworCWludCBud3JpdHRlbiA9IDA7CisKKwlpZiAoIWZtdCkKKwkJcmV0dXJuICgwKTsKKworCXdoaWxlICgoYyA9ICpmbXQrKykpIHsKKwkJaWYgKGMgIT0gJyUnKSB7CisJCQlzaGZfcHV0YyhjLCBzaGYpOworCQkJbndyaXR0ZW4rKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFRoaXMgd2lsbCBhY2NlcHQgZmxhZ3MvZmllbGRzIGluIGFueSBvcmRlciAtIG5vdAorCQkgKiBqdXN0IHRoZSBvcmRlciBzcGVjaWZpZWQgaW4gcHJpbnRmKDMpLCBidXQgdGhpcyBpcworCQkgKiB0aGUgd2F5IF9kb3BybnQoKSBzZWVtcyB0byB3b3JrIChvbiBic2QgYW5kIHN5c1YpLgorCQkgKiBUaGUgb25seSByZXN0cmljdGlvbiBpcyB0aGF0IHRoZSBmb3JtYXQgY2hhcmFjdGVyIG11c3QKKwkJICogY29tZSBsYXN0IDotKS4KKwkJICovCisJCWZsYWdzID0gZmllbGQgPSBwcmVjaXNpb24gPSAwOworCQlmb3IgKCA7IChjID0gKmZtdCsrKSA7ICkgeworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICcjJzoKKwkJCQlmbGFncyB8PSBGTF9IQVNIOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlICcrJzoKKwkJCQlmbGFncyB8PSBGTF9QTFVTOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlICctJzoKKwkJCQlmbGFncyB8PSBGTF9SSUdIVDsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnICc6CisJCQkJZmxhZ3MgfD0gRkxfQkxBTks7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJzAnOgorCQkJCWlmICghKGZsYWdzICYgRkxfRE9UKSkKKwkJCQkJZmxhZ3MgfD0gRkxfWkVSTzsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnLic6CisJCQkJZmxhZ3MgfD0gRkxfRE9UOworCQkJCXByZWNpc2lvbiA9IDA7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJyonOgorCQkJCXRtcCA9IHZhX2FyZyhhcmdzLCBpbnQpOworCQkJCWlmIChmbGFncyAmIEZMX0RPVCkKKwkJCQkJcHJlY2lzaW9uID0gdG1wOworCQkJCWVsc2UgaWYgKChmaWVsZCA9IHRtcCkgPCAwKSB7CisJCQkJCWZpZWxkID0gLWZpZWxkOworCQkJCQlmbGFncyB8PSBGTF9SSUdIVDsKKwkJCQl9CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJ2wnOgorCQkJCWZsYWdzIHw9IEZMX0xPTkc7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJ2gnOgorCQkJCWZsYWdzIHw9IEZMX1NIT1JUOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGtzaF9pc2RpZ2l0KGMpKSB7CisJCQkJdG1wID0gYyAtICcwJzsKKwkJCQl3aGlsZSAoYyA9ICpmbXQrKywga3NoX2lzZGlnaXQoYykpCisJCQkJCXRtcCA9IHRtcCAqIDEwICsgYyAtICcwJzsKKwkJCQktLWZtdDsKKwkJCQlpZiAodG1wIDwgMCkJCS8qIG92ZXJmbG93PyAqLworCQkJCQl0bXAgPSAwOworCQkJCWlmIChmbGFncyAmIEZMX0RPVCkKKwkJCQkJcHJlY2lzaW9uID0gdG1wOworCQkJCWVsc2UKKwkJCQkJZmllbGQgPSB0bXA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwcmVjaXNpb24gPCAwKQorCQkJcHJlY2lzaW9uID0gMDsKKworCQlpZiAoIWMpCQkvKiBuYXN0eSBmb3JtYXQgKi8KKwkJCWJyZWFrOworCisJCWlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworCQkJZmxhZ3MgfD0gRkxfVVBQRVI7CisJCQljID0ga3NoX3RvbG93ZXIoYyk7CisJCX0KKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAncCc6IC8qIHBvaW50ZXIgKi8KKwkJCWZsYWdzICY9IH4oRkxfTE9ORyB8IEZMX1NIT1JUKTsKKwkJCWZsYWdzIHw9IChzaXplb2YoY2hhciAqKSA+IHNpemVvZihpbnQpKSA/CisJCQkgICAgLyogaG9wZSBpdCBmaXRzLi4gKi8gRkxfTE9ORyA6IDA7CisJCQkvKiBhYWFoaGguLi4gKi8KKwkJY2FzZSAnZCc6CisJCWNhc2UgJ2knOgorCQljYXNlICdvJzoKKwkJY2FzZSAndSc6CisJCWNhc2UgJ3gnOgorCQkJZmxhZ3MgfD0gRkxfTlVNQkVSOworCQkJY3AgPSBudW1idWYgKyBzaXplb2YobnVtYnVmKTsKKwkJCS8qLQorCQkJICogWFhYIGFueSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/CisJCQkgKiBYWFggaG9wZWZ1bGx5IHRoZSBjb21waWxlciBvcHRpbWlzZXMgdGhpcyBvdXQKKwkJCSAqCisJCQkgKiBGb3Igc2hvcnRzLCB3ZSB3YW50IHNpZ24gZXh0ZW5kIGZvciAlZCBidXQgbm90CisJCQkgKiBmb3IgJVtveHVdIC0gb24gMTYgYml0IG1hY2hpbmVzIGl0IGRvZXNuJ3QgbWF0dGVyLgorCQkJICogQXNzdW1lcyBDIGNvbXBpbGVyIGhhcyBjb252ZXJ0ZWQgc2hvcnRzIHRvIGludHMKKwkJCSAqIGJlZm9yZSBwdXNoaW5nIHRoZW0uIFhYWCBvcHRpbWlzZSB0aGlzIC10ZworCQkJICovCisJCQlpZiAoZmxhZ3MgJiBGTF9MT05HKQorCQkJCWxudW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CisJCQllbHNlIGlmICgoc2l6ZW9mKGludCkgPCBzaXplb2YobG9uZykpICYmIChjID09ICdkJykpCisJCQkJbG51bSA9IChsb25nKXZhX2FyZyhhcmdzLCBpbnQpOworCQkJZWxzZQorCQkJCWxudW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnZCc6CisJCQljYXNlICdpJzoKKwkJCQlpZiAoMCA+IChsb25nKWxudW0pIHsKKwkJCQkJbG51bSA9IC0obG9uZylsbnVtOworCQkJCQl0bXAgPSAxOworCQkJCX0gZWxzZQorCQkJCQl0bXAgPSAwOworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQljYXNlICd1JzoKKwkJCQlkbyB7CisJCQkJCSotLWNwID0gbG51bSAlIDEwICsgJzAnOworCQkJCQlsbnVtIC89IDEwOworCQkJCX0gd2hpbGUgKGxudW0pOworCisJCQkJaWYgKGMgIT0gJ3UnKSB7CisJCQkJCWlmICh0bXApCisJCQkJCQkqLS1jcCA9ICctJzsKKwkJCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTF9QTFVTKQorCQkJCQkJKi0tY3AgPSAnKyc7CisJCQkJCWVsc2UgaWYgKGZsYWdzICYgRkxfQkxBTkspCisJCQkJCQkqLS1jcCA9ICcgJzsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ28nOgorCQkJCWRvIHsKKwkJCQkJKi0tY3AgPSAobG51bSAmIDB4NykgKyAnMCc7CisJCQkJCWxudW0gPj49IDM7CisJCQkJfSB3aGlsZSAobG51bSk7CisKKwkJCQlpZiAoKGZsYWdzICYgRkxfSEFTSCkgJiYgKmNwICE9ICcwJykKKwkJCQkJKi0tY3AgPSAnMCc7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ3AnOgorCQkJY2FzZSAneCc6IHsKKwkJCQljb25zdCBjaGFyICpkaWdpdHMgPSAoZmxhZ3MgJiBGTF9VUFBFUikgPworCQkJCSAgICBkaWdpdHNfdWMgOiBkaWdpdHNfbGM7CisJCQkJZG8geworCQkJCQkqLS1jcCA9IGRpZ2l0c1tsbnVtICYgMHhmXTsKKwkJCQkJbG51bSA+Pj0gNDsKKwkJCQl9IHdoaWxlIChsbnVtKTsKKworCQkJCWlmIChmbGFncyAmIEZMX0hBU0gpIHsKKwkJCQkJKi0tY3AgPSAoZmxhZ3MgJiBGTF9VUFBFUikgPyAnWCcgOiAneCc7CisJCQkJCSotLWNwID0gJzAnOworCQkJCX0KKwkJCX0KKwkJCX0KKwkJCWxlbiA9IG51bWJ1ZiArIHNpemVvZihudW1idWYpIC0gKHMgPSBjcCk7CisJCQlpZiAoZmxhZ3MgJiBGTF9ET1QpIHsKKwkJCQlpZiAocHJlY2lzaW9uID4gbGVuKSB7CisJCQkJCWZpZWxkID0gcHJlY2lzaW9uOworCQkJCQlmbGFncyB8PSBGTF9aRVJPOworCQkJCX0gZWxzZQorCQkJCQlwcmVjaXNpb24gPSBsZW47IC8qIG5vIGxvc3MgKi8KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ3MnOgorCQkJaWYgKCEocyA9IHZhX2FyZyhhcmdzLCBjb25zdCBjaGFyICopKSkKKwkJCQlzID0gIihudWxsKSI7CisJCQlsZW4gPSB1dGZfbWJzd2lkdGgocyk7CisJCQlicmVhazsKKworCQljYXNlICdjJzoKKwkJCWZsYWdzICY9IH5GTF9ET1Q7CisJCQludW1idWZbMF0gPSAoY2hhcikodmFfYXJnKGFyZ3MsIGludCkpOworCQkJcyA9IG51bWJ1ZjsKKwkJCWxlbiA9IDE7CisJCQlicmVhazsKKworCQljYXNlICclJzoKKwkJZGVmYXVsdDoKKwkJCW51bWJ1ZlswXSA9IGM7CisJCQlzID0gbnVtYnVmOworCQkJbGVuID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQXQgdGhpcyBwb2ludCBzIHNob3VsZCBwb2ludCB0byBhIHN0cmluZyB0aGF0IGlzIHRvIGJlCisJCSAqIGZvcm1hdHRlZCwgYW5kIGxlbiBzaG91bGQgYmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgorCQkgKi8KKwkJaWYgKCEoZmxhZ3MgJiBGTF9ET1QpIHx8IGxlbiA8IHByZWNpc2lvbikKKwkJCXByZWNpc2lvbiA9IGxlbjsKKwkJaWYgKGZpZWxkID4gcHJlY2lzaW9uKSB7CisJCQlmaWVsZCAtPSBwcmVjaXNpb247CisJCQlpZiAoIShmbGFncyAmIEZMX1JJR0hUKSkgeworCQkJCWZpZWxkID0gLWZpZWxkOworCQkJCS8qIHNraXAgcGFzdCBzaWduIG9yIDB4IHdoZW4gcGFkZGluZyB3aXRoIDAgKi8KKwkJCQlpZiAoKGZsYWdzICYgRkxfWkVSTykgJiYgKGZsYWdzICYgRkxfTlVNQkVSKSkgeworCQkJCQlpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJyB8fAorCQkJCQkgICAgKnMgPT0gJyAnKSB7CisJCQkJCQlzaGZfcHV0Yygqcywgc2hmKTsKKwkJCQkJCXMrKzsKKwkJCQkJCXByZWNpc2lvbi0tOworCQkJCQkJbndyaXR0ZW4rKzsKKwkJCQkJfSBlbHNlIGlmICgqcyA9PSAnMCcpIHsKKwkJCQkJCXNoZl9wdXRjKCpzLCBzaGYpOworCQkJCQkJcysrOworCQkJCQkJbndyaXR0ZW4rKzsKKwkJCQkJCWlmICgtLXByZWNpc2lvbiA+IDAgJiYKKwkJCQkJCSAgICAoKnMgfCAweDIwKSA9PSAneCcpIHsKKwkJCQkJCQlzaGZfcHV0Yygqcywgc2hmKTsKKwkJCQkJCQlzKys7CisJCQkJCQkJcHJlY2lzaW9uLS07CisJCQkJCQkJbndyaXR0ZW4rKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQljID0gJzAnOworCQkJCX0gZWxzZQorCQkJCQljID0gZmxhZ3MgJiBGTF9aRVJPID8gJzAnIDogJyAnOworCQkJCWlmIChmaWVsZCA8IDApIHsKKwkJCQkJbndyaXR0ZW4gKz0gLWZpZWxkOworCQkJCQlmb3IgKCA7IGZpZWxkIDwgMCA7IGZpZWxkKyspCisJCQkJCQlzaGZfcHV0YyhjLCBzaGYpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWMgPSAnICc7CisJCX0gZWxzZQorCQkJZmllbGQgPSAwOworCisJCWlmIChwcmVjaXNpb24gPiAwKSB7CisJCQljb25zdCBjaGFyICpxOworCisJCQlud3JpdHRlbiArPSBwcmVjaXNpb247CisJCQlxID0gdXRmX3NraXBjb2xzKHMsIHByZWNpc2lvbik7CisJCQlkbyB7CisJCQkJc2hmX3B1dGMoKnMsIHNoZik7CisJCQl9IHdoaWxlICgrK3MgPCBxKTsKKwkJfQorCQlpZiAoZmllbGQgPiAwKSB7CisJCQlud3JpdHRlbiArPSBmaWVsZDsKKwkJCWZvciAoIDsgZmllbGQgPiAwIDsgLS1maWVsZCkKKwkJCQlzaGZfcHV0YyhjLCBzaGYpOworCQl9CisJfQorCisJcmV0dXJuIChzaGZfZXJyb3Ioc2hmKSA/IEVPRiA6IG53cml0dGVuKTsKK30KKworI2lmZGVmIE1LU0hfU01BTEwKK2ludAorc2hmX2dldGMoc3RydWN0IHNoZiAqc2hmKQoreworCXJldHVybiAoKHNoZiktPnJubGVmdCA+IDAgPyAoc2hmKS0+cm5sZWZ0LS0sICooc2hmKS0+cnArKyA6CisJICAgIHNoZl9nZXRjaGFyKHNoZikpOworfQorCitpbnQKK3NoZl9wdXRjKGludCBjLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJcmV0dXJuICgoc2hmKS0+d25sZWZ0ID09IDAgPyBzaGZfcHV0Y2hhcigoYyksIChzaGYpKSA6CisJICAgICgoc2hmKS0+d25sZWZ0LS0sICooc2hmKS0+d3ArKyA9IChjKSkpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9zeW4uYyBiL21rc2gvc3JjL3N5bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjI4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9zeW4uYwpAQCAtMCwwICsxLDEwMDQgQEAKKy8qCSRPcGVuQlNEOiBzeW4uYyx2IDEuMjggMjAwOC8wNy8yMyAxNjozNDozOCBqYXJlZHkgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9zeW4uYyx2IDEuNDkgMjAxMC8wNy8xNyAyMjowOTozOSB0ZyBFeHAgJCIpOworCitzdHJ1Y3QgbmVzdGluZ19zdGF0ZSB7CisJaW50IHN0YXJ0X3Rva2VuOwkvKiB0b2tlbiB0aGFuIGJlZ2FuIG5lc3RpbmcgKGVnLCBGT1IpICovCisJaW50IHN0YXJ0X2xpbmU7CQkvKiBsaW5lIG5lc3RpbmcgYmVnYW4gb24gKi8KK307CisKK3N0YXRpYyB2b2lkIHl5cGFyc2Uodm9pZCk7CitzdGF0aWMgc3RydWN0IG9wICpwaXBlbGluZShpbnQpOworc3RhdGljIHN0cnVjdCBvcCAqYW5kb3Iodm9pZCk7CitzdGF0aWMgc3RydWN0IG9wICpjX2xpc3QoaW50KTsKK3N0YXRpYyBzdHJ1Y3QgaW93b3JkICpzeW5pbyhpbnQpOworc3RhdGljIHN0cnVjdCBvcCAqbmVzdGVkKGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBvcCAqZ2V0X2NvbW1hbmQoaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmRvZ3JvdXAodm9pZCk7CitzdGF0aWMgc3RydWN0IG9wICp0aGVucGFydCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmVsc2VwYXJ0KHZvaWQpOworc3RhdGljIHN0cnVjdCBvcCAqY2FzZWxpc3Qodm9pZCk7CitzdGF0aWMgc3RydWN0IG9wICpjYXNlcGFydChpbnQpOworc3RhdGljIHN0cnVjdCBvcCAqZnVuY3Rpb25fYm9keShjaGFyICosIGJvb2wpOworc3RhdGljIGNoYXIgKip3b3JkbGlzdCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmJsb2NrKGludCwgc3RydWN0IG9wICosIHN0cnVjdCBvcCAqLCBjaGFyICoqKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKm5ld3RwKGludCk7CitzdGF0aWMgdm9pZCBzeW50YXhlcnIoY29uc3QgY2hhciAqKSBNS1NIX0FfTk9SRVRVUk47CitzdGF0aWMgdm9pZCBuZXN0aW5nX3B1c2goc3RydWN0IG5lc3Rpbmdfc3RhdGUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIG5lc3RpbmdfcG9wKHN0cnVjdCBuZXN0aW5nX3N0YXRlICopOworc3RhdGljIGludCBhc3NpZ25fY29tbWFuZChjaGFyICopOworc3RhdGljIGludCBpbmFsaWFzKHN0cnVjdCBzb3VyY2UgKik7CitzdGF0aWMgVGVzdF9vcCBkYnRlc3RwX2lzYShUZXN0X2VudiAqLCBUZXN0X21ldGEpOworc3RhdGljIGNvbnN0IGNoYXIgKmRidGVzdHBfZ2V0b3BuZChUZXN0X2VudiAqLCBUZXN0X29wLCBib29sKTsKK3N0YXRpYyBpbnQgZGJ0ZXN0cF9ldmFsKFRlc3RfZW52ICosIFRlc3Rfb3AsIGNvbnN0IGNoYXIgKiwKKyAgICBjb25zdCBjaGFyICosIGJvb2wpOworc3RhdGljIHZvaWQgZGJ0ZXN0cF9lcnJvcihUZXN0X2VudiAqLCBpbnQsIGNvbnN0IGNoYXIgKikgTUtTSF9BX05PUkVUVVJOOworCitzdGF0aWMgc3RydWN0IG9wICpvdXR0cmVlOwkJLyogeXlwYXJzZSBvdXRwdXQgKi8KK3N0YXRpYyBzdHJ1Y3QgbmVzdGluZ19zdGF0ZSBuZXN0aW5nOwkvKiBcbiBjaGFuZ2VkIHRvIDsgKi8KKworc3RhdGljIGludCByZWplY3Q7CQkvKiB0b2tlbihjZikgZ2V0cyBzeW1ib2wgYWdhaW4gKi8KK3N0YXRpYyBpbnQgc3ltYm9sOwkJLyogeXlsZXggdmFsdWUgKi8KKworI2RlZmluZSBSRUpFQ1QJCShyZWplY3QgPSAxKQorI2RlZmluZSBBQ0NFUFQJCShyZWplY3QgPSAwKQorI2RlZmluZSB0b2tlbihjZikJKChyZWplY3QpID8gKEFDQ0VQVCwgc3ltYm9sKSA6IChzeW1ib2wgPSB5eWxleChjZikpKQorI2RlZmluZSB0cGVlayhjZikJKChyZWplY3QpID8gKHN5bWJvbCkgOiAoUkVKRUNULCBzeW1ib2wgPSB5eWxleChjZikpKQorI2RlZmluZSBtdXN0aGF2ZShjLGNmKQlkbyB7IGlmICh0b2tlbihjZikgIT0gKGMpKSBzeW50YXhlcnIoTlVMTCk7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCit5eXBhcnNlKHZvaWQpCit7CisJaW50IGM7CisKKwlBQ0NFUFQ7CisKKwlvdXR0cmVlID0gY19saXN0KHNvdXJjZS0+dHlwZSA9PSBTU1RSSU5HKTsKKwljID0gdHBlZWsoMCk7CisJaWYgKGMgPT0gMCAmJiAhb3V0dHJlZSkKKwkJb3V0dHJlZSA9IG5ld3RwKFRFT0YpOworCWVsc2UgaWYgKGMgIT0gJ1xuJyAmJiBjICE9IDApCisJCXN5bnRheGVycihOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitwaXBlbGluZShpbnQgY2YpCit7CisJc3RydWN0IG9wICp0LCAqcCwgKnRsID0gTlVMTDsKKworCXQgPSBnZXRfY29tbWFuZChjZik7CisJaWYgKHQgIT0gTlVMTCkgeworCQl3aGlsZSAodG9rZW4oMCkgPT0gJ3wnKSB7CisJCQlpZiAoKHAgPSBnZXRfY29tbWFuZChDT05USU4pKSA9PSBOVUxMKQorCQkJCXN5bnRheGVycihOVUxMKTsKKwkJCWlmICh0bCA9PSBOVUxMKQorCQkJCXQgPSB0bCA9IGJsb2NrKFRQSVBFLCB0LCBwLCBOT1dPUkRTKTsKKwkJCWVsc2UKKwkJCQl0bCA9IHRsLT5yaWdodCA9IGJsb2NrKFRQSVBFLCB0bC0+cmlnaHQsIHAsIE5PV09SRFMpOworCQl9CisJCVJFSkVDVDsKKwl9CisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCithbmRvcih2b2lkKQoreworCXN0cnVjdCBvcCAqdCwgKnA7CisJaW50IGM7CisKKwl0ID0gcGlwZWxpbmUoMCk7CisJaWYgKHQgIT0gTlVMTCkgeworCQl3aGlsZSAoKGMgPSB0b2tlbigwKSkgPT0gTE9HQU5EIHx8IGMgPT0gTE9HT1IpIHsKKwkJCWlmICgocCA9IHBpcGVsaW5lKENPTlRJTikpID09IE5VTEwpCisJCQkJc3ludGF4ZXJyKE5VTEwpOworCQkJdCA9IGJsb2NrKGMgPT0gTE9HQU5EPyBUQU5EOiBUT1IsIHQsIHAsIE5PV09SRFMpOworCQl9CisJCVJFSkVDVDsKKwl9CisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitjX2xpc3QoaW50IG11bHRpKQoreworCXN0cnVjdCBvcCAqdCA9IE5VTEwsICpwLCAqdGwgPSBOVUxMOworCWludCBjLCBoYXZlX3NlcDsKKworCXdoaWxlICgxKSB7CisJCXAgPSBhbmRvcigpOworCQkvKiBUb2tlbiBoYXMgYWx3YXlzIGJlZW4gcmVhZC9yZWplY3RlZCBhdCB0aGlzIHBvaW50LCBzbworCQkgKiB3ZSBkb24ndCB3b3JyeSBhYm91dCB3aGF0IGZsYWdzIHRvIHBhc3MgdG9rZW4oKQorCQkgKi8KKwkJYyA9IHRva2VuKDApOworCQloYXZlX3NlcCA9IDE7CisJCWlmIChjID09ICdcbicgJiYgKG11bHRpIHx8IGluYWxpYXMoc291cmNlKSkpIHsKKwkJCWlmICghcCkgLyogaWdub3JlIGJsYW5rIGxpbmVzICovCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoIXApCisJCQlicmVhazsKKwkJZWxzZSBpZiAoYyA9PSAnJicgfHwgYyA9PSBDT1BST0MpCisJCQlwID0gYmxvY2soYyA9PSAnJicgPyBUQVNZTkMgOiBUQ09QUk9DLAorCQkJICAgIHAsIE5PQkxPQ0ssIE5PV09SRFMpOworCQllbHNlIGlmIChjICE9ICc7JykKKwkJCWhhdmVfc2VwID0gMDsKKwkJaWYgKCF0KQorCQkJdCA9IHA7CisJCWVsc2UgaWYgKCF0bCkKKwkJCXQgPSB0bCA9IGJsb2NrKFRMSVNULCB0LCBwLCBOT1dPUkRTKTsKKwkJZWxzZQorCQkJdGwgPSB0bC0+cmlnaHQgPSBibG9jayhUTElTVCwgdGwtPnJpZ2h0LCBwLCBOT1dPUkRTKTsKKwkJaWYgKCFoYXZlX3NlcCkKKwkJCWJyZWFrOworCX0KKwlSRUpFQ1Q7CisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIHN0cnVjdCBpb3dvcmQgKgorc3luaW8oaW50IGNmKQoreworCXN0cnVjdCBpb3dvcmQgKmlvcDsKKwlzdGF0aWMgc3RydWN0IGlvd29yZCAqbmV4dGlvcCA9IE5VTEw7CisJYm9vbCBpc2hlcmU7CisKKwlpZiAobmV4dGlvcCAhPSBOVUxMKSB7CisJCWlvcCA9IG5leHRpb3A7CisJCW5leHRpb3AgPSBOVUxMOworCQlyZXR1cm4gKGlvcCk7CisJfQorCisJaWYgKHRwZWVrKGNmKSAhPSBSRURJUikKKwkJcmV0dXJuIChOVUxMKTsKKwlBQ0NFUFQ7CisJaW9wID0geXlsdmFsLmlvcDsKKwlpc2hlcmUgPSAoaW9wLT5mbGFnJklPVFlQRSkgPT0gSU9IRVJFOworCW11c3RoYXZlKExXT1JELCBpc2hlcmUgPyBIRVJFREVMSU0gOiAwKTsKKwlpZiAoaXNoZXJlKSB7CisJCWlvcC0+ZGVsaW0gPSB5eWx2YWwuY3A7CisJCWlmICgqaWRlbnQgIT0gMCkgLyogdW5xdW90ZWQgKi8KKwkJCWlvcC0+ZmxhZyB8PSBJT0VWQUw7CisJCWlmIChoZXJlcCA+ICZoZXJlc1tIRVJFUyAtIDFdKQorCQkJeXllcnJvcigidG9vIG1hbnkgPDxzXG4iKTsKKwkJKmhlcmVwKysgPSBpb3A7CisJfSBlbHNlCisJCWlvcC0+bmFtZSA9IHl5bHZhbC5jcDsKKworCWlmIChpb3AtPmZsYWcgJiBJT0JBU0gpIHsKKwkJY2hhciAqY3A7CisKKwkJbmV4dGlvcCA9IGFsbG9jKHNpemVvZigqaW9wKSwgQVRFTVApOworCQluZXh0aW9wLT5uYW1lID0gY3AgPSBhbGxvYyg1LCBBVEVNUCk7CisKKwkJaWYgKGlvcC0+dW5pdCA+IDkpIHsKKwkJCSpjcCsrID0gQ0hBUjsKKwkJCSpjcCsrID0gJzAnICsgKGlvcC0+dW5pdCAvIDEwKTsKKwkJfQorCQkqY3ArKyA9IENIQVI7CisJCSpjcCsrID0gJzAnICsgKGlvcC0+dW5pdCAlIDEwKTsKKwkJKmNwID0gRU9TOworCisJCWlvcC0+ZmxhZyAmPSB+SU9CQVNIOworCQluZXh0aW9wLT51bml0ID0gMjsKKwkJbmV4dGlvcC0+ZmxhZyA9IElPRFVQOworCQluZXh0aW9wLT5kZWxpbSA9IE5VTEw7CisJCW5leHRpb3AtPmhlcmVkb2MgPSBOVUxMOworCX0KKwlyZXR1cm4gKGlvcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorbmVzdGVkKGludCB0eXBlLCBpbnQgc21hcmssIGludCBlbWFyaykKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisJc3RydWN0IG5lc3Rpbmdfc3RhdGUgb2xkX25lc3Rpbmc7CisKKwluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBzbWFyayk7CisJdCA9IGNfbGlzdCh0cnVlKTsKKwltdXN0aGF2ZShlbWFyaywgS0VZV09SRHxBTElBUyk7CisJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKKwlyZXR1cm4gKGJsb2NrKHR5cGUsIHQsIE5PQkxPQ0ssIE5PV09SRFMpKTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitnZXRfY29tbWFuZChpbnQgY2YpCit7CisJc3RydWN0IG9wICp0OworCWludCBjLCBpb3BuID0gMCwgc3luaW9jZjsKKwlzdHJ1Y3QgaW93b3JkICppb3AsICoqaW9wczsKKwlYUHRyViBhcmdzLCB2YXJzOworCXN0cnVjdCBuZXN0aW5nX3N0YXRlIG9sZF9uZXN0aW5nOworCisJaW9wcyA9IGFsbG9jKChOVUZJTEUgKyAxKSAqIHNpemVvZihzdHJ1Y3QgaW93b3JkICopLCBBVEVNUCk7CisJWFBpbml0KGFyZ3MsIDE2KTsKKwlYUGluaXQodmFycywgMTYpOworCisJc3luaW9jZiA9IEtFWVdPUkR8QUxJQVM7CisJc3dpdGNoIChjID0gdG9rZW4oY2Z8S0VZV09SRHxBTElBU3xWQVJBU04pKSB7CisJZGVmYXVsdDoKKwkJUkVKRUNUOworCQlhZnJlZShpb3BzLCBBVEVNUCk7CisJCVhQZnJlZShhcmdzKTsKKwkJWFBmcmVlKHZhcnMpOworCQlyZXR1cm4gKE5VTEwpOyAvKiBlbXB0eSBsaW5lICovCisKKwljYXNlIExXT1JEOgorCWNhc2UgUkVESVI6CisJCVJFSkVDVDsKKwkJc3luaW9jZiAmPSB+KEtFWVdPUkR8QUxJQVMpOworCQl0ID0gbmV3dHAoVENPTSk7CisJCXQtPmxpbmVubyA9IHNvdXJjZS0+bGluZTsKKwkJd2hpbGUgKDEpIHsKKwkJCWNmID0gKHQtPnUuZXZhbGZsYWdzID8gQVJSQVlWQVIgOiAwKSB8CisJCQkgICAgKFhQc2l6ZShhcmdzKSA9PSAwID8gQUxJQVN8VkFSQVNOIDogQ01EV09SRCk7CisJCQlzd2l0Y2ggKHRwZWVrKGNmKSkgeworCQkJY2FzZSBSRURJUjoKKwkJCQl3aGlsZSAoKGlvcCA9IHN5bmlvKGNmKSkgIT0gTlVMTCkgeworCQkJCQlpZiAoaW9wbiA+PSBOVUZJTEUpCisJCQkJCQl5eWVycm9yKCJ0b28gbWFueSByZWRpcmVjdGlvbnNcbiIpOworCQkJCQlpb3BzW2lvcG4rK10gPSBpb3A7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIExXT1JEOgorCQkJCUFDQ0VQVDsKKwkJCQkvKiB0aGUgaW9wbiA9PSAwIGFuZCBYUHNpemUodmFycykgPT0gMCBhcmUKKwkJCQkgKiBkdWJpb3VzIGJ1dCBBVCZUIGtzaCBhY3RzIHRoaXMgd2F5CisJCQkJICovCisJCQkJaWYgKGlvcG4gPT0gMCAmJiBYUHNpemUodmFycykgPT0gMCAmJgorCQkJCSAgICBYUHNpemUoYXJncykgPT0gMCAmJgorCQkJCSAgICBhc3NpZ25fY29tbWFuZChpZGVudCkpCisJCQkJCXQtPnUuZXZhbGZsYWdzID0gRE9WQUNIRUNLOworCQkJCWlmICgoWFBzaXplKGFyZ3MpID09IDAgfHwgRmxhZyhGS0VZV09SRCkpICYmCisJCQkJICAgIGlzX3dkdmFyYXNzaWduKHl5bHZhbC5jcCkpCisJCQkJCVhQcHV0KHZhcnMsIHl5bHZhbC5jcCk7CisJCQkJZWxzZQorCQkJCQlYUHB1dChhcmdzLCB5eWx2YWwuY3ApOworCQkJCWJyZWFrOworCisJCQljYXNlICcoJzoKKwkJCQkvKiBDaGVjayBmb3IgIj4gZm9vIChlY2hvIGhpKSIgd2hpY2ggQVQmVCBrc2gKKwkJCQkgKiBhbGxvd3MgKG5vdCBQT1NJWCwgYnV0IG5vdCBkaXNhbGxvd2VkKQorCQkJCSAqLworCQkJCWFmcmVlKHQsIEFURU1QKTsKKwkJCQlpZiAoWFBzaXplKGFyZ3MpID09IDAgJiYgWFBzaXplKHZhcnMpID09IDApIHsKKwkJCQkJQUNDRVBUOworCQkJCQlnb3RvIFN1YnNoZWxsOworCQkJCX0KKyNpZm5kZWYgTUtTSF9TTUFMTAorCQkJCWlmICgoWFBzaXplKGFyZ3MpID09IDAgfHwgRmxhZyhGS0VZV09SRCkpICYmCisJCQkJICAgIFhQc2l6ZSh2YXJzKSA9PSAxICYmIGlzX3dkdmFyYXNzaWduKHl5bHZhbC5jcCkpCisJCQkJCWdvdG8gaXNfd2RhcnJhc3NpZ247CisjZW5kaWYKKwkJCQkvKiBNdXN0IGJlIGEgZnVuY3Rpb24gKi8KKwkJCQlpZiAoaW9wbiAhPSAwIHx8IFhQc2l6ZShhcmdzKSAhPSAxIHx8CisJCQkJICAgIFhQc2l6ZSh2YXJzKSAhPSAwKQorCQkJCQlzeW50YXhlcnIoTlVMTCk7CisJCQkJQUNDRVBUOworCQkJCS8qKCovCisJCQkJbXVzdGhhdmUoJyknLCAwKTsKKwkJCQl0ID0gZnVuY3Rpb25fYm9keShYUHB0cnYoYXJncylbMF0sIGZhbHNlKTsKKwkJCQlnb3RvIExlYXZlOworI2lmbmRlZiBNS1NIX1NNQUxMCisgaXNfd2RhcnJhc3NpZ246CisJCQl7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgc2V0X2NtZDBbXSA9IHsKKwkJCQkJQ0hBUiwgJ2UnLCBDSEFSLCAndicsCisJCQkJCUNIQVIsICdhJywgQ0hBUiwgJ2wnLCBFT1MKKwkJCQl9OworCQkJCXN0YXRpYyBjb25zdCBjaGFyIHNldF9jbWQxW10gPSB7CisJCQkJCUNIQVIsICdzJywgQ0hBUiwgJ2UnLAorCQkJCQlDSEFSLCAndCcsIENIQVIsICcgJywKKwkJCQkJQ0hBUiwgJy0nLCBDSEFSLCAnQScsIEVPUworCQkJCX07CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgc2V0X2NtZDJbXSA9IHsKKwkJCQkJQ0hBUiwgJy0nLCBDSEFSLCAnLScsIEVPUworCQkJCX07CisJCQkJY2hhciAqdGNwOworCQkJCVhQZnJlZSh2YXJzKTsKKwkJCQlYUGluaXQodmFycywgMTYpOworCQkJCS8qCisJCQkJICogd2Uga25vdyAob3IgcmF0aGVyIGhvcGUpIHRoYXQgeXlsdmFsLmNwCisJCQkJICogY29udGFpbnMgYSBzdHJpbmcgInZhcm5hbWU9IgorCQkJCSAqLworCQkJCXRjcCA9IHdkY29weSh5eWx2YWwuY3AsIEFURU1QKTsKKwkJCQl0Y3Bbd2RzY2FuKHRjcCwgRU9TKSAtIHRjcCAtIDNdID0gRU9TOworCQkJCS8qIG5vdyBtYWtlIGFuIGFycmF5IGFzc2lnbm1lbnQgY29tbWFuZCAqLworCQkJCXQgPSBuZXd0cChUQ09NKTsKKwkJCQl0LT5saW5lbm8gPSBzb3VyY2UtPmxpbmU7CisJCQkJQUNDRVBUOworCQkJCVhQcHV0KGFyZ3MsIHdkY29weShzZXRfY21kMCwgQVRFTVApKTsKKwkJCQlYUHB1dChhcmdzLCB3ZGNvcHkoc2V0X2NtZDEsIEFURU1QKSk7CisJCQkJWFBwdXQoYXJncywgdGNwKTsKKwkJCQlYUHB1dChhcmdzLCB3ZGNvcHkoc2V0X2NtZDIsIEFURU1QKSk7CisJCQkJbXVzdGhhdmUoTFdPUkQsTEVUQVJSQVkpOworCQkJCVhQcHV0KGFyZ3MsIHl5bHZhbC5jcCk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIExlYXZlOworCQkJfQorCQl9CisgTGVhdmU6CisJCWJyZWFrOworCisJY2FzZSAnKCc6CisgU3Vic2hlbGw6CisJCXQgPSBuZXN0ZWQoVFBBUkVOLCAnKCcsICcpJyk7CisJCWJyZWFrOworCisJY2FzZSAneyc6IC8qfSovCisJCXQgPSBuZXN0ZWQoVEJSQUNFLCAneycsICd9Jyk7CisJCWJyZWFrOworCisJY2FzZSBNRFBBUkVOOiB7CisJCWludCBsbm87CisJCXN0YXRpYyBjb25zdCBjaGFyIGxldF9jbWRbXSA9IHsKKwkJCUNIQVIsICdsJywgQ0hBUiwgJ2UnLAorCQkJQ0hBUiwgJ3QnLCBFT1MKKwkJfTsKKworCQkvKiBMZWF2ZSBLRVlXT1JEIGluIHN5bmlvY2YgKGFsbG93IGlmICgoIDEgKSkgdGhlbiAuLi4pICovCisJCWxubyA9IHNvdXJjZS0+bGluZTsKKwkJQUNDRVBUOworCQlzd2l0Y2ggKHRva2VuKExFVEVYUFIpKSB7CisJCWNhc2UgTFdPUkQ6CisJCQlicmVhazsKKwkJY2FzZSAnKCc6CS8qICkgKi8KKwkJCWdvdG8gU3Vic2hlbGw7CisJCWRlZmF1bHQ6CisJCQlzeW50YXhlcnIoTlVMTCk7CisJCX0KKwkJdCA9IG5ld3RwKFRDT00pOworCQl0LT5saW5lbm8gPSBsbm87CisJCVhQcHV0KGFyZ3MsIHdkY29weShsZXRfY21kLCBBVEVNUCkpOworCQlYUHB1dChhcmdzLCB5eWx2YWwuY3ApOworCQlicmVhazsKKwl9CisKKwljYXNlIERCUkFDS0VUOiAvKiBbWyAuLiBdXSAqLworCQkvKiBMZWF2ZSBLRVlXT1JEIGluIHN5bmlvY2YgKGFsbG93IGlmIFtbIC1uIDEgXV0gdGhlbiAuLi4pICovCisJCXQgPSBuZXd0cChUREJSQUNLRVQpOworCQlBQ0NFUFQ7CisJCXsKKwkJCVRlc3RfZW52IHRlOworCisJCQl0ZS5mbGFncyA9IFRFRl9EQlJBQ0tFVDsKKwkJCXRlLnBvcy5hdiA9ICZhcmdzOworCQkJdGUuaXNhID0gZGJ0ZXN0cF9pc2E7CisJCQl0ZS5nZXRvcG5kID0gZGJ0ZXN0cF9nZXRvcG5kOworCQkJdGUuZXZhbCA9IGRidGVzdHBfZXZhbDsKKwkJCXRlLmVycm9yID0gZGJ0ZXN0cF9lcnJvcjsKKworCQkJdGVzdF9wYXJzZSgmdGUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGT1I6CisJY2FzZSBTRUxFQ1Q6CisJCXQgPSBuZXd0cCgoYyA9PSBGT1IpID8gVEZPUiA6IFRTRUxFQ1QpOworCQltdXN0aGF2ZShMV09SRCwgQVJSQVlWQVIpOworCQlpZiAoIWlzX3dkdmFybmFtZSh5eWx2YWwuY3AsIHRydWUpKQorCQkJeXllcnJvcigiJXM6IGJhZCBpZGVudGlmaWVyXG4iLAorCQkJICAgIGMgPT0gRk9SID8gImZvciIgOiAic2VsZWN0Iik7CisJCXN0cmR1cHgodC0+c3RyLCBpZGVudCwgQVRFTVApOworCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKKwkJdC0+dmFycyA9IHdvcmRsaXN0KCk7CisJCXQtPmxlZnQgPSBkb2dyb3VwKCk7CisJCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7CisJCWJyZWFrOworCisJY2FzZSBXSElMRToKKwljYXNlIFVOVElMOgorCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKKwkJdCA9IG5ld3RwKChjID09IFdISUxFKSA/IFRXSElMRSA6IFRVTlRJTCk7CisJCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7CisJCXQtPnJpZ2h0ID0gZG9ncm91cCgpOworCQluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOworCQlicmVhazsKKworCWNhc2UgQ0FTRToKKwkJdCA9IG5ld3RwKFRDQVNFKTsKKwkJbXVzdGhhdmUoTFdPUkQsIDApOworCQl0LT5zdHIgPSB5eWx2YWwuY3A7CisJCW5lc3RpbmdfcHVzaCgmb2xkX25lc3RpbmcsIGMpOworCQl0LT5sZWZ0ID0gY2FzZWxpc3QoKTsKKwkJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKKwkJYnJlYWs7CisKKwljYXNlIElGOgorCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKKwkJdCA9IG5ld3RwKFRJRik7CisJCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7CisJCXQtPnJpZ2h0ID0gdGhlbnBhcnQoKTsKKwkJbXVzdGhhdmUoRkksIEtFWVdPUkR8QUxJQVMpOworCQluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOworCQlicmVhazsKKworCWNhc2UgQkFORzoKKwkJc3luaW9jZiAmPSB+KEtFWVdPUkR8QUxJQVMpOworCQl0ID0gcGlwZWxpbmUoMCk7CisJCWlmICh0ID09IE5VTEwpCisJCQlzeW50YXhlcnIoTlVMTCk7CisJCXQgPSBibG9jayhUQkFORywgTk9CTE9DSywgdCwgTk9XT1JEUyk7CisJCWJyZWFrOworCisJY2FzZSBUSU1FOgorCQlzeW5pb2NmICY9IH4oS0VZV09SRHxBTElBUyk7CisJCXQgPSBwaXBlbGluZSgwKTsKKwkJaWYgKHQpIHsKKwkJCXQtPnN0ciA9IGFsbG9jKDIsIEFURU1QKTsKKwkJCXQtPnN0clswXSA9ICdcMCc7CS8qIFRGXyogZmxhZ3MgKi8KKwkJCXQtPnN0clsxXSA9ICdcMCc7CisJCX0KKwkJdCA9IGJsb2NrKFRUSU1FLCB0LCBOT0JMT0NLLCBOT1dPUkRTKTsKKwkJYnJlYWs7CisKKwljYXNlIEZVTkNUSU9OOgorCQltdXN0aGF2ZShMV09SRCwgMCk7CisJCXQgPSBmdW5jdGlvbl9ib2R5KHl5bHZhbC5jcCwgdHJ1ZSk7CisJCWJyZWFrOworCX0KKworCXdoaWxlICgoaW9wID0gc3luaW8oc3luaW9jZikpICE9IE5VTEwpIHsKKwkJaWYgKGlvcG4gPj0gTlVGSUxFKQorCQkJeXllcnJvcigidG9vIG1hbnkgcmVkaXJlY3Rpb25zXG4iKTsKKwkJaW9wc1tpb3BuKytdID0gaW9wOworCX0KKworCWlmIChpb3BuID09IDApIHsKKwkJYWZyZWUoaW9wcywgQVRFTVApOworCQl0LT5pb2FjdCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaW9wc1tpb3BuKytdID0gTlVMTDsKKwkJaW9wcyA9IGFyZXNpemUoaW9wcywgaW9wbiAqIHNpemVvZihzdHJ1Y3QgaW93b3JkICopLCBBVEVNUCk7CisJCXQtPmlvYWN0ID0gaW9wczsKKwl9CisKKwlpZiAodC0+dHlwZSA9PSBUQ09NIHx8IHQtPnR5cGUgPT0gVERCUkFDS0VUKSB7CisJCVhQcHV0KGFyZ3MsIE5VTEwpOworCQl0LT5hcmdzID0gKGNvbnN0IGNoYXIgKiopWFBjbG9zZShhcmdzKTsKKwkJWFBwdXQodmFycywgTlVMTCk7CisJCXQtPnZhcnMgPSAoY2hhciAqKikgWFBjbG9zZSh2YXJzKTsKKwl9IGVsc2UgeworCQlYUGZyZWUoYXJncyk7CisJCVhQZnJlZSh2YXJzKTsKKwl9CisKKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2RvZ3JvdXAodm9pZCkKK3sKKwlpbnQgYzsKKwlzdHJ1Y3Qgb3AgKmxpc3Q7CisKKwljID0gdG9rZW4oQ09OVElOfEtFWVdPUkR8QUxJQVMpOworCS8qIEEgey4uLn0gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBkby4uLmRvbmUgZm9yIGZvci9zZWxlY3QgbG9vcHMKKwkgKiBidXQgbm90IGZvciB3aGlsZS91bnRpbCBsb29wcyAtIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgaXQKKwkgKiBpcyBhIHdoaWxlIGxvb3AgYmVjYXVzZSBpdCB3b3VsZCBoYXZlIGJlZW4gcGFyc2VkIGFzIHBhcnQgb2YKKwkgKiB0aGUgY29uZGl0aW9uYWwgY29tbWFuZCBsaXN0Li4uCisJICovCisJaWYgKGMgPT0gRE8pCisJCWMgPSBET05FOworCWVsc2UgaWYgKGMgPT0gJ3snKQorCQljID0gJ30nOworCWVsc2UKKwkJc3ludGF4ZXJyKE5VTEwpOworCWxpc3QgPSBjX2xpc3QodHJ1ZSk7CisJbXVzdGhhdmUoYywgS0VZV09SRHxBTElBUyk7CisJcmV0dXJuIChsaXN0KTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCit0aGVucGFydCh2b2lkKQoreworCXN0cnVjdCBvcCAqdDsKKworCW11c3RoYXZlKFRIRU4sIEtFWVdPUkR8QUxJQVMpOworCXQgPSBuZXd0cCgwKTsKKwl0LT5sZWZ0ID0gY19saXN0KHRydWUpOworCWlmICh0LT5sZWZ0ID09IE5VTEwpCisJCXN5bnRheGVycihOVUxMKTsKKwl0LT5yaWdodCA9IGVsc2VwYXJ0KCk7CisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitlbHNlcGFydCh2b2lkKQoreworCXN0cnVjdCBvcCAqdDsKKworCXN3aXRjaCAodG9rZW4oS0VZV09SRHxBTElBU3xWQVJBU04pKSB7CisJY2FzZSBFTFNFOgorCQlpZiAoKHQgPSBjX2xpc3QodHJ1ZSkpID09IE5VTEwpCisJCQlzeW50YXhlcnIoTlVMTCk7CisJCXJldHVybiAodCk7CisKKwljYXNlIEVMSUY6CisJCXQgPSBuZXd0cChURUxJRik7CisJCXQtPmxlZnQgPSBjX2xpc3QodHJ1ZSk7CisJCXQtPnJpZ2h0ID0gdGhlbnBhcnQoKTsKKwkJcmV0dXJuICh0KTsKKworCWRlZmF1bHQ6CisJCVJFSkVDVDsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitjYXNlbGlzdCh2b2lkKQoreworCXN0cnVjdCBvcCAqdCwgKnRsOworCWludCBjOworCisJYyA9IHRva2VuKENPTlRJTnxLRVlXT1JEfEFMSUFTKTsKKwkvKiBBIHsuLi59IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgaW4uLi5lc2FjIGZvciBjYXNlIHN0YXRlbWVudHMgKi8KKwlpZiAoYyA9PSBJTikKKwkJYyA9IEVTQUM7CisJZWxzZSBpZiAoYyA9PSAneycpCisJCWMgPSAnfSc7CisJZWxzZQorCQlzeW50YXhlcnIoTlVMTCk7CisJdCA9IHRsID0gTlVMTDsKKwl3aGlsZSAoKHRwZWVrKENPTlRJTnxLRVlXT1JEfEVTQUNPTkxZKSkgIT0gYykgeyAvKiBubyBBTElBUyBoZXJlICovCisJCXN0cnVjdCBvcCAqdGMgPSBjYXNlcGFydChjKTsKKwkJaWYgKHRsID09IE5VTEwpCisJCQl0ID0gdGwgPSB0YywgdGwtPnJpZ2h0ID0gTlVMTDsKKwkJZWxzZQorCQkJdGwtPnJpZ2h0ID0gdGMsIHRsID0gdGM7CisJfQorCW11c3RoYXZlKGMsIEtFWVdPUkR8QUxJQVMpOworCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorY2FzZXBhcnQoaW50IGVuZHRvaykKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisJWFB0clYgcHRuczsKKworCVhQaW5pdChwdG5zLCAxNik7CisJdCA9IG5ld3RwKFRQQVQpOworCS8qIG5vIEFMSUFTIGhlcmUgKi8KKwlpZiAodG9rZW4oQ09OVElOIHwgS0VZV09SRCkgIT0gJygnKQorCQlSRUpFQ1Q7CisJZG8geworCQltdXN0aGF2ZShMV09SRCwgMCk7CisJCVhQcHV0KHB0bnMsIHl5bHZhbC5jcCk7CisJfSB3aGlsZSAodG9rZW4oMCkgPT0gJ3wnKTsKKwlSRUpFQ1Q7CisJWFBwdXQocHRucywgTlVMTCk7CisJdC0+dmFycyA9IChjaGFyICoqKSBYUGNsb3NlKHB0bnMpOworCW11c3RoYXZlKCcpJywgMCk7CisKKwl0LT5sZWZ0ID0gY19saXN0KHRydWUpOworCS8qIE5vdGU6IFBPU0lYIHJlcXVpcmVzIHRoZSA7OyAqLworCWlmICgodHBlZWsoQ09OVElOfEtFWVdPUkR8QUxJQVMpKSAhPSBlbmR0b2spCisJCW11c3RoYXZlKEJSRUFLLCBDT05USU58S0VZV09SRHxBTElBUyk7CisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitmdW5jdGlvbl9ib2R5KGNoYXIgKm5hbWUsCisgICAgYm9vbCBrc2hfZnVuYykJCS8qIGZ1bmN0aW9uIGZvbyB7IC4uLiB9IHZzIGZvbygpIHsgLi4gfSAqLworeworCWNoYXIgKnNuYW1lLCAqcDsKKwlzdHJ1Y3Qgb3AgKnQ7CisJYm9vbCBvbGRfZnVuY19wYXJzZTsKKworCXNuYW1lID0gd2RzdHJpcChuYW1lLCBmYWxzZSwgZmFsc2UpOworCS8qIENoZWNrIGZvciB2YWxpZCBjaGFyYWN0ZXJzIGluIG5hbWUuIFBPU0lYIGFuZCBBVCZUIGtzaDkzIHNheSBvbmx5CisJICogYWxsb3cgW2EtekEtWl8wLTldIGJ1dCB0aGlzIGFsbG93cyBtb3JlIGFzIG9sZCBwZGtzaHMgaGF2ZQorCSAqIGFsbG93ZWQgbW9yZSAodGhlIGZvbGxvd2luZyB3ZXJlIG5ldmVyIGFsbG93ZWQ6CisJICoJTlVMIFRBQiBOTCBTUCAiICQgJiAnICggKSA7IDwgPSA+IFwgYCB8CisJICogQ19RVU9URSBjb3ZlcnMgYWxsIGJ1dCBhZGRzICMgKiA/IFsgXQorCSAqLworCWZvciAocCA9IHNuYW1lOyAqcDsgcCsrKQorCQlpZiAoY3R5cGUoKnAsIENfUVVPVEUpKQorCQkJeXllcnJvcigiJXM6IGludmFsaWQgZnVuY3Rpb24gbmFtZVxuIiwgc25hbWUpOworCisJLyogTm90ZSB0aGF0IFBPU0lYIGFsbG93cyBvbmx5IGNvbXBvdW5kIHN0YXRlbWVudHMgYWZ0ZXIgZm9vKCksIHNoIGFuZAorCSAqIEFUJlQga3NoIGFsbG93IGFueSBjb21tYW5kLCBnbyB3aXRoIHRoZSBsYXRlciBzaW5jZSBpdCBzaG91bGRuJ3QKKwkgKiBicmVhayBhbnl0aGluZy4gSG93ZXZlciwgZm9yIGZ1bmN0aW9uIGZvbywgQVQmVCBrc2ggb25seSBhY2NlcHRzCisJICogYW4gb3Blbi1icmFjZS4KKwkgKi8KKwlpZiAoa3NoX2Z1bmMpIHsKKwkJaWYgKHRwZWVrKENPTlRJTnxLRVlXT1JEfEFMSUFTKSA9PSAnKCcgLyogKSAqLykgeworCQkJc3RydWN0IHRibCAqdHA7CisKKwkJCS8qIGZ1bmN0aW9uIGZvbyAoKSB7ICovCisJCQlBQ0NFUFQ7CisJCQltdXN0aGF2ZSgnKScsIDApOworCQkJLyogZGVncmFkZSB0byBQT1NJWCBmdW5jdGlvbiAqLworCQkJa3NoX2Z1bmMgPSBmYWxzZTsKKwkJCWlmICgodHAgPSBrdHNlYXJjaCgmYWxpYXNlcywgc25hbWUsIGhhc2goc25hbWUpKSkpCisJCQkJa3RkZWxldGUodHApOworCQl9CisJCW11c3RoYXZlKCd7JywgQ09OVElOfEtFWVdPUkR8QUxJQVMpOyAvKiB9ICovCisJCVJFSkVDVDsKKwl9CisKKwl0ID0gbmV3dHAoVEZVTkNUKTsKKwl0LT5zdHIgPSBzbmFtZTsKKwl0LT51LmtzaF9mdW5jID0ga3NoX2Z1bmM7CisJdC0+bGluZW5vID0gc291cmNlLT5saW5lOworCisJb2xkX2Z1bmNfcGFyc2UgPSBlLT5mbGFncyAmIEVGX0ZVTkNfUEFSU0U7CisJZS0+ZmxhZ3MgfD0gRUZfRlVOQ19QQVJTRTsKKwlpZiAoKHQtPmxlZnQgPSBnZXRfY29tbWFuZChDT05USU4pKSA9PSBOVUxMKSB7CisJCWNoYXIgKnR2OworCQkvKgorCQkgKiBQcm9iYWJseSBzb21ldGhpbmcgbGlrZSBmb28oKSBmb2xsb3dlZCBieSBlb2Ygb3IgOy4KKwkJICogVGhpcyBpcyBhY2NlcHRlZCBieSBzaCBhbmQga3NoODguCisJCSAqIFRvIG1ha2UgInR5cGVzZXQgLWYgZm9vIiB3b3JrIHJlbGlhYmx5IChzbyBpdHMgb3V0cHV0IGNhbgorCQkgKiBiZSB1c2VkIGFzIGlucHV0KSwgd2UgcHJldGVuZCB0aGVyZSBpcyBhIGNvbG9uIGhlcmUuCisJCSAqLworCQl0LT5sZWZ0ID0gbmV3dHAoVENPTSk7CisJCXQtPmxlZnQtPmFyZ3MgPSBhbGxvYygyICogc2l6ZW9mKGNoYXIgKiksIEFURU1QKTsKKwkJdC0+bGVmdC0+YXJnc1swXSA9IHR2ID0gYWxsb2MoMywgQVRFTVApOworCQl0dlswXSA9IENIQVI7CisJCXR2WzFdID0gJzonOworCQl0dlsyXSA9IEVPUzsKKwkJdC0+bGVmdC0+YXJnc1sxXSA9IE5VTEw7CisJCXQtPmxlZnQtPnZhcnMgPSBhbGxvYyhzaXplb2YoY2hhciAqKSwgQVRFTVApOworCQl0LT5sZWZ0LT52YXJzWzBdID0gTlVMTDsKKwkJdC0+bGVmdC0+bGluZW5vID0gMTsKKwl9CisJaWYgKCFvbGRfZnVuY19wYXJzZSkKKwkJZS0+ZmxhZ3MgJj0gfkVGX0ZVTkNfUEFSU0U7CisKKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgY2hhciAqKgord29yZGxpc3Qodm9pZCkKK3sKKwlpbnQgYzsKKwlYUHRyViBhcmdzOworCisJWFBpbml0KGFyZ3MsIDE2KTsKKwkvKiBQT1NJWCBkb2VzIG5vdCBkbyBhbGlhcyBleHBhbnNpb24gaGVyZS4uLiAqLworCWlmICgoYyA9IHRva2VuKENPTlRJTnxLRVlXT1JEfEFMSUFTKSkgIT0gSU4pIHsKKwkJaWYgKGMgIT0gJzsnKSAvKiBub24tUE9TSVgsIGJ1dCBBVCZUIGtzaCBhY2NlcHRzIGEgOyBoZXJlICovCisJCQlSRUpFQ1Q7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXdoaWxlICgoYyA9IHRva2VuKDApKSA9PSBMV09SRCkKKwkJWFBwdXQoYXJncywgeXlsdmFsLmNwKTsKKwlpZiAoYyAhPSAnXG4nICYmIGMgIT0gJzsnKQorCQlzeW50YXhlcnIoTlVMTCk7CisJaWYgKFhQc2l6ZShhcmdzKSA9PSAwKSB7CisJCVhQZnJlZShhcmdzKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9IGVsc2UgeworCQlYUHB1dChhcmdzLCBOVUxMKTsKKwkJcmV0dXJuICgoY2hhciAqKilYUGNsb3NlKGFyZ3MpKTsKKwl9Cit9CisKKy8qCisgKiBzdXBwb3J0aW5nIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorYmxvY2soaW50IHR5cGUsIHN0cnVjdCBvcCAqdDEsIHN0cnVjdCBvcCAqdDIsIGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisKKwl0ID0gbmV3dHAodHlwZSk7CisJdC0+bGVmdCA9IHQxOworCXQtPnJpZ2h0ID0gdDI7CisJdC0+dmFycyA9IHdwOworCXJldHVybiAodCk7Cit9CisKK2NvbnN0IHN0cnVjdCB0b2tlbmluZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2hvcnQgdmFsOworCXNob3J0IHJlc2VydmVkOworfSB0b2tlbnRhYltdID0geworCS8qIFJlc2VydmVkIHdvcmRzICovCisJeyAiaWYiLAkJSUYsCXRydWUgfSwKKwl7ICJ0aGVuIiwJVEhFTiwJdHJ1ZSB9LAorCXsgImVsc2UiLAlFTFNFLAl0cnVlIH0sCisJeyAiZWxpZiIsCUVMSUYsCXRydWUgfSwKKwl7ICJmaSIsCQlGSSwJdHJ1ZSB9LAorCXsgImNhc2UiLAlDQVNFLAl0cnVlIH0sCisJeyAiZXNhYyIsCUVTQUMsCXRydWUgfSwKKwl7ICJmb3IiLAlGT1IsCXRydWUgfSwKKwl7ICJzZWxlY3QiLAlTRUxFQ1QsCXRydWUgfSwKKwl7ICJ3aGlsZSIsCVdISUxFLAl0cnVlIH0sCisJeyAidW50aWwiLAlVTlRJTCwJdHJ1ZSB9LAorCXsgImRvIiwJCURPLAl0cnVlIH0sCisJeyAiZG9uZSIsCURPTkUsCXRydWUgfSwKKwl7ICJpbiIsCQlJTiwJdHJ1ZSB9LAorCXsgImZ1bmN0aW9uIiwJRlVOQ1RJT04sIHRydWUgfSwKKwl7ICJ0aW1lIiwJVElNRSwJdHJ1ZSB9LAorCXsgInsiLAkJJ3snLAl0cnVlIH0sCisJeyAifSIsCQknfScsCXRydWUgfSwKKwl7ICIhIiwJCUJBTkcsCXRydWUgfSwKKwl7ICJbWyIsCQlEQlJBQ0tFVCwgdHJ1ZSB9LAorCS8qIExleGljYWwgdG9rZW5zICgwW0VPRl0sIExXT1JEIGFuZCBSRURJUiBoYW5kbGVkIHNwZWNpYWxseSkgKi8KKwl7ICImJiIsCQlMT0dBTkQsCWZhbHNlIH0sCisJeyAifHwiLAkJTE9HT1IsCWZhbHNlIH0sCisJeyAiOzsiLAkJQlJFQUssCWZhbHNlIH0sCisJeyAiKCgiLAkJTURQQVJFTiwgZmFsc2UgfSwKKwl7ICJ8JiIsCQlDT1BST0MsCWZhbHNlIH0sCisJLyogYW5kIHNvbWUgc3BlY2lhbCBjYXNlcy4uLiAqLworCXsgIm5ld2xpbmUiLAknXG4nLAlmYWxzZSB9LAorCXsgTlVMTCwJCTAsCWZhbHNlIH0KK307CisKK3ZvaWQKK2luaXRrZXl3b3Jkcyh2b2lkKQoreworCXN0cnVjdCB0b2tlbmluZm8gY29uc3QgKnR0OworCXN0cnVjdCB0YmwgKnA7CisKKwlrdGluaXQoJmtleXdvcmRzLCBBUEVSTSwKKwkgICAgLyogbXVzdCBiZSA4MCUgb2YgMl5uIChjdXJyZW50bHkgMjAga2V5d29yZHMpICovIDMyKTsKKwlmb3IgKHR0ID0gdG9rZW50YWI7IHR0LT5uYW1lOyB0dCsrKSB7CisJCWlmICh0dC0+cmVzZXJ2ZWQpIHsKKwkJCXAgPSBrdGVudGVyKCZrZXl3b3JkcywgdHQtPm5hbWUsIGhhc2godHQtPm5hbWUpKTsKKwkJCXAtPmZsYWcgfD0gREVGSU5FRHxJU1NFVDsKKwkJCXAtPnR5cGUgPSBDS0VZV0Q7CisJCQlwLT52YWwuaSA9IHR0LT52YWw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzeW50YXhlcnIoY29uc3QgY2hhciAqd2hhdCkKK3sKKwljaGFyIHJlZGlyWzZdOwkvKiAyPDwtIGlzIHRoZSBsb25nZXN0IHJlZGlyZWN0aW9uLCBJIHRoaW5rICovCisJY29uc3QgY2hhciAqczsKKwlzdHJ1Y3QgdG9rZW5pbmZvIGNvbnN0ICp0dDsKKwlpbnQgYzsKKworCWlmICghd2hhdCkKKwkJd2hhdCA9ICJ1bmV4cGVjdGVkIjsKKwlSRUpFQ1Q7CisJYyA9IHRva2VuKDApOworIEFnYWluOgorCXN3aXRjaCAoYykgeworCWNhc2UgMDoKKwkJaWYgKG5lc3Rpbmcuc3RhcnRfdG9rZW4pIHsKKwkJCWMgPSBuZXN0aW5nLnN0YXJ0X3Rva2VuOworCQkJc291cmNlLT5lcnJsaW5lID0gbmVzdGluZy5zdGFydF9saW5lOworCQkJd2hhdCA9ICJ1bm1hdGNoZWQiOworCQkJZ290byBBZ2FpbjsKKwkJfQorCQkvKiBkb24ndCBxdW90ZSB0aGUgRU9GICovCisJCXl5ZXJyb3IoIiVzOiB1bmV4cGVjdGVkIEVPRlxuIiwgVF9zeW5lcnIpOworCQkvKiBOT1RSRUFDSEVEICovCisKKwljYXNlIExXT1JEOgorCQlzID0gc25wdHJlZWYoTlVMTCwgMzIsICIlUyIsIHl5bHZhbC5jcCk7CisJCWJyZWFrOworCisJY2FzZSBSRURJUjoKKwkJcyA9IHNucHRyZWVmKHJlZGlyLCBzaXplb2YocmVkaXIpLCAiJVIiLCB5eWx2YWwuaW9wKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmb3IgKHR0ID0gdG9rZW50YWI7IHR0LT5uYW1lOyB0dCsrKQorCQkJaWYgKHR0LT52YWwgPT0gYykKKwkJCSAgICBicmVhazsKKwkJaWYgKHR0LT5uYW1lKQorCQkJcyA9IHR0LT5uYW1lOworCQllbHNlIHsKKwkJCWlmIChjID4gMCAmJiBjIDwgMjU2KSB7CisJCQkJcmVkaXJbMF0gPSBjOworCQkJCXJlZGlyWzFdID0gJ1wwJzsKKwkJCX0gZWxzZQorCQkJCXNoZl9zbnByaW50ZihyZWRpciwgc2l6ZW9mKHJlZGlyKSwKKwkJCQkJIj8lZCIsIGMpOworCQkJcyA9IHJlZGlyOworCQl9CisJfQorCXl5ZXJyb3IoIiVzOiAnJXMnICVzXG4iLCBUX3N5bmVyciwgcywgd2hhdCk7Cit9CisKK3N0YXRpYyB2b2lkCituZXN0aW5nX3B1c2goc3RydWN0IG5lc3Rpbmdfc3RhdGUgKnNhdmUsIGludCB0b2spCit7CisJKnNhdmUgPSBuZXN0aW5nOworCW5lc3Rpbmcuc3RhcnRfdG9rZW4gPSB0b2s7CisJbmVzdGluZy5zdGFydF9saW5lID0gc291cmNlLT5saW5lOworfQorCitzdGF0aWMgdm9pZAorbmVzdGluZ19wb3Aoc3RydWN0IG5lc3Rpbmdfc3RhdGUgKnNhdmVkKQoreworCW5lc3RpbmcgPSAqc2F2ZWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorbmV3dHAoaW50IHR5cGUpCit7CisJc3RydWN0IG9wICp0OworCisJdCA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgb3ApLCBBVEVNUCk7CisJdC0+dHlwZSA9IHR5cGU7CisJdC0+dS5ldmFsZmxhZ3MgPSAwOworCXQtPmFyZ3MgPSBOVUxMOworCXQtPnZhcnMgPSBOVUxMOworCXQtPmlvYWN0ID0gTlVMTDsKKwl0LT5sZWZ0ID0gdC0+cmlnaHQgPSBOVUxMOworCXQtPnN0ciA9IE5VTEw7CisJcmV0dXJuICh0KTsKK30KKworc3RydWN0IG9wICoKK2NvbXBpbGUoU291cmNlICpzKQoreworCW5lc3Rpbmcuc3RhcnRfdG9rZW4gPSAwOworCW5lc3Rpbmcuc3RhcnRfbGluZSA9IDA7CisJaGVyZXAgPSBoZXJlczsKKwlzb3VyY2UgPSBzOworCXl5cGFyc2UoKTsKKwlyZXR1cm4gKG91dHRyZWUpOworfQorCisvKiBUaGlzIGtsdWRnZSBleGlzdHMgdG8gdGFrZSBjYXJlIG9mIHNoL0FUJlQga3NoIG9kZGl0eSBpbiB3aGljaAorICogdGhlIGFyZ3VtZW50cyBvZiBhbGlhcy9leHBvcnQvcmVhZG9ubHkvdHlwZXNldCBoYXZlIG5vIGZpZWxkCisgKiBzcGxpdHRpbmcsIGZpbGUgZ2xvYmJpbmcsIG9yIChub3JtYWwpIHRpbGRlIGV4cGFuc2lvbiBkb25lLgorICogQVQmVCBrc2ggc2VlbXMgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhpcyBzaW5jZQorICoJJCB0b3VjaCBhPWE7IHR5cGVzZXQgYT1bYWJdOyBlY2hvICIkYSIKKyAqCWE9W2FiXQorICoJJCB4PXR5cGVzZXQ7ICR4IGE9W2FiXTsgZWNobyAiJGEiCisgKglhPWEKKyAqCSQKKyAqLworc3RhdGljIGludAorYXNzaWduX2NvbW1hbmQoY2hhciAqcykKK3sKKwlpZiAoISpzKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoKHN0cmNtcChzLCAiYWxpYXMiKSA9PSAwKSB8fAorCSAgICAoc3RyY21wKHMsICJleHBvcnQiKSA9PSAwKSB8fAorCSAgICAoc3RyY21wKHMsICJyZWFkb25seSIpID09IDApIHx8CisJICAgIChzdHJjbXAocywgVF90eXBlc2V0KSA9PSAwKSk7Cit9CisKKy8qIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHJlYWRpbmcgYW4gYWxpYXMgKi8KK3N0YXRpYyBpbnQKK2luYWxpYXMoc3RydWN0IHNvdXJjZSAqcykKK3sKKwlmb3IgKDsgcyAmJiBzLT50eXBlID09IFNBTElBUzsgcyA9IHMtPm5leHQpCisJCWlmICghKHMtPmZsYWdzICYgU0ZfQUxJQVNFTkQpKQorCQkJcmV0dXJuICgxKTsKKwlyZXR1cm4gKDApOworfQorCisKKy8qIE9yZGVyIGltcG9ydGFudCAtIGluZGV4ZWQgYnkgVGVzdF9tZXRhIHZhbHVlcworICogTm90ZSB0aGF0IHx8LCAmJiwgKCBhbmQgKSBjYW4ndCBhcHBlYXIgaW4gYXMgdW5xdW90ZWQgc3RyaW5ncworICogaW4gbm9ybWFsIHNoZWxsIGlucHV0LCBzbyB0aGVzZSBjYW4gYmUgaW50ZXJwcmV0ZWQgdW5hbWJpZ3VvdXNseQorICogaW4gdGhlIGV2YWx1YXRpb24gcGFzcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X29yW10gPSB7IENIQVIsICd8JywgQ0hBUiwgJ3wnLCBFT1MgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9hbmRbXSA9IHsgQ0hBUiwgJyYnLCBDSEFSLCAnJicsIEVPUyB9Oworc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X25vdFtdID0geyBDSEFSLCAnIScsIEVPUyB9Oworc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X29wYXJlbltdID0geyBDSEFSLCAnKCcsIEVPUyB9Oworc3RhdGljIGNvbnN0IGNoYXIgZGJ0ZXN0X2NwYXJlbltdID0geyBDSEFSLCAnKScsIEVPUyB9OworY29uc3QgY2hhciAqY29uc3QgZGJ0ZXN0X3Rva2Vuc1tdID0geworCWRidGVzdF9vciwgZGJ0ZXN0X2FuZCwgZGJ0ZXN0X25vdCwKKwlkYnRlc3Rfb3BhcmVuLCBkYnRlc3RfY3BhcmVuCit9OworY29uc3QgY2hhciBkYl9jbG9zZVtdID0geyBDSEFSLCAnXScsIENIQVIsICddJywgRU9TIH07Citjb25zdCBjaGFyIGRiX2x0aGFuW10gPSB7IENIQVIsICc8JywgRU9TIH07Citjb25zdCBjaGFyIGRiX2d0aGFuW10gPSB7IENIQVIsICc+JywgRU9TIH07CisKKy8qCisgKiBUZXN0IGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGEgd2hhdGV2ZXIuIEFjY2VwdHMgdGhlIGN1cnJlbnQgdG9rZW4gaWYKKyAqIGl0IGlzLiBSZXR1cm5zIDAgaWYgaXQgaXMgbm90LCBub24temVybyBpZiBpdCBpcyAoaW4gdGhlIGNhc2Ugb2YKKyAqIFRNX1VOT1AgYW5kIFRNX0JJTk9QLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBUZXN0X29wKS4KKyAqLworc3RhdGljIFRlc3Rfb3AKK2RidGVzdHBfaXNhKFRlc3RfZW52ICp0ZSwgVGVzdF9tZXRhIG1ldGEpCit7CisJaW50IGMgPSB0cGVlayhBUlJBWVZBUiB8IChtZXRhID09IFRNX0JJTk9QID8gMCA6IENPTlRJTikpOworCWludCB1cXdvcmQ7CisJY2hhciAqc2F2ZSA9IE5VTEw7CisJVGVzdF9vcCByZXQgPSBUT19OT05PUDsKKworCS8qIHVucXVvdGVkIHdvcmQ/ICovCisJdXF3b3JkID0gYyA9PSBMV09SRCAmJiAqaWRlbnQ7CisKKwlpZiAobWV0YSA9PSBUTV9PUikKKwkJcmV0ID0gYyA9PSBMT0dPUiA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKKwllbHNlIGlmIChtZXRhID09IFRNX0FORCkKKwkJcmV0ID0gYyA9PSBMT0dBTkQgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7CisJZWxzZSBpZiAobWV0YSA9PSBUTV9OT1QpCisJCXJldCA9ICh1cXdvcmQgJiYgIXN0cmNtcCh5eWx2YWwuY3AsCisJCSAgICBkYnRlc3RfdG9rZW5zWyhpbnQpVE1fTk9UXSkpID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCWVsc2UgaWYgKG1ldGEgPT0gVE1fT1BBUkVOKQorCQlyZXQgPSBjID09ICcoJyAvKikqLyA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKKwllbHNlIGlmIChtZXRhID09IFRNX0NQQVJFTikKKwkJcmV0ID0gYyA9PSAvKigqLyAnKScgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7CisJZWxzZSBpZiAobWV0YSA9PSBUTV9VTk9QIHx8IG1ldGEgPT0gVE1fQklOT1ApIHsKKwkJaWYgKG1ldGEgPT0gVE1fQklOT1AgJiYgYyA9PSBSRURJUiAmJgorCQkgICAgKHl5bHZhbC5pb3AtPmZsYWcgPT0gSU9SRUFEIHx8IHl5bHZhbC5pb3AtPmZsYWcgPT0gSU9XUklURSkpIHsKKwkJCXJldCA9IFRPX05PTk5VTEw7CisJCQlzYXZlID0gd2Rjb3B5KHl5bHZhbC5pb3AtPmZsYWcgPT0gSU9SRUFEID8KKwkJCSAgICBkYl9sdGhhbiA6IGRiX2d0aGFuLCBBVEVNUCk7CisJCX0gZWxzZSBpZiAodXF3b3JkICYmIChyZXQgPSB0ZXN0X2lzb3AobWV0YSwgaWRlbnQpKSkKKwkJCXNhdmUgPSB5eWx2YWwuY3A7CisJfSBlbHNlIC8qIG1ldGEgPT0gVE1fRU5EICovCisJCXJldCA9ICh1cXdvcmQgJiYgIXN0cmNtcCh5eWx2YWwuY3AsCisJCSAgICBkYl9jbG9zZSkpID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCWlmIChyZXQgIT0gVE9fTk9OT1ApIHsKKwkJQUNDRVBUOworCQlpZiAobWV0YSA8IE5FTEVNKGRidGVzdF90b2tlbnMpKQorCQkJc2F2ZSA9IHdkY29weShkYnRlc3RfdG9rZW5zWyhpbnQpbWV0YV0sIEFURU1QKTsKKwkJaWYgKHNhdmUpCisJCQlYUHB1dCgqdGUtPnBvcy5hdiwgc2F2ZSk7CisJfQorCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGJ0ZXN0cF9nZXRvcG5kKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCBNS1NIX0FfVU5VU0VELAorICAgIGJvb2wgZG9fZXZhbCBNS1NIX0FfVU5VU0VEKQoreworCWludCBjID0gdHBlZWsoQVJSQVlWQVIpOworCisJaWYgKGMgIT0gTFdPUkQpCisJCXJldHVybiAoTlVMTCk7CisKKwlBQ0NFUFQ7CisJWFBwdXQoKnRlLT5wb3MuYXYsIHl5bHZhbC5jcCk7CisKKwlyZXR1cm4gKG51bGwpOworfQorCitzdGF0aWMgaW50CitkYnRlc3RwX2V2YWwoVGVzdF9lbnYgKnRlIE1LU0hfQV9VTlVTRUQsIFRlc3Rfb3Agb3AgTUtTSF9BX1VOVVNFRCwKKyAgICBjb25zdCBjaGFyICpvcG5kMSBNS1NIX0FfVU5VU0VELCBjb25zdCBjaGFyICpvcG5kMiBNS1NIX0FfVU5VU0VELAorICAgIGJvb2wgZG9fZXZhbCBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitkYnRlc3RwX2Vycm9yKFRlc3RfZW52ICp0ZSwgaW50IG9mZnNldCwgY29uc3QgY2hhciAqbXNnKQoreworCXRlLT5mbGFncyB8PSBURUZfRVJST1I7CisKKwlpZiAob2Zmc2V0IDwgMCkgeworCQlSRUpFQ1Q7CisJCS8qIEtsdWRneSB0byBzYXkgdGhlIGxlYXN0Li4uICovCisJCXN5bWJvbCA9IExXT1JEOworCQl5eWx2YWwuY3AgPSAqKFhQcHRydigqdGUtPnBvcy5hdikgKyBYUHNpemUoKnRlLT5wb3MuYXYpICsKKwkJICAgIG9mZnNldCk7CisJfQorCXN5bnRheGVycihtc2cpOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvdHJlZS5jIGIvbWtzaC9zcmMvdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODYxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy90cmVlLmMKQEAgLTAsMCArMSw3MTYgQEAKKy8qCSRPcGVuQlNEOiB0cmVlLmMsdiAxLjE5IDIwMDgvMDgvMTEgMjE6NTA6MzUgamFyZWR5IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvdHJlZS5jLHYgMS4zMCAyMDEwLzAyLzI1IDIwOjE4OjE5IHRnIEV4cCAkIik7CisKKyNkZWZpbmUgSU5ERU5UCTQKKworI2RlZmluZSB0cHV0YyhjLCBzaGYpIHNoZl9wdXRjaGFyKGMsIHNoZik7CitzdGF0aWMgdm9pZCBwdHJlZShzdHJ1Y3Qgb3AgKiwgaW50LCBzdHJ1Y3Qgc2hmICopOworc3RhdGljIHZvaWQgcGlvYWN0KHN0cnVjdCBzaGYgKiwgaW50LCBzdHJ1Y3QgaW93b3JkICopOworc3RhdGljIHZvaWQgdHB1dEMoaW50LCBzdHJ1Y3Qgc2hmICopOworc3RhdGljIHZvaWQgdHB1dFMoY2hhciAqLCBzdHJ1Y3Qgc2hmICopOworc3RhdGljIHZvaWQgdmZwdHJlZWYoc3RydWN0IHNoZiAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitzdGF0aWMgc3RydWN0IGlvd29yZCAqKmlvY29weShzdHJ1Y3QgaW93b3JkICoqLCBBcmVhICopOworc3RhdGljIHZvaWQgaW9mcmVlKHN0cnVjdCBpb3dvcmQgKiosIEFyZWEgKik7CisKKy8qCisgKiBwcmludCBhIGNvbW1hbmQgdHJlZQorICovCitzdGF0aWMgdm9pZAorcHRyZWUoc3RydWN0IG9wICp0LCBpbnQgaW5kZW50LCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJY29uc3QgY2hhciAqKnc7CisJc3RydWN0IGlvd29yZCAqKmlvYWN0OworCXN0cnVjdCBvcCAqdDE7CisKKyBDaGFpbjoKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm47CisJc3dpdGNoICh0LT50eXBlKSB7CisJY2FzZSBUQ09NOgorCQlpZiAodC0+dmFycykKKwkJCWZvciAodyA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICp3ICE9IE5VTEw7ICkKKwkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVMgIiwgKncrKyk7CisJCWVsc2UKKwkJCXNoZl9wdXRzKCIjbm8tdmFycyMgIiwgc2hmKTsKKwkJaWYgKHQtPmFyZ3MpCisJCQlmb3IgKHcgPSB0LT5hcmdzOyAqdyAhPSBOVUxMOyApCisJCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVTICIsICp3KyspOworCQllbHNlCisJCQlzaGZfcHV0cygiI25vLWFyZ3MjICIsIHNoZik7CisJCWJyZWFrOworCWNhc2UgVEVYRUM6CisJCXQgPSB0LT5sZWZ0OworCQlnb3RvIENoYWluOworCWNhc2UgVFBBUkVOOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgMiwgIiggJVQpICIsIHQtPmxlZnQpOworCQlicmVhazsKKwljYXNlIFRQSVBFOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVR8ICIsIHQtPmxlZnQpOworCQl0ID0gdC0+cmlnaHQ7CisJCWdvdG8gQ2hhaW47CisJY2FzZSBUTElTVDoKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVUJTsiLCB0LT5sZWZ0KTsKKwkJdCA9IHQtPnJpZ2h0OworCQlnb3RvIENoYWluOworCWNhc2UgVE9SOgorCWNhc2UgVEFORDoKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVUJXMgJVQiLAorCQkgICAgdC0+bGVmdCwgKHQtPnR5cGU9PVRPUikgPyAifHwiIDogIiYmIiwgdC0+cmlnaHQpOworCQlicmVhazsKKwljYXNlIFRCQU5HOgorCQlzaGZfcHV0cygiISAiLCBzaGYpOworCQl0ID0gdC0+cmlnaHQ7CisJCWdvdG8gQ2hhaW47CisJY2FzZSBUREJSQUNLRVQ6IHsKKwkJaW50IGk7CisKKwkJc2hmX3B1dHMoIltbIiwgc2hmKTsKKwkJZm9yIChpID0gMDsgdC0+YXJnc1tpXTsgaSsrKQorCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiAlUyIsIHQtPmFyZ3NbaV0pOworCQlzaGZfcHV0cygiIF1dICIsIHNoZik7CisJCWJyZWFrOworCX0KKwljYXNlIFRTRUxFQ1Q6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICJzZWxlY3QgJXMgIiwgdC0+c3RyKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIFRGT1I6CisJCWlmICh0LT50eXBlID09IFRGT1IpCisJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiZm9yICVzICIsIHQtPnN0cik7CisJCWlmICh0LT52YXJzICE9IE5VTEwpIHsKKwkJCXNoZl9wdXRzKCJpbiAiLCBzaGYpOworCQkJZm9yICh3ID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKnc7ICkKKwkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVMgIiwgKncrKyk7CisJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTsiKTsKKwkJfQorCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAiZG8lTiVUIiwgdC0+bGVmdCk7CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlO2RvbmUgIik7CisJCWJyZWFrOworCWNhc2UgVENBU0U6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICJjYXNlICVTIGluIiwgdC0+c3RyKTsKKwkJZm9yICh0MSA9IHQtPmxlZnQ7IHQxICE9IE5VTEw7IHQxID0gdDEtPnJpZ2h0KSB7CisJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJU4oIik7CisJCQlmb3IgKHcgPSAoY29uc3QgY2hhciAqKil0MS0+dmFyczsgKncgIT0gTlVMTDsgdysrKQorCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlUyVjIiwgKncsCisJCQkJICAgICh3WzFdICE9IE5VTEwpID8gJ3wnIDogJyknKTsKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICIlOyVUJU47OyIsIHQxLT5sZWZ0KTsKKwkJfQorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJU5lc2FjICIpOworCQlicmVhazsKKwljYXNlIFRJRjoKKwljYXNlIFRFTElGOgorCQkvKiAzID09IHN0cmxlbigiaWYgIikgKi8KKwkJZnB0cmVlZihzaGYsIGluZGVudCArIDMsICJpZiAlVCIsIHQtPmxlZnQpOworCQlmb3IgKDs7KSB7CisJCQl0ID0gdC0+cmlnaHQ7CisJCQlpZiAodC0+bGVmdCAhPSBOVUxMKSB7CisJCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7Iik7CisJCQkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgInRoZW4lTiVUIiwKKwkJCQkgICAgdC0+bGVmdCk7CisJCQl9CisJCQlpZiAodC0+cmlnaHQgPT0gTlVMTCB8fCB0LT5yaWdodC0+dHlwZSAhPSBURUxJRikKKwkJCQlicmVhazsKKwkJCXQgPSB0LT5yaWdodDsKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlOyIpOworCQkJLyogNSA9PSBzdHJsZW4oImVsaWYgIikgKi8KKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyA1LCAiZWxpZiAlVCIsIHQtPmxlZnQpOworCQl9CisJCWlmICh0LT5yaWdodCAhPSBOVUxMKSB7CisJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTsiKTsKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICJlbHNlJTslVCIsIHQtPnJpZ2h0KTsKKwkJfQorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTtmaSAiKTsKKwkJYnJlYWs7CisJY2FzZSBUV0hJTEU6CisJY2FzZSBUVU5USUw6CisJCS8qIDYgPT0gc3RybGVuKCJ3aGlsZSIvInVudGlsIikgKi8KKwkJZnB0cmVlZihzaGYsIGluZGVudCArIDYsICIlcyAlVCIsCisJCSAgICAodC0+dHlwZT09VFdISUxFKSA/ICJ3aGlsZSIgOiAidW50aWwiLAorCQkgICAgdC0+bGVmdCk7CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlO2RvIik7CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICIlOyVUIiwgdC0+cmlnaHQpOworCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTtkb25lICIpOworCQlicmVhazsKKwljYXNlIFRCUkFDRToKKwkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgInslOyVUIiwgdC0+bGVmdCk7CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlO30gIik7CisJCWJyZWFrOworCWNhc2UgVENPUFJPQzoKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVUfCYgIiwgdC0+bGVmdCk7CisJCWJyZWFrOworCWNhc2UgVEFTWU5DOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVQmICIsIHQtPmxlZnQpOworCQlicmVhazsKKwljYXNlIFRGVU5DVDoKKwkJZnB0cmVlZihzaGYsIGluZGVudCwKKwkJICAgIHQtPnUua3NoX2Z1bmMgPyAiZnVuY3Rpb24gJXMgJVQiIDogIiVzKCkgJVQiLAorCQkgICAgdC0+c3RyLCB0LT5sZWZ0KTsKKwkJYnJlYWs7CisJY2FzZSBUVElNRToKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgInRpbWUgJVQiLCB0LT5sZWZ0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2hmX3B1dHMoIjxib3RjaD4iLCBzaGYpOworCQlicmVhazsKKwl9CisJaWYgKChpb2FjdCA9IHQtPmlvYWN0KSAhPSBOVUxMKSB7CisJCWludAluZWVkX25sID0gMDsKKworCQl3aGlsZSAoKmlvYWN0ICE9IE5VTEwpCisJCQlwaW9hY3Qoc2hmLCBpbmRlbnQsICppb2FjdCsrKTsKKwkJLyogUHJpbnQgaGVyZSBkb2N1bWVudHMgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLi4uICovCisJCWZvciAoaW9hY3QgPSB0LT5pb2FjdDsgKmlvYWN0ICE9IE5VTEw7ICkgeworCQkJc3RydWN0IGlvd29yZCAqaW9wID0gKmlvYWN0Kys7CisKKwkJCS8qIGhlcmVkb2MgaXMgMCB3aGVuIHRyYWNpbmcgKHNldCAteCkgKi8KKwkJCWlmICgoaW9wLT5mbGFnICYgSU9UWVBFKSA9PSBJT0hFUkUgJiYgaW9wLT5oZXJlZG9jICYmCisJCQkgICAgLyogaW9wLT5kZWxpbVsxXSA9PSAnPCcgbWVhbnMgaGVyZSBzdHJpbmcgKi8KKwkJCSAgICAoIWlvcC0+ZGVsaW0gfHwgaW9wLT5kZWxpbVsxXSAhPSAnPCcpKSB7CisJCQkJdHB1dGMoJ1xuJywgc2hmKTsKKwkJCQlzaGZfcHV0cyhpb3AtPmhlcmVkb2MsIHNoZik7CisJCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVzIiwKKwkJCQkgICAgZXZhbHN0cihpb3AtPmRlbGltLCAwKSk7CisJCQkJbmVlZF9ubCA9IDE7CisJCQl9CisJCX0KKwkJLyogTGFzdCBkZWxpbWl0ZXIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIG5ld2xpbmUgKHRoaXMgb2Z0ZW4KKwkJICogbGVhZHMgdG8gYW4gZXh0cmEgYmxhbmsgbGluZSwgYnV0IGl0cyBub3Qgd29ydGggd29ycnlpbmcKKwkJICogYWJvdXQpCisJCSAqLworCQlpZiAobmVlZF9ubCkKKwkJCXRwdXRjKCdcbicsIHNoZik7CisJfQorfQorCitzdGF0aWMgdm9pZAorcGlvYWN0KHN0cnVjdCBzaGYgKnNoZiwgaW50IGluZGVudCwgc3RydWN0IGlvd29yZCAqaW9wKQoreworCWludCBmbGFnID0gaW9wLT5mbGFnOworCWludCB0eXBlID0gZmxhZyAmIElPVFlQRTsKKwlpbnQgZXhwZWN0ZWQ7CisKKwlleHBlY3RlZCA9ICh0eXBlID09IElPUkVBRCB8fCB0eXBlID09IElPUkRXUiB8fCB0eXBlID09IElPSEVSRSkgPyAwIDoKKwkgICAgKHR5cGUgPT0gSU9DQVQgfHwgdHlwZSA9PSBJT1dSSVRFKSA/IDEgOgorCSAgICAodHlwZSA9PSBJT0RVUCAmJiAoaW9wLT51bml0ID09ICEoZmxhZyAmIElPUkRVUCkpKSA/IGlvcC0+dW5pdCA6CisJICAgIGlvcC0+dW5pdCArIDE7CisJaWYgKGlvcC0+dW5pdCAhPSBleHBlY3RlZCkKKwkJc2hmX2ZwcmludGYoc2hmLCAiJWQiLCBpb3AtPnVuaXQpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJT1JFQUQ6CisJCXNoZl9wdXRzKCI8ICIsIHNoZik7CisJCWJyZWFrOworCWNhc2UgSU9IRVJFOgorCQlzaGZfcHV0cyhmbGFnICYgSU9TS0lQID8gIjw8LSIgOiAiPDwiLCBzaGYpOworCQlicmVhazsKKwljYXNlIElPQ0FUOgorCQlzaGZfcHV0cygiPj4gIiwgc2hmKTsKKwkJYnJlYWs7CisJY2FzZSBJT1dSSVRFOgorCQlzaGZfcHV0cyhmbGFnICYgSU9DTE9CID8gIj58ICIgOiAiPiAiLCBzaGYpOworCQlicmVhazsKKwljYXNlIElPUkRXUjoKKwkJc2hmX3B1dHMoIjw+ICIsIHNoZik7CisJCWJyZWFrOworCWNhc2UgSU9EVVA6CisJCXNoZl9wdXRzKGZsYWcgJiBJT1JEVVAgPyAiPCYiIDogIj4mIiwgc2hmKTsKKwkJYnJlYWs7CisJfQorCS8qIG5hbWUvZGVsaW0gYXJlIDAgd2hlbiBwcmludGluZyBzeW50YXggZXJyb3JzICovCisJaWYgKHR5cGUgPT0gSU9IRVJFKSB7CisJCWlmIChpb3AtPmRlbGltKQorCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVzJVMgIiwKKwkJCSAgICAvKiBoZXJlIHN0cmluZyAqLyBpb3AtPmRlbGltWzFdID09ICc8JyA/ICIiIDogIiAiLAorCQkJICAgIGlvcC0+ZGVsaW0pOworCQllbHNlCisJCQl0cHV0YygnICcsIHNoZik7CisJfSBlbHNlIGlmIChpb3AtPm5hbWUpCisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsIChpb3AtPmZsYWcgJiBJT05BTUVYUCkgPyAiJXMgIiA6ICIlUyAiLAorCQkgICAgaW9wLT5uYW1lKTsKK30KKworCisvKgorICogdmFyaWFudHMgb2YgZnB1dGMsIGZwdXRzIGZvciBwdHJlZWYgYW5kIHNucHRyZWVmCisgKi8KK3N0YXRpYyB2b2lkCit0cHV0QyhpbnQgYywgc3RydWN0IHNoZiAqc2hmKQoreworCWlmICgoYyYweDYwKSA9PSAwKSB7CQkvKiBDMHxDMSAqLworCQl0cHV0YygoYyYweDgwKSA/ICckJyA6ICdeJywgc2hmKTsKKwkJdHB1dGMoKChjJjB4N0YpfDB4NDApLCBzaGYpOworCX0gZWxzZSBpZiAoKGMmMHg3RikgPT0gMHg3RikgewkvKiBERUwgKi8KKwkJdHB1dGMoKGMmMHg4MCkgPyAnJCcgOiAnXicsIHNoZik7CisJCXRwdXRjKCc/Jywgc2hmKTsKKwl9IGVsc2UKKwkJdHB1dGMoYywgc2hmKTsKK30KKworc3RhdGljIHZvaWQKK3RwdXRTKGNoYXIgKndwLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaW50IGMsIHF1b3RlbGV2ZWwgPSAwOworCisJLyogcHJvYmxlbXM6CisJICoJYC4uLmAgLT4gJCguLi4pCisJICoJJ2ZvbycgLT4gImZvbyIKKwkgKiBjb3VsZCBjaGFuZ2UgZW5jb2RpbmcgdG86CisJICoJT1FVT1RFIFsiJ10gLi4uIENRVU9URSBbIiddCisJICoJQ09NU1VCIFsoYF0gLi4uXDAJKGhhbmRsZSAkIGAgXCBhbmQgbWF5YmUgIiBpbiBgLi4uYCBjYXNlKQorCSAqLworCXdoaWxlICgxKQorCQlzd2l0Y2ggKCp3cCsrKSB7CisJCWNhc2UgRU9TOgorCQkJcmV0dXJuOworCQljYXNlIEFERUxJTToKKwkJY2FzZSBDSEFSOgorCQkJdHB1dEMoKndwKyssIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBRQ0hBUjoKKwkJCWMgPSAqd3ArKzsKKwkJCWlmICghcXVvdGVsZXZlbCB8fCAoYyA9PSAnIicgfHwgYyA9PSAnYCcgfHwgYyA9PSAnJCcpKQorCQkJCXRwdXRjKCdcXCcsIHNoZik7CisJCQl0cHV0QyhjLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NU1VCOgorCQkJc2hmX3B1dHMoIiQoIiwgc2hmKTsKKwkJCXdoaWxlICgqd3AgIT0gMCkKKwkJCQl0cHV0Qygqd3ArKywgc2hmKTsKKwkJCXRwdXRjKCcpJywgc2hmKTsKKwkJCXdwKys7CisJCQlicmVhazsKKwkJY2FzZSBFWFBSU1VCOgorCQkJc2hmX3B1dHMoIiQoKCIsIHNoZik7CisJCQl3aGlsZSAoKndwICE9IDApCisJCQkJdHB1dEMoKndwKyssIHNoZik7CisJCQlzaGZfcHV0cygiKSkiLCBzaGYpOworCQkJd3ArKzsKKwkJCWJyZWFrOworCQljYXNlIE9RVU9URToKKwkJCXF1b3RlbGV2ZWwrKzsKKwkJCXRwdXRjKCciJywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIENRVU9URToKKwkJCWlmIChxdW90ZWxldmVsKQorCQkJCXF1b3RlbGV2ZWwtLTsKKwkJCXRwdXRjKCciJywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIE9TVUJTVDoKKwkJCXRwdXRjKCckJywgc2hmKTsKKwkJCWlmICgqd3ArKyA9PSAneycpCisJCQkJdHB1dGMoJ3snLCBzaGYpOworCQkJd2hpbGUgKChjID0gKndwKyspICE9IDApCisJCQkJdHB1dEMoYywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIENTVUJTVDoKKwkJCWlmICgqd3ArKyA9PSAnfScpCisJCQkJdHB1dGMoJ30nLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgT1BBVDoKKwkJCXRwdXRjKCp3cCsrLCBzaGYpOworCQkJdHB1dGMoJygnLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgU1BBVDoKKwkJCXRwdXRjKCd8Jywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIENQQVQ6CisJCQl0cHV0YygnKScsIHNoZik7CisJCQlicmVhazsKKwkJfQorfQorCisvKgorICogdGhpcyBpcyB0aGUgX29ubHlfIHdheSB0byByZWxpYWJseSBoYW5kbGUKKyAqIHZhcmlhYmxlIGFyZ3Mgd2l0aCBhbiBBTlNJIGNvbXBpbGVyCisgKi8KKy8qIFZBUkFSR1MgKi8KK2ludAorZnB0cmVlZihzdHJ1Y3Qgc2hmICpzaGYsIGludCBpbmRlbnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwl2YV9zdGFydCh2YSwgZm10KTsKKworCXZmcHRyZWVmKHNoZiwgaW5kZW50LCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworCXJldHVybiAoMCk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK2NoYXIgKgorc25wdHJlZWYoY2hhciAqcywgaW50IG4sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisJc3RydWN0IHNoZiBzaGY7CisKKwlzaGZfc29wZW4ocywgbiwgU0hGX1dSIHwgKHMgPyAwIDogU0hGX0RZTkFNSUMpLCAmc2hmKTsKKworCXZhX3N0YXJ0KHZhLCBmbXQpOworCXZmcHRyZWVmKCZzaGYsIDAsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CisKKwlyZXR1cm4gKHNoZl9zY2xvc2UoJnNoZikpOyAvKiBudWxsIHRlcm1pbmF0ZXMgKi8KK30KKworc3RhdGljIHZvaWQKK3ZmcHRyZWVmKHN0cnVjdCBzaGYgKnNoZiwgaW50IGluZGVudCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhKQoreworCWludCBjOworCisJd2hpbGUgKChjID0gKmZtdCsrKSkgeworCQlpZiAoYyA9PSAnJScpIHsKKwkJCXN3aXRjaCAoKGMgPSAqZm10KyspKSB7CisJCQljYXNlICdjJzoKKwkJCQl0cHV0Yyh2YV9hcmcodmEsIGludCksIHNoZik7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCQlzaGZfcHV0cyh2YV9hcmcodmEsIGNoYXIgKiksIHNoZik7CisJCQkJYnJlYWs7CisJCQljYXNlICdTJzoJLyogd29yZCAqLworCQkJCXRwdXRTKHZhX2FyZyh2YSwgY2hhciAqKSwgc2hmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2QnOgkvKiBkZWNpbWFsICovCisJCQkJc2hmX2ZwcmludGYoc2hmLCAiJWQiLCB2YV9hcmcodmEsIGludCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAndSc6CS8qIGRlY2ltYWwgKi8KKwkJCQlzaGZfZnByaW50ZihzaGYsICIldSIsIHZhX2FyZyh2YSwgdW5zaWduZWQgaW50KSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdUJzoJLyogZm9ybWF0IHRyZWUgKi8KKwkJCQlwdHJlZSh2YV9hcmcodmEsIHN0cnVjdCBvcCAqKSwgaW5kZW50LCBzaGYpOworCQkJCWJyZWFrOworCQkJY2FzZSAnOyc6CS8qIG5ld2xpbmUgb3IgOyAqLworCQkJY2FzZSAnTic6CS8qIG5ld2xpbmUgb3Igc3BhY2UgKi8KKwkJCQlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpIHsKKwkJCQkJaWYgKGMgPT0gJzsnKQorCQkJCQkJdHB1dGMoJzsnLCBzaGYpOworCQkJCQl0cHV0YygnICcsIHNoZik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGk7CisKKwkJCQkJdHB1dGMoJ1xuJywgc2hmKTsKKwkJCQkJZm9yIChpID0gaW5kZW50OyBpID49IDg7IGkgLT0gOCkKKwkJCQkJCXRwdXRjKCdcdCcsIHNoZik7CisJCQkJCWZvciAoOyBpID4gMDsgLS1pKQorCQkJCQkJdHB1dGMoJyAnLCBzaGYpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ1InOgorCQkJCXBpb2FjdChzaGYsIGluZGVudCwgdmFfYXJnKHZhLCBzdHJ1Y3QgaW93b3JkICopKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdHB1dGMoYywgc2hmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQl0cHV0YyhjLCBzaGYpOworCX0KK30KKworLyoKKyAqIGNvcHkgdHJlZSAoZm9yIGZ1bmN0aW9uIGRlZmluaXRpb24pCisgKi8KK3N0cnVjdCBvcCAqCit0Y29weShzdHJ1Y3Qgb3AgKnQsIEFyZWEgKmFwKQoreworCXN0cnVjdCBvcCAqcjsKKwljb25zdCBjaGFyICoqdHc7CisJY2hhciAqKnJ3OworCisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXIgPSBhbGxvYyhzaXplb2Yoc3RydWN0IG9wKSwgYXApOworCisJci0+dHlwZSA9IHQtPnR5cGU7CisJci0+dS5ldmFsZmxhZ3MgPSB0LT51LmV2YWxmbGFnczsKKworCWlmICh0LT50eXBlID09IFRDQVNFKQorCQlyLT5zdHIgPSB3ZGNvcHkodC0+c3RyLCBhcCk7CisJZWxzZQorCQlzdHJkdXB4KHItPnN0ciwgdC0+c3RyLCBhcCk7CisKKwlpZiAodC0+dmFycyA9PSBOVUxMKQorCQlyLT52YXJzID0gTlVMTDsKKwllbHNlIHsKKwkJZm9yICh0dyA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICp0dysrICE9IE5VTEw7ICkKKwkJCTsKKwkJcncgPSByLT52YXJzID0gYWxsb2MoKHR3IC0gKGNvbnN0IGNoYXIgKiopdC0+dmFycyArIDEpICoKKwkJICAgIHNpemVvZigqdHcpLCBhcCk7CisJCWZvciAodHcgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqdHcgIT0gTlVMTDsgKQorCQkJKnJ3KysgPSB3ZGNvcHkoKnR3KyssIGFwKTsKKwkJKnJ3ID0gTlVMTDsKKwl9CisKKwlpZiAodC0+YXJncyA9PSBOVUxMKQorCQlyLT5hcmdzID0gTlVMTDsKKwllbHNlIHsKKwkJZm9yICh0dyA9IHQtPmFyZ3M7ICp0dysrICE9IE5VTEw7ICkKKwkJCTsKKwkJci0+YXJncyA9IChjb25zdCBjaGFyICoqKShydyA9IGFsbG9jKCh0dyAtIHQtPmFyZ3MgKyAxKSAqCisJCSAgICBzaXplb2YoKnR3KSwgYXApKTsKKwkJZm9yICh0dyA9IHQtPmFyZ3M7ICp0dyAhPSBOVUxMOyApCisJCQkqcncrKyA9IHdkY29weSgqdHcrKywgYXApOworCQkqcncgPSBOVUxMOworCX0KKworCXItPmlvYWN0ID0gKHQtPmlvYWN0ID09IE5VTEwpID8gTlVMTCA6IGlvY29weSh0LT5pb2FjdCwgYXApOworCisJci0+bGVmdCA9IHRjb3B5KHQtPmxlZnQsIGFwKTsKKwlyLT5yaWdodCA9IHRjb3B5KHQtPnJpZ2h0LCBhcCk7CisJci0+bGluZW5vID0gdC0+bGluZW5vOworCisJcmV0dXJuIChyKTsKK30KKworY2hhciAqCit3ZGNvcHkoY29uc3QgY2hhciAqd3AsIEFyZWEgKmFwKQoreworCXNpemVfdCBsZW4gPSB3ZHNjYW4od3AsIEVPUykgLSB3cDsKKwlyZXR1cm4gKG1lbWNweShhbGxvYyhsZW4sIGFwKSwgd3AsIGxlbikpOworfQorCisvKiByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHByZWZpeCBjIGluIHdwIHBsdXMgMSAqLworY29uc3QgY2hhciAqCit3ZHNjYW4oY29uc3QgY2hhciAqd3AsIGludCBjKQoreworCWludCBuZXN0ID0gMDsKKworCXdoaWxlICgxKQorCQlzd2l0Y2ggKCp3cCsrKSB7CisJCWNhc2UgRU9TOgorCQkJcmV0dXJuICh3cCk7CisJCWNhc2UgQURFTElNOgorCQkJaWYgKGMgPT0gQURFTElNKQorCQkJCXJldHVybiAod3AgKyAxKTsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgQ0hBUjoKKwkJY2FzZSBRQ0hBUjoKKwkJCXdwKys7CisJCQlicmVhazsKKwkJY2FzZSBDT01TVUI6CisJCWNhc2UgRVhQUlNVQjoKKwkJCXdoaWxlICgqd3ArKyAhPSAwKQorCQkJCTsKKwkJCWJyZWFrOworCQljYXNlIE9RVU9URToKKwkJY2FzZSBDUVVPVEU6CisJCQlicmVhazsKKwkJY2FzZSBPU1VCU1Q6CisJCQluZXN0Kys7CisJCQl3aGlsZSAoKndwKysgIT0gJ1wwJykKKwkJCQk7CisJCQlicmVhazsKKwkJY2FzZSBDU1VCU1Q6CisJCQl3cCsrOworCQkJaWYgKGMgPT0gQ1NVQlNUICYmIG5lc3QgPT0gMCkKKwkJCQlyZXR1cm4gKHdwKTsKKwkJCW5lc3QtLTsKKwkJCWJyZWFrOworCQljYXNlIE9QQVQ6CisJCQluZXN0Kys7CisJCQl3cCsrOworCQkJYnJlYWs7CisJCWNhc2UgU1BBVDoKKwkJY2FzZSBDUEFUOgorCQkJaWYgKGMgPT0gd3BbLTFdICYmIG5lc3QgPT0gMCkKKwkJCQlyZXR1cm4gKHdwKTsKKwkJCWlmICh3cFstMV0gPT0gQ1BBVCkKKwkJCQluZXN0LS07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWludGVybmFsX3dhcm5pbmdmKAorCQkJICAgICJ3ZHNjYW46IHVua25vd24gY2hhciAweCV4IChjYXJyeWluZyBvbikiLAorCQkJICAgIHdwWy0xXSk7CisJCX0KK30KKworLyogcmV0dXJuIGEgY29weSBvZiB3cCB3aXRob3V0IGFueSBvZiB0aGUgbWFyayB1cCBjaGFyYWN0ZXJzIGFuZAorICogd2l0aCBxdW90ZSBjaGFyYWN0ZXJzICgiICcgXCkgc3RyaXBwZWQuCisgKiAoc3RyaW5nIGlzIGFsbG9jYXRlZCBmcm9tIEFURU1QKQorICovCitjaGFyICoKK3dkc3RyaXAoY29uc3QgY2hhciAqd3AsIGJvb2wga2VlcHEsIGJvb2wgbWFrZV9tYWdpYykKK3sKKwlzdHJ1Y3Qgc2hmIHNoZjsKKwlpbnQgYzsKKworCXNoZl9zb3BlbihOVUxMLCAzMiwgU0hGX1dSIHwgU0hGX0RZTkFNSUMsICZzaGYpOworCisJLyogcHJvYmxlbXM6CisJICoJYC4uLmAgLT4gJCguLi4pCisJICoJeCR7Zm9vOi0iaGkifSAtPiB4JHtmb286LWhpfQorCSAqCXgke2ZvbzotJ2hpJ30gLT4geCR7Zm9vOi1oaX0gdW5sZXNzIGtlZXBxCisJICovCisJd2hpbGUgKDEpCisJCXN3aXRjaCAoKndwKyspIHsKKwkJY2FzZSBFT1M6CisJCQlyZXR1cm4gKHNoZl9zY2xvc2UoJnNoZikpOyAvKiBudWxsIHRlcm1pbmF0ZXMgKi8KKwkJY2FzZSBBREVMSU06CisJCWNhc2UgQ0hBUjoKKwkJCWMgPSAqd3ArKzsKKwkJCWlmIChtYWtlX21hZ2ljICYmIChJU01BR0lDKGMpIHx8IGMgPT0gJ1snIHx8IGMgPT0gTk9UIHx8CisJCQkgICAgYyA9PSAnLScgfHwgYyA9PSAnXScgfHwgYyA9PSAnKicgfHwgYyA9PSAnPycpKQorCQkJCXNoZl9wdXRjaGFyKE1BR0lDLCAmc2hmKTsKKwkJCXNoZl9wdXRjaGFyKGMsICZzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgUUNIQVI6CisJCQljID0gKndwKys7CisJCQlpZiAoa2VlcHEgJiYgKGMgPT0gJyInIHx8IGMgPT0gJ2AnIHx8IGMgPT0gJyQnIHx8IGMgPT0gJ1xcJykpCisJCQkJc2hmX3B1dGNoYXIoJ1xcJywgJnNoZik7CisJCQlzaGZfcHV0Y2hhcihjLCAmc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVNVQjoKKwkJCXNoZl9wdXRzKCIkKCIsICZzaGYpOworCQkJd2hpbGUgKCp3cCAhPSAwKQorCQkJCXNoZl9wdXRjaGFyKCp3cCsrLCAmc2hmKTsKKwkJCXNoZl9wdXRjaGFyKCcpJywgJnNoZik7CisJCQlicmVhazsKKwkJY2FzZSBFWFBSU1VCOgorCQkJc2hmX3B1dHMoIiQoKCIsICZzaGYpOworCQkJd2hpbGUgKCp3cCAhPSAwKQorCQkJCXNoZl9wdXRjaGFyKCp3cCsrLCAmc2hmKTsKKwkJCXNoZl9wdXRzKCIpKSIsICZzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgT1FVT1RFOgorCQkJYnJlYWs7CisJCWNhc2UgQ1FVT1RFOgorCQkJYnJlYWs7CisJCWNhc2UgT1NVQlNUOgorCQkJc2hmX3B1dGNoYXIoJyQnLCAmc2hmKTsKKwkJCWlmICgqd3ArKyA9PSAneycpCisJCQkgICAgc2hmX3B1dGNoYXIoJ3snLCAmc2hmKTsKKwkJCXdoaWxlICgoYyA9ICp3cCsrKSAhPSAwKQorCQkJCXNoZl9wdXRjaGFyKGMsICZzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgQ1NVQlNUOgorCQkJaWYgKCp3cCsrID09ICd9JykKKwkJCQlzaGZfcHV0Y2hhcignfScsICZzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgT1BBVDoKKwkJCWlmIChtYWtlX21hZ2ljKSB7CisJCQkJc2hmX3B1dGNoYXIoTUFHSUMsICZzaGYpOworCQkJCXNoZl9wdXRjaGFyKCp3cCsrIHwgMHg4MCwgJnNoZik7CisJCQl9IGVsc2UgeworCQkJCXNoZl9wdXRjaGFyKCp3cCsrLCAmc2hmKTsKKwkJCQlzaGZfcHV0Y2hhcignKCcsICZzaGYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1BBVDoKKwkJCWlmIChtYWtlX21hZ2ljKQorCQkJCXNoZl9wdXRjaGFyKE1BR0lDLCAmc2hmKTsKKwkJCXNoZl9wdXRjaGFyKCd8JywgJnNoZik7CisJCQlicmVhazsKKwkJY2FzZSBDUEFUOgorCQkJaWYgKG1ha2VfbWFnaWMpCisJCQkJc2hmX3B1dGNoYXIoTUFHSUMsICZzaGYpOworCQkJc2hmX3B1dGNoYXIoJyknLCAmc2hmKTsKKwkJCWJyZWFrOworCQl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW93b3JkICoqCitpb2NvcHkoc3RydWN0IGlvd29yZCAqKmlvdywgQXJlYSAqYXApCit7CisJc3RydWN0IGlvd29yZCAqKmlvcjsKKwlpbnQgaTsKKworCWZvciAoaW9yID0gaW93OyAqaW9yKysgIT0gTlVMTDsgKQorCQk7CisJaW9yID0gYWxsb2MoKGlvciAtIGlvdyArIDEpICogc2l6ZW9mKHN0cnVjdCBpb3dvcmQgKiksIGFwKTsKKworCWZvciAoaSA9IDA7IGlvd1tpXSAhPSBOVUxMOyBpKyspIHsKKwkJc3RydWN0IGlvd29yZCAqcCwgKnE7CisKKwkJcCA9IGlvd1tpXTsKKwkJcSA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgaW93b3JkKSwgYXApOworCQlpb3JbaV0gPSBxOworCQkqcSA9ICpwOworCQlpZiAocC0+bmFtZSAhPSBOVUxMKQorCQkJcS0+bmFtZSA9IHdkY29weShwLT5uYW1lLCBhcCk7CisJCWlmIChwLT5kZWxpbSAhPSBOVUxMKQorCQkJcS0+ZGVsaW0gPSB3ZGNvcHkocC0+ZGVsaW0sIGFwKTsKKwkJaWYgKHAtPmhlcmVkb2MgIT0gTlVMTCkKKwkJCXN0cmR1cHgocS0+aGVyZWRvYywgcC0+aGVyZWRvYywgYXApOworCX0KKwlpb3JbaV0gPSBOVUxMOworCisJcmV0dXJuIChpb3IpOworfQorCisvKgorICogZnJlZSB0cmVlIChmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbikKKyAqLwordm9pZAordGZyZWUoc3RydWN0IG9wICp0LCBBcmVhICphcCkKK3sKKwljaGFyICoqdzsKKworCWlmICh0ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICh0LT5zdHIgIT0gTlVMTCkKKwkJYWZyZWUodC0+c3RyLCBhcCk7CisKKwlpZiAodC0+dmFycyAhPSBOVUxMKSB7CisJCWZvciAodyA9IHQtPnZhcnM7ICp3ICE9IE5VTEw7IHcrKykKKwkJCWFmcmVlKCp3LCBhcCk7CisJCWFmcmVlKHQtPnZhcnMsIGFwKTsKKwl9CisKKwlpZiAodC0+YXJncyAhPSBOVUxMKSB7CisJCXVuaW9uIG1rc2hfY2NwaGFjayBjdzsKKwkJLyogWFhYIHdlIGFzc3VtZSB0aGUgY2FsbGVyIGlzIHJpZ2h0ICovCisJCWN3LnJvID0gdC0+YXJnczsKKwkJZm9yICh3ID0gY3cucnc7ICp3ICE9IE5VTEw7IHcrKykKKwkJCWFmcmVlKCp3LCBhcCk7CisJCWFmcmVlKHQtPmFyZ3MsIGFwKTsKKwl9CisKKwlpZiAodC0+aW9hY3QgIT0gTlVMTCkKKwkJaW9mcmVlKHQtPmlvYWN0LCBhcCk7CisKKwl0ZnJlZSh0LT5sZWZ0LCBhcCk7CisJdGZyZWUodC0+cmlnaHQsIGFwKTsKKworCWFmcmVlKHQsIGFwKTsKK30KKworc3RhdGljIHZvaWQKK2lvZnJlZShzdHJ1Y3QgaW93b3JkICoqaW93LCBBcmVhICphcCkKK3sKKwlzdHJ1Y3QgaW93b3JkICoqaW9wOworCXN0cnVjdCBpb3dvcmQgKnA7CisKKwlmb3IgKGlvcCA9IGlvdzsgKHAgPSAqaW9wKyspICE9IE5VTEw7ICkgeworCQlpZiAocC0+bmFtZSAhPSBOVUxMKQorCQkJYWZyZWUocC0+bmFtZSwgYXApOworCQlpZiAocC0+ZGVsaW0gIT0gTlVMTCkKKwkJCWFmcmVlKHAtPmRlbGltLCBhcCk7CisJCWlmIChwLT5oZXJlZG9jICE9IE5VTEwpCisJCQlhZnJlZShwLT5oZXJlZG9jLCBhcCk7CisJCWFmcmVlKHAsIGFwKTsKKwl9CisJYWZyZWUoaW93LCBhcCk7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy92YXIuYyBiL21rc2gvc3JjL3Zhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTcyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy92YXIuYwpAQCAtMCwwICsxLDE0OTAgQEAKKy8qCSRPcGVuQlNEOiB2YXIuYyx2IDEuMzQgMjAwNy8xMC8xNSAwMjoxNjozNSBkZXJhYWR0IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2VuZGlmCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3Zhci5jLHYgMS4xMTAgMjAxMC8wNy8yNSAxMTozNTo0MyB0ZyBFeHAgJCIpOworCisvKgorICogVmFyaWFibGVzCisgKgorICogV0FSTklORzogdW5yZWFkYWJsZSBjb2RlLCBuZWVkcyBhIHJld3JpdGUKKyAqCisgKiBpZiAoZmxhZyZJTlRFR0VSKSwgdmFsLmkgY29udGFpbnMgaW50ZWdlciB2YWx1ZSwgYW5kIHR5cGUgY29udGFpbnMgYmFzZS4KKyAqIG90aGVyd2lzZSwgKHZhbC5zICsgdHlwZSkgY29udGFpbnMgc3RyaW5nIHZhbHVlLgorICogaWYgKGZsYWcmRVhQT1JUKSwgdmFsLnMgY29udGFpbnMgIm5hbWU9dmFsdWUiIGZvciBFLVogZXhwb3J0aW5nLgorICovCitzdGF0aWMgc3RydWN0IHRibCB2dGVtcDsKK3N0YXRpYyBzdHJ1Y3QgdGFibGUgc3BlY2lhbHM7CitzdGF0aWMgY2hhciAqZm9ybWF0c3RyKHN0cnVjdCB0YmwgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIGV4cG9ydHByZXAoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGludCBzcGVjaWFsKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCB1bnNwZWNpYWwoY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIGdldHNwZWMoc3RydWN0IHRibCAqKTsKK3N0YXRpYyB2b2lkIHNldHNwZWMoc3RydWN0IHRibCAqKTsKK3N0YXRpYyB2b2lkIHVuc2V0c3BlYyhzdHJ1Y3QgdGJsICopOworc3RhdGljIGludCBnZXRpbnQoc3RydWN0IHRibCAqLCBta3NoX2FyaV90ICosIGJvb2wpOworc3RhdGljIG1rc2hfYXJpX3QgaW50dmFsKHN0cnVjdCB0YmwgKik7CitzdGF0aWMgc3RydWN0IHRibCAqYXJyYXlzZWFyY2goc3RydWN0IHRibCAqLCB1aW50MzJfdCk7CitzdGF0aWMgY29uc3QgY2hhciAqYXJyYXlfaW5kZXhfY2FsYyhjb25zdCBjaGFyICosIGJvb2wgKiwgdWludDMyX3QgKik7CitzdGF0aWMgdWludDMyX3Qgb2FhdGhhc2hfdXBkYXRlKHJlZ2lzdGVyIHVpbnQzMl90LCByZWdpc3RlciBjb25zdCB1aW50OF90ICosCisgICAgcmVnaXN0ZXIgc2l6ZV90KTsKK3N0YXRpYyB1aW50MzJfdCBvYWF0aGFzaF9maW5hbGlzZShyZWdpc3RlciB1aW50MzJfdCk7CisKK3VpbnQ4X3Qgc2V0X3JlZmZsYWcgPSAwOworCisvKgorICogY3JlYXRlIGEgbmV3IGJsb2NrIGZvciBmdW5jdGlvbiBjYWxscyBhbmQgc2ltcGxlIGNvbW1hbmRzCisgKiBhc3N1bWUgY2FsbGVyIGhhcyBhbGxvY2F0ZWQgYW5kIHNldCB1cCBlLT5sb2MKKyAqLwordm9pZAorbmV3YmxvY2sodm9pZCkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmw7CisJc3RhdGljIGNvbnN0IGNoYXIgKmVtcHR5W10gPSB7IG51bGwgfTsKKworCWwgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrKSwgQVRFTVApOworCWwtPmZsYWdzID0gMDsKKwlhaW5pdCgmbC0+YXJlYSk7IC8qIHRvZG86IGNvdWxkIHVzZSBlLT5hcmVhIChsLT5hcmVhID0+IGwtPmFyZWFwKSAqLworCWlmICghZS0+bG9jKSB7CisJCWwtPmFyZ2MgPSAwOworCQlsLT5hcmd2ID0gZW1wdHk7CisJfSBlbHNlIHsKKwkJbC0+YXJnYyA9IGUtPmxvYy0+YXJnYzsKKwkJbC0+YXJndiA9IGUtPmxvYy0+YXJndjsKKwl9CisJbC0+ZXhpdCA9IGwtPmVycm9yID0gTlVMTDsKKwlrdGluaXQoJmwtPnZhcnMsICZsLT5hcmVhLCAwKTsKKwlrdGluaXQoJmwtPmZ1bnMsICZsLT5hcmVhLCAwKTsKKwlsLT5uZXh0ID0gZS0+bG9jOworCWUtPmxvYyA9IGw7Cit9CisKKy8qCisgKiBwb3AgYSBibG9jayBoYW5kbGluZyBzcGVjaWFsIHZhcmlhYmxlcworICovCit2b2lkCitwb3BibG9jayh2b2lkKQoreworCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKKwlzdHJ1Y3QgdGJsICp2cCwgKip2cHAgPSBsLT52YXJzLnRibHMsICp2cTsKKwlpbnQgaTsKKworCWUtPmxvYyA9IGwtPm5leHQ7CS8qIHBvcCBibG9jayAqLworCWZvciAoaSA9IGwtPnZhcnMuc2l6ZTsgLS1pID49IDA7ICkKKwkJaWYgKCh2cCA9ICp2cHArKykgIT0gTlVMTCAmJiAodnAtPmZsYWcmU1BFQ0lBTCkpIHsKKwkJCWlmICgodnEgPSBnbG9iYWwodnAtPm5hbWUpKS0+ZmxhZyAmIElTU0VUKQorCQkJCXNldHNwZWModnEpOworCQkJZWxzZQorCQkJCXVuc2V0c3BlYyh2cSk7CisJCX0KKwlpZiAobC0+ZmxhZ3MgJiBCRl9ET0dFVE9QVFMpCisJCXVzZXJfb3B0ID0gbC0+Z2V0b3B0c19zdGF0ZTsKKwlhZnJlZWFsbCgmbC0+YXJlYSk7CisJYWZyZWUobCwgQVRFTVApOworfQorCisvKiBjYWxsZWQgYnkgbWFpbigpIHRvIGluaXRpYWxpc2UgdmFyaWFibGUgZGF0YSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIFZBUlNQRUNfREVGTlMKKyNpbmNsdWRlICJ2YXJfc3BlYy5oIgorCitlbnVtIHZhcl9zcGVjcyB7CisjZGVmaW5lIFZBUlNQRUNfRU5VTVMKKyNpbmNsdWRlICJ2YXJfc3BlYy5oIgorCVZfTUFYCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluaXR2YXJfbmFtZXNbXSA9IHsKKyNkZWZpbmUgVkFSU1BFQ19JVEVNUworI2luY2x1ZGUgInZhcl9zcGVjLmgiCit9OworCit2b2lkCitpbml0dmFyKHZvaWQpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCB0YmwgKnRwOworCisJa3Rpbml0KCZzcGVjaWFscywgQVBFUk0sCisJICAgIC8qIG11c3QgYmUgODAlIG9mIDJebiAoY3VycmVudGx5IDEyIHNwZWNpYWxzKSAqLyAxNik7CisJd2hpbGUgKGkgPCBWX01BWCAtIDEpIHsKKwkJdHAgPSBrdGVudGVyKCZzcGVjaWFscywgaW5pdHZhcl9uYW1lc1tpXSwKKwkJICAgIGhhc2goaW5pdHZhcl9uYW1lc1tpXSkpOworCQl0cC0+ZmxhZyA9IERFRklORUR8SVNTRVQ7CisJCXRwLT50eXBlID0gKytpOworCX0KK30KKworLyogVXNlZCB0byBjYWxjdWxhdGUgYW4gYXJyYXkgaW5kZXggZm9yIGdsb2JhbCgpL2xvY2FsKCkuIFNldHMgKmFycmF5cCB0bworICogdHJ1ZSBpZiB0aGlzIGlzIGFuIGFycmF5LCBzZXRzICp2YWxwIHRvIHRoZSBhcnJheSBpbmRleCwgcmV0dXJucworICogdGhlIGJhc2VuYW1lIG9mIHRoZSBhcnJheS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorYXJyYXlfaW5kZXhfY2FsYyhjb25zdCBjaGFyICpuLCBib29sICphcnJheXAsIHVpbnQzMl90ICp2YWxwKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGxlbjsKKwljaGFyICphcCA9IE5VTEw7CisKKwkqYXJyYXlwID0gZmFsc2U7CisgcmVkb19mcm9tX3JlZjoKKwlwID0gc2tpcF92YXJuYW1lKG4sIGZhbHNlKTsKKwlpZiAoIXNldF9yZWZmbGFnICYmIChwICE9IG4pICYmIGtzaF9pc2FscGh4KG5bMF0pKSB7CisJCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKKwkJc3RydWN0IHRibCAqdnA7CisJCWNoYXIgKnZuOworCQl1aW50MzJfdCBoOworCisJCXN0cm5kdXB4KHZuLCBuLCBwIC0gbiwgQVRFTVApOworCQloID0gaGFzaCh2bik7CisJCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSByZWZlcmVuY2UgKi8KKwkJZG8geworCQkJdnAgPSBrdHNlYXJjaCgmbC0+dmFycywgdm4sIGgpOworCQl9IHdoaWxlICghdnAgJiYgKGwgPSBsLT5uZXh0KSk7CisJCWFmcmVlKHZuLCBBVEVNUCk7CisJCWlmICh2cCAmJiAodnAtPmZsYWcgJiAoREVGSU5FRHxBU1NPQ3xBUlJBWSkpID09CisJCSAgICAoREVGSU5FRHxBU1NPQykpIHsKKwkJCWNoYXIgKmNwOworCisJCQkvKiBnb3RjaGEhICovCisJCQljcCA9IHNoZl9zbXByaW50ZigiJXMlcyIsIHN0cl92YWwodnApLCBwKTsKKwkJCWFmcmVlKGFwLCBBVEVNUCk7CisJCQluID0gYXAgPSBjcDsKKwkJCWdvdG8gcmVkb19mcm9tX3JlZjsKKwkJfQorCX0KKworCWlmIChwICE9IG4gJiYgKnAgPT0gJ1snICYmIChsZW4gPSBhcnJheV9yZWZfbGVuKHApKSkgeworCQljaGFyICpzdWIsICp0bXA7CisJCW1rc2hfYXJpX3QgcnZhbDsKKworCQkvKiBDYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRoZSBzdWJzY3JpcHQgKi8KKwkJKmFycmF5cCA9IHRydWU7CisJCXN0cm5kdXB4KHRtcCwgcCArIDEsIGxlbiAtIDIsIEFURU1QKTsKKwkJc3ViID0gc3Vic3RpdHV0ZSh0bXAsIDApOworCQlhZnJlZSh0bXAsIEFURU1QKTsKKwkJc3RybmR1cHgobiwgbiwgcCAtIG4sIEFURU1QKTsKKwkJZXZhbHVhdGUoc3ViLCAmcnZhbCwgS1NIX1VOV0lORF9FUlJPUiwgdHJ1ZSk7CisJCSp2YWxwID0gKHVpbnQzMl90KXJ2YWw7CisJCWFmcmVlKHN1YiwgQVRFTVApOworCX0KKwlyZXR1cm4gKG4pOworfQorCisvKgorICogU2VhcmNoIGZvciB2YXJpYWJsZSwgaWYgbm90IGZvdW5kIGNyZWF0ZSBnbG9iYWxseS4KKyAqLworc3RydWN0IHRibCAqCitnbG9iYWwoY29uc3QgY2hhciAqbikKK3sKKwlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7CisJc3RydWN0IHRibCAqdnA7CisJaW50IGM7CisJYm9vbCBhcnJheTsKKwl1aW50MzJfdCBoLCB2YWw7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBhcnJheSAqLworCW4gPSBhcnJheV9pbmRleF9jYWxjKG4sICZhcnJheSwgJnZhbCk7CisJaCA9IGhhc2gobik7CisJYyA9IG5bMF07CisJaWYgKCFrc2hfaXNhbHBoeChjKSkgeworCQlpZiAoYXJyYXkpCisJCQllcnJvcmYoImJhZCBzdWJzdGl0dXRpb24iKTsKKwkJdnAgPSAmdnRlbXA7CisJCXZwLT5mbGFnID0gREVGSU5FRDsKKwkJdnAtPnR5cGUgPSAwOworCQl2cC0+YXJlYXAgPSBBVEVNUDsKKwkJKnZwLT5uYW1lID0gYzsKKwkJaWYgKGtzaF9pc2RpZ2l0KGMpKSB7CisJCQlmb3IgKGMgPSAwOyBrc2hfaXNkaWdpdCgqbik7IG4rKykKKwkJCQljID0gYyoxMCArICpuLScwJzsKKwkJCWlmIChjIDw9IGwtPmFyZ2MpCisJCQkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLworCQkJCXNldHN0cih2cCwgbC0+YXJndltjXSwgS1NIX1JFVFVSTl9FUlJPUik7CisJCQl2cC0+ZmxhZyB8PSBSRE9OTFk7CisJCQlyZXR1cm4gKHZwKTsKKwkJfQorCQl2cC0+ZmxhZyB8PSBSRE9OTFk7CisJCWlmIChuWzFdICE9ICdcMCcpCisJCQlyZXR1cm4gKHZwKTsKKwkJdnAtPmZsYWcgfD0gSVNTRVR8SU5URUdFUjsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJyQnOgorCQkJdnAtPnZhbC5pID0ga3NocGlkOworCQkJYnJlYWs7CisJCWNhc2UgJyEnOgorCQkJLyogSWYgbm8gam9iLCBleHBhbmQgdG8gbm90aGluZyAqLworCQkJaWYgKCh2cC0+dmFsLmkgPSBqX2FzeW5jKCkpID09IDApCisJCQkJdnAtPmZsYWcgJj0gfihJU1NFVHxJTlRFR0VSKTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXZwLT52YWwuaSA9IGV4c3RhdDsKKwkJCWJyZWFrOworCQljYXNlICcjJzoKKwkJCXZwLT52YWwuaSA9IGwtPmFyZ2M7CisJCQlicmVhazsKKwkJY2FzZSAnLSc6CisJCQl2cC0+ZmxhZyAmPSB+SU5URUdFUjsKKwkJCXZwLT52YWwucyA9IGdldG9wdGlvbnMoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdnAtPmZsYWcgJj0gfihJU1NFVHxJTlRFR0VSKTsKKwkJfQorCQlyZXR1cm4gKHZwKTsKKwl9CisJZm9yIChsID0gZS0+bG9jOyA7IGwgPSBsLT5uZXh0KSB7CisJCXZwID0ga3RzZWFyY2goJmwtPnZhcnMsIG4sIGgpOworCQlpZiAodnAgIT0gTlVMTCkgeworCQkJaWYgKGFycmF5KQorCQkJCXJldHVybiAoYXJyYXlzZWFyY2godnAsIHZhbCkpOworCQkJZWxzZQorCQkJCXJldHVybiAodnApOworCQl9CisJCWlmIChsLT5uZXh0ID09IE5VTEwpCisJCQlicmVhazsKKwl9CisJdnAgPSBrdGVudGVyKCZsLT52YXJzLCBuLCBoKTsKKwlpZiAoYXJyYXkpCisJCXZwID0gYXJyYXlzZWFyY2godnAsIHZhbCk7CisJdnAtPmZsYWcgfD0gREVGSU5FRDsKKwlpZiAoc3BlY2lhbChuKSkKKwkJdnAtPmZsYWcgfD0gU1BFQ0lBTDsKKwlyZXR1cm4gKHZwKTsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgbG9jYWwgdmFyaWFibGUsIGlmIG5vdCBmb3VuZCBjcmVhdGUgbG9jYWxseS4KKyAqLworc3RydWN0IHRibCAqCitsb2NhbChjb25zdCBjaGFyICpuLCBib29sIGNvcHkpCit7CisJc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOworCXN0cnVjdCB0YmwgKnZwOworCWJvb2wgYXJyYXk7CisJdWludDMyX3QgaCwgdmFsOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gYXJyYXkgKi8KKwluID0gYXJyYXlfaW5kZXhfY2FsYyhuLCAmYXJyYXksICZ2YWwpOworCWggPSBoYXNoKG4pOworCWlmICgha3NoX2lzYWxwaHgoKm4pKSB7CisJCXZwID0gJnZ0ZW1wOworCQl2cC0+ZmxhZyA9IERFRklORUR8UkRPTkxZOworCQl2cC0+dHlwZSA9IDA7CisJCXZwLT5hcmVhcCA9IEFURU1QOworCQlyZXR1cm4gKHZwKTsKKwl9CisJdnAgPSBrdGVudGVyKCZsLT52YXJzLCBuLCBoKTsKKwlpZiAoY29weSAmJiAhKHZwLT5mbGFnICYgREVGSU5FRCkpIHsKKwkJc3RydWN0IGJsb2NrICpsbCA9IGw7CisJCXN0cnVjdCB0YmwgKnZxID0gTlVMTDsKKworCQl3aGlsZSAoKGxsID0gbGwtPm5leHQpICYmICEodnEgPSBrdHNlYXJjaCgmbGwtPnZhcnMsIG4sIGgpKSkKKwkJCTsKKwkJaWYgKHZxKSB7CisJCQl2cC0+ZmxhZyB8PSB2cS0+ZmxhZyAmCisJCQkgICAgKEVYUE9SVCB8IElOVEVHRVIgfCBSRE9OTFkgfCBMSlVTVCB8IFJKVVNUIHwKKwkJCSAgICBaRVJPRklMIHwgTENBU0VWIHwgVUNBU0VWX0FMIHwgSU5UX1UgfCBJTlRfTCk7CisJCQlpZiAodnEtPmZsYWcgJiBJTlRFR0VSKQorCQkJCXZwLT50eXBlID0gdnEtPnR5cGU7CisJCQl2cC0+dTIuZmllbGQgPSB2cS0+dTIuZmllbGQ7CisJCX0KKwl9CisJaWYgKGFycmF5KQorCQl2cCA9IGFycmF5c2VhcmNoKHZwLCB2YWwpOworCXZwLT5mbGFnIHw9IERFRklORUQ7CisJaWYgKHNwZWNpYWwobikpCisJCXZwLT5mbGFnIHw9IFNQRUNJQUw7CisJcmV0dXJuICh2cCk7Cit9CisKKy8qIGdldCB2YXJpYWJsZSBzdHJpbmcgdmFsdWUgKi8KK2NoYXIgKgorc3RyX3ZhbChzdHJ1Y3QgdGJsICp2cCkKK3sKKwljaGFyICpzOworCisJaWYgKCh2cC0+ZmxhZyZTUEVDSUFMKSkKKwkJZ2V0c3BlYyh2cCk7CisJaWYgKCEodnAtPmZsYWcmSVNTRVQpKQorCQlzID0gbnVsbDsJCS8qIHNwZWNpYWwgdG8gZG9sbGFyKCkgKi8KKwllbHNlIGlmICghKHZwLT5mbGFnJklOVEVHRVIpKQkvKiBzdHJpbmcgc291cmNlICovCisJCXMgPSB2cC0+dmFsLnMgKyB2cC0+dHlwZTsKKwllbHNlIHsJCQkJLyogaW50ZWdlciBzb3VyY2UgKi8KKwkJLyogd29yc3QgY2FzZSBudW1iZXIgbGVuZ3RoIGlzIHdoZW4gYmFzZT0yICovCisJCS8qIDEgKG1pbnVzKSArIDIgKGJhc2UsIHVwIHRvIDM2KSArIDEgKCcjJykgKyBudW1iZXIgb2YgYml0cworCQkgKiBpbiB0aGUgbWtzaF91YXJpX3QgKyAxIChOVUwpICovCisJCWNoYXIgc3RyYnVmWzEgKyAyICsgMSArIDggKiBzaXplb2YobWtzaF91YXJpX3QpICsgMV07CisJCWNvbnN0IGNoYXIgKmRpZ2l0cyA9ICh2cC0+ZmxhZyAmIFVDQVNFVl9BTCkgPworCQkgICAgZGlnaXRzX3VjIDogZGlnaXRzX2xjOworCQlta3NoX3VhcmlfdCBuOworCQlpbnQgYmFzZTsKKworCQlzID0gc3RyYnVmICsgc2l6ZW9mKHN0cmJ1Zik7CisJCWlmICh2cC0+ZmxhZyAmIElOVF9VKQorCQkJbiA9IHZwLT52YWwudTsKKwkJZWxzZQorCQkJbiA9ICh2cC0+dmFsLmkgPCAwKSA/IC12cC0+dmFsLmkgOiB2cC0+dmFsLmk7CisJCWJhc2UgPSAodnAtPnR5cGUgPT0gMCkgPyAxMCA6IHZwLT50eXBlOworCisJCWlmIChiYXNlID09IDEpIHsKKwkJCXNpemVfdCBzeiA9IDE7CisKKwkJCSoocyA9IHN0cmJ1ZikgPSAnMSc7CisJCQlzWzFdID0gJyMnOworCQkJaWYgKCFVVEZNT0RFIHx8ICgobiAmIDB4RkY4MCkgPT0gMHhFRjgwKSkKKwkJCQkvKiBPUFRVLTE2IC0+IHJhdyBvY3RldCAqLworCQkJCXNbMl0gPSBuICYgMHhGRjsKKwkJCWVsc2UKKwkJCQlzeiA9IHV0Zl93Y3RvbWIocyArIDIsIG4pOworCQkJc1syICsgc3pdID0gJ1wwJzsKKwkJfSBlbHNlIHsKKwkJCSotLXMgPSAnXDAnOworCQkJZG8geworCQkJCSotLXMgPSBkaWdpdHNbbiAlIGJhc2VdOworCQkJCW4gLz0gYmFzZTsKKwkJCX0gd2hpbGUgKG4gIT0gMCk7CisJCQlpZiAoYmFzZSAhPSAxMCkgeworCQkJCSotLXMgPSAnIyc7CisJCQkJKi0tcyA9IGRpZ2l0c1tiYXNlICUgMTBdOworCQkJCWlmIChiYXNlID49IDEwKQorCQkJCQkqLS1zID0gZGlnaXRzW2Jhc2UgLyAxMF07CisJCQl9CisJCQlpZiAoISh2cC0+ZmxhZyAmIElOVF9VKSAmJiB2cC0+dmFsLmkgPCAwKQorCQkJCSotLXMgPSAnLSc7CisJCX0KKwkJaWYgKHZwLT5mbGFnICYgKFJKVVNUfExKVVNUKSkgLyogY2FzZSBhbHJlYWR5IGRlYWx0IHdpdGggKi8KKwkJCXMgPSBmb3JtYXRzdHIodnAsIHMpOworCQllbHNlCisJCQlzdHJkdXB4KHMsIHMsIEFURU1QKTsKKwl9CisJcmV0dXJuIChzKTsKK30KKworLyogZ2V0IHZhcmlhYmxlIGludGVnZXIgdmFsdWUsIHdpdGggZXJyb3IgY2hlY2tpbmcgKi8KK3N0YXRpYyBta3NoX2FyaV90CitpbnR2YWwoc3RydWN0IHRibCAqdnApCit7CisJbWtzaF9hcmlfdCBudW07CisJaW50IGJhc2U7CisKKwliYXNlID0gZ2V0aW50KHZwLCAmbnVtLCBmYWxzZSk7CisJaWYgKGJhc2UgPT0gLTEpCisJCS8qIFhYWCBjaGVjayBjYWxscyAtIGlzIGVycm9yIGhlcmUgb2sgYnkgUE9TSVg/ICovCisJCWVycm9yZigiJXM6IGJhZCBudW1iZXIiLCBzdHJfdmFsKHZwKSk7CisJcmV0dXJuIChudW0pOworfQorCisvKiBzZXQgdmFyaWFibGUgdG8gc3RyaW5nIHZhbHVlICovCitpbnQKK3NldHN0cihzdHJ1Y3QgdGJsICp2cSwgY29uc3QgY2hhciAqcywgaW50IGVycm9yX29rKQoreworCWNoYXIgKnNhbGxvYyA9IE5VTEw7CisJaW50IG5vX3JvX2NoZWNrID0gZXJyb3Jfb2sgJiAweDQ7CisKKwllcnJvcl9vayAmPSB+MHg0OworCWlmICgodnEtPmZsYWcgJiBSRE9OTFkpICYmICFub19yb19jaGVjaykgeworCQl3YXJuaW5nZih0cnVlLCAiJXM6IGlzIHJlYWQgb25seSIsIHZxLT5uYW1lKTsKKwkJaWYgKCFlcnJvcl9vaykKKwkJCWVycm9yZnooKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKCEodnEtPmZsYWcmSU5URUdFUikpIHsgLyogc3RyaW5nIGRlc3QgKi8KKwkJaWYgKCh2cS0+ZmxhZyZBTExPQykpIHsKKwkJCS8qIGRlYnVnZ2luZyAqLworCQkJaWYgKHMgPj0gdnEtPnZhbC5zICYmCisJCQkgICAgcyA8PSB2cS0+dmFsLnMgKyBzdHJsZW4odnEtPnZhbC5zKSkKKwkJCQlpbnRlcm5hbF9lcnJvcmYoCisJCQkJICAgICJzZXRzdHI6ICVzPSVzOiBhc3NpZ25pbmcgdG8gc2VsZiIsCisJCQkJICAgIHZxLT5uYW1lLCBzKTsKKwkJCWFmcmVlKHZxLT52YWwucywgdnEtPmFyZWFwKTsKKwkJfQorCQl2cS0+ZmxhZyAmPSB+KElTU0VUfEFMTE9DKTsKKwkJdnEtPnR5cGUgPSAwOworCQlpZiAocyAmJiAodnEtPmZsYWcgJiAoVUNBU0VWX0FMfExDQVNFVnxMSlVTVHxSSlVTVCkpKQorCQkJcyA9IHNhbGxvYyA9IGZvcm1hdHN0cih2cSwgcyk7CisJCWlmICgodnEtPmZsYWcmRVhQT1JUKSkKKwkJCWV4cG9ydHByZXAodnEsIHMpOworCQllbHNlIHsKKwkJCXN0cmR1cHgodnEtPnZhbC5zLCBzLCB2cS0+YXJlYXApOworCQkJdnEtPmZsYWcgfD0gQUxMT0M7CisJCX0KKwl9IGVsc2UgewkJLyogaW50ZWdlciBkZXN0ICovCisJCWlmICghdl9ldmFsdWF0ZSh2cSwgcywgZXJyb3Jfb2ssIHRydWUpKQorCQkJcmV0dXJuICgwKTsKKwl9CisJdnEtPmZsYWcgfD0gSVNTRVQ7CisJaWYgKCh2cS0+ZmxhZyZTUEVDSUFMKSkKKwkJc2V0c3BlYyh2cSk7CisJYWZyZWUoc2FsbG9jLCBBVEVNUCk7CisJcmV0dXJuICgxKTsKK30KKworLyogc2V0IHZhcmlhYmxlIHRvIGludGVnZXIgKi8KK3ZvaWQKK3NldGludChzdHJ1Y3QgdGJsICp2cSwgbWtzaF9hcmlfdCBuKQoreworCWlmICghKHZxLT5mbGFnJklOVEVHRVIpKSB7CisJCXN0cnVjdCB0YmwgKnZwID0gJnZ0ZW1wOworCQl2cC0+ZmxhZyA9IChJU1NFVHxJTlRFR0VSKTsKKwkJdnAtPnR5cGUgPSAwOworCQl2cC0+YXJlYXAgPSBBVEVNUDsKKwkJdnAtPnZhbC5pID0gbjsKKwkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLworCQlzZXRzdHIodnEsIHN0cl92YWwodnApLCBLU0hfUkVUVVJOX0VSUk9SKTsKKwl9IGVsc2UKKwkJdnEtPnZhbC5pID0gbjsKKwl2cS0+ZmxhZyB8PSBJU1NFVDsKKwlpZiAoKHZxLT5mbGFnJlNQRUNJQUwpKQorCQlzZXRzcGVjKHZxKTsKK30KKworc3RhdGljIGludAorZ2V0aW50KHN0cnVjdCB0YmwgKnZwLCBta3NoX2FyaV90ICpudW1wLCBib29sIGFyaXRoKQoreworCWNoYXIgKnM7CisJaW50IGMsIGJhc2UsIG5lZzsKKwlib29sIGhhdmVfYmFzZSA9IGZhbHNlOworCW1rc2hfYXJpX3QgbnVtOworCisJaWYgKHZwLT5mbGFnJlNQRUNJQUwpCisJCWdldHNwZWModnApOworCS8qIFhYWCBpcyBpdCBwb3NzaWJsZSBmb3IgSVNTRVQgdG8gYmUgc2V0IGFuZCB2YWwucyB0byBiZSAwPyAqLworCWlmICghKHZwLT5mbGFnJklTU0VUKSB8fCAoISh2cC0+ZmxhZyZJTlRFR0VSKSAmJiB2cC0+dmFsLnMgPT0gTlVMTCkpCisJCXJldHVybiAoLTEpOworCWlmICh2cC0+ZmxhZyZJTlRFR0VSKSB7CisJCSpudW1wID0gdnAtPnZhbC5pOworCQlyZXR1cm4gKHZwLT50eXBlKTsKKwl9CisJcyA9IHZwLT52YWwucyArIHZwLT50eXBlOworCWlmIChzID09IE5VTEwpCS8qIHJlZHVuZGFudCBnaXZlbiBpbml0aWFsIHRlc3QgKi8KKwkJcyA9IG51bGw7CisJYmFzZSA9IDEwOworCW51bSA9IDA7CisJbmVnID0gMDsKKwlpZiAoYXJpdGggJiYgKnMgPT0gJzAnICYmICoocysxKSkgeworCQlzKys7CisJCWlmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSB7CisJCQlzKys7CisJCQliYXNlID0gMTY7CisJCX0gZWxzZSBpZiAodnAtPmZsYWcgJiBaRVJPRklMKSB7CisJCQl3aGlsZSAoKnMgPT0gJzAnKQorCQkJCXMrKzsKKwkJfSBlbHNlCisJCQliYXNlID0gODsKKwkJaGF2ZV9iYXNlID0gdHJ1ZTsKKwl9CisJZm9yIChjID0gKnMrKzsgYyA7IGMgPSAqcysrKSB7CisJCWlmIChjID09ICctJykgeworCQkJbmVnKys7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChjID09ICcjJykgeworCQkJYmFzZSA9IChpbnQpbnVtOworCQkJaWYgKGhhdmVfYmFzZSB8fCBiYXNlIDwgMSB8fCBiYXNlID4gMzYpCisJCQkJcmV0dXJuICgtMSk7CisJCQlpZiAoYmFzZSA9PSAxKSB7CisJCQkJdW5zaWduZWQgaW50IHdjOworCisJCQkJaWYgKCFVVEZNT0RFKQorCQkJCQl3YyA9ICoodW5zaWduZWQgY2hhciAqKXM7CisJCQkJZWxzZSBpZiAodXRmX21idG93Yygmd2MsIHMpID09IChzaXplX3QpLTEpCisJCQkJCS8qIE9QVFUtOCAtPiBPUFRVLTE2ICovCisJCQkJCS8qCisJCQkJCSAqICh3aXRoIGEgdHdpc3Q6IDEjXHVFRjgwIGNvbnZlcnRzCisJCQkJCSAqIHRoZSBzYW1lIGFzIDEjXHg4MCBkb2VzLCB0aHVzIGlzCisJCQkJCSAqIG5vdCByb3VuZC10cmlwcGluZyBjb3JyZWN0bHkgWFhYKQorCQkJCQkgKi8KKwkJCQkJd2MgPSAweEVGMDAgKyAqKHVuc2lnbmVkIGNoYXIgKilzOworCQkJCSpudW1wID0gKG1rc2hfYXJpX3Qpd2M7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCW51bSA9IDA7CisJCQloYXZlX2Jhc2UgPSB0cnVlOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoa3NoX2lzZGlnaXQoYykpCisJCQljIC09ICcwJzsKKwkJZWxzZSBpZiAoa3NoX2lzbG93ZXIoYykpCisJCQljIC09ICdhJyAtIDEwOworCQllbHNlIGlmIChrc2hfaXN1cHBlcihjKSkKKwkJCWMgLT0gJ0EnIC0gMTA7CisJCWVsc2UKKwkJCXJldHVybiAoLTEpOworCQlpZiAoYyA8IDAgfHwgYyA+PSBiYXNlKQorCQkJcmV0dXJuICgtMSk7CisJCW51bSA9IG51bSAqIGJhc2UgKyBjOworCX0KKwlpZiAobmVnKQorCQludW0gPSAtbnVtOworCSpudW1wID0gbnVtOworCXJldHVybiAoYmFzZSk7Cit9CisKKy8qIGNvbnZlcnQgdmFyaWFibGUgdnEgdG8gaW50ZWdlciB2YXJpYWJsZSwgc2V0dGluZyBpdHMgdmFsdWUgZnJvbSB2cAorICogKHZxIGFuZCB2cCBtYXkgYmUgdGhlIHNhbWUpCisgKi8KK3N0cnVjdCB0YmwgKgorc2V0aW50X3Yoc3RydWN0IHRibCAqdnEsIHN0cnVjdCB0YmwgKnZwLCBib29sIGFyaXRoKQoreworCWludCBiYXNlOworCW1rc2hfYXJpX3QgbnVtOworCisJaWYgKChiYXNlID0gZ2V0aW50KHZwLCAmbnVtLCBhcml0aCkpID09IC0xKQorCQlyZXR1cm4gKE5VTEwpOworCWlmICghKHZxLT5mbGFnICYgSU5URUdFUikgJiYgKHZxLT5mbGFnICYgQUxMT0MpKSB7CisJCXZxLT5mbGFnICY9IH5BTExPQzsKKwkJYWZyZWUodnEtPnZhbC5zLCB2cS0+YXJlYXApOworCX0KKwl2cS0+dmFsLmkgPSBudW07CisJaWYgKHZxLT50eXBlID09IDApIC8qIGRlZmF1bHQgYmFzZSAqLworCQl2cS0+dHlwZSA9IGJhc2U7CisJdnEtPmZsYWcgfD0gSVNTRVR8SU5URUdFUjsKKwlpZiAodnEtPmZsYWcmU1BFQ0lBTCkKKwkJc2V0c3BlYyh2cSk7CisJcmV0dXJuICh2cSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2Zvcm1hdHN0cihzdHJ1Y3QgdGJsICp2cCwgY29uc3QgY2hhciAqcykKK3sKKwlpbnQgb2xlbiwgbmxlbjsKKwljaGFyICpwLCAqcTsKKwlzaXplX3QgcHNpejsKKworCW9sZW4gPSB1dGZfbWJzd2lkdGgocyk7CisKKwlpZiAodnAtPmZsYWcgJiAoUkpVU1R8TEpVU1QpKSB7CisJCWlmICghdnAtPnUyLmZpZWxkKQkvKiBkZWZhdWx0IGZpZWxkIHdpZHRoICovCisJCQl2cC0+dTIuZmllbGQgPSBvbGVuOworCQlubGVuID0gdnAtPnUyLmZpZWxkOworCX0gZWxzZQorCQlubGVuID0gb2xlbjsKKworCXAgPSBhbGxvYygocHNpeiA9IG5sZW4gKiAvKiBNQl9MRU5fTUFYICovIDMgKyAxKSwgQVRFTVApOworCWlmICh2cC0+ZmxhZyAmIChSSlVTVHxMSlVTVCkpIHsKKwkJaW50IHNsZW4gPSBvbGVuLCBpID0gMDsKKworCQlpZiAodnAtPmZsYWcgJiBSSlVTVCkgeworCQkJY29uc3QgY2hhciAqcXEgPSBzOworCQkJaW50IG4gPSAwOworCisJCQl3aGlsZSAoaSA8IHNsZW4pCisJCQkJaSArPSB1dGZfd2lkdGhhZGoocXEsICZxcSk7CisJCQkvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKEFUJlQgdXNlcyBxcVstMV0gPT0gJyAnKSAqLworCQkJd2hpbGUgKHFxID4gcyAmJiBrc2hfaXNzcGFjZShxcVstMV0pKSB7CisJCQkJLS1xcTsKKwkJCQktLXNsZW47CisJCQl9CisJCQlpZiAodnAtPmZsYWcgJiBaRVJPRklMICYmIHZwLT5mbGFnICYgSU5URUdFUikgeworCQkJCWlmIChzWzFdID09ICcjJykKKwkJCQkJbiA9IDI7CisJCQkJZWxzZSBpZiAoc1syXSA9PSAnIycpCisJCQkJCW4gPSAzOworCQkJCWlmICh2cC0+dTIuZmllbGQgPD0gbikKKwkJCQkJbiA9IDA7CisJCQl9CisJCQlpZiAobikgeworCQkJCW1lbWNweShwLCBzLCBuKTsKKwkJCQlzICs9IG47CisJCQl9CisJCQl3aGlsZSAoc2xlbiA+IHZwLT51Mi5maWVsZCkKKwkJCQlzbGVuIC09IHV0Zl93aWR0aGFkaihzLCAmcyk7CisJCQlpZiAodnAtPnUyLmZpZWxkIC0gc2xlbikKKwkJCQltZW1zZXQocCArIG4sICh2cC0+ZmxhZyAmIFpFUk9GSUwpID8gJzAnIDogJyAnLAorCQkJCSAgICB2cC0+dTIuZmllbGQgLSBzbGVuKTsKKwkJCXNsZW4gLT0gbjsKKwkJCXNoZl9zbnByaW50ZihwICsgdnAtPnUyLmZpZWxkIC0gc2xlbiwKKwkJCSAgICBwc2l6IC0gKHZwLT51Mi5maWVsZCAtIHNsZW4pLAorCQkJICAgICIlLipzIiwgc2xlbiwgcyk7CisJCX0gZWxzZSB7CisJCQkvKiBzdHJpcCBsZWFkaW5nIHNwYWNlcy96ZXJvcyAqLworCQkJd2hpbGUgKGtzaF9pc3NwYWNlKCpzKSkKKwkJCQlzKys7CisJCQlpZiAodnAtPmZsYWcgJiBaRVJPRklMKQorCQkJCXdoaWxlICgqcyA9PSAnMCcpCisJCQkJCXMrKzsKKwkJCXNoZl9zbnByaW50ZihwLCBubGVuICsgMSwgIiUtKi4qcyIsCisJCQkJdnAtPnUyLmZpZWxkLCB2cC0+dTIuZmllbGQsIHMpOworCQl9CisJfSBlbHNlCisJCW1lbWNweShwLCBzLCBzdHJsZW4ocykgKyAxKTsKKworCWlmICh2cC0+ZmxhZyAmIFVDQVNFVl9BTCkgeworCQlmb3IgKHEgPSBwOyAqcTsgcSsrKQorCQkJKnEgPSBrc2hfdG91cHBlcigqcSk7CisJfSBlbHNlIGlmICh2cC0+ZmxhZyAmIExDQVNFVikgeworCQlmb3IgKHEgPSBwOyAqcTsgcSsrKQorCQkJKnEgPSBrc2hfdG9sb3dlcigqcSk7CisJfQorCisJcmV0dXJuIChwKTsKK30KKworLyoKKyAqIG1ha2UgdnAtPnZhbC5zIGJlICJuYW1lPXZhbHVlIiBmb3IgcXVpY2sgZXhwb3J0aW5nLgorICovCitzdGF0aWMgdm9pZAorZXhwb3J0cHJlcChzdHJ1Y3QgdGJsICp2cCwgY29uc3QgY2hhciAqdmFsKQoreworCWNoYXIgKnhwOworCWNoYXIgKm9wID0gKHZwLT5mbGFnJkFMTE9DKSA/IHZwLT52YWwucyA6IE5VTEw7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4odnAtPm5hbWUpOworCWludCB2YWxsZW4gPSBzdHJsZW4odmFsKSArIDE7CisKKwl2cC0+ZmxhZyB8PSBBTExPQzsKKwl4cCA9IGFsbG9jKG5hbWVsZW4gKyAxICsgdmFsbGVuLCB2cC0+YXJlYXApOworCW1lbWNweSh2cC0+dmFsLnMgPSB4cCwgdnAtPm5hbWUsIG5hbWVsZW4pOworCXhwICs9IG5hbWVsZW47CisJKnhwKysgPSAnPSc7CisJdnAtPnR5cGUgPSB4cCAtIHZwLT52YWwuczsgLyogb2Zmc2V0IHRvIHZhbHVlICovCisJbWVtY3B5KHhwLCB2YWwsIHZhbGxlbik7CisJaWYgKG9wICE9IE5VTEwpCisJCWFmcmVlKG9wLCB2cC0+YXJlYXApOworfQorCisvKgorICogbG9va3VwIHZhcmlhYmxlIChhY2NvcmRpbmcgdG8gKHNldCZMT0NBTCkpLAorICogc2V0IGl0cyBhdHRyaWJ1dGVzIChJTlRFR0VSLCBSRE9OTFksIEVYUE9SVCwgVFJBQ0UsIExKVVNULCBSSlVTVCwgWkVST0ZJTCwKKyAqIExDQVNFViwgVUNBU0VWX0FMKSwgYW5kIG9wdGlvbmFsbHkgc2V0IGl0cyB2YWx1ZSBpZiBhbiBhc3NpZ25tZW50LgorICovCitzdHJ1Y3QgdGJsICoKK3R5cGVzZXQoY29uc3QgY2hhciAqdmFyLCBUZmxhZyBzZXQsIFRmbGFnIGNsciwgaW50IGZpZWxkLCBpbnQgYmFzZSkKK3sKKwlzdHJ1Y3QgdGJsICp2cDsKKwlzdHJ1Y3QgdGJsICp2cGJhc2UsICp0OworCWNoYXIgKnR2YXI7CisJY29uc3QgY2hhciAqdmFsOworCWludCBsZW47CisKKwkvKiBjaGVjayBmb3IgdmFsaWQgdmFyaWFibGUgbmFtZSwgc2VhcmNoIGZvciB2YWx1ZSAqLworCXZhbCA9IHNraXBfdmFybmFtZSh2YXIsIGZhbHNlKTsKKwlpZiAodmFsID09IHZhcikKKwkJcmV0dXJuIChOVUxMKTsKKwlta3NzZXJ0KHZhciAhPSBOVUxMKTsKKwlta3NzZXJ0KCp2YXIgIT0gMCk7CisJaWYgKCp2YWwgPT0gJ1snKSB7CisJCWlmIChzZXRfcmVmZmxhZykKKwkJCWVycm9yZigiJXM6IHJlZmVyZW5jZSB2YXJpYWJsZSBjYW5ub3QgYmUgYW4gYXJyYXkiLAorCQkJICAgIHZhcik7CisJCWxlbiA9IGFycmF5X3JlZl9sZW4odmFsKTsKKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuIChOVUxMKTsKKwkJLyogSU1QT1JUIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBzaGVsbCBzdGFydHMgdXAgYW5kIGlzCisJCSAqIHNldHRpbmcgdXAgaXRzIGVudmlyb25tZW50LiBBbGxvdyBvbmx5IHNpbXBsZSBhcnJheQorCQkgKiByZWZlcmVuY2VzIGF0IHRoaXMgdGltZSBzaW5jZSBwYXJhbWV0ZXIvY29tbWFuZCBzdWJzdGl0dXRpb24KKwkJICogaXMgcHJlZm9ybWVkIG9uIHRoZSBbZXhwcmVzc2lvbl0gd2hpY2ggd291bGQgYmUgYSBtYWpvcgorCQkgKiBzZWN1cml0eSBob2xlLgorCQkgKi8KKwkJaWYgKHNldCAmIElNUE9SVCkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAxOyBpIDwgbGVuIC0gMTsgaSsrKQorCQkJCWlmICgha3NoX2lzZGlnaXQodmFsW2ldKSkKKwkJCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQl2YWwgKz0gbGVuOworCX0KKwlpZiAoKnZhbCA9PSAnPScpCisJCXN0cm5kdXB4KHR2YXIsIHZhciwgdmFsKysgLSB2YXIsIEFURU1QKTsKKwllbHNlIHsKKwkJLyogSW1wb3J0aW5nIGZyb20gb3JpZ2luYWwgZW52aXJvbm1lbnQ6IG11c3QgaGF2ZSBhbiA9ICovCisJCWlmIChzZXQgJiBJTVBPUlQpCisJCQlyZXR1cm4gKE5VTEwpOworCQlzdHJkdXB4KHR2YXIsIHZhciwgQVRFTVApOworCQl2YWwgPSBOVUxMOworCQkvKiBoYW5kbGUgZm9vWypdIOKHkiBmb28gKHdob2xlIGFycmF5KSBtYXBwaW5nIGZvciBSMzliICovCisJCWxlbiA9IHN0cmxlbih0dmFyKTsKKwkJaWYgKGxlbiA+IDMgJiYgdHZhcltsZW4tM10gPT0gJ1snICYmIHR2YXJbbGVuLTJdID09ICcqJyAmJgorCQkgICAgdHZhcltsZW4tMV0gPT0gJ10nKQorCQkJdHZhcltsZW4tM10gPSAnXDAnOworCX0KKworCS8qIFByZXZlbnQgdHlwZXNldCBmcm9tIGNyZWF0aW5nIGEgbG9jYWwgUEFUSC9FTlYvU0hFTEwgKi8KKwlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkgJiYgKHN0cmNtcCh0dmFyLCAiUEFUSCIpID09IDAgfHwKKwkgICAgc3RyY21wKHR2YXIsICJFTlYiKSA9PSAwIHx8IHN0cmNtcCh0dmFyLCAiU0hFTEwiKSA9PSAwKSkKKwkJZXJyb3JmKCIlczogcmVzdHJpY3RlZCIsIHR2YXIpOworCisJdnAgPSAoc2V0JkxPQ0FMKSA/IGxvY2FsKHR2YXIsIChzZXQgJiBMT0NBTF9DT1BZKSA/IHRydWUgOiBmYWxzZSkgOgorCSAgICBnbG9iYWwodHZhcik7CisJaWYgKHNldF9yZWZmbGFnID09IDIgJiYgKHZwLT5mbGFnICYgKEFSUkFZfEFTU09DKSkgPT0gQVNTT0MpCisJCXZwLT5mbGFnICY9IH5BU1NPQzsKKwllbHNlIGlmIChzZXRfcmVmZmxhZyA9PSAxKSB7CisJCWlmICh2cC0+ZmxhZyAmIEFSUkFZKSB7CisJCQlzdHJ1Y3QgdGJsICphLCAqdG1wOworCisJCQkvKiBGcmVlIHVwIGVudGlyZSBhcnJheSAqLworCQkJZm9yIChhID0gdnAtPnUuYXJyYXk7IGE7ICkgeworCQkJCXRtcCA9IGE7CisJCQkJYSA9IGEtPnUuYXJyYXk7CisJCQkJaWYgKHRtcC0+ZmxhZyAmIEFMTE9DKQorCQkJCQlhZnJlZSh0bXAtPnZhbC5zLCB0bXAtPmFyZWFwKTsKKwkJCQlhZnJlZSh0bXAsIHRtcC0+YXJlYXApOworCQkJfQorCQkJdnAtPnUuYXJyYXkgPSBOVUxMOworCQkJdnAtPmZsYWcgJj0gfkFSUkFZOworCQl9CisJCXZwLT5mbGFnIHw9IEFTU09DOworCX0KKworCXNldCAmPSB+KExPQ0FMfExPQ0FMX0NPUFkpOworCisJdnBiYXNlID0gKHZwLT5mbGFnICYgQVJSQVkpID8gZ2xvYmFsKGFycmF5bmFtZSh2YXIpKSA6IHZwOworCisJLyogb25seSBhbGxvdyBleHBvcnQgZmxhZyB0byBiZSBzZXQuIEFUJlQga3NoIGFsbG93cyBhbnkgYXR0cmlidXRlIHRvCisJICogYmUgY2hhbmdlZCB3aGljaCBtZWFucyBpdCBjYW4gYmUgdHJ1bmNhdGVkIG9yIG1vZGlmaWVkICgtTC8tUi8tWi8taSkKKwkgKi8KKwlpZiAoKHZwYmFzZS0+ZmxhZyZSRE9OTFkpICYmCisJICAgICh2YWwgfHwgY2xyIHx8IChzZXQgJiB+RVhQT1JUKSkpCisJCS8qIFhYWCBjaGVjayBjYWxscyAtIGlzIGVycm9yIGhlcmUgb2sgYnkgUE9TSVg/ICovCisJCWVycm9yZigiJXM6IGlzIHJlYWQgb25seSIsIHR2YXIpOworCWFmcmVlKHR2YXIsIEFURU1QKTsKKworCS8qIG1vc3QgY2FsbHMgYXJlIHdpdGggc2V0L2NsciA9PSAwICovCisJaWYgKHNldCB8IGNscikgeworCQlib29sIG9rID0gdHJ1ZTsKKworCQkvKiBYWFggaWYgeFswXSBpc24ndCBzZXQsIHRoZXJlIHdpbGwgYmUgcHJvYmxlbXM6IG5lZWQgdG8gaGF2ZQorCQkgKiBvbmUgY29weSBvZiBhdHRyaWJ1dGVzIGZvciBhcnJheXMuLi4KKwkJICovCisJCWZvciAodCA9IHZwYmFzZTsgdDsgdCA9IHQtPnUuYXJyYXkpIHsKKwkJCWJvb2wgZmFrZV9hc3NpZ247CisJCQljaGFyICpzID0gTlVMTDsKKwkJCWNoYXIgKmZyZWVfbWUgPSBOVUxMOworCisJCQlmYWtlX2Fzc2lnbiA9ICh0LT5mbGFnICYgSVNTRVQpICYmICghdmFsIHx8IHQgIT0gdnApICYmCisJCQkgICAgKChzZXQgJiAoVUNBU0VWX0FMfExDQVNFVnxMSlVTVHxSSlVTVHxaRVJPRklMKSkgfHwKKwkJCSAgICAoKHQtPmZsYWcgJiBJTlRFR0VSKSAmJiAoY2xyICYgSU5URUdFUikpIHx8CisJCQkgICAgKCEodC0+ZmxhZyAmIElOVEVHRVIpICYmIChzZXQgJiBJTlRFR0VSKSkpOworCQkJaWYgKGZha2VfYXNzaWduKSB7CisJCQkJaWYgKHQtPmZsYWcgJiBJTlRFR0VSKSB7CisJCQkJCXMgPSBzdHJfdmFsKHQpOworCQkJCQlmcmVlX21lID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQlzID0gdC0+dmFsLnMgKyB0LT50eXBlOworCQkJCQlmcmVlX21lID0gKHQtPmZsYWcgJiBBTExPQykgPyB0LT52YWwucyA6CisJCQkJCSAgICBOVUxMOworCQkJCX0KKwkJCQl0LT5mbGFnICY9IH5BTExPQzsKKwkJCX0KKwkJCWlmICghKHQtPmZsYWcgJiBJTlRFR0VSKSAmJiAoc2V0ICYgSU5URUdFUikpIHsKKwkJCQl0LT50eXBlID0gMDsKKwkJCQl0LT5mbGFnICY9IH5BTExPQzsKKwkJCX0KKwkJCXQtPmZsYWcgPSAodC0+ZmxhZyB8IHNldCkgJiB+Y2xyOworCQkJLyogRG9uJ3QgY2hhbmdlIGJhc2UgaWYgYXNzaWdubWVudCBpcyB0byBiZSBkb25lLAorCQkJICogaW4gY2FzZSBhc3NpZ25tZW50IGZhaWxzLgorCQkJICovCisJCQlpZiAoKHNldCAmIElOVEVHRVIpICYmIGJhc2UgPiAwICYmICghdmFsIHx8IHQgIT0gdnApKQorCQkJCXQtPnR5cGUgPSBiYXNlOworCQkJaWYgKHNldCAmIChMSlVTVHxSSlVTVHxaRVJPRklMKSkKKwkJCQl0LT51Mi5maWVsZCA9IGZpZWxkOworCQkJaWYgKGZha2VfYXNzaWduKSB7CisJCQkJaWYgKCFzZXRzdHIodCwgcywgS1NIX1JFVFVSTl9FUlJPUikpIHsKKwkJCQkJLyogU29tZXdoYXQgYXJiaXRyYXJ5IGFjdGlvbiBoZXJlOgorCQkJCQkgKiB6YXAgY29udGVudHMgb2YgdmFyaWFibGUsIGJ1dCBrZWVwCisJCQkJCSAqIHRoZSBmbGFnIHNldHRpbmdzLgorCQkJCQkgKi8KKwkJCQkJb2sgPSBmYWxzZTsKKwkJCQkJaWYgKHQtPmZsYWcgJiBJTlRFR0VSKQorCQkJCQkJdC0+ZmxhZyAmPSB+SVNTRVQ7CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKHQtPmZsYWcgJiBBTExPQykKKwkJCQkJCQlhZnJlZSh0LT52YWwucywgdC0+YXJlYXApOworCQkJCQkJdC0+ZmxhZyAmPSB+KElTU0VUfEFMTE9DKTsKKwkJCQkJCXQtPnR5cGUgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChmcmVlX21lKQorCQkJCQlhZnJlZShmcmVlX21lLCB0LT5hcmVhcCk7CisJCQl9CisJCX0KKwkJaWYgKCFvaykKKwkJCWVycm9yZnooKTsKKwl9CisKKwlpZiAodmFsICE9IE5VTEwpIHsKKwkJaWYgKHZwLT5mbGFnJklOVEVHRVIpIHsKKwkJCS8qIGRvIG5vdCB6ZXJvIGJhc2UgYmVmb3JlIGFzc2lnbm1lbnQgKi8KKwkJCXNldHN0cih2cCwgdmFsLCBLU0hfVU5XSU5EX0VSUk9SIHwgMHg0KTsKKwkJCS8qIERvbmUgYWZ0ZXIgYXNzaWdubWVudCB0byBvdmVycmlkZSBkZWZhdWx0ICovCisJCQlpZiAoYmFzZSA+IDApCisJCQkJdnAtPnR5cGUgPSBiYXNlOworCQl9IGVsc2UKKwkJCS8qIHNldHN0ciBjYW4ndCBmYWlsIChyZWFkb25seSBjaGVjayBhbHJlYWR5IGRvbmUpICovCisJCQlzZXRzdHIodnAsIHZhbCwgS1NIX1JFVFVSTl9FUlJPUiB8IDB4NCk7CisJfQorCisJLyogb25seSB4WzBdIGlzIGV2ZXIgZXhwb3J0ZWQsIHNvIHVzZSB2cGJhc2UgKi8KKwlpZiAoKHZwYmFzZS0+ZmxhZyZFWFBPUlQpICYmICEodnBiYXNlLT5mbGFnJklOVEVHRVIpICYmCisJICAgIHZwYmFzZS0+dHlwZSA9PSAwKQorCQlleHBvcnRwcmVwKHZwYmFzZSwgKHZwYmFzZS0+ZmxhZyZJU1NFVCkgPyB2cGJhc2UtPnZhbC5zIDogbnVsbCk7CisKKwlyZXR1cm4gKHZwKTsKK30KKworLyoqCisgKiBVbnNldCBhIHZhcmlhYmxlLiBUaGUgZmxhZ3MgY2FuIGJlOgorICogfDEJPSB0ZWFyIGRvd24gZW50aXJlIGFycmF5CisgKiB8Mgk9IGtlZXAgYXR0cmlidXRlcywgb25seSB1bnNldCBjb250ZW50CisgKi8KK3ZvaWQKK3Vuc2V0KHN0cnVjdCB0YmwgKnZwLCBpbnQgZmxhZ3MpCit7CisJaWYgKHZwLT5mbGFnICYgQUxMT0MpCisJCWFmcmVlKHZwLT52YWwucywgdnAtPmFyZWFwKTsKKwlpZiAoKHZwLT5mbGFnICYgQVJSQVkpICYmIChmbGFncyAmIDEpKSB7CisJCXN0cnVjdCB0YmwgKmEsICp0bXA7CisKKwkJLyogRnJlZSB1cCBlbnRpcmUgYXJyYXkgKi8KKwkJZm9yIChhID0gdnAtPnUuYXJyYXk7IGE7ICkgeworCQkJdG1wID0gYTsKKwkJCWEgPSBhLT51LmFycmF5OworCQkJaWYgKHRtcC0+ZmxhZyAmIEFMTE9DKQorCQkJCWFmcmVlKHRtcC0+dmFsLnMsIHRtcC0+YXJlYXApOworCQkJYWZyZWUodG1wLCB0bXAtPmFyZWFwKTsKKwkJfQorCQl2cC0+dS5hcnJheSA9IE5VTEw7CisJfQorCWlmIChmbGFncyAmIDIpIHsKKwkJdnAtPmZsYWcgJj0gfihBTExPQ3xJU1NFVCk7CisJCXJldHVybjsKKwl9CisJLyogSWYgZm9vWzBdIGlzIGJlaW5nIHVuc2V0LCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcnJheSBpcyBrZXB0Li4uICovCisJdnAtPmZsYWcgJj0gU1BFQ0lBTCB8ICgoZmxhZ3MgJiAxKSA/IDAgOiBBUlJBWXxERUZJTkVEKTsKKwlpZiAodnAtPmZsYWcgJiBTUEVDSUFMKQorCQl1bnNldHNwZWModnApOwkvKiByZXNwb25zaWJsZSBmb3IgJ3Vuc3BlY2lhbCdpbmcgdmFyICovCit9CisKKy8qIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXIgcGFzdCBhIGxlZ2FsIHZhcmlhYmxlIG5hbWUgKHJldHVybnMgdGhlCisgKiBhcmd1bWVudCBpZiB0aGVyZSBpcyBubyBsZWdhbCBuYW1lLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGVybWluYXRpbmcKKyAqIE5VTCBpZiB3aG9sZSBzdHJpbmcgaXMgbGVnYWwpLgorICovCitjb25zdCBjaGFyICoKK3NraXBfdmFybmFtZShjb25zdCBjaGFyICpzLCBpbnQgYW9rKQoreworCWludCBhbGVuOworCisJaWYgKHMgJiYga3NoX2lzYWxwaHgoKnMpKSB7CisJCXdoaWxlICgqKytzICYmIGtzaF9pc2FsbnV4KCpzKSkKKwkJCTsKKwkJaWYgKGFvayAmJiAqcyA9PSAnWycgJiYgKGFsZW4gPSBhcnJheV9yZWZfbGVuKHMpKSkKKwkJCXMgKz0gYWxlbjsKKwl9CisJcmV0dXJuIChzKTsKK30KKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIHBhc3QgYW55IGxlZ2FsIHZhcmlhYmxlIG5hbWUgKi8KK2NvbnN0IGNoYXIgKgorc2tpcF93ZHZhcm5hbWUoY29uc3QgY2hhciAqcywKKyAgICBpbnQgYW9rKQkJCQkvKiBza2lwIGFycmF5IGRlLXJlZmVyZW5jZT8gKi8KK3sKKwlpZiAoc1swXSA9PSBDSEFSICYmIGtzaF9pc2FscGh4KHNbMV0pKSB7CisJCWRvIHsKKwkJCXMgKz0gMjsKKwkJfSB3aGlsZSAoc1swXSA9PSBDSEFSICYmIGtzaF9pc2FsbnV4KHNbMV0pKTsKKwkJaWYgKGFvayAmJiBzWzBdID09IENIQVIgJiYgc1sxXSA9PSAnWycpIHsKKwkJCS8qIHNraXAgcG9zc2libGUgYXJyYXkgZGUtcmVmZXJlbmNlICovCisJCQljb25zdCBjaGFyICpwID0gczsKKwkJCWNoYXIgYzsKKwkJCWludCBkZXB0aCA9IDA7CisKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKHBbMF0gIT0gQ0hBUikKKwkJCQkJYnJlYWs7CisJCQkJYyA9IHBbMV07CisJCQkJcCArPSAyOworCQkJCWlmIChjID09ICdbJykKKwkJCQkJZGVwdGgrKzsKKwkJCQllbHNlIGlmIChjID09ICddJyAmJiAtLWRlcHRoID09IDApIHsKKwkJCQkJcyA9IHA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKHMpOworfQorCisvKiBDaGVjayBpZiBjb2RlZCBzdHJpbmcgcyBpcyBhIHZhcmlhYmxlIG5hbWUgKi8KK2ludAoraXNfd2R2YXJuYW1lKGNvbnN0IGNoYXIgKnMsIGludCBhb2spCit7CisJY29uc3QgY2hhciAqcCA9IHNraXBfd2R2YXJuYW1lKHMsIGFvayk7CisKKwlyZXR1cm4gKHAgIT0gcyAmJiBwWzBdID09IEVPUyk7Cit9CisKKy8qIENoZWNrIGlmIGNvZGVkIHN0cmluZyBzIGlzIGEgdmFyaWFibGUgYXNzaWdubWVudCAqLworaW50Citpc193ZHZhcmFzc2lnbihjb25zdCBjaGFyICpzKQoreworCWNvbnN0IGNoYXIgKnAgPSBza2lwX3dkdmFybmFtZShzLCB0cnVlKTsKKworCXJldHVybiAocCAhPSBzICYmIHBbMF0gPT0gQ0hBUiAmJiBwWzFdID09ICc9Jyk7Cit9CisKKy8qCisgKiBNYWtlIHRoZSBleHBvcnRlZCBlbnZpcm9ubWVudCBmcm9tIHRoZSBleHBvcnRlZCBuYW1lcyBpbiB0aGUgZGljdGlvbmFyeS4KKyAqLworY2hhciAqKgorbWFrZW52KHZvaWQpCit7CisJc3RydWN0IGJsb2NrICpsOworCVhQdHJWIGRlbnY7CisJc3RydWN0IHRibCAqdnAsICoqdnBwOworCWludCBpOworCisJWFBpbml0KGRlbnYsIDY0KTsKKwlmb3IgKGwgPSBlLT5sb2M7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisJCWZvciAodnBwID0gbC0+dmFycy50YmxzLCBpID0gbC0+dmFycy5zaXplOyAtLWkgPj0gMDsgKQorCQkJaWYgKCh2cCA9ICp2cHArKykgIT0gTlVMTCAmJgorCQkJICAgICh2cC0+ZmxhZyYoSVNTRVR8RVhQT1JUKSkgPT0gKElTU0VUfEVYUE9SVCkpIHsKKwkJCQlzdHJ1Y3QgYmxvY2sgKmwyOworCQkJCXN0cnVjdCB0YmwgKnZwMjsKKwkJCQl1aW50MzJfdCBoID0gaGFzaCh2cC0+bmFtZSk7CisKKwkJCQkvKiB1bmV4cG9ydCBhbnkgcmVkZWZpbmVkIGluc3RhbmNlcyAqLworCQkJCWZvciAobDIgPSBsLT5uZXh0OyBsMiAhPSBOVUxMOyBsMiA9IGwyLT5uZXh0KSB7CisJCQkJCXZwMiA9IGt0c2VhcmNoKCZsMi0+dmFycywgdnAtPm5hbWUsIGgpOworCQkJCQlpZiAodnAyICE9IE5VTEwpCisJCQkJCQl2cDItPmZsYWcgJj0gfkVYUE9SVDsKKwkJCQl9CisJCQkJaWYgKCh2cC0+ZmxhZyZJTlRFR0VSKSkgeworCQkJCQkvKiBpbnRlZ2VyIHRvIHN0cmluZyAqLworCQkJCQljaGFyICp2YWw7CisJCQkJCXZhbCA9IHN0cl92YWwodnApOworCQkJCQl2cC0+ZmxhZyAmPSB+KElOVEVHRVJ8UkRPTkxZfFNQRUNJQUwpOworCQkJCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCBoZXJlICovCisJCQkJCXNldHN0cih2cCwgdmFsLCBLU0hfUkVUVVJOX0VSUk9SKTsKKwkJCQl9CisJCQkJWFBwdXQoZGVudiwgdnAtPnZhbC5zKTsKKwkJCX0KKwlYUHB1dChkZW52LCBOVUxMKTsKKwlyZXR1cm4gKChjaGFyICoqKVhQY2xvc2UoZGVudikpOworfQorCisvKiBCb2IgSmVua2lucycgb25lLWF0LWEtdGltZSBoYXNoICovCitzdGF0aWMgdWludDMyX3QKK29hYXRoYXNoX3VwZGF0ZShyZWdpc3RlciB1aW50MzJfdCBoLCByZWdpc3RlciBjb25zdCB1aW50OF90ICpjcCwKKyAgICByZWdpc3RlciBzaXplX3QgbikKK3sKKwl3aGlsZSAobi0tKSB7CisJCWggKz0gKmNwKys7CisJCWggKz0gaCA8PCAxMDsKKwkJaCBePSBoID4+IDY7CisJfQorCisJcmV0dXJuIChoKTsKK30KKworc3RhdGljIHVpbnQzMl90CitvYWF0aGFzaF9maW5hbGlzZShyZWdpc3RlciB1aW50MzJfdCBoKQoreworCWggKz0gaCA8PCAzOworCWggXj0gaCA+PiAxMTsKKwloICs9IGggPDwgMTU7CisKKwlyZXR1cm4gKGgpOworfQorCit1aW50MzJfdAorb2FhdGhhc2hfZnVsbChyZWdpc3RlciBjb25zdCB1aW50OF90ICpicCkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCBoID0gMDsKKwlyZWdpc3RlciB1aW50OF90IGM7CisKKwl3aGlsZSAoKGMgPSAqYnArKykpIHsKKwkJaCArPSBjOworCQloICs9IGggPDwgMTA7CisJCWggXj0gaCA+PiA2OworCX0KKworCXJldHVybiAob2FhdGhhc2hfZmluYWxpc2UoaCkpOworfQorCit2b2lkCitjaGFuZ2VfcmFuZG9tKGNvbnN0IHZvaWQgKnZwLCBzaXplX3QgbikKK3sKKwlyZWdpc3RlciB1aW50MzJfdCBoID0gMHgxMDA7CisjaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKwlpbnQgbWliWzJdOworCXVpbnQ4X3Qga1szXTsKKwlzaXplX3Qga2xlbjsKKyNlbmRpZgorCisJa3Noc3RhdGVfdi5jcl9kcCA9IHZwOworCWtzaHN0YXRlX3YuY3JfZHN6ID0gbjsKKwlnZXR0aW1lb2ZkYXkoJmtzaHN0YXRlX3YuY3JfdHYsIE5VTEwpOworCWggPSBvYWF0aGFzaF91cGRhdGUob2FhdGhhc2hfdXBkYXRlKGgsICh2b2lkICopJmtzaHN0YXRlX3YsCisJICAgIHNpemVvZihrc2hzdGF0ZV92KSksIHZwLCBuKTsKKwlrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPSBvYWF0aGFzaF9maW5hbGlzZShoKTsKKworI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCisJLyogT3BlbkJTRCwgTWlyQlNEOiBwcm9wZXIga2VybmVsIGVudHJvcHkgY29tZXMgYXQgemVybyBjb3N0ICovCisKKwltaWJbMF0gPSBDVExfS0VSTjsKKwltaWJbMV0gPSBLRVJOX0FSTkQ7CisJa2xlbiA9IHNpemVvZihrKTsKKwlzeXNjdGwobWliLCAyLCBrLCAma2xlbiwgJmtzaHN0YXRlX3YubGNnX3N0YXRlXywKKwkgICAgc2l6ZW9mKGtzaHN0YXRlX3YubGNnX3N0YXRlXykpOworCS8qIHdlIGlnbm9yZSBmYWlsdXJlcyBhbmQgdGFrZSBpbiBrIGFueXdheSAqLworCWggPSBvYWF0aGFzaF91cGRhdGUoaCwgaywgc2l6ZW9mKGspKTsKKwlrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPSBvYWF0aGFzaF9maW5hbGlzZShoKTsKKyNlbGlmIGRlZmluZWQoTUtTSF9BNFBCKQorCS8qIGZvcmNlZCBieSB0aGUgdXNlciB0byB1c2UgYXJjNHJhbmRvbV9wdXNoYigzKSDigKIgQ3lnd2luPyAqLworCXsKKwkJdWludDMyX3QgcHJ2OworCisJCXBydiA9IGFyYzRyYW5kb21fcHVzaGIoJmtzaHN0YXRlX3YubGNnX3N0YXRlXywKKwkJICAgIHNpemVvZihrc2hzdGF0ZV92LmxjZ19zdGF0ZV8pKTsKKwkJaCA9IG9hYXRoYXNoX3VwZGF0ZShoLCAmcHJ2LCBzaXplb2YocHJ2KSk7CisJfQorCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IG9hYXRoYXNoX2ZpbmFsaXNlKGgpOworI2VuZGlmCit9CisKKy8qCisgKiBoYW5kbGUgc3BlY2lhbCB2YXJpYWJsZXMgd2l0aCBzaWRlIGVmZmVjdHMgLSBQQVRILCBTRUNPTkRTLgorICovCisKKy8qIFRlc3QgaWYgbmFtZSBpcyBhIHNwZWNpYWwgcGFyYW1ldGVyICovCitzdGF0aWMgaW50CitzcGVjaWFsKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRibCAqdHA7CisKKwl0cCA9IGt0c2VhcmNoKCZzcGVjaWFscywgbmFtZSwgaGFzaChuYW1lKSk7CisJcmV0dXJuICh0cCAmJiAodHAtPmZsYWcgJiBJU1NFVCkgPyB0cC0+dHlwZSA6IFZfTk9ORSk7Cit9CisKKy8qIE1ha2UgYSB2YXJpYWJsZSBub24tc3BlY2lhbCAqLworc3RhdGljIHZvaWQKK3Vuc3BlY2lhbChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0YmwgKnRwOworCisJdHAgPSBrdHNlYXJjaCgmc3BlY2lhbHMsIG5hbWUsIGhhc2gobmFtZSkpOworCWlmICh0cCkKKwkJa3RkZWxldGUodHApOworfQorCitzdGF0aWMgdGltZV90IHNlY29uZHM7CQkvKiB0aW1lIFNFQ09ORFMgbGFzdCBzZXQgKi8KK3N0YXRpYyBpbnQgdXNlcl9saW5lbm87CQkvKiB3aGF0IHVzZXIgc2V0ICRMSU5FTk8gdG8gKi8KKworc3RhdGljIHZvaWQKK2dldHNwZWMoc3RydWN0IHRibCAqdnApCit7CisJcmVnaXN0ZXIgbWtzaF9hcmlfdCBpOworCWludCBzdDsKKworCXN3aXRjaCAoKHN0ID0gc3BlY2lhbCh2cC0+bmFtZSkpKSB7CisJY2FzZSBWX1NFQ09ORFM6CisJCS8qCisJCSAqIE9uIHN0YXJ0IHVwIHRoZSB2YWx1ZSBvZiBTRUNPTkRTIGlzIHVzZWQgYmVmb3JlCisJCSAqIGl0IGhhcyBiZWVuIHNldCAtIGRvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgY2FzZQorCQkgKiAoc2VlIGluaXRjb21zW10gaW4gbWFpbi5jKS4KKwkJICovCisJCWlmICh2cC0+ZmxhZyAmIElTU0VUKSB7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCQlpID0gdHYudHZfc2VjIC0gc2Vjb25kczsKKwkJfSBlbHNlCisJCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgVl9SQU5ET006CisJCS8qCisJCSAqIHRoaXMgaXMgdGhlIHNhbWUgTGluZWFyIENvbmdydWVudGlhbCBQUk5HIGFzIEJvcmxhbmQKKwkJICogQy9DKysgYWxsZWdlZGx5IHVzZXMgaW4gaXRzIGJ1aWx0LWluIHJhbmQoKSBmdW5jdGlvbgorCQkgKi8KKwkJaSA9ICgoa3Noc3RhdGVfdi5sY2dfc3RhdGVfID0KKwkJICAgIDIyNjk1NDc3ICoga3Noc3RhdGVfdi5sY2dfc3RhdGVfICsgMSkgPj4gMTYpICYgMHg3RkZGOworCQlicmVhazsKKwljYXNlIFZfSElTVFNJWkU6CisJCWkgPSBoaXN0c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBWX09QVElORDoKKwkJaSA9IHVzZXJfb3B0LnVvcHRpbmQ7CisJCWJyZWFrOworCWNhc2UgVl9MSU5FTk86CisJCWkgPSBjdXJyZW50X2xpbmVubyArIHVzZXJfbGluZW5vOworCQlicmVhazsKKwljYXNlIFZfQ09MVU1OUzoKKwljYXNlIFZfTElORVM6CisJCS8qCisJCSAqIERvIE5PVCBleHBvcnQgQ09MVU1OUy9MSU5FUy4gTWFueSBhcHBsaWNhdGlvbnMKKwkJICogY2hlY2sgQ09MVU1OUy9MSU5FUyBiZWZvcmUgY2hlY2tpbmcgd3Mud3NfY29sL3JvdywKKwkJICogc28gaWYgdGhlIGFwcCBpcyBzdGFydGVkIHdpdGggQy9MIGluIHRoZSBlbnZpcm9uCisJCSAqIGFuZCB0aGUgd2luZG93IGlzIHRoZW4gcmVzaXplZCwgdGhlIGFwcCB3b24ndAorCQkgKiBzZWUgdGhlIGNoYW5nZSBjYXVzZSB0aGUgZW52aXJvbiBkb2Vzbid0IGNoYW5nZS4KKwkJICovCisJCWNoYW5nZV93aW5zeigpOworCQlpID0gc3QgPT0gVl9DT0xVTU5TID8geF9jb2xzIDogeF9saW5zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBkbyBub3RoaW5nLCBkbyBub3QgdG91Y2ggdnAgYXQgYWxsICovCisJCXJldHVybjsKKwl9CisJdnAtPmZsYWcgJj0gflNQRUNJQUw7CisJc2V0aW50KHZwLCBpKTsKKwl2cC0+ZmxhZyB8PSBTUEVDSUFMOworfQorCitzdGF0aWMgdm9pZAorc2V0c3BlYyhzdHJ1Y3QgdGJsICp2cCkKK3sKKwlta3NoX2FyaV90IGk7CisJY2hhciAqczsKKwlpbnQgc3Q7CisKKwlzd2l0Y2ggKChzdCA9IHNwZWNpYWwodnAtPm5hbWUpKSkgeworCWNhc2UgVl9QQVRIOgorCQlpZiAocGF0aCkKKwkJCWFmcmVlKHBhdGgsIEFQRVJNKTsKKwkJcyA9IHN0cl92YWwodnApOworCQlzdHJkdXB4KHBhdGgsIHMsIEFQRVJNKTsKKwkJZmx1c2hjb20oMSk7CS8qIGNsZWFyIHRyYWNrZWQgYWxpYXNlcyAqLworCQlyZXR1cm47CisJY2FzZSBWX0lGUzoKKwkJc2V0Y3R5cGVzKHMgPSBzdHJfdmFsKHZwKSwgQ19JRlMpOworCQlpZnMwID0gKnM7CisJCXJldHVybjsKKwljYXNlIFZfVE1QRElSOgorCQlpZiAodG1wZGlyKSB7CisJCQlhZnJlZSh0bXBkaXIsIEFQRVJNKTsKKwkJCXRtcGRpciA9IE5VTEw7CisJCX0KKwkJLyogVXNlIHRtcGRpciBpZmYgaXQgaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXMgd3JpdGFibGUgYW5kCisJCSAqIHNlYXJjaGFibGUgYW5kIGlzIGEgZGlyZWN0b3J5Li4uCisJCSAqLworCQl7CisJCQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCQkJcyA9IHN0cl92YWwodnApOworCQkJaWYgKHNbMF0gPT0gJy8nICYmIGFjY2VzcyhzLCBXX09LfFhfT0spID09IDAgJiYKKwkJCSAgICBzdGF0KHMsICZzdGF0YikgPT0gMCAmJiBTX0lTRElSKHN0YXRiLnN0X21vZGUpKQorCQkJCXN0cmR1cHgodG1wZGlyLCBzLCBBUEVSTSk7CisJCX0KKwkJYnJlYWs7CisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKwljYXNlIFZfSElTVEZJTEU6CisJCXNldGhpc3RmaWxlKHN0cl92YWwodnApKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFZfVE1PVVQ6CisJCS8qIEFUJlQga3NoIHNlZW1zIHRvIGRvIHRoaXMgKG9ubHkgbGlzdGVuIGlmIGludGVnZXIpICovCisJCWlmICh2cC0+ZmxhZyAmIElOVEVHRVIpCisJCQlrc2hfdG1vdXQgPSB2cC0+dmFsLmkgPj0gMCA/IHZwLT52YWwuaSA6IDA7CisJCWJyZWFrOworCisJLyogY29tbW9uIHN1Yi1jYXNlcyAqLworCWNhc2UgVl9PUFRJTkQ6CisJY2FzZSBWX0hJU1RTSVpFOgorCWNhc2UgVl9DT0xVTU5TOgorCWNhc2UgVl9MSU5FUzoKKwljYXNlIFZfUkFORE9NOgorCWNhc2UgVl9TRUNPTkRTOgorCWNhc2UgVl9MSU5FTk86CisJCXZwLT5mbGFnICY9IH5TUEVDSUFMOworCQlpID0gaW50dmFsKHZwKTsKKwkJdnAtPmZsYWcgfD0gU1BFQ0lBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZywgZG8gbm90IHRvdWNoIHZwIGF0IGFsbCAqLworCQlyZXR1cm47CisJfQorCisJLyogcHJvY2VzcyB0aGUgc2luZ3VsYXIgcGFydHMgb2YgdGhlIGNvbW1vbiBjYXNlcyAqLworCisJc3dpdGNoIChzdCkgeworCWNhc2UgVl9PUFRJTkQ6CisJCWdldG9wdHNfcmVzZXQoKGludClpKTsKKwkJYnJlYWs7CisJY2FzZSBWX0hJU1RTSVpFOgorCQlzZXRoaXN0c2l6ZSgoaW50KWkpOworCQlicmVhazsKKwljYXNlIFZfQ09MVU1OUzoKKwkJaWYgKGkgPj0gTUlOX0NPTFMpCisJCQl4X2NvbHMgPSBpOworCQlicmVhazsKKwljYXNlIFZfTElORVM6CisJCWlmIChpID49IE1JTl9MSU5TKQorCQkJeF9saW5zID0gaTsKKwkJYnJlYWs7CisJY2FzZSBWX1JBTkRPTToKKwkJLyoKKwkJICogbWtzaCBSMzlkKyBubyBsb25nZXIgaGFzIHRoZSB0cmFkaXRpb25hbCByZXBlYXRhYmlsaXR5CisJCSAqIG9mICRSQU5ET00gc2VxdWVuY2VzLCBidXQgYWx3YXlzIHJldGFpbnMgc3RhdGUKKwkJICovCisJCWNoYW5nZV9yYW5kb20oJmksIHNpemVvZihpKSk7CisJCWJyZWFrOworCWNhc2UgVl9TRUNPTkRTOgorCQl7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCQlzZWNvbmRzID0gdHYudHZfc2VjIC0gaTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZfTElORU5POgorCQkvKiBUaGUgLTEgaXMgYmVjYXVzZSBsaW5lIG51bWJlcmluZyBzdGFydHMgYXQgMS4gKi8KKwkJdXNlcl9saW5lbm8gPSAodW5zaWduZWQgaW50KWkgLSBjdXJyZW50X2xpbmVubyAtIDE7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK3Vuc2V0c3BlYyhzdHJ1Y3QgdGJsICp2cCkKK3sKKwlzd2l0Y2ggKHNwZWNpYWwodnAtPm5hbWUpKSB7CisJY2FzZSBWX1BBVEg6CisJCWlmIChwYXRoKQorCQkJYWZyZWUocGF0aCwgQVBFUk0pOworCQlzdHJkdXB4KHBhdGgsIGRlZl9wYXRoLCBBUEVSTSk7CisJCWZsdXNoY29tKDEpOwkvKiBjbGVhciB0cmFja2VkIGFsaWFzZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBWX0lGUzoKKwkJc2V0Y3R5cGVzKCIgXHRcbiIsIENfSUZTKTsKKwkJaWZzMCA9ICcgJzsKKwkJYnJlYWs7CisJY2FzZSBWX1RNUERJUjoKKwkJLyogc2hvdWxkIG5vdCBiZWNvbWUgdW5zcGVjaWFsICovCisJCWlmICh0bXBkaXIpIHsKKwkJCWFmcmVlKHRtcGRpciwgQVBFUk0pOworCQkJdG1wZGlyID0gTlVMTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFZfTElORU5POgorCWNhc2UgVl9SQU5ET006CisJY2FzZSBWX1NFQ09ORFM6CisJY2FzZSBWX1RNT1VUOgkJLyogQVQmVCBrc2ggbGVhdmVzIHByZXZpb3VzIHZhbHVlIGluIHBsYWNlICovCisJCXVuc3BlY2lhbCh2cC0+bmFtZSk7CisJCWJyZWFrOworCisJLyoKKwkgKiBBVCZUIGtzaCBtYW4gcGFnZSBzYXlzIE9QVElORCwgT1BUQVJHIGFuZCBfIGxvc2Ugc3BlY2lhbAorCSAqIG1lYW5pbmcsIGJ1dCBPUFRBUkcgZG9lcyBub3QgKHN0aWxsIHNldCBieSBnZXRvcHRzKSBhbmQgXyBpcworCSAqIGFsc28gc3RpbGwgc2V0IGluIHZhcmlvdXMgcGxhY2VzLiBEb24ndCBrbm93IHdoYXQgQVQmVCBkb2VzCisJICogZm9yIEhJU1RTSVpFLCBISVNURklMRS4gVW5zZXR0aW5nIHRoZXNlIGluIEFUJlQga3NoIGRvZXMgbm90CisJICogbG9vc2UgdGhlICdzcGVjaWFsbmVzcyc6IElGUywgQ09MVU1OUywgUEFUSCwgVE1QRElSCisJICovCisJfQorfQorCisvKgorICogU2VhcmNoIGZvciAoYW5kIHBvc3NpYmx5IGNyZWF0ZSkgYSB0YWJsZSBlbnRyeSBzdGFydGluZyB3aXRoCisgKiB2cCwgaW5kZXhlZCBieSB2YWwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGJsICoKK2FycmF5c2VhcmNoKHN0cnVjdCB0YmwgKnZwLCB1aW50MzJfdCB2YWwpCit7CisJc3RydWN0IHRibCAqcHJldiwgKmN1cnIsICpuZXdzOworCXNpemVfdCBsZW47CisKKwl2cC0+ZmxhZyA9ICh2cC0+ZmxhZyB8IChBUlJBWXxERUZJTkVEKSkgJiB+QVNTT0M7CisJLyogVGhlIHRhYmxlIGVudHJ5IGlzIGFsd2F5cyBbMF0gKi8KKwlpZiAodmFsID09IDApCisJCXJldHVybiAodnApOworCXByZXYgPSB2cDsKKwljdXJyID0gdnAtPnUuYXJyYXk7CisJd2hpbGUgKGN1cnIgJiYgY3Vyci0+dWEuaW5kZXggPCB2YWwpIHsKKwkJcHJldiA9IGN1cnI7CisJCWN1cnIgPSBjdXJyLT51LmFycmF5OworCX0KKwlpZiAoY3VyciAmJiBjdXJyLT51YS5pbmRleCA9PSB2YWwpIHsKKwkJaWYgKGN1cnItPmZsYWcmSVNTRVQpCisJCQlyZXR1cm4gKGN1cnIpOworCQluZXdzID0gY3VycjsKKwl9IGVsc2UKKwkJbmV3cyA9IE5VTEw7CisJbGVuID0gc3RybGVuKHZwLT5uYW1lKSArIDE7CisJaWYgKCFuZXdzKSB7CisJCW5ld3MgPSBhbGxvYyhvZmZzZXRvZihzdHJ1Y3QgdGJsLCBuYW1lWzBdKSArIGxlbiwgdnAtPmFyZWFwKTsKKwkJbWVtY3B5KG5ld3MtPm5hbWUsIHZwLT5uYW1lLCBsZW4pOworCX0KKwluZXdzLT5mbGFnID0gKHZwLT5mbGFnICYgfihBTExPQ3xERUZJTkVEfElTU0VUfFNQRUNJQUwpKSB8IEFJTkRFWDsKKwluZXdzLT50eXBlID0gdnAtPnR5cGU7CisJbmV3cy0+YXJlYXAgPSB2cC0+YXJlYXA7CisJbmV3cy0+dTIuZmllbGQgPSB2cC0+dTIuZmllbGQ7CisJbmV3cy0+dWEuaW5kZXggPSB2YWw7CisKKwlpZiAoY3VyciAhPSBuZXdzKSB7CQkvKiBub3QgcmV1c2luZyBvbGQgYXJyYXkgZW50cnkgKi8KKwkJcHJldi0+dS5hcnJheSA9IG5ld3M7CisJCW5ld3MtPnUuYXJyYXkgPSBjdXJyOworCX0KKwlyZXR1cm4gKG5ld3MpOworfQorCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBhbiBhcnJheSByZWZlcmVuY2UgKGVnLCBbMSsyXSkgLSBjcCBpcyBhc3N1bWVkCisgKiB0byBwb2ludCB0byB0aGUgb3BlbiBicmFja2V0LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgY2xvc2luZworICogYnJhY2tldC4KKyAqLworaW50CithcnJheV9yZWZfbGVuKGNvbnN0IGNoYXIgKmNwKQoreworCWNvbnN0IGNoYXIgKnMgPSBjcDsKKwlpbnQgYzsKKwlpbnQgZGVwdGggPSAwOworCisJd2hpbGUgKChjID0gKnMrKykgJiYgKGMgIT0gJ10nIHx8IC0tZGVwdGgpKQorCQlpZiAoYyA9PSAnWycpCisJCQlkZXB0aCsrOworCWlmICghYykKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKHMgLSBjcCk7Cit9CisKKy8qCisgKiBNYWtlIGEgY29weSBvZiB0aGUgYmFzZSBvZiBhbiBhcnJheSBuYW1lCisgKi8KK2NoYXIgKgorYXJyYXluYW1lKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpwOworCWNoYXIgKnJ2OworCisJaWYgKChwID0gY3N0cmNocihzdHIsICdbJykpID09IDApCisJCS8qIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCB3aHkgd29ycnk/ICovCisJCXN0cmR1cHgocnYsIHN0ciwgQVRFTVApOworCWVsc2UKKwkJc3RybmR1cHgocnYsIHN0ciwgcCAtIHN0ciwgQVRFTVApOworCisJcmV0dXJuIChydik7Cit9CisKKy8qIHNldCAob3Igb3ZlcndyaXRlLCBpZiByZXNldCkgdGhlIGFycmF5IHZhcmlhYmxlIHZhciB0byB0aGUgdmFsdWVzIGluIHZhbHMgKi8KK21rc2hfdWFyaV90CitzZXRfYXJyYXkoY29uc3QgY2hhciAqdmFyLCBib29sIHJlc2V0LCBjb25zdCBjaGFyICoqdmFscykKK3sKKwlzdHJ1Y3QgdGJsICp2cCwgKnZxOworCW1rc2hfdWFyaV90IGk7CisJY29uc3QgY2hhciAqY2NwOworI2lmbmRlZiBNS1NIX1NNQUxMCisJY2hhciAqY3A7CisJbWtzaF91YXJpX3QgajsKKyNlbmRpZgorCisJLyogdG8gZ2V0IGxvY2FsIGFycmF5LCB1c2UgInR5cGVzZXQgZm9vOyBzZXQgLUEgZm9vIiAqLworCXZwID0gZ2xvYmFsKHZhcik7CisKKwkvKiBOb3RlOiBBVCZUIGtzaCBhbGxvd3Mgc2V0IC1BIGJ1dCBub3Qgc2V0ICtBIG9mIGEgcmVhZC1vbmx5IHZhciAqLworCWlmICgodnAtPmZsYWcmUkRPTkxZKSkKKwkJZXJyb3JmKCIlczogaXMgcmVhZCBvbmx5IiwgdmFyKTsKKwkvKiBUaGlzIGNvZGUgaXMgcXVpdGUgbm9uLW9wdGltYWwgKi8KKwlpZiAocmVzZXQpCisJCS8qIHRyYXNoIGV4aXN0aW5nIHZhbHVlcyBhbmQgYXR0cmlidXRlcyAqLworCQl1bnNldCh2cCwgMSk7CisJLyogdG9kbzogd291bGQgYmUgbmljZSBmb3IgYXNzaWdubWVudCB0byBjb21wbGV0ZWx5IHN1Y2NlZWQgb3IKKwkgKiBjb21wbGV0ZWx5IGZhaWwuIE9ubHkgcmVhbGx5IGVmZmVjdHMgaW50ZWdlciBhcnJheXM6CisJICogZXZhbHVhdGlvbiBvZiBzb21lIG9mIHZhbHNbXSBtYXkgZmFpbC4uLgorCSAqLworCWkgPSAwOworI2lmbmRlZiBNS1NIX1NNQUxMCisJaiA9IDA7CisjZWxzZQorI2RlZmluZSBqIGkKKyNlbmRpZgorCXdoaWxlICgoY2NwID0gdmFsc1tpXSkpIHsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQlpZiAoKmNjcCA9PSAnWycpIHsKKwkJCWludCBsZXZlbCA9IDA7CisKKwkJCXdoaWxlICgqY2NwKSB7CisJCQkJaWYgKCpjY3AgPT0gJ10nICYmIC0tbGV2ZWwgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCpjY3AgPT0gJ1snKQorCQkJCQkrK2xldmVsOworCQkJCSsrY2NwOworCQkJfQorCQkJaWYgKCpjY3AgPT0gJ10nICYmIGxldmVsID09IDAgJiYgY2NwWzFdID09ICc9JykgeworCQkJCXN0cm5kdXB4KGNwLCB2YWxzW2ldICsgMSwgY2NwIC0gKHZhbHNbaV0gKyAxKSwKKwkJCQkgICAgQVRFTVApOworCQkJCWV2YWx1YXRlKHN1YnN0aXR1dGUoY3AsIDApLCAobWtzaF9hcmlfdCAqKSZqLAorCQkJCSAgICBLU0hfVU5XSU5EX0VSUk9SLCB0cnVlKTsKKwkJCQlhZnJlZShjcCwgQVRFTVApOworCQkJCWNjcCArPSAyOworCQkJfSBlbHNlCisJCQkJY2NwID0gdmFsc1tpXTsKKwkJfQorI2VuZGlmCisKKwkJdnEgPSBhcnJheXNlYXJjaCh2cCwgaik7CisJCS8qIHdvdWxkIGJlIG5pY2UgdG8gZGVhbCB3aXRoIGVycm9ycyBoZXJlLi4uIChzZWUgYWJvdmUpICovCisJCXNldHN0cih2cSwgY2NwLCBLU0hfUkVUVVJOX0VSUk9SKTsKKwkJaSsrOworI2lmbmRlZiBNS1NIX1NNQUxMCisJCWorKzsKKyNlbmRpZgorCX0KKworCXJldHVybiAoaSk7Cit9CisKK3ZvaWQKK2NoYW5nZV93aW5zeih2b2lkKQoreworCWlmICh4X2xpbnMgPCAwKSB7CisJCS8qIGZpcnN0IHRpbWUgaW5pdGlhbGlzYXRpb24gKi8KKyNpZmRlZiBUSU9DR1dJTlNaCisJCWlmICh0dHlfZmQgPCAwKQorCQkJLyogbm9uLUZUQUxLSU5HLCB0cnkgdG8gZ2V0IGFuIGZkIGFueXdheSAqLworCQkJdHR5X2luaXQoZmFsc2UsIGZhbHNlKTsKKyNlbmRpZgorCQl4X2NvbHMgPSAtMTsKKwl9CisKKyNpZmRlZiBUSU9DR1dJTlNaCisJLyogY2hlY2sgaWYgd2luZG93IHNpemUgaGFzIGNoYW5nZWQgKi8KKwlpZiAodHR5X2ZkID49IDApIHsKKwkJc3RydWN0IHdpbnNpemUgd3M7CisKKwkJaWYgKGlvY3RsKHR0eV9mZCwgVElPQ0dXSU5TWiwgJndzKSA+PSAwKSB7CisJCQlpZiAod3Mud3NfY29sKQorCQkJCXhfY29scyA9IHdzLndzX2NvbDsKKwkJCWlmICh3cy53c19yb3cpCisJCQkJeF9saW5zID0gd3Mud3Nfcm93OworCQl9CisJfQorI2VuZGlmCisKKwkvKiBib3VuZHMgY2hlY2sgZm9yIHNhbmUgdmFsdWVzLCB1c2UgZGVmYXVsdHMgb3RoZXJ3aXNlICovCisJaWYgKHhfY29scyA8IE1JTl9DT0xTKQorCQl4X2NvbHMgPSA4MDsKKwlpZiAoeF9saW5zIDwgTUlOX0xJTlMpCisJCXhfbGlucyA9IDI0OworCisjaWZkZWYgU0lHV0lOQ0gKKwlnb3Rfd2luY2ggPSAwOworI2VuZGlmCit9CisKK3VpbnQzMl90CitldmlsaGFzaChjb25zdCBjaGFyICpzKQoreworCXJlZ2lzdGVyIHVpbnQzMl90IGggPSAweDEwMDsKKworCWggPSBvYWF0aGFzaF91cGRhdGUoaCwgKHZvaWQgKikma3Noc3RhdGVfZiwgc2l6ZW9mKGtzaHN0YXRlX2YpKTsKKwlrc2hzdGF0ZV9mLmggPSBvYWF0aGFzaF9mdWxsKChjb25zdCB1aW50OF90ICopcyk7CisJcmV0dXJuIChvYWF0aGFzaF9maW5hbGlzZShvYWF0aGFzaF91cGRhdGUoaCwKKwkgICAgKHZvaWQgKikma3Noc3RhdGVfZi5oLCBzaXplb2Yoa3Noc3RhdGVfZi5oKSkpKTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3Zhcl9zcGVjLmggYi9ta3NoL3NyYy92YXJfc3BlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzVjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy92YXJfc3BlYy5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZiBkZWZpbmVkKFZBUlNQRUNfREVGTlMpCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC92YXJfc3BlYy5oLHYgMS4xIDIwMDkvMDkvMjYgMDM6NDA6MDMgdGcgRXhwICQiKTsKKyNkZWZpbmUgRk4obmFtZSkJCQkvKiBub3RoaW5nICovCisjZWxpZiBkZWZpbmVkKFZBUlNQRUNfRU5VTVMpCisjZGVmaW5lIEZOKG5hbWUpCQkJVl8jI25hbWUsCisjZGVmaW5lIEYwKG5hbWUpCQkJVl8jI25hbWUgPSAwLAorI2VsaWYgZGVmaW5lZChWQVJTUEVDX0lURU1TKQorI2RlZmluZSBGMChuYW1lKQkJCS8qIG5vdGhpbmcgKi8KKyNkZWZpbmUgRk4obmFtZSkJCQkjbmFtZSwKKyNlbmRpZgorCisjaWZuZGVmIEYwCisjZGVmaW5lIEYwIEZOCisjZW5kaWYKKworLyogMCBpcyBhbHdheXMgVl9OT05FICovCitGMChOT05FKQorCisvKiAxIGFuZCB1cCBhcmUgc3BlY2lhbCB2YXJpYWJsZXMgKi8KK0ZOKENPTFVNTlMpCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKK0ZOKEhJU1RGSUxFKQorI2VuZGlmCitGTihISVNUU0laRSkKK0ZOKElGUykKK0ZOKExJTkVOTykKK0ZOKExJTkVTKQorRk4oT1BUSU5EKQorRk4oUEFUSCkKK0ZOKFJBTkRPTSkKK0ZOKFNFQ09ORFMpCitGTihUTU9VVCkKK0ZOKFRNUERJUikKKworI3VuZGVmIEZOCisjdW5kZWYgRjAKKyN1bmRlZiBWQVJTUEVDX0RFRk5TCisjdW5kZWYgVkFSU1BFQ19FTlVNUworI3VuZGVmIFZBUlNQRUNfSVRFTVMKZGlmZiAtLWdpdCBhL25ldGNmZy9uZXRjZmcuYyBiL25ldGNmZy9uZXRjZmcuYwppbmRleCBmYzljZjQ4Li5jNTIwMDc1IDEwMDY0NAotLS0gYS9uZXRjZmcvbmV0Y2ZnLmMKKysrIGIvbmV0Y2ZnL25ldGNmZy5jCkBAIC0xOSwxNyArMTksMTQgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisKKyNpbmNsdWRlIDxuZXR1dGlscy9pZmMuaD4KKyNpbmNsdWRlIDxuZXR1dGlscy9kaGNwLmg+CiAKIHN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CiAKLWludCBpZmNfaW5pdCgpOwotdm9pZCBpZmNfY2xvc2UoKTsKLWludCBpZmNfdXAoY2hhciAqaW5hbWUpOwotaW50IGlmY19kb3duKGNoYXIgKmluYW1lKTsKLWludCBpZmNfcmVtb3ZlX2hvc3Rfcm91dGVzKGNoYXIgKmluYW1lKTsKLWludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY2hhciAqaW5hbWUpOwotaW50IGlmY19nZXRfaW5mbyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCAqYWRkciwgdW5zaWduZWQgKm1hc2ssIHVuc2lnbmVkICpmbGFncyk7Ci1pbnQgZG9fZGhjcChjaGFyICppbmFtZSk7CiAKIHZvaWQgZGllKGNvbnN0IGNoYXIgKnJlYXNvbikKIHsKQEAgLTM3LDM2ICszNCw0MSBAQAogICAgIGV4aXQoMSk7CiB9CiAKLWNvbnN0IGNoYXIgKmlwYWRkcih1bnNpZ25lZCBhZGRyKQorY29uc3QgY2hhciAqaXBhZGRyKGluX2FkZHJfdCBhZGRyKQogewotICAgIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0gICAgCi0gICAgc3ByaW50ZihidWYsIiVkLiVkLiVkLiVkIiwgCi0gICAgICAgICAgICBhZGRyICYgMjU1LAotICAgICAgICAgICAgKChhZGRyID4+IDgpICYgMjU1KSwKLSAgICAgICAgICAgICgoYWRkciA+PiAxNikgJiAyNTUpLCAKLSAgICAgICAgICAgIChhZGRyID4+IDI0KSk7Ci0gICAgcmV0dXJuIGJ1ZjsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbl9hZGRyOworCisgICAgaW5fYWRkci5zX2FkZHIgPSBhZGRyOworICAgIHJldHVybiBpbmV0X250b2EoaW5fYWRkcik7CiB9CiAKIHZvaWQgdXNhZ2Uodm9pZCkKIHsKICAgICBmcHJpbnRmKHN0ZGVyciwidXNhZ2U6IG5ldGNmZyBbPGludGVyZmFjZT4ge2RoY3B8dXB8ZG93bn1dXG4iKTsKLSAgICBleGl0KDEpOyAgICAKKyAgICBleGl0KDEpOwogfQogCiBpbnQgZHVtcF9pbnRlcmZhY2UoY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICB1bnNpZ25lZCBhZGRyLCBtYXNrLCBmbGFnczsKLSAgICAKLSAgICBpZihpZmNfZ2V0X2luZm8obmFtZSwgJmFkZHIsICZtYXNrLCAmZmxhZ3MpKSB7CisgICAgdW5zaWduZWQgYWRkciwgcHJlZml4TGVuZ3RoLCBmbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIGh3YnVmW0VUSF9BTEVOXTsKKworICAgIGlmKGlmY19nZXRfaW5mbyhuYW1lLCAmYWRkciwgJnByZWZpeExlbmd0aCwgJmZsYWdzKSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBwcmludGYoIiUtOHMgJXMgICIsIG5hbWUsIGZsYWdzICYgMSA/ICJVUCAgIiA6ICJET1dOIik7Ci0gICAgcHJpbnRmKCIlLTE2cyIsIGlwYWRkcihhZGRyKSk7Ci0gICAgcHJpbnRmKCIlLTE2cyIsIGlwYWRkcihtYXNrKSk7Ci0gICAgcHJpbnRmKCIweCUwOHhcbiIsIGZsYWdzKTsKKyAgICBwcmludGYoIiU0MHMiLCBpcGFkZHIoYWRkcikpOworICAgIHByaW50ZigiLyUtNGQiLCBwcmVmaXhMZW5ndGgpOworICAgIHByaW50ZigiMHglMDh4ICIsIGZsYWdzKTsKKyAgICBpZiAoIWlmY19nZXRfaHdhZGRyKG5hbWUsIGh3YnVmKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDsgaSA8IChFVEhfQUxFTi0xKTsgaSsrKQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4OiIsIGh3YnVmW2ldKTsKKyAgICAgICAgcHJpbnRmKCIlMDJ4XG4iLCBod2J1ZltpXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtNzQsMTAgKzc2LDEwIEBACiB7CiAgICAgRElSICpkOwogICAgIHN0cnVjdCBkaXJlbnQgKmRlOwotICAgIAorCiAgICAgZCA9IG9wZW5kaXIoIi9zeXMvY2xhc3MvbmV0Iik7CiAgICAgaWYoZCA9PSAwKSByZXR1cm4gLTE7Ci0gICAgCisKICAgICB3aGlsZSgoZGUgPSByZWFkZGlyKGQpKSkgewogICAgICAgICBpZihkZS0+ZF9uYW1lWzBdID09ICcuJykgY29udGludWU7CiAgICAgICAgIGR1bXBfaW50ZXJmYWNlKGRlLT5kX25hbWUpOwpAQCAtODYsNiArODgsMTUgQEAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IHNldF9od2FkZHIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXNjKSB7CisgICAgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIgPSBldGhlcl9hdG9uKGFzYyk7CisgICAgaWYgKCFhZGRyKSB7CisgICAgICAgIHByaW50ZigiRmFpbGVkIHRvIHBhcnNlICclcydcbiIsIGFzYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGlmY19zZXRfaHdhZGRyKG5hbWUsIGFkZHItPmV0aGVyX2FkZHJfb2N0ZXQpOworfQorCiBzdHJ1Y3QgCiB7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKQEAgLTk3LDYgKzEwOCw3IEBACiAgICAgeyAiZG93biIsICAgMSwgaWZjX2Rvd24gfSwKICAgICB7ICJmbGhvc3RzIiwgIDEsIGlmY19yZW1vdmVfaG9zdF9yb3V0ZXMgfSwKICAgICB7ICJkZWxkZWZhdWx0IiwgMSwgaWZjX3JlbW92ZV9kZWZhdWx0X3JvdXRlIH0sCisgICAgeyAiaHdhZGRyIiwgMiwgc2V0X2h3YWRkciB9LAogICAgIHsgMCwgMCwgMCB9LAogfTsKIApkaWZmIC0tZ2l0IGEvbmV4dXMvRGhjcENsaWVudC5jcHAgYi9uZXh1cy9EaGNwQ2xpZW50LmNwcAppbmRleCBhNTY1NGQyLi43MTMwNTlkIDEwMDY0NAotLS0gYS9uZXh1cy9EaGNwQ2xpZW50LmNwcAorKysgYi9uZXh1cy9EaGNwQ2xpZW50LmNwcApAQCAtMjcsMzUgKzI3LDE1IEBACiAKICNpbmNsdWRlIDxzeXN1dGlscy9TZXJ2aWNlTWFuYWdlci5oPgogCisjaW5jbHVkZSA8bmV0dXRpbHMvaWZjLmg+CisjaW5jbHVkZSA8bmV0dXRpbHMvZGhjcC5oPgorCiAjaW5jbHVkZSAiRGhjcENsaWVudC5oIgogI2luY2x1ZGUgIkRoY3BTdGF0ZS5oIgogI2luY2x1ZGUgIkRoY3BMaXN0ZW5lci5oIgogI2luY2x1ZGUgIklEaGNwRXZlbnRIYW5kbGVycy5oIgogI2luY2x1ZGUgIkNvbnRyb2xsZXIuaCIKIAotZXh0ZXJuICJDIiB7Ci1pbnQgaWZjX2Rpc2FibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKLWludCBpZmNfYWRkX2hvc3Rfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCB1aW50MzJfdCBhZGRyKTsKLWludCBpZmNfcmVtb3ZlX2hvc3Rfcm91dGVzKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX3NldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgdWludDMyX3QgZ2F0ZXdheSk7Ci1pbnQgaWZjX2dldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX3JlbW92ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX3Jlc2V0X2Nvbm5lY3Rpb25zKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX2NvbmZpZ3VyZShjb25zdCBjaGFyICppZm5hbWUsIGluX2FkZHJfdCBpcGFkZHIsIGluX2FkZHJfdCBuZXRtYXNrLCBpbl9hZGRyX3QgZ2F0ZXdheSwgaW5fYWRkcl90IGRuczEsIGluX2FkZHJfdCBkbnMyKTsKLQotaW50IGRoY3BfZG9fcmVxdWVzdChjb25zdCBjaGFyICppZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqaXBhZGRyLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmdhdGV3YXksCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqbWFzaywKLSAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpkbnMxLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmRuczIsCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqc2VydmVyLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKmxlYXNlKTsKLWludCBkaGNwX3N0b3AoY29uc3QgY2hhciAqaWZuYW1lKTsKLWludCBkaGNwX3JlbGVhc2VfbGVhc2UoY29uc3QgY2hhciAqaWZuYW1lKTsKLWNoYXIgKmRoY3BfZ2V0X2Vycm1zZygpOwotfQotCiBEaGNwQ2xpZW50OjpEaGNwQ2xpZW50KElEaGNwRXZlbnRIYW5kbGVycyAqaGFuZGxlcnMpIDoKICAgICAgICAgICAgIG1TdGF0ZShEaGNwU3RhdGU6OklOSVQpLCBtSGFuZGxlcnMoaGFuZGxlcnMpIHsKICAgICBtU2VydmljZU1hbmFnZXIgPSBuZXcgU2VydmljZU1hbmFnZXIoKTsKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvQW5kcm9pZC5tayBiL3Jvb3RkaXIvQW5kcm9pZC5tawppbmRleCAzMjliZTdmLi4xYTllMDZmIDEwMDY0NAotLS0gYS9yb290ZGlyL0FuZHJvaWQubWsKKysrIGIvcm9vdGRpci9BbmRyb2lkLm1rCkBAIC03LDcgKzcsMTEgQEAKIAlldGMvZGJ1cy5jb25mIFwKIAlldGMvaG9zdHMKIAotaWZlcSAoJChUQVJHRVRfUFJPRFVDVCksZ2VuZXJpYykKK2lmZXEgKCQoVEFSR0VUX1BST0RVQ1QpLGZ1bGwpCitjb3B5X2Zyb20gKz0gZXRjL3ZvbGQuZnN0YWIKK2VuZGlmCisKK2lmZXEgKCQoVEFSR0VUX1BST0RVQ1QpLGZ1bGxfeDg2KQogY29weV9mcm9tICs9IGV0Yy92b2xkLmZzdGFiCiBlbmRpZgogCmRpZmYgLS1naXQgYS9yb290ZGlyL2V0Yy9pbml0LmdvbGRmaXNoLnJjIGIvcm9vdGRpci9ldGMvaW5pdC5nb2xkZmlzaC5yYwppbmRleCA1Njk1NTVjLi4xYWMwOWNhIDEwMDY0NAotLS0gYS9yb290ZGlyL2V0Yy9pbml0LmdvbGRmaXNoLnJjCisrKyBiL3Jvb3RkaXIvZXRjL2luaXQuZ29sZGZpc2gucmMKQEAgLTEsNSArMSwxMiBAQAorb24gZWFybHktaW5pdAorICAgIGV4cG9ydCBFWFRFUk5BTF9TVE9SQUdFIC9tbnQvc2RjYXJkCisgICAgbWtkaXIgL21udC9zZGNhcmQgMDAwMCBzeXN0ZW0gc3lzdGVtCisgICAgIyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICBzeW1saW5rIC9tbnQvc2RjYXJkIC9zZGNhcmQKKwogb24gYm9vdAogICAgIHNldHByb3AgQVJHSCBBUkdICisgICAgc2V0cHJvcCBuZXQuZXRoMC5ndyAxMC4wLjIuMgogICAgIHNldHByb3AgbmV0LmV0aDAuZG5zMSAxMC4wLjIuMwogICAgIHNldHByb3AgbmV0LmdwcnMubG9jYWwtaXAgMTAuMC4yLjE1CiAgICAgc2V0cHJvcCByby5yYWRpby51c2UtcHBwIG5vCkBAIC0xNiw2ICsyMywxMSBAQAogICAgIHN0b3AgZHVuZAogICAgIHN0b3AgYWttZAogCisjIHN0YXJ0IGVzc2VudGlhbCBzZXJ2aWNlcworICAgIHN0YXJ0IHFlbXVkCisgICAgc3RhcnQgZ29sZGZpc2gtbG9nY2F0CisgICAgc3RhcnQgZ29sZGZpc2gtc2V0dXAKKwogICAgIHNldHByb3Agcm8uc2V0dXB3aXphcmQubW9kZSBFTVVMQVRPUgogCiAjIGVuYWJsZSBHb29nbGUtc3BlY2lmaWMgbG9jYXRpb24gZmVhdHVyZXMsCkBAIC0zNiw2ICs0OCw4IEBACiAjIHNvbWV0aGluZyBlbHNlLgogCiBzZXJ2aWNlIGdvbGRmaXNoLXNldHVwIC9zeXN0ZW0vZXRjL2luaXQuZ29sZGZpc2guc2gKKyAgICB1c2VyIHJvb3QKKyAgICBncm91cCByb290CiAgICAgb25lc2hvdAogCiBzZXJ2aWNlIHFlbXVkIC9zeXN0ZW0vYmluL3FlbXVkCkBAIC00Niw3ICs2MCw3IEBACiAjIHByb2dyYW0gdG8gY2hlY2sgd2V0aGVyIGl0IHJ1bnMgb24gdGhlIGVtdWxhdG9yCiAjIGlmIGl0IGRvZXMsIGl0IHJlZGlyZWN0cyBpdHMgb3V0cHV0IHRvIHRoZSBkZXZpY2UKICMgbmFtZWQgYnkgdGhlIGFuZHJvaWRib290LmNvbnNvbGUga2VybmVsIG9wdGlvbgotIyBpZiBub3QsIGlzIHNpbXBseSBleGl0IGltbWVkaWF0ZWx5CisjIGlmIG5vdCwgaXMgc2ltcGx5IGV4aXRzIGltbWVkaWF0ZWx5CiAKIHNlcnZpY2UgZ29sZGZpc2gtbG9nY2F0IC9zeXN0ZW0vYmluL2xvZ2NhdCAtUQogICAgIG9uZXNob3QKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvZXRjL2luaXQuZ29sZGZpc2guc2ggYi9yb290ZGlyL2V0Yy9pbml0LmdvbGRmaXNoLnNoCmluZGV4IDVmZjBhM2EuLjExNTZkZDcgMTAwNzU1Ci0tLSBhL3Jvb3RkaXIvZXRjL2luaXQuZ29sZGZpc2guc2gKKysrIGIvcm9vdGRpci9ldGMvaW5pdC5nb2xkZmlzaC5zaApAQCAtMSw4ICsxLDI2IEBACiAjIS9zeXN0ZW0vYmluL3NoCiAKKyMgU2V0dXAgbmV0d29ya2luZyB3aGVuIGJvb3Qgc3RhcnRzCiBpZmNvbmZpZyBldGgwIDEwLjAuMi4xNSBuZXRtYXNrIDI1NS4yNTUuMjU1LjAgdXAKIHJvdXRlIGFkZCBkZWZhdWx0IGd3IDEwLjAuMi4yIGRldiBldGgwCiAKKyMgcm8ua2VybmVsLmFuZHJvaWQucWVtdWQgaXMgbm9ybWFsbHkgc2V0IHdoZW4gd2UKKyMgd2FudCB0aGUgUklMIChyYWRpbyBpbnRlcmZhY2UgbGF5ZXIpIHRvIHRhbGsgdG8KKyMgdGhlIGVtdWxhdGVkIG1vZGVtIHRocm91Z2ggcWVtdWQuCisjCisjIEhvd2V2ZXIsIHRoaXMgd2lsbCBiZSB1bmRlZmluZWQgaW4gdHdvIGNhc2VzOgorIworIyAtIFdoZW4gd2Ugd2FudCB0aGUgUklMIHRvIHRhbGsgZGlyZWN0bHkgdG8gYSBndWVzdAorIyAgIHNlcmlhbCBkZXZpY2UgdGhhdCBpcyBjb25uZWN0ZWQgdG8gYSBob3N0IHNlcmlhbAorIyAgIGRldmljZSBieSB0aGUgZW11bGF0b3IuCisjCisjIC0gV2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIFJJTCBidXQgdGhlIFZNLWJhc2VkCisjICAgbW9kZW0gZW11bGF0aW9uIHRoYXQgcnVucyBpbnNpZGUgdGhlIGd1ZXN0IHN5c3RlbQorIyAgIGluc3RlYWQuCisjCisjIFRoZSBmb2xsb3dpbmcgZGV0ZWN0cyB0aGUgbGF0dGVyIGNhc2UgYW5kIHNldHMgdXAgdGhlCisjIHN5c3RlbSBmb3IgaXQuCisjCiBxZW11ZD1gZ2V0cHJvcCByby5rZXJuZWwuYW5kcm9pZC5xZW11ZGAKIGNhc2UgIiRxZW11ZCIgaW4KICAgICAiIikKQEAgLTE4LDE3ICszNiwxOCBAQAogICAgIDs7CiBlc2FjCiAKLW51bV9kbnM9YGdldHByb3Agcm8ua2VybmVsLmFuZHJvaWQubmRuc2AKKyMgU2V0dXAgYWRkaXRpb25uYWwgRE5TIHNlcnZlcnMgaWYgbmVlZGVkCitudW1fZG5zPWBnZXRwcm9wIHJvLmtlcm5lbC5uZG5zYAogY2FzZSAiJG51bV9kbnMiIGluCiAgICAgMikgc2V0cHJvcCBuZXQuZXRoMC5kbnMyIDEwLjAuMi40Ci0gICAgOzsKKyAgICAgICA7OwogICAgIDMpIHNldHByb3AgbmV0LmV0aDAuZG5zMiAxMC4wLjIuNAotICAgIHNldHByb3AgbmV0LmV0aDAuZG5zMyAxMC4wLjIuNQotICAgIDs7CisgICAgICAgc2V0cHJvcCBuZXQuZXRoMC5kbnMzIDEwLjAuMi41CisgICAgICAgOzsKICAgICA0KSBzZXRwcm9wIG5ldC5ldGgwLmRuczIgMTAuMC4yLjQKLSAgICBzZXRwcm9wIG5ldC5ldGgwLmRuczMgMTAuMC4yLjUKLSAgICBzZXRwcm9wIG5ldC5ldGgwLmRuczQgMTAuMC4yLjYKLSAgICA7OworICAgICAgIHNldHByb3AgbmV0LmV0aDAuZG5zMyAxMC4wLjIuNQorICAgICAgIHNldHByb3AgbmV0LmV0aDAuZG5zNCAxMC4wLjIuNgorICAgICAgIDs7CiBlc2FjCiAKICMgZGlzYWJsZSBib290IGFuaW1hdGlvbiBmb3IgYSBmYXN0ZXIgYm9vdCBzZXF1ZW5jZSB3aGVuIG5lZWRlZApAQCAtNDIsNiArNjEsMTIgQEAKICMKIC9zeXN0ZW0vYmluL3FlbXUtcHJvcHMKIAotIyB0aGlzIGxpbmUgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgdXNlZnVsLiBob3dldmVyIHdpdGhvdXQgaXQgdGhlCi0jIHByZXZpb3VzIHNldHByb3AgZG9lc24ndCBzZWVtIHRvIGFwcGx5IGZvciBzb21lIHJlYWxseSBvZGQgcmVhc29uCi1zZXRwcm9wIHJvLnFlbXUuaW5pdC5jb21wbGV0ZWQgMQorIyBzZXQgdXAgdGhlIHNlY29uZCBpbnRlcmZhY2UgKGZvciBpbnRlci1lbXVsYXRvciBjb25uZWN0aW9ucykKKyMgaWYgcmVxdWlyZWQKK215X2lwPWBnZXRwcm9wIG5ldC5zaGFyZWRfbmV0X2lwYAorY2FzZSAiJG15X2lwIiBpbgorICAgICIiKQorICAgIDs7CisgICAgKikgaWZjb25maWcgZXRoMSAiJG15X2lwIiBuZXRtYXNrIDI1NS4yNTUuMjU1LjAgdXAKKyAgICA7OworZXNhYwpkaWZmIC0tZ2l0IGEvcm9vdGRpci9ldGMvdWV2ZW50ZC5nb2xkZmlzaC5yYyBiL3Jvb3RkaXIvZXRjL3VldmVudGQuZ29sZGZpc2gucmMKaW5kZXggZTY5ZGUyOS4uOGRlNzA0OSAxMDA2NDQKLS0tIGEvcm9vdGRpci9ldGMvdWV2ZW50ZC5nb2xkZmlzaC5yYworKysgYi9yb290ZGlyL2V0Yy91ZXZlbnRkLmdvbGRmaXNoLnJjCkBAIC0wLDAgKzEsNSBAQAorIyBUaGVzZSBzZXR0aW5ncyBhcmUgc3BlY2lmaWMgdG8gcnVubmluZyB1bmRlciB0aGUgQW5kcm9pZCBlbXVsYXRvcgorL2Rldi9xZW11X3RyYWNlICAgICAgICAgICAwNjY2ICAgc3lzdGVtICAgICBzeXN0ZW0KKy9kZXYvcWVtdV9waXBlICAgICAgICAgICAgMDY2NiAgIHN5c3RlbSAgICAgc3lzdGVtCisvZGV2L3R0eVMqICAgICAgICAgICAgICAgIDA2NjYgICBzeXN0ZW0gICAgIHN5c3RlbQorL3Byb2MgICAgICAgICAgICAgICAgICAgICAwNjY2ICAgc3lzdGVtICAgICBzeXN0ZW0KZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC5yYyBiL3Jvb3RkaXIvaW5pdC5yYwppbmRleCA4MjI3MjczLi41NDg3M2UwIDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQucmMKKysrIGIvcm9vdGRpci9pbml0LnJjCkBAIC0xLDYgKzEsOSBAQAogb24gZWFybHktaW5pdAogICAgIHN0YXJ0IHVldmVudGQKIAorIyBjcmVhdGUgbW91bnRwb2ludHMKKyAgICBta2RpciAvbW50IDA3NzUgcm9vdCBzeXN0ZW0KKwogb24gaW5pdAogCiBzeXNjbGt0eiAwCkBAIC0xNCwxMCArMTcsOSBAQAogICAgIGV4cG9ydCBBTkRST0lEX1JPT1QgL3N5c3RlbQogICAgIGV4cG9ydCBBTkRST0lEX0FTU0VUUyAvc3lzdGVtL2FwcAogICAgIGV4cG9ydCBBTkRST0lEX0RBVEEgL2RhdGEKLSAgICBleHBvcnQgRVhURVJOQUxfU1RPUkFHRSAvbW50L3NkY2FyZAogICAgIGV4cG9ydCBBU0VDX01PVU5UUE9JTlQgL21udC9hc2VjCiAgICAgZXhwb3J0IExPT1BfTU9VTlRQT0lOVCAvbW50L29iYgotICAgIGV4cG9ydCBCT09UQ0xBU1NQQVRIIC9zeXN0ZW0vZnJhbWV3b3JrL2NvcmUuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2JvdW5jeWNhc3RsZS5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvZXh0Lmphcjovc3lzdGVtL2ZyYW1ld29yay9mcmFtZXdvcmsuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2FuZHJvaWQucG9saWN5Lmphcjovc3lzdGVtL2ZyYW1ld29yay9zZXJ2aWNlcy5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvY29yZS1qdW5pdC5qYXIKKyAgICBleHBvcnQgQk9PVENMQVNTUEFUSCAvc3lzdGVtL2ZyYW1ld29yay9jb3JlLmphcjovc3lzdGVtL2ZyYW1ld29yay9hcGFjaGUteG1sLmphcjovc3lzdGVtL2ZyYW1ld29yay9ib3VuY3ljYXN0bGUuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2V4dC5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvZnJhbWV3b3JrLmphcjovc3lzdGVtL2ZyYW1ld29yay9hbmRyb2lkLnBvbGljeS5qYXI6L3N5c3RlbS9mcmFtZXdvcmsvc2VydmljZXMuamFyOi9zeXN0ZW0vZnJhbWV3b3JrL2NvcmUtanVuaXQuamFyCiAKICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgIHN5bWxpbmsgL3N5c3RlbS9ldGMgL2V0YwpAQCAtMjcsMTggKzI5LDExIEBACiAjIGJ1dCBzb21lZGF5IHRoYXQgbWF5IGNoYW5nZS4KICAgICBzeW1saW5rIC9zeXN0ZW0vdmVuZG9yIC92ZW5kb3IKIAotIyBjcmVhdGUgbW91bnRwb2ludHMKLSAgICBta2RpciAvbW50IDA3NzUgcm9vdCBzeXN0ZW0KLSAgICBta2RpciAvbW50L3NkY2FyZCAwMDAwIHN5c3RlbSBzeXN0ZW0KLQogIyBDcmVhdGUgY2dyb3VwIG1vdW50IHBvaW50IGZvciBjcHUgYWNjb3VudGluZwogICAgIG1rZGlyIC9hY2N0CiAgICAgbW91bnQgY2dyb3VwIG5vbmUgL2FjY3QgY3B1YWNjdAogICAgIG1rZGlyIC9hY2N0L3VpZAogCi0jIEJhY2t3YXJkcyBDb21wYXQgLSBYWFg6IEdvaW5nIGF3YXkgaW4gRyoKLSAgICBzeW1saW5rIC9tbnQvc2RjYXJkIC9zZGNhcmQKLQogICAgIG1rZGlyIC9zeXN0ZW0KICAgICBta2RpciAvZGF0YSAwNzcxIHN5c3RlbSBzeXN0ZW0KICAgICBta2RpciAvY2FjaGUgMDc3MCBzeXN0ZW0gY2FjaGUKQEAgLTEwMSw2ICs5NiwzMiBAQAogICAgICMgb25jZSBldmVyeXRoaW5nIGlzIHNldHVwLCBubyBuZWVkIHRvIG1vZGlmeSAvCiAgICAgbW91bnQgcm9vdGZzIHJvb3RmcyAvIHJvIHJlbW91bnQKIAorICAgICMgV2UgY2hvd24vY2htb2QgL2NhY2hlIGFnYWluIHNvIGJlY2F1c2UgbW91bnQgaXMgcnVuIGFzIHJvb3QgKyBkZWZhdWx0cworICAgIGNob3duIHN5c3RlbSBjYWNoZSAvY2FjaGUKKyAgICBjaG1vZCAwNzcwIC9jYWNoZQorCisgICAgIyBUaGlzIG1heSBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgcmVjb3Zlcnkgc3lzdGVtIHdpdGggb2RkIHBlcm1pc3Npb25zCisgICAgY2hvd24gc3lzdGVtIGNhY2hlIC9jYWNoZS9yZWNvdmVyeQorICAgIGNobW9kIDA3NzAgL2NhY2hlL3JlY292ZXJ5CisKKyAgICAjY2hhbmdlIHBlcm1pc3Npb25zIG9uIHZtYWxsb2NpbmZvIHNvIHdlIGNhbiBncmFiIGl0IGZyb20gYnVncmVwb3J0cworICAgIGNob3duIHJvb3QgbG9nIC9wcm9jL3ZtYWxsb2NpbmZvCisgICAgY2htb2QgMDQ0MCAvcHJvYy92bWFsbG9jaW5mbworCisgICAgI2NoYW5nZSBwZXJtaXNzaW9ucyBvbiBrbXNnICYgc3lzcnEtdHJpZ2dlciBzbyBidWdyZXBvcnRzIGNhbiBncmFiIGt0aHJlYWQgc3RhY2tzCisgICAgY2hvd24gcm9vdCBzeXN0ZW0gL3Byb2Mva21zZworICAgIGNobW9kIDA0NDAgL3Byb2Mva21zZworICAgIGNob3duIHJvb3Qgc3lzdGVtIC9wcm9jL3N5c3JxLXRyaWdnZXIKKyAgICBjaG1vZCAwMjIwIC9wcm9jL3N5c3JxLXRyaWdnZXIKKworICAgICMgY3JlYXRlIHRoZSBsb3N0K2ZvdW5kIGRpcmVjdG9yaWVzLCBzbyBhcyB0byBlbmZvcmNlIG91ciBwZXJtaXNzaW9ucworICAgIG1rZGlyIC9jYWNoZS9sb3N0K2ZvdW5kIDA3NzAKKworICAgICMgZG91YmxlIGNoZWNrIHRoZSBwZXJtcywgaW4gY2FzZSBsb3N0K2ZvdW5kIGFscmVhZHkgZXhpc3RzLCBhbmQgc2V0IG93bmVyCisgICAgY2hvd24gcm9vdCByb290IC9jYWNoZS9sb3N0K2ZvdW5kCisgICAgY2htb2QgMDc3MCAvY2FjaGUvbG9zdCtmb3VuZAorCitvbiBwb3N0LWZzLWRhdGEKICAgICAjIFdlIGNob3duL2NobW9kIC9kYXRhIGFnYWluIHNvIGJlY2F1c2UgbW91bnQgaXMgcnVuIGFzIHJvb3QgKyBkZWZhdWx0cwogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2RhdGEKICAgICBjaG1vZCAwNzcxIC9kYXRhCkBAIC0xMjQsMjkgKzE0NSwxMiBAQAogCiAgICAgd3JpdGUgL3Byb2MvYXBhbmljX2NvbnNvbGUgMQogCi0gICAgIyBTYW1lIHJlYXNvbiBhcyAvZGF0YSBhYm92ZQotICAgIGNob3duIHN5c3RlbSBjYWNoZSAvY2FjaGUKLSAgICBjaG1vZCAwNzcwIC9jYWNoZQotCi0gICAgIyBUaGlzIG1heSBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgcmVjb3Zlcnkgc3lzdGVtIHdpdGggb2RkIHBlcm1pc3Npb25zCi0gICAgY2hvd24gc3lzdGVtIGNhY2hlIC9jYWNoZS9yZWNvdmVyeQotICAgIGNobW9kIDA3NzAgL2NhY2hlL3JlY292ZXJ5Ci0KLSAgICAjY2hhbmdlIHBlcm1pc3Npb25zIG9uIHZtYWxsb2NpbmZvIHNvIHdlIGNhbiBncmFiIGl0IGZyb20gYnVncmVwb3J0cwotICAgIGNob3duIHJvb3QgbG9nIC9wcm9jL3ZtYWxsb2NpbmZvCi0gICAgY2htb2QgMDQ0MCAvcHJvYy92bWFsbG9jaW5mbwotCi0gICAgI2NoYW5nZSBwZXJtaXNzaW9ucyBvbiBrbXNnICYgc3lzcnEtdHJpZ2dlciBzbyBidWdyZXBvcnRzIGNhbiBncmFiIGt0aHJlYWQgc3RhY2tzCi0gICAgY2hvd24gcm9vdCBzeXN0ZW0gL3Byb2Mva21zZwotICAgIGNobW9kIDA0NDAgL3Byb2Mva21zZwotICAgIGNob3duIHJvb3Qgc3lzdGVtIC9wcm9jL3N5c3JxLXRyaWdnZXIKLSAgICBjaG1vZCAwMjIwIC9wcm9jL3N5c3JxLXRyaWdnZXIKLQotIyBjcmVhdGUgYmFzaWMgZmlsZXN5c3RlbSBzdHJ1Y3R1cmUKKyAgICAjIGNyZWF0ZSBiYXNpYyBmaWxlc3lzdGVtIHN0cnVjdHVyZQogICAgIG1rZGlyIC9kYXRhL21pc2MgMDE3NzEgc3lzdGVtIG1pc2MKICAgICBta2RpciAvZGF0YS9taXNjL2JsdWV0b290aGQgMDc3MCBibHVldG9vdGggYmx1ZXRvb3RoCiAgICAgbWtkaXIgL2RhdGEvbWlzYy9ibHVldG9vdGggMDc3MCBzeXN0ZW0gc3lzdGVtCiAgICAgbWtkaXIgL2RhdGEvbWlzYy9rZXlzdG9yZSAwNzAwIGtleXN0b3JlIGtleXN0b3JlCisgICAgbWtkaXIgL2RhdGEvbWlzYy9rZXljaGFpbiAwNzcxIGtleWNoYWluIGtleWNoYWluCiAgICAgbWtkaXIgL2RhdGEvbWlzYy92cG4gMDc3MCBzeXN0ZW0gc3lzdGVtCiAgICAgbWtkaXIgL2RhdGEvbWlzYy9zeXN0ZW1rZXlzIDA3MDAgc3lzdGVtIHN5c3RlbQogICAgIG1rZGlyIC9kYXRhL21pc2MvdnBuL3Byb2ZpbGVzIDA3NzAgc3lzdGVtIHN5c3RlbQpAQCAtMTY4LDEzICsxNzIsMTkgQEAKIAogICAgICMgY3JlYXRlIHRoZSBsb3N0K2ZvdW5kIGRpcmVjdG9yaWVzLCBzbyBhcyB0byBlbmZvcmNlIG91ciBwZXJtaXNzaW9ucwogICAgIG1rZGlyIC9kYXRhL2xvc3QrZm91bmQgMDc3MAotICAgIG1rZGlyIC9jYWNoZS9sb3N0K2ZvdW5kIDA3NzAKIAogICAgICMgZG91YmxlIGNoZWNrIHRoZSBwZXJtcywgaW4gY2FzZSBsb3N0K2ZvdW5kIGFscmVhZHkgZXhpc3RzLCBhbmQgc2V0IG93bmVyCiAgICAgY2hvd24gcm9vdCByb290IC9kYXRhL2xvc3QrZm91bmQKICAgICBjaG1vZCAwNzcwIC9kYXRhL2xvc3QrZm91bmQKLSAgICBjaG93biByb290IHJvb3QgL2NhY2hlL2xvc3QrZm91bmQKLSAgICBjaG1vZCAwNzcwIC9jYWNoZS9sb3N0K2ZvdW5kCisKKyAgICAjIGNyZWF0ZSBkaXJlY3RvcnkgZm9yIERSTSBwbHVnLWlucworICAgIG1rZGlyIC9kYXRhL2RybSAwNzc0IGRybSBkcm0KKworICAgICMgSWYgdGhlcmUgaXMgbm8gZnMtcG9zdC1kYXRhIGFjdGlvbiBpbiB0aGUgaW5pdC48ZGV2aWNlPi5yYyBmaWxlLCB5b3UKKyAgICAjIG11c3QgdW5jb21tZW50IHRoaXMgbGluZSwgb3RoZXJ3aXNlIGVuY3J5cHRlZCBmaWxlc3lzdGVtcworICAgICMgd29uJ3Qgd29yay4KKyAgICAjIFNldCBpbmRpY2F0aW9uIChjaGVja2VkIGJ5IHZvbGQpIHRoYXQgd2UgaGF2ZSBmaW5pc2hlZCB0aGlzIGFjdGlvbgorICAgICNzZXRwcm9wIHZvbGQucG9zdF9mc19kYXRhX2RvbmUgMQogCiBvbiBib290CiAjIGJhc2ljIG5ldHdvcmsgaW5pdApAQCAtMTk5LDE1ICsyMDksMjggQEAKIAogIyBEZWZpbmUgdGhlIG1lbW9yeSB0aHJlc2hvbGRzIGF0IHdoaWNoIHRoZSBhYm92ZSBwcm9jZXNzIGNsYXNzZXMgd2lsbAogIyBiZSBraWxsZWQuICBUaGVzZSBudW1iZXJzIGFyZSBpbiBwYWdlcyAoNGspLgotICAgIHNldHByb3Agcm8uRk9SRUdST1VORF9BUFBfTUVNIDIwNDgKLSAgICBzZXRwcm9wIHJvLlZJU0lCTEVfQVBQX01FTSAzMDcyCi0gICAgc2V0cHJvcCByby5QRVJDRVBUSUJMRV9BUFBfTUVNIDQwOTYKLSAgICBzZXRwcm9wIHJvLkhFQVZZX1dFSUdIVF9BUFBfTUVNIDQwOTYKLSAgICBzZXRwcm9wIHJvLlNFQ09OREFSWV9TRVJWRVJfTUVNIDYxNDQKLSAgICBzZXRwcm9wIHJvLkJBQ0tVUF9BUFBfTUVNIDYxNDQKLSAgICBzZXRwcm9wIHJvLkhPTUVfQVBQX01FTSA2MTQ0Ci0gICAgc2V0cHJvcCByby5ISURERU5fQVBQX01FTSA3MTY4Ci0gICAgc2V0cHJvcCByby5FTVBUWV9BUFBfTUVNIDgxOTIKKyAgICAjIFRoZXNlIGFyZSBjdXJyZW50bHkgdHVuZWQgZm9yIHRhYmxldHMgd2l0aCBhcHByb3ggMUdCIFJBTS4KKyAgICBzZXRwcm9wIHJvLkZPUkVHUk9VTkRfQVBQX01FTSA4MTkyCisgICAgc2V0cHJvcCByby5WSVNJQkxFX0FQUF9NRU0gMTAyNDAKKyAgICBzZXRwcm9wIHJvLlBFUkNFUFRJQkxFX0FQUF9NRU0gMTIyODgKKyAgICBzZXRwcm9wIHJvLkhFQVZZX1dFSUdIVF9BUFBfTUVNIDEyMjg4CisgICAgc2V0cHJvcCByby5TRUNPTkRBUllfU0VSVkVSX01FTSAxNDMzNgorICAgIHNldHByb3Agcm8uQkFDS1VQX0FQUF9NRU0gMTQzMzYKKyAgICBzZXRwcm9wIHJvLkhPTUVfQVBQX01FTSAxNDMzNgorICAgIHNldHByb3Agcm8uSElEREVOX0FQUF9NRU0gMTYzODQKKyAgICBzZXRwcm9wIHJvLkVNUFRZX0FQUF9NRU0gMjA0ODAKKworICAgICMgT2xkIHZhbHVlcyBmb3IgcGhvbmVzLiAgU2hvdWxkIHByb2JhYmx5IGJlIGFkanVzdGVkIHVwIGZvciB0aGUgbmV4dAorICAgICMgcGhvbmUgdmVyc2lvbi4KKyAgICAjc2V0cHJvcCByby5GT1JFR1JPVU5EX0FQUF9NRU0gMjA0OAorICAgICNzZXRwcm9wIHJvLlZJU0lCTEVfQVBQX01FTSAzMDcyCisgICAgI3NldHByb3Agcm8uUEVSQ0VQVElCTEVfQVBQX01FTSA0MDk2CisgICAgI3NldHByb3Agcm8uSEVBVllfV0VJR0hUX0FQUF9NRU0gNDA5NgorICAgICNzZXRwcm9wIHJvLlNFQ09OREFSWV9TRVJWRVJfTUVNIDYxNDQKKyAgICAjc2V0cHJvcCByby5CQUNLVVBfQVBQX01FTSA2MTQ0CisgICAgI3NldHByb3Agcm8uSE9NRV9BUFBfTUVNIDYxNDQKKyAgICAjc2V0cHJvcCByby5ISURERU5fQVBQX01FTSA3MTY4CisgICAgI3NldHByb3Agcm8uRU1QVFlfQVBQX01FTSA4MTkyCiAKICMgV3JpdGUgdmFsdWUgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGFib3ZlIHByb3BlcnRpZXMuCiAjIE5vdGUgdGhhdCB0aGUgZHJpdmVyIG9ubHkgc3VwcG9ydHMgNiBzbG90cywgc28gd2UgaGF2ZSBjb21iaW5lZCBzb21lIG9mCkBAIC0yMTcsNyArMjQwLDcgQEAKIAogICAgIHdyaXRlIC9wcm9jL3N5cy92bS9vdmVyY29tbWl0X21lbW9yeSAxCiAgICAgd3JpdGUgL3Byb2Mvc3lzL3ZtL21pbl9mcmVlX29yZGVyX3NoaWZ0IDQKLSAgICB3cml0ZSAvc3lzL21vZHVsZS9sb3dtZW1vcnlraWxsZXIvcGFyYW1ldGVycy9taW5mcmVlIDIwNDgsMzA3Miw0MDk2LDYxNDQsNzE2OCw4MTkyCisgICAgd3JpdGUgL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvbWluZnJlZSA4MTkyLDEwMjQwLDEyMjg4LDE0MzM2LDE2Mzg0LDIwNDgwCiAKICAgICAjIFNldCBpbml0IGl0cyBmb3JrZWQgY2hpbGRyZW4ncyBvb21fYWRqLgogICAgIHdyaXRlIC9wcm9jLzEvb29tX2FkaiAtMTYKQEAgLTI3MywyNCArMjk2LDU0IEBACiAgICAgc2V0cHJvcCBuZXQudGNwLmJ1ZmZlcnNpemUuZWRnZSAgICA0MDkzLDI2MjgwLDM1MDQwLDQwOTYsMTYzODQsMzUwNDAKICAgICBzZXRwcm9wIG5ldC50Y3AuYnVmZmVyc2l6ZS5ncHJzICAgIDQwOTIsODc2MCwxMTY4MCw0MDk2LDg3NjAsMTE2ODAKIAotICAgIGNsYXNzX3N0YXJ0IGRlZmF1bHQKKyMgU2V0IHRoaXMgcHJvcGVydHkgc28gc3VyZmFjZWZsaW5nZXIgaXMgbm90IHN0YXJ0ZWQgYnkgc3lzdGVtX2luaXQKKyAgICBzZXRwcm9wIHN5c3RlbV9pbml0LnN0YXJ0c3VyZmFjZWZsaW5nZXIgMAorCisgICAgY2xhc3Nfc3RhcnQgY29yZQorICAgIGNsYXNzX3N0YXJ0IG1haW4KKworb24gbm9uZW5jcnlwdGVkCisgICAgY2xhc3Nfc3RhcnQgbGF0ZV9zdGFydAorCitvbiBwcm9wZXJ0eTp2b2xkLmRlY3J5cHQ9dHJpZ2dlcl9yZXNldF9tYWluCisgICAgY2xhc3NfcmVzZXQgbWFpbgorCitvbiBwcm9wZXJ0eTp2b2xkLmRlY3J5cHQ9dHJpZ2dlcl9sb2FkX3BlcnNpc3RfcHJvcHMKKyAgICBsb2FkX3BlcnNpc3RfcHJvcHMKKworb24gcHJvcGVydHk6dm9sZC5kZWNyeXB0PXRyaWdnZXJfcG9zdF9mc19kYXRhCisgICAgdHJpZ2dlciBwb3N0LWZzLWRhdGEKKworb24gcHJvcGVydHk6dm9sZC5kZWNyeXB0PXRyaWdnZXJfcmVzdGFydF9taW5fZnJhbWV3b3JrCisgICAgY2xhc3Nfc3RhcnQgbWFpbgorCitvbiBwcm9wZXJ0eTp2b2xkLmRlY3J5cHQ9dHJpZ2dlcl9yZXN0YXJ0X2ZyYW1ld29yaworICAgIGNsYXNzX3N0YXJ0IG1haW4KKyAgICBjbGFzc19zdGFydCBsYXRlX3N0YXJ0CisKK29uIHByb3BlcnR5OnZvbGQuZGVjcnlwdD10cmlnZ2VyX3NodXRkb3duX2ZyYW1ld29yaworICAgIGNsYXNzX3Jlc2V0IGxhdGVfc3RhcnQKKyAgICBjbGFzc19yZXNldCBtYWluCiAKICMjIERhZW1vbiBwcm9jZXNzZXMgdG8gYmUgcnVuIGJ5IGluaXQuCiAjIwogc2VydmljZSB1ZXZlbnRkIC9zYmluL3VldmVudGQKKyAgICBjbGFzcyBjb3JlCiAgICAgY3JpdGljYWwKIAogc2VydmljZSBjb25zb2xlIC9zeXN0ZW0vYmluL3NoCisgICAgY2xhc3MgY29yZQogICAgIGNvbnNvbGUKICAgICBkaXNhYmxlZAogICAgIHVzZXIgc2hlbGwKICAgICBncm91cCBsb2cKIAotb24gcHJvcGVydHk6cm8uc2VjdXJlPTAKK29uIHByb3BlcnR5OnJvLmRlYnVnZ2FibGU9MQogICAgIHN0YXJ0IGNvbnNvbGUKIAogIyBhZGJkIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBlcnNpc3Quc2VydmljZS5hZGIuZW5hYmxlIHN5c3RlbSBwcm9wZXJ0eQogc2VydmljZSBhZGJkIC9zYmluL2FkYmQKKyAgICBjbGFzcyBjb3JlCiAgICAgZGlzYWJsZWQKIAogIyBhZGJkIG9uIGF0IGJvb3QgaW4gZW11bGF0b3IKQEAgLTMwNCw1MCArMzU3LDc0IEBACiAgICAgc3RvcCBhZGJkCiAKIHNlcnZpY2Ugc2VydmljZW1hbmFnZXIgL3N5c3RlbS9iaW4vc2VydmljZW1hbmFnZXIKKyAgICBjbGFzcyBjb3JlCiAgICAgdXNlciBzeXN0ZW0KKyAgICBncm91cCBzeXN0ZW0KICAgICBjcml0aWNhbAogICAgIG9ucmVzdGFydCByZXN0YXJ0IHp5Z290ZQogICAgIG9ucmVzdGFydCByZXN0YXJ0IG1lZGlhCiAKIHNlcnZpY2Ugdm9sZCAvc3lzdGVtL2Jpbi92b2xkCisgICAgY2xhc3MgY29yZQogICAgIHNvY2tldCB2b2xkIHN0cmVhbSAwNjYwIHJvb3QgbW91bnQKICAgICBpb3ByaW8gYmUgMgogCiBzZXJ2aWNlIG5ldGQgL3N5c3RlbS9iaW4vbmV0ZAorICAgIGNsYXNzIG1haW4KICAgICBzb2NrZXQgbmV0ZCBzdHJlYW0gMDY2MCByb290IHN5c3RlbQorICAgIHNvY2tldCBkbnNwcm94eWQgc3RyZWFtIDA2NjAgcm9vdCBpbmV0CiAKIHNlcnZpY2UgZGVidWdnZXJkIC9zeXN0ZW0vYmluL2RlYnVnZ2VyZAorICAgIGNsYXNzIG1haW4KIAogc2VydmljZSByaWwtZGFlbW9uIC9zeXN0ZW0vYmluL3JpbGQKKyAgICBjbGFzcyBsYXRlX3N0YXJ0CiAgICAgc29ja2V0IHJpbGQgc3RyZWFtIDY2MCByb290IHJhZGlvCiAgICAgc29ja2V0IHJpbGQtZGVidWcgc3RyZWFtIDY2MCByYWRpbyBzeXN0ZW0KICAgICB1c2VyIHJvb3QKICAgICBncm91cCByYWRpbyBjYWNoZSBpbmV0IG1pc2MgYXVkaW8gc2RjYXJkX3J3CiAKK3NlcnZpY2Ugc3VyZmFjZWZsaW5nZXIgL3N5c3RlbS9iaW4vc3VyZmFjZWZsaW5nZXIKKyAgICBjbGFzcyBtYWluCisgICAgdXNlciBzeXN0ZW0KKyAgICBncm91cCBncmFwaGljcworICAgIG9ucmVzdGFydCByZXN0YXJ0IHp5Z290ZQorCiBzZXJ2aWNlIHp5Z290ZSAvc3lzdGVtL2Jpbi9hcHBfcHJvY2VzcyAtWHp5Z290ZSAvc3lzdGVtL2JpbiAtLXp5Z290ZSAtLXN0YXJ0LXN5c3RlbS1zZXJ2ZXIKKyAgICBjbGFzcyBtYWluCiAgICAgc29ja2V0IHp5Z290ZSBzdHJlYW0gNjY2CiAgICAgb25yZXN0YXJ0IHdyaXRlIC9zeXMvYW5kcm9pZF9wb3dlci9yZXF1ZXN0X3N0YXRlIHdha2UKICAgICBvbnJlc3RhcnQgd3JpdGUgL3N5cy9wb3dlci9zdGF0ZSBvbgorICAgIG9ucmVzdGFydCByZXN0YXJ0IHN1cmZhY2VmbGluZ2VyCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgbWVkaWEKICAgICBvbnJlc3RhcnQgcmVzdGFydCBuZXRkCiAKK3NlcnZpY2UgZHJtIC9zeXN0ZW0vYmluL2RybXNlcnZlcgorICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIGRybQorICAgIGdyb3VwIHN5c3RlbSBpbmV0CisKIHNlcnZpY2UgbWVkaWEgL3N5c3RlbS9iaW4vbWVkaWFzZXJ2ZXIKKyAgICBjbGFzcyBtYWluCiAgICAgdXNlciBtZWRpYQotICAgIGdyb3VwIHN5c3RlbSBhdWRpbyBjYW1lcmEgZ3JhcGhpY3MgaW5ldCBuZXRfYnQgbmV0X2J0X2FkbWluIG5ldF9yYXcKKyAgICBncm91cCBhdWRpbyBjYW1lcmEgaW5ldCBuZXRfYnQgbmV0X2J0X2FkbWluCiAgICAgaW9wcmlvIHJ0IDQKIAogc2VydmljZSBib290YW5pbSAvc3lzdGVtL2Jpbi9ib290YW5pbWF0aW9uCisgICAgY2xhc3MgbWFpbgogICAgIHVzZXIgZ3JhcGhpY3MKICAgICBncm91cCBncmFwaGljcwogICAgIGRpc2FibGVkCiAgICAgb25lc2hvdAogCiBzZXJ2aWNlIGRidXMgL3N5c3RlbS9iaW4vZGJ1cy1kYWVtb24gLS1zeXN0ZW0gLS1ub2ZvcmsKKyAgICBjbGFzcyBtYWluCiAgICAgc29ja2V0IGRidXMgc3RyZWFtIDY2MCBibHVldG9vdGggYmx1ZXRvb3RoCiAgICAgdXNlciBibHVldG9vdGgKICAgICBncm91cCBibHVldG9vdGggbmV0X2J0X2FkbWluCiAKIHNlcnZpY2UgYmx1ZXRvb3RoZCAvc3lzdGVtL2Jpbi9ibHVldG9vdGhkIC1uCisgICAgY2xhc3MgbWFpbgogICAgIHNvY2tldCBibHVldG9vdGggc3RyZWFtIDY2MCBibHVldG9vdGggYmx1ZXRvb3RoCiAgICAgc29ja2V0IGRidXNfYmx1ZXRvb3RoIHN0cmVhbSA2NjAgYmx1ZXRvb3RoIGJsdWV0b290aAogICAgICMgaW5pdC5yYyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBhcHBseWluZyBjYXBhYmlsaXRpZXMsIHNvIHJ1biBhcyByb290IGFuZApAQCAtMzU1LDM3ICs0MzIsMTYgQEAKICAgICBncm91cCBibHVldG9vdGggbmV0X2J0X2FkbWluIG1pc2MKICAgICBkaXNhYmxlZAogCi1zZXJ2aWNlIGhmYWcgL3N5c3RlbS9iaW4vc2RwdG9vbCBhZGQgLS1jaGFubmVsPTEwIEhGQUcKLSAgICB1c2VyIGJsdWV0b290aAotICAgIGdyb3VwIGJsdWV0b290aCBuZXRfYnRfYWRtaW4KLSAgICBkaXNhYmxlZAotICAgIG9uZXNob3QKLQotc2VydmljZSBoc2FnIC9zeXN0ZW0vYmluL3NkcHRvb2wgYWRkIC0tY2hhbm5lbD0xMSBIU0FHCi0gICAgdXNlciBibHVldG9vdGgKLSAgICBncm91cCBibHVldG9vdGggbmV0X2J0X2FkbWluCi0gICAgZGlzYWJsZWQKLSAgICBvbmVzaG90Ci0KLXNlcnZpY2Ugb3B1c2ggL3N5c3RlbS9iaW4vc2RwdG9vbCBhZGQgLS1jaGFubmVsPTEyIE9QVVNICi0gICAgdXNlciBibHVldG9vdGgKLSAgICBncm91cCBibHVldG9vdGggbmV0X2J0X2FkbWluCi0gICAgZGlzYWJsZWQKLSAgICBvbmVzaG90Ci0KLXNlcnZpY2UgcGJhcCAvc3lzdGVtL2Jpbi9zZHB0b29sIGFkZCAtLWNoYW5uZWw9MTkgUEJBUAotICAgIHVzZXIgYmx1ZXRvb3RoCi0gICAgZ3JvdXAgYmx1ZXRvb3RoIG5ldF9idF9hZG1pbgotICAgIGRpc2FibGVkCi0gICAgb25lc2hvdAotCiBzZXJ2aWNlIGluc3RhbGxkIC9zeXN0ZW0vYmluL2luc3RhbGxkCisgICAgY2xhc3MgbWFpbgogICAgIHNvY2tldCBpbnN0YWxsZCBzdHJlYW0gNjAwIHN5c3RlbSBzeXN0ZW0KIAogc2VydmljZSBmbGFzaF9yZWNvdmVyeSAvc3lzdGVtL2V0Yy9pbnN0YWxsLXJlY292ZXJ5LnNoCisgICAgY2xhc3MgbWFpbgogICAgIG9uZXNob3QKIAogc2VydmljZSByYWNvb24gL3N5c3RlbS9iaW4vcmFjb29uCisgICAgY2xhc3MgbWFpbgogICAgIHNvY2tldCByYWNvb24gc3RyZWFtIDYwMCBzeXN0ZW0gc3lzdGVtCiAgICAgIyByYWNvb24gd2lsbCBzZXR1aWQgdG8gdnBuIGFmdGVyIGdldHRpbmcgbmVjZXNzYXJ5IHJlc291cmNlcy4KICAgICBncm91cCBuZXRfYWRtaW4KQEAgLTM5Myw2ICs0NDksNyBAQAogICAgIG9uZXNob3QKIAogc2VydmljZSBtdHBkIC9zeXN0ZW0vYmluL210cGQKKyAgICBjbGFzcyBtYWluCiAgICAgc29ja2V0IG10cGQgc3RyZWFtIDYwMCBzeXN0ZW0gc3lzdGVtCiAgICAgdXNlciB2cG4KICAgICBncm91cCB2cG4gbmV0X2FkbWluIG5ldF9yYXcKQEAgLTQwMCwxMSArNDU3LDEzIEBACiAgICAgb25lc2hvdAogCiBzZXJ2aWNlIGtleXN0b3JlIC9zeXN0ZW0vYmluL2tleXN0b3JlIC9kYXRhL21pc2Mva2V5c3RvcmUKKyAgICBjbGFzcyBtYWluCiAgICAgdXNlciBrZXlzdG9yZQogICAgIGdyb3VwIGtleXN0b3JlCiAgICAgc29ja2V0IGtleXN0b3JlIHN0cmVhbSA2NjYKIAogc2VydmljZSBkdW1wc3RhdGUgL3N5c3RlbS9iaW4vZHVtcHN0YXRlIC1zCisgICAgY2xhc3MgbWFpbgogICAgIHNvY2tldCBkdW1wc3RhdGUgc3RyZWFtIDA2NjAgc2hlbGwgbG9nCiAgICAgZGlzYWJsZWQKICAgICBvbmVzaG90CmRpZmYgLS1naXQgYS9yb290ZGlyL3VldmVudGQucmMgYi9yb290ZGlyL3VldmVudGQucmMKaW5kZXggYjUzNDY2OS4uNDM4Y2YwYSAxMDA2NDQKLS0tIGEvcm9vdGRpci91ZXZlbnRkLnJjCisrKyBiL3Jvb3RkaXIvdWV2ZW50ZC5yYwpAQCAtMjMsNyArMjMsNiBAQAogL2Rldi9hbmRyb2lkX2FkYiAgICAgICAgICAwNjYwICAgYWRiICAgICAgICBhZGIKIC9kZXYvYW5kcm9pZF9hZGJfZW5hYmxlICAgMDY2MCAgIGFkYiAgICAgICAgYWRiCiAvZGV2L3R0eU1TTTAgICAgICAgICAgICAgIDA2MDAgICBibHVldG9vdGggIGJsdWV0b290aAotL2Rldi90dHlIUzAgICAgICAgICAgICAgICAwNjAwICAgYmx1ZXRvb3RoICBibHVldG9vdGgKIC9kZXYvdWlucHV0ICAgICAgICAgICAgICAgMDY2MCAgIHN5c3RlbSAgICAgYmx1ZXRvb3RoCiAvZGV2L2FsYXJtICAgICAgICAgICAgICAgIDA2NjQgICBzeXN0ZW0gICAgIHJhZGlvCiAvZGV2L3R0eTAgICAgICAgICAgICAgICAgIDA2NjAgICByb290ICAgICAgIHN5c3RlbQpAQCAtNjQsMTggKzYzLDE4IEBACiAvZGV2L3NuZC9kc3AxICAgICAgICAgICAgIDA2NjAgICBzeXN0ZW0gICAgIGF1ZGlvCiAvZGV2L3NuZC9taXhlciAgICAgICAgICAgIDA2NjAgICBzeXN0ZW0gICAgIGF1ZGlvCiAvZGV2L3NtZDAgICAgICAgICAgICAgICAgIDA2NDAgICByYWRpbyAgICAgIHJhZGlvCi0vZGV2L3FlbXVfdHJhY2UgICAgICAgICAgIDA2NjYgICBzeXN0ZW0gICAgIHN5c3RlbQogL2Rldi9xbWkgICAgICAgICAgICAgICAgICAwNjQwICAgcmFkaW8gICAgICByYWRpbwogL2Rldi9xbWkwICAgICAgICAgICAgICAgICAwNjQwICAgcmFkaW8gICAgICByYWRpbwogL2Rldi9xbWkxICAgICAgICAgICAgICAgICAwNjQwICAgcmFkaW8gICAgICByYWRpbwogL2Rldi9xbWkyICAgICAgICAgICAgICAgICAwNjQwICAgcmFkaW8gICAgICByYWRpbwogL2Rldi9idXMvdXNiLyogICAgICAgICAgICAwNjYwICAgcm9vdCAgICAgICB1c2IKKy9kZXYvbXRwX3VzYiAgICAgICAgICAgICAgMDY2MCAgIHJvb3QgICAgICAgbXRwCiAvZGV2L3VzYl9hY2Nlc3NvcnkgICAgICAgIDA2NjAgICByb290ICAgICAgIHVzYgorL2Rldi90dW4gICAgICAgICAgICAgICAgICAwNjYwICAgc3lzdGVtICAgICB2cG4KIAogIyBDRE1BIHJhZGlvIGludGVyZmFjZSBNVVgKIC9kZXYvdHMwNzEwbXV4KiAgICAgICAgICAgMDY0MCAgIHJhZGlvICAgICAgcmFkaW8KIC9kZXYvcHBwICAgICAgICAgICAgICAgICAgMDY2MCAgIHJhZGlvICAgICAgdnBuCi0vZGV2L3R1biAgICAgICAgICAgICAgICAgIDA2NDAgICB2cG4gICAgICAgIHZwbgogCiAjIHN5c2ZzIHByb3BlcnRpZXMKIC9zeXMvZGV2aWNlcy92aXJ0dWFsL2lucHV0L2lucHV0KiAgIGVuYWJsZSAgICAgIDA2NjAgIHJvb3QgICBpbnB1dApkaWZmIC0tZ2l0IGEvc2RjYXJkL3NkY2FyZC5jIGIvc2RjYXJkL3NkY2FyZC5jCmluZGV4IDgyZTYzNTQuLmJkMDAzMTEgMTAwNjQ0Ci0tLSBhL3NkY2FyZC9zZGNhcmQuYworKysgYi9zZGNhcmQvc2RjYXJkLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiAjaW5jbHVkZSA8c3lzL3Vpby5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIApAQCAtNTUsMTAgKzU2LDYgQEAKICAqIGtlcm5lbCwgeW91IG11c3Qgcm9sbGJhY2sgdGhlIHJlZmNvdW50IHRvIHJlZmxlY3QgdGhlIHJlZmVyZW5jZSB0aGUKICAqIGtlcm5lbCBkaWQgbm90IGFjdHVhbGx5IGFjcXVpcmUKICAqCi0gKgotICogQnVnczoKLSAqCi0gKiAtIG5lZWQgdG8gbW92ZS9yZW5hbWUgbm9kZSBvbiBSRU5BTUUKICAqLwogCiAjZGVmaW5lIEZVU0VfVFJBQ0UgMApAQCAtODksMTUgKzg2LDIxIEBACiAgICAgX191NjQgbmlkOwogICAgIF9fdTY0IGdlbjsKIAotICAgIHN0cnVjdCBub2RlICpuZXh0OwotICAgIHN0cnVjdCBub2RlICpjaGlsZDsKLSAgICBzdHJ1Y3Qgbm9kZSAqYWxsOwotICAgIHN0cnVjdCBub2RlICpwYXJlbnQ7CisgICAgc3RydWN0IG5vZGUgKm5leHQ7ICAgICAgICAgIC8qIHBlci1kaXIgc2libGluZyBsaXN0ICovCisgICAgc3RydWN0IG5vZGUgKmNoaWxkOyAgICAgICAgIC8qIGZpcnN0IGNvbnRhaW5lZCBmaWxlIGJ5IHRoaXMgZGlyICovCisgICAgc3RydWN0IG5vZGUgKmFsbDsgICAgICAgICAgIC8qIGdsb2JhbCBub2RlIGxpc3QgKi8KKyAgICBzdHJ1Y3Qgbm9kZSAqcGFyZW50OyAgICAgICAgLyogY29udGFpbmluZyBkaXJlY3RvcnkgKi8KIAogICAgIF9fdTMyIHJlZmNvdW50OwogICAgIF9fdTMyIG5hbWVsZW47CiAKLSAgICBjaGFyIG5hbWVbMV07CisgICAgY2hhciAqbmFtZTsKKyAgICAvKiBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgcmVhbCBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UuCisgICAgICogVGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIGZpZWxkICJuYW1lIiBvbmx5IGJ5IGNhc2UuCisgICAgICogc3RybGVuKGFjdHVhbF9uYW1lKSB3aWxsIGFsd2F5cyBlcXVhbCBzdHJsZW4obmFtZSksIHNvIGl0IGlzIHNhZmUgdG8gdXNlCisgICAgICogbmFtZWxlbiBmb3IgYm90aCBmaWVsZHMuCisgICAgICovCisgICAgY2hhciAqYWN0dWFsX25hbWU7CiB9OwogCiBzdHJ1Y3QgZnVzZSB7CkBAIC0xMTIsMTAgKzExNSwyNCBAQAogICAgIGNoYXIgcm9vdHBhdGhbMTAyNF07CiB9OwogCitzdGF0aWMgdW5zaWduZWQgdWlkID0gLTE7CitzdGF0aWMgdW5zaWduZWQgZ2lkID0gLTE7CisKICNkZWZpbmUgUEFUSF9CVUZGRVJfU0laRSAxMDI0CiAKLWNoYXIgKm5vZGVfZ2V0X3BhdGgoc3RydWN0IG5vZGUgKm5vZGUsIGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSkKKyNkZWZpbmUgTk9fQ0FTRV9TRU5TSVRJVkVfTUFUQ0ggMAorI2RlZmluZSBDQVNFX1NFTlNJVElWRV9NQVRDSCAxCisKKy8qCisgKiBHZXQgdGhlIHJlYWwtbGlmZSBhYnNvbHV0ZSBwYXRoIHRvIGEgbm9kZS4KKyAqICAgbm9kZTogc3RhcnQgYXQgdGhpcyBub2RlCisgKiAgIGJ1Zjogc3RvcmFnZSBmb3IgcmV0dXJuZWQgc3RyaW5nCisgKiAgIG5hbWU6IGFwcGVuZCB0aGlzIHN0cmluZyB0byBwYXRoIGlmIHNldAorICovCitjaGFyICpkb19ub2RlX2dldF9wYXRoKHN0cnVjdCBub2RlICpub2RlLCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtYXRjaF9jYXNlX2luc2Vuc2l0aXZlKQogeworICAgIHN0cnVjdCBub2RlICppbl9ub2RlID0gbm9kZTsKKyAgICBjb25zdCBjaGFyICppbl9uYW1lID0gbmFtZTsKICAgICBjaGFyICpvdXQgPSBidWYgKyBQQVRIX0JVRkZFUl9TSVpFIC0gMTsKICAgICBpbnQgbGVuOwogICAgIG91dFswXSA9IDA7CkBAIC0xMjYsNyArMTQzLDcgQEAKICAgICB9CiAKICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBuYW1lID0gbm9kZS0+bmFtZTsKKyAgICAgICAgbmFtZSA9IChub2RlLT5hY3R1YWxfbmFtZSA/IG5vZGUtPmFjdHVhbF9uYW1lIDogbm9kZS0+bmFtZSk7CiAgICAgICAgIGxlbiA9IG5vZGUtPm5hbWVsZW47CiAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CiAgICAgc3RhcnQ6CkBAIC0xMzQsMTEgKzE1MSw0NSBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIG91dCAtPSBsZW47CiAgICAgICAgIG1lbWNweShvdXQsIG5hbWUsIGxlbik7Ci0gICAgICAgIG91dCAtLTsKLSAgICAgICAgb3V0WzBdID0gJy8nOworICAgICAgICAvKiBhdm9pZCBkb3VibGUgc2xhc2ggYXQgYmVnaW5uaW5nIG9mIHBhdGggKi8KKyAgICAgICAgaWYgKG91dFswXSAhPSAnLycpIHsKKyAgICAgICAgICAgIG91dCAtLTsKKyAgICAgICAgICAgIG91dFswXSA9ICcvJzsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBvdXQ7CisgICAgLyogSWYgd2UgYXJlIHNlYXJjaGluZyBmb3IgYSBmaWxlIHdpdGhpbiBub2RlIChyYXRoZXIgdGhhbiBjb21wdXRpbmcgbm9kZSdzIHBhdGgpCisgICAgICogYW5kIGZhaWwsIHRoZW4gd2UgbmVlZCB0byBsb29rIGZvciBhIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2guCisgICAgICovCisgICAgaWYgKGluX25hbWUgJiYgbWF0Y2hfY2FzZV9pbnNlbnNpdGl2ZSAmJiBhY2Nlc3Mob3V0LCBGX09LKSAhPSAwKSB7CisgICAgICAgIGNoYXIgKnBhdGgsIGJ1ZmZlcltQQVRIX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgRElSKiBkaXI7CisgICAgICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OworICAgICAgICBwYXRoID0gZG9fbm9kZV9nZXRfcGF0aChpbl9ub2RlLCBidWZmZXIsIE5VTEwsIE5PX0NBU0VfU0VOU0lUSVZFX01BVENIKTsKKyAgICAgICAgZGlyID0gb3BlbmRpcihwYXRoKTsKKyAgICAgICAgaWYgKCFkaXIpIHsKKyAgICAgICAgICAgIEVSUk9SKCJvcGVuZGlyICVzIGZhaWxlZDogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZW50cnktPmRfbmFtZSwgaW5fbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIGEgbWF0Y2ggLSByZXBsYWNlIHRoZSBuYW1lICovCisgICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKGluX25hbWUpOworICAgICAgICAgICAgICAgIG1lbWNweShidWYgKyBQQVRIX0JVRkZFUl9TSVpFIC0gbGVuIC0gMSwgZW50cnktPmRfbmFtZSwgbGVuKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkaXIpOworICAgIH0KKworICAgcmV0dXJuIG91dDsKK30KKworY2hhciAqbm9kZV9nZXRfcGF0aChzdHJ1Y3Qgbm9kZSAqbm9kZSwgY2hhciAqYnVmLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIC8qIFdlIGxvb2sgZm9yIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hlcyBieSBkZWZhdWx0ICovCisgICAgcmV0dXJuIGRvX25vZGVfZ2V0X3BhdGgobm9kZSwgYnVmLCBuYW1lLCBDQVNFX1NFTlNJVElWRV9NQVRDSCk7CiB9CiAKIHZvaWQgYXR0cl9mcm9tX3N0YXQoc3RydWN0IGZ1c2VfYXR0ciAqYXR0ciwgc3RydWN0IHN0YXQgKnMpCkBAIC0xODksMjggKzI0MCw4NCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhZGRfbm9kZV90b19wYXJlbnQoc3RydWN0IG5vZGUgKm5vZGUsIHN0cnVjdCBub2RlICpwYXJlbnQpIHsKKyAgICBub2RlLT5wYXJlbnQgPSBwYXJlbnQ7CisgICAgbm9kZS0+bmV4dCA9IHBhcmVudC0+Y2hpbGQ7CisgICAgcGFyZW50LT5jaGlsZCA9IG5vZGU7CisgICAgcGFyZW50LT5yZWZjb3VudCsrOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgb3VyIHBhcmVudCBkaXJlY3RvcnkgYWxyZWFkeSBoYXMgYSBmaWxlIHdpdGggYSBuYW1lCisgKiB0aGF0IGRpZmZlcnMgb25seSBieSBjYXNlLiAgSWYgd2UgZmluZCBvbmUsIHN0b3JlIGl0IGluIHRoZSBhY3R1YWxfbmFtZQorICogZmllbGQgc28gbm9kZV9nZXRfcGF0aCB3aWxsIG1hcCBpdCB0byB0aGlzIGZpbGUgaW4gdGhlIHVuZGVybHlpbmcgc3RvcmFnZS4KKyAqLworc3RhdGljIHZvaWQgbm9kZV9maW5kX2FjdHVhbF9uYW1lKHN0cnVjdCBub2RlICpub2RlKQoreworICAgIGNoYXIgKnBhdGgsIGJ1ZmZlcltQQVRIX0JVRkZFUl9TSVpFXTsKKyAgICBjb25zdCBjaGFyICpub2RlX25hbWUgPSBub2RlLT5uYW1lOworICAgIERJUiogZGlyOworICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OworCisgICAgaWYgKCFub2RlLT5wYXJlbnQpIHJldHVybjsKKworICAgIHBhdGggPSBub2RlX2dldF9wYXRoKG5vZGUtPnBhcmVudCwgYnVmZmVyLCAwKTsKKyAgICBkaXIgPSBvcGVuZGlyKHBhdGgpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIEVSUk9SKCJvcGVuZGlyICVzIGZhaWxlZDogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqdGVzdF9uYW1lID0gZW50cnktPmRfbmFtZTsKKyAgICAgICAgaWYgKHN0cmNtcCh0ZXN0X25hbWUsIG5vZGVfbmFtZSkgJiYgIXN0cmNhc2VjbXAodGVzdF9uYW1lLCBub2RlX25hbWUpKSB7CisgICAgICAgICAgICAvKiB3ZSBoYXZlIGEgbWF0Y2ggLSBkaWZmZXJzIGJ1dCBvbmx5IGJ5IGNhc2UgKi8KKyAgICAgICAgICAgIG5vZGUtPmFjdHVhbF9uYW1lID0gc3RyZHVwKHRlc3RfbmFtZSk7CisgICAgICAgICAgICBpZiAoIW5vZGUtPmFjdHVhbF9uYW1lKSB7CisgICAgICAgICAgICAgICAgRVJST1IoInN0cmR1cCBmYWlsZWQgLSBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2VkaXIoZGlyKTsKK30KKwogc3RydWN0IG5vZGUgKm5vZGVfY3JlYXRlKHN0cnVjdCBub2RlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsIF9fdTY0IG5pZCwgX191NjQgZ2VuKQogewogICAgIHN0cnVjdCBub2RlICpub2RlOwogICAgIGludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOwogCi0gICAgbm9kZSA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG5vZGUpICsgbmFtZWxlbik7CisgICAgbm9kZSA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG5vZGUpKTsKICAgICBpZiAobm9kZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBub2RlLT5uYW1lID0gbWFsbG9jKG5hbWVsZW4gKyAxKTsKKyAgICBpZiAobm9kZS0+bmFtZSA9PSAwKSB7CisgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogICAgIG5vZGUtPm5pZCA9IG5pZDsKICAgICBub2RlLT5nZW4gPSBnZW47Ci0gICAgbm9kZS0+cGFyZW50ID0gcGFyZW50OwotICAgIG5vZGUtPm5leHQgPSBwYXJlbnQtPmNoaWxkOwotICAgIHBhcmVudC0+Y2hpbGQgPSBub2RlOworICAgIGFkZF9ub2RlX3RvX3BhcmVudChub2RlLCBwYXJlbnQpOwogICAgIG1lbWNweShub2RlLT5uYW1lLCBuYW1lLCBuYW1lbGVuICsgMSk7CiAgICAgbm9kZS0+bmFtZWxlbiA9IG5hbWVsZW47Ci0gICAgcGFyZW50LT5yZWZjb3VudCsrOwotCisgICAgbm9kZV9maW5kX2FjdHVhbF9uYW1lKG5vZGUpOwogICAgIHJldHVybiBub2RlOwogfQogCitzdGF0aWMgY2hhciAqcmVuYW1lX25vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgbm9kZS0+bmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBjaGFyICpuZXduYW1lID0gcmVhbGxvYyhub2RlLT5uYW1lLCBub2RlLT5uYW1lbGVuICsgMSk7CisgICAgaWYgKG5ld25hbWUgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbm9kZS0+bmFtZSA9IG5ld25hbWU7CisgICAgbWVtY3B5KG5vZGUtPm5hbWUsIG5hbWUsIG5vZGUtPm5hbWVsZW4gKyAxKTsKKyAgICBub2RlX2ZpbmRfYWN0dWFsX25hbWUobm9kZSk7CisgICAgcmV0dXJuIG5vZGUtPm5hbWU7Cit9CisKIHZvaWQgZnVzZV9pbml0KHN0cnVjdCBmdXNlICpmdXNlLCBpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAgICAgZnVzZS0+ZmQgPSBmZDsKQEAgLTIxOSwxNiArMzI2LDEwIEBACiAKICAgICBmdXNlLT5hbGwgPSAmZnVzZS0+cm9vdDsKIAorICAgIG1lbXNldCgmZnVzZS0+cm9vdCwgMCwgc2l6ZW9mKGZ1c2UtPnJvb3QpKTsKICAgICBmdXNlLT5yb290Lm5pZCA9IEZVU0VfUk9PVF9JRDsgLyogMSAqLwotICAgIGZ1c2UtPnJvb3QubmV4dCA9IDA7Ci0gICAgZnVzZS0+cm9vdC5jaGlsZCA9IDA7Ci0gICAgZnVzZS0+cm9vdC5wYXJlbnQgPSAwOwotCi0gICAgZnVzZS0+cm9vdC5hbGwgPSAwOwogICAgIGZ1c2UtPnJvb3QucmVmY291bnQgPSAyOwotCi0gICAgc3RyY3B5KGZ1c2UtPnJvb3QubmFtZSwgcGF0aCk7Ci0gICAgZnVzZS0+cm9vdC5uYW1lbGVuID0gc3RybGVuKGZ1c2UtPnJvb3QubmFtZSk7CisgICAgcmVuYW1lX25vZGUoJmZ1c2UtPnJvb3QsIHBhdGgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmlkX3RvX3B0cihfX3U2NCBuaWQpCkBAIC0yNzEsNiArMzcyLDM3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGRlY19yZWZjb3VudChzdHJ1Y3Qgbm9kZSAqbm9kZSkgeworICAgIGlmIChub2RlLT5yZWZjb3VudCA+IDApIHsKKyAgICAgICAgbm9kZS0+cmVmY291bnQtLTsKKyAgICAgICAgVFJBQ0UoImRlY19yZWZjb3VudCAlcCglcykgLT4gJWRcbiIsIG5vZGUsIG5vZGUtPm5hbWUsIG5vZGUtPnJlZmNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBFUlJPUigiWmVybyByZWZjbnQgJXBcbiIsIG5vZGUpOworICAgIH0KKyB9CisKK3N0YXRpYyBzdHJ1Y3Qgbm9kZSAqcmVtb3ZlX2NoaWxkKHN0cnVjdCBub2RlICpwYXJlbnQsIF9fdTY0IG5pZCkKK3sKKyAgICBzdHJ1Y3Qgbm9kZSAqcHJldiA9IDA7CisgICAgc3RydWN0IG5vZGUgKm5vZGU7CisKKyAgICBmb3IgKG5vZGUgPSBwYXJlbnQtPmNoaWxkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgICAgICBpZiAobm9kZS0+bmlkID09IG5pZCkgeworICAgICAgICAgICAgaWYgKHByZXYpIHsKKyAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyZW50LT5jaGlsZCA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlLT5uZXh0ID0gMDsKKyAgICAgICAgICAgIG5vZGUtPnBhcmVudCA9IDA7CisgICAgICAgICAgICBkZWNfcmVmY291bnQocGFyZW50KTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgICAgIHByZXYgPSBub2RlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RydWN0IG5vZGUgKm5vZGVfbG9va3VwKHN0cnVjdCBmdXNlICpmdXNlLCBzdHJ1Y3Qgbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmdXNlX2F0dHIgKmF0dHIpCiB7CkBAIC0zMDUsNyArNDM3LDcgQEAKIHZvaWQgbm9kZV9yZWxlYXNlKHN0cnVjdCBub2RlICpub2RlKQogewogICAgIFRSQUNFKCJSRUxFQVNFICVwICglcykgcmM9JWRcbiIsIG5vZGUsIG5vZGUtPm5hbWUsIG5vZGUtPnJlZmNvdW50KTsKLSAgICBub2RlLT5yZWZjb3VudC0tOworICAgIGRlY19yZWZjb3VudChub2RlKTsKICAgICBpZiAobm9kZS0+cmVmY291bnQgPT0gMCkgewogICAgICAgICBpZiAobm9kZS0+cGFyZW50LT5jaGlsZCA9PSBub2RlKSB7CiAgICAgICAgICAgICBub2RlLT5wYXJlbnQtPmNoaWxkID0gbm9kZS0+cGFyZW50LT5jaGlsZC0+bmV4dDsKQEAgLTMyNiw4ICs0NTgsMTAgQEAKICAgICAgICAgbm9kZS0+bmV4dCA9IDA7CiAKICAgICAgICAgICAgIC8qIFRPRE86IHJlbW92ZSBkZWJ1Z2dpbmcgLSBwb2lzb24gbWVtb3J5ICovCi0gICAgICAgIG1lbXNldChub2RlLCAweGVmLCBzaXplb2YoKm5vZGUpICsgc3RybGVuKG5vZGUtPm5hbWUpKTsKLQorICAgICAgICBtZW1zZXQobm9kZS0+bmFtZSwgMHhlZiwgbm9kZS0+bmFtZWxlbik7CisgICAgICAgIGZyZWUobm9kZS0+bmFtZSk7CisgICAgICAgIGZyZWUobm9kZS0+YWN0dWFsX25hbWUpOworICAgICAgICBtZW1zZXQobm9kZSwgMHhmYywgc2l6ZW9mKCpub2RlKSk7CiAgICAgICAgIGZyZWUobm9kZSk7CiAgICAgfQogfQpAQCAtNDI3LDcgKzU2MSw3IEBACiAgICAgICAgIHN0cnVjdCBmdXNlX2dldGF0dHJfaW4gKnJlcSA9IGRhdGE7CiAgICAgICAgIHN0cnVjdCBmdXNlX2F0dHJfb3V0IG91dDsKIAotICAgICAgICBUUkFDRSgiR0VUQVRUUiBmbGFncz0leCBmaD0lbGx4XG4iLHJlcS0+Z2V0YXR0cl9mbGFncywgcmVxLT5maCk7CisgICAgICAgIFRSQUNFKCJHRVRBVFRSIGZsYWdzPSV4IGZoPSVsbHhcbiIsIHJlcS0+Z2V0YXR0cl9mbGFncywgcmVxLT5maCk7CiAKICAgICAgICAgbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKICAgICAgICAgbm9kZV9nZXRfYXR0cihub2RlLCAmb3V0LmF0dHIpOwpAQCAtNDM5LDE1ICs1NzMsNjAgQEAKICAgICBjYXNlIEZVU0VfU0VUQVRUUjogeyAvKiBzZXRhdHRyX2luIC0+IGF0dHJfb3V0ICovCiAgICAgICAgIHN0cnVjdCBmdXNlX3NldGF0dHJfaW4gKnJlcSA9IGRhdGE7CiAgICAgICAgIHN0cnVjdCBmdXNlX2F0dHJfb3V0IG91dDsKKyAgICAgICAgY2hhciAqcGF0aCwgYnVmZmVyW1BBVEhfQlVGRkVSX1NJWkVdOworICAgICAgICBpbnQgcmVzID0gMDsKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVzWzJdOworCiAgICAgICAgIFRSQUNFKCJTRVRBVFRSIGZoPSVsbHggaWQ9JWxseCB2YWxpZD0leFxuIiwKICAgICAgICAgICAgICAgcmVxLT5maCwgaGRyLT5ub2RlaWQsIHJlcS0+dmFsaWQpOwogCi0gICAgICAgICAgICAvKiBYWFggKi8KKyAgICAgICAgLyogWFhYOiBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9uIHB1cnBvc2UuICAgY2htb2QvY2hvd24KKyAgICAgICAgICogc2hvdWxkIE5FVkVSIGJlIGltcGxlbWVudGVkLiovCiAKKyAgICAgICAgcGF0aCA9IG5vZGVfZ2V0X3BhdGgobm9kZSwgYnVmZmVyLCAwKTsKKyAgICAgICAgaWYgKHJlcS0+dmFsaWQgJiBGQVRUUl9TSVpFKQorICAgICAgICAgICAgcmVzID0gdHJ1bmNhdGUocGF0aCwgcmVxLT5zaXplKTsKKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIGdvdG8gZ2V0b3V0OworCisgICAgICAgIC8qIEhhbmRsZSBjaGFuZ2luZyBhdGltZSBhbmQgbXRpbWUuICBJZiBGQVRUUl9BVElNRV9hbmQgRkFUVFJfQVRJTUVfTk9XCisgICAgICAgICAqIGFyZSBib3RoIHNldCwgdGhlbiBzZXQgaXQgdG8gdGhlIGN1cnJlbnQgdGltZS4gIEVsc2UsIHNldCBpdCB0byB0aGUKKyAgICAgICAgICogdGltZSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuICBTYW1lIGdvZXMgZm9yIG10aW1lLiAgVXNlIHV0aW1lbnNhdCgyKQorICAgICAgICAgKiBhcyBpdCBhbGxvd3MgQVRJTUUgYW5kIE1USU1FIHRvIGJlIGNoYW5nZWQgaW5kZXBlbmRlbnRseSwgYW5kIGhhcworICAgICAgICAgKiBuYW5vc2Vjb25kIHJlc29sdXRpb24gd2hpY2ggZnVzZSBhbHNvIGhhcy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChyZXEtPnZhbGlkICYgKEZBVFRSX0FUSU1FIHwgRkFUVFJfTVRJTUUpKSB7CisgICAgICAgICAgICB0aW1lc1swXS50dl9uc2VjID0gVVRJTUVfT01JVDsKKyAgICAgICAgICAgIHRpbWVzWzFdLnR2X25zZWMgPSBVVElNRV9PTUlUOworICAgICAgICAgICAgaWYgKHJlcS0+dmFsaWQgJiBGQVRUUl9BVElNRSkgeworICAgICAgICAgICAgICAgIGlmIChyZXEtPnZhbGlkICYgRkFUVFJfQVRJTUVfTk9XKSB7CisgICAgICAgICAgICAgICAgICB0aW1lc1swXS50dl9uc2VjID0gVVRJTUVfTk9XOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB0aW1lc1swXS50dl9zZWMgPSByZXEtPmF0aW1lOworICAgICAgICAgICAgICAgICAgdGltZXNbMF0udHZfbnNlYyA9IHJlcS0+YXRpbWVuc2VjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXEtPnZhbGlkICYgRkFUVFJfTVRJTUUpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVxLT52YWxpZCAmIEZBVFRSX01USU1FX05PVykgeworICAgICAgICAgICAgICAgICAgdGltZXNbMV0udHZfbnNlYyA9IFVUSU1FX05PVzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdGltZXNbMV0udHZfc2VjID0gcmVxLT5tdGltZTsKKyAgICAgICAgICAgICAgICAgIHRpbWVzWzFdLnR2X25zZWMgPSByZXEtPm10aW1lbnNlYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUUkFDRSgiQ2FsbGluZyB1dGltZW5zYXQgb24gJXMgd2l0aCBhdGltZSAlbGQsIG10aW1lPSVsZFxuIiwgcGF0aCwgdGltZXNbMF0udHZfc2VjLCB0aW1lc1sxXS50dl9zZWMpOworICAgICAgICAgICAgcmVzID0gdXRpbWVuc2F0KC0xLCBwYXRoLCB0aW1lcywgMCk7CisgICAgICAgIH0KKworICAgICAgICBnZXRvdXQ6CiAgICAgICAgIG1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7CiAgICAgICAgIG5vZGVfZ2V0X2F0dHIobm9kZSwgJm91dC5hdHRyKTsKICAgICAgICAgb3V0LmF0dHJfdmFsaWQgPSAxMDsKLSAgICAgICAgZnVzZV9yZXBseShmdXNlLCBoZHItPnVuaXF1ZSwgJm91dCwgc2l6ZW9mKG91dCkpOworCisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICBmdXNlX3N0YXR1cyhmdXNlLCBoZHItPnVuaXF1ZSwgLWVycm5vKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnVzZV9yZXBseShmdXNlLCBoZHItPnVuaXF1ZSwgJm91dCwgc2l6ZW9mKG91dCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogLy8gICAgY2FzZSBGVVNFX1JFQURMSU5LOgpAQCAtNDU3LDYgKzYzNiw3IEBACiAgICAgICAgIGNoYXIgKnBhdGgsIGJ1ZmZlcltQQVRIX0JVRkZFUl9TSVpFXTsKICAgICAgICAgY2hhciAqbmFtZSA9ICgoY2hhciopIGRhdGEpICsgc2l6ZW9mKCpyZXEpOwogICAgICAgICBpbnQgcmVzOworCiAgICAgICAgIFRSQUNFKCJNS05PRCAlcyBAICVsbHhcbiIsIG5hbWUsIGhkci0+bm9kZWlkKTsKICAgICAgICAgcGF0aCA9IG5vZGVfZ2V0X3BhdGgobm9kZSwgYnVmZmVyLCBuYW1lKTsKIApAQCAtNDc1LDYgKzY1NSw3IEBACiAgICAgICAgIGNoYXIgKnBhdGgsIGJ1ZmZlcltQQVRIX0JVRkZFUl9TSVpFXTsKICAgICAgICAgY2hhciAqbmFtZSA9ICgoY2hhciopIGRhdGEpICsgc2l6ZW9mKCpyZXEpOwogICAgICAgICBpbnQgcmVzOworCiAgICAgICAgIFRSQUNFKCJNS0RJUiAlcyBAICVsbHggMCVvXG4iLCBuYW1lLCBoZHItPm5vZGVpZCwgcmVxLT5tb2RlKTsKICAgICAgICAgcGF0aCA9IG5vZGVfZ2V0X3BhdGgobm9kZSwgYnVmZmVyLCBuYW1lKTsKIApAQCAtNTExLDE5ICs2OTIsNDkgQEAKICAgICAgICAgY2hhciAqbmV3bmFtZSA9IG9sZG5hbWUgKyBzdHJsZW4ob2xkbmFtZSkgKyAxOwogICAgICAgICBjaGFyICpvbGRwYXRoLCBvbGRidWZmZXJbUEFUSF9CVUZGRVJfU0laRV07CiAgICAgICAgIGNoYXIgKm5ld3BhdGgsIG5ld2J1ZmZlcltQQVRIX0JVRkZFUl9TSVpFXTsKLSAgICAgICAgc3RydWN0IG5vZGUgKm5ld25vZGU7CisgICAgICAgIHN0cnVjdCBub2RlICp0YXJnZXQ7CisgICAgICAgIHN0cnVjdCBub2RlICpuZXdwYXJlbnQ7CiAgICAgICAgIGludCByZXM7CiAKLSAgICAgICAgbmV3bm9kZSA9IGxvb2t1cF9ieV9pbm9kZShmdXNlLCByZXEtPm5ld2Rpcik7Ci0gICAgICAgIGlmICghbmV3bm9kZSkgeworICAgICAgICBUUkFDRSgiUkVOQU1FICVzLT4lcyBAICVsbHhcbiIsIG9sZG5hbWUsIG5ld25hbWUsIGhkci0+bm9kZWlkKTsKKworICAgICAgICB0YXJnZXQgPSBsb29rdXBfY2hpbGRfYnlfbmFtZShub2RlLCBvbGRuYW1lKTsKKyAgICAgICAgaWYgKCF0YXJnZXQpIHsKICAgICAgICAgICAgIGZ1c2Vfc3RhdHVzKGZ1c2UsIGhkci0+dW5pcXVlLCAtRU5PRU5UKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCiAgICAgICAgIG9sZHBhdGggPSBub2RlX2dldF9wYXRoKG5vZGUsIG9sZGJ1ZmZlciwgb2xkbmFtZSk7Ci0gICAgICAgIG5ld3BhdGggPSBub2RlX2dldF9wYXRoKG5ld25vZGUsIG5ld2J1ZmZlciwgbmV3bmFtZSk7CisKKyAgICAgICAgbmV3cGFyZW50ID0gbG9va3VwX2J5X2lub2RlKGZ1c2UsIHJlcS0+bmV3ZGlyKTsKKyAgICAgICAgaWYgKCFuZXdwYXJlbnQpIHsKKyAgICAgICAgICAgIGZ1c2Vfc3RhdHVzKGZ1c2UsIGhkci0+dW5pcXVlLCAtRU5PRU5UKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3cGFyZW50ID09IG5vZGUpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgcmVuYW1pbmcgYSBmaWxlIHdoZXJlIGRlc3RpbmF0aW9uCisgICAgICAgICAgICAgKiBpcyBzYW1lIHBhdGggZGlmZmVyaW5nIG9ubHkgYnkgY2FzZS4KKyAgICAgICAgICAgICAqIEluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIGxvb2sgZm9yIGEgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaC4KKyAgICAgICAgICAgICAqIFRoaXMgYWxsb3dzIGNvbW1hbmRzIGxpa2UgIm12IGZvbyBGT08iIHRvIHdvcmsgYXMgZXhwZWN0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG5ld3BhdGggPSBkb19ub2RlX2dldF9wYXRoKG5ld3BhcmVudCwgbmV3YnVmZmVyLCBuZXduYW1lLCBOT19DQVNFX1NFTlNJVElWRV9NQVRDSCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdwYXRoID0gbm9kZV9nZXRfcGF0aChuZXdwYXJlbnQsIG5ld2J1ZmZlciwgbmV3bmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlbW92ZV9jaGlsZChub2RlLCB0YXJnZXQtPm5pZCkpIHsKKyAgICAgICAgICAgIEVSUk9SKCJSRU5BTUUgcmVtb3ZlX2NoaWxkIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgZnVzZV9zdGF0dXMoZnVzZSwgaGRyLT51bmlxdWUsIC1FTk9FTlQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghcmVuYW1lX25vZGUodGFyZ2V0LCBuZXduYW1lKSkgeworICAgICAgICAgICAgZnVzZV9zdGF0dXMoZnVzZSwgaGRyLT51bmlxdWUsIC1FTk9NRU0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFkZF9ub2RlX3RvX3BhcmVudCh0YXJnZXQsIG5ld3BhcmVudCk7CiAKICAgICAgICAgcmVzID0gcmVuYW1lKG9sZHBhdGgsIG5ld3BhdGgpOworICAgICAgICBUUkFDRSgiUkVOQU1FIHJlc3VsdCAlZFxuIiwgcmVzKTsKKwogICAgICAgICBmdXNlX3N0YXR1cyhmdXNlLCBoZHItPnVuaXF1ZSwgcmVzID8gLWVycm5vIDogMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01NjUsNyArNzc2LDcgQEAKICAgICAgICAgICAgIGZ1c2Vfc3RhdHVzKGZ1c2UsIGhkci0+dW5pcXVlLCAtRUlOVkFMKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICByZXMgPSBwcmVhZChoLT5mZCwgYnVmZmVyLCByZXEtPnNpemUsIHJlcS0+b2Zmc2V0KTsKKyAgICAgICAgcmVzID0gcHJlYWQ2NChoLT5mZCwgYnVmZmVyLCByZXEtPnNpemUsIHJlcS0+b2Zmc2V0KTsKICAgICAgICAgaWYgKHJlcyA8IDApIHsKICAgICAgICAgICAgIGZ1c2Vfc3RhdHVzKGZ1c2UsIGhkci0+dW5pcXVlLCBlcnJubyk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC01NzksNyArNzkwLDcgQEAKICAgICAgICAgc3RydWN0IGhhbmRsZSAqaCA9IGlkX3RvX3B0cihyZXEtPmZoKTsKICAgICAgICAgaW50IHJlczsKICAgICAgICAgVFJBQ0UoIldSSVRFICVwKCVkKSAldUAlbGx1XG4iLCBoLCBoLT5mZCwgcmVxLT5zaXplLCByZXEtPm9mZnNldCk7Ci0gICAgICAgIHJlcyA9IHB3cml0ZShoLT5mZCwgKChjaGFyKikgZGF0YSkgKyBzaXplb2YoKnJlcSksIHJlcS0+c2l6ZSwgcmVxLT5vZmZzZXQpOworICAgICAgICByZXMgPSBwd3JpdGU2NChoLT5mZCwgKChjaGFyKikgZGF0YSkgKyBzaXplb2YoKnJlcSksIHJlcS0+c2l6ZSwgcmVxLT5vZmZzZXQpOwogICAgICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICAgICAgZnVzZV9zdGF0dXMoZnVzZSwgaGRyLT51bmlxdWUsIGVycm5vKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTY2MSwxMyArODcyLDE5IEBACiAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmRlOwogICAgICAgICBzdHJ1Y3QgZGlyaGFuZGxlICpoID0gaWRfdG9fcHRyKHJlcS0+ZmgpOwogICAgICAgICBUUkFDRSgiUkVBRERJUiAlcFxuIiwgaCk7CisgICAgICAgIGlmIChyZXEtPm9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAvKiByZXdpbmRkaXIoKSBtaWdodCBoYXZlIGJlZW4gY2FsbGVkIGFib3ZlIHVzLCBzbyByZXdpbmQgaGVyZSB0b28gKi8KKyAgICAgICAgICAgIFRSQUNFKCJjYWxsaW5nIHJld2luZGRpcigpXG4iKTsKKyAgICAgICAgICAgIHJld2luZGRpcihoLT5kKTsKKyAgICAgICAgfQogICAgICAgICBkZSA9IHJlYWRkaXIoaC0+ZCk7CiAgICAgICAgIGlmICghZGUpIHsKICAgICAgICAgICAgIGZ1c2Vfc3RhdHVzKGZ1c2UsIGhkci0+dW5pcXVlLCAwKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmZGUtPmlubyA9IEZVU0VfVU5LTk9XTl9JTk87Ci0gICAgICAgIGZkZS0+b2ZmID0gMDsKKyAgICAgICAgLyogaW5jcmVtZW50IHRoZSBvZmZzZXQgc28gd2UgY2FuIGRldGVjdCB3aGVuIHJld2luZGRpcigpIHNlZWtzIGJhY2sgdG8gdGhlIGJlZ2lubmluZyAqLworICAgICAgICBmZGUtPm9mZiA9IHJlcS0+b2Zmc2V0ICsgMTsKICAgICAgICAgZmRlLT50eXBlID0gZGUtPmRfdHlwZTsKICAgICAgICAgZmRlLT5uYW1lbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOwogICAgICAgICBtZW1jcHkoZmRlLT5uYW1lLCBkZS0+ZF9uYW1lLCBmZGUtPm5hbWVsZW4gKyAxKTsKQEAgLTY5NSw3ICs5MTIsNyBAQAogICAgICAgICBvdXQubWFqb3IgPSBGVVNFX0tFUk5FTF9WRVJTSU9OOwogICAgICAgICBvdXQubWlub3IgPSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OOwogICAgICAgICBvdXQubWF4X3JlYWRhaGVhZCA9IHJlcS0+bWF4X3JlYWRhaGVhZDsKLSAgICAgICAgb3V0LmZsYWdzID0gMDsKKyAgICAgICAgb3V0LmZsYWdzID0gRlVTRV9BVE9NSUNfT19UUlVOQzsKICAgICAgICAgb3V0Lm1heF9iYWNrZ3JvdW5kID0gMzI7CiAgICAgICAgIG91dC5jb25nZXN0aW9uX3RocmVzaG9sZCA9IDMyOwogICAgICAgICBvdXQubWF4X3dyaXRlID0gMjU2ICogMTAyNDsKQEAgLTczNSwzMCArOTUyLDQ0IEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IHVzYWdlKCkKK3sKKyAgICBFUlJPUigidXNhZ2U6IHNkY2FyZCBbLWwgLWZdIDxwYXRoPiA8dWlkPiA8Z2lkPlxuXG5cdC1sIGZvcmNlIGZpbGUgbmFtZXMgdG8gbG93ZXIgY2FzZSB3aGVuIGNyZWF0aW5nIG5ldyBmaWxlc1xuXHQtZiBmaXggdXAgZmlsZSBzeXN0ZW0gYmVmb3JlIHN0YXJ0aW5nIChyZXBhaXJzIGJhZCBmaWxlIG5hbWUgY2FzZSBhbmQgZ3JvdXAgb3duZXJzaGlwKVxuIik7CisgICAgcmV0dXJuIC0xOworfQorCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAgICAgc3RydWN0IGZ1c2UgZnVzZTsKICAgICBjaGFyIG9wdHNbMjU2XTsKICAgICBpbnQgZmQ7CiAgICAgaW50IHJlczsKLSAgICB1bnNpZ25lZCB1aWQ7Ci0gICAgdW5zaWduZWQgZ2lkOwotICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqcGF0aCA9IE5VTEw7CisgICAgaW50IGk7CiAKLSAgICBpZiAoYXJnYyAhPSA0KSB7Ci0gICAgICAgIEVSUk9SKCJ1c2FnZTogc2RjYXJkIDxwYXRoPiA8dWlkPiA8Z2lkPlxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNoYXIqIGFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmICghcGF0aCkKKyAgICAgICAgICAgIHBhdGggPSBhcmc7CisgICAgICAgIGVsc2UgaWYgKHVpZCA9PSAtMSkKKyAgICAgICAgICAgIHVpZCA9IHN0cnRvdWwoYXJnLCAwLCAxMCk7CisgICAgICAgIGVsc2UgaWYgKGdpZCA9PSAtMSkKKyAgICAgICAgICAgIGdpZCA9IHN0cnRvdWwoYXJnLCAwLCAxMCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgRVJST1IoInRvbyBtYW55IGFyZ3VtZW50c1xuIik7CisgICAgICAgICAgICByZXR1cm4gdXNhZ2UoKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHVpZCA9IHN0cnRvdWwoYXJndlsyXSwgMCwgMTApOwotICAgIGdpZCA9IHN0cnRvdWwoYXJndlszXSwgMCwgMTApOwotICAgIGlmICghdWlkIHx8ICFnaWQpIHsKKyAgICBpZiAoIXBhdGgpIHsKKyAgICAgICAgRVJST1IoIm5vIHBhdGggc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHVzYWdlKCk7CisgICAgfQorICAgIGlmICh1aWQgPD0gMCB8fCBnaWQgPD0gMCkgewogICAgICAgICBFUlJPUigidWlkIGFuZCBnaWQgbXVzdCBiZSBub256ZXJvXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gdXNhZ2UoKTsKICAgICB9CiAKLSAgICBwYXRoID0gYXJndlsxXTsKLQogICAgICAgICAvKiBjbGVhbnVwIGZyb20gcHJldmlvdXMgaW5zdGFuY2UsIGlmIG5lY2Vzc2FyeSAqLwogICAgIHVtb3VudDIoTU9VTlRfUE9JTlQsIDIpOwogCmRpZmYgLS1naXQgYS9zaC9BbmRyb2lkLm1rIGIvc2gvQW5kcm9pZC5tawppbmRleCBiNWU1YzM4Li5kY2QxM2Q4IDEwMDY0NAotLS0gYS9zaC9BbmRyb2lkLm1rCisrKyBiL3NoL0FuZHJvaWQubWsKQEAgLTI5LDcgKzI5LDggQEAKIAlibHRpbi9lY2hvLmMgXAogCWluaXQuYwogCi1MT0NBTF9NT0RVTEU6PSBzaAorTE9DQUxfTU9EVUxFOj0gYXNoCitMT0NBTF9NT0RVTEVfVEFHUzo9IHNoZWxsX2FzaAogCiBMT0NBTF9DRkxBR1MgKz0gLURTSEVMTCAtRFdJVEhfTElORU5PSVNFCiAKQEAgLTUxLDMgKzUyLDE5IEBACiAJc2ggLi9ta2luaXQuc2ggJChQUklWQVRFX1NSQ19GSUxFUykgCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisKKyMgY3JlYXRlIC9zeXN0ZW0vYmluL3NoIHN5bWxpbmsgdG8gJChUQVJHRVRfU0hFTEwpCisjIG5vdCB0aGUgb3B0aW1hbCBwbGFjZSBmb3IgdGhpcywgYnV0IGEgZml0dGluZyBvbmUKKworT1VUU1lTVEVNQklOU0ggOj0gJChUQVJHRVRfT1VUKS9iaW4vc2gKK0xPQ0FMX01PRFVMRSA6PSBzeXN0ZW1iaW5zaAorJChPVVRTWVNURU1CSU5TSCk6IHwgJChUQVJHRVRfU0hFTEwpCiskKE9VVFNZU1RFTUJJTlNIKTogTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorJChPVVRTWVNURU1CSU5TSCk6CisJQGVjaG8gIlN5bWxpbms6ICRAIC0+ICQoVEFSR0VUX1NIRUxMKSIKKwlAcm0gLXJmICRACisJJChoaWRlKSBsbiAtc2YgJChUQVJHRVRfU0hFTEwpICRACisKK0FMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoT1VUU1lTVEVNQklOU0gpCitBTExfTU9EVUxFUy4kKExPQ0FMX01PRFVMRSkuSU5TVEFMTEVEICs9ICQoT1VUU1lTVEVNQklOU0gpCmRpZmYgLS1naXQgYS9zaC90cmFwLmMgYi9zaC90cmFwLmMKaW5kZXggN2NiNTIwMS4uZGNkNzZhYyAxMDA2NDQKLS0tIGEvc2gvdHJhcC5jCisrKyBiL3NoL3RyYXAuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCXAgKz0gMzsKIAogCWZvciAoaSA9IDA7IGkgPCBOU0lHOyArK2kpCi0JCWlmIChzdHJjYXNlY21wIChwLCBzeXNfc2lnbmFtZVtpXSkgPT0gMCkKKwkJaWYgKHN5c19zaWduYW1lW2ldICYmIChzdHJjYXNlY21wIChwLCBzeXNfc2lnbmFtZVtpXSkgPT0gMCkpCiAJCQlyZXR1cm4gaTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS90b29sYm94L0FuZHJvaWQubWsgYi90b29sYm94L0FuZHJvaWQubWsKaW5kZXggZWYzOTgwYS4uZDdhNjc1YSAxMDA2NDQKLS0tIGEvdG9vbGJveC9BbmRyb2lkLm1rCisrKyBiL3Rvb2xib3gvQW5kcm9pZC5tawpAQCAtNTQsMTMgKzU0LDE5IEBACiAJdm1zdGF0IFwKIAluYW5kcmVhZCBcCiAJaW9uaWNlIFwKKwl0b3VjaCBcCiAJbHNvZgogCitpZm5lcSAoLCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorVE9PTFMgKz0gcgorZW5kaWYKKwogTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWR5bmFycmF5LmMgXAogCXRvb2xib3guYyBcCiAJJChwYXRzdWJzdCAlLCUuYywkKFRPT0xTKSkKIAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGliYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGliYyBsaWJ1c2Job3N0CiAKIExPQ0FMX01PRFVMRTo9IHRvb2xib3gKIApkaWZmIC0tZ2l0IGEvdG9vbGJveC9jaG1vZC5jIGIvdG9vbGJveC9jaG1vZC5jCmluZGV4IDMxYTUzYmYuLjJhNTI0ZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvY2htb2QuYworKysgYi90b29sYm94L2NobW9kLmMKQEAgLTQsMTcgKzQsNzQgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9saW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCit2b2lkIHJlY3Vyc2VfY2htb2QoY2hhciogcGF0aCwgaW50IG1vZGUpCit7CisgICAgc3RydWN0IGRpcmVudCAqZHA7CisgICAgRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworICAgIGlmIChkaXIgPT0gTlVMTCkgeworICAgICAgICAvLyBub3QgYSBkaXJlY3RvcnksIGNhcnJ5IG9uCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2hhciAqc3VicGF0aCA9IG1hbGxvYyhzaXplb2YoY2hhcikqUEFUSF9NQVgpOworICAgIGludCBwYXRobGVuID0gc3RybGVuKHBhdGgpOworCisgICAgd2hpbGUgKChkcCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyY21wKGRwLT5kX25hbWUsICIuIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wKGRwLT5kX25hbWUsICIuLiIpID09IDApIGNvbnRpbnVlOworCisgICAgICAgIGlmIChzdHJsZW4oZHAtPmRfbmFtZSkgKyBwYXRobGVuICsgMi8qTlVMIGFuZCBzbGFzaCovID4gUEFUSF9NQVgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwYXRoIHNwZWNpZmllZDogdG9vIGxvbmdcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmNweShzdWJwYXRoLCBwYXRoKTsKKyAgICAgICAgc3RyY2F0KHN1YnBhdGgsICIvIik7CisgICAgICAgIHN0cmNhdChzdWJwYXRoLCBkcC0+ZF9uYW1lKTsKKworICAgICAgICBpZiAoY2htb2Qoc3VicGF0aCwgbW9kZSkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjaG1vZCAlczogJXNcbiIsIHN1YnBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgcmVjdXJzZV9jaG1vZChzdWJwYXRoLCBtb2RlKTsKKyAgICB9CisgICAgZnJlZShzdWJwYXRoKTsKKyAgICBjbG9zZWRpcihkaXIpOworfQorCitzdGF0aWMgaW50IHVzYWdlKCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBjaG1vZCBbT1BUSU9OXSA8TU9ERT4gPEZJTEU+XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLVIsIC0tcmVjdXJzaXZlICAgICAgICAgY2hhbmdlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyByZWN1cnNpdmVseVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIC0taGVscCAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0XG4iKTsKKworICAgIHJldHVybiAxMDsKK30KKwogaW50IGNobW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogICAgIGludCBpOwogCi0gICAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGNobW9kIDxNT0RFPiA8RklMRT5cbiIpOwotICAgICAgICByZXR1cm4gMTA7CisgICAgaWYgKGFyZ2MgPCAzIHx8IHN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkgeworICAgICAgICByZXR1cm4gdXNhZ2UoKTsKKyAgICB9CisKKyAgICBpbnQgcmVjdXJzaXZlID0gKHN0cmNtcChhcmd2WzFdLCAiLVIiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoYXJndlsxXSwgIi0tcmVjdXJzaXZlIikgPT0gMCkgPyAxIDogMDsKKworICAgIGlmIChyZWN1cnNpdmUgJiYgYXJnYyA8IDQpIHsKKyAgICAgICAgcmV0dXJuIHVzYWdlKCk7CisgICAgfQorCisgICAgaWYgKHJlY3Vyc2l2ZSkgeworICAgICAgICBhcmdjLS07CisgICAgICAgIGFyZ3YrKzsKICAgICB9CiAKICAgICBpbnQgbW9kZSA9IDA7CkBAIC0yOSwxMSArODYsMTUgQEAKICAgICAgICAgfQogICAgICAgICBzKys7CiAgICAgfQorCiAgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBpZiAoY2htb2QoYXJndltpXSwgbW9kZSkgPCAwKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjaG1vZCAlczogJXNcbiIsIGFyZ3ZbaV0sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICByZXR1cm4gMTA7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgeworICAgICAgICAgICAgcmVjdXJzZV9jaG1vZChhcmd2W2ldLCBtb2RlKTsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xib3gvY21wLmMgYi90b29sYm94L2NtcC5jCmluZGV4IDliZDJlMTkuLjgwNjM1YWQgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvY21wLmMKKysrIGIvdG9vbGJveC9jbXAuYwpAQCAtMiw2ICsyLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CmRpZmYgLS1naXQgYS90b29sYm94L2RhdGUuYyBiL3Rvb2xib3gvZGF0ZS5jCmluZGV4IDEzYjUyMTAuLjM1ZWY4NDYgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvZGF0ZS5jCisrKyBiL3Rvb2xib3gvZGF0ZS5jCkBAIC0xLDEwICsxLDEyIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfYWxhcm0uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KIAogc3RhdGljIHZvaWQgc2V0dGltZShjaGFyICpzKSB7CiAgICAgc3RydWN0IHRtIHRtOwpkaWZmIC0tZ2l0IGEvdG9vbGJveC9kZC5oIGIvdG9vbGJveC9kZC5oCmluZGV4IDc5NGE0NjQuLmNjYTEwMjQgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvZGQuaAorKysgYi90b29sYm94L2RkLmgKQEAgLTM1LDYgKzM1LDggQEAKICAqCUAoIylkZC5oCTguMyAoQmVya2VsZXkpIDQvMi85NAogICovCiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwogLyogSW5wdXQvb3V0cHV0IHN0cmVhbSBzdGF0ZS4gKi8KIHR5cGVkZWYgc3RydWN0IHsKIAl1X2NoYXIJCSpkYjsJCS8qIGJ1ZmZlciBhZGRyZXNzICovCmRpZmYgLS1naXQgYS90b29sYm94L2R5bmFycmF5LmMgYi90b29sYm94L2R5bmFycmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliN2IwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xib3gvZHluYXJyYXkuYwpAQCAtMCwwICsxLDEwMyBAQAorI2luY2x1ZGUgImR5bmFycmF5LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK3ZvaWQKK2R5bmFycmF5X2luaXQoIGR5bmFycmF5X3QgKmEgKQoreworICAgIGEtPmNvdW50ID0gYS0+Y2FwYWNpdHkgPSAwOworICAgIGEtPml0ZW1zID0gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZAorZHluYXJyYXlfcmVzZXJ2ZV9tb3JlKCBkeW5hcnJheV90ICphLCBpbnQgY291bnQgKQoreworICAgIGludCBvbGRfY2FwID0gYS0+Y2FwYWNpdHk7CisgICAgaW50IG5ld19jYXAgPSBvbGRfY2FwOworICAgIGNvbnN0IGludCBtYXhfY2FwID0gSU5UX01BWC9zaXplb2Yodm9pZCopOworICAgIHZvaWQqKiBuZXdfaXRlbXM7CisgICAgaW50IG5ld19jb3VudCA9IGEtPmNvdW50ICsgY291bnQ7CisKKyAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGNvdW50ID4gbWF4X2NhcCAtIGEtPmNvdW50KQorICAgICAgICBhYm9ydCgpOworCisgICAgbmV3X2NvdW50ID0gYS0+Y291bnQgKyBjb3VudDsKKworICAgIHdoaWxlIChuZXdfY2FwIDwgbmV3X2NvdW50KSB7CisgICAgICAgIG9sZF9jYXAgPSBuZXdfY2FwOworICAgICAgICBuZXdfY2FwICs9IChuZXdfY2FwID4+IDIpICsgNDsKKyAgICAgICAgaWYgKG5ld19jYXAgPCBvbGRfY2FwIHx8IG5ld19jYXAgPiBtYXhfY2FwKSB7CisgICAgICAgICAgICBuZXdfY2FwID0gbWF4X2NhcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZXdfaXRlbXMgPSByZWFsbG9jKGEtPml0ZW1zLCBuZXdfY2FwKnNpemVvZih2b2lkKikpOworICAgIGlmIChuZXdfaXRlbXMgPT0gTlVMTCkKKyAgICAgICAgYWJvcnQoKTsKKworICAgIGEtPml0ZW1zID0gbmV3X2l0ZW1zOworICAgIGEtPmNhcGFjaXR5ID0gbmV3X2NhcDsKK30KKwordm9pZAorZHluYXJyYXlfYXBwZW5kKCBkeW5hcnJheV90ICphLCB2b2lkKiBpdGVtICkKK3sKKyAgICBpZiAoYS0+Y291bnQgPj0gYS0+Y2FwYWNpdHkpCisgICAgICAgIGR5bmFycmF5X3Jlc2VydmVfbW9yZShhLCAxKTsKKworICAgIGEtPml0ZW1zW2EtPmNvdW50KytdID0gaXRlbTsKK30KKwordm9pZAorZHluYXJyYXlfZG9uZSggZHluYXJyYXlfdCAqYSApCit7CisgICAgZnJlZShhLT5pdGVtcyk7CisgICAgYS0+aXRlbXMgPSBOVUxMOworICAgIGEtPmNvdW50ID0gYS0+Y2FwYWNpdHkgPSAwOworfQorCisvLyBzdHJpbmcgYXJyYXlzCisKK3ZvaWQgc3RybGlzdF9pbml0KCBzdHJsaXN0X3QgKmxpc3QgKQoreworICAgIGR5bmFycmF5X2luaXQobGlzdCk7Cit9CisKK3ZvaWQgc3RybGlzdF9hcHBlbmRfYiggc3RybGlzdF90ICpsaXN0LCBjb25zdCB2b2lkKiBzdHIsIHNpemVfdCAgc2xlbiApCit7CisgICAgY2hhciAqY29weSA9IG1hbGxvYyhzbGVuKzEpOworICAgIG1lbWNweShjb3B5LCBzdHIsIHNsZW4pOworICAgIGNvcHlbc2xlbl0gPSAnXDAnOworICAgIGR5bmFycmF5X2FwcGVuZChsaXN0LCBjb3B5KTsKK30KKwordm9pZCBzdHJsaXN0X2FwcGVuZF9kdXAoIHN0cmxpc3RfdCAqbGlzdCwgY29uc3QgY2hhciAqc3RyKQoreworICAgIHN0cmxpc3RfYXBwZW5kX2IobGlzdCwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK3ZvaWQgc3RybGlzdF9kb25lKCBzdHJsaXN0X3QgKmxpc3QgKQoreworICAgIFNUUkxJU1RfRk9SRUFDSChsaXN0LCBzdHJpbmcsIGZyZWUoc3RyaW5nKSk7CisgICAgZHluYXJyYXlfZG9uZShsaXN0KTsKK30KKworc3RhdGljIGludCBzdHJsaXN0X2NvbXBhcmVfc3RyaW5ncyhjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiKQoreworICAgIGNvbnN0IGNoYXIgKnNhID0gKihjb25zdCBjaGFyICoqKWE7CisgICAgY29uc3QgY2hhciAqc2IgPSAqKGNvbnN0IGNoYXIgKiopYjsKKyAgICByZXR1cm4gc3RyY21wKHNhLCBzYik7Cit9CisKK3ZvaWQgc3RybGlzdF9zb3J0KCBzdHJsaXN0X3QgKmxpc3QgKQoreworICAgIGlmIChsaXN0LT5jb3VudCA+IDApIHsKKyAgICAgICAgcXNvcnQobGlzdC0+aXRlbXMsCisgICAgICAgICAgICAgIChzaXplX3QpbGlzdC0+Y291bnQsCisgICAgICAgICAgICAgIHNpemVvZih2b2lkKiksCisgICAgICAgICAgICAgIHN0cmxpc3RfY29tcGFyZV9zdHJpbmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29sYm94L2R5bmFycmF5LmggYi90b29sYm94L2R5bmFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZmIzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xib3gvZHluYXJyYXkuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIERZTkFSUkFZX0gKKyNkZWZpbmUgRFlOQVJSQVlfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIHNpbXBsZSBkeW5hbWljIGFycmF5IG9mIHBvaW50ZXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNvdW50OworICAgIGludCBjYXBhY2l0eTsKKyAgICB2b2lkKiogaXRlbXM7Cit9IGR5bmFycmF5X3Q7CisKKyNkZWZpbmUgRFlOQVJSQVlfSU5JVElBTElaRVIgIHsgMCwgMCwgTlVMTCB9CisKK3ZvaWQgZHluYXJyYXlfaW5pdCggZHluYXJyYXlfdCAqYSApOwordm9pZCBkeW5hcnJheV9kb25lKCBkeW5hcnJheV90ICphICk7CisKK3ZvaWQgZHluYXJyYXlfYXBwZW5kKCBkeW5hcnJheV90ICphLCB2b2lkKiBpdGVtICk7CisKKy8qIFVzZWQgdG8gaXRlcmF0ZSBvdmVyIGEgZHluYXJyYXlfdAorICogX2FycmF5IDo6IHBvaW50ZXIgdG8gdGhlIGFycmF5CisgKiBfaXRlbV90eXBlIDo6IHR5cGUgb2Ygb2JqZWN0cyBwb2ludGVkIHRvIGJ5IHRoZSBhcnJheQorICogX2l0ZW0gICAgICA6OiBuYW1lIG9mIGEgbG9jYWwgdmFyaWFibGUgZGVmaW5lZCB3aXRoaW4gdGhlIGxvb3AKKyAqICAgICAgICAgICAgICAgd2l0aCB0eXBlICdfaXRlbV90eXBlJworICogX3N0bW50ICAgICA6OiBDIHN0YXRlbWVudCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgaW4gZWFjaCBpdGVyYXRpb24uCisgKgorICogWW91IGNhc2UgdXNlICdicmVhaycgYW5kICdjb250aW51ZScgd2l0aGluIF9zdG1udAorICoKKyAqIFRoaXMgbWFjcm8gaXMgb25seSBpbnRlbmRlZCBmb3Igc2ltcGxlIHVzZXMuIEkuZS4gZG8gbm90IGFkZCBvcgorICogcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGFycmF5IGR1cmluZyBpdGVyYXRpb24uCisgKi8KKyNkZWZpbmUgRFlOQVJSQVlfRk9SRUFDSF9UWVBFKF9hcnJheSxfaXRlbV90eXBlLF9pdGVtLF9zdG1udCkgXAorICAgIGRvIHsgXAorICAgICAgICBpbnQgX25uXyMjX19MSU5FX18gPSAwOyBcCisgICAgICAgIGZvciAoO19ubl8jI19fTElORV9fIDwgKF9hcnJheSktPmNvdW50OyArKyBfbm5fIyNfX0xJTkVfXykgeyBcCisgICAgICAgICAgICBfaXRlbV90eXBlIF9pdGVtID0gKF9pdGVtX3R5cGUpKF9hcnJheSktPml0ZW1zW19ubl8jI19fTElORV9fXTsgXAorICAgICAgICAgICAgX3N0bW50OyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRFlOQVJSQVlfRk9SRUFDSChfYXJyYXksX2l0ZW0sX3N0bW50KSBcCisgICAgRFlOQVJSQVlfRk9SRUFDSF9UWVBFKF9hcnJheSx2b2lkICosX2l0ZW0sX3N0bW50KQorCisvKiBTaW1wbGUgZHluYW1pYyBzdHJpbmcgYXJyYXlzCisgKgorICogTk9URTogQSBzdHJsaXN0X3Qgb3ducyB0aGUgc3RyaW5ncyBpdCByZWZlcmVuY2VzLgorICovCit0eXBlZGVmIGR5bmFycmF5X3QgIHN0cmxpc3RfdDsKKworI2RlZmluZSAgU1RSTElTVF9JTklUSUFMSVpFUiAgRFlOQVJSQVlfSU5JVElBTElaRVIKKworLyogVXNlZCB0byBpdGVyYXRlIG92ZXIgYSBzdHJsaXN0X3QKKyAqIF9saXN0ICAgOjogcG9pbnRlciB0byBzdHJsaXN0X3Qgb2JqZWN0CisgKiBfc3RyaW5nIDo6IG5hbWUgb2YgbG9jYWwgdmFyaWFibGUgbmFtZSBkZWZpbmVkIHdpdGhpbiB0aGUgbG9vcCB3aXRoCisgKiAgICAgICAgICAgIHR5cGUgJ2NoYXIqJworICogX3N0bW50ICA6OiBDIHN0YXRlbWVudCBleGVjdXRlZCBpbiBlYWNoIGl0ZXJhdGlvbgorICoKKyAqIFRoaXMgbWFjcm8gaXMgb25seSBpbnRlbmRlZCBmb3Igc2ltcGxlIHVzZXMuIERvIG5vdCBhZGQgb3IgcmVtb3ZlIGl0ZW1zCisgKiB0by9mcm9tIHRoZSBsaXN0IGR1cmluZyBpdGVyYXRpb24uCisgKi8KKyNkZWZpbmUgIFNUUkxJU1RfRk9SRUFDSChfbGlzdCxfc3RyaW5nLF9zdG1udCkgXAorICAgIERZTkFSUkFZX0ZPUkVBQ0hfVFlQRShfbGlzdCxjaGFyICosX3N0cmluZyxfc3RtbnQpCisKK3ZvaWQgc3RybGlzdF9pbml0KCBzdHJsaXN0X3QgKmxpc3QgKTsKKworLyogbm90ZTogc3RybGlzdF9kb25lIHdpbGwgZnJlZSBhbGwgdGhlIHN0cmluZ3Mgb3duZWQgYnkgdGhlIGxpc3QgKi8KK3ZvaWQgc3RybGlzdF9kb25lKCBzdHJsaXN0X3QgKmxpc3QgKTsKKworLyogYXBwZW5kIGEgbmV3IHN0cmluZyBtYWRlIG9mIHRoZSBmaXJzdCAnc2xlbicgY2hhcmFjdGVycyBmcm9tICdzdHInCisgKiBmb2xsb3dlZCBieSBhIHRyYWlsaW5nIHplcm8uCisgKi8KK3ZvaWQgc3RybGlzdF9hcHBlbmRfYiggc3RybGlzdF90ICpsaXN0LCBjb25zdCB2b2lkKiBzdHIsIHNpemVfdCAgc2xlbiApOworCisvKiBhcHBlbmQgdGhlIGNvcHkgb2YgYSBnaXZlbiBpbnB1dCBzdHJpbmcgdG8gYSBzdHJsaXN0X3QgKi8KK3ZvaWQgc3RybGlzdF9hcHBlbmRfZHVwKCBzdHJsaXN0X3QgKmxpc3QsIGNvbnN0IGNoYXIgKnN0cik7CisKKy8qIHNvcnQgdGhlIHN0cmluZ3MgaW4gYSBnaXZlbiBsaXN0ICh1c2luZyBzdHJjbXApICovCit2b2lkIHN0cmxpc3Rfc29ydCggc3RybGlzdF90ICpsaXN0ICk7CisKKyNlbmRpZiAvKiBEWU5BUlJBWV9IICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9nZXRwcm9wLmMgYi90b29sYm94L2dldHByb3AuYwppbmRleCBmYzgwYTRkLi5jMDAxZmRhIDEwMDY0NAotLS0gYS90b29sYm94L2dldHByb3AuYworKysgYi90b29sYm94L2dldHByb3AuYwpAQCAtMSwxMyArMSwzNCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8c3lzL3N5c3RlbV9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiZHluYXJyYXkuaCIKIAotc3RhdGljIHZvaWQgcHJvcGxpc3QoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCitzdGF0aWMgdm9pZCByZWNvcmRfcHJvcChjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIG9wYXF1ZSkKIHsKLSAgICBwcmludGYoIlslc106IFslc11cbiIsIGtleSwgbmFtZSk7CisgICAgc3RybGlzdF90KiBsaXN0ID0gb3BhcXVlOworICAgIGNoYXIgdGVtcFtQUk9QX1ZBTFVFX01BWCArIFBST1BfTkFNRV9NQVggKyAxNl07CisgICAgc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICJbJXNdOiBbJXNdIiwga2V5LCBuYW1lKTsKKyAgICBzdHJsaXN0X2FwcGVuZF9kdXAobGlzdCwgdGVtcCk7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfcHJvcGVydGllcyh2b2lkKQoreworICAgIHN0cmxpc3RfdCAgbGlzdFsxXSA9IHsgU1RSTElTVF9JTklUSUFMSVpFUiB9OworCisgICAgLyogUmVjb3JkIHByb3BlcnRpZXMgaW4gdGhlIHN0cmluZyBsaXN0ICovCisgICAgKHZvaWQpcHJvcGVydHlfbGlzdChyZWNvcmRfcHJvcCwgbGlzdCk7CisKKyAgICAvKiBTb3J0IGV2ZXJ5dGhpbmcgKi8KKyAgICBzdHJsaXN0X3NvcnQobGlzdCk7CisKKyAgICAvKiBwcmludCBldmVyeXRoaW5nICovCisgICAgU1RSTElTVF9GT1JFQUNIKGxpc3QsIHN0ciwgcHJpbnRmKCIlc1xuIiwgc3RyKSk7CisKKyAgICAvKiB2b2lsYSAqLworICAgIHN0cmxpc3RfZG9uZShsaXN0KTsKIH0KIAogaW50IF9fc3lzdGVtX3Byb3BlcnR5X3dhaXQocHJvcF9pbmZvICpwaSk7CkBAIC0xNyw3ICszOCw3IEBACiAgICAgaW50IG4gPSAwOwogCiAgICAgaWYgKGFyZ2MgPT0gMSkgewotICAgICAgICAodm9pZClwcm9wZXJ0eV9saXN0KHByb3BsaXN0LCBOVUxMKTsKKyAgICAgICAgbGlzdF9wcm9wZXJ0aWVzKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgICAgICBjaGFyICpkZWZhdWx0X3ZhbHVlOwpkaWZmIC0tZ2l0IGEvdG9vbGJveC9oZC5jIGIvdG9vbGJveC9oZC5jCmluZGV4IDFmN2QxNzkuLmRhMzEyNDUgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvaGQuYworKysgYi90b29sYm94L2hkLmMKQEAgLTIsNiArMiw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpkaWZmIC0tZ2l0IGEvdG9vbGJveC9pbnNtb2QuYyBiL3Rvb2xib3gvaW5zbW9kLmMKaW5kZXggNDRiOTg0Ny4uNzU2YTY0YiAxMDA2NDQKLS0tIGEvdG9vbGJveC9pbnNtb2QuYworKysgYi90b29sYm94L2luc21vZC5jCkBAIC03Nyw3ICs3Nyw2IEBACiAJCQltZW1jcHkocHRyLCBhcmd2W2ldLCBsZW4pOwogCQkJcHRyICs9IGxlbjsKIAkJCSpwdHIrKyA9ICcgJzsKLQkJCSpwdHIrKyA9ICdcMCc7CiAJCX0KIAkJKihwdHIgLSAxKSA9ICdcMCc7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9pb2N0bC5jIGIvdG9vbGJveC9pb2N0bC5jCmluZGV4IGUyOGYyYTQuLmZiNTU1ZDIgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvaW9jdGwuYworKysgYi90b29sYm94L2lvY3RsLmMKQEAgLTEsMTEgKzEsMTQgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2QuaD4KICNpbmNsdWRlIDxsaW51eC92dC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogCiBpbnQgaW9jdGxfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpkaWZmIC0tZ2l0IGEvdG9vbGJveC9scy5jIGIvdG9vbGJveC9scy5jCmluZGV4IDg3OTk1MTQuLmIwOGUzNzggMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvbHMuYworKysgYi90b29sYm94L2xzLmMKQEAgLTEzLDYgKzEzLDkgQEAKICNpbmNsdWRlIDxncnAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAiZHluYXJyYXkuaCIKIAogLy8gYml0cyBmb3IgZmxhZ3MgYXJndW1lbnQKICNkZWZpbmUgTElTVF9MT05HICAgICAgICAgICAoMSA8PCAwKQpAQCAtMjAsNiArMjMsNyBAQAogI2RlZmluZSBMSVNUX1JFQ1VSU0lWRSAgICAgICgxIDw8IDIpCiAjZGVmaW5lIExJU1RfRElSRUNUT1JJRVMgICAgKDEgPDwgMykKICNkZWZpbmUgTElTVF9TSVpFICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBMSVNUX0xPTkdfTlVNRVJJQyAgICgxIDw8IDUpCiAKIC8vIGZ3ZAogc3RhdGljIGludCBsaXN0cGF0aChjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOwpAQCAtNDEsNyArNDUsNyBAQAogc3RhdGljIHZvaWQgbW9kZTJzdHIodW5zaWduZWQgbW9kZSwgY2hhciAqb3V0KQogewogICAgICpvdXQrKyA9IG1vZGUya2luZChtb2RlKTsKLSAgICAKKwogICAgICpvdXQrKyA9IChtb2RlICYgMDQwMCkgPyAncicgOiAnLSc7CiAgICAgKm91dCsrID0gKG1vZGUgJiAwMjAwKSA/ICd3JyA6ICctJzsKICAgICBpZihtb2RlICYgMDQwMDApIHsKQEAgLTE1NSwxMiArMTU5LDE3IEBACiAgICAgfQogCiAgICAgbW9kZTJzdHIocy5zdF9tb2RlLCBtb2RlKTsKLSAgICB1c2VyMnN0cihzLnN0X3VpZCwgdXNlcik7Ci0gICAgZ3JvdXAyc3RyKHMuc3RfZ2lkLCBncm91cCk7CisgICAgaWYgKGZsYWdzICYgTElTVF9MT05HX05VTUVSSUMpIHsKKyAgICAgICAgc3ByaW50Zih1c2VyLCAiJWxkIiwgcy5zdF91aWQpOworICAgICAgICBzcHJpbnRmKGdyb3VwLCAiJWxkIiwgcy5zdF9naWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVzZXIyc3RyKHMuc3RfdWlkLCB1c2VyKTsKKyAgICAgICAgZ3JvdXAyc3RyKHMuc3RfZ2lkLCBncm91cCk7CisgICAgfQogCiAgICAgc3RyZnRpbWUoZGF0ZSwgMzIsICIlWS0lbS0lZCAlSDolTSIsIGxvY2FsdGltZSgoY29uc3QgdGltZV90Kikmcy5zdF9tdGltZSkpOwogICAgIGRhdGVbMzFdID0gMDsKLSAgICAKKwogLy8gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAKIC8vIE1NTU1NTU1NIFVVVVVVVVVVIEdHR0dHR0dHRyBYWFhYWFhYWCBZWVlZLU1NLUREIEhIOk1NIE5BTUUgKC0+TElOSykKIApAQCAtMTY4LDcgKzE3Nyw3IEBACiAgICAgY2FzZSBTX0lGQkxLOgogICAgIGNhc2UgU19JRkNIUjoKICAgICAgICAgcHJpbnRmKCIlcyAlLThzICUtOHMgJTNkLCAlM2QgJXMgJXNcbiIsCi0gICAgICAgICAgICAgICBtb2RlLCB1c2VyLCBncm91cCwgCisgICAgICAgICAgICAgICBtb2RlLCB1c2VyLCBncm91cCwKICAgICAgICAgICAgICAgIChpbnQpIE1BSk9SKHMuc3RfcmRldiksIChpbnQpIE1JTk9SKHMuc3RfcmRldiksCiAgICAgICAgICAgICAgICBkYXRlLCBuYW1lKTsKICAgICAgICAgYnJlYWs7CkBAIC0xODIsNyArMTkxLDcgQEAKIAogICAgICAgICBsZW4gPSByZWFkbGluayhwYXRoLCBsaW5rdG8sIDI1Nik7CiAgICAgICAgIGlmKGxlbiA8IDApIHJldHVybiAtMTsKLSAgICAgICAgCisKICAgICAgICAgaWYobGVuID4gMjU1KSB7CiAgICAgICAgICAgICBsaW5rdG9bMjUyXSA9ICcuJzsKICAgICAgICAgICAgIGxpbmt0b1syNTNdID0gJy4nOwpAQCAtMTkxLDcgKzIwMCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHJpbnRmKCIlcyAlLThzICUtOHMgICAgICAgICAgJXMgJXMgLT4gJXNcbiIsCiAgICAgICAgICAgICAgICBtb2RlLCB1c2VyLCBncm91cCwgZGF0ZSwgbmFtZSwgbGlua3RvKTsKICAgICAgICAgYnJlYWs7CkBAIC0yMzMsNiArMjQyLDcgQEAKICAgICBjaGFyIHRtcFs0MDk2XTsKICAgICBESVIgKmQ7CiAgICAgc3RydWN0IGRpcmVudCAqZGU7CisgICAgc3RybGlzdF90ICBmaWxlcyA9IFNUUkxJU1RfSU5JVElBTElaRVI7CiAKICAgICBkID0gb3BlbmRpcihuYW1lKTsKICAgICBpZihkID09IDApIHsKQEAgLTI0OCwxMCArMjU4LDE2IEBACiAgICAgICAgIGlmICghc3RyY21wKGRlLT5kX25hbWUsICIuIikgfHwgIXN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSkgY29udGludWU7CiAgICAgICAgIGlmKGRlLT5kX25hbWVbMF0gPT0gJy4nICYmIChmbGFncyAmIExJU1RfQUxMKSA9PSAwKSBjb250aW51ZTsKIAotICAgICAgICBsaXN0ZmlsZShuYW1lLCBkZS0+ZF9uYW1lLCBmbGFncyk7CisgICAgICAgIHN0cmxpc3RfYXBwZW5kX2R1cCgmZmlsZXMsIGRlLT5kX25hbWUpOwogICAgIH0KIAorICAgIHN0cmxpc3Rfc29ydCgmZmlsZXMpOworICAgIFNUUkxJU1RfRk9SRUFDSCgmZmlsZXMsIGZpbGVuYW1lLCBsaXN0ZmlsZShuYW1lLCBmaWxlbmFtZSwgZmxhZ3MpKTsKKyAgICBzdHJsaXN0X2RvbmUoJmZpbGVzKTsKKwogICAgIGlmIChmbGFncyAmIExJU1RfUkVDVVJTSVZFKSB7CisgICAgICAgIHN0cmxpc3RfdCBzdWJkaXJzID0gU1RSTElTVF9JTklUSUFMSVpFUjsKKwogICAgICAgICByZXdpbmRkaXIoZCk7CiAKICAgICAgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpICE9IDApIHsKQEAgLTI4NCwxMCArMzAwLDE1IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChTX0lTRElSKHMuc3RfbW9kZSkpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuJXM6XG4iLCB0bXApOwotICAgICAgICAgICAgICAgIGxpc3RkaXIodG1wLCBmbGFncyk7CisgICAgICAgICAgICAgICAgc3RybGlzdF9hcHBlbmRfZHVwKCZzdWJkaXJzLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHN0cmxpc3Rfc29ydCgmc3ViZGlycyk7CisgICAgICAgIFNUUkxJU1RfRk9SRUFDSCgmc3ViZGlycywgcGF0aCwgeworICAgICAgICAgICAgcHJpbnRmKCJcbiVzOlxuIiwgcGF0aCk7CisgICAgICAgICAgICBsaXN0ZGlyKHBhdGgsIGZsYWdzKTsKKyAgICAgICAgfSk7CisgICAgICAgIHN0cmxpc3RfZG9uZSgmc3ViZGlycyk7CiAgICAgfQogCiAgICAgY2xvc2VkaXIoZCk7CkBAIC0zMjcsMzMgKzM0OCw0NyBAQAogewogICAgIGludCBmbGFncyA9IDA7CiAgICAgaW50IGxpc3RlZCA9IDA7Ci0gICAgCisKICAgICBpZihhcmdjID4gMSkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgIHN0cmxpc3RfdCAgZmlsZXMgPSBTVFJMSVNUX0lOSVRJQUxJWkVSOwogCiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbCIpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTElTVF9MT05HOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItcyIpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTElTVF9TSVpFOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYSIpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTElTVF9BTEw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1SIikpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBMSVNUX1JFQ1VSU0lWRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWQiKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IExJU1RfRElSRUNUT1JJRVM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxpc3RlZCsrOwotICAgICAgICAgICAgICAgIGlmKGxpc3RwYXRoKGFyZ3ZbaV0sIGZsYWdzKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeworICAgICAgICAgICAgICAgIC8qIGFuIG9wdGlvbiA/ICovCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXSsxOworICAgICAgICAgICAgICAgIHdoaWxlIChhcmdbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcmdbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6IGZsYWdzIHw9IExJU1RfTE9ORzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOiBmbGFncyB8PSBMSVNUX0xPTkcgfCBMSVNUX0xPTkdfTlVNRVJJQzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOiBmbGFncyB8PSBMSVNUX1NJWkU7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzogZmxhZ3MgfD0gTElTVF9SRUNVUlNJVkU7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzogZmxhZ3MgfD0gTElTVF9ESVJFQ1RPUklFUzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOiBmbGFncyB8PSBMSVNUX0FMTDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBVbmtub3duIG9wdGlvbiAnLSVjJy4gQWJvcnRpbmcuXG4iLCAibHMiLCBhcmdbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcmcrKzsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBvcHRpb24gPyAqLworICAgICAgICAgICAgICAgIHN0cmxpc3RfYXBwZW5kX2R1cCgmZmlsZXMsIGFyZ3ZbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGxpc3RlZCAgPiAwKSByZXR1cm4gZXJyOworICAgICAgICBpZiAoZmlsZXMuY291bnQgPiAwKSB7CisgICAgICAgICAgICBTVFJMSVNUX0ZPUkVBQ0goJmZpbGVzLCBwYXRoLCB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RwYXRoKHBhdGgsIGZsYWdzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHN0cmxpc3RfZG9uZSgmZmlsZXMpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvLyBsaXN0IHdvcmtpbmcgZGlyZWN0b3J5IGlmIG5vIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdlcmUgc3BlY2lmaWVkICAgIAorCisgICAgLy8gbGlzdCB3b3JraW5nIGRpcmVjdG9yeSBpZiBubyBmaWxlcyBvciBkaXJlY3RvcmllcyB3ZXJlIHNwZWNpZmllZAogICAgIHJldHVybiBsaXN0cGF0aCgiLiIsIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xib3gvbHNvZi5jIGIvdG9vbGJveC9sc29mLmMKaW5kZXggOTk4OTFkYi4uYzU1Mzg0YiAxMDA2NDQKLS0tIGEvdG9vbGJveC9sc29mLmMKKysrIGIvdG9vbGJveC9sc29mLmMKQEAgLTE5NiwyOCArMTk2LDM3IEBACiAKIGludCBsc29mX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKLSAgICBESVIgKmRpciA9IG9wZW5kaXIoIi9wcm9jIik7Ci0gICAgaWYgKGRpciA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3Qgb3BlbiAvcHJvY1xuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBsb25nIGludCBwaWQgPSAwOworICAgIGNoYXIqIGVuZHB0cjsKKyAgICBpZiAoYXJnYyA9PSAyKSB7CisgICAgICAgIHBpZCA9IHN0cnRvbChhcmd2WzFdLCAmZW5kcHRyLCAxMCk7CiAgICAgfQogCiAgICAgcHJpbnRfaGVhZGVyKCk7CiAKLSAgICBzdHJ1Y3QgZGlyZW50KiBkZTsKLSAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSkgewotICAgICAgICBpZiAoIXN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBPbmx5IGluc3BlY3QgZGlyZWN0b3JpZXMgdGhhdCBhcmUgUElEIG51bWJlcnMKLSAgICAgICAgY2hhciogZW5kcHRyOwotICAgICAgICBsb25nIGludCBwaWQgPSBzdHJ0b2woZGUtPmRfbmFtZSwgJmVuZHB0ciwgMTApOwotICAgICAgICBpZiAoKmVuZHB0ciAhPSAnXDAnKQotICAgICAgICAgICAgY29udGludWU7Ci0KKyAgICBpZiAocGlkKSB7CiAgICAgICAgIGxzb2ZfZHVtcGluZm8ocGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBESVIgKmRpciA9IG9wZW5kaXIoIi9wcm9jIik7CisgICAgICAgIGlmIChkaXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZG4ndCBvcGVuIC9wcm9jXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBkaXJlbnQqIGRlOworICAgICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSB8fCAhc3RyY21wKGRlLT5kX25hbWUsICIuLiIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBPbmx5IGluc3BlY3QgZGlyZWN0b3JpZXMgdGhhdCBhcmUgUElEIG51bWJlcnMKKyAgICAgICAgICAgICAgICBwaWQgPSBzdHJ0b2woZGUtPmRfbmFtZSwgJmVuZHB0ciwgMTApOworICAgICAgICAgICAgaWYgKCplbmRwdHIgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbHNvZl9kdW1waW5mbyhwaWQpOworICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKGRpcik7CiAgICAgfQotICAgIGNsb3NlZGlyKGRpcik7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xib3gvbHN1c2IuYyBiL3Rvb2xib3gvbHN1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZlNzRiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbGJveC9sc3VzYi5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGNoYXIgc3RyX2J1ZmZbNDA5Nl07CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfc3RyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpZCkKK3sKKyAgICBjaGFyICpzdHIgPSB1c2JfZGV2aWNlX2dldF9zdHJpbmcoZGV2LCBpZCk7CisKKyAgICBpZiAoaWQgJiYgc3RyKSB7CisgICAgICAgIHN0cmxjcHkoc3RyX2J1ZmYsIHN0ciwgc2l6ZW9mKHN0cl9idWZmKSk7CisgICAgICAgIGZyZWUoc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihzdHJfYnVmZiwgc2l6ZW9mKHN0cl9idWZmKSwgIiUwMngiLCBpZCk7CisgICAgfQorCisgICAgcmV0dXJuIHN0cl9idWZmOworfQorCisKK3N0YXRpYyB2b2lkIGxzdXNiX3BhcnNlX2RldmljZV9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXNjKQoreworICAgIHByaW50ZigiICBEZXZpY2UgRGVzY3JpcHRvclxuIik7CisgICAgcHJpbnRmKCJcdGJjZFVTQjogJTA0eFxuIiwgbGV0b2gxNihkZXNjLT5iY2RVU0IpKTsKKyAgICBwcmludGYoIlx0YkRldmljZUNsYXNzOiAlMDJ4XG4iLCBkZXNjLT5iRGV2aWNlQ2xhc3MpOworICAgIHByaW50ZigiXHRiRGV2aWNlU3ViQ2xhc3M6ICUwMnhcbiIsIGRlc2MtPmJEZXZpY2VTdWJDbGFzcyk7CisgICAgcHJpbnRmKCJcdGJEZXZpY2VQcm90b2NvbDogJTAyeFxuIiwgZGVzYy0+YkRldmljZVByb3RvY29sKTsKKyAgICBwcmludGYoIlx0Yk1heFBhY2tldFNpemUwOiAlMDJ4XG4iLCBkZXNjLT5iTWF4UGFja2V0U2l6ZTApOworICAgIHByaW50ZigiXHRpZFZlbmRvcjogJTA0eFxuIiwgbGV0b2gxNihkZXNjLT5pZFZlbmRvcikpOworICAgIHByaW50ZigiXHRpZFByb2R1Y3Q6ICUwNHhcbiIsIGxldG9oMTYoZGVzYy0+aWRQcm9kdWN0KSk7CisgICAgcHJpbnRmKCJcdGJjZERldmljZTogJTA0eFxuIiwgbGV0b2gxNihkZXNjLT5iY2REZXZpY2UpKTsKKyAgICBwcmludGYoIlx0aU1hbnVmYWN0dXJlcjogJXNcbiIsIGdldF9zdHIoZGV2LCBkZXNjLT5pTWFudWZhY3R1cmVyKSk7CisgICAgcHJpbnRmKCJcdGlQcm9kdWN0OiAlc1xuIiwgZ2V0X3N0cihkZXYsIGRlc2MtPmlQcm9kdWN0KSk7CisgICAgcHJpbnRmKCJcdGlTZXJpYWxOdW1iZXI6ICVzXG4iLCBnZXRfc3RyKGRldixkZXNjLT5pU2VyaWFsTnVtYmVyKSk7CisgICAgcHJpbnRmKCJcdGJOdW1Db25maWd1cmF0aW9uOiAlMDJ4XG4iLCBkZXNjLT5iTnVtQ29uZmlndXJhdGlvbnMpOworICAgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgbHN1c2JfcGFyc2VfY29uZmlnX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfY29uZmlnX2Rlc2NyaXB0b3IgKmRlc2MpCit7CisgICAgcHJpbnRmKCIgIENvbmZpZyBEZXNjcmlwdG9yXG4iKTsKKyAgICBwcmludGYoIlx0d1RvdGFsTGVuZ3RoOiAlMDR4XG4iLCBsZXRvaDE2KGRlc2MtPndUb3RhbExlbmd0aCkpOworICAgIHByaW50ZigiXHRiTnVtSW50ZXJmYWNlczogJTAyeFxuIiwgZGVzYy0+Yk51bUludGVyZmFjZXMpOworICAgIHByaW50ZigiXHRiQ29uZmlndXJhdGlvblZhbHVlOiAlMDJ4XG4iLCBkZXNjLT5iQ29uZmlndXJhdGlvblZhbHVlKTsKKyAgICBwcmludGYoIlx0aUNvbmZpZ3VyYXRpb246ICVzXG4iLCBnZXRfc3RyKGRldiwgZGVzYy0+aUNvbmZpZ3VyYXRpb24pKTsKKyAgICBwcmludGYoIlx0Ym1BdHRyaWJ1dGVzOiAlMDJ4XG4iLCBkZXNjLT5ibUF0dHJpYnV0ZXMpOworICAgIHByaW50ZigiXHRiTWF4UG93ZXI6ICVkIG1BXG4iLCBkZXNjLT5iTWF4UG93ZXIgKiAyKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGxzdXNiX3BhcnNlX2ludGVyZmFjZV9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICpkZXNjKQoreworICAgIHByaW50ZigiICBJbnRlcmZhY2UgRGVzY3JpcHRvclxuIik7CisgICAgcHJpbnRmKCJcdGJJbnRlcmZhY2VOdW1iZXI6ICUwMnhcbiIsIGRlc2MtPmJJbnRlcmZhY2VOdW1iZXIpOworICAgIHByaW50ZigiXHRiQWx0ZXJuYXRlU2V0dGluZzogJTAyeFxuIiwgZGVzYy0+YkFsdGVybmF0ZVNldHRpbmcpOworICAgIHByaW50ZigiXHRiTnVtRW5kcG9pbnRzOiAlMDJ4XG4iLCBkZXNjLT5iTnVtRW5kcG9pbnRzKTsKKyAgICBwcmludGYoIlx0YkludGVyZmFjZUNsYXNzOiAlMDJ4XG4iLCBkZXNjLT5iSW50ZXJmYWNlQ2xhc3MpOworICAgIHByaW50ZigiXHRiSW50ZXJmYWNlU3ViQ2xhc3M6ICUwMnhcbiIsIGRlc2MtPmJJbnRlcmZhY2VTdWJDbGFzcyk7CisgICAgcHJpbnRmKCJcdGJJbnRlcmZhY2VQcm90b2NvbDogJTAyeFxuIiwgZGVzYy0+YkludGVyZmFjZVByb3RvY29sKTsKKyAgICBwcmludGYoIlx0aUludGVyZmFjZTogJXNcbiIsIGdldF9zdHIoZGV2LCBkZXNjLT5pSW50ZXJmYWNlKSk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBsc3VzYl9wYXJzZV9lbmRwb2ludF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKyAgICBwcmludGYoIiAgRW5kcG9pbnQgRGVzY3JpcHRvclxuIik7CisgICAgcHJpbnRmKCJcdGJFbmRwb2ludEFkZHJlc3M6ICUwMnhcbiIsIGRlc2MtPmJFbmRwb2ludEFkZHJlc3MpOworICAgIHByaW50ZigiXHRibUF0dHJpYnV0ZXM6ICUwMnhcbiIsIGRlc2MtPmJtQXR0cmlidXRlcyk7CisgICAgcHJpbnRmKCJcdHdNYXhQYWNrZXRTaXplOiAlMDJ4XG4iLCBsZXRvaDE2KGRlc2MtPndNYXhQYWNrZXRTaXplKSk7CisgICAgcHJpbnRmKCJcdGJJbnRlcnZhbDogJTAyeFxuIiwgZGVzYy0+YkludGVydmFsKTsKKyAgICBwcmludGYoIlx0YlJlZnJlc2g6ICUwMnhcbiIsIGRlc2MtPmJSZWZyZXNoKTsKKyAgICBwcmludGYoIlx0YlN5bmNoQWRkcmVzczogJTAyeFxuIiwgZGVzYy0+YlN5bmNoQWRkcmVzcyk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBsc3VzYl9kdW1wX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpkZXNjKQoreworICAgIGludCBpOworICAgIHByaW50ZigiICBEZXNjcmlwdG9yIHR5cGUgJTAyeFxuIiwgZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5iTGVuZ3RoOyBpKysgKSB7CisgICAgICAgIGlmICgoaSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgcHJpbnRmKCJcdCUwMng6IiwgaSk7CisgICAgICAgIHByaW50ZigiICUwMngiLCAoKHVpbnQ4X3QgKilkZXNjKVtpXSk7CisgICAgICAgIGlmICgoaSAlIDE2KSA9PSAxNSkKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisKKyAgICBpZiAoKGkgJSAxNikgIT0gMCkKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgbHN1c2JfcGFyc2VfZGVzY3JpcHRvcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpkZXNjKQoreworICAgIHN3aXRjaCAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlKSB7CisgICAgY2FzZSBVU0JfRFRfREVWSUNFOgorICAgICAgICBsc3VzYl9wYXJzZV9kZXZpY2VfZGVzY3JpcHRvcihkZXYsIChzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICopIGRlc2MpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVVNCX0RUX0NPTkZJRzoKKyAgICAgICAgbHN1c2JfcGFyc2VfY29uZmlnX2Rlc2NyaXB0b3IoZGV2LCAoc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvciAqKSBkZXNjKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFVTQl9EVF9JTlRFUkZBQ0U6CisgICAgICAgIGxzdXNiX3BhcnNlX2ludGVyZmFjZV9kZXNjcmlwdG9yKGRldiwgKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKikgZGVzYyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBVU0JfRFRfRU5EUE9JTlQ6CisgICAgICAgIGxzdXNiX3BhcnNlX2VuZHBvaW50X2Rlc2NyaXB0b3IoZGV2LCAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopIGRlc2MpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGxzdXNiX2R1bXBfZGVzY3JpcHRvcihkZXYsIGRlc2MpOworCisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGludCBsc3VzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmNsaWVudF9kYXRhKQoreworICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSB1c2JfZGV2aWNlX29wZW4oZGV2X25hbWUpOworCisgICAgaWYgKCFkZXYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuIGRldmljZSAlczogJXNcbiIsIGRldl9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOworICAgICAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpkZXNjOworCisgICAgICAgIHByaW50ZigiJXM6XG4iLCBkZXZfbmFtZSk7CisKKyAgICAgICAgdXNiX2Rlc2NyaXB0b3JfaXRlcl9pbml0KGRldiwgJml0ZXIpOworCisgICAgICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpCisgICAgICAgICAgICBsc3VzYl9wYXJzZV9kZXNjcmlwdG9yKGRldiwgZGVzYyk7CisKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MTZfdCB2aWQsIHBpZDsKKyAgICAgICAgY2hhciAqbWZnX25hbWUsICpwcm9kdWN0X25hbWUsICpzZXJpYWw7CisKKyAgICAgICAgdmlkID0gdXNiX2RldmljZV9nZXRfdmVuZG9yX2lkKGRldik7CisgICAgICAgIHBpZCA9IHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfaWQoZGV2KTsKKyAgICAgICAgbWZnX25hbWUgPSB1c2JfZGV2aWNlX2dldF9tYW51ZmFjdHVyZXJfbmFtZShkZXYpOworICAgICAgICBwcm9kdWN0X25hbWUgPSB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2KTsKKyAgICAgICAgc2VyaWFsID0gdXNiX2RldmljZV9nZXRfc2VyaWFsKGRldik7CisKKyAgICAgICAgcHJpbnRmKCIlczogJTA0eDolMDR4ICVzICVzICVzXG4iLCBkZXZfbmFtZSwgdmlkLCBwaWQsCisgICAgICAgICAgICAgICBtZmdfbmFtZSwgcHJvZHVjdF9uYW1lLCBzZXJpYWwpOworCisgICAgICAgIGZyZWUobWZnX25hbWUpOworICAgICAgICBmcmVlKHByb2R1Y3RfbmFtZSk7CisgICAgICAgIGZyZWUoc2VyaWFsKTsKKyAgICB9CisKKyAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsc3VzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBsc3VzYl9kaXNjb3ZlcnlfZG9uZSh2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICByZXR1cm4gMTsKK30KKworCisKK2ludCBsc3VzYl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCAqY3R4OworCisgICAgaWYgKGFyZ2MgPT0gMiAmJiAhc3RyY21wKGFyZ3ZbMV0sICItdiIpKQorICAgICAgICB2ZXJib3NlID0gMTsKKworICAgIGN0eCA9IHVzYl9ob3N0X2luaXQoKTsKKyAgICBpZiAoIWN0eCkgeworICAgICAgICBwZXJyb3IoInVzYl9ob3N0X2luaXQ6Iik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHVzYl9ob3N0X3J1bihjdHgsCisgICAgICAgICAgICAgICAgIGxzdXNiX2RldmljZV9hZGRlZCwKKyAgICAgICAgICAgICAgICAgbHN1c2JfZGV2aWNlX3JlbW92ZWQsCisgICAgICAgICAgICAgICAgIGxzdXNiX2Rpc2NvdmVyeV9kb25lLAorICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIHVzYl9ob3N0X2NsZWFudXAoY3R4KTsKKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS90b29sYm94L21rZGlyLmMgYi90b29sYm94L21rZGlyLmMKaW5kZXggMTIxYWRhYi4uNjU2OTcwYSAxMDA2NDQKLS0tIGEvdG9vbGJveC9ta2Rpci5jCisrKyBiL3Rvb2xib3gvbWtkaXIuYwpAQCAtMiwxMCArMiwxNCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2xpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKIHN0YXRpYyBpbnQgdXNhZ2UoKQogewotICAgIGZwcmludGYoc3RkZXJyLCJta2RpciA8dGFyZ2V0PlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIm1rZGlyIFtPUFRJT05dIDx0YXJnZXQ+XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC0taGVscCAgICAgICAgICAgZGlzcGxheSB1c2FnZSBhbmQgZXhpdFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtcCwgLS1wYXJlbnRzICAgIGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMgYXMgbmVlZGVkXG4iKTsKICAgICByZXR1cm4gLTE7CiB9CiAKQEAgLTEzLDE1ICsxNyw2MCBAQAogewogICAgIGludCBzeW1ib2xpYyA9IDA7CiAgICAgaW50IHJldDsKLSAgICBpZihhcmdjIDwgMikgcmV0dXJuIHVzYWdlKCk7CisgICAgaWYoYXJnYyA8IDIgfHwgc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB1c2FnZSgpOworICAgIH0KKworICAgIGludCByZWN1cnNpdmUgPSAoc3RyY21wKGFyZ3ZbMV0sICItcCIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChhcmd2WzFdLCAiLS1wYXJlbnRzIikgPT0gMCkgPyAxIDogMDsKKworICAgIGlmKHJlY3Vyc2l2ZSAmJiBhcmdjIDwgMykgeworICAgICAgICAvLyAtcCBzcGVjaWZpZWQgd2l0aG91dCBhIHBhdGgKKyAgICAgICAgcmV0dXJuIHVzYWdlKCk7CisgICAgfQorCisgICAgaWYocmVjdXJzaXZlKSB7CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOworICAgIH0KKworICAgIGNoYXIgY3VycnBhdGhbUEFUSF9NQVhdLCAqcGF0aHBpZWNlOworICAgIHN0cnVjdCBzdGF0IHN0OwogCiAgICAgd2hpbGUoYXJnYyA+IDEpIHsKICAgICAgICAgYXJnYy0tOwogICAgICAgICBhcmd2Kys7Ci0gICAgICAgIHJldCA9IG1rZGlyKGFyZ3ZbMF0sIDA3NzcpOwotICAgICAgICBpZihyZXQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1rZGlyIGZhaWxlZCBmb3IgJXMsICVzXG4iLCBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYocmVjdXJzaXZlKSB7CisgICAgICAgICAgICAvLyByZXNldCBwYXRoCisgICAgICAgICAgICBzdHJjcHkoY3VycnBhdGgsICIiKTsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcGllY2VzIG9mIHRoZSBwYXRoIGFsb25nIHRoZSB3YXkKKyAgICAgICAgICAgIHBhdGhwaWVjZSA9IHN0cnRvayhhcmd2WzBdLCAiLyIpOworICAgICAgICAgICAgaWYoYXJndlswXVswXSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAvLyBwcmVwZW5kIC8gaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgc3RyY2F0KGN1cnJwYXRoLCAiLyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUocGF0aHBpZWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZihzdHJsZW4oY3VycnBhdGgpICsgc3RybGVuKHBhdGhwaWVjZSkgKyAyLypOVUwgYW5kIHNsYXNoKi8gPiBQQVRIX01BWCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcGF0aCBzcGVjaWZpZWQ6IHRvbyBsb25nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmNhdChjdXJycGF0aCwgcGF0aHBpZWNlKTsKKyAgICAgICAgICAgICAgICBzdHJjYXQoY3VycnBhdGgsICIvIik7CisgICAgICAgICAgICAgICAgaWYoc3RhdChjdXJycGF0aCwgJnN0KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IG1rZGlyKGN1cnJwYXRoLCAwNzc3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJta2RpciBmYWlsZWQgZm9yICVzLCAlc1xuIiwgY3VycnBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGhwaWVjZSA9IHN0cnRvayhOVUxMLCAiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gbWtkaXIoYXJndlswXSwgMDc3Nyk7CisgICAgICAgICAgICBpZihyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJta2RpciBmYWlsZWQgZm9yICVzLCAlc1xuIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvdG9vbGJveC9tb3VudC5jIGIvdG9vbGJveC9tb3VudC5jCmluZGV4IDQ3MmM5NTIuLjgyZWNjNTYgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvbW91bnQuYworKysgYi90b29sYm94L21vdW50LmMKQEAgLTIyMiw5ICsyMjIsNTAgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBnZXRfbW91bnRzX2Rldl9kaXIoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZGV2LCBjaGFyICoqZGlyKQoreworCUZJTEUgKmY7CisJY2hhciBtb3VudF9kZXZbMjU2XTsKKwljaGFyIG1vdW50X2RpclsyNTZdOworCWNoYXIgbW91bnRfdHlwZVsyNTZdOworCWNoYXIgbW91bnRfb3B0c1syNTZdOworCWludCBtb3VudF9mcmVxOworCWludCBtb3VudF9wYXNzbm87CisJaW50IG1hdGNoOworCisJZiA9IGZvcGVuKCIvcHJvYy9tb3VudHMiLCAiciIpOworCWlmICghZikgeworCQlmcHJpbnRmKHN0ZG91dCwgImNvdWxkIG5vdCBvcGVuIC9wcm9jL21vdW50c1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkbyB7CisJCW1hdGNoID0gZnNjYW5mKGYsICIlMjU1cyAlMjU1cyAlMjU1cyAlMjU1cyAlZCAlZFxuIiwKKwkJCQkJICAgbW91bnRfZGV2LCBtb3VudF9kaXIsIG1vdW50X3R5cGUsCisJCQkJCSAgIG1vdW50X29wdHMsICZtb3VudF9mcmVxLCAmbW91bnRfcGFzc25vKTsKKwkJbW91bnRfZGV2WzI1NV0gPSAwOworCQltb3VudF9kaXJbMjU1XSA9IDA7CisJCW1vdW50X3R5cGVbMjU1XSA9IDA7CisJCW1vdW50X29wdHNbMjU1XSA9IDA7CisJCWlmIChtYXRjaCA9PSA2ICYmCisJCQkoc3RyY21wKGFyZywgbW91bnRfZGV2KSA9PSAwIHx8CisJCQkgc3RyY21wKGFyZywgbW91bnRfZGlyKSA9PSAwKSkgeworCQkJKmRldiA9IHN0cmR1cChtb3VudF9kZXYpOworCQkJKmRpciA9IHN0cmR1cChtb3VudF9kaXIpOworCQkJZmNsb3NlKGYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlIChtYXRjaCAhPSBFT0YpOworCisJZmNsb3NlKGYpOworCXJldHVybiAtMTsKK30KKwogaW50IG1vdW50X21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAljaGFyICp0eXBlID0gTlVMTDsKKwljaGFyICpkZXYgPSBOVUxMOworCWNoYXIgKmRpciA9IE5VTEw7CiAJaW50IGM7CiAJaW50IGxvb3AgPSAwOwogCkBAIC0yNjUsMTIgKzMwNiwxOSBAQAogCWlmIChyd2ZsYWcgJiBNU19UWVBFKQogCQl0eXBlID0gIm5vbmUiOwogCi0JaWYgKG9wdGluZCArIDIgIT0gYXJnYyB8fCB0eXBlID09IE5VTEwpIHsKKwlpZiAob3B0aW5kICsgMiA9PSBhcmdjKSB7CisJCWRldiA9IGFyZ3Zbb3B0aW5kXTsKKwkJZGlyID0gYXJndltvcHRpbmQgKyAxXTsKKwl9IGVsc2UgaWYgKG9wdGluZCArIDEgPT0gYXJnYyAmJiByd2ZsYWcgJiBNU19SRU1PVU5UKSB7CisJCWdldF9tb3VudHNfZGV2X2Rpcihhcmd2W29wdGluZF0sICZkZXYsICZkaXIpOworCX0KKworCWlmIChkZXYgPT0gTlVMTCB8fCBkaXIgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpIHsKIAkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1yXSBbLXddIFstbyBvcHRpb25zXSBbLXQgdHlwZV0gIgogCQkJImRldmljZSBkaXJlY3RvcnlcbiIsIHByb2duYW1lKTsKIAkJZXhpdCgxKTsKIAl9CiAKLQlyZXR1cm4gZG9fbW91bnQoYXJndltvcHRpbmRdLCBhcmd2W29wdGluZCArIDFdLCB0eXBlLCByd2ZsYWcsCi0JCSAgICAgICAgZXh0cmEuc3RyLCBsb29wKTsKKwlyZXR1cm4gZG9fbW91bnQoZGV2LCBkaXIsIHR5cGUsIHJ3ZmxhZywgZXh0cmEuc3RyLCBsb29wKTsKKwkvKiBXZSBsZWFrIGRldiBhbmQgZGlyIGluIHNvbWUgY2FzZXMsIGJ1dCB3ZSdyZSBhYm91dCB0byBleGl0ICovCiB9CmRpZmYgLS1naXQgYS90b29sYm94L25hbmRyZWFkLmMgYi90b29sYm94L25hbmRyZWFkLmMKaW5kZXggOTY0NDk3My4uYjEyNDczMSAxMDA2NDQKLS0tIGEvdG9vbGJveC9uYW5kcmVhZC5jCisrKyBiL3Rvb2xib3gvbmFuZHJlYWQuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgpAQCAtMjgzLDQgKzI4NCwzIEBACiAKICAgICByZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9ub3RpZnkuYyBiL3Rvb2xib3gvbm90aWZ5LmMKaW5kZXggYjE3NjFkMi4uYzk4M2VkNSAxMDA2NDQKLS0tIGEvdG9vbGJveC9ub3RpZnkuYworKysgYi90b29sYm94L25vdGlmeS5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL2lub3RpZnkuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpkaWZmIC0tZ2l0IGEvdG9vbGJveC9wcy5jIGIvdG9vbGJveC9wcy5jCmluZGV4IGJjNTBjZmEuLjJhYTNlZmIgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvcHMuYworKysgYi90b29sYm94L3BzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgU0hPV19QUklPIDEKICNkZWZpbmUgU0hPV19USU1FIDIKICNkZWZpbmUgU0hPV19QT0xJQ1kgNAorI2RlZmluZSBTSE9XX0NQVSAgOAogCiBzdGF0aWMgaW50IGRpc3BsYXlfZmxhZ3MgPSAwOwogCkBAIC00MSw3ICs0Miw3IEBACiAgICAgaW50IHBwaWQsIHR0eTsKICAgICB1bnNpZ25lZCB3Y2hhbiwgcnNzLCB2c3MsIGVpcDsKICAgICB1bnNpZ25lZCB1dGltZSwgc3RpbWU7Ci0gICAgaW50IHByaW8sIG5pY2UsIHJ0cHJpbywgc2NoZWQ7CisgICAgaW50IHByaW8sIG5pY2UsIHJ0cHJpbywgc2NoZWQsIHBzcjsKICAgICBzdHJ1Y3QgcGFzc3dkICpwdzsKICAgICAKICAgICBzcHJpbnRmKHN0YXRsaW5lLCAiL3Byb2MvJWQiLCBwaWQpOwpAQCAtMTIyLDcgKzEyMyw3IEBACiAgICAgbmV4dHRvaygmcHRyKTsgLy8gbnN3YXAKICAgICBuZXh0dG9rKCZwdHIpOyAvLyBjbnN3YXAKICAgICBuZXh0dG9rKCZwdHIpOyAvLyBleGl0IHNpZ25hbAotICAgIG5leHR0b2soJnB0cik7IC8vIHByb2Nlc3NvcgorICAgIHBzciA9IGF0b2kobmV4dHRvaygmcHRyKSk7IC8vIHByb2Nlc3NvcgogICAgIHJ0cHJpbyA9IGF0b2kobmV4dHRvaygmcHRyKSk7IC8vIHJ0X3ByaW9yaXR5CiAgICAgc2NoZWQgPSBhdG9pKG5leHR0b2soJnB0cikpOyAvLyBzY2hlZHVsaW5nIHBvbGljeQogICAgIApAQCAtMTQyLDcgKzE0Myw5IEBACiAgICAgCiAgICAgaWYoIW5hbWVmaWx0ZXIgfHwgIXN0cm5jbXAobmFtZSwgbmFtZWZpbHRlciwgc3RybGVuKG5hbWVmaWx0ZXIpKSkgewogICAgICAgICBwcmludGYoIiUtOXMgJS01ZCAlLTVkICUtNmQgJS01ZCIsIHVzZXIsIHBpZCwgcHBpZCwgdnNzIC8gMTAyNCwgcnNzICogNCk7Ci0gICAgICAgIGlmKGRpc3BsYXlfZmxhZ3MmU0hPV19QUklPKQorICAgICAgICBpZiAoZGlzcGxheV9mbGFncyAmIFNIT1dfQ1BVKQorICAgICAgICAgICAgcHJpbnRmKCIgJS0yZCIsIHBzcik7CisgICAgICAgIGlmIChkaXNwbGF5X2ZsYWdzICYgU0hPV19QUklPKQogICAgICAgICAgICAgcHJpbnRmKCIgJS01ZCAlLTVkICUtNWQgJS01ZCIsIHByaW8sIG5pY2UsIHJ0cHJpbywgc2NoZWQpOwogICAgICAgICBpZiAoZGlzcGxheV9mbGFncyAmIFNIT1dfUE9MSUNZKSB7CiAgICAgICAgICAgICBTY2hlZFBvbGljeSBwOwpAQCAtMjA3LDYgKzIxMCw4IEBACiAgICAgICAgICAgICBkaXNwbGF5X2ZsYWdzIHw9IFNIT1dfUE9MSUNZOwogICAgICAgICB9IGVsc2UgaWYoIXN0cmNtcChhcmd2WzFdLCItcCIpKSB7CiAgICAgICAgICAgICBkaXNwbGF5X2ZsYWdzIHw9IFNIT1dfUFJJTzsKKyAgICAgICAgfSBlbHNlIGlmKCFzdHJjbXAoYXJndlsxXSwiLWMiKSkgeworICAgICAgICAgICAgZGlzcGxheV9mbGFncyB8PSBTSE9XX0NQVTsKICAgICAgICAgfSAgZWxzZSBpZihpc2RpZ2l0KGFyZ3ZbMV1bMF0pKXsKICAgICAgICAgICAgIHBpZGZpbHRlciA9IGF0b2koYXJndlsxXSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yMTYsNyArMjIxLDggQEAKICAgICAgICAgYXJndisrOwogICAgIH0KIAotICAgIHByaW50ZigiVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICVzICVzIFdDSEFOICAgIFBDICAgICAgICAgTkFNRVxuIiwgCisgICAgcHJpbnRmKCJVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgJXMlcyAlcyBXQ0hBTiAgICBQQyAgICAgICAgIE5BTUVcbiIsCisgICAgICAgICAgIChkaXNwbGF5X2ZsYWdzJlNIT1dfQ1BVKT8iQ1BVICI6IiIsCiAgICAgICAgICAgIChkaXNwbGF5X2ZsYWdzJlNIT1dfUFJJTyk/IlBSSU8gIE5JQ0UgIFJUUFJJIFNDSEVEICI6IiIsCiAgICAgICAgICAgIChkaXNwbGF5X2ZsYWdzJlNIT1dfUE9MSUNZKT8iUENZICIgOiAiIik7CiAgICAgd2hpbGUoKGRlID0gcmVhZGRpcihkKSkgIT0gMCl7CmRpZmYgLS1naXQgYS90b29sYm94L3IuYyBiL3Rvb2xib3gvci5jCmluZGV4IDVhODJlMjAuLmViOGVhMGIgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvci5jCisrKyBiL3Rvb2xib3gvci5jCkBAIC0xMyw4ICsxMywxMCBAQAogaW50IHJfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogICAgIGludCB3aWR0aCA9IDQsIHNldCA9IDAsIGZkOwotICAgIHVuc2lnbmVkIGFkZHIsIHZhbHVlOworICAgIHVuc2lnbmVkIGFkZHIsIHZhbHVlLCBlbmRhZGRyID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIG1tYXBfc3RhcnQsIG1tYXBfc2l6ZTsKICAgICB2b2lkICpwYWdlOworICAgIGNoYXIgKmVuZDsKICAgICAKICAgICBpZihhcmdjIDwgMikgcmV0dXJuIHVzYWdlKCk7CiAKQEAgLTMxLDYgKzMzLDE4IEBACiAgICAgaWYoYXJnYyA8IDIpIHJldHVybiB1c2FnZSgpOwogICAgIGFkZHIgPSBzdHJ0b3VsKGFyZ3ZbMV0sIDAsIDE2KTsKIAorICAgIGVuZCA9IHN0cmNocihhcmd2WzFdLCAnLScpOworICAgIGlmIChlbmQpCisgICAgICAgIGVuZGFkZHIgPSBzdHJ0b3VsKGVuZCArIDEsIDAsIDE2KTsKKworICAgIGlmICghZW5kYWRkcikKKyAgICAgICAgZW5kYWRkciA9IGFkZHIgKyB3aWR0aCAtIDE7CisKKyAgICBpZiAoZW5kYWRkciA8PSBhZGRyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBlbmQgYWRkcmVzc1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKICAgICBpZihhcmdjID4gMikgewogICAgICAgICBzZXQgPSAxOwogICAgICAgICB2YWx1ZSA9IHN0cnRvdWwoYXJndlsyXSwgMCwgMTYpOwpAQCAtNDIsMzMgKzU2LDQwIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgCi0gICAgcGFnZSA9IG1tYXAoMCwgODE5MiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLSAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZCwgYWRkciAmICh+NDA5NSkpOworICAgIG1tYXBfc3RhcnQgPSBhZGRyICYgfihQQUdFX1NJWkUgLSAxKTsKKyAgICBtbWFwX3NpemUgPSBlbmRhZGRyIC0gbW1hcF9zdGFydCArIDE7CisgICAgbW1hcF9zaXplID0gKG1tYXBfc2l6ZSArIFBBR0VfU0laRSAtIDEpICYgfihQQUdFX1NJWkUgLSAxKTsKKworICAgIHBhZ2UgPSBtbWFwKDAsIG1tYXBfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZCwgbW1hcF9zdGFydCk7CiAKICAgICBpZihwYWdlID09IE1BUF9GQUlMRUQpewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwiY2Fubm90IG1tYXAgcmVnaW9uXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN3aXRjaCh3aWR0aCl7Ci0gICAgY2FzZSA0OiB7Ci0gICAgICAgIHVuc2lnbmVkICp4ID0gKHVuc2lnbmVkKikgKCgodW5zaWduZWQpIHBhZ2UpICsgKGFkZHIgJiA0MDk1KSk7Ci0gICAgICAgIGlmKHNldCkgKnggPSB2YWx1ZTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiUwOHg6ICUwOHhcbiIsIGFkZHIsICp4KTsKLSAgICAgICAgYnJlYWs7CisgICAgd2hpbGUgKGFkZHIgPD0gZW5kYWRkcikgeworICAgICAgICBzd2l0Y2god2lkdGgpeworICAgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgICAgIHVuc2lnbmVkICp4ID0gKHVuc2lnbmVkKikgKCgodW5zaWduZWQpIHBhZ2UpICsgKGFkZHIgJiA0MDk1KSk7CisgICAgICAgICAgICBpZihzZXQpICp4ID0gdmFsdWU7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJTA4eDogJTA4eFxuIiwgYWRkciwgKngpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqeCA9ICh1bnNpZ25lZCBzaG9ydCopICgoKHVuc2lnbmVkKSBwYWdlKSArIChhZGRyICYgNDA5NSkpOworICAgICAgICAgICAgaWYoc2V0KSAqeCA9IHZhbHVlOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiUwOHg6ICUwNHhcbiIsIGFkZHIsICp4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqeCA9ICh1bnNpZ25lZCBjaGFyKikgKCgodW5zaWduZWQpIHBhZ2UpICsgKGFkZHIgJiA0MDk1KSk7CisgICAgICAgICAgICBpZihzZXQpICp4ID0gdmFsdWU7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJTA4eDogJTAyeFxuIiwgYWRkciwgKngpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhZGRyICs9IHdpZHRoOwogICAgIH0KLSAgICBjYXNlIDI6IHsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgKnggPSAodW5zaWduZWQgc2hvcnQqKSAoKCh1bnNpZ25lZCkgcGFnZSkgKyAoYWRkciAmIDQwOTUpKTsKLSAgICAgICAgaWYoc2V0KSAqeCA9IHZhbHVlOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJTA4eDogJTA0eFxuIiwgYWRkciwgKngpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSAxOiB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnggPSAodW5zaWduZWQgY2hhciopICgoKHVuc2lnbmVkKSBwYWdlKSArIChhZGRyICYgNDA5NSkpOwotICAgICAgICBpZihzZXQpICp4ID0gdmFsdWU7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIlMDh4OiAlMDJ4XG4iLCBhZGRyLCAqeCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICB9ICAgIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9yZWJvb3QuYyBiL3Rvb2xib3gvcmVib290LmMKaW5kZXggYWViZTE4NS4uZjg1NDZkZSAxMDA2NDQKLS0tIGEvdG9vbGJveC9yZWJvb3QuYworKysgYi90b29sYm94L3JlYm9vdC5jCkBAIC0xLDcgKzEsNyBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvcmVib290Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIGludCByZWJvb3RfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtOSw2ICs5LDcgQEAKICAgICBpbnQgcmV0OwogICAgIGludCBub3N5bmMgPSAwOwogICAgIGludCBwb3dlcm9mZiA9IDA7CisgICAgaW50IGZsYWdzID0gMDsKIAogICAgIG9wdGVyciA9IDA7CiAgICAgZG8gewpAQCAtMzgsMTUgKzM5LDE2IEBACiAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgICB9CiAKLSAgICBpZighbm9zeW5jKQotICAgICAgICBzeW5jKCk7CisgICAgaWYobm9zeW5jKQorICAgICAgICAvKiBhbHNvIHNldCBOT19SRU1PVU5UX1JPIGFzIHJlbW91bnQgcm8gaW5jbHVkZXMgYW4gaW1wbGljaXQgc3luYyAqLworICAgICAgICBmbGFncyA9IEFORFJPSURfUkJfRkxBR19OT19TWU5DIHwgQU5EUk9JRF9SQl9GTEFHX05PX1JFTU9VTlRfUk87CiAKICAgICBpZihwb3dlcm9mZikKLSAgICAgICAgcmV0ID0gX19yZWJvb3QoTElOVVhfUkVCT09UX01BR0lDMSwgTElOVVhfUkVCT09UX01BR0lDMiwgTElOVVhfUkVCT09UX0NNRF9QT1dFUl9PRkYsIE5VTEwpOworICAgICAgICByZXQgPSBhbmRyb2lkX3JlYm9vdChBTkRST0lEX1JCX1BPV0VST0ZGLCBmbGFncywgMCk7CiAgICAgZWxzZSBpZihhcmdjID4gb3B0aW5kKQotICAgICAgICByZXQgPSBfX3JlYm9vdChMSU5VWF9SRUJPT1RfTUFHSUMxLCBMSU5VWF9SRUJPT1RfTUFHSUMyLCBMSU5VWF9SRUJPT1RfQ01EX1JFU1RBUlQyLCBhcmd2W29wdGluZF0pOworICAgICAgICByZXQgPSBhbmRyb2lkX3JlYm9vdChBTkRST0lEX1JCX1JFU1RBUlQyLCBmbGFncywgYXJndltvcHRpbmRdKTsKICAgICBlbHNlCi0gICAgICAgIHJldCA9IHJlYm9vdChSQl9BVVRPQk9PVCk7CisgICAgICAgIHJldCA9IGFuZHJvaWRfcmVib290KEFORFJPSURfUkJfUkVTVEFSVCwgZmxhZ3MsIDApOwogICAgIGlmKHJldCA8IDApIHsKICAgICAgICAgcGVycm9yKCJyZWJvb3QiKTsKICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwpkaWZmIC0tZ2l0IGEvdG9vbGJveC9yb3V0ZS5jIGIvdG9vbGJveC9yb3V0ZS5jCmluZGV4IDEwN2U0OGEuLjNlMTAwMTQgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvcm91dGUuYworKysgYi90b29sYm94L3JvdXRlLmMKQEAgLTgwLDE0ICs4MCwyNCBAQAogCiAgICAgICAgIC8qIHJvdXRlIGFkZCAtbmV0IDE5Mi4xNjguMS4yIG5ldG1hc2sgMjU1LjI1NS4yNTUuMCBndyAxOTIuMTY4LjEuMSAqLwogICAgICAgICBpZiAoYXJnYyA+IDcgJiYgIXN0cmNtcChhcmd2WzJdLCAiLW5ldCIpICYmCi0gICAgICAgICAgICAhc3RyY21wKGFyZ3ZbNF0sICJuZXRtYXNrIikgJiYgIXN0cmNtcChhcmd2WzZdLCAiZ3ciKSkgewotICAgICAgICAgICAgcnQucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfR0FURVdBWTsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkcmVzcyhhcmd2WzNdLCAmcnQucnRfZHN0KSAmJgotICAgICAgICAgICAgICAgIHNldF9hZGRyZXNzKGFyZ3ZbNV0sICZydC5ydF9nZW5tYXNrKSAmJgotICAgICAgICAgICAgICAgIHNldF9hZGRyZXNzKGFyZ3ZbN10sICZydC5ydF9nYXRld2F5KSkgewotICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICAhc3RyY21wKGFyZ3ZbNF0sICJuZXRtYXNrIikpIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbNl0sICJndyIpKSB7CisgICAgICAgICAgICAgICAgcnQucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfR0FURVdBWTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZHJlc3MoYXJndlszXSwgJnJ0LnJ0X2RzdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgc2V0X2FkZHJlc3MoYXJndls1XSwgJnJ0LnJ0X2dlbm1hc2spICYmCisgICAgICAgICAgICAgICAgICAgIHNldF9hZGRyZXNzKGFyZ3ZbN10sICZydC5ydF9nYXRld2F5KSkgeworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gYXBwbHk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndls2XSwgImRldiIpKSB7CisgICAgICAgICAgICAgICAgcnQucnRfZmxhZ3MgPSBSVEZfVVA7CisgICAgICAgICAgICAgICAgcnQucnRfZGV2ID0gYXJndls3XTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZHJlc3MoYXJndlszXSwgJnJ0LnJ0X2RzdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgc2V0X2FkZHJlc3MoYXJndls1XSwgJnJ0LnJ0X2dlbm1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBhcHBseTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gYXBwbHk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xib3gvc2NoZWR0b3AuYyBiL3Rvb2xib3gvc2NoZWR0b3AuYwppbmRleCBjMGUwMTQxLi42ODU5YjUwIDEwMDY0NAotLS0gYS90b29sYm94L3NjaGVkdG9wLmMKKysrIGIvdG9vbGJveC9zY2hlZHRvcC5jCkBAIC0yLDcgKzIsOSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTMzMiw0ICszMzQsMyBAQAogICAgIGNsb3NlZGlyKGQpOwogICAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS90b29sYm94L3NldGNvbnNvbGUuYyBiL3Rvb2xib3gvc2V0Y29uc29sZS5jCmluZGV4IGIwY2UxM2YuLjAxNTljMDcgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvc2V0Y29uc29sZS5jCisrKyBiL3Rvb2xib3gvc2V0Y29uc29sZS5jCkBAIC02LDYgKzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAKIHN0YXRpYyBpbnQgYWN0aXZhdGVfdGhyZWFkX3N3aXRjaF92YzsKIHN0YXRpYyB2b2lkICphY3RpdmF0ZV90aHJlYWQodm9pZCAqYXJnKQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9zdGFydC5jIGIvdG9vbGJveC9zdGFydC5jCmluZGV4IDNiZDlmYmIuLjY2NWE5NDEgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvc3RhcnQuYworKysgYi90b29sYm94L3N0YXJ0LmMKQEAgLTgsMTMgKzgsMTQgQEAKIGludCBzdGFydF9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAgICAgY2hhciBidWZbMTAyNF07CisKICAgICBpZihhcmdjID4gMSkgewogICAgICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdGFydCIsIGFyZ3ZbMV0pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGRlZmF1bHQgdG8gInN0YXJ0IHp5Z290ZSIgInN0YXJ0IHJ1bnRpbWUiICovCisgICAgICAgIC8qIGRlZmF1bHRzIHRvIHN0YXJ0aW5nIHRoZSBjb21tb24gc2VydmljZXMgc3RvcHBlZCBieSBzdG9wLmMgKi8KKyAgICAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCAic3VyZmFjZWZsaW5nZXIiKTsKICAgICAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCAienlnb3RlIik7Ci0gICAgICAgIHByb3BlcnR5X3NldCgiY3RsLnN0YXJ0IiwgInJ1bnRpbWUiKTsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xib3gvc3RvcC5jIGIvdG9vbGJveC9zdG9wLmMKaW5kZXggMDViYWZmZC4uNDYwZjM3NyAxMDA2NDQKLS0tIGEvdG9vbGJveC9zdG9wLmMKKysrIGIvdG9vbGJveC9zdG9wLmMKQEAgLTEwLDExICsxMCwxMCBAQAogICAgIGlmKGFyZ2MgPiAxKSB7CiAgICAgICAgIHByb3BlcnR5X3NldCgiY3RsLnN0b3AiLCBhcmd2WzFdKTsKICAgICB9IGVsc2V7Ci0gICAgICAgIC8qIGRlZmF1bHQgdG8gInN0b3AgcnVudGltZSIgInN0b3Agenlnb3RlIiAqLwotICAgICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdG9wIiwgInJ1bnRpbWUiKTsKKyAgICAgICAgLyogZGVmYXVsdHMgdG8gc3RvcHBpbmcgdGhlIGNvbW1vbiBzZXJ2aWNlcyAqLwogICAgICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdG9wIiwgInp5Z290ZSIpOworICAgICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdG9wIiwgInN1cmZhY2VmbGluZ2VyIik7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL3Rvb2xib3gvdG9wLmMgYi90b29sYm94L3RvcC5jCmluZGV4IGRhYWRlNmQuLjk5OWM4ZTEgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvdG9wLmMKKysrIGIvdG9vbGJveC90b3AuYwpAQCAtNjUsNiArNjUsNyBAQAogICAgIGxvbmcgdW5zaWduZWQgZGVsdGFfdGltZTsKICAgICBsb25nIHZzczsKICAgICBsb25nIHJzczsKKyAgICBpbnQgcHJzOwogICAgIGludCBudW1fdGhyZWFkczsKICAgICBjaGFyIHBvbGljeVszMl07CiB9OwpAQCAtMzQwLDggKzM0MSw5IEBACiAgICAgCiAgICAgLyogU2NhbiByZXN0IG9mIHN0cmluZy4gKi8KICAgICBzc2NhbmYoY2xvc2VfcGFyZW4gKyAxLCAiICVjICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAiCi0gICAgICAgICAgICAgICAgICIlbHUgJWx1ICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlbHUgJWxkIiwKLSAgICAgICAgICAgICAgICAgJnByb2MtPnN0YXRlLCAmcHJvYy0+dXRpbWUsICZwcm9jLT5zdGltZSwgJnByb2MtPnZzcywgJnByb2MtPnJzcyk7CisgICAgICAgICAgICAgICAgICIlbHUgJWx1ICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlbHUgJWxkICIKKyAgICAgICAgICAgICAgICAgIiUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJWQiLAorICAgICAgICAgICAgICAgICAmcHJvYy0+c3RhdGUsICZwcm9jLT51dGltZSwgJnByb2MtPnN0aW1lLCAmcHJvYy0+dnNzLCAmcHJvYy0+cnNzLCAmcHJvYy0+cHJzKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNDU0LDkgKzQ1Niw5IEBACiAgICAgICAgICAgICB0b3RhbF9kZWx0YV90aW1lKTsKICAgICBwcmludGYoIlxuIik7CiAgICAgaWYgKCF0aHJlYWRzKSAKLSAgICAgICAgcHJpbnRmKCIlNXMgJTRzICUxcyAlNXMgJTdzICU3cyAlM3MgJS04cyAlc1xuIiwgIlBJRCIsICJDUFUlIiwgIlMiLCAiI1RIUiIsICJWU1MiLCAiUlNTIiwgIlBDWSIsICJVSUQiLCAiTmFtZSIpOworICAgICAgICBwcmludGYoIiU1cyAlMnMgJTRzICUxcyAlNXMgJTdzICU3cyAlM3MgJS04cyAlc1xuIiwgIlBJRCIsICJQUiIsICJDUFUlIiwgIlMiLCAiI1RIUiIsICJWU1MiLCAiUlNTIiwgIlBDWSIsICJVSUQiLCAiTmFtZSIpOwogICAgIGVsc2UKLSAgICAgICAgcHJpbnRmKCIlNXMgJTVzICU0cyAlMXMgJTdzICU3cyAlM3MgJS04cyAlLTE1cyAlc1xuIiwgIlBJRCIsICJUSUQiLCAiQ1BVJSIsICJTIiwgIlZTUyIsICJSU1MiLCAiUENZIiwgIlVJRCIsICJUaHJlYWQiLCAiUHJvYyIpOworICAgICAgICBwcmludGYoIiU1cyAlNXMgJTJzICU0cyAlMXMgJTdzICU3cyAlM3MgJS04cyAlLTE1cyAlc1xuIiwgIlBJRCIsICJUSUQiLCAiUFIiLCAiQ1BVJSIsICJTIiwgIlZTUyIsICJSU1MiLCAiUENZIiwgIlVJRCIsICJUaHJlYWQiLCAiUHJvYyIpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IG51bV9uZXdfcHJvY3M7IGkrKykgewogICAgICAgICBwcm9jID0gbmV3X3Byb2NzW2ldOwpAQCAtNDc4LDEwICs0ODAsMTAgQEAKICAgICAgICAgICAgIGdyb3VwX3N0ciA9IGdyb3VwX2J1ZjsKICAgICAgICAgfQogICAgICAgICBpZiAoIXRocmVhZHMpIAotICAgICAgICAgICAgcHJpbnRmKCIlNWQgJTNsZCUlICVjICU1ZCAlNmxkSyAlNmxkSyAlM3MgJS04LjhzICVzXG4iLCBwcm9jLT5waWQsIHByb2MtPmRlbHRhX3RpbWUgKiAxMDAgLyB0b3RhbF9kZWx0YV90aW1lLCBwcm9jLT5zdGF0ZSwgcHJvYy0+bnVtX3RocmVhZHMsCisgICAgICAgICAgICBwcmludGYoIiU1ZCAlMmQgJTNsZCUlICVjICU1ZCAlNmxkSyAlNmxkSyAlM3MgJS04LjhzICVzXG4iLCBwcm9jLT5waWQsIHByb2MtPnBycywgcHJvYy0+ZGVsdGFfdGltZSAqIDEwMCAvIHRvdGFsX2RlbHRhX3RpbWUsIHByb2MtPnN0YXRlLCBwcm9jLT5udW1fdGhyZWFkcywKICAgICAgICAgICAgICAgICBwcm9jLT52c3MgLyAxMDI0LCBwcm9jLT5yc3MgKiBnZXRwYWdlc2l6ZSgpIC8gMTAyNCwgcHJvYy0+cG9saWN5LCB1c2VyX3N0ciwgcHJvYy0+bmFtZVswXSAhPSAwID8gcHJvYy0+bmFtZSA6IHByb2MtPnRuYW1lKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmKCIlNWQgJTVkICUzbGQlJSAlYyAlNmxkSyAlNmxkSyAlM3MgJS04LjhzICUtMTVzICVzXG4iLCBwcm9jLT5waWQsIHByb2MtPnRpZCwgcHJvYy0+ZGVsdGFfdGltZSAqIDEwMCAvIHRvdGFsX2RlbHRhX3RpbWUsIHByb2MtPnN0YXRlLAorICAgICAgICAgICAgcHJpbnRmKCIlNWQgJTVkICUyZCAlM2xkJSUgJWMgJTZsZEsgJTZsZEsgJTNzICUtOC44cyAlLTE1cyAlc1xuIiwgcHJvYy0+cGlkLCBwcm9jLT50aWQsIHByb2MtPnBycywgcHJvYy0+ZGVsdGFfdGltZSAqIDEwMCAvIHRvdGFsX2RlbHRhX3RpbWUsIHByb2MtPnN0YXRlLAogICAgICAgICAgICAgICAgIHByb2MtPnZzcyAvIDEwMjQsIHByb2MtPnJzcyAqIGdldHBhZ2VzaXplKCkgLyAxMDI0LCBwcm9jLT5wb2xpY3ksIHVzZXJfc3RyLCBwcm9jLT50bmFtZSwgcHJvYy0+bmFtZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbGJveC90b3VjaC5jIGIvdG9vbGJveC90b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWIzMTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29sYm94L3RvdWNoLmMKQEAgLTAsMCArMSw4NyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG91Y2g6IHVzYWdlOiB0b3VjaCBbLWFsbV0gWy10IHRpbWVfdF0gPGZpbGU+XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKK30KKworaW50IHRvdWNoX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAgICAgaW50IGksIGZkLCBhZmxhZyA9IDAsIG1mbGFnID0gMCwgZGVidWcgPSAwLCBmbGFncyA9IDA7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBzcGVjaWZpZWRfdGltZSwgdGltZXNbMl07CisgICAgICAgIGNoYXIgKmZpbGUgPSAwOworCisgICAgICAgIHNwZWNpZmllZF90aW1lLnR2X25zZWMgPSBVVElNRV9OT1c7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgLyogYW4gb3B0aW9uICovCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXSsxOworICAgICAgICAgICAgICAgIHdoaWxlIChhcmdbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcmdbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6IGFmbGFnID0gMTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOiBtZmxhZyA9IDE7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaSsxKSA+PSBhcmdjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWRfdGltZS50dl9zZWMgPSBhdG9sKGFyZ3ZbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVkX3RpbWUudHZfc2VjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvdWNoOiBpbnZhbGlkIHRpbWVfdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZF90aW1lLnR2X25zZWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOiBmbGFncyB8PSBBVF9TWU1MSU5LX05PRk9MTE9XOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6IGRlYnVnID0gMTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFyZysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm90IGFuIG9wdGlvbiwgYW5kIG9ubHkgYWNjZXB0IG9uZSBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgIGlmIChpKzEgIT0gYXJnYykKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICBmaWxlID0gYXJndltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghIGZpbGUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG91Y2g6IG5vIGZpbGUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWNjZXNzKGZpbGUsIEZfT0spKQorICAgICAgICAgICAgaWYgKChmZD1jcmVhdChmaWxlLCAwNjY2KSkgIT0gLTEpCisgICAgICAgICAgICAgICAgY2xvc2UoZmQpOworCisgICAgICAgIGlmICgobWZsYWcgPT0gMCkgJiYgKGFmbGFnID09IDApKQorICAgICAgICAgICAgYWZsYWcgPSBtZmxhZyA9IDE7CisKKyAgICAgICAgaWYgKGFmbGFnKQorICAgICAgICAgICAgdGltZXNbMF0gPSBzcGVjaWZpZWRfdGltZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGltZXNbMF0udHZfbnNlYyA9IFVUSU1FX09NSVQ7CisKKyAgICAgICAgaWYgKG1mbGFnKQorICAgICAgICAgICAgdGltZXNbMV0gPSBzcGVjaWZpZWRfdGltZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGltZXNbMV0udHZfbnNlYyA9IFVUSU1FX09NSVQ7CisKKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZpbGUgPSAlc1xuIiwgZmlsZSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRpbWVzWzBdLnR2X3NlYyA9ICVsZCwgdGltZXNbMF0udHZfbnNlYyA9ICVsZFxuIiwgdGltZXNbMF0udHZfc2VjLCB0aW1lc1swXS50dl9uc2VjKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGltZXNbMV0udHZfc2VjID0gJWxkLCB0aW1lc1sxXS50dl9uc2VjID0gJWxkXG4iLCB0aW1lc1sxXS50dl9zZWMsIHRpbWVzWzFdLnR2X25zZWMpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmbGFncyA9IDB4JTguOHhcbiIsIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1dGltZW5zYXQoQVRfRkRDV0QsIGZpbGUsIHRpbWVzLCBmbGFncyk7Cit9CisKZGlmZiAtLWdpdCBhL3Rvb2xib3gvdXB0aW1lLmMgYi90b29sYm94L3VwdGltZS5jCmluZGV4IDNkODA2MWMuLjFjMzEyYjAgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvdXB0aW1lLmMKKysrIGIvdG9vbGJveC91cHRpbWUuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfYWxhcm0uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgogCiAKIHN0YXRpYyB2b2lkIGZvcm1hdF90aW1lKGludCB0aW1lLCBjaGFyKiBidWZmZXIpIHsKQEAgLTc1LDE5ICs3NiwyNiBAQAogICAgIGZsb2F0IHVwX3RpbWUsIGlkbGVfdGltZTsKICAgICBjaGFyIHVwX3N0cmluZ1sxMDBdLCBpZGxlX3N0cmluZ1sxMDBdLCBzbGVlcF9zdHJpbmdbMTAwXTsKICAgICBpbnQgZWxhcHNlZDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdXBfdGltZXNwZWM7CiAKICAgICBGSUxFKiBmaWxlID0gZm9wZW4oIi9wcm9jL3VwdGltZSIsICJyIik7CiAgICAgaWYgKCFmaWxlKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gL3Byb2MvdXB0aW1lXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBpZiAoZnNjYW5mKGZpbGUsICIlZiAlZiIsICZ1cF90aW1lLCAmaWRsZV90aW1lKSAhPSAyKSB7CisgICAgaWYgKGZzY2FuZihmaWxlLCAiJSpmICVmIiwgJmlkbGVfdGltZSkgIT0gMSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBwYXJzZSAvcHJvYy91cHRpbWVcbiIpOwogICAgICAgICBmY2xvc2UoZmlsZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgZmNsb3NlKGZpbGUpOwogCisgICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdXBfdGltZXNwZWMpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgbW9ub3RvbmljIHRpbWVcbiIpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgdXBfdGltZSA9IHVwX3RpbWVzcGVjLnR2X3NlYyArIHVwX3RpbWVzcGVjLnR2X25zZWMgLyAxZTk7CisKICAgICBlbGFwc2VkID0gZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgaWYgKGVsYXBzZWQgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZWxhcHNlZFJlYWx0aW1lIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS90b29sYm94L3dpcGUuYyBiL3Rvb2xib3gvd2lwZS5jCmluZGV4IDdlMjYzZmQuLjY1MGEwZDYgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvd2lwZS5jCisrKyBiL3Rvb2xib3gvd2lwZS5jCkBAIC01LDcgKzUsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3JlYm9vdC5oPgorI2luY2x1ZGUgPGN1dGlscy9hbmRyb2lkX3JlYm9vdC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpZm5kZWYgUEFUSF9NQVgKQEAgLTYzLDcgKzYzLDcgQEAKIAkJd2lwZSAoIi9zeXN0ZW0iKTsKICAgICAgICAgd2lwZSAoIi9kYXRhIik7CiAJCWZwcmludGYoc3Rkb3V0LCAiRGV2aWNlIG51a2VkISBSZWJvb3RpbmcuLi5cbiIpOwotCQlyZXQgPSByZWJvb3QoUkJfQVVUT0JPT1QpOworCQlyZXQgPSBhbmRyb2lkX3JlYm9vdChBTkRST0lEX1JCX1JFU1RBUlQsIDAsIDApOwogCSAgICBpZiAocmV0IDwgMCkgewogCSAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZWJvb3QgZmFpbGVkLCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKIAkgICAgICAgIHJldHVybiAxOwo=