LyoKICAgIGkyYy12aWFwcm8uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgICAgICAgICAgICAgbW9uaXRvcmluZwogICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgCiAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LCBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sCiAgICBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiovCgovKgogICBTdXBwb3J0cyBWaWEgZGV2aWNlczoKCTgyQzU5NkEvQiAoMHgzMDUwKQoJODJDNTk2QiAoMHgzMDUxKQoJODJDNjg2QS9CCgk4MjMxCgk4MjMzCgk4MjMzQSAoMHgzMTQ3IGFuZCAweDMxNzcpCgk4MjM1Cgk4MjM3CiAgIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZGV2aWNlLCB3aXRoIG9uZSBTTUJ1cyBpbnRlcmZhY2UuCiovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqdnQ1OTZfcGRldjsKCiNkZWZpbmUgU01CQkExCSAgIAkgMHg5MAojZGVmaW5lIFNNQkJBMiAgICAgCSAweDgwCiNkZWZpbmUgU01CQkEzICAgICAJIDB4RDAKCi8qIFNNQnVzIGFkZHJlc3Mgb2Zmc2V0cyAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgdnQ1OTZfc21iYTsKI2RlZmluZSBTTUJIU1RTVFMJKHZ0NTk2X3NtYmEgKyAwKQojZGVmaW5lIFNNQkhTTFZTVFMJKHZ0NTk2X3NtYmEgKyAxKQojZGVmaW5lIFNNQkhTVENOVAkodnQ1OTZfc21iYSArIDIpCiNkZWZpbmUgU01CSFNUQ01ECSh2dDU5Nl9zbWJhICsgMykKI2RlZmluZSBTTUJIU1RBREQJKHZ0NTk2X3NtYmEgKyA0KQojZGVmaW5lIFNNQkhTVERBVDAJKHZ0NTk2X3NtYmEgKyA1KQojZGVmaW5lIFNNQkhTVERBVDEJKHZ0NTk2X3NtYmEgKyA2KQojZGVmaW5lIFNNQkJMS0RBVAkodnQ1OTZfc21iYSArIDcpCiNkZWZpbmUgU01CU0xWQ05UCSh2dDU5Nl9zbWJhICsgOCkKI2RlZmluZSBTTUJTSERXQ01ECSh2dDU5Nl9zbWJhICsgOSkKI2RlZmluZSBTTUJTTFZFVlQJKHZ0NTk2X3NtYmEgKyAweEEpCiNkZWZpbmUgU01CU0xWREFUCSh2dDU5Nl9zbWJhICsgMHhDKQoKLyogUENJIEFkZHJlc3MgQ29uc3RhbnRzICovCgovKiBTTUJ1cyBkYXRhIGluIGNvbmZpZ3VyYXRpb24gc3BhY2UgY2FuIGJlIGZvdW5kIGluIHR3byBwbGFjZXMsCiAgIFdlIHRyeSB0byBzZWxlY3QgdGhlIGJldHRlciBvbmUqLwoKc3RhdGljIHVuc2lnbmVkIHNob3J0IHNtYl9jZl9oc3RjZmcgPSAweEQyOwoKI2RlZmluZSBTTUJIU1RDRkcgICAoc21iX2NmX2hzdGNmZykKI2RlZmluZSBTTUJTTFZDICAgICAoc21iX2NmX2hzdGNmZyArIDEpCiNkZWZpbmUgU01CU0hEVzEgICAgKHNtYl9jZl9oc3RjZmcgKyAyKQojZGVmaW5lIFNNQlNIRFcyICAgIChzbWJfY2ZfaHN0Y2ZnICsgMykKI2RlZmluZSBTTUJSRVYgICAgICAoc21iX2NmX2hzdGNmZyArIDQpCgovKiBPdGhlciBzZXR0aW5ncyAqLwojZGVmaW5lIE1BWF9USU1FT1VUCTUwMAojZGVmaW5lIEVOQUJMRV9JTlQ5CTAKCi8qIFZUODJDNTk2IGNvbnN0YW50cyAqLwojZGVmaW5lIFZUNTk2X1FVSUNLICAgICAgMHgwMAojZGVmaW5lIFZUNTk2X0JZVEUgICAgICAgMHgwNAojZGVmaW5lIFZUNTk2X0JZVEVfREFUQSAgMHgwOAojZGVmaW5lIFZUNTk2X1dPUkRfREFUQSAgMHgwQwojZGVmaW5lIFZUNTk2X0JMT0NLX0RBVEEgMHgxNAoKCi8qIElmIGZvcmNlIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUgdGhlCiAgIFZUNTk2LiBEQU5HRVJPVVMhICovCnN0YXRpYyBpbnQgZm9yY2U7Cm1vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjaWJseSBlbmFibGUgdGhlIFNNQnVzLiBEQU5HRVJPVVMhIik7CgovKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKICAgdGhlIFZUNTk2IGF0IHRoZSBnaXZlbiBhZGRyZXNzLiBWRVJZIERBTkdFUk9VUyEgKi8Kc3RhdGljIHUxNiBmb3JjZV9hZGRyOwptb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hZGRyLAoJCSAiRm9yY2libHkgZW5hYmxlIHRoZSBTTUJ1cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIgoJCSAiRVhUUkVNRUxZIERBTkdFUk9VUyEiKTsKCgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHZ0NTk2X2FkYXB0ZXI7CgovKiBBbm90aGVyIGludGVybmFsbHkgdXNlZCBmdW5jdGlvbiAqLwpzdGF0aWMgaW50IHZ0NTk2X3RyYW5zYWN0aW9uKHZvaWQpCnsKCWludCB0ZW1wOwoJaW50IHJlc3VsdCA9IDA7CglpbnQgdGltZW91dCA9IDA7CgoJZGV2X2RiZygmdnQ1OTZfYWRhcHRlci5kZXYsICJUcmFuc2FjdGlvbiAocHJlKTogQ05UPSUwMngsIENNRD0lMDJ4LCAiCgkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUQ05UKSwgCgkJaW5iX3AoU01CSFNUQ01EKSwgaW5iX3AoU01CSFNUQUREKSwgaW5iX3AoU01CSFNUREFUMCksIAoJCWluYl9wKFNNQkhTVERBVDEpKTsKCgkvKiBNYWtlIHN1cmUgdGhlIFNNQnVzIGhvc3QgaXMgcmVhZHkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCglpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAmIDB4MUYpIHsKCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlNNQnVzIGJ1c3kgKDB4JTAyeCkuICIKCQkJCSJSZXNldHRpbmcuLi5cbiIsIHRlbXApOwoJCQoJCW91dGJfcCh0ZW1wLCBTTUJIU1RTVFMpOwoJCWlmICgodGVtcCA9IGluYl9wKFNNQkhTVFNUUykpICYgMHgxRikgewoJCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIkZhaWxlZCEgKDB4JTAyeClcbiIsIHRlbXApOwoJCQkKCQkJcmV0dXJuIC0xOwoJCX0gZWxzZSB7CgkJCWRldl9kYmcoJnZ0NTk2X2FkYXB0ZXIuZGV2LCAiU3VjY2Vzc2Z1bGwhXG4iKTsKCQl9Cgl9CgoJLyogc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGJ5IHNldHRpbmcgYml0IDYgKi8KCW91dGJfcChpbmIoU01CSFNUQ05UKSB8IDB4MDQwLCBTTUJIU1RDTlQpOwoKCS8qIFdlIHdpbGwgYWx3YXlzIHdhaXQgZm9yIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQhIAoJICAgSSBkb24ndCBrbm93IGlmIFZJQSBuZWVkcyB0aGlzLCBJbnRlbCBkaWQgICovCglkbyB7CgkJbXNsZWVwKDEpOwoJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOwoJfSB3aGlsZSAoKHRlbXAgJiAweDAxKSAmJiAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKCgkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLwoJaWYgKHRpbWVvdXQgPj0gTUFYX1RJTUVPVVQpIHsKCQlyZXN1bHQgPSAtMTsKCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlNNQnVzIFRpbWVvdXQhXG4iKTsKCX0KCglpZiAodGVtcCAmIDB4MTApIHsKCQlyZXN1bHQgPSAtMTsKCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIkVycm9yOiBGYWlsZWQgYnVzIHRyYW5zYWN0aW9uXG4iKTsKCX0KCglpZiAodGVtcCAmIDB4MDgpIHsKCQlyZXN1bHQgPSAtMTsKCQlkZXZfaW5mbygmdnQ1OTZfYWRhcHRlci5kZXYsICJCdXMgY29sbGlzaW9uISBTTUJ1cyBtYXkgYmUgIgoJCQkibG9ja2VkIHVudGlsIG5leHQgaGFyZFxucmVzZXQuIChzb3JyeSEpXG4iKTsKCQkvKiBDbG9jayBzdG9wcyBhbmQgc2xhdmUgaXMgc3R1Y2sgaW4gbWlkLXRyYW5zbWlzc2lvbiAqLwoJfQoKCWlmICh0ZW1wICYgMHgwNCkgewoJCXJlc3VsdCA9IC0xOwoJCWRldl9kYmcoJnZ0NTk2X2FkYXB0ZXIuZGV2LCAiRXJyb3I6IG5vIHJlc3BvbnNlIVxuIik7Cgl9CgoJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJiAweDFGKSB7CgkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7CgkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJiAweDFGKSB7CgkJCWRldl93YXJuKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIkZhaWxlZCByZXNldCBhdCBlbmQgIgoJCQkJICJvZiB0cmFuc2FjdGlvbiAoJTAyeClcbiIsIHRlbXApOwoJCX0KCX0KCglkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlRyYW5zYWN0aW9uIChwb3N0KTogQ05UPSUwMngsIENNRD0lMDJ4LCAiCgkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUQ05UKSwKCQlpbmJfcChTTUJIU1RDTUQpLCBpbmJfcChTTUJIU1RBREQpLCBpbmJfcChTTUJIU1REQVQwKSwgCgkJaW5iX3AoU01CSFNUREFUMSkpOwoJCglyZXR1cm4gcmVzdWx0Owp9CgovKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCnN0YXRpYyBzMzIgdnQ1OTZfYWNjZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsCgkJdW5zaWduZWQgc2hvcnQgZmxhZ3MsICBjaGFyIHJlYWRfd3JpdGUsIHU4IGNvbW1hbmQsCgkJaW50IHNpemUsICB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSkKewoJaW50IGksIGxlbjsKCglzd2l0Y2ggKHNpemUpIHsKCWNhc2UgSTJDX1NNQlVTX1BST0NfQ0FMTDoKCQlkZXZfaW5mbygmdnQ1OTZfYWRhcHRlci5kZXYsCgkJCSAiSTJDX1NNQlVTX1BST0NfQ0FMTCBub3Qgc3VwcG9ydGVkIVxuIik7CgkJcmV0dXJuIC0xOwoJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CgkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKCQkgICAgICAgU01CSFNUQUREKTsKCQlzaXplID0gVlQ1OTZfUVVJQ0s7CgkJYnJlYWs7CgljYXNlIEkyQ19TTUJVU19CWVRFOgoJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCgkJICAgICAgIFNNQkhTVEFERCk7CgkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQoJCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKCQlzaXplID0gVlQ1OTZfQllURTsKCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKCQlvdXRiX3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAoJCSAgICAgICBTTUJIU1RBREQpOwoJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOwoJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKCQkJb3V0Yl9wKGRhdGEtPmJ5dGUsIFNNQkhTVERBVDApOwoJCXNpemUgPSBWVDU5Nl9CWVRFX0RBVEE7CgkJYnJlYWs7CgljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CgkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKCQkgICAgICAgU01CSFNUQUREKTsKCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKCQkJb3V0Yl9wKGRhdGEtPndvcmQgJiAweGZmLCBTTUJIU1REQVQwKTsKCQkJb3V0Yl9wKChkYXRhLT53b3JkICYgMHhmZjAwKSA+PiA4LCBTTUJIU1REQVQxKTsKCQl9CgkJc2l6ZSA9IFZUNTk2X1dPUkRfREFUQTsKCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CgkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKCQkgICAgICAgU01CSFNUQUREKTsKCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKCQkJbGVuID0gZGF0YS0+YmxvY2tbMF07CgkJCWlmIChsZW4gPCAwKQoJCQkJbGVuID0gMDsKCQkJaWYgKGxlbiA+IEkyQ19TTUJVU19CTE9DS19NQVgpCgkJCQlsZW4gPSBJMkNfU01CVVNfQkxPQ0tfTUFYOwoJCQlvdXRiX3AobGVuLCBTTUJIU1REQVQwKTsKCQkJaSA9IGluYl9wKFNNQkhTVENOVCk7CS8qIFJlc2V0IFNNQkJMS0RBVCAqLwoJCQlmb3IgKGkgPSAxOyBpIDw9IGxlbjsgaSsrKQoJCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2ldLCBTTUJCTEtEQVQpOwoJCX0KCQlzaXplID0gVlQ1OTZfQkxPQ0tfREFUQTsKCQlicmVhazsKCX0KCglvdXRiX3AoKHNpemUgJiAweDFDKSArIChFTkFCTEVfSU5UOSAmIDEpLCBTTUJIU1RDTlQpOwoKCWlmICh2dDU5Nl90cmFuc2FjdGlvbigpKSAvKiBFcnJvciBpbiB0cmFuc2FjdGlvbiAqLwoJCXJldHVybiAtMTsKCglpZiAoKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBWVDU5Nl9RVUlDSykpCgkJcmV0dXJuIDA7CgoJc3dpdGNoIChzaXplKSB7CgljYXNlIFZUNTk2X0JZVEU6CgkJLyogV2hlcmUgaXMgdGhlIHJlc3VsdCBwdXQ/IEkgYXNzdW1lIGhlcmUgaXQgaXMgaW4KCQkgKiBTTUJIU1REQVQwIGJ1dCBpdCBtaWdodCBqdXN0IGFzIHdlbGwgYmUgaW4gdGhlCgkJICogU01CSFNUQ01ELiBObyBjbHVlIGluIHRoZSBkb2NzIAoJCSAqLwoJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKCQlicmVhazsKCWNhc2UgVlQ1OTZfQllURV9EQVRBOgoJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKCQlicmVhazsKCWNhc2UgVlQ1OTZfV09SRF9EQVRBOgoJCWRhdGEtPndvcmQgPSBpbmJfcChTTUJIU1REQVQwKSArIChpbmJfcChTTUJIU1REQVQxKSA8PCA4KTsKCQlicmVhazsKCWNhc2UgVlQ1OTZfQkxPQ0tfREFUQToKCQlkYXRhLT5ibG9ja1swXSA9IGluYl9wKFNNQkhTVERBVDApOwoJCWlmIChkYXRhLT5ibG9ja1swXSA+IEkyQ19TTUJVU19CTE9DS19NQVgpCgkJCWRhdGEtPmJsb2NrWzBdID0gSTJDX1NNQlVTX0JMT0NLX01BWDsKCQlpID0gaW5iX3AoU01CSFNUQ05UKTsJLyogUmVzZXQgU01CQkxLREFUICovCgkJZm9yIChpID0gMTsgaSA8PSBkYXRhLT5ibG9ja1swXTsgaSsrKQoJCQlkYXRhLT5ibG9ja1tpXSA9IGluYl9wKFNNQkJMS0RBVCk7CgkJYnJlYWs7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHUzMiB2dDU5Nl9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKewoJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8CgkgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKCSAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOwp9CgpzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewoJLnNtYnVzX3hmZXIJPSB2dDU5Nl9hY2Nlc3MsCgkuZnVuY3Rpb25hbGl0eQk9IHZ0NTk2X2Z1bmMsCn07CgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHZ0NTk2X2FkYXB0ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAoJLmFsZ28JCT0gJnNtYnVzX2FsZ29yaXRobSwKCS5uYW1lCQk9ICJ1bnNldCIsCn07CgpzdGF0aWMgaW50IF9fZGV2aW5pdCB2dDU5Nl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKCXVuc2lnbmVkIGNoYXIgdGVtcDsKCWludCBlcnJvciA9IC1FTk9ERVY7CgkKCS8qIERldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgU01CdXMgYXJlYXMgKi8KCWlmIChmb3JjZV9hZGRyKSB7CgkJdnQ1OTZfc21iYSA9IGZvcmNlX2FkZHIgJiAweGZmZjA7CgkJZm9yY2UgPSAwOwoJCWdvdG8gZm91bmQ7Cgl9CgoJaWYgKChwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBpZC0+ZHJpdmVyX2RhdGEsICZ2dDU5Nl9zbWJhKSkgfHwKCSAgICAhKHZ0NTk2X3NtYmEgJiAweDEpKSB7CgkJLyogdHJ5IDJuZCBhZGRyZXNzIGFuZCBjb25maWcgcmVnLiBmb3IgNTk2ICovCgkJaWYgKGlkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9WSUFfODJDNTk2XzMgJiYKCQkgICAgIXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFNNQkJBMiwgJnZ0NTk2X3NtYmEpICYmCgkJICAgICh2dDU5Nl9zbWJhICYgMHgxKSkgewoJCQlzbWJfY2ZfaHN0Y2ZnID0gMHg4NDsKCQl9IGVsc2UgewoJCQkvKiBubyBtYXRjaGVzIGF0IGFsbCAqLwoJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgY29uZmlndXJlICIKCQkJCSJTTUJ1cyBJL08gQmFzZSBhZGRyZXNzXG4iKTsKCQkJcmV0dXJuIC1FTk9ERVY7CgkJfQoJfQoKCXZ0NTk2X3NtYmEgJj0gMHhmZmYwOwoJaWYgKHZ0NTk2X3NtYmEgPT0gMCkgewoJCWRldl9lcnIoJnBkZXYtPmRldiwgIlNNQnVzIGJhc2UgYWRkcmVzcyAiCgkJCSJ1bmluaXRpYWxpemVkIC0gdXBncmFkZSBCSU9TIG9yIHVzZSAiCgkJCSJmb3JjZV9hZGRyPTB4YWRkclxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgogZm91bmQ6CglpZiAoIXJlcXVlc3RfcmVnaW9uKHZ0NTk2X3NtYmEsIDgsICJ2aWFwcm8tc21idXMiKSkgewoJCWRldl9lcnIoJnBkZXYtPmRldiwgIlNNQnVzIHJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkgICAgICAgIHZ0NTk2X3NtYmEpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNNQkhTVENGRywgJnRlbXApOwoJLyogSWYgZm9yY2VfYWRkciBpcyBzZXQsIHdlIHByb2dyYW0gdGhlIG5ldyBhZGRyZXNzIGhlcmUuIEp1c3QgdG8gbWFrZQoJICAgc3VyZSwgd2UgZGlzYWJsZSB0aGUgVlQ1OTYgZmlyc3QuICovCglpZiAoZm9yY2VfYWRkcikgewoJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTTUJIU1RDRkcsIHRlbXAgJiAweGZlKTsKCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgaWQtPmRyaXZlcl9kYXRhLCB2dDU5Nl9zbWJhKTsKCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgU01CSFNUQ0ZHLCB0ZW1wIHwgMHgwMSk7CgkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIldBUk5JTkc6IFNNQnVzIGludGVyZmFjZSBzZXQgdG8gbmV3ICIKCQkgICAgICJhZGRyZXNzIDB4JTA0eCFcbiIsIHZ0NTk2X3NtYmEpOwoJfSBlbHNlIGlmICgodGVtcCAmIDEpID09IDApIHsKCQlpZiAoZm9yY2UpIHsKCQkJLyogTk9URTogVGhpcyBhc3N1bWVzIEkvTyBzcGFjZSBhbmQgb3RoZXIgYWxsb2NhdGlvbnMgCgkJCSAqIFdFUkUgZG9uZSBieSB0aGUgQmlvcyEgIERvbid0IGNvbXBsYWluIGlmIHlvdXIgCgkJCSAqIGhhcmR3YXJlIGRvZXMgd2VpcmQgdGhpbmdzIGFmdGVyIGVuYWJsaW5nIHRoaXMuIAoJCQkgKiA6JykgQ2hlY2sgZm9yIEJpb3MgdXBkYXRlcyBiZWZvcmUgcmVzb3J0aW5nIHRvIAoJCQkgKiB0aGlzLgoJCQkgKi8KCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFNNQkhTVENGRywgdGVtcCB8IDEpOwoJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRW5hYmxpbmcgU01CdXMgZGV2aWNlXG4iKTsKCQl9IGVsc2UgewoJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTTUJVUzogRXJyb3I6IEhvc3QgU01CdXMgIgoJCQkJImNvbnRyb2xsZXIgbm90IGVuYWJsZWQhIC0gdXBncmFkZSBCSU9TIG9yICIKCQkJCSJ1c2UgZm9yY2U9MVxuIik7CgkJCWdvdG8gcmVsZWFzZV9yZWdpb247CgkJfQoJfQoKCWlmICgodGVtcCAmIDB4MEUpID09IDgpCgkJZGV2X2RiZygmcGRldi0+ZGV2LCAidXNpbmcgSW50ZXJydXB0IDkgZm9yIFNNQnVzLlxuIik7CgllbHNlIGlmICgodGVtcCAmIDB4MEUpID09IDApCgkJZGV2X2RiZygmcGRldi0+ZGV2LCAidXNpbmcgSW50ZXJydXB0IFNNSSMgZm9yIFNNQnVzLlxuIik7CgllbHNlCgkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSWxsZWdhbCBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiAiCgkJCSIob3IgY29kZSBvdXQgb2YgZGF0ZSkhXG4iKTsKCglwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTTUJSRVYsICZ0ZW1wKTsKCWRldl9kYmcoJnBkZXYtPmRldiwgIlNNQlJFViA9IDB4JVhcbiIsIHRlbXApOwoJZGV2X2RiZygmcGRldi0+ZGV2LCAiVlQ1OTZfc21iYSA9IDB4JVhcbiIsIHZ0NTk2X3NtYmEpOwoKCXZ0NTk2X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CglzbnByaW50Zih2dDU5Nl9hZGFwdGVyLm5hbWUsIEkyQ19OQU1FX1NJWkUsCgkJCSJTTUJ1cyBWaWEgUHJvIGFkYXB0ZXIgYXQgJTA0eCIsIHZ0NTk2X3NtYmEpOwoJCgl2dDU5Nl9wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7CglpZiAoaTJjX2FkZF9hZGFwdGVyKCZ2dDU5Nl9hZGFwdGVyKSkgewoJCXBjaV9kZXZfcHV0KHZ0NTk2X3BkZXYpOwoJCXZ0NTk2X3BkZXYgPSBOVUxMOwoJfQoKCS8qIEFsd2F5cyByZXR1cm4gZmFpbHVyZSBoZXJlLiAgVGhpcyBpcyB0byBhbGxvdyBvdGhlciBkcml2ZXJzIHRvIGJpbmQKCSAqIHRvIHRoaXMgcGNpIGRldmljZS4gIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGhhdmUgY29udHJvbCBvdmVyIHRoZQoJICogcGNpIGRldmljZSwgd2Ugb25seSB3YW50ZWQgdG8gcmVhZCBhcyBmZXcgcmVnaXN0ZXIgdmFsdWVzIGZyb20gaXQuCgkgKi8KCXJldHVybiAtRU5PREVWOwoKIHJlbGVhc2VfcmVnaW9uOgoJcmVsZWFzZV9yZWdpb24odnQ1OTZfc21iYSwgOCk7CglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2dDU5Nl9pZHNbXSA9IHsKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTk2XzMpLAoJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTEgfSwKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTk2Ql8zKSwKCSAgLmRyaXZlcl9kYXRhID0gU01CQkExIH0sCgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4Nl80KSwKCSAgLmRyaXZlcl9kYXRhID0gU01CQkExIH0sCgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNfMCksCgkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjMzQSksCgkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM1KSwKCSAgLmRyaXZlcl9kYXRhID0gU01CQkEzIH0sCgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzcpLAoJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzMV80KSwKCSAgLmRyaXZlcl9kYXRhID0gU01CQkExIH0sCgl7IDAsIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgdnQ1OTZfaWRzKTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2dDU5Nl9kcml2ZXIgPSB7CgkubmFtZQkJPSAidnQ1OTZfc21idXMiLAoJLmlkX3RhYmxlCT0gdnQ1OTZfaWRzLAoJLnByb2JlCQk9IHZ0NTk2X3Byb2JlLAp9OwoKc3RhdGljIGludCBfX2luaXQgaTJjX3Z0NTk2X2luaXQodm9pZCkKewoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZ0NTk2X2RyaXZlcik7Cn0KCgpzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX3Z0NTk2X2V4aXQodm9pZCkKewoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2dDU5Nl9kcml2ZXIpOwoJaWYgKHZ0NTk2X3BkZXYgIT0gTlVMTCkgewoJCWkyY19kZWxfYWRhcHRlcigmdnQ1OTZfYWRhcHRlcik7CgkJcmVsZWFzZV9yZWdpb24odnQ1OTZfc21iYSwgOCk7CgkJcGNpX2Rldl9wdXQodnQ1OTZfcGRldik7CgkJdnQ1OTZfcGRldiA9IE5VTEw7Cgl9Cn0KCk1PRFVMRV9BVVRIT1IoCiAgICAiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiBhbmQgIgogICAgIlBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJ2dDgyYzU5NiBTTUJ1cyBkcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoaTJjX3Z0NTk2X2luaXQpOwptb2R1bGVfZXhpdChpMmNfdnQ1OTZfZXhpdCk7Cg==