LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgRXRoZXJuZXQgZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxMzkgY2hpcHMKICAgICAgICAgICAgICAgIGV4Y2VwdCB0aGUgUlRMODEzOUMrLCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudAogICAgICAgICAgICAgICAgVHggZGVzY3JpcHRvciBoYW5kbGluZy4KCiAgTGljZW5zZToKCiAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICAgYXJlIG1ldDoKCiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KCiAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCiAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCiAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCiAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CgogICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCiAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCiAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydjgxMzkuYyx2ICQKCiAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAoKICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgMjAwOC8wMi8wNSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImdsb2JhbC5oIgojaW5jbHVkZSAiRXBsSW5jLmgiCiNpbmNsdWRlICJlZHJ2LmgiCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KI2luY2x1ZGUgPGFzbS9pcnEuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIEJ1ZmZlciBoYW5kbGluZzoKLy8gQWxsIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQgc3RhdGljYWxseSAoaS5lLiBhdCBjb21waWxlIHRpbWUgcmVzcC4gYXQKLy8gaW5pdGlhbGlzYXRpb24gdmlhIGttYWxsb2MoKSApIGFuZCBub3QgZHluYW1pY2FsbHkgb24gcmVxdWVzdCAoaS5lLiB2aWEKLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKS4KLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKSBzZWFyY2hlcyBmb3IgYW4gdW51c2VkIGJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2guCi8vIEVkcnZJbml0KCkgbWF5IGFsbG9jYXRlIHNvbWUgYnVmZmVycyB3aXRoIHNpemVzIGxlc3MgdGhhbiBtYXhpbXVtIGZyYW1lCi8vIHNpemUgKGkuZS4gMTUxNCBieXRlcyksIGUuZy4gZm9yIFNvQywgU29BLCBTdGF0dXNSZXNwb25zZSwgSWRlbnRSZXNwb25zZSwKLy8gTk1UIHJlcXVlc3RzIC8gY29tbWFuZHMuIFRoZSBsZXNzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhlIGxlc3MgdGhlCi8vIG51bWJlciBvZiB0aGUgYnVmZmVyLgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gY29uc3QgZGVmaW5lcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2lmbmRlZiBFRFJWX01BWF9UWF9CVUZGRVJTCiNkZWZpbmUgRURSVl9NQVhfVFhfQlVGRkVSUyAgICAgMjAKI2VuZGlmCgojZGVmaW5lIEVEUlZfTUFYX0ZSQU1FX1NJWkUgICAgIDB4NjAwCgojZGVmaW5lIEVEUlZfUlhfQlVGRkVSX1NJWkUgICAgIDB4ODYxMAkvLyAzMiBrQiArIDE2IEJ5dGUgKyAxLDUga0IgKFdSQVAgaXMgZW5hYmxlZCkKI2RlZmluZSBFRFJWX1JYX0JVRkZFUl9MRU5HVEggICAoRURSVl9SWF9CVUZGRVJfU0laRSAmIDB4RjgwMCkJLy8gYnVmZmVyIHNpemUgY3V0IGRvd24gdG8gMiBrQiBhbGlnbm1lbnQKCiNkZWZpbmUgRURSVl9UWF9CVUZGRVJfU0laRSAgICAgKEVEUlZfTUFYX1RYX0JVRkZFUlMgKiBFRFJWX01BWF9GUkFNRV9TSVpFKQkvLyBuICogKE1UVSArIDE0ICsgNCkKCiNkZWZpbmUgRFJWX05BTUUgICAgICAgICAgICAgICAgImVwbCIKCiNkZWZpbmUgRURSVl9SRUdXX0lOVF9NQVNLICAgICAgMHgzQwkvLyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHV19JTlRfU1RBVFVTICAgIDB4M0UJLy8gaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHV19JTlRfUk9LICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LIGludGVycnVwdAojZGVmaW5lIEVEUlZfUkVHV19JTlRfUkVSICAgICAgIDB4MDAwMgkvLyBSZWNlaXZlIGVycm9yIGludGVycnVwdAojZGVmaW5lIEVEUlZfUkVHV19JTlRfVE9LICAgICAgIDB4MDAwNAkvLyBUcmFuc21pdCBPSyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RFUiAgICAgICAweDAwMDgJLy8gVHJhbnNtaXQgZXJyb3IgaW50ZXJydXB0CiNkZWZpbmUgRURSVl9SRUdXX0lOVF9SWE9WVyAgICAgMHgwMDEwCS8vIFJ4IGJ1ZmZlciBvdmVyZmxvdyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1BVTiAgICAgICAweDAwMjAJLy8gUGFja2V0IHVuZGVycnVuLyBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX0ZPVlcgICAgICAweDAwNDAJLy8gUnggRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX0xFTkNIRyAgICAweDIwMDAJLy8gQ2FibGUgbGVuZ3RoIGNoYW5nZSBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RJTUVPVVQgICAweDQwMDAJLy8gVGltZSBvdXQgaW50ZXJydXB0CiNkZWZpbmUgRURSVl9SRUdXX0lOVF9TRVJSICAgICAgMHg4MDAwCS8vIFN5c3RlbSBlcnJvciBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX01BU0tfREVGICAoRURSVl9SRUdXX0lOVF9ST0sgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUkVSIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1RPSyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9URVIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUlhPVlcgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfRk9WVyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9QVU4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfVElNRU9VVCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9TRVJSKQkvLyBkZWZhdWx0IGludGVycnVwdCBtYXNrCgojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EICAgICAgIDB4MzcJLy8gY29tbWFuZCByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX1JTVCAgIDB4MTAKI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9SRSAgICAweDA4CiNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfVEUgICAgMHgwNAojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUgIDB4MDEKCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDYgICAgICAgMHg1MAkvLyA5M0M0NiBjb21tYW5kIHJlZ2lzdGVyCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyAgMHgwMAkvLyBsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfVU5MT0NLIDB4QzAJLy8gdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCgojZGVmaW5lIEVEUlZfUkVHRFdfUkNSICAgICAgICAgIDB4NDQJLy8gUnggY29uZmlndXJhdGlvbiByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX05PX0ZUSCAgIDB4MDAwMEUwMDAJLy8gbm8gcmVjZWl2ZSBGSUZPIHRocmVzaG9sZAojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIDB4MDAwMDEwMDAJLy8gMzIga0IgcmVjZWl2ZSBidWZmZXIKI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCAweDAwMDAwNzAwCS8vIHVubGltaXRlZCBtYXhpbXVtIERNQSBidXJzdCBzaXplCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfTk9XUkFQICAgMHgwMDAwMDA4MAkvLyBkbyBub3Qgd3JhcCBmcmFtZSBhdCBlbmQgb2YgYnVmZmVyCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUVSICAgICAgMHgwMDAwMDAyMAkvLyBhY2NlcHQgZXJyb3IgZnJhbWVzIChDUkMsIGFsaWdubWVudCwgY29sbGlkZWQpCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVIgICAgICAgMHgwMDAwMDAxMAkvLyBhY2NlcHQgcnVudAojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FCICAgICAgIDB4MDAwMDAwMDgJLy8gYWNjZXB0IGJyb2FkY2FzdCBmcmFtZXMKI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BTSAgICAgICAweDAwMDAwMDA0CS8vIGFjY2VwdCBtdWx0aWNhc3QgZnJhbWVzCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVBNICAgICAgMHgwMDAwMDAwMgkvLyBhY2NlcHQgcGh5c2ljYWwgbWF0Y2ggZnJhbWVzCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUFQICAgICAgMHgwMDAwMDAwMQkvLyBhY2NlcHQgYWxsIGZyYW1lcwojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0RFRiAgICAgIChFRFJWX1JFR0RXX1JDUl9OT19GVEggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfTk9XUkFQIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9BQiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfQU0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX0FQTSkJLy8gZGVmYXVsdCB2YWx1ZQoKI2RlZmluZSBFRFJWX1JFR0RXX1RDUiAgICAgICAgICAweDQwCS8vIFR4IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSyAweDdDQzAwMDAwCS8vIG1hc2sgZm9yIGhhcmR3YXJlIHZlcnNpb24KI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfQyAgICAweDc0MDAwMDAwCS8vIFJUTDgxMzlDCiNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVkVSX0QgICAgMHg3NDQwMDAwMAkvLyBSVEw4MTM5RAojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0lGRzk2ICAgIDB4MDMwMDAwMDAJLy8gZGVmYXVsdCBpbnRlcmZyYW1lIGdhcCAoOTYwIG5zKQojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0NSQyAgICAgIDB4MDAwMTAwMDAJLy8gZGlzYWJsZSBhcHBlbmRpbmcgb2YgQ1JDIGJ5IHRoZSBjb250cm9sbGVyCiNkZWZpbmUgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgMHgwMDAwMDcwMAkvLyBtYXhpbXVtIERNQSBidXJzdCBzaXplIG9mIDIwNDggYgojZGVmaW5lIEVEUlZfUkVHRFdfVENSX1RYUkVUUlkgIDB4MDAwMDAwMDAJLy8gMTYgcmV0cmllcwojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0RFRiAgICAgIChFRFJWX1JFR0RXX1RDUl9JRkc5NiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfVENSX1RYUkVUUlkpCgojZGVmaW5lIEVEUlZfUkVHV19NVUxJTlQgICAgICAgIDB4NUMJLy8gbXVsdGlwbGUgaW50ZXJydXB0IHNlbGVjdCByZWdpc3RlcgoKI2RlZmluZSBFRFJWX1JFR0RXX01QQyAgICAgICAgICAweDRDCS8vIG1pc3NlZCBwYWNrZXQgY291bnRlciByZWdpc3RlcgoKI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQwICAgICAgICAweDIwCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAwCiNkZWZpbmUgRURSVl9SRUdEV19UU0FEMSAgICAgICAgMHgyNAkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMQojZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDIgICAgICAgIDB4MjgJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDIKI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQzICAgICAgICAweDJDCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAzCiNkZWZpbmUgRURSVl9SRUdEV19UU0QwICAgICAgICAgMHgxMAkvLyBUcmFuc21pdCBzdGF0dXMgb2YgZGVzY3JpcHRvciAwCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfQ1JTICAgICAgMHg4MDAwMDAwMAkvLyBDYXJyaWVyIHNlbnNlIGxvc3QKI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UQUJUICAgICAweDQwMDAwMDAwCS8vIFRyYW5zbWl0IEFib3J0CiNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dDICAgICAgMHgyMDAwMDAwMAkvLyBPdXQgb2Ygd2luZG93IGNvbGxpc2lvbgojZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RYVEhfREVGIDB4MDAwMjAwMDAJLy8gVHJhbnNtaXQgRklGTyB0aHJlc2hvbGQgb2YgNjQgYnl0ZXMKI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UT0sgICAgICAweDAwMDA4MDAwCS8vIFRyYW5zbWl0IE9LCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfVFVOICAgICAgMHgwMDAwNDAwMAkvLyBUcmFuc21pdCBGSUZPIHVuZGVycnVuCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dOICAgICAgMHgwMDAwMjAwMAkvLyBPd25lcgoKI2RlZmluZSBFRFJWX1JFR0RXX1JCU1RBUlQgICAgICAweDMwCS8vIFJlY2VpdmUgYnVmZmVyIHN0YXJ0IGFkZHJlc3MKCiNkZWZpbmUgRURSVl9SRUdXX0NBUFIgICAgICAgICAgMHgzOAkvLyBDdXJyZW50IGFkZHJlc3Mgb2YgcGFja2V0IHJlYWQKCiNkZWZpbmUgRURSVl9SRUdEV19JRFIwICAgICAgICAgMHgwMAkvLyBJRCByZWdpc3RlciAwCiNkZWZpbmUgRURSVl9SRUdEV19JRFI0ICAgICAgICAgMHgwNAkvLyBJRCByZWdpc3RlciA0CgojZGVmaW5lIEVEUlZfUkVHRFdfTUFSMCAgICAgICAgIDB4MDgJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgMAojZGVmaW5lIEVEUlZfUkVHRFdfTUFSNCAgICAgICAgIDB4MEMJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgNAoKLy8gZGVmaW5lcyBmb3IgdGhlIHN0YXR1cyB3b3JkIGluIHRoZSByZWNlaXZlIGJ1ZmZlcgojZGVmaW5lIEVEUlZfUlhTVEFUX01BUiAgICAgICAgIDB4ODAwMAkvLyBNdWx0aWNhc3QgYWRkcmVzcyByZWNlaXZlZAojZGVmaW5lIEVEUlZfUlhTVEFUX1BBTSAgICAgICAgIDB4NDAwMAkvLyBQaHlzaWNhbCBhZGRyZXNzIG1hdGNoZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9CQVIgICAgICAgICAweDIwMDAJLy8gQnJvYWRjYXN0IGFkZHJlc3MgcmVjZWl2ZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9JU0UgICAgICAgICAweDAwMjAJLy8gSW52YWxpZCBzeW1ib2wgZXJyb3IKI2RlZmluZSBFRFJWX1JYU1RBVF9SVU5UICAgICAgICAweDAwMTAJLy8gUnVudCBwYWNrZXQgcmVjZWl2ZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9MT05HICAgICAgICAweDAwMDgJLy8gTG9uZyBwYWNrZXQKI2RlZmluZSBFRFJWX1JYU1RBVF9DUkMgICAgICAgICAweDAwMDQJLy8gQ1JDIGVycm9yCiNkZWZpbmUgRURSVl9SWFNUQVRfRkFFICAgICAgICAgMHgwMDAyCS8vIEZyYW1lIGFsaWdubWVudCBlcnJvcgojZGVmaW5lIEVEUlZfUlhTVEFUX1JPSyAgICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LCgojZGVmaW5lIEVEUlZfUkVHRFdfV1JJVEUoZHdSZWcsIGR3VmFsKSAgd3JpdGVsKGR3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR1dfV1JJVEUoZHdSZWcsIHdWYWwpICAgIHdyaXRldyh3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR0JfV1JJVEUoZHdSZWcsIGJWYWwpICAgIHdyaXRlYihiVmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR0RXX1JFQUQoZHdSZWcpICAgICAgICAgIHJlYWRsKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQojZGVmaW5lIEVEUlZfUkVHV19SRUFEKGR3UmVnKSAgICAgICAgICAgcmVhZHcoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCiNkZWZpbmUgRURSVl9SRUdCX1JFQUQoZHdSZWcpICAgICAgICAgICByZWFkYihFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKCi8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCiNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18Kdm9pZCBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHU4IGJUcmFjZVBvaW50TnVtYmVyX3ApOwp2b2lkIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCiNlbHNlCiNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKI2VuZGlmCgojZGVmaW5lIEVEUlZfQ09VTlRfU0VORCAgICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMikKI2RlZmluZSBFRFJWX0NPVU5UX1RJTUVPVVQgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDMpCiNkZWZpbmUgRURSVl9DT1VOVF9QQ0lfRVJSICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg0KQojZGVmaW5lIEVEUlZfQ09VTlRfVFggICAgICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNSkKI2RlZmluZSBFRFJWX0NPVU5UX1JYICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDYpCiNkZWZpbmUgRURSVl9DT1VOVF9MQVRFQ09MTElTSU9OICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMCkKI2RlZmluZSBFRFJWX0NPVU5UX1RYX0NPTF9STCAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDExKQojZGVmaW5lIEVEUlZfQ09VTlRfVFhfRlVOICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTIpCiNkZWZpbmUgRURSVl9DT1VOVF9UWF9FUlIgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMykKI2RlZmluZSBFRFJWX0NPVU5UX1JYX0NSQyAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE0KQojZGVmaW5lIEVEUlZfQ09VTlRfUlhfRVJSICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTUpCiNkZWZpbmUgRURSVl9DT1VOVF9SWF9GT1ZXICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNikKI2RlZmluZSBFRFJWX0NPVU5UX1JYX1BVTiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE3KQojZGVmaW5lIEVEUlZfQ09VTlRfUlhfRkFFICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTgpCiNkZWZpbmUgRURSVl9DT1VOVF9SWF9PVlcgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxOSkKCiNkZWZpbmUgRURSVl9UUkFDRV9DQVBSKHgpICAgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDA2MDAwMDAwKQojZGVmaW5lIEVEUlZfVFJBQ0VfUlhfQ1JDKHgpICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgwRTAwMDAwMCkKI2RlZmluZSBFRFJWX1RSQUNFX1JYX0VSUih4KSAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MEYwMDAwMDApCiNkZWZpbmUgRURSVl9UUkFDRV9SWF9QVU4oeCkgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDExMDAwMDAwKQojZGVmaW5lIEVEUlZfVFJBQ0UoeCkgICAgICAgICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYwMDAwKSB8IDB4MDAwMEZFQzApCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCB0eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKgp0eXBlZGVmIHN0cnVjdAp7CiAgICBCT09MICAgICAgICAgICAgbV9mVXNlZDsKICAgIHVuc2lnbmVkIGludCAgICBtX3VpU2l6ZTsKICAgIE1DRF9idWZEZXNjRmVjICptX3BCdWZEZXNjcjsKCn0gdEVkcnZUeEJ1ZmZlckludGVybjsKKi8KCi8vIFByaXZhdGUgc3RydWN0dXJlCnR5cGVkZWYgc3RydWN0IHsKCXN0cnVjdCBwY2lfZGV2ICptX3BQY2lEZXY7CS8vIHBvaW50ZXIgdG8gUENJIGRldmljZSBzdHJ1Y3R1cmUKCXZvaWQgKm1fcElvQWRkcjsJLy8gcG9pbnRlciB0byByZWdpc3RlciBzcGFjZSBvZiBFdGhlcm5ldCBjb250cm9sbGVyCgl1OCAqbV9wYlJ4QnVmOwkvLyBwb2ludGVyIHRvIFJ4IGJ1ZmZlcgoJZG1hX2FkZHJfdCBtX3BSeEJ1ZkRtYTsKCXU4ICptX3BiVHhCdWY7CS8vIHBvaW50ZXIgdG8gVHggYnVmZmVyCglkbWFfYWRkcl90IG1fcFR4QnVmRG1hOwoJQk9PTCBtX2FmVHhCdWZVc2VkW0VEUlZfTUFYX1RYX0JVRkZFUlNdOwoJdW5zaWduZWQgaW50IG1fdWlDdXJUeERlc2M7CgoJdEVkcnZJbml0UGFyYW0gbV9Jbml0UGFyYW07Cgl0RWRydlR4QnVmZmVyICptX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlcjsKCn0gdEVkcnZJbnN0YW5jZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBpbnQgRWRydkluaXRPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYsCgkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwSWQpOwoKc3RhdGljIHZvaWQgRWRydlJlbW92ZU9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldik7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBtb2R1bCBnbG9iYWxlIHZhcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gYnVmZmVycyBhbmQgYnVmZmVyIGRlc2NyaXB0b3JzIGFuZCBwb2ludGVycwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFFZHJ2UGNpVGJsW10gPSB7Cgl7MHgxMGVjLCAweDgxMzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAoJezAsfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFFZHJ2UGNpVGJsKTsKCnN0YXRpYyB0RWRydkluc3RhbmNlIEVkcnZJbnN0YW5jZV9sOwoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIEVkcnZEcml2ZXIgPSB7CgkubmFtZSA9IERSVl9OQU1FLAoJLmlkX3RhYmxlID0gYUVkcnZQY2lUYmwsCgkucHJvYmUgPSBFZHJ2SW5pdE9uZSwKCS5yZW1vdmUgPSBFZHJ2UmVtb3ZlT25lLAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgQyBMIEEgUyBTICA8ZWRydj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLy8KLy8gRGVzY3JpcHRpb246Ci8vCi8vCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gY29uc3QgZGVmaW5lcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIHZhcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyB1OCBFZHJ2Q2FsY0hhc2godTggKiBwYk1BQ19wKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2SW5pdAovLwovLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZm9yIGluaXQgb2YgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKLy8KLy8gUGFyYW1ldGVyczogIHBFZHJ2SW5pdFBhcmFtX3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBpbmNsdWRpbmcgdGhlIGluaXQtcGFyYW1ldGVycwovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgICAgICA9IGtFcGxTdWNjZXNzZnVsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ga0VwbE5vUmVzb3VyY2UKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydkluaXQodEVkcnZJbml0UGFyYW0gKiBwRWRydkluaXRQYXJhbV9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCWludCBpUmVzdWx0OwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIGNsZWFyIGluc3RhbmNlIHN0cnVjdHVyZQoJRVBMX01FTVNFVCgmRWRydkluc3RhbmNlX2wsIDAsIHNpemVvZihFZHJ2SW5zdGFuY2VfbCkpOwoKCS8vIHNhdmUgdGhlIGluaXQgZGF0YQoJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0gPSAqcEVkcnZJbml0UGFyYW1fcDsKCgkvLyByZWdpc3RlciBQQ0kgZHJpdmVyCglpUmVzdWx0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmRWRydkRyaXZlcik7CglpZiAoaVJlc3VsdCAhPSAwKSB7CgkJcHJpbnRrKCIlcyBwY2lfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCB3aXRoICVkXG4iLCBfX2Z1bmNfXywKCQkgICAgICAgaVJlc3VsdCk7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgPT0gTlVMTCkgewoJCXByaW50aygiJXMgbV9wUGNpRGV2PU5VTExcbiIsIF9fZnVuY19fKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyByZWFkIE1BQyBhZGRyZXNzIGZyb20gY29udHJvbGxlcgoJcHJpbnRrKCIlcyBsb2NhbCBNQUMgPSAiLCBfX2Z1bmNfXyk7Cglmb3IgKGlSZXN1bHQgPSAwOyBpUmVzdWx0IDwgNjsgaVJlc3VsdCsrKSB7CgkJcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSA9CgkJICAgIEVEUlZfUkVHQl9SRUFEKChFRFJWX1JFR0RXX0lEUjAgKyBpUmVzdWx0KSk7CgkJcHJpbnRrKCIlMDJYICIsCgkJICAgICAgICh1bnNpZ25lZCBpbnQpcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSk7Cgl9CglwcmludGsoIlxuIik7CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2U2h1dGRvd24KLy8KLy8gRGVzY3JpcHRpb246IFNodXRkb3duIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCi8vCi8vIFBhcmFtZXRlcnM6ICB2b2lkCi8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZTaHV0ZG93bih2b2lkKQp7CgoJLy8gdW5yZWdpc3RlciBQQ0kgZHJpdmVyCglwcmludGsoIiVzIGNhbGxpbmcgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKClcbiIsIF9fZnVuY19fKTsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmRWRydkRyaXZlcik7CgoJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5Ci8vCi8vIERlc2NyaXB0aW9uOiBTZXQgYSBtdWx0aWNhc3QgZW50cnkgaW50byB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgovLwovLyBQYXJhbWV0ZXJzOiAgcGJNYWNBZGRyX3AgICAgID0gcG9pbnRlciB0byBtdWx0aWNhc3QgZW50cnkgdG8gc2V0Ci8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkodTggKiBwYk1hY0FkZHJfcCkKewoJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCURXT1JEIGR3RGF0YTsKCXU4IGJIYXNoOwoKCWJIYXNoID0gRWRydkNhbGNIYXNoKHBiTWFjQWRkcl9wKTsKLyoKICAgIGR3RGF0YSA9IGV0aGVyX2NyYyg2LCBwYk1hY0FkZHJfcCk7CgogICAgcHJpbnRrKCJFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoJyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYJykgaGFzaCA9ICV1IC8gJXUgIGV0aGVyX2NyYyA9IDB4JTA4bFhcbiIsCiAgICAgICAgKFdPUkQpIHBiTWFjQWRkcl9wWzBdLCAoV09SRCkgcGJNYWNBZGRyX3BbMV0sIChXT1JEKSBwYk1hY0FkZHJfcFsyXSwKICAgICAgICAoV09SRCkgcGJNYWNBZGRyX3BbM10sIChXT1JEKSBwYk1hY0FkZHJfcFs0XSwgKFdPUkQpIHBiTWFjQWRkcl9wWzVdLAogICAgICAgIChXT1JEKSBiSGFzaCwgKFdPUkQpIChkd0RhdGEgPj4gMjYpLCBkd0RhdGEpOwoqLwoJaWYgKGJIYXNoID4gMzEpIHsKCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKCQlkd0RhdGEgfD0gMSA8PCAoYkhhc2ggLSAzMik7CgkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIGR3RGF0YSk7Cgl9IGVsc2UgewoJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjApOwoJCWR3RGF0YSB8PSAxIDw8IGJIYXNoOwoJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVIwLCBkd0RhdGEpOwoJfQoKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeQovLwovLyBEZXNjcmlwdGlvbjogUmVzZXQgYSBtdWx0aWNhc3QgZW50cnkgaW4gdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKLy8KLy8gUGFyYW1ldGVyczogIHBiTWFjQWRkcl9wICAgICA9IHBvaW50ZXIgdG8gbXVsdGljYXN0IGVudHJ5IHRvIHJlc2V0Ci8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeSh1OCAqIHBiTWFjQWRkcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJRFdPUkQgZHdEYXRhOwoJdTggYkhhc2g7CgoJYkhhc2ggPSBFZHJ2Q2FsY0hhc2gocGJNYWNBZGRyX3ApOwoKCWlmIChiSGFzaCA+IDMxKSB7CgkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CgkJZHdEYXRhICY9IH4oMSA8PCAoYkhhc2ggLSAzMikpOwoJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVI0LCBkd0RhdGEpOwoJfSBlbHNlIHsKCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVIwKTsKCQlkd0RhdGEgJj0gfigxIDw8IGJIYXNoKTsKCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSMCwgZHdEYXRhKTsKCX0KCglyZXR1cm4gUmV0Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkFsbG9jVHhNc2dCdWZmZXIKLy8KLy8gRGVzY3JpcHRpb246IFJlZ2lzdGVyIGEgVHgtQnVmZmVyCi8vCi8vIFBhcmFtZXRlcnM6ICBwQnVmZmVyX3AgICA9IHBvaW50ZXIgdG8gQnVmZmVyIHN0cnVjdHVyZQovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgPSBrRXBsU3VjY2Vzc2Z1bAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5Ci8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZBbGxvY1R4TXNnQnVmZmVyKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCnsKCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CglEV09SRCBpOwoKCWlmIChwQnVmZmVyX3AtPm1fdWlNYXhCdWZmZXJMZW4gPiBFRFJWX01BWF9GUkFNRV9TSVpFKSB7CgkJUmV0ID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeTsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBzZWFyY2ggYSBmcmVlIFR4IGJ1ZmZlciB3aXRoIGFwcHJvcHJpYXRlIHNpemUKCWZvciAoaSA9IDA7IGkgPCBFRFJWX01BWF9UWF9CVUZGRVJTOyBpKyspIHsKCQlpZiAoRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFtpXSA9PSBGQUxTRSkgewoJCQkvLyBmcmVlIGNoYW5uZWwgZm91bmQKCQkJRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFtpXSA9IFRSVUU7CgkJCXBCdWZmZXJfcC0+bV91aUJ1ZmZlck51bWJlciA9IGk7CgkJCXBCdWZmZXJfcC0+bV9wYkJ1ZmZlciA9CgkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgKwoJCQkgICAgKGkgKiBFRFJWX01BWF9GUkFNRV9TSVpFKTsKCQkJcEJ1ZmZlcl9wLT5tX3VpTWF4QnVmZmVyTGVuID0gRURSVl9NQVhfRlJBTUVfU0laRTsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKGkgPj0gRURSVl9NQVhfVFhfQlVGRkVSUykgewoJCVJldCA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnk7CgkJZ290byBFeGl0OwoJfQoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydlJlbGVhc2VUeE1zZ0J1ZmZlcgovLwovLyBEZXNjcmlwdGlvbjogUmVnaXN0ZXIgYSBUeC1CdWZmZXIKLy8KLy8gUGFyYW1ldGVyczogIHBCdWZmZXJfcCAgID0gcG9pbnRlciB0byBCdWZmZXIgc3RydWN0dXJlCi8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZSZWxlYXNlVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKewoJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOwoKCXVpQnVmZmVyTnVtYmVyID0gcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyOwoKCWlmICh1aUJ1ZmZlck51bWJlciA8IEVEUlZfTUFYX1RYX0JVRkZFUlMpIHsKCQlFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW3VpQnVmZmVyTnVtYmVyXSA9IEZBTFNFOwoJfQoKCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2U2VuZFR4TXNnCi8vCi8vIERlc2NyaXB0aW9uOiBpbW1lZGlhdGVseSBzdGFydHMgdGhlIHRyYW5zbWlzc2lvbiBvZiB0aGUgYnVmZmVyCi8vCi8vIFBhcmFtZXRlcnM6ICBwQnVmZmVyX3AgICA9IGJ1ZmZlciBkZXNjcmlwdG9yIHRvIHRyYW5zbWl0Ci8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICA9IGtFcGxTdWNjZXNzZnVsCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZTZW5kVHhNc2codEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKewoJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCXVuc2lnbmVkIGludCB1aUJ1ZmZlck51bWJlcjsKCURXT1JEIGR3VGVtcDsKCgl1aUJ1ZmZlck51bWJlciA9IHBCdWZmZXJfcC0+bV91aUJ1ZmZlck51bWJlcjsKCglpZiAoKHVpQnVmZmVyTnVtYmVyID49IEVEUlZfTUFYX1RYX0JVRkZFUlMpCgkgICAgfHwgKEVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbdWlCdWZmZXJOdW1iZXJdID09IEZBTFNFKSkgewoJCVJldCA9IGtFcGxFZHJ2QnVmTm90RXhpc3Rpbmc7CgkJZ290byBFeGl0OwoJfQoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlciAhPSBOVUxMKSB7CS8vIHRyYW5zbWlzc2lvbiBpcyBhbHJlYWR5IGFjdGl2ZQoJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOwoJCWR3VGVtcCA9CgkJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKCQkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKgoJCQkJICAgICAgc2l6ZW9mKERXT1JEKSkpKTsKCQlwcmludGsoIiVzIEludk9wIFRTRCV1ID0gMHglMDhsWCIsIF9fZnVuY19fLAoJCSAgICAgICBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXApOwoJCXByaW50aygiICBDbWQgPSAweCUwMlhcbiIsCgkJICAgICAgIChXT1JEKSBFRFJWX1JFR0JfUkVBRChFRFJWX1JFR0JfQ09NTUFORCkpOwoJCWdvdG8gRXhpdDsKCX0KCS8vIHNhdmUgcG9pbnRlciB0byBidWZmZXIgc3RydWN0dXJlIGZvciBUeEhhbmRsZXIKCUVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyID0gcEJ1ZmZlcl9wOwoKCUVEUlZfQ09VTlRfU0VORDsKCgkvLyBwYWQgd2l0aCB6ZXJvcyBpZiBuZWNlc3NhcnksIGJlY2F1c2UgY29udHJvbGxlciBkb2VzIG5vdCBkbyBpdAoJaWYgKHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuIDwgTUlOX0VUSF9TSVpFKSB7CgkJRVBMX01FTVNFVChwQnVmZmVyX3AtPm1fcGJCdWZmZXIgKyBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbiwgMCwKCQkJICAgTUlOX0VUSF9TSVpFIC0gcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4pOwoJCXBCdWZmZXJfcC0+bV91aVR4TXNnTGVuID0gTUlOX0VUSF9TSVpFOwoJfQoJLy8gc2V0IERNQSBhZGRyZXNzIG9mIGJ1ZmZlcgoJRURSVl9SRUdEV19XUklURSgoRURSVl9SRUdEV19UU0FEMCArCgkJCSAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSksCgkJCSAoRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEgKwoJCQkgICh1aUJ1ZmZlck51bWJlciAqIEVEUlZfTUFYX0ZSQU1FX1NJWkUpKSk7Cglkd1RlbXAgPQoJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0FEMCArCgkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSkpOwovLyAgICBwcmludGsoIiVzIFRTQUQldSA9IDB4JTA4bFgiLCBfX2Z1bmNfXywgRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYywgZHdUZW1wKTsKCgkvLyBzdGFydCB0cmFuc21pc3Npb24KCUVEUlZfUkVHRFdfV1JJVEUoKEVEUlZfUkVHRFdfVFNEMCArCgkJCSAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSksCgkJCSAoRURSVl9SRUdEV19UU0RfVFhUSF9ERUYgfCBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbikpOwoJZHdUZW1wID0KCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNEMCArCgkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSkpOwovLyAgICBwcmludGsoIiBUU0QldSA9IDB4JTA4bFggLyAweCUwOGxYXG4iLCBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXAsIChEV09SRCkoRURSVl9SRUdEV19UU0RfVFhUSF9ERUYgfCBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbikpOwoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cn0KCiNpZiAwCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2VHhNc2dSZWFkeQovLwovLyBEZXNjcmlwdGlvbjogc3RhcnRzIGNvcHlpbmcgdGhlIGJ1ZmZlciB0byB0aGUgZXRoZXJuZXQgY29udHJvbGxlcidzIEZJRk8KLy8KLy8gUGFyYW1ldGVyczogIHBiQnVmZmVyX3AgLSBidWZmZXJkZXNjcmlwdG9yIHRvIHRyYW5zbWl0Ci8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgLSBrRXBsU3VjY2Vzc2Z1bAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2VHhNc2dSZWFkeSh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOwoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2VHhNc2dTdGFydAovLwovLyBEZXNjcmlwdGlvbjogc3RhcnRzIHRyYW5zbWlzc2lvbiBvZiB0aGUgZXRoZXJuZXQgY29udHJvbGxlcidzIEZJRk8KLy8KLy8gUGFyYW1ldGVyczogIHBiQnVmZmVyX3AgLSBidWZmZXJkZXNjcmlwdG9yIHRvIHRyYW5zbWl0Ci8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgLSBrRXBsU3VjY2Vzc2Z1bAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2VHhNc2dTdGFydCh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCXJldHVybiBSZXQ7Cn0KI2VuZGlmCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydlJlaW5pdFJ4Ci8vCi8vIERlc2NyaXB0aW9uOiByZWluaXRpYWxpemUgdGhlIFJ4IHByb2Nlc3MsIGJlY2F1c2Ugb2YgZXJyb3IKLy8KLy8gUGFyYW1ldGVyczogIHZvaWQKLy8KLy8gUmV0dXJuczogICAgIHZvaWQKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIEVkcnZSZWluaXRSeCh2b2lkKQp7Cgl1OCBiQ21kOwoKCS8vIHNpbXBseSBzd2l0Y2ggb2ZmIGFuZCBvbiB0aGUgcmVjZWl2ZXIKCS8vIHRoaXMgd2lsbCByZXNldCB0aGUgQ0FQUiByZWdpc3RlcgoJYkNtZCA9IEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKTsKCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgKGJDbWQgJiB+RURSVl9SRUdCX0NPTU1BTkRfUkUpKTsKCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgYkNtZCk7CgoJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1JDUiwgRURSVl9SRUdEV19SQ1JfREVGKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgICBFZHJ2SW50ZXJydXB0SGFuZGxlcgovLwovLyBEZXNjcmlwdGlvbjogIGludGVycnVwdCBoYW5kbGVyCi8vCi8vIFBhcmFtZXRlcnM6ICAgdm9pZAovLwovLyBSZXR1cm5zOiAgICAgIHZvaWQKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNpZiAwCnZvaWQgRWRydkludGVycnVwdEhhbmRsZXIodm9pZCkKewp9CiNlbmRpZgoKI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTkpCnN0YXRpYyBpbnQgVGd0RXRoSXNyKGludCBuSXJxTnVtX3AsIHZvaWQgKnBwRGV2SW5zdERhdGFfcCkKI2Vsc2UKc3RhdGljIGludCBUZ3RFdGhJc3IoaW50IG5JcnFOdW1fcCwgdm9pZCAqcHBEZXZJbnN0RGF0YV9wLAoJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnB0UmVnc19wKQojZW5kaWYKewovLyAgICBFZHJ2SW50ZXJydXB0SGFuZGxlcigpOwoJdEVkcnZSeEJ1ZmZlciBSeEJ1ZmZlcjsKCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlcjsKCVdPUkQgd1N0YXR1czsKCURXT1JEIGR3VHhTdGF0dXM7CglEV09SRCBkd1J4U3RhdHVzOwoJV09SRCB3Q3VyUng7Cgl1OCAqcGJSeEJ1ZjsKCXVuc2lnbmVkIGludCB1aUxlbmd0aDsKCWludCBpSGFuZGxlZCA9IElSUV9IQU5ETEVEOwoKLy8gICAgcHJpbnRrKCKkIik7CgoJLy8gcmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cwoJd1N0YXR1cyA9IEVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19JTlRfU1RBVFVTKTsKCgkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0cwoJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfU1RBVFVTLCB3U3RhdHVzKTsKCglpZiAod1N0YXR1cyA9PSAwKSB7CgkJaUhhbmRsZWQgPSBJUlFfTk9ORTsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBwcm9jZXNzIHRhc2tzCglpZiAoKHdTdGF0dXMgJiAoRURSVl9SRUdXX0lOVF9URVIgfCBFRFJWX1JFR1dfSU5UX1RPSykpICE9IDApIHsJLy8gdHJhbnNtaXQgaW50ZXJydXB0CgoJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgewoJCQlwcmludGsoIiVzIFR4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCgkJCSAgICAgICBfX2Z1bmNfXyk7CgkJCWdvdG8gRXhpdDsKCQl9CgkJLy8gcmVhZCB0cmFuc21pdCBzdGF0dXMKCQlkd1R4U3RhdHVzID0KCQkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKwoJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCgkJCQkgICAgICBzaXplb2YoRFdPUkQpKSkpOwoJCWlmICgoZHdUeFN0YXR1cyAmIChFRFJWX1JFR0RXX1RTRF9UT0sgfCBFRFJWX1JFR0RXX1RTRF9UQUJUIHwgRURSVl9SRUdEV19UU0RfVFVOKSkgIT0gMCkgewkvLyB0cmFuc21pdCBmaW5pc2hlZAoJCQlFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjID0KCQkJICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICsgMSkgJiAweDAzOwoJCQlwVHhCdWZmZXIgPSBFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlcjsKCQkJRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgPSBOVUxMOwoKCQkJaWYgKChkd1R4U3RhdHVzICYgRURSVl9SRUdEV19UU0RfVE9LKSAhPSAwKSB7CgkJCQlFRFJWX0NPVU5UX1RYOwoJCQl9IGVsc2UgaWYgKChkd1R4U3RhdHVzICYgRURSVl9SRUdEV19UU0RfVFVOKSAhPSAwKSB7CgkJCQlFRFJWX0NPVU5UX1RYX0ZVTjsKCQkJfSBlbHNlIHsJLy8gYXNzdW1lIEVEUlZfUkVHRFdfVFNEX1RBQlQKCQkJCUVEUlZfQ09VTlRfVFhfQ09MX1JMOwoJCQl9CgovLyAgICAgICAgICAgIHByaW50aygiVCIpOwoJCQlpZiAocFR4QnVmZmVyICE9IE5VTEwpIHsKCQkJCS8vIGNhbGwgVHggaGFuZGxlciBvZiBEYXRhIGxpbmsgbGF5ZXIKCQkJCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLgoJCQkJICAgIG1fcGZuVHhIYW5kbGVyKHBUeEJ1ZmZlcik7CgkJCX0KCQl9IGVsc2UgewoJCQlFRFJWX0NPVU5UX1RYX0VSUjsKCQl9Cgl9CgoJaWYgKCh3U3RhdHVzICYgKEVEUlZfUkVHV19JTlRfUkVSIHwgRURSVl9SRUdXX0lOVF9GT1ZXIHwgRURSVl9SRUdXX0lOVF9SWE9WVyB8IEVEUlZfUkVHV19JTlRfUFVOKSkgIT0gMCkgewkvLyByZWNlaXZlIGVycm9yIGludGVycnVwdAoKCQlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX0ZPVlcpICE9IDApIHsKCQkJRURSVl9DT1VOVF9SWF9GT1ZXOwoJCX0gZWxzZSBpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JYT1ZXKSAhPSAwKSB7CgkJCUVEUlZfQ09VTlRfUlhfT1ZXOwoJCX0gZWxzZSBpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1BVTikgIT0gMCkgewkvLyBQYWNrZXQgdW5kZXJydW4KCQkJRURSVl9UUkFDRV9SWF9QVU4od1N0YXR1cyk7CgkJCUVEUlZfQ09VTlRfUlhfUFVOOwoJCX0gZWxzZSB7CS8qaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9SRVIpICE9IDApICovCgoJCQlFRFJWX1RSQUNFX1JYX0VSUih3U3RhdHVzKTsKCQkJRURSVl9DT1VOVF9SWF9FUlI7CgkJfQoKCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcwoJCUVkcnZSZWluaXRSeCgpOwoJfQoKCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUk9LKSAhPSAwKSB7CS8vIHJlY2VpdmUgaW50ZXJydXB0CgoJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPT0gTlVMTCkgewoJCQlwcmludGsoIiVzIFJ4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCgkJCSAgICAgICBfX2Z1bmNfXyk7CgkJCWdvdG8gRXhpdDsKCQl9CgkJLy8gcmVhZCBjdXJyZW50IG9mZnNldCBpbiByZWNlaXZlIGJ1ZmZlcgoJCXdDdXJSeCA9CgkJICAgIChFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfQ0FQUikgKwoJCSAgICAgMHgxMCkgJSBFRFJWX1JYX0JVRkZFUl9MRU5HVEg7CgoJCXdoaWxlICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfQlVGRSkgPT0gMCkgewkvLyBmcmFtZSBhdmFpbGFibGUKCgkJCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIGN1cnJlbnQgZnJhbWUgaW4gcmVjZWl2ZSBidWZmZXIKCQkJcGJSeEJ1ZiA9IEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiArIHdDdXJSeDsKCgkJCS8vIHJlYWQgcmVjZWl2ZSBzdGF0dXMgRFdPUkQKCQkJZHdSeFN0YXR1cyA9IGxlMzJfdG9fY3B1KCooKERXT1JEICopIHBiUnhCdWYpKTsKCgkJCS8vIGNhbGN1bGF0ZSBsZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUKCQkJdWlMZW5ndGggPSBkd1J4U3RhdHVzID4+IDE2OwoKCQkJaWYgKHVpTGVuZ3RoID09IDB4RkZGMCkgewkvLyBmcmFtZSBpcyB1bmZpbmlzaGVkIChtYXliZSBlYXJseSBSeCBpbnRlcnJ1cHQgaXMgYWN0aXZlKQoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX1JPSykgPT0gMCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlY2VpdmluZyB0aGlzIGZyYW1lCgkJCQkvLyBpZ25vcmUgaXQKCQkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0ZBRSkgIT0gMCkgewoJCQkJCUVEUlZfQ09VTlRfUlhfRkFFOwoJCQkJfSBlbHNlIGlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0NSQykgIT0gMCkgewoJCQkJCUVEUlZfVFJBQ0VfUlhfQ1JDKGR3UnhTdGF0dXMpOwoJCQkJCUVEUlZfQ09VTlRfUlhfQ1JDOwoJCQkJfSBlbHNlIHsKCQkJCQlFRFJWX1RSQUNFX1JYX0VSUihkd1J4U3RhdHVzKTsKCQkJCQlFRFJWX0NPVU5UX1JYX0VSUjsKCQkJCX0KCgkJCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcwoJCQkJRWRydlJlaW5pdFJ4KCk7CgoJCQkJYnJlYWs7CgkJCX0gZWxzZSB7CS8vIGZyYW1lIGlzIE9LCgkJCQlSeEJ1ZmZlci5tX0J1ZmZlckluRnJhbWUgPQoJCQkJICAgIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU7CgkJCQlSeEJ1ZmZlci5tX3VpUnhNc2dMZW4gPSB1aUxlbmd0aCAtIEVUSF9DUkNfU0laRTsKCQkJCVJ4QnVmZmVyLm1fcGJCdWZmZXIgPQoJCQkJICAgIHBiUnhCdWYgKyBzaXplb2YoZHdSeFN0YXR1cyk7CgovLyAgICAgICAgICAgICAgICBwcmludGsoIlIiKTsKCQkJCUVEUlZfQ09VTlRfUlg7CgoJCQkJLy8gY2FsbCBSeCBoYW5kbGVyIG9mIERhdGEgbGluayBsYXllcgoJCQkJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0uCgkJCQkgICAgbV9wZm5SeEhhbmRsZXIoJlJ4QnVmZmVyKTsKCQkJfQoKCQkJLy8gY2FsdWxhdGUgbmV3IG9mZnNldCAoRFdPUkQgYWxpZ25lZCkKCQkJd0N1clJ4ID0KCQkJICAgIChXT1JEKSAoKHdDdXJSeCArIHVpTGVuZ3RoICsgc2l6ZW9mKGR3UnhTdGF0dXMpICsKCQkJCSAgICAgMykgJiB+MHgzKTsKCQkJRURSVl9UUkFDRV9DQVBSKHdDdXJSeCAtIDB4MTApOwoJCQlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0NBUFIsIHdDdXJSeCAtIDB4MTApOwoKCQkJLy8gcmVyZWFkIGN1cnJlbnQgb2Zmc2V0IGluIHJlY2VpdmUgYnVmZmVyCgkJCXdDdXJSeCA9CgkJCSAgICAoRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0NBUFIpICsKCQkJICAgICAweDEwKSAlIEVEUlZfUlhfQlVGRkVSX0xFTkdUSDsKCgkJfQoJfQoKCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfU0VSUikgIT0gMCkgewkvLyBQQ0kgZXJyb3IKCQlFRFJWX0NPVU5UX1BDSV9FUlI7Cgl9CgoJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9USU1FT1VUKSAhPSAwKSB7CS8vIFRpbWVvdXQKCQlFRFJWX0NPVU5UX1RJTUVPVVQ7Cgl9CgogICAgICBFeGl0OgoJcmV0dXJuIGlIYW5kbGVkOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkluaXRPbmUKLy8KLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIG9uZSBQQ0kgZGV2aWNlCi8vCi8vIFBhcmFtZXRlcnM6ICBwUGNpRGV2ICAgICAgICAgICAgID0gcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIFBDSSBkZXZpY2Ugc3RydWN0dXJlCi8vICAgICAgICAgICAgICBwSWQgICAgICAgICAgICAgICAgID0gUENJIGRldmljZSBJRAovLwovLyBSZXR1cm5zOiAgICAgKGludCkgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgaW50IEVkcnZJbml0T25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcElkKQp7CglpbnQgaVJlc3VsdCA9IDA7CglEV09SRCBkd1RlbXA7CgoJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBOVUxMKSB7CS8vIEVkcnYgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYSBQQ0kgZGV2aWNlCgkJcHJpbnRrKCIlcyBkZXZpY2UgJXMgZGlzY2FyZGVkXG4iLCBfX2Z1bmNfXywKCQkgICAgICAgcGNpX25hbWUocFBjaURldikpOwoJCWlSZXN1bHQgPSAtRU5PREVWOwoJCWdvdG8gRXhpdDsKCX0KCglpZiAocFBjaURldi0+cmV2aXNpb24gPj0gMHgyMCkgewoJCXByaW50awoJCSAgICAoIiVzIGRldmljZSAlcyBpcyBhbiBlbmhhbmNlZCA4MTM5QysgdmVyc2lvbiwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZFxuIiwKCQkgICAgIF9fZnVuY19fLCBwY2lfbmFtZShwUGNpRGV2KSk7CgkJaVJlc3VsdCA9IC1FTk9ERVY7CgkJZ290byBFeGl0OwoJfQoKCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IHBQY2lEZXY7CgoJLy8gZW5hYmxlIGRldmljZQoJcHJpbnRrKCIlcyBlbmFibGUgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CglpUmVzdWx0ID0gcGNpX2VuYWJsZV9kZXZpY2UocFBjaURldik7CglpZiAoaVJlc3VsdCAhPSAwKSB7CgkJZ290byBFeGl0OwoJfQoKCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBQY2lEZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pID09IDApIHsKCQlpUmVzdWx0ID0gLUVOT0RFVjsKCQlnb3RvIEV4aXQ7Cgl9CgoJcHJpbnRrKCIlcyByZXF1ZXN0IHJlZ2lvbnNcbiIsIF9fZnVuY19fKTsKCWlSZXN1bHQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBQY2lEZXYsIERSVl9OQU1FKTsKCWlmIChpUmVzdWx0ICE9IDApIHsKCQlnb3RvIEV4aXQ7Cgl9CgoJcHJpbnRrKCIlcyBpb3JlbWFwXG4iLCBfX2Z1bmNfXyk7CglFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPQoJICAgIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBQY2lEZXYsIDEpLAoJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBQY2lEZXYsIDEpKTsKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgPT0gTlVMTCkgewkvLyByZW1hcCBvZiBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc3BhY2UgZmFpbGVkCgkJaVJlc3VsdCA9IC1FSU87CgkJZ290byBFeGl0OwoJfQoJLy8gZW5hYmxlIFBDSSBidXNtYXN0ZXIKCXByaW50aygiJXMgZW5hYmxlIGJ1c21hc3RlclxuIiwgX19mdW5jX18pOwoJcGNpX3NldF9tYXN0ZXIocFBjaURldik7CgoJLy8gcmVzZXQgY29udHJvbGxlcgoJcHJpbnRrKCIlcyByZXNldCBjb250cm9sbGVyXG4iLCBfX2Z1bmNfXyk7CglFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIEVEUlZfUkVHQl9DT01NQU5EX1JTVCk7CgoJLy8gd2FpdCB1bnRpbCByZXNldCBoYXMgZmluaXNoZWQKCWZvciAoaVJlc3VsdCA9IDUwMDsgaVJlc3VsdCA+IDA7IGlSZXN1bHQtLSkgewoJCWlmICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfUlNUKQoJCSAgICA9PSAwKSB7CgkJCWJyZWFrOwoJCX0KCgkJc2NoZWR1bGVfdGltZW91dCgxMCk7Cgl9CgoJLy8gY2hlY2sgaGFyZHdhcmUgdmVyc2lvbiwgaS5lLiBjaGlwIElECglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UQ1IpOwoJaWYgKCgoZHdUZW1wICYgRURSVl9SRUdEV19UQ1JfVkVSX01BU0spICE9IEVEUlZfUkVHRFdfVENSX1ZFUl9DKQoJICAgICYmICgoZHdUZW1wICYgRURSVl9SRUdEV19UQ1JfVkVSX01BU0spICE9IEVEUlZfUkVHRFdfVENSX1ZFUl9EKSkgewkvLyB1bnN1cHBvcnRlZCBjaGlwCgkJcHJpbnRrKCIlcyBVbnN1cHBvcnRlZCBjaGlwISBUQ1IgPSAweCUwOGxYXG4iLCBfX2Z1bmNfXywKCQkgICAgICAgZHdUZW1wKTsKCQlpUmVzdWx0ID0gLUVOT0RFVjsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBkaXNhYmxlIGludGVycnVwdHMKCXByaW50aygiJXMgZGlzYWJsZSBpbnRlcnJ1cHRzXG4iLCBfX2Z1bmNfXyk7CglFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKCS8vIGFja25vd2xlZGdlIGFsbCBwZW5kaW5nIGludGVycnVwdHMKCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX1NUQVRVUywKCQkJRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0lOVF9TVEFUVVMpKTsKCgkvLyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyCglwcmludGsoIiVzIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIsIF9fZnVuY19fKTsKCWlSZXN1bHQgPQoJICAgIHJlcXVlc3RfaXJxKHBQY2lEZXYtPmlycSwgVGd0RXRoSXNyLCBJUlFGX1NIQVJFRCwKCQkJRFJWX05BTUUgLypwUGNpRGV2LT5kZXYubmFtZSAqLyAsIHBQY2lEZXYpOwoJaWYgKGlSZXN1bHQgIT0gMCkgewoJCWdvdG8gRXhpdDsKCX0KCi8qCiAgICAvLyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKICAgIHByaW50aygiJXMgdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzXG4iLCBfX2Z1bmNfXyk7CiAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NNRDkzNDYsIEVEUlZfUkVHQl9DTUQ5MzQ2X1VOTE9DSyk7CgogICAgLy8gY2hlY2sgaWYgdXNlciBzcGVjaWZpZWQgYSBNQUMgYWRkcmVzcwogICAgcHJpbnRrKCIlcyBjaGVjayBzcGVjaWZpZWQgTUFDIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKICAgIGZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspCiAgICB7CiAgICAgICAgaWYgKEVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0gIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50aygiJXMgc2V0IGxvY2FsIE1BQyBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgIC8vIHdyaXRlIHRoaXMgTUFDIGFkZHJlc3MgdG8gY29udHJvbGxlcgogICAgICAgICAgICBFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfSURSMCwKICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkclswXSkpKTsKICAgICAgICAgICAgZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfSURSMCk7CgogICAgICAgICAgICBFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfSURSNCwKICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkcls0XSkpKTsKICAgICAgICAgICAgZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfSURSNCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGlSZXN1bHQgPSAwOwoKICAgIC8vIGxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ01EOTM0NiwgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyk7CiovCgoJLy8gYWxsb2NhdGUgYnVmZmVycwoJcHJpbnRrKCIlcyBhbGxvY2F0ZSBidWZmZXJzXG4iLCBfX2Z1bmNfXyk7CglFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPQoJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfVFhfQlVGRkVSX1NJWkUsCgkJCQkgJkVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hKTsKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgewoJCWlSZXN1bHQgPSAtRU5PTUVNOwoJCWdvdG8gRXhpdDsKCX0KCglFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPQoJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfUlhfQlVGRkVSX1NJWkUsCgkJCQkgJkVkcnZJbnN0YW5jZV9sLm1fcFJ4QnVmRG1hKTsKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPT0gTlVMTCkgewoJCWlSZXN1bHQgPSAtRU5PTUVNOwoJCWdvdG8gRXhpdDsKCX0KCS8vIHJlc2V0IHBvaW50ZXJzIGZvciBUeCBidWZmZXJzCglwcmludGsoIiVzIHJlc2V0IHBvaW50ZXJzIGZvIFR4IGJ1ZmZlcnNcbiIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMCwgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMCk7CglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfVFNBRDEsIDApOwoJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDEpOwoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQyLCAwKTsKCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RTQUQyKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMywgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMyk7CgoJcHJpbnRrKCIgICAgQ29tbWFuZCA9IDB4JTAyWFxuIiwKCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKCgkvLyBzZXQgcG9pbnRlciBmb3IgcmVjZWl2ZSBidWZmZXIgaW4gY29udHJvbGxlcgoJcHJpbnRrKCIlcyBzZXQgcG9pbnRlciB0byBSeCBidWZmZXJcbiIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQlNUQVJULCBFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CgoJLy8gZW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgoJcHJpbnRrKCIlcyBlbmFibGUgVHggYW5kIFJ4IiwgX19mdW5jX18pOwoJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELAoJCQkoRURSVl9SRUdCX0NPTU1BTkRfUkUgfCBFRFJWX1JFR0JfQ09NTUFORF9URSkpOwoJcHJpbnRrKCIgIENvbW1hbmQgPSAweCUwMlhcbiIsCgkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CgoJLy8gY2xlYXIgbWlzc2VkIHBhY2tldCBjb3VudGVyIHRvIGVuYWJsZSBSeC9UeCBwcm9jZXNzCglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTVBDLCAwKTsKCgkvLyBzZXQgdHJhbnNtaXQgY29uZmlndXJhdGlvbiByZWdpc3RlcgoJcHJpbnRrKCIlcyBzZXQgVHggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UQ1IsIEVEUlZfUkVHRFdfVENSX0RFRik7CglwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVENSKSk7CgoJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgoJcHJpbnRrKCIlcyBzZXQgUnggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7CglwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfUkNSKSk7CgoJLy8gcmVzZXQgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlcgoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjAsIDApOwoJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKCi8qCiAgICAvLyBlbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyCiAgICBwcmludGsoIiVzIGVuYWJsZSBUeCBhbmQgUngiLCBfX2Z1bmNfXyk7CiAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIChFRFJWX1JFR0JfQ09NTUFORF9SRSB8IEVEUlZfUkVHQl9DT01NQU5EX1RFKSk7CiAgICBwcmludGsoIiAgQ29tbWFuZCA9IDB4JTAyWFxuIiwgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CiovCgkvLyBkaXNhYmxlIGVhcmx5IGludGVycnVwdHMKCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfTVVMSU5ULCAwKTsKCgkvLyBlbmFibGUgaW50ZXJydXB0cwoJcHJpbnRrKCIlcyBlbmFibGUgaW50ZXJydXB0c1xuIiwgX19mdW5jX18pOwoJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfTUFTSywgRURSVl9SRUdXX0lOVF9NQVNLX0RFRik7CgogICAgICBFeGl0OgoJcHJpbnRrKCIlcyBmaW5pc2hlZCB3aXRoICVkXG4iLCBfX2Z1bmNfXywgaVJlc3VsdCk7CglyZXR1cm4gaVJlc3VsdDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZSZW1vdmVPbmUKLy8KLy8gRGVzY3JpcHRpb246IHNodXRzIGRvd24gb25lIFBDSSBkZXZpY2UKLy8KLy8gUGFyYW1ldGVyczogIHBQY2lEZXYgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgUENJIGRldmljZSBzdHJ1Y3R1cmUKLy8KLy8gUmV0dXJuczogICAgICh2b2lkKQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyB2b2lkIEVkcnZSZW1vdmVPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYpCnsKCglpZiAoRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ICE9IHBQY2lEZXYpIHsJLy8gdHJ5aW5nIHRvIHJlbW92ZSB1bmtub3duIGRldmljZQoJCUJVR19PTihFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gcFBjaURldik7CgkJZ290byBFeGl0OwoJfQoJLy8gZGlzYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgMCk7CgoJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCglFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKCgkvLyByZW1vdmUgaW50ZXJydXB0IGhhbmRsZXIKCWZyZWVfaXJxKHBQY2lEZXYtPmlycSwgcFBjaURldik7CgoJLy8gZnJlZSBidWZmZXJzCglpZiAoRWRydkluc3RhbmNlX2wubV9wYlR4QnVmICE9IE5VTEwpIHsKCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfVFhfQlVGRkVSX1NJWkUsCgkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wYlR4QnVmLAoJCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hKTsKCQlFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPSBOVUxMOwoJfQoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgIT0gTlVMTCkgewoJCXBjaV9mcmVlX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9SWF9CVUZGRVJfU0laRSwKCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYsCgkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOwoJCUVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9IE5VTEw7Cgl9CgkvLyB1bm1hcCBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc3BhY2UKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgIT0gTlVMTCkgewoJCWlvdW5tYXAoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyKTsKCX0KCS8vIGRpc2FibGUgdGhlIFBDSSBkZXZpY2UKCXBjaV9kaXNhYmxlX2RldmljZShwUGNpRGV2KTsKCgkvLyByZWxlYXNlIG1lbW9yeSByZWdpb25zCglwY2lfcmVsZWFzZV9yZWdpb25zKHBQY2lEZXYpOwoKCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IE5VTEw7CgogICAgICBFeGl0OjsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZDYWxjSGFzaAovLwovLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZW50cnkgZm9yIHRoZSBoYXNoLXRhYmxlIGZyb20gTUFDCi8vICAgICAgICAgICAgICBhZGRyZXNzCi8vCi8vIFBhcmFtZXRlcnM6ICBwYk1BQ19wIC0gcG9pbnRlciB0byBNQUMgYWRkcmVzcwovLwovLyBSZXR1cm5zOiAgICAgaGFzaCB2YWx1ZQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2RlZmluZSBIQVNIX0JJVFMgICAgICAgICAgICAgIDYJLy8gdXNlZCBiaXRzIGluIGhhc2gKI2RlZmluZSBDUkMzMl9QT0xZICAgIDB4MDRDMTFEQjYJLy8KLy8jZGVmaW5lIENSQzMyX1BPTFkgICAgMHhFREI4ODMyMCAgLy8KLy8gRyh4KSA9IHgzMiArIHgyNiArIHgyMyArIHgyMiArIHgxNiArIHgxMiArIHgxMSArIHgxMCArIHg4ICsgeDcgKyB4NSArIHg0ICsgeDIgKyB4ICsgMQoKc3RhdGljIHU4IEVkcnZDYWxjSGFzaCh1OCAqIHBiTUFDX3ApCnsKCURXT1JEIGR3Qnl0ZUNvdW50ZXI7CglEV09SRCBkd0JpdENvdW50ZXI7CglEV09SRCBkd0RhdGE7CglEV09SRCBkd0NyYzsKCURXT1JEIGR3Q2Fycnk7Cgl1OCAqcGJEYXRhOwoJdTggYkhhc2g7CgoJcGJEYXRhID0gcGJNQUNfcDsKCgkvLyBjYWxjdWxhdGUgY3JjMzIgdmFsdWUgb2YgbWFjIGFkZHJlc3MKCWR3Q3JjID0gMHhGRkZGRkZGRjsKCglmb3IgKGR3Qnl0ZUNvdW50ZXIgPSAwOyBkd0J5dGVDb3VudGVyIDwgNjsgZHdCeXRlQ291bnRlcisrKSB7CgkJZHdEYXRhID0gKnBiRGF0YTsKCQlwYkRhdGErKzsKCQlmb3IgKGR3Qml0Q291bnRlciA9IDA7IGR3Qml0Q291bnRlciA8IDg7CgkJICAgICBkd0JpdENvdW50ZXIrKywgZHdEYXRhID4+PSAxKSB7CgkJCWR3Q2FycnkgPSAoKChkd0NyYyA+PiAzMSkgXiBkd0RhdGEpICYgMSk7CgkJCWR3Q3JjID0gZHdDcmMgPDwgMTsKCQkJaWYgKGR3Q2FycnkgIT0gMCkgewoJCQkJZHdDcmMgPSAoZHdDcmMgXiBDUkMzMl9QT0xZKSB8IGR3Q2Fycnk7CgkJCX0KCQl9Cgl9CgovLyAgICBwcmludGsoIk15Q1JDID0gMHglMDhsWFxuIiwgZHdDcmMpOwoJLy8gb25seSB1cHBlciA2IGJpdHMgKEhBU0hfQklUUykgYXJlIHVzZWQKCS8vIHdoaWNoIHBvaW50IHRvIHNwZWNpZmljIGJpdCBpbiB0aGUgaGFzaCByZWdpc3RlcnMKCWJIYXNoID0gKHU4KSAoKGR3Q3JjID4+ICgzMiAtIEhBU0hfQklUUykpICYgMHgzZik7CgoJcmV0dXJuIGJIYXNoOwp9Cg==