LyoKICogRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgVFNDMjAwMCBjb250cm9sbGVyIG9uIFRSQUIgYm9hcmQgKHVzZWQgZm9yIHNjYW5uaW5nCiAqIHRoZXJtbyBzZW5zb3JzKQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWFydGluIEtyYXVzZSwgVFEtU3lzdGVtcyBHbWJILCBtYXJ0aW4ua3JhdXNlQHRxcy5kZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDIgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgV29sZmdhbmcgRGVuaywgd2RAZGVueC5kZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHMzYzI0MDAuaD4KI2luY2x1ZGUgPGRpdjY0Lmg+CiNpbmNsdWRlICJ0c2MyMDAwLmgiCgojaW5jbHVkZSAiUHQxMDAwX3RlbXBfZGF0YS5oIgoKLyogaGVscGVyIGZ1bmN0aW9uICovCiNkZWZpbmUgYWJzKHZhbHVlKSAoKCh2YWx1ZSkgPCAwKSA/ICgodmFsdWUpKi0xKSA6ICh2YWx1ZSkpCgovKgogKiBNYXhpbWFsIGFsbG93ZWQgZGV2aWF0aW9uIGJldHdlZW4gdHdvIGltbWVkaWF0ZSBtZWFzc3VybWVudHMgb2YgYW4gYW5hbG9nCiAqIHRoZXJtbyBjaGFubmVsLiAxIERJR0lUID0gMC4wMjc2ILBDLiBUaGlzIGlzIHVzZWQgdG8gZmlsdGVyIHNwb3JhZGljCiAqICJqdW1wcyIgaW4gbWVhc3VybWVudC4KICovCiNkZWZpbmUgTUFYX0RFVklBVElPTgkxOAkvKiB1bml0OiBESUdJVHMgb2YgYWRjOyAxOCBESUdJVCA9IDAuNSCwQyAqLwoKdm9pZCB0c2MyMDAwX3NwaV9pbml0KHZvaWQpCnsKCVMzQzI0WDBfR1BJTyAqIGNvbnN0IGdwaW8gPSBTM0MyNFgwX0dldEJhc2VfR1BJTygpOwoJUzNDMjRYMF9TUEkgKiBjb25zdCBzcGkgPSBTM0MyNFgwX0dldEJhc2VfU1BJKCk7CglpbnQgaTsKCgkvKiBDb25maWd1cmUgSS9PIHBvcnRzLiAqLwoJZ3Bpby0+UERDT04gPSAoZ3Bpby0+UERDT04gJiAweEYzRkZGRikgfCAweDA0MDAwMDsKCWdwaW8tPlBHQ09OID0gKGdwaW8tPlBHQ09OICYgMHgwRjNGRkYpIHwgMHgwMDgwMDA7CglncGlvLT5QR0NPTiA9IChncGlvLT5QR0NPTiAmIDB4MENGRkZGKSB8IDB4MDIwMDAwOwoJZ3Bpby0+UEdDT04gPSAoZ3Bpby0+UEdDT04gJiAweDAzRkZGRikgfCAweDA4MDAwMDsKCglDTFJfQ1NfVE9VQ0goKTsKCglzcGktPmNoWzBdLlNQUFJFID0gMHgxRjsgLyogQmF1ZC1yYXRlIGNhLiA1MTRrSHogKi8KCXNwaS0+Y2hbMF0uU1BQSU4gPSAweDAxOyAvKiBTUEktTU9TSSBob2xkcyBMZXZlbCBhZnRlciBsYXN0IGJpdCAqLwoJc3BpLT5jaFswXS5TUENPTiA9IDB4MUE7IC8qIFBvbGxpbmcsIFByZXNjYWxlciwgTWFzdGVyLCBDUE9MPTAsCgkJCQkgICAgQ1BIQT0xICovCgoJLyogRHVtbXkgYnl0ZSBlbnN1cmVzIGNsb2NrIHRvIGJlIGxvdy4gKi8KCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CgkJc3BpLT5jaFswXS5TUFREQVQgPSAweEZGOwoJfQoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwp9CgoKdm9pZCBzcGlfd2FpdF90cmFuc21pdF9kb25lKHZvaWQpCnsKCVMzQzI0WDBfU1BJICogY29uc3Qgc3BpID0gUzNDMjRYMF9HZXRCYXNlX1NQSSgpOwoKCXdoaWxlICghKHNwaS0+Y2hbMF0uU1BTVEEgJiAweDAxKSk7IC8qIHdhaXQgdW50aWwgdHJhbnNmZXIgaXMgZG9uZSAqLwp9CgoKdm9pZCB0c2MyMDAwX3dyaXRlKHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgZGF0YSkKewoJUzNDMjRYMF9TUEkgKiBjb25zdCBzcGkgPSBTM0MyNFgwX0dldEJhc2VfU1BJKCk7Cgl1bnNpZ25lZCBpbnQgY29tbWFuZDsKCglTRVRfQ1NfVE9VQ0goKTsKCWNvbW1hbmQgPSByZWc7CglzcGktPmNoWzBdLlNQVERBVCA9IChjb21tYW5kICYgMHhGRjAwKSA+PiA4OwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoY29tbWFuZCAmIDB4MDBGRik7CglzcGlfd2FpdF90cmFuc21pdF9kb25lKCk7CglzcGktPmNoWzBdLlNQVERBVCA9IChkYXRhICYgMHhGRjAwKSA+PiA4OwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoZGF0YSAmIDB4MDBGRik7CglzcGlfd2FpdF90cmFuc21pdF9kb25lKCk7CgoJQ0xSX0NTX1RPVUNIKCk7Cn0KCgp1bnNpZ25lZCBzaG9ydCB0c2MyMDAwX3JlYWQgKHVuc2lnbmVkIHNob3J0IHJlZykKewoJdW5zaWduZWQgc2hvcnQgY29tbWFuZCwgZGF0YTsKCVMzQzI0WDBfU1BJICogY29uc3Qgc3BpID0gUzNDMjRYMF9HZXRCYXNlX1NQSSgpOwoKCVNFVF9DU19UT1VDSCgpOwoJY29tbWFuZCA9IDB4ODAwMCB8IHJlZzsKCglzcGktPmNoWzBdLlNQVERBVCA9IChjb21tYW5kICYgMHhGRjAwKSA+PiA4OwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoY29tbWFuZCAmIDB4MDBGRik7CglzcGlfd2FpdF90cmFuc21pdF9kb25lKCk7CgoJc3BpLT5jaFswXS5TUFREQVQgPSAweEZGOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJZGF0YSA9IHNwaS0+Y2hbMF0uU1BSREFUOwoJc3BpLT5jaFswXS5TUFREQVQgPSAweEZGOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoKCUNMUl9DU19UT1VDSCgpOwoJcmV0dXJuIChzcGktPmNoWzBdLlNQUkRBVCAmIDB4MEZGKSB8IChkYXRhIDw8IDgpOwp9CgoKdm9pZCB0c2MyMDAwX3NldF9tdXggKHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglTM0MyNFgwX0dQSU8gKiBjb25zdCBncGlvID0gUzNDMjRYMF9HZXRCYXNlX0dQSU8oKTsKCglDTFJfTVVYMV9FTkFCTEU7IENMUl9NVVgyX0VOQUJMRTsKCUNMUl9NVVgzX0VOQUJMRTsgQ0xSX01VWDRfRU5BQkxFOwoJc3dpdGNoIChjaGFubmVsKSB7CgljYXNlIDA6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgxX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMToKCQlTRVRfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDFfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAyOgoJCUNMUl9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYMV9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDM6CgkJU0VUX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgxX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgNDoKCQlDTFJfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDJfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA1OgoJCVNFVF9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYMl9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDY6CgkJQ0xSX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgyX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgNzoKCQlTRVRfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDJfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA4OgoJCUNMUl9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYM19FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDk6CgkJU0VUX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgzX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTA6CgkJQ0xSX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgzX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTE6CgkJU0VUX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgzX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTI6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTM6CgkJU0VUX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTQ6CgkJQ0xSX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTU6CgkJU0VUX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJfQp9CgoKdm9pZCB0c2MyMDAwX3NldF9yYW5nZSAodW5zaWduZWQgaW50IHJhbmdlKQp7CglTM0MyNFgwX0dQSU8gKiBjb25zdCBncGlvID0gUzNDMjRYMF9HZXRCYXNlX0dQSU8oKTsKCglzd2l0Y2ggKHJhbmdlKSB7CgljYXNlIDE6CgkJQ0xSX1NFTF9URU1QX1ZfMDsgU0VUX1NFTF9URU1QX1ZfMTsKCQlDTFJfU0VMX1RFTVBfVl8yOyBDTFJfU0VMX1RFTVBfVl8zOwoJCWJyZWFrOwoJY2FzZSAyOgoJCUNMUl9TRUxfVEVNUF9WXzA7IENMUl9TRUxfVEVNUF9WXzE7CgkJQ0xSX1NFTF9URU1QX1ZfMjsgU0VUX1NFTF9URU1QX1ZfMzsKCQlicmVhazsKCWNhc2UgMzoKCQlTRVRfU0VMX1RFTVBfVl8wOyBDTFJfU0VMX1RFTVBfVl8xOwoJCVNFVF9TRUxfVEVNUF9WXzI7IENMUl9TRUxfVEVNUF9WXzM7CgkJYnJlYWs7Cgl9Cn0KCgp1MTYgdHNjMjAwMF9yZWFkX2NoYW5uZWwgKHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1MTYgcmVzOwoKCXRzYzIwMDBfc2V0X211eChjaGFubmVsKTsKCXVkZWxheSgyMCAqIFRTQzIwMDBfREVMQVlfQkFTRSk7CgoJdHNjMjAwMF93cml0ZShUU0MyMDAwX1JFR19BREMsIDB4MjAzNik7CglhZGNfd2FpdF9jb252ZXJzaW9uX2RvbmUgKCk7CglyZXMgPSB0c2MyMDAwX3JlYWQoVFNDMjAwMF9SRUdfQVVYMSk7CglyZXR1cm4gcmVzOwp9CgoKczMyIHRzYzIwMDBfY29udGFjdF90ZW1wICh2b2lkKQp7Cglsb25nIGFkY19wdDEwMDAsIG9mZnNldDsKCWxvbmcgdV9wdDEwMDA7Cglsb25nIGNvbnRhY3RfdGVtcDsKCWxvbmcgdGVtcDEsIHRlbXAyOwoKCXRzYzIwMDBfcmVnX2luaXQgKCk7Cgl0c2MyMDAwX3NldF9yYW5nZSAoMyk7CgoJLyoKCSAqIEJlY2F1c2Ugb2Ygc3BvcmFkaWMgImp1bXBzIiBpbiB0aGUgbWVhc3VyZWQgYWRjIHZhbHVlcyBldmVyeQoJICogY2hhbm5lbCBpcyByZWFkIHR3byB0aW1lcy4gSWYgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlCgkgKiBiZXR3ZWVuIHRoZSB0d28gbWVhc3VyZW1lbnRzLCB0aGVuIHByaW50IGFuIGVycm9yIGFuZCBkbyBhIHRoaXJkCgkgKiBtZWFzdXJlbWVudCwgYmVjYXVzZSBpdCBpcyB2ZXJ5IHVubGlrZWx5IHRoYXQgYSBzdWNjZXNzaXZlIHRoaXJkCgkgKiBtZWFzdXJlbWVudCBnb2VzIGFsc28gd3JvbmcuCgkgKi8KCXRlbXAxID0gdHNjMjAwMF9yZWFkX2NoYW5uZWwgKDE0KTsKCXRlbXAyID0gdHNjMjAwMF9yZWFkX2NoYW5uZWwgKDE0KTsKCWlmIChhYnModGVtcDIgLSB0ZW1wMSkgPCBNQVhfREVWSUFUSU9OKQoJCWFkY19wdDEwMDAgPSB0ZW1wMjsKCWVsc2UgewoJCXByaW50ZiAoIiVzOiByZWFkIGFkYyB2YWx1ZSAoY2hhbm5lbCAxNCkgZXhjZWVkZWQgbWF4IGFsbG93ZWQgIgoJCQkiZGV2aWF0aW9uOiAlZCAqIDAuMDI3NiCwQ1xuIiwKCQkJX19GVU5DVElPTl9fLCBNQVhfREVWSUFUSU9OKTsKCQlwcmludGYgKCJhZGMgdmFsdWUgMTogJWxkIERJR0lUc1xuYWRjIHZhbHVlIDI6ICVsZCBESUdJVHNcbiIsCgkJCXRlbXAxLCB0ZW1wMik7CgkJYWRjX3B0MTAwMCA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNCk7CgkJcHJpbnRmICgidXNlICh0aGlyZCByZWFkKSBhZGMgdmFsdWU6IGFkY19wdDEwMDAgPSAiCgkJCSIlbGQgRElHSVRzXG4iLAlhZGNfcHQxMDAwKTsKCX0KCWRlYnVnICgicmVhZCBjaGFubmVsIDE0IChwdDEwMDAgYWRjIHZhbHVlKTogJWxkXG4iLCBhZGNfcHQxMDAwKTsKCgl0ZW1wMSA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNSk7Cgl0ZW1wMiA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNSk7CglpZiAoYWJzKHRlbXAyIC0gdGVtcDEpIDwgTUFYX0RFVklBVElPTikKCQlvZmZzZXQgPSB0ZW1wMjsKCWVsc2UgewoJCXByaW50ZiAoIiVzOiByZWFkIGFkYyB2YWx1ZSAoY2hhbm5lbCAxNSkgZXhjZWVkZWQgbWF4IGFsbG93ZWQgIgoJCQkiZGV2aWF0aW9uOiAlZCAqIDAuMDI3NiCwQ1xuIiwKCQkJX19GVU5DVElPTl9fLCBNQVhfREVWSUFUSU9OKTsKCQlwcmludGYgKCJhZGMgdmFsdWUgMTogJWxkIERJR0lUc1xuYWRjIHZhbHVlIDI6ICVsZCBESUdJVHNcbiIsCgkJCXRlbXAxLCB0ZW1wMik7CgkJb2Zmc2V0ID0gdHNjMjAwMF9yZWFkX2NoYW5uZWwgKDE1KTsKCQlwcmludGYgKCJ1c2UgKHRoaXJkIHJlYWQpIGFkYyB2YWx1ZTogb2Zmc2V0ID0gJWxkIERJR0lUc1xuIiwKCQkJb2Zmc2V0KTsKCX0KCWRlYnVnICgicmVhZCBjaGFubmVsIDE1IChvZmZzZXQpOiAlbGRcbiIsIG9mZnNldCk7CgoJLyoKCSAqIEZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHZvbHRhZ2UgZHJvcCBvbiBQVDEwMDAgcmVzaXN0b3I6IHVfcHQxMDAwID0KCSAqIHhfcmFuZ2UzICogKGFkY19yYXcgLSBvZmZzZXQpIC8gMTAuIEZvcm11bGEgdG8gY2FsY3VsYXRlIHhfcmFuZ2UzOgoJICogeF9yYW5nZTMgPSAoMjUwMCAqICgxMDAwMDAwICsgZXJyX3ZyZWYgKyBlcnJfYW1wMykpIC8gKDQwOTUqNikuIFRoZQoJICogZXJyb3IgY29ycmVjdGlvbiBWYWx1ZXMgZXJyX3ZyZWYgYW5kIGVycl9hbXAzIGFyZSBhc3N1bWVkIGFzIDAgaW4KCSAqIHUtYm9vdCwgYmVjYXVzZSB0aGlzIGNvdWxkIGNhdXNlIG9ubHkgYSB2ZXJ5IHNtYWxsIGVycm9yICg8IDElKS4KCSAqLwoJdV9wdDEwMDAgPSAoMTAxNzUwICogKGFkY19wdDEwMDAgLSBvZmZzZXQpKSAvIDEwOwoJZGVidWcgKCJ1X3B0MTAwMDogJWxkXG4iLCB1X3B0MTAwMCk7CgoJaWYgKHRzYzIwMDBfaW50ZXJwb2xhdGUodV9wdDEwMDAsIFB0MTAwMF90ZW1wX3RhYmxlLAoJCQkJJmNvbnRhY3RfdGVtcCkgPT0gLTEpIHsKCQlwcmludGYgKCIlczogZXJyb3IgaW50ZXJwb2xhdGluZyBQVDEwMDAgdmxhdWVcbiIsCgkJCSBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAoLTEwMDApOwoJfQoJZGVidWcgKCJjb250YWN0X3RlbXA6ICVsZFxuIiwgY29udGFjdF90ZW1wKTsKCglyZXR1cm4gY29udGFjdF90ZW1wOwp9CgoKdm9pZCB0c2MyMDAwX3JlZ19pbml0ICh2b2lkKQp7CglTM0MyNFgwX0dQSU8gKiBjb25zdCBncGlvID0gUzNDMjRYMF9HZXRCYXNlX0dQSU8oKTsKCgl0c2MyMDAwX3dyaXRlKFRTQzIwMDBfUkVHX0FEQywgMHgyMDM2KTsKCXRzYzIwMDBfd3JpdGUoVFNDMjAwMF9SRUdfUkVGLCAweDAwMTEpOwoJdHNjMjAwMF93cml0ZShUU0MyMDAwX1JFR19EQUNDVEwsIDB4MDAwMCk7CgoJQ09OX01VWDA7CglDT05fTVVYMTsKCglDT05fTVVYMV9FTkFCTEU7CglDT05fTVVYMl9FTkFCTEU7CglDT05fTVVYM19FTkFCTEU7CglDT05fTVVYNF9FTkFCTEU7CgoJQ09OX1NFTF9URU1QX1ZfMDsKCUNPTl9TRUxfVEVNUF9WXzE7CglDT05fU0VMX1RFTVBfVl8yOwoJQ09OX1NFTF9URU1QX1ZfMzsKCgl0c2MyMDAwX3NldF9tdXgoMCk7Cgl0c2MyMDAwX3NldF9yYW5nZSgwKTsKfQoKCmludCB0c2MyMDAwX2ludGVycG9sYXRlKGxvbmcgdmFsdWUsIGxvbmcgZGF0YVtdWzJdLCBsb25nICpyZXN1bHQpCnsKCWludCBpOwoJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKCgkvKiB0aGUgZGF0YSBpcyBzb3J0ZWQgYW5kIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVwcGVyCgkgKiBsaW1pdCBzbyB3ZSBjYW4gZWFzaWx5IGNoZWNrIGZvciBvdXQtb2YtYmFuZCB2YWx1ZXMKCSAqLwoJaWYgKGRhdGFbMF1bMF0gPCB2YWx1ZSB8fCBkYXRhWzFdWzBdID4gdmFsdWUpCgkJcmV0dXJuIC0xOwoKCWkgPSAxOwoJd2hpbGUgKGRhdGFbaV1bMF0gPCB2YWx1ZSkKCQlpKys7CgoJLyogVG8gcHJldmVudCBvdmVyZmxvdyB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBpbnRlcm1lZGlhdGUKCSAgIHJlc3VsdCBpbiAnbG9uZyBsb25nJy4KCSovCgoJdmFsID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpKGRhdGFbaV1bMV0gLSBkYXRhW2ktMV1bMV0pCgkJICAgKiAodW5zaWduZWQgbG9uZyBsb25nKSh2YWx1ZSAtIGRhdGFbaS0xXVswXSkpOwoJZG9fZGl2KHZhbCwgKGRhdGFbaV1bMF0gLSBkYXRhW2ktMV1bMF0pKTsKCSpyZXN1bHQgPSBkYXRhW2ktMV1bMV0gKyB2YWw7CgoJcmV0dXJuIDA7Cn0KCgp2b2lkIGFkY193YWl0X2NvbnZlcnNpb25fZG9uZSh2b2lkKQp7Cgl3aGlsZSAoISh0c2MyMDAwX3JlYWQoVFNDMjAwMF9SRUdfQURDKSAmICgxIDw8IDE0KSkpOwp9Cg==