LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KCnZvaWQgc2M1MjBfdGltZXJfaXNyKHZvaWQpCnsKCS8qIEFjayB0aGUgR1AgVGltZXIgSW50ZXJydXB0ICovCgl3cml0ZV9tbWNyX2J5dGUgKFNDNTIwX0dQVE1SU1RBLCAweDAyKTsKfQoKaW50IHRpbWVyX2luaXQodm9pZCkKewoJLyogTWFwIEdQIFRpbWVyIDEgdG8gTWFzdGVyIFBJQyBJUjAgICovCgl3cml0ZV9tbWNyX2J5dGUgKFNDNTIwX0dQVE1SMU1BUCwgMHgwMSk7CgoJLyogRGlzYWJsZSBHUCBUaW1lcnMgMSAmIDIgLSBBbGxvdyBjb25maWd1cmF0aW9uIHdyaXRlcyAqLwoJd3JpdGVfbW1jcl93b3JkIChTQzUyMF9HUFRNUjFDVEwsIDB4NDAwMCk7Cgl3cml0ZV9tbWNyX3dvcmQgKFNDNTIwX0dQVE1SMkNUTCwgMHg0MDAwKTsKCgkvKiBSZXNldCBHUCBUaW1lcnMgMSAmIDIgKi8KCXdyaXRlX21tY3Jfd29yZCAoU0M1MjBfR1BUTVIxQ05ULCAweDAwMDApOwoJd3JpdGVfbW1jcl93b3JkIChTQzUyMF9HUFRNUjJDTlQsIDB4MDAwMCk7CgoJLyogU2V0dXAgR1AgVGltZXIgMiBhcyBhIDEwMGtIeiAoMTB1cykgcHJlc2NhbGVyICovCgl3cml0ZV9tbWNyX3dvcmQgKFNDNTIwX0dQVE1SMk1BWENNUEEsIDgzKTsKCXdyaXRlX21tY3Jfd29yZCAoU0M1MjBfR1BUTVIyQ1RMLCAweGMwMDEpOwoKCS8qIFNldHVwIEdQIFRpbWVyIDEgYXMgYSAxMDAwIEh6ICgxbXMpIGludGVycnVwdCBnZW5lcmF0b3IgKi8KCXdyaXRlX21tY3Jfd29yZCAoU0M1MjBfR1BUTVIxTUFYQ01QQSwgMTAwKTsKCXdyaXRlX21tY3Jfd29yZCAoU0M1MjBfR1BUTVIxQ1RMLCAweGUwMDkpOwoKCS8qIENsZWFyIHRoZSBHUCBUaW1lcnMgc3RhdHVzIHJlZ2lzdGVyICovCgl3cml0ZV9tbWNyX2J5dGUgKFNDNTIwX0dQVE1SU1RBLCAweDA3KTsKCgkvKiBSZWdpc3RlciB0aGUgU0M1MjAgc3BlY2lmaWMgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KCXJlZ2lzdGVyX3RpbWVyX2lzciAoc2M1MjBfdGltZXJfaXNyKTsKCgkvKiBJbnN0YWxsIGludGVycnVwdCBoYW5kbGVyIGZvciBHUCBUaW1lciAxICovCglpcnFfaW5zdGFsbF9oYW5kbGVyICgwLCB0aW1lcl9pc3IsIE5VTEwpOwoJdW5tYXNrX2lycSAoMCk7CgoJcmV0dXJuIDA7Cn0KCnZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKewoJaW50IG0gPSAwOwoJbG9uZyB1OwoKCXJlYWRfbW1jcl93b3JkIChTQzUyMF9TV1RNUk1JTExJKTsKCXJlYWRfbW1jcl93b3JkIChTQzUyMF9TV1RNUk1JQ1JPKTsKCglkbyB7CgkJbSArPSByZWFkX21tY3Jfd29yZCAoU0M1MjBfU1dUTVJNSUxMSSk7CgkJdSA9IHJlYWRfbW1jcl93b3JkIChTQzUyMF9TV1RNUk1JQ1JPKSArIChtICogMTAwMCk7Cgl9IHdoaWxlICh1IDwgdXNlYyk7Cn0K