LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaWMvc3NpLmg+CiNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KCmludCBzc2lfc2V0X2ludGVyZmFjZShpbnQgZnJlcSwgaW50IGxzYl9maXJzdCwgaW50IGludl9jbG9jaywgaW50IGludl9waGFzZSkKewoJdTggdGVtcD0wOwoKCWlmIChmcmVxID49IDgxOTIpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzQ7Cgl9IGVsc2UgaWYgKGZyZXEgPj0gNDA5NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfODsKCX0gZWxzZSBpZiAoZnJlcSA+PSAyMDQ4KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xNjsKCX0gZWxzZSBpZiAoZnJlcSA+PSAxMDI0KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8zMjsKCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTIpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzY0OwoJfSBlbHNlIGlmIChmcmVxID49IDI1NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMTI4OwoJfSBlbHNlIGlmIChmcmVxID49IDEyOCkgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMjU2OwoJfSBlbHNlIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzUxMjsKCX0KCglpZiAoIWxzYl9maXJzdCkgewoJCXRlbXAgfD0gTVNCRl9FTkI7Cgl9CgoJaWYgKGludl9jbG9jaykgewoJCXRlbXAgfD0gQ0xLX0lOVl9FTkI7Cgl9CgoJaWYgKGludl9waGFzZSkgewoJCXRlbXAgfD0gUEhTX0lOVl9FTkI7Cgl9CgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNUTCwgdGVtcCk7CgoJcmV0dXJuIDA7Cn0KCnU4IHNzaV90eHJ4X2J5dGUodTggZGF0YSkKewoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSVhNSVQsIGRhdGEpOwoJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNNRCwgU1NJQ01EX0NNRF9TRUxfWE1JVFJDVik7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7CglyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsKfQoKCnZvaWQgc3NpX3R4X2J5dGUodTggZGF0YSkKewoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSVhNSVQsIGRhdGEpOwoJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNNRCwgU1NJQ01EX0NNRF9TRUxfWE1JVCk7Cn0KCnU4IHNzaV9yeF9ieXRlKHZvaWQpCnsKCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDTUQsIFNTSUNNRF9DTURfU0VMX1JDVik7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7CglyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsKfQo=