LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYyAKICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCiAgKiBAYnJpZWYgICBIQUwgdGltZSBiYXNlIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBSVENfV0FLRVVQIFRlbXBsYXRlLgogICogICAgCiAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKICAqICAgICAgICAgIHRvIHVzZSB0aGUgUlRDIFdBS0VVUCBmb3IgdGhlIHRpbWUgYmFzZSBnZW5lcmF0aW9uOgogICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgYW5kIGNvbmZpZ3VyZXMgdGhlIHdha2V1cCB0aW1lciB0byBiZQogICogICAgICAgICAgICAgaW5jcmVtZW50ZWQgZWFjaCAxbXMKICAqICAgICAgICAgICArIFRoZSB3YWtldXAgZmVhdHVyZSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgZWFjaCAxbXMgCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgaW5zaWRlIHRoZSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrCiAgKiAgICAgICAgICAgKyBIU0UgKGRlZmF1bHQpLCBMU0Ugb3IgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sgc291cmNlCiBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgVGhpcyBmaWxlIG11c3QgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIG1vZGlmaWVkIGFzIGZvbGxvd3M6CiAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXAuYycKICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50CiAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmY0eHhfaGFsX2NvbmYuaCAKCiAgICBbLi5dCiAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgogICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgogICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIAogICAgKEApIFRoZSBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMKICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMKCiAgQGVuZHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAYXR0ZW50aW9uCiAgKgogICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMyZjR4eF9oYWwuaCIKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfV2FrZVVwX1RlbXBsYXRlICBIQUwgVGltZUJhc2UgUlRDIFdha2VVcCBUZW1wbGF0ZQogICogQHsKICAqLyAKCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOiAKICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KICAqLwojZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8KLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwoKI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfSFNFCiAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICA5OVUKICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDlVCiAgI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFXzFNSFogICAoKHVpbnQzMl90KSgodWludDMyX3QpUkNDX0JEQ1JfUlRDU0VMIHwgKHVpbnQzMl90KSgoSFNFX1ZBTFVFLzEwMDAwMDBVKSA8PCAxNlUpKSkKI2Vsc2UgLyogUlRDX0NMT0NLX1NPVVJDRV9MU0UgfHwgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVCiAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzMVUKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfSFNFICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpSVENfSGFuZGxlVHlwZURlZiAgICAgICAgaFJUQ19IYW5kbGU7CgovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIFJUQ19XS1VQX0lSUUhhbmRsZXIodm9pZCk7CgovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgUlRDX1dLVVAgYXMgYSB0aW1lIGJhc2Ugc291cmNlLiAKICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkIAogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4gCiAgKiAgICAgICAgIFdha2V1cCBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDFtcwogICogICAgICAgICBXYWtldXAgVGltZSA9IFdha2V1cFRpbWViYXNlICogV2FrZVVwQ291bnRlciAoMCArIDEpIAogICAgICAgICAgICAgICAgICAgICAgICA9IDEgbXMKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuIAogICogQHBhcmFtICBUaWNrUHJpb3JpdHkgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sgKHVpbnQzMl90IFRpY2tQcmlvcml0eSkKewogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOwoKICBSQ0NfT3NjSW5pdFR5cGVEZWYgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0OwogIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgUGVyaXBoQ2xrSW5pdFN0cnVjdDsKICBIQUxfU3RhdHVzVHlwZURlZiAgICAgc3RhdHVzOwoKI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfTFNFCiAgLyogQ29uZmlndWUgTFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQogIC8qIENvbmZpZ3VlIExTSSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOwogIC8qIEVuc3VyZSB0aGF0IFJUQyBpcyBjbG9ja2VkIGJ5IDFNSHogKi8KICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV8xTUhaOwojZWxzZQojZXJyb3IgUGxlYXNlIHNlbGVjdCB0aGUgUlRDIENsb2NrIHNvdXJjZQojZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8KCiAgc3RhdHVzID0gSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KTsKICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICBQZXJpcGhDbGtJbml0U3RydWN0LlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19SVEM7CiAgICBzdGF0dXMgPSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0U3RydWN0KTsKICB9CiAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgewogICAgLyogRW5hYmxlIFJUQyBDbG9jayAqLwogICAgX19IQUxfUkNDX1JUQ19FTkFCTEUoKTsKICAgIC8qIFRoZSB0aW1lIGJhc2Ugc2hvdWxkIGJlIDFtcwogICAgICAgVGltZSBiYXNlID0gKChSVENfQVNZTkNIX1BSRURJViArIDEpICogKFJUQ19TWU5DSF9QUkVESVYgKyAxKSkgLyBSVENfQ0xPQ0sKICAgICAgIEhTRSBhcyBSVEMgY2xvY2sKICAgICAgICAgVGltZSBiYXNlID0gKCg5OSArIDEpICogKDkgKyAxKSkgLyAxTWh6CiAgICAgICAgICAgICAgICAgICA9IDFtcwogICAgICAgTFNFIGFzIFJUQyBjbG9jawogICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyLjc2OEtoegogICAgICAgICAgICAgICAgICAgPSB+MW1zCiAgICAgICBMU0kgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzJLaHoKICAgICAgICAgICAgICAgICAgID0gMW1zCiAgICAqLwogICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UgPSBSVEM7CiAgICBoUlRDX0hhbmRsZS5Jbml0LkhvdXJGb3JtYXQgPSBSVENfSE9VUkZPUk1BVF8yNDsKICAgIGhSVENfSGFuZGxlLkluaXQuQXN5bmNoUHJlZGl2ID0gUlRDX0FTWU5DSF9QUkVESVY7CiAgICBoUlRDX0hhbmRsZS5Jbml0LlN5bmNoUHJlZGl2ID0gUlRDX1NZTkNIX1BSRURJVjsKICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0ID0gUlRDX09VVFBVVF9ESVNBQkxFOwogICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRQb2xhcml0eSA9IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSDsKICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0VHlwZSA9IFJUQ19PVVRQVVRfVFlQRV9PUEVORFJBSU47CiAgICBzdGF0dXMgPSBIQUxfUlRDX0luaXQoJmhSVENfSGFuZGxlKTsKICB9CiAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgewogICAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgLyogRGlzYWJsZSB0aGUgV2FrZS11cCBUaW1lciAqLwogICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8gCiAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9XVVQpOwoKICAgIC8qIFdhaXQgdGlsbCBSVEMgV1VUV0YgZmxhZyBpcyBzZXQgICovCiAgICB3aGlsZSAoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfV1VUV0YpID09IFJFU0VUKQogICAgewogICAgICBpZiAoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA0OFUpKQogICAgICB7CiAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgfQogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIC8qIENsZWFyIFBXUiB3YWtlIHVwIEZsYWcgKi8KICAgIF9fSEFMX1BXUl9DTEVBUl9GTEFHKFBXUl9GTEFHX1dVKTsKCiAgICAvKiBDbGVhciBSVEMgV2FrZSBVcCB0aW1lciBGbGFnICovCiAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX1dVVEYpOwoKICAgIC8qIENvbmZpZ3VyZSB0aGUgV2FrZS11cCBUaW1lciBjb3VudGVyICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+V1VUUiA9IDBVOwoKICAgIC8qIENsZWFyIHRoZSBXYWtlLXVwIFRpbWVyIGNsb2NrIHNvdXJjZSBiaXRzIGluIENSIHJlZ2lzdGVyICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKCiAgICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLwogICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdClSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xNkJJVFM7CgogICAgLyogUlRDIFdha2VVcFRpbWVyIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOwoKICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOwoKICAgIC8qIENvbmZpZ3VyZSB0aGUgSW50ZXJydXB0IGluIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLFJUQ19JVF9XVVQpOwoKICAgIC8qIEVuYWJsZSB0aGUgV2FrZS11cCBUaW1lciAqLwogICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBFbmFibGUgdGhlIFJUQyBnbG9iYWwgSW50ZXJydXB0ICovCiAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX1dLVVBfSVJRbik7CgogICAgLyogQ29uZmlndXJlIHRoZSBTeXNUaWNrIElSUSBwcmlvcml0eSAqLwogICAgaWYgKFRpY2tQcmlvcml0eSA8ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUykpCiAgICB7CiAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KFJUQ19XS1VQX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOwogICAgICB1d1RpY2tQcmlvID0gVGlja1ByaW9yaXR5OwogICAgfQogICAgZWxzZQogICAgewogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICB9CiAgfQogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBEaXNhYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBkaXNhYmxpbmcgUlRDX1dLVVAgaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBEaXNhYmxlIFdBS0UgVVAgVElNRVIgSW50ZXJydXB0ICovCiAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFJUQ19XS1VQIGludGVycnVwdC4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBFbmFibGUgIFdBS0UgVVAgVElNRVIgIGludGVycnVwdCAqLwogIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgV2FrZSBVcCBUaW1lciBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBSVENfV0tVUCBpbnRlcnJ1cHQgdG9vayBwbGFjZSwgaW5zaWRlCiAgKiBSVENfV0tVUF9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgogICogQHBhcmFtICBocnRjICBSVEMgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCnsKICBIQUxfSW5jVGljaygpOwp9CgovKioKICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzICBXQUtFIFVQIFRJTUVSICBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgUlRDX1dLVVBfSVJRSGFuZGxlcih2b2lkKQp7CiAgSEFMX1JUQ0V4X1dha2VVcFRpbWVySVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K