ZGlmZiAtLWdpdCBhL3NyYy9yZWdleHAuYyBiL3NyYy9yZWdleHAuYwppbmRleCBhOTkxNWEzLi5jNGY4OTIwIDEwMDY0NAotLS0gYS9zcmMvcmVnZXhwLmMKKysrIGIvc3JjL3JlZ2V4cC5jCkBAIC03NCwxMSArNzQsMTIgQEAKICAqIChIZXJlIHdlIGhhdmUgb25lIG9mIHRoZSBzdWJ0bGUgc3ludGF4IGRlcGVuZGVuY2llczoJYW4gaW5kaXZpZHVhbCBCUkFOQ0gKICAqIChhcyBvcHBvc2VkIHRvIGEgY29sbGVjdGlvbiBvZiB0aGVtKSBpcyBuZXZlciBjb25jYXRlbmF0ZWQgd2l0aCBhbnl0aGluZwogICogYmVjYXVzZSBvZiBvcGVyYXRvciBwcmVjZWRlbmNlKS4gIFRoZSAibmV4dCIgcG9pbnRlciBvZiBhIEJSQUNFU19DT01QTEVYCi0gKiBub2RlIHBvaW50cyB0byB0aGUgbm9kZSBhZnRlciB0aGUgc3R1ZmYgdG8gYmUgcmVwZWF0ZWQuICBUaGUgb3BlcmFuZCBvZiBzb21lCi0gKiB0eXBlcyBvZiBub2RlIGlzIGEgbGl0ZXJhbCBzdHJpbmc7IGZvciBvdGhlcnMsIGl0IGlzIGEgbm9kZSBsZWFkaW5nIGludG8gYQotICogc3ViLUZTTS4gIEluIHBhcnRpY3VsYXIsIHRoZSBvcGVyYW5kIG9mIGEgQlJBTkNIIG5vZGUgaXMgdGhlIGZpcnN0IG5vZGUgb2YKLSAqIHRoZSBicmFuY2guCShOQiB0aGlzIGlzICpub3QqIGEgdHJlZSBzdHJ1Y3R1cmU6IHRoZSB0YWlsIG9mIHRoZSBicmFuY2gKLSAqIGNvbm5lY3RzIHRvIHRoZSB0aGluZyBmb2xsb3dpbmcgdGhlIHNldCBvZiBCUkFOQ0hlcy4pCisgKiBub2RlIHBvaW50cyB0byB0aGUgbm9kZSBhZnRlciB0aGUgc3R1ZmYgdG8gYmUgcmVwZWF0ZWQuCisgKiBUaGUgb3BlcmFuZCBvZiBzb21lIHR5cGVzIG9mIG5vZGUgaXMgYSBsaXRlcmFsIHN0cmluZzsgZm9yIG90aGVycywgaXQgaXMgYQorICogbm9kZSBsZWFkaW5nIGludG8gYSBzdWItRlNNLiAgSW4gcGFydGljdWxhciwgdGhlIG9wZXJhbmQgb2YgYSBCUkFOQ0ggbm9kZQorICogaXMgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGJyYW5jaC4KKyAqIChOQiB0aGlzIGlzICpub3QqIGEgdHJlZSBzdHJ1Y3R1cmU6IHRoZSB0YWlsIG9mIHRoZSBicmFuY2ggY29ubmVjdHMgdG8gdGhlCisgKiB0aGluZyBmb2xsb3dpbmcgdGhlIHNldCBvZiBCUkFOQ0hlcy4pCiAgKgogICogcGF0dGVybglpcyBjb2RlZCBsaWtlOgogICoKQEAgLTk3LDYgKzk4LDE0IEBACiAgKgkJICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICoKICAqCisgKgkJICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoJCSAgICAgICBWCQkgICAgICB8CisgKiA8YWE+XCsJQlJBTkNIIDxhYT4gLS0+IEJSQU5DSCAtLT4gQkFDSyBCUkFOQ0ggLS0+IE5PVEhJTkcgLS0+IEVORAorICoJCSAgICAgfAkgICAgICAgICAgICAgfAkgICAgICAgIF4JCSAgICAgICBeCisgKgkJICAgICB8CSAgICAgICAgICAgICArLS0tLS0tLS0tLSsJCSAgICAgICB8CisgKgkJICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKgogICoJCQkJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICoJCQkJCVYJCQkgIHwKICAqIDxhYT5ce30JQlJBTkNIIEJSQUNFX0xJTUlUUyAtLT4gQlJBQ0VfQ09NUExFWCA8YWE+IC0tPiBCQUNLICBFTkQKQEAgLTM4Niw3ICszOTUsMTAgQEAKIHN0YXRpYyBjaGFyX3UgUkVHRVhQX0FCQlJbXSA9ICJucnRlYmRveHVVIjsKIAogc3RhdGljIGludAliYWNrc2xhc2hfdHJhbnMgX19BUkdTKChpbnQgYykpOwotc3RhdGljIGludAlza2lwX2NsYXNzX25hbWUgX19BUkdTKChjaGFyX3UgKipwcCkpOworc3RhdGljIGludAlnZXRfY2hhcl9jbGFzcyBfX0FSR1MoKGNoYXJfdSAqKnBwKSk7CitzdGF0aWMgaW50CWdldF9lcXVpX2NsYXNzIF9fQVJHUygoY2hhcl91ICoqcHApKTsKK3N0YXRpYyB2b2lkCXJlZ19lcXVpX2NsYXNzIF9fQVJHUygoaW50IGMpKTsKK3N0YXRpYyBpbnQJZ2V0X2NvbGxfZWxlbWVudCBfX0FSR1MoKGNoYXJfdSAqKnBwKSk7CiBzdGF0aWMgY2hhcl91CSpza2lwX2FueW9mIF9fQVJHUygoY2hhcl91ICpwKSk7CiBzdGF0aWMgdm9pZAlpbml0X2NsYXNzX3RhYiBfX0FSR1MoKHZvaWQpKTsKIApAQCAtNDA4LDEyICs0MjAsMTIgQEAKIH0KIAogLyoKLSAqIENoZWNrIGZvciBhIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAgInBwIiBwb2ludHMgdG8gdGhlICdbJy4KKyAqIENoZWNrIGZvciBhIGNoYXJhY3RlciBjbGFzcyBuYW1lICJbOm5hbWU6XSIuICAicHAiIHBvaW50cyB0byB0aGUgJ1snLgogICogUmV0dXJucyBvbmUgb2YgdGhlIENMQVNTXyBpdGVtcy4gQ0xBU1NfTk9ORSBtZWFucyB0aGF0IG5vIGl0ZW0gd2FzCiAgKiByZWNvZ25pemVkLiAgT3RoZXJ3aXNlICJwcCIgaXMgYWR2YW5jZWQgdG8gYWZ0ZXIgdGhlIGl0ZW0uCiAgKi8KICAgICBzdGF0aWMgaW50Ci1za2lwX2NsYXNzX25hbWUocHApCitnZXRfY2hhcl9jbGFzcyhwcCkKICAgICBjaGFyX3UJKipwcDsKIHsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqKGNsYXNzX25hbWVzW10pID0KQEAgLTQ2Nyw1NSArNDc5LDYgQEAKIH0KIAogLyoKLSAqIFNraXAgb3ZlciBhICJbXSIgcmFuZ2UuCi0gKiAicCIgbXVzdCBwb2ludCB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSAnWycuCi0gKiBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyBvbiB0aGUgbWF0Y2hpbmcgJ10nLCBvciB0aGUgdGVybWluYXRpbmcgTlVMLgotICovCi0gICAgc3RhdGljIGNoYXJfdSAqCi1za2lwX2FueW9mKHApCi0gICAgY2hhcl91CSpwOwotewotICAgIGludAkJY3BvX2xpdDsJLyogJ2Nwb3B0aW9ucycgY29udGFpbnMgJ2wnIGZsYWcgKi8KLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgaW50CQlsOwotI2VuZGlmCi0KLSAgICBjcG9fbGl0ID0gKCFyZWdfc3luICYmIHZpbV9zdHJjaHIocF9jcG8sIENQT19MSVRFUkFMKSAhPSBOVUxMKTsKLQotICAgIGlmICgqcCA9PSAnXicpCS8qIENvbXBsZW1lbnQgb2YgcmFuZ2UuICovCi0JKytwOwotICAgIGlmICgqcCA9PSAnXScgfHwgKnAgPT0gJy0nKQotCSsrcDsKLSAgICB3aGlsZSAoKnAgIT0gTlVMICYmICpwICE9ICddJykKLSAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQotCWlmIChoYXNfbWJ5dGUgJiYgKGwgPSAoKm1iX3B0cjJsZW5fY2hlY2spKHApKSA+IDEpCi0JICAgIHAgKz0gbDsKLQllbHNlCi0jZW5kaWYKLQkgICAgaWYgKCpwID09ICctJykKLQkgICAgewotCQkrK3A7Ci0JCWlmICgqcCAhPSAnXScgJiYgKnAgIT0gTlVMKQotCQkgICAgbWJfcHRyX2FkdihwKTsKLQkgICAgfQotCWVsc2UgaWYgKCpwID09ICdcXCcKLQkJJiYgKHZpbV9zdHJjaHIoUkVHRVhQX0lOUkFOR0UsIHBbMV0pICE9IE5VTEwKLQkJICAgIHx8ICghY3BvX2xpdCAmJiB2aW1fc3RyY2hyKFJFR0VYUF9BQkJSLCBwWzFdKSAhPSBOVUxMKSkpCi0JICAgIHAgKz0gMjsKLQllbHNlIGlmICgqcCA9PSAnWycpCi0JewotCSAgICBpZiAoc2tpcF9jbGFzc19uYW1lKCZwKSA9PSBDTEFTU19OT05FKQotCQkrK3A7IC8qIEl0IHdhcyBub3QgYSBjbGFzcyBuYW1lICovCi0JfQotCWVsc2UKLQkgICAgKytwOwotICAgIH0KLQotICAgIHJldHVybiBwOwotfQotCi0vKgogICogU3BlY2lmaWMgdmVyc2lvbiBvZiBjaGFyYWN0ZXIgY2xhc3MgZnVuY3Rpb25zLgogICogVXNpbmcgYSB0YWJsZSB0byBrZWVwIHRoaXMgZmFzdC4KICAqLwpAQCAtNjk1LDYgKzY1OCw4IEBACiBzdGF0aWMgdm9pZAlyZWdjIF9fQVJHUygoaW50IGIpKTsKICNpZmRlZiBGRUFUX01CWVRFCiBzdGF0aWMgdm9pZAlyZWdtYmMgX19BUkdTKChpbnQgYykpOworI2Vsc2UKKyMgZGVmaW5lIHJlZ21iYyhjKSByZWdjKGMpCiAjZW5kaWYKIHN0YXRpYyB2b2lkCXJlZ2luc2VydCBfX0FSR1MoKGludCwgY2hhcl91ICopKTsKIHN0YXRpYyB2b2lkCXJlZ2luc2VydF9saW1pdHMgX19BUkdTKChpbnQsIGxvbmcsIGxvbmcsIGNoYXJfdSAqKSk7CkBAIC03MjUsNiArNjkwLDIxMCBAQAogfQogCiAvKgorICogQ2hlY2sgZm9yIGFuIGVxdWl2YWxlbmNlIGNsYXNzIG5hbWUgIls9YT1dIi4gICJwcCIgcG9pbnRzIHRvIHRoZSAnWycuCisgKiBSZXR1cm5zIGEgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgY2xhc3MuIFplcm8gbWVhbnMgdGhhdCBubyBpdGVtIHdhcworICogcmVjb2duaXplZC4gIE90aGVyd2lzZSAicHAiIGlzIGFkdmFuY2VkIHRvIGFmdGVyIHRoZSBpdGVtLgorICovCisgICAgc3RhdGljIGludAorZ2V0X2VxdWlfY2xhc3MocHApCisgICAgY2hhcl91CSoqcHA7Cit7CisgICAgaW50CQljOworICAgIGludAkJbCA9IDE7CisgICAgY2hhcl91CSpwID0gKnBwOworCisgICAgaWYgKHBbMV0gPT0gJz0nKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSkKKwkgICAgbCA9IG1iX3B0cjJsZW5fY2hlY2socCArIDIpOworI2VuZGlmCisJaWYgKHBbbCArIDJdID09ICc9JyAmJiBwW2wgKyAzXSA9PSAnXScpCisJeworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJYyA9IG1iX3B0cjJjaGFyKHAgKyAyKTsKKwkgICAgZWxzZQorI2VuZGlmCisJCWMgPSBwWzJdOworCSAgICAqcHAgKz0gbCArIDQ7CisJICAgIHJldHVybiBjOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9kdWNlIHRoZSBieXRlcyBmb3IgZXF1aXZhbGVuY2UgY2xhc3MgImMiLgorICogQ3VycmVudGx5IG9ubHkgaGFuZGxlcyBsYXRpbjEsIGxhdGluOSBhbmQgdXRmLTguCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcmVnX2VxdWlfY2xhc3MoYykKKyAgICBpbnQJICAgIGM7Cit7CisjaWZkZWYgRkVBVF9NQllURQorICAgIGlmIChlbmNfdXRmOCB8fCBTVFJDTVAocF9lbmMsICJsYXRpbjEiKSA9PSAwCisJCQkJCSAgICAgIHx8IFNUUkNNUChwX2VuYywgImxhdGluOSIpID09IDApCisjZW5kaWYKKyAgICB7CisJc3dpdGNoIChjKQorCXsKKwkgICAgY2FzZSAnQSc6IGNhc2UgJ8AnOiBjYXNlICfBJzogY2FzZSAnwic6CisJICAgIGNhc2UgJ8MnOiBjYXNlICfEJzogY2FzZSAnxSc6CisJCSAgICAgIHJlZ21iYygnQScpOyByZWdtYmMoJ8AnKTsgcmVnbWJjKCfBJyk7IHJlZ21iYygnwicpOworCQkgICAgICByZWdtYmMoJ8MnKTsgcmVnbWJjKCfEJyk7IHJlZ21iYygnxScpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ0MnOiBjYXNlICfHJzoKKwkJICAgICAgcmVnbWJjKCdDJyk7IHJlZ21iYygnxycpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ0UnOiBjYXNlICfIJzogY2FzZSAnySc6IGNhc2UgJ8onOiBjYXNlICfLJzoKKwkJICAgICAgcmVnbWJjKCdFJyk7IHJlZ21iYygnyCcpOyByZWdtYmMoJ8knKTsgcmVnbWJjKCfKJyk7CisJCSAgICAgIHJlZ21iYygnyycpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ0knOiBjYXNlICfMJzogY2FzZSAnzSc6IGNhc2UgJ84nOiBjYXNlICfPJzoKKwkJICAgICAgcmVnbWJjKCdJJyk7IHJlZ21iYygnzCcpOyByZWdtYmMoJ80nKTsgcmVnbWJjKCfOJyk7CisJCSAgICAgIHJlZ21iYygnzycpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ04nOiBjYXNlICfRJzoKKwkJICAgICAgcmVnbWJjKCdOJyk7IHJlZ21iYygn0ScpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ08nOiBjYXNlICfSJzogY2FzZSAn0yc6IGNhc2UgJ9QnOiBjYXNlICfVJzogY2FzZSAn1ic6CisJCSAgICAgIHJlZ21iYygnTycpOyByZWdtYmMoJ9InKTsgcmVnbWJjKCfTJyk7IHJlZ21iYygn1CcpOworCQkgICAgICByZWdtYmMoJ9UnKTsgcmVnbWJjKCfWJyk7CisJCSAgICAgIHJldHVybjsKKwkgICAgY2FzZSAnVSc6IGNhc2UgJ9knOiBjYXNlICfaJzogY2FzZSAn2yc6IGNhc2UgJ9wnOgorCQkgICAgICByZWdtYmMoJ1UnKTsgcmVnbWJjKCfZJyk7IHJlZ21iYygn2icpOyByZWdtYmMoJ9snKTsKKwkJICAgICAgcmVnbWJjKCfcJyk7CisJCSAgICAgIHJldHVybjsKKwkgICAgY2FzZSAnWSc6IGNhc2UgJ90nOgorCQkgICAgICByZWdtYmMoJ1knKTsgcmVnbWJjKCfdJyk7CisJCSAgICAgIHJldHVybjsKKwkgICAgY2FzZSAnYSc6IGNhc2UgJ+AnOiBjYXNlICfhJzogY2FzZSAn4ic6CisJICAgIGNhc2UgJ+MnOiBjYXNlICfkJzogY2FzZSAn5Sc6CisJCSAgICAgIHJlZ21iYygnYScpOyByZWdtYmMoJ+AnKTsgcmVnbWJjKCfhJyk7IHJlZ21iYygn4icpOworCQkgICAgICByZWdtYmMoJ+MnKTsgcmVnbWJjKCfkJyk7IHJlZ21iYygn5ScpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ2MnOiBjYXNlICfnJzoKKwkJICAgICAgcmVnbWJjKCdjJyk7IHJlZ21iYygn5ycpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ2UnOiBjYXNlICfoJzogY2FzZSAn6Sc6IGNhc2UgJ+onOiBjYXNlICfrJzoKKwkJICAgICAgcmVnbWJjKCdlJyk7IHJlZ21iYygn6CcpOyByZWdtYmMoJ+knKTsgcmVnbWJjKCfqJyk7CisJCSAgICAgIHJlZ21iYygn6ycpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ2knOiBjYXNlICfsJzogY2FzZSAn7Sc6IGNhc2UgJ+4nOiBjYXNlICfvJzoKKwkJICAgICAgcmVnbWJjKCdpJyk7IHJlZ21iYygn7CcpOyByZWdtYmMoJ+0nKTsgcmVnbWJjKCfuJyk7CisJCSAgICAgIHJlZ21iYygn7ycpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ24nOiBjYXNlICfxJzoKKwkJICAgICAgcmVnbWJjKCduJyk7IHJlZ21iYygn8ScpOworCQkgICAgICByZXR1cm47CisJICAgIGNhc2UgJ28nOiBjYXNlICfyJzogY2FzZSAn8yc6IGNhc2UgJ/QnOiBjYXNlICf1JzogY2FzZSAn9ic6CisJCSAgICAgIHJlZ21iYygnbycpOyByZWdtYmMoJ/InKTsgcmVnbWJjKCfzJyk7IHJlZ21iYygn9CcpOworCQkgICAgICByZWdtYmMoJ/UnKTsgcmVnbWJjKCf2Jyk7CisJCSAgICAgIHJldHVybjsKKwkgICAgY2FzZSAndSc6IGNhc2UgJ/knOiBjYXNlICf6JzogY2FzZSAn+yc6IGNhc2UgJ/wnOgorCQkgICAgICByZWdtYmMoJ3UnKTsgcmVnbWJjKCf5Jyk7IHJlZ21iYygn+icpOyByZWdtYmMoJ/snKTsKKwkJICAgICAgcmVnbWJjKCf8Jyk7CisJCSAgICAgIHJldHVybjsKKwkgICAgY2FzZSAneSc6IGNhc2UgJ/0nOiBjYXNlICf/JzoKKwkJICAgICAgcmVnbWJjKCd5Jyk7IHJlZ21iYygn/ScpOyByZWdtYmMoJ/8nKTsKKwkJICAgICAgcmV0dXJuOworCX0KKyAgICB9CisgICAgcmVnbWJjKGMpOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgY29sbGF0aW5nIGVsZW1lbnQgIlsuYS5dIi4gICJwcCIgcG9pbnRzIHRvIHRoZSAnWycuCisgKiBSZXR1cm5zIGEgY2hhcmFjdGVyLiBaZXJvIG1lYW5zIHRoYXQgbm8gaXRlbSB3YXMgcmVjb2duaXplZC4gIE90aGVyd2lzZQorICogInBwIiBpcyBhZHZhbmNlZCB0byBhZnRlciB0aGUgaXRlbS4KKyAqIEN1cnJlbnRseSBvbmx5IHNpbmdsZSBjaGFyYWN0ZXJzIGFyZSByZWNvZ25pemVkIQorICovCisgICAgc3RhdGljIGludAorZ2V0X2NvbGxfZWxlbWVudChwcCkKKyAgICBjaGFyX3UJKipwcDsKK3sKKyAgICBpbnQJCWM7CisgICAgaW50CQlsID0gMTsKKyAgICBjaGFyX3UJKnAgPSAqcHA7CisKKyAgICBpZiAocFsxXSA9PSAnLicpCisgICAgeworI2lmZGVmIEZFQVRfTUJZVEUKKwlpZiAoaGFzX21ieXRlKQorCSAgICBsID0gbWJfcHRyMmxlbl9jaGVjayhwICsgMik7CisjZW5kaWYKKwlpZiAocFtsICsgMl0gPT0gJy4nICYmIHBbbCArIDNdID09ICddJykKKwl7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCQljID0gbWJfcHRyMmNoYXIocCArIDIpOworCSAgICBlbHNlCisjZW5kaWYKKwkJYyA9IHBbMl07CisJICAgICpwcCArPSBsICsgNDsKKwkgICAgcmV0dXJuIGM7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogU2tpcCBvdmVyIGEgIltdIiByYW5nZS4KKyAqICJwIiBtdXN0IHBvaW50IHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlICdbJy4KKyAqIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG9uIHRoZSBtYXRjaGluZyAnXScsIG9yIHRoZSB0ZXJtaW5hdGluZyBOVUwuCisgKi8KKyAgICBzdGF0aWMgY2hhcl91ICoKK3NraXBfYW55b2YocCkKKyAgICBjaGFyX3UJKnA7Cit7CisgICAgaW50CQljcG9fbGl0OwkvKiAnY3BvcHRpb25zJyBjb250YWlucyAnbCcgZmxhZyAqLworICAgIGludAkJY3BvX2JzbDsJLyogJ2Nwb3B0aW9ucycgY29udGFpbnMgJ1wnIGZsYWcgKi8KKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaW50CQlsOworI2VuZGlmCisKKyAgICBjcG9fbGl0ID0gKCFyZWdfc3luICYmIHZpbV9zdHJjaHIocF9jcG8sIENQT19MSVRFUkFMKSAhPSBOVUxMKTsKKyAgICBjcG9fYnNsID0gKCFyZWdfc3luICYmIHZpbV9zdHJjaHIocF9jcG8sIENQT19CQUNLU0wpICE9IE5VTEwpOworCisgICAgaWYgKCpwID09ICdeJykJLyogQ29tcGxlbWVudCBvZiByYW5nZS4gKi8KKwkrK3A7CisgICAgaWYgKCpwID09ICddJyB8fCAqcCA9PSAnLScpCisJKytwOworICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgKnAgIT0gJ10nKQorICAgIHsKKyNpZmRlZiBGRUFUX01CWVRFCisJaWYgKGhhc19tYnl0ZSAmJiAobCA9ICgqbWJfcHRyMmxlbl9jaGVjaykocCkpID4gMSkKKwkgICAgcCArPSBsOworCWVsc2UKKyNlbmRpZgorCSAgICBpZiAoKnAgPT0gJy0nKQorCSAgICB7CisJCSsrcDsKKwkJaWYgKCpwICE9ICddJyAmJiAqcCAhPSBOVUwpCisJCSAgICBtYl9wdHJfYWR2KHApOworCSAgICB9CisJZWxzZSBpZiAoKnAgPT0gJ1xcJworCQkmJiAhY3BvX2JzbAorCQkmJiAodmltX3N0cmNocihSRUdFWFBfSU5SQU5HRSwgcFsxXSkgIT0gTlVMTAorCQkgICAgfHwgKCFjcG9fbGl0ICYmIHZpbV9zdHJjaHIoUkVHRVhQX0FCQlIsIHBbMV0pICE9IE5VTEwpKSkKKwkgICAgcCArPSAyOworCWVsc2UgaWYgKCpwID09ICdbJykKKwl7CisJICAgIGlmIChnZXRfY2hhcl9jbGFzcygmcCkgPT0gQ0xBU1NfTk9ORQorCQkgICAgJiYgZ2V0X2VxdWlfY2xhc3MoJnApID09IDAKKwkJICAgICYmIGdldF9jb2xsX2VsZW1lbnQoJnApID09IDApCisJCSsrcDsgLyogSXQgd2FzIG5vdCBhIGNsYXNzIG5hbWUgKi8KKwl9CisJZWxzZQorCSAgICArK3A7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKy8qCiAgKiBTa2lwIHBhc3QgcmVndWxhciBleHByZXNzaW9uLgogICogU3RvcCBhdCBlbmQgb2YgInN0YXJ0cCIgb3Igd2hlcmUgImRpcmMiIGlzIGZvdW5kICgnLycsICc/JywgZXRjKS4KICAqIFRha2UgY2FyZSBvZiBjaGFyYWN0ZXJzIHdpdGggYSBiYWNrc2xhc2ggaW4gZnJvbnQgb2YgaXQuCkBAIC0xMjUxLDE2ICsxNDIwLDYgQEAKIAkqZmxhZ3AgPSBmbGFnczsKIAlyZXR1cm4gcmV0OwogICAgIH0KLSAgICBpZiAoIShmbGFncyAmIEhBU1dJRFRIKSAmJiByZV9tdWx0aV90eXBlKG9wKSA9PSBNVUxUSV9NVUxUKQotICAgIHsKLQlpZiAob3AgPT0gTWFnaWMoJyonKSkKLQkgICAgRU1TR19NX1JFVF9OVUxMKF8oIkU1NjogJXMqIG9wZXJhbmQgY291bGQgYmUgZW1wdHkiKSwKLQkJCQkJCSAgICAgICByZWdfbWFnaWMgPj0gTUFHSUNfT04pOwotCWlmIChvcCA9PSBNYWdpYygnKycpKQotCSAgICBFTVNHX01fUkVUX05VTEwoXygiRTU3OiAlcysgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIpLAotCQkJCQkJICAgICAgIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwpOwotCS8qICJce30iIGlzIGNoZWNrZWQgYmVsb3csIGl0J3MgYWxsb3dlZCB3aGVuIHRoZXJlIGlzIGFuIHVwcGVyIGxpbWl0ICovCi0gICAgfQogICAgIC8qIGRlZmF1bHQgZmxhZ3MgKi8KICAgICAqZmxhZ3AgPSAoV09SU1QgfCBTUFNUQVJUIHwgKGZsYWdzICYgKEhBU05MIHwgSEFTTE9PS0JIKSkpOwogCkBAIC0xMzM4LDEwICsxNDk3LDYgQEAKIAljYXNlIE1hZ2ljKCd7Jyk6CiAJICAgIGlmICghcmVhZF9saW1pdHMoJm1pbnZhbCwgJm1heHZhbCkpCiAJCXJldHVybiBOVUxMOwotCSAgICBpZiAoIShmbGFncyAmIEhBU1dJRFRIKSAmJiAobWF4dmFsID4gbWludmFsCi0JCQkJID8gbWF4dmFsID49IE1BWF9MSU1JVCA6IG1pbnZhbCA+PSBNQVhfTElNSVQpKQotCQlFTVNHX01fUkVUX05VTEwoXygiRTU4OiAlc3sgb3BlcmFuZCBjb3VsZCBiZSBlbXB0eSIpLAotCQkJCQkJICAgICAgcmVnX21hZ2ljID09IE1BR0lDX0FMTCk7CiAJICAgIGlmIChmbGFncyAmIFNJTVBMRSkKIAkgICAgewogCQlyZWdpbnNlcnQoQlJBQ0VfU0lNUExFLCByZXQpOwpAQCAtMTM5MSw2ICsxNTQ2LDcgQEAKICAgICBjaGFyX3UJICAgICpyZXQ7CiAgICAgaW50CQkgICAgZmxhZ3M7CiAgICAgaW50CQkgICAgY3BvX2xpdDsJICAgIC8qICdjcG9wdGlvbnMnIGNvbnRhaW5zICdsJyBmbGFnICovCisgICAgaW50CQkgICAgY3BvX2JzbDsJICAgIC8qICdjcG9wdGlvbnMnIGNvbnRhaW5zICdcJyBmbGFnICovCiAgICAgaW50CQkgICAgYzsKICAgICBzdGF0aWMgY2hhcl91ICAgKmNsYXNzY2hhcnMgPSAoY2hhcl91ICopIi5pSWtLZkZwUHNTZER4WG9Pd1doSGFBbEx1VSI7CiAgICAgc3RhdGljIGludAkgICAgY2xhc3Njb2Rlc1tdID0ge0FOWSwgSURFTlQsIFNJREVOVCwgS1dPUkQsIFNLV09SRCwKQEAgLTE0MDYsNiArMTU2Miw3IEBACiAKICAgICAqZmxhZ3AgPSBXT1JTVDsJCS8qIFRlbnRhdGl2ZWx5LiAqLwogICAgIGNwb19saXQgPSAoIXJlZ19zeW4gJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX0xJVEVSQUwpICE9IE5VTEwpOworICAgIGNwb19ic2wgPSAoIXJlZ19zeW4gJiYgdmltX3N0cmNocihwX2NwbywgQ1BPX0JBQ0tTTCkgIT0gTlVMTCk7CiAKICAgICBjID0gZ2V0Y2hyKCk7CiAgICAgc3dpdGNoIChjKQpAQCAtMTgyNyw3ICsxOTg0LDEwIEBACiAKIAkJLyogQXQgdGhlIHN0YXJ0ICddJyBhbmQgJy0nIG1lYW4gdGhlIGxpdGVyYWwgY2hhcmFjdGVyLiAqLwogCQlpZiAoKnJlZ3BhcnNlID09ICddJyB8fCAqcmVncGFyc2UgPT0gJy0nKQorCQl7CisJCSAgICBzdGFydGMgPSAqcmVncGFyc2U7CiAJCSAgICByZWdjKCpyZWdwYXJzZSsrKTsKKwkJfQogCiAJCXdoaWxlICgqcmVncGFyc2UgIT0gTlVMICYmICpyZWdwYXJzZSAhPSAnXScpCiAJCXsKQEAgLTE4NDUsMTUgKzIwMDUsMjIgQEAKIAkJCX0KIAkJCWVsc2UKIAkJCXsKKwkJCSAgICAvKiBBbHNvIGFjY2VwdCAiYS1bLnouXSIgKi8KKwkJCSAgICBlbmRjID0gMDsKKwkJCSAgICBpZiAoKnJlZ3BhcnNlID09ICdbJykKKwkJCQllbmRjID0gZ2V0X2NvbGxfZWxlbWVudCgmcmVncGFyc2UpOworCQkJICAgIGlmIChlbmRjID09IDApCisJCQkgICAgewogI2lmZGVmIEZFQVRfTUJZVEUKLQkJCSAgICBpZiAoaGFzX21ieXRlKQotCQkJCWVuZGMgPSBtYl9wdHIyY2hhcl9hZHYoJnJlZ3BhcnNlKTsKLQkJCSAgICBlbHNlCisJCQkJaWYgKGhhc19tYnl0ZSkKKwkJCQkgICAgZW5kYyA9IG1iX3B0cjJjaGFyX2FkdigmcmVncGFyc2UpOworCQkJCWVsc2UKICNlbmRpZgotCQkJCWVuZGMgPSAqcmVncGFyc2UrKzsKKwkJCQkgICAgZW5kYyA9ICpyZWdwYXJzZSsrOworCQkJICAgIH0KIAogCQkJICAgIC8qIEhhbmRsZSBcbzQwLCBceDIwIGFuZCBcdTIwQUMgc3R5bGUgc2VxdWVuY2VzICovCi0JCQkgICAgaWYgKGVuZGMgPT0gJ1xcJyAmJiAhY3BvX2xpdCkKKwkJCSAgICBpZiAoZW5kYyA9PSAnXFwnICYmICFjcG9fbGl0ICYmICFjcG9fYnNsKQogCQkJCWVuZGMgPSBjb2xsX2dldF9jaGFyKCk7CiAKIAkJCSAgICBpZiAoc3RhcnRjID4gZW5kYykKQEAgLTE4OTIsOCArMjA1OSwxMCBAQAogCQkgICAgICogT25seSAiXF0iLCAiXF4iLCAiXF0iIGFuZCAiXFwiIGFyZSBzcGVjaWFsIGluIFZpLiAgVmltCiAJCSAgICAgKiBhY2NlcHRzICJcdCIsICJcZSIsIGV0Yy4sIGJ1dCBvbmx5IHdoZW4gdGhlICdsJyBmbGFnIGluCiAJCSAgICAgKiAnY3BvcHRpb25zJyBpcyBub3QgaW5jbHVkZWQuCisJCSAgICAgKiBQb3NpeCBkb2Vzbid0IHJlY29nbml6ZSBiYWNrc2xhc2ggYXQgYWxsLgogCQkgICAgICovCiAJCSAgICBlbHNlIGlmICgqcmVncGFyc2UgPT0gJ1xcJworCQkJICAgICYmICFjcG9fYnNsCiAJCQkgICAgJiYgKHZpbV9zdHJjaHIoUkVHRVhQX0lOUkFOR0UsIHJlZ3BhcnNlWzFdKSAhPSBOVUxMCiAJCQkJfHwgKCFjcG9fbGl0CiAJCQkJICAgICYmIHZpbV9zdHJjaHIoUkVHRVhQX0FCQlIsCkBAIC0xOTQyLDE1ICsyMTExLDMwIEBACiAJCQlpbnQgY19jbGFzczsKIAkJCWludCBjdTsKIAotCQkJY19jbGFzcyA9IHNraXBfY2xhc3NfbmFtZSgmcmVncGFyc2UpOworCQkJY19jbGFzcyA9IGdldF9jaGFyX2NsYXNzKCZyZWdwYXJzZSk7CiAJCQlzdGFydGMgPSAtMTsKIAkJCS8qIENoYXJhY3RlcnMgYXNzdW1lZCB0byBiZSA4IGJpdHMhICovCiAJCQlzd2l0Y2ggKGNfY2xhc3MpCiAJCQl7CiAJCQkgICAgY2FzZSBDTEFTU19OT05FOgotCQkJCS8qIGxpdGVyYWwgJ1snLCBhbGxvdyBbWy14XSBhcyBhIHJhbmdlICovCi0JCQkJc3RhcnRjID0gKnJlZ3BhcnNlKys7Ci0JCQkJcmVnYyhzdGFydGMpOworCQkJCWNfY2xhc3MgPSBnZXRfZXF1aV9jbGFzcygmcmVncGFyc2UpOworCQkJCWlmIChjX2NsYXNzICE9IDApCisJCQkJeworCQkJCSAgICAvKiBwcm9kdWNlIGVxdWl2YWxlbmNlIGNsYXNzICovCisJCQkJICAgIHJlZ19lcXVpX2NsYXNzKGNfY2xhc3MpOworCQkJCX0KKwkJCQllbHNlIGlmICgoY19jbGFzcyA9CisJCQkJCSAgICBnZXRfY29sbF9lbGVtZW50KCZyZWdwYXJzZSkpICE9IDApCisJCQkJeworCQkJCSAgICAvKiBwcm9kdWNlIGEgY29sbGF0aW5nIGVsZW1lbnQgKi8KKwkJCQkgICAgcmVnbWJjKGNfY2xhc3MpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCSAgICAvKiBsaXRlcmFsICdbJywgYWxsb3cgW1steF0gYXMgYSByYW5nZSAqLworCQkJCSAgICBzdGFydGMgPSAqcmVncGFyc2UrKzsKKwkJCQkgICAgcmVnYyhzdGFydGMpOworCQkJCX0KIAkJCQlicmVhazsKIAkJCSAgICBjYXNlIENMQVNTX0FMTlVNOgogCQkJCWZvciAoY3UgPSAxOyBjdSA8PSAyNTU7IGN1KyspCkBAIC0yMzU0LDYgKzI1MzgsOCBAQAogICAgIHN0YXRpYyBpbnQKIHBlZWtjaHIoKQogeworICAgIHN0YXRpYyBpbnQJYWZ0ZXJfc2xhc2ggPSBGQUxTRTsKKwogICAgIGlmIChjdXJjaHIgPT0gLTEpCiAgICAgewogCXN3aXRjaCAoY3VyY2hyID0gcmVncGFyc2VbMF0pCkBAIC0yMzkyLDEwICsyNTc4LDE2IEBACiAJCWN1cmNociA9IE1hZ2ljKGN1cmNocik7CiAJICAgIGJyZWFrOwogCWNhc2UgJyonOgotCSAgICAvKiAqIGlzIG5vdCBtYWdpYyBhcyB0aGUgdmVyeSBmaXJzdCBjaGFyYWN0ZXIsIGVnICI/KnB0ciIgYW5kIHdoZW4KLQkgICAgICogYWZ0ZXIgJ14nLCBlZyAiL14qcHRyIiAqLwotCSAgICBpZiAocmVnX21hZ2ljID49IE1BR0lDX09OICYmICFhdF9zdGFydAotCQkJCSAmJiAhKHByZXZfYXRfc3RhcnQgJiYgcHJldmNociA9PSBNYWdpYygnXicpKSkKKwkgICAgLyogKiBpcyBub3QgbWFnaWMgYXMgdGhlIHZlcnkgZmlyc3QgY2hhcmFjdGVyLCBlZyAiPypwdHIiLCB3aGVuCisJICAgICAqIGFmdGVyICdeJywgZWcgIi9eKnB0ciIgYW5kIHdoZW4gYWZ0ZXIgIlwoIiwgIlx8IiwgIlwmIi4gIEJ1dAorCSAgICAgKiAiXChcKiIgaXMgbm90IG1hZ2ljLCB0aHVzIG11c3QgYmUgbWFnaWMgaWYgImFmdGVyX3NsYXNoIiAqLworCSAgICBpZiAocmVnX21hZ2ljID49IE1BR0lDX09OCisJCSAgICAmJiAhYXRfc3RhcnQKKwkJICAgICYmICEocHJldl9hdF9zdGFydCAmJiBwcmV2Y2hyID09IE1hZ2ljKCdeJykpCisJCSAgICAmJiAoYWZ0ZXJfc2xhc2gKKwkJCXx8IChwcmV2Y2hyICE9IE1hZ2ljKCcoJykKKwkJCSAgICAmJiBwcmV2Y2hyICE9IE1hZ2ljKCcmJykKKwkJCSAgICAmJiBwcmV2Y2hyICE9IE1hZ2ljKCd8JykpKSkKIAkJY3VyY2hyID0gTWFnaWMoJyonKTsKIAkgICAgYnJlYWs7CiAJY2FzZSAnXic6CkBAIC0yNDYwLDggKzI2NTIsMTAgQEAKIAkJICAgIHByZXZfYXRfc3RhcnQgPSBhdF9zdGFydDsKIAkJICAgIGF0X3N0YXJ0ID0gRkFMU0U7CS8qIGJlIGFibGUgdG8gc2F5ICIvXCpwdHIiICovCiAJCSAgICArK3JlZ3BhcnNlOworCQkgICAgKythZnRlcl9zbGFzaDsKIAkJICAgIHBlZWtjaHIoKTsKIAkJICAgIC0tcmVncGFyc2U7CisJCSAgICAtLWFmdGVyX3NsYXNoOwogCQkgICAgY3VyY2hyID0gdG9nZ2xlX01hZ2ljKGN1cmNocik7CiAJCX0KIAkJZWxzZSBpZiAodmltX3N0cmNocihSRUdFWFBfQUJCUiwgYykpCkBAIC0yNzIzLDcgKzI5MTcsNyBAQAogCSptYXh2YWwgPSBNQVhfTElNSVQ7CSAgICAvKiBJdCB3YXMgXHt9IG9yIFx7LX0gKi8KICAgICBpZiAoKnJlZ3BhcnNlID09ICdcXCcpCiAJcmVncGFyc2UrKzsJLyogQWxsb3cgZWl0aGVyIFx7Li4ufSBvciBcey4uLlx9ICovCi0gICAgaWYgKCpyZWdwYXJzZSAhPSAnfScgfHwgKCptYXh2YWwgPT0gMCAmJiAqbWludmFsID09IDApKQorICAgIGlmICgqcmVncGFyc2UgIT0gJ30nKQogICAgIHsKIAlzcHJpbnRmKChjaGFyICopSU9idWZmLCBfKCJFNTU0OiBTeW50YXggZXJyb3IgaW4gJXN7Li4ufSIpLAogCQkJCQkgIHJlZ19tYWdpYyA9PSBNQUdJQ19BTEwgPyAiIiA6ICJcXCIpOwpAQCAtMjgxNSw3ICszMDA5LDcgQEAKIAkqKHBwKSA9IChzYXZlcCktPnNlX3UucHRyOyB9CiAKIHN0YXRpYyBpbnQJcmVfbnVtX2NtcCBfX0FSR1MoKGxvbmdfdSB2YWwsIGNoYXJfdSAqc2NhbikpOwotc3RhdGljIGludAlyZWdtYXRjaCBfX0FSR1MoKGNoYXJfdSAqcHJvZykpOworc3RhdGljIGludAlyZWdtYXRjaCBfX0FSR1MoKGNoYXJfdSAqcHJvZywgcmVnc2F2ZV9UICpzdGFydHApKTsKIHN0YXRpYyBpbnQJcmVncmVwZWF0IF9fQVJHUygoY2hhcl91ICpwLCBsb25nIG1heGNvdW50KSk7CiAKICNpZmRlZiBERUJVRwpAQCAtMzI3Myw3ICszNDY3LDcgQEAKIAluZWVkX2NsZWFyX3pzdWJleHByID0gVFJVRTsKICNlbmRpZgogCi0gICAgaWYgKHJlZ21hdGNoKHByb2ctPnByb2dyYW0gKyAxKSkKKyAgICBpZiAocmVnbWF0Y2gocHJvZy0+cHJvZ3JhbSArIDEsIE5VTEwpKQogICAgIHsKIAljbGVhbnVwX3N1YmV4cHIoKTsKIAlpZiAoUkVHX01VTFRJKQpAQCAtMzM3OSw4ICszNTczLDkgQEAKICAqIHVuZGVmaW5lZCBzdGF0ZSEKICAqLwogICAgIHN0YXRpYyBpbnQKLXJlZ21hdGNoKHNjYW4pCityZWdtYXRjaChzY2FuLCBzdGFydHApCiAgICAgY2hhcl91CSpzY2FuOwkJLyogQ3VycmVudCBub2RlLiAqLworICAgIHJlZ3NhdmVfVAkqc3RhcnRwOwkvKiBzdGFydCBwb3NpdGlvbiBmb3IgQkFDSyAqLwogewogICAgIGNoYXJfdQkqbmV4dDsJCS8qIE5leHQgbm9kZS4gKi8KICAgICBpbnQJCW9wOwpAQCAtMzgwMyw2ICszOTk4LDEwIEBACiAJICAgIGJyZWFrOwogCiAJICBjYXNlIEJBQ0s6CisJICAgIC8qIFdoZW4gd2UgcnVuIGludG8gQkFDSyB3aXRob3V0IG1hdGNoaW5nIHNvbWV0aGluZyBub24tZW1wdHksIHdlCisJICAgICAqIGZhaWwuICovCisJICAgIGlmIChzdGFydHAgIT0gTlVMTCAmJiByZWdfc2F2ZV9lcXVhbChzdGFydHApKQorCQlyZXR1cm4gRkFMU0U7CiAJICAgIGJyZWFrOwogCiAJICBjYXNlIE1PUEVOICsgMDogICAvKiBNYXRjaCBzdGFydDogXHpzICovCkBAIC0zODIzLDcgKzQwMjIsNyBAQAogCQljbGVhbnVwX3N1YmV4cHIoKTsKIAkJc2F2ZV9zZSgmc2F2ZSwgJnJlZ19zdGFydHBvc1tub10sICZyZWdfc3RhcnRwW25vXSk7CiAKLQkJaWYgKHJlZ21hdGNoKG5leHQpKQorCQlpZiAocmVnbWF0Y2gobmV4dCwgc3RhcnRwKSkKIAkJICAgIHJldHVybiBUUlVFOwogCiAJCXJlc3RvcmVfc2UoJnNhdmUsICZyZWdfc3RhcnRwb3Nbbm9dLCAmcmVnX3N0YXJ0cFtub10pOwpAQCAtMzgzMyw3ICs0MDMyLDcgQEAKIAogCSAgY2FzZSBOT1BFTjoJICAgIC8qIFwlKCAqLwogCSAgY2FzZSBOQ0xPU0U6CSAgICAvKiBcKSBhZnRlciBcJSggKi8KLQkJaWYgKHJlZ21hdGNoKG5leHQpKQorCQlpZiAocmVnbWF0Y2gobmV4dCwgc3RhcnRwKSkKIAkJICAgIHJldHVybiBUUlVFOwogCQlyZXR1cm4gRkFMU0U7CiAJCS8qIGJyZWFrOyBOb3QgUmVhY2hlZCAqLwpAQCAtMzg1Niw3ICs0MDU1LDcgQEAKIAkJY2xlYW51cF96c3ViZXhwcigpOwogCQlzYXZlX3NlKCZzYXZlLCAmcmVnX3N0YXJ0enBvc1tub10sICZyZWdfc3RhcnR6cFtub10pOwogCi0JCWlmIChyZWdtYXRjaChuZXh0KSkKKwkJaWYgKHJlZ21hdGNoKG5leHQsIHN0YXJ0cCkpCiAJCSAgICByZXR1cm4gVFJVRTsKIAogCQlyZXN0b3JlX3NlKCZzYXZlLCAmcmVnX3N0YXJ0enBvc1tub10sICZyZWdfc3RhcnR6cFtub10pOwpAQCAtMzg4Myw3ICs0MDgyLDcgQEAKIAkJY2xlYW51cF9zdWJleHByKCk7CiAJCXNhdmVfc2UoJnNhdmUsICZyZWdfZW5kcG9zW25vXSwgJnJlZ19lbmRwW25vXSk7CiAKLQkJaWYgKHJlZ21hdGNoKG5leHQpKQorCQlpZiAocmVnbWF0Y2gobmV4dCwgc3RhcnRwKSkKIAkJICAgIHJldHVybiBUUlVFOwogCiAJCXJlc3RvcmVfc2UoJnNhdmUsICZyZWdfZW5kcG9zW25vXSwgJnJlZ19lbmRwW25vXSk7CkBAIC0zOTA5LDcgKzQxMDgsNyBAQAogCQljbGVhbnVwX3pzdWJleHByKCk7CiAJCXNhdmVfc2UoJnNhdmUsICZyZWdfZW5kenBvc1tub10sICZyZWdfZW5kenBbbm9dKTsKIAotCQlpZiAocmVnbWF0Y2gobmV4dCkpCisJCWlmIChyZWdtYXRjaChuZXh0LCBzdGFydHApKQogCQkgICAgcmV0dXJuIFRSVUU7CiAKIAkJcmVzdG9yZV9zZSgmc2F2ZSwgJnJlZ19lbmR6cG9zW25vXSwgJnJlZ19lbmR6cFtub10pOwpAQCAtNDA3Niw3ICs0Mjc1LDcgQEAKIAkJICAgIGRvCiAJCSAgICB7CiAJCQlyZWdfc2F2ZSgmc2F2ZSk7Ci0JCQlpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSkpCisJCQlpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSwgJnNhdmUpKQogCQkJICAgIHJldHVybiBUUlVFOwogCQkJcmVnX3Jlc3RvcmUoJnNhdmUpOwogCQkJc2NhbiA9IHJlZ25leHQoc2Nhbik7CkBAIC00MTM0LDcgKzQzMzMsNyBAQAogCQkJCSAgICA/IGJyYWNlX21pbltub10gOiBicmFjZV9tYXhbbm9dKSkKIAkJewogCQkgICAgcmVnX3NhdmUoJnNhdmUpOwotCQkgICAgaWYgKHJlZ21hdGNoKE9QRVJBTkQoc2NhbikpKQorCQkgICAgaWYgKHJlZ21hdGNoKE9QRVJBTkQoc2NhbiksICZzYXZlKSkKIAkJCXJldHVybiBUUlVFOwogCQkgICAgcmVnX3Jlc3RvcmUoJnNhdmUpOwogCQkgICAgLS1icmFjZV9jb3VudFtub107CS8qIGZhaWxlZCwgZGVjcmVtZW50IG1hdGNoIGNvdW50ICovCkBAIC00MTQ4LDExICs0MzQ3LDExIEBACiAJCSAgICBpZiAoYnJhY2VfY291bnRbbm9dIDw9IGJyYWNlX21heFtub10pCiAJCSAgICB7CiAJCQlyZWdfc2F2ZSgmc2F2ZSk7Ci0JCQlpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSkpCisJCQlpZiAocmVnbWF0Y2goT1BFUkFORChzY2FuKSwgJnNhdmUpKQogCQkJICAgIHJldHVybiBUUlVFOwkvKiBtYXRjaGVkIHNvbWUgbW9yZSB0aW1lcyAqLwogCQkJcmVnX3Jlc3RvcmUoJnNhdmUpOwogCQkJLS1icmFjZV9jb3VudFtub107ICAvKiBtYXRjaGVkIGp1c3QgZW5vdWdoIHRpbWVzICovCi0JCQkvKiBjb250aW51ZSB3aXRoIHRoZSBpdGVtcyBhZnRlciBce30gKi8KKwkJCS8qIHsgIGNvbnRpbnVlIHdpdGggdGhlIGl0ZW1zIGFmdGVyIFx7fSAqLwogCQkgICAgfQogCQl9CiAJCWVsc2UKQEAgLTQxNjEsNyArNDM2MCw3IEBACiAJCSAgICBpZiAoYnJhY2VfY291bnRbbm9dIDw9IGJyYWNlX21pbltub10pCiAJCSAgICB7CiAJCQlyZWdfc2F2ZSgmc2F2ZSk7Ci0JCQlpZiAocmVnbWF0Y2gobmV4dCkpCisJCQlpZiAocmVnbWF0Y2gobmV4dCwgJnNhdmUpKQogCQkJICAgIHJldHVybiBUUlVFOwogCQkJcmVnX3Jlc3RvcmUoJnNhdmUpOwogCQkJbmV4dCA9IE9QRVJBTkQoc2Nhbik7CkBAIC00MjM0LDcgKzQ0MzMsNyBAQAogCQkJCQkJICAgIHx8ICpyZWdpbnB1dCA9PSBuZXh0Yl9pYykKIAkJCXsKIAkJCSAgICByZWdfc2F2ZSgmc2F2ZSk7Ci0JCQkgICAgaWYgKHJlZ21hdGNoKG5leHQpKQorCQkJICAgIGlmIChyZWdtYXRjaChuZXh0LCBzdGFydHApKQogCQkJCXJldHVybiBUUlVFOwogCQkJICAgIHJlZ19yZXN0b3JlKCZzYXZlKTsKIAkJCX0KQEAgLTQyNzEsNyArNDQ3MCw3IEBACiAJCQkJCQkgICAgfHwgKnJlZ2lucHV0ID09IG5leHRiX2ljKQogCQkJewogCQkJICAgIHJlZ19zYXZlKCZzYXZlKTsKLQkJCSAgICBpZiAocmVnbWF0Y2gobmV4dCkpCisJCQkgICAgaWYgKHJlZ21hdGNoKG5leHQsICZzYXZlKSkKIAkJCQlyZXR1cm4gVFJVRTsKIAkJCSAgICByZWdfcmVzdG9yZSgmc2F2ZSk7CiAJCQl9CkBAIC00Mjk1LDcgKzQ0OTQsNyBAQAogCQkvKiBJZiB0aGUgb3BlcmFuZCBtYXRjaGVzLCB3ZSBmYWlsLiAgT3RoZXJ3aXNlIGJhY2t1cCBhbmQKIAkJICogY29udGludWUgd2l0aCB0aGUgbmV4dCBpdGVtLiAqLwogCQlyZWdfc2F2ZSgmc2F2ZSk7Ci0JCWlmIChyZWdtYXRjaChPUEVSQU5EKHNjYW4pKSkKKwkJaWYgKHJlZ21hdGNoKE9QRVJBTkQoc2NhbiksIHN0YXJ0cCkpCiAJCSAgICByZXR1cm4gRkFMU0U7CiAJCXJlZ19yZXN0b3JlKCZzYXZlKTsKIAkgICAgfQpAQCAtNDMwOSw3ICs0NTA4LDcgQEAKIAkJLyogSWYgdGhlIG9wZXJhbmQgZG9lc24ndCBtYXRjaCwgd2UgZmFpbC4gIE90aGVyd2lzZSBiYWNrdXAKIAkJICogYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgaXRlbS4gKi8KIAkJcmVnX3NhdmUoJnNhdmUpOwotCQlpZiAoIXJlZ21hdGNoKE9QRVJBTkQoc2NhbikpKQorCQlpZiAoIXJlZ21hdGNoKE9QRVJBTkQoc2NhbiksIHN0YXJ0cCkpCiAJCSAgICByZXR1cm4gRkFMU0U7CiAJCWlmIChvcCA9PSBNQVRDSCkJICAgIC8qIHplcm8td2lkdGggKi8KIAkJICAgIHJlZ19yZXN0b3JlKCZzYXZlKTsKQEAgLTQzMzEsNyArNDUzMCw3IEBACiAJCSAqIGZhc3Rlci4KIAkJICovCiAJCXJlZ19zYXZlKCZzYXZlX3N0YXJ0KTsKLQkJaWYgKHJlZ21hdGNoKG5leHQpKQorCQlpZiAocmVnbWF0Y2gobmV4dCwgc3RhcnRwKSkKIAkJewogCQkgICAgLyogc2F2ZSB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIGZvdW5kIG1hdGNoIGZvciBuZXh0ICovCiAJCSAgICByZWdfc2F2ZSgmc2F2ZV9hZnRlcik7CkBAIC00MzQ3LDcgKzQ1NDYsNyBAQAogCQkgICAgZm9yICg7OykKIAkJICAgIHsKIAkJCXJlZ19yZXN0b3JlKCZzYXZlX3N0YXJ0KTsKLQkJCWlmIChyZWdtYXRjaChPUEVSQU5EKHNjYW4pKQorCQkJaWYgKHJlZ21hdGNoKE9QRVJBTkQoc2NhbiksIHN0YXJ0cCkKIAkJCQkmJiByZWdfc2F2ZV9lcXVhbCgmYmVoaW5kX3BvcykpCiAJCQl7CiAJCQkgICAgYmVoaW5kX3BvcyA9IHNhdmVfYmVoaW5kX3BvczsK