LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkVUSEVSQk9PVCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCgpBdXRob3I6IE1hcnRpbiBSZW50ZXJzLgogIERhdGU6IE1hciAyMiAxOTk1CgogVGhpcyBjb2RlIGlzIGJhc2VkIGhlYXZpbHkgb24gRGF2aWQgR3JlZW5tYW4ncyBpZl9lZC5jIGRyaXZlciBhbmQKICBBbmRyZXMgVmVnYSBHYXJjaWEncyBpZl9lcC5jIGRyaXZlci4KCiBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NCwgRGF2aWQgR3JlZW5tYW4sIE1hcnRpbiBSZW50ZXJzLgogQ29weXJpZ2h0IChDKSAxOTkzLTE5OTUsIEFuZHJlcyBWZWdhIEdhcmNpYS4KIENvcHlyaWdodCAoQykgMTk5NSwgU2VyZ2UgQmFia2luLgogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQsIG1vZGlmaWVkLCBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgc29sZCwgaW4KICBib3RoIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm0gcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IGFuZCB0aGVzZQogIHRlcm1zIGFyZSByZXRhaW5lZC4gVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhcmUgdGhlIGF1dGhvcnMgcmVzcG9uc2libGUgZm9yCiAgdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGlzIHNvZnR3YXJlLCBub3IgZG8gdGhlIGF1dGhvcnMgYXNzdW1lIGFueQogIHJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIGluY3VycmVkIHdpdGggaXRzIHVzZS4KCjNjNTA5IHN1cHBvcnQgYWRkZWQgYnkgU2VyZ2UgQmFia2luIChiYWJraW5AaHEuaWNiLmNoZWwuc3UpCgokSWQ6IDNjNTA5LmMsdiAxLjQgMjAwMi8wMS8wMiAyMTo1Njo0MCBva3VqaSBFeHAgJAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogI2RlZmluZSBFREVCVUcgKi8KCiNpbmNsdWRlICJldGhlcmJvb3QuaCIKI2luY2x1ZGUgIm5pYy5oIgojaW5jbHVkZSAiY2FyZHMuaCIKI2luY2x1ZGUgInRpbWVyLmgiCiNpbmNsdWRlICIzYzUwOS5oIgoKI2RlZmluZQl1ZGVsYXkobikJd2FpdG9uX3RpbWVyMigoKG4pKlRJQ0tTX1BFUl9NUykvMTAwMCkKCnN0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2U7CnN0YXRpYyBlbnVtIHsgbm9uZSwgYm5jLCB1dHAgfSBjb25uZWN0b3IgPSBub25lOwkvKiBmb3IgM0M1MDkgKi8KCiNpZmRlZglJTkNMVURFXzNDNTI5Ci8qCiAqIFRoaXMgdGFibGUgYW5kIHNldmVyYWwgb3RoZXIgcGllY2VzIG9mIHRoZSBNQ0Egc3VwcG9ydAogKiBjb2RlIHdlcmUgc2hhbWVsZXNzbHkgYm9ycm93ZWQgZnJvbSB0aGUgTGludXgga2VybmVsIHNvdXJjZS4KICoKICogTUNBIHN1cHBvcnQgYWRkZWQgYnkgQWRhbSBGcml0emxlciAobWlkQGF1ay5jeCkKICoKICovCnN0cnVjdCBlbDNfbWNhX2FkYXB0ZXJzX3N0cnVjdCB7CiAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgICBpbnQgaWQ7Cn07CnN0YXRpYyBzdHJ1Y3QgZWwzX21jYV9hZGFwdGVyc19zdHJ1Y3QgZWwzX21jYV9hZGFwdGVyc1tdID0gewogICAgICAgIHsgIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoMTBiYXNlMikiLCAweDYyN2MgfSwKICAgICAgICB7ICIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKDEwYmFzZVQpIiwgMHg2MjdkIH0sCiAgICAgICAgeyAiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJICh0ZXN0IG1vZGUpIiwgMHg2MmRiIH0sCiAgICAgICAgeyAiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJIChUUCBvciBjb2F4KSIsIDB4NjJmNiB9LAogICAgICAgIHsgIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoVFApIiwgMHg2MmY3IH0sCiAgICAgICAgeyBOVUxMLCAwIH0sCn07CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkVUSF9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCB0NTA5X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKewoJaW50IGk7CgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJCVJlc2V0IDNDb20gNTA5IGNhcmQKCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJLyogc3RvcCBjYXJkICovCglvdXR3KFJYX0RJU0FCTEUsIEJBU0UgKyBFUF9DT01NQU5EKTsKCW91dHcoUlhfRElTQ0FSRF9UT1BfUEFDSywgQkFTRSArIEVQX0NPTU1BTkQpOwoJd2hpbGUgKGludyhCQVNFICsgRVBfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUykKCQk7CglvdXR3KFRYX0RJU0FCTEUsIEJBU0UgKyBFUF9DT01NQU5EKTsKCW91dHcoU1RPUF9UUkFOU0NFSVZFUiwgQkFTRSArIEVQX0NPTU1BTkQpOwoJdWRlbGF5KDEwMDApOwoJb3V0dyhSWF9SRVNFVCwgQkFTRSArIEVQX0NPTU1BTkQpOwoJb3V0dyhUWF9SRVNFVCwgQkFTRSArIEVQX0NPTU1BTkQpOwoJb3V0dyhDX0lOVFJfTEFUQ0gsIEJBU0UgKyBFUF9DT01NQU5EKTsKCW91dHcoU0VUX1JEXzBfTUFTSywgQkFTRSArIEVQX0NPTU1BTkQpOwoJb3V0dyhTRVRfSU5UUl9NQVNLLCBCQVNFICsgRVBfQ09NTUFORCk7CglvdXR3KFNFVF9SWF9GSUxURVIsIEJBU0UgKyBFUF9DT01NQU5EKTsKCgkvKgoJKiBpbml0aWFsaXplIGNhcmQKCSovCgl3aGlsZSAoaW53KEJBU0UgKyBFUF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKQoJCTsKCglHT19XSU5ET1coMCk7CgoJLyogRGlzYWJsZSB0aGUgY2FyZCAqLwoJb3V0dygwLCBCQVNFICsgRVBfVzBfQ09ORklHX0NUUkwpOwoKCS8qIENvbmZpZ3VyZSBJUlEgdG8gbm9uZSAqLwoJb3V0dyhTRVRfSVJRKDApLCBCQVNFICsgRVBfVzBfUkVTT1VSQ0VfQ0ZHKTsKCgkvKiBFbmFibGUgdGhlIGNhcmQgKi8KCW91dHcoRU5BQkxFX0RSUV9JUlEsIEJBU0UgKyBFUF9XMF9DT05GSUdfQ1RSTCk7CgoJR09fV0lORE9XKDIpOwoKCS8qIFJlbG9hZCB0aGUgZXRoZXJfYWRkci4gKi8KCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQoJCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIEJBU0UgKyBFUF9XMl9BRERSXzAgKyBpKTsKCglvdXR3KFJYX1JFU0VULCBCQVNFICsgRVBfQ09NTUFORCk7CglvdXR3KFRYX1JFU0VULCBCQVNFICsgRVBfQ09NTUFORCk7CgoJLyogV2luZG93IDEgaXMgb3BlcmF0aW5nIHdpbmRvdyAqLwoJR09fV0lORE9XKDEpOwoJZm9yIChpID0gMDsgaSA8IDMxOyBpKyspCgkJaW5iKEJBU0UgKyBFUF9XMV9UWF9TVEFUVVMpOwoKCS8qIGdldCByaWQgb2Ygc3RyYXkgaW50cidzICovCglvdXR3KEFDS19JTlRSIHwgMHhmZiwgQkFTRSArIEVQX0NPTU1BTkQpOwoKCW91dHcoU0VUX1JEXzBfTUFTSyB8IFNfNV9JTlRTLCBCQVNFICsgRVBfQ09NTUFORCk7CgoJb3V0dyhTRVRfSU5UUl9NQVNLLCBCQVNFICsgRVBfQ09NTUFORCk7CgoJb3V0dyhTRVRfUlhfRklMVEVSIHwgRklMX0lORElWSURVQUwgfCBGSUxfQlJEQ1NULCBCQVNFICsgRVBfQ09NTUFORCk7CgoJLyogY29uZmlndXJlIEJOQyAqLwoJaWYgKGNvbm5lY3RvciA9PSBibmMpIHsKCQlvdXR3KFNUQVJUX1RSQU5TQ0VJVkVSLCBCQVNFICsgRVBfQ09NTUFORCk7CgkJdWRlbGF5KDEwMDApOwoJfQoJLyogY29uZmlndXJlIFVUUCAqLwoJZWxzZSBpZiAoY29ubmVjdG9yID09IHV0cCkgewoJCUdPX1dJTkRPVyg0KTsKCQlvdXR3KEVOQUJMRV9VVFAsIEJBU0UgKyBFUF9XNF9NRURJQV9UWVBFKTsKCQlzbGVlcCgyKTsJLyogR2l2ZSB0aW1lIGZvciBtZWRpYSB0byBuZWdvdGlhdGUgKi8KCQlHT19XSU5ET1coMSk7Cgl9CgoJLyogc3RhcnQgdHJhbnNjZWl2ZXIgYW5kIHJlY2VpdmVyICovCglvdXR3KFJYX0VOQUJMRSwgQkFTRSArIEVQX0NPTU1BTkQpOwoJb3V0dyhUWF9FTkFCTEUsIEJBU0UgKyBFUF9DT01NQU5EKTsKCgkvKiBzZXQgZWFybHkgdGhyZXNob2xkIGZvciBtaW5pbWFsIHBhY2tldCBsZW5ndGggKi8KCW91dHcoU0VUX1JYX0VBUkxZX1RIUkVTSCB8IEVUSF9aTEVOLCBCQVNFICsgRVBfQ09NTUFORCk7CglvdXR3KFNFVF9UWF9TVEFSVF9USFJFU0ggfCAxNiwgQkFTRSArIEVQX0NPTU1BTkQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRVRIX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBjaGFyIHBhZG1hcFtdID0gewoJMCwgMywgMiwgMX07CgpzdGF0aWMgdm9pZCB0NTA5X3RyYW5zbWl0KApzdHJ1Y3QgbmljICpuaWMsCmNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwp1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCmNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCnsKCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW47CglpbnQgcGFkOwoJaW50IHN0YXR1czsKCiNpZmRlZglFREVCVUcKCXByaW50Zigie2w9JWQsdD0laFh9IixzK0VUSF9ITEVOLHQpOwojZW5kaWYKCgkvKiBzd2FwIGJ5dGVzIG9mIHR5cGUgKi8KCXQ9IGh0b25zKHQpOwoKCWxlbj1zK0VUSF9ITEVOOyAvKiBhY3R1YWwgbGVuZ3RoIG9mIHBhY2tldCAqLwoJcGFkID0gcGFkbWFwW2xlbiAmIDNdOwoKCS8qCgkqIFRoZSAzYzUwOSBhdXRvbWF0aWNhbGx5IHBhZHMgc2hvcnQgcGFja2V0cyB0byBtaW5pbXVtIGV0aGVybmV0IGxlbmd0aCwKCSogYnV0IHdlIGRyb3AgcGFja2V0cyB0aGF0IGFyZSB0b28gbGFyZ2UuIFBlcmhhcHMgd2Ugc2hvdWxkIHRydW5jYXRlCgkqIHRoZW0gaW5zdGVhZD8KCSovCglpZiAobGVuICsgcGFkID4gRVRIX0ZSQU1FX0xFTikgewoJCXJldHVybjsKCX0KCgkvKiBkcm9wIGFja25vd2xlZGdlbWVudHMgKi8KCXdoaWxlICgoc3RhdHVzPWluYihCQVNFICsgRVBfVzFfVFhfU1RBVFVTKSkgJiBUWFNfQ09NUExFVEUgKSB7CgkJaWYgKHN0YXR1cyAmIChUWFNfVU5ERVJSVU58VFhTX01BWF9DT0xMSVNJT058VFhTX1NUQVRVU19PVkVSRkxPVykpIHsKCQkJb3V0dyhUWF9SRVNFVCwgQkFTRSArIEVQX0NPTU1BTkQpOwoJCQlvdXR3KFRYX0VOQUJMRSwgQkFTRSArIEVQX0NPTU1BTkQpOwoJCX0KCQlvdXRiKDB4MCwgQkFTRSArIEVQX1cxX1RYX1NUQVRVUyk7Cgl9CgoJd2hpbGUgKGludyhCQVNFICsgRVBfVzFfRlJFRV9UWCkgPCAodW5zaWduZWQgc2hvcnQpbGVuICsgcGFkICsgNCkKCQk7IC8qIG5vIHJvb20gaW4gRklGTyAqLwoKCW91dHcobGVuLCBCQVNFICsgRVBfVzFfVFhfUElPX1dSXzEpOwoJb3V0dygweDAsIEJBU0UgKyBFUF9XMV9UWF9QSU9fV1JfMSk7CS8qIFNlY29uZCBkd29yZCBtZWFuaW5nbGVzcyAqLwoKCS8qIHdyaXRlIHBhY2tldCAqLwoJb3V0c3coQkFTRSArIEVQX1cxX1RYX1BJT19XUl8xLCBkLCBFVEhfQUxFTi8yKTsKCW91dHN3KEJBU0UgKyBFUF9XMV9UWF9QSU9fV1JfMSwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOLzIpOwoJb3V0dyh0LCBCQVNFICsgRVBfVzFfVFhfUElPX1dSXzEpOwoJb3V0c3coQkFTRSArIEVQX1cxX1RYX1BJT19XUl8xLCBwLCBzIC8gMik7CglpZiAocyAmIDEpCgkJb3V0YigqKHArcyAtIDEpLCBCQVNFICsgRVBfVzFfVFhfUElPX1dSXzEpOwoKCXdoaWxlIChwYWQtLSkKCQlvdXRiKDAsIEJBU0UgKyBFUF9XMV9UWF9QSU9fV1JfMSk7CS8qIFBhZGRpbmcgKi8KCgkvKiB3YWl0IGZvciBUeCBjb21wbGV0ZSAqLwoJd2hpbGUoKGludyhCQVNFICsgRVBfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUykgIT0gMCkKCQk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpFVEhfUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50IHQ1MDlfcG9sbChzdHJ1Y3QgbmljICpuaWMpCnsKCS8qIGNvbW1vbiB2YXJpYWJsZXMgKi8KCXVuc2lnbmVkIHNob3J0IHR5cGUgPSAwOwkvKiB1c2VkIGJ5IEVERUJVRyAqLwoJLyogdmFyaWFibGVzIGZvciAzQzUwOSAqLwoJc2hvcnQgc3RhdHVzLCBjc3Q7CglyZWdpc3RlciBzaG9ydCByeF9maWZvOwoKCWNzdD1pbncoQkFTRSArIEVQX1NUQVRVUyk7CgojaWZkZWYJRURFQlVHCglpZihjc3QgJiAweDFGRkYpCgkJcHJpbnRmKCItJWhYLSIsY3N0KTsKI2VuZGlmCgoJaWYoIChjc3QgJiBTX1JYX0NPTVBMRVRFKT09MCApIHsKCQkvKiBhY2tub3dsZWRnZSAgZXZlcnl0aGluZyAqLwoJCW91dHcoQUNLX0lOVFJ8IChjc3QgJiBTXzVfSU5UUyksIEJBU0UgKyBFUF9DT01NQU5EKTsKCQlvdXR3KENfSU5UUl9MQVRDSCwgQkFTRSArIEVQX0NPTU1BTkQpOwoKCQlyZXR1cm4gMDsKCX0KCglzdGF0dXMgPSBpbncoQkFTRSArIEVQX1cxX1JYX1NUQVRVUyk7CiNpZmRlZglFREVCVUcKCXByaW50ZigiKiVoWCoiLHN0YXR1cyk7CiNlbmRpZgoKCWlmIChzdGF0dXMgJiBFUlJfUlgpIHsKCQlvdXR3KFJYX0RJU0NBUkRfVE9QX1BBQ0ssIEJBU0UgKyBFUF9DT01NQU5EKTsKCQlyZXR1cm4gMDsKCX0KCglyeF9maWZvID0gc3RhdHVzICYgUlhfQllURVNfTUFTSzsKCWlmIChyeF9maWZvPT0wKQoJCXJldHVybiAwOwoKCQkvKiByZWFkIHBhY2tldCAqLwojaWZkZWYJRURFQlVHCglwcmludGYoIltsPSVkIixyeF9maWZvKTsKI2VuZGlmCglpbnN3KEJBU0UgKyBFUF9XMV9SWF9QSU9fUkRfMSwgbmljLT5wYWNrZXQsIHJ4X2ZpZm8gLyAyKTsKCWlmKHJ4X2ZpZm8gJiAxKQoJCW5pYy0+cGFja2V0W3J4X2ZpZm8tMV09aW5iKEJBU0UgKyBFUF9XMV9SWF9QSU9fUkRfMSk7CgluaWMtPnBhY2tldGxlbj1yeF9maWZvOwoKCXdoaWxlKDEpIHsKCQlzdGF0dXMgPSBpbncoQkFTRSArIEVQX1cxX1JYX1NUQVRVUyk7CiNpZmRlZglFREVCVUcKCQlwcmludGYoIiolaFgqIixzdGF0dXMpOwojZW5kaWYKCQlyeF9maWZvID0gc3RhdHVzICYgUlhfQllURVNfTUFTSzsKCQlpZihyeF9maWZvPjApIHsKCQkJaW5zdyhCQVNFICsgRVBfVzFfUlhfUElPX1JEXzEsIG5pYy0+cGFja2V0K25pYy0+cGFja2V0bGVuLCByeF9maWZvIC8gMik7CgkJCWlmKHJ4X2ZpZm8gJiAxKQoJCQkJbmljLT5wYWNrZXRbbmljLT5wYWNrZXRsZW4rcnhfZmlmby0xXT1pbmIoQkFTRSArIEVQX1cxX1JYX1BJT19SRF8xKTsKCQkJbmljLT5wYWNrZXRsZW4rPXJ4X2ZpZm87CiNpZmRlZglFREVCVUcKCQkJcHJpbnRmKCIrJWQiLHJ4X2ZpZm8pOwojZW5kaWYKCQl9CgkJaWYoKCBzdGF0dXMgJiBSWF9JTkNPTVBMRVRFICk9PTApIHsKI2lmZGVmCUVERUJVRwoJCQlwcmludGYoIj0lZCIsbmljLT5wYWNrZXRsZW4pOwojZW5kaWYKCQkJYnJlYWs7CgkJfQoJCXVkZWxheSgxMDAwKTsJLyogaWYgaW5jb21wbGV0ZSB3YWl0IDEgbXMgKi8KCX0KCS8qIGFja25vd2xlZGdlIHJlY2VwdGlvbiBvZiBwYWNrZXQgKi8KCW91dHcoUlhfRElTQ0FSRF9UT1BfUEFDSywgQkFTRSArIEVQX0NPTU1BTkQpOwoJd2hpbGUgKGludyhCQVNFICsgRVBfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUykKCQk7CiNpZmRlZglFREVCVUcKCXR5cGUgPSAobmljLT5wYWNrZXRbMTJdPDw4KSB8IG5pYy0+cGFja2V0WzEzXTsKCWlmKG5pYy0+cGFja2V0WzBdK25pYy0+cGFja2V0WzFdK25pYy0+cGFja2V0WzJdK25pYy0+cGFja2V0WzNdK25pYy0+cGFja2V0WzRdKwoJICAgIG5pYy0+cGFja2V0WzVdID09IDB4RkYqRVRIX0FMRU4pCgkJcHJpbnRmKCIsdD0laFgsYl0iLHR5cGUpOwoJZWxzZQoJCXByaW50ZigiLHQ9JWhYXSIsdHlwZSk7CiNlbmRpZgoJcmV0dXJuICgxKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCTNDb20gNTA5IC0gc3BlY2lmaWMgcm91dGluZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50CmVlcHJvbV9yZHkodm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMDsgaXNfZWVwcm9tX2J1c3koSVNfQkFTRSkgJiYgaSA8IE1BWF9FRVBST01CVVNZOyBpKyspOwoJaWYgKGkgPj0gTUFYX0VFUFJPTUJVU1kpIHsKCQkvKiBwcmludGYoIjNjNTA5OiBlZXByb20gZmFpbGVkIHRvIGNvbWUgcmVhZHkuXG4iKTsgKi8KCQlwcmludGYoIjNjNTA5OiBlZXByb20gYnVzeS5cbiIpOyAvKiBtZW1vcnkgaW4gRVBST00gaXMgdGlnaHQgKi8KCQlyZXR1cm4gKDApOwoJfQoJcmV0dXJuICgxKTsKfQoKLyoKICogZ2V0X2U6IGdldHMgYSAxNiBiaXRzIHdvcmQgZnJvbSB0aGUgRUVQUk9NLiB3ZSBtdXN0IGhhdmUgc2V0IHRoZSB3aW5kb3cKICogYmVmb3JlCiAqLwpzdGF0aWMgaW50CmdldF9lKGludCBvZmZzZXQpCnsKCWlmICghZWVwcm9tX3JkeSgpKQoJCXJldHVybiAoMHhmZmZmKTsKCW91dHcoRUVQUk9NX0NNRF9SRCB8IG9mZnNldCwgSVNfQkFTRSArIEVQX1cwX0VFUFJPTV9DT01NQU5EKTsKCWlmICghZWVwcm9tX3JkeSgpKQoJCXJldHVybiAoMHhmZmZmKTsKCXJldHVybiAoaW53KElTX0JBU0UgKyBFUF9XMF9FRVBST01fREFUQSkpOwp9CgpzdGF0aWMgaW50CnNlbmRfSURfc2VxdWVuY2UoaW50IHBvcnQpCnsKCWludCBjeCwgYWw7CgoJZm9yIChhbCA9IDB4ZmYsIGN4ID0gMDsgY3ggPCAyNTU7IGN4KyspIHsKCQlvdXRiKGFsLCBwb3J0KTsKCQlhbCA8PD0gMTsKCQlpZiAoYWwgJiAweDEwMCkKCQkJYWwgXj0gMHhjZjsKCX0KCXJldHVybiAoMSk7Cn0KCgovKgogKiBXZSBnZXQgZWVwcm9tIGRhdGEgZnJvbSB0aGUgaWRfcG9ydCBnaXZlbiBhbiBvZmZzZXQgaW50byB0aGUgZWVwcm9tLgogKiBCYXNpY2FsbHk7IGFmdGVyIHRoZSBJRF9zZXF1ZW5jZSBpcyBzZW50IHRvIGFsbCBvZiB0aGUgY2FyZHM7IHRoZXkgZW50ZXIKICogdGhlIElEX0NNRCBzdGF0ZSB3aGVyZSB0aGV5IHdpbGwgYWNjZXB0IGNvbW1hbmQgcmVxdWVzdHMuIDB4ODAtMHhiZiBsb2FkcwogKiB0aGUgZWVwcm9tIGRhdGEuICBXZSB0aGVuIHJlYWQgdGhlIHBvcnQgMTYgdGltZXMgYW5kIHdpdGggZXZlcnkgcmVhZDsgdGhlCiAqIGNhcmRzIGNoZWNrIGZvciBjb250ZW50aW9uIChpZTogaWYgb25lIGNhcmQgd3JpdGVzIGEgMCBiaXQgYW5kIGFub3RoZXIKICogd3JpdGVzIGEgMSBiaXQgdGhlbiB0aGUgaG9zdCBzZWVzIGEgMC4gQXQgdGhlIGVuZCBvZiB0aGUgY3ljbGU7IGVhY2ggY2FyZAogKiBjb21wYXJlcyB0aGUgZGF0YSBvbiB0aGUgYnVzOyBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgdGhlbiB0aGF0IGNhcmQgZ29lcwogKiBpbnRvIElEX1dBSVQgc3RhdGUgYWdhaW4pLiBJbiB0aGUgbWVhbnRpbWU7IG9uZSBiaXQgb2YgZGF0YSBpcyByZXR1cm5lZCBpbgogKiB0aGUgQVggcmVnaXN0ZXIgd2hpY2ggaXMgY29udmVuaWVudGx5IHJldHVybmVkIHRvIHVzIGJ5IGluYigpLiAgSGVuY2U7IHdlCiAqIHJlYWQgMTYgdGltZXMgZ2V0dGluZyBvbmUgYml0IG9mIGRhdGEgd2l0aCBlYWNoIHJlYWQuCiAqLwpzdGF0aWMgaW50CmdldF9lZXByb21fZGF0YShpbnQgaWRfcG9ydCwgaW50IG9mZnNldCkKewoJaW50IGksIGRhdGEgPSAwOwoJb3V0YigweDgwICsgb2Zmc2V0LCBpZF9wb3J0KTsKCS8qIERvIHdlIHJlYWxseSBuZWVkIHRoaXMgd2FpdD8gV29uJ3QgYmUgbm90aWNlYWJsZSBhbnl3YXkgKi8KCXVkZWxheSgxMDAwMCk7Cglmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKCQlkYXRhID0gKGRhdGEgPDwgMSkgfCAoaW53KGlkX3BvcnQpICYgMSk7CglyZXR1cm4gKGRhdGEpOwp9CgpzdGF0aWMgdm9pZCB0NTA5X2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQp7CglvdXRiKDB4YzAsIEVQX0lEX1BPUlQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZmRlZglJTkNMVURFXzNDNTI5CnN0cnVjdCBuaWMgKnQ1MjlfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCiNlbHNlCnN0cnVjdCBuaWMgKnQ1MDlfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCiNlbmRpZgp7CgkvKiBjb21tb24gdmFyaWFibGVzICovCglpbnQgaTsKCWludCBmYWlsY291bnQ7CgojaWZkZWYJSU5DTFVERV8zQzUyOQoJc3RydWN0IGVsM19tY2FfYWRhcHRlcnNfc3RydWN0ICptY2Fmb3VuZCA9IE5VTEw7CglpbnQgbWNhX3BvczQgPSAwLCBtY2FfcG9zNSA9IDAsIG1jYV9pcnEgPSAwOwojZW5kaWYKCgl0NTA5X2Rpc2FibGUobmljKTsJCS8qIGluIGNhc2UgYm9hcmQgd2FzIGFjdGl2ZSAqLwoJCQkJCS8qIG5vdGUgdGhhdCBuaWMgaXMgbm90IHVzZWQgKi8KCWZvciAoZmFpbGNvdW50ID0gMDsgZmFpbGNvdW50IDwgNDAwMDsgZmFpbGNvdW50KyspIHsKCQlpbnQgZGF0YSwgaiwgaW9fYmFzZSwgaWRfcG9ydDsKCQl1bnNpZ25lZCBzaG9ydCBrOwoJCWludCBlcF9jdXJyZW50X3RhZzsKCQlzaG9ydCAqcDsKI2lmZGVmCUlOQ0xVREVfM0M1MjkKCQlpbnQgY3VyYm9hcmQ7CiNlbmRpZgoKCQlpZF9wb3J0ID0gRVBfSURfUE9SVDsKCQllcF9jdXJyZW50X3RhZyA9IEVQX0xBU1RfVEFHICsgMTsKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJCVNlYXJjaCBmb3IgM0NvbSA1MDkgY2FyZAoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZmRlZglJTkNMVURFXzNDNTI5CgkJLyoKCQkgKiBYWFg6IFdlIHNob3VsZCByZWFsbHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gTUNBCgkJICogYnVzIGNvbnRyb2xsZXIgYmVmb3JlIGdvaW5nIGFoZWFkIHdpdGggdGhpcy4uLgoJCSAqCgkJICogRm9yIG5vdywgd2UgYXZvaWQgYW55IGhhc3NsZSBieSBtYWtpbmcgaXQgYSBjb21waWxlCgkJICogdGltZSBvcHRpb24uCgkJICoKCQkgKi8KCQlwcmludGYoIlxuV2FybmluZzogQXNzdW1pbmcgcHJlc2VuY2Ugb2YgTUNBIGJ1c1xuIik7CgogICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIG1vdGhlcmJvYXJkIHNldHVwIGlzIG9mZiAqLwogICAgICAgICAgICAgICAgb3V0Yl9wKDB4ZmYsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOwoKCQkvKiBDeWNsZSB0aHJvdWdoIHNsb3RzICovCgkJZm9yKGN1cmJvYXJkPTA7IGN1cmJvYXJkPE1DQV9NQVhfU0xPVF9OUjsgY3VyYm9hcmQrKykgewoJCQlpbnQgYm9hcmRpZDsKCQkJaW50IGN1cmNhcmQ7CgoJCQlvdXRiX3AoMHg4fChjdXJib2FyZCYweGYpLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOwoKCQkJYm9hcmRpZCA9IGluYl9wKE1DQV9QT1NfUkVHKDApKTsKCQkJYm9hcmRpZCArPSBpbmJfcChNQ0FfUE9TX1JFRygxKSkgPDwgODsKCgkJCWN1cmNhcmQgPSAwOwoJCQl3aGlsZSAoZWwzX21jYV9hZGFwdGVyc1tjdXJjYXJkXS5uYW1lKSB7CgkJCQlpZiAoZWwzX21jYV9hZGFwdGVyc1tjdXJjYXJkXS5pZCA9PSBib2FyZGlkKSB7CgkJCQkJbWNhZm91bmQgPSAmZWwzX21jYV9hZGFwdGVyc1tjdXJjYXJkXTsKCgkJCQkJbWNhX3BvczQgPSBpbmJfcChNQ0FfUE9TX1JFRyg0KSk7CgkJCQkJbWNhX3BvczUgPSBpbmJfcChNQ0FfUE9TX1JFRyg1KSk7CgoJCQkJCWdvdG8gZG9uZXdpdGhkZXRlY3Q7CgkJCQl9CgkJCQllbHNlCgkJCQkJY3VyY2FyZCsrOwoJCQl9CgoJCX0KCWRvbmV3aXRoZGV0ZWN0OgoJCS8qIEtpbGwgYWxsIHNldHVwIG1vZGVzICovCgkJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CgoJCWlmIChtY2Fmb3VuZCkgewoJCQlldGhfbmljX2Jhc2UgPSAoKHNob3J0KSgobWNhX3BvczQmMHhmYyl8MHgwMikpIDw8IDg7CgkJCW1jYV9pcnEgPSBtY2FfcG9zNSAmIDB4MGY7CgkJCWVwX2N1cnJlbnRfdGFnLS07CgkJfQoJCWVsc2UKCQkJcHJpbnRmKCJNQ0EgQ2FyZCBub3QgZm91bmRcbiIpOwojZW5kaWYKCS8qIExvb2sgZm9yIHRoZSBFSVNBIGJvYXJkcywgbGVhdmUgdGhlbSBhY3RpdmF0ZWQgKi8KCS8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGNhcmQsIGlnbm9yZSBhbGwgb3RoZXJzICovCglmb3IoaiA9IDE7IGogPCAxNjsgaisrKSB7CgkJaW9fYmFzZSA9IChqICogRVBfRUlTQV9TVEFSVCkgfCBFUF9FSVNBX1cwOwoJCWlmIChpbncoaW9fYmFzZSArIEVQX1cwX01GR19JRCkgIT0gTUZHX0lEKQoJCQljb250aW51ZTsKCgkJLyogd2UgbXVzdCBoYXZlIGZvdW5kIDB4MWYgaWYgdGhlIGJvYXJkIGlzIEVJU0EgY29uZmlndXJhdGVkICovCgkJaWYgKChpbncoaW9fYmFzZSArIEVQX1cwX0FERFJFU1NfQ0ZHKSAmIDB4MWYpICE9IDB4MWYpCgkJCWNvbnRpbnVlOwoKCQkvKiBSZXNldCBhbmQgRW5hYmxlIHRoZSBjYXJkICovCgkJb3V0YihXMF9QNF9DTURfUkVTRVRfQURBUFRFUiwgaW9fYmFzZSArIEVQX1cwX0NPTkZJR19DVFJMKTsKCQl1ZGVsYXkoMTAwMCk7IC8qIE11c3Qgd2FpdCA4MDAgtXMsIGJlIGNvbnNlcnZhdGl2ZSAqLwoJCW91dGIoVzBfUDRfQ01EX0VOQUJMRV9BREFQVEVSLCBpb19iYXNlICsgRVBfVzBfQ09ORklHX0NUUkwpOwoKCQkvKgoJCSAqIE9uY2UgYWN0aXZhdGVkLCBhbGwgdGhlIHJlZ2lzdGVycyBhcmUgbWFwcGVkIGluIHRoZSByYW5nZQoJCSAqIHgwMDAgLSB4MDBGLCB3aGVyZSB4IGlzIHRoZSBzbG90IG51bWJlci4KCQkgKi8KCQlldGhfbmljX2Jhc2UgPSBqICogRVBfRUlTQV9TVEFSVDsKCQlicmVhazsKCX0KCWVwX2N1cnJlbnRfdGFnLS07CgoJLyogTG9vayBmb3IgdGhlIElTQSBib2FyZHMuIEluaXQgYW5kIGxlYXZlIHRoZW0gYWN0aXZlZCAqLwoJLyogc2VhcmNoIGZvciB0aGUgZmlyc3QgY2FyZCwgaWdub3JlIGFsbCBvdGhlcnMgKi8KCW91dGIoMHhjMCwgaWRfcG9ydCk7CS8qIEdsb2JhbCByZXNldCAqLwoJdWRlbGF5KDEwMDApOwkJLyogd2FpdCAxIG1zICovCglmb3IgKGkgPSAwOyBpIDwgRVBfTUFYX0JPQVJEUzsgaSsrKSB7CgkJb3V0YigwLCBpZF9wb3J0KTsKCQlvdXRiKDAsIGlkX3BvcnQpOwoJCXNlbmRfSURfc2VxdWVuY2UoaWRfcG9ydCk7CgoJCWRhdGEgPSBnZXRfZWVwcm9tX2RhdGEoaWRfcG9ydCwgRUVQUk9NX01GR19JRCk7CgkJaWYgKGRhdGEgIT0gTUZHX0lEKQoJCQlicmVhazsKCgkJLyogcmVzb2x2ZSBjb250ZW50aW9uIHVzaW5nIHRoZSBFdGhlcm5ldCBhZGRyZXNzICovCgkJZm9yIChqID0gMDsgaiA8IDM7IGorKykKCQkJZGF0YSA9IGdldF9lZXByb21fZGF0YShpZF9wb3J0LCBqKTsKCgkJZXRoX25pY19iYXNlID0KCQkgICAgKGdldF9lZXByb21fZGF0YShpZF9wb3J0LCBFRVBST01fQUREUl9DRkcpICYgMHgxZikgKiAweDEwICsgMHgyMDA7CgkJb3V0YihlcF9jdXJyZW50X3RhZywgaWRfcG9ydCk7CS8qIHRhZ3MgYm9hcmQgKi8KCQlvdXRiKEFDVElWQVRFX0FEQVBURVJfVE9fQ09ORklHLCBpZF9wb3J0KTsKCQllcF9jdXJyZW50X3RhZy0tOwoJCWJyZWFrOwoJfQoKCWlmIChpID49IEVQX01BWF9CT0FSRFMpCgkJZ290byBubzNjNTA5OwoKCS8qCgkqIFRoZSBpb2Jhc2Ugd2FzIGZvdW5kIGFuZCBNRkdfSUQgd2FzIDB4NmQ1MC4gUFJPRF9JRCBzaG91bGQgYmUKCSogMHg5WzAtZl01MAoJKi8KCUdPX1dJTkRPVygwKTsKCWsgPSBnZXRfZShFRVBST01fUFJPRF9JRCk7CiNpZmRlZglJTkNMVURFXzNDNTI5CgkvKgoJICogT24gTUNBLCB0aGUgUFJPRF9JRCBtYXRjaGVzIHRoZSBNQ0EgY2FyZCBJRCAoUE9TMCtQT1MxKQoJICovCglpZiAobWNhZm91bmQpIHsKCQlpZiAobWNhZm91bmQtPmlkICE9IGspIHsKCQkJcHJpbnRmKCJNQ0E6IFBST0RfSUQgaW4gRUVQUk9NIGRvZXMgbm90IG1hdGNoIE1DQSBjYXJkIElEISAoJWhYICE9ICVoWClcbiIsIGssIG1jYWZvdW5kLT5pZCk7CgkJCWdvdG8gbm8zYzUwOTsKCQl9Cgl9IGVsc2UgeyAvKiBmb3IgSVNBL0VJU0EgKi8KCQlpZiAoKGsgJiAweGYwZmYpICE9IChQUk9EX0lEICYgMHhmMGZmKSkKCQkJZ290byBubzNjNTA5OwoJfQojZWxzZQoJaWYgKChrICYgMHhmMGZmKSAhPSAoUFJPRF9JRCAmIDB4ZjBmZikpCgkJZ290byBubzNjNTA5OwojZW5kaWYKCiNpZmRlZglJTkNMVURFXzNDNTI5CglpZiAobWNhZm91bmQpIHsKCQlwcmludGYoIiVzIGJvYXJkIGZvdW5kIG9uIE1DQSBhdCAlI2h4IElSUSAlZCAtIiwKCQkgICAgICAgbWNhZm91bmQtPm5hbWUsIGV0aF9uaWNfYmFzZSwgbWNhX2lycSk7Cgl9IGVsc2UgewojZW5kaWYKCQlpZihldGhfbmljX2Jhc2UgPj0gRVBfRUlTQV9TVEFSVCkKCQkJcHJpbnRmKCIzQzV4OSBib2FyZCBvbiBFSVNBIGF0ICUjaHggLSAiLGV0aF9uaWNfYmFzZSk7CgkJZWxzZQoJCQlwcmludGYoIjNDNXg5IGJvYXJkIG9uIElTQSBhdCAlI2h4IC0gIixldGhfbmljX2Jhc2UpOwojaWZkZWYJSU5DTFVERV8zQzUyOQoJfQojZW5kaWYKCgkvKiB0ZXN0IGZvciBwcmVzZW5jZSBvZiBjb25uZWN0b3JzICovCglpID0gaW53KElTX0JBU0UgKyBFUF9XMF9DT05GSUdfQ1RSTCk7CglqID0gKGludyhJU19CQVNFICsgRVBfVzBfQUREUkVTU19DRkcpID4+IDE0KSAmIDB4MzsKCglzd2l0Y2goaikgewoJCWNhc2UgMDoKCQkJaWYgKGkgJiBJU19VVFApIHsKCQkJCXByaW50ZigiMTBiYXNlVFxuIik7CgkJCQljb25uZWN0b3IgPSB1dHA7CgkJCQl9CgkJCWVsc2UgewoJCQkJcHJpbnRmKCIxMGJhc2VUIG5vdCBwcmVzZW50XG4iKTsKCQkJCWdvdG8gbm8zYzUwOTsKCQkJCX0KCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQlpZiAoaSAmIElTX0FVSSkKCQkJCXByaW50ZigiMTBiYXNlNVxuIik7CgkJCWVsc2UgewoJCQkJcHJpbnRmKCIxMGJhc2U1IG5vdCBwcmVzZW50XG4iKTsKCQkJCWdvdG8gbm8zYzUwOTsKCQkJCX0KCQkJYnJlYWs7CgkJY2FzZSAzOgoJCQlpZiAoaSAmIElTX0JOQykgewoJCQkJcHJpbnRmKCIxMGJhc2UyXG4iKTsKCQkJCWNvbm5lY3RvciA9IGJuYzsKCQkJCX0KCQkJZWxzZSB7CgkJCQlwcmludGYoIjEwYmFzZTIgbm90IHByZXNlbnRcbiIpOwoJCQkJZ290byBubzNjNTA5OwoJCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwcmludGYoInVua25vd24gY29ubmVjdG9yXG4iKTsKCQkJZ290byBubzNjNTA5OwoJCX0KCS8qCgkqIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHRoZSBlZXByb20KCSovCglwID0gKHVuc2lnbmVkIHNob3J0ICopIG5pYy0+bm9kZV9hZGRyOwoJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOIC8gMjsgaSsrKSB7CgkJR09fV0lORE9XKDApOwoJCXBbaV0gPSBodG9ucyhnZXRfZShpKSk7CgkJR09fV0lORE9XKDIpOwoJCW91dHcobnRvaHMocFtpXSksIEJBU0UgKyBFUF9XMl9BRERSXzAgKyAoaSAqIDIpKTsKCX0KCXByaW50ZigiRXRoZXJuZXQgYWRkcmVzczogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKCXQ1MDlfcmVzZXQobmljKTsKCW5pYy0+cmVzZXQgPSB0NTA5X3Jlc2V0OwoJbmljLT5wb2xsID0gdDUwOV9wb2xsOwoJbmljLT50cmFuc21pdCA9IHQ1MDlfdHJhbnNtaXQ7CgluaWMtPmRpc2FibGUgPSB0NTA5X2Rpc2FibGU7CglyZXR1cm4gbmljOwpubzNjNTA5OgoJcHJpbnRmKCIocHJvYmUgZmFpbCkiKTsKCX0KCXJldHVybiAwOwp9CgovKgogKiBMb2NhbCB2YXJpYWJsZXM6CiAqICBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=