LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmYweHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYyAKICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19XQUtFVVAgVGVtcGxhdGUuCiAgKiAgICAKICAqICAgICAgICAgIFRoaXMgZmlsZSBvdmVycmlkZXMgdGhlIG5hdGl2ZSBIQUwgdGltZSBiYXNlIGZ1bmN0aW9ucyAoZGVmaW5lZCBhcyB3ZWFrKQogICogICAgICAgICAgdG8gdXNlIHRoZSBSVEMgV0FLRVVQIGZvciB0aGUgdGltZSBiYXNlIGdlbmVyYXRpb246CiAgKiAgICAgICAgICAgKyBJbml0aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgYW5kIGNvbmZpZ3VyZXMgdGhlIHdha2V1cCB0aW1lciB0byBiZQogICogICAgICAgICAgICAgaW5jcmVtZW50ZWQgZWFjaCAxbXMKICAqICAgICAgICAgICArIFRoZSB3YWtldXAgZmVhdHVyZSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgZWFjaCAxbXMgCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgaW5zaWRlIHRoZSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrCiAgKiAgICAgICAgICAgKyBIU0UgKGRlZmF1bHQpLCBMU0Ugb3IgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sgc291cmNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQogICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgogICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgogICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJmMHh4X2hhbF90aW1lYmFzZV9ydGNfd2FrZXVwLmMnCiAgICAoIykgQWRkIHRoaXMgZmlsZSBhbmQgdGhlIFJUQyBIQUwgZHJpdmVycyB0byB5b3VyIHByb2plY3QgYW5kIHVuY29tbWVudAogICAgICAgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCBkZWZpbmUgaW4gc3RtMzJmMHh4X2hhbF9jb25mLmggCgogICAgWy4uXQogICAgKEApIEhBTCBSVEMgYWxhcm0gYW5kIEhBTCBSVEMgd2FrZXVwIGRyaXZlcnMgY2FuknQgYmUgdXNlZCB3aXRoIGxvdyBwb3dlciBtb2RlczoKICAgICAgICBUaGUgd2FrZSB1cCBjYXBhYmlsaXR5IG9mIHRoZSBSVEMgbWF5IGJlIGludHJ1c2l2ZSBpbiBjYXNlIG9mIHByaW9yIGxvdyBwb3dlciBtb2RlCiAgICAgICAgY29uZmlndXJhdGlvbiByZXF1aXJpbmcgZGlmZmVyZW50IHdha2UgdXAgc291cmNlcy4KICAgICAgICBBcHBsaWNhdGlvbi9FeGFtcGxlIGJlaGF2aW9yIGlzIG5vIG1vcmUgZ3VhcmFudGVlZCAKICAgIChAKSBUaGUgc3RtMzJmMHh4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzCiAgICAgICAgICByZXF1aXJpbmcgbG93IHBvd2VyIG1vZGVzCgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmMHh4X2hhbC5oIgovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgSEFMX1RpbWVCYXNlX1JUQ19XYWtlVXBfVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgV2FrZVVwIFRlbXBsYXRlCiAgKiBAewogICovIAoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246IAogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICovCiNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UgCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8KLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwoKI2lmIGRlZmluZWQoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICA0OVUKICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDRVCiNlbGlmIGRlZmluZWQoUlRDX0NMT0NLX1NPVVJDRV9MU0UpCiAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICAwVQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzFVCiNlbHNlICAgICAgICAvKiBDTE9DS19TT1VSQ0VfTFNJICovCiAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICAwVQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzlVCiNlbmRpZiAgICAgICAvKiBSVENfQ0xPQ0tfU09VUkNFX0hTRSAqLwoKLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KUlRDX0hhbmRsZVR5cGVEZWYgICAgICAgIGhSVENfSGFuZGxlOwoKLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBSVENfSVJRSGFuZGxlcih2b2lkKTsKCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfV0tVUCBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAogICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCAgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgCiAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiAKICAqICAgICAgICAgV2FrZXVwIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMSkpIC8gUlRDX0NMT0NLIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMW1zCiAgKiAgICAgICAgIFdha2V1cCBUaW1lID0gV2FrZXVwVGltZWJhc2UgKiBXYWtlVXBDb3VudGVyICgwICsgMSkgCiAgICAgICAgICAgICAgICAgICAgICAgID0gMSBtcwogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKICAqICAgICAgICAgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4gCiAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayh1aW50MzJfdCBUaWNrUHJpb3JpdHkpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgUkNDX09zY0luaXRUeXBlRGVmICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdDsKICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7CiAgSEFMX1N0YXR1c1R5cGVEZWYgICAgIHN0YXR1czsKCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQogIC8qIENvbmZpZ3VlIExTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNFOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKICAvKiBDb25maWd1ZSBMU0kgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgLyogQ29uZmlndWUgSFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkhTRVN0YXRlID0gUkNDX0hTRV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzI7CiNlbHNlCiNlcnJvciBQbGVhc2Ugc2VsZWN0IHRoZSBSVEMgQ2xvY2sgc291cmNlCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwoKICBzdGF0dXMgPSBIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3QpOwogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1JUQzsKICAgIHN0YXR1cyA9IEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpOwogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCiAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOwogICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zCiAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSwogICAgICAgSFNFLzMyIGFzIFJUQyBjbG9jayBhbmQgSFNFIDhNSHoKICAgICAgICAgVGltZSBiYXNlID0gKCg0OSArIDEpICogKDQgKyAxKSkgLyAyNTBrSHoKICAgICAgICAgICAgICAgICAgID0gMW1zCiAgICAgICBMU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S2h6CiAgICAgICAgICAgICAgICAgICA9IH4xbXMKICAgICAgIExTSSBhcyBSVEMgY2xvY2sKICAgICAgICAgVGltZSBiYXNlID0gKCgzOSArIDEpICogKDAgKyAxKSkgLyA0MEtoegogICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKICAgIGhSVENfSGFuZGxlLkluaXQuSG91ckZvcm1hdCA9IFJUQ19IT1VSRk9STUFUXzI0OwogICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOwogICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUX0RJU0FCTEU7CiAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOwogICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKICAgIHN0YXR1cyA9IEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpOwogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBEaXNhYmxlIHRoZSBXYWtlLXVwIFRpbWVyICovCiAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLyAKICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSxSVENfSVRfV1VUKTsKCiAgICAvKiBXYWl0IHRpbGwgUlRDIFdVVFdGIGZsYWcgaXMgc2V0ICAqLwogICAgd2hpbGUgKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX1dVVFdGKSA9PSBSRVNFVCkKICAgIHsKICAgICAgaWYgKGNvdW50ZXIrKyA9PSAoU3lzdGVtQ29yZUNsb2NrIC80OFUpKQogICAgICB7CiAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgfQogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIC8qIENsZWFyIFBXUiB3YWtlIHVwIEZsYWcgKi8KICAgIF9fSEFMX1BXUl9DTEVBUl9GTEFHKFBXUl9GTEFHX1dVKTsKCiAgICAvKiBDbGVhciBSVEMgV2FrZSBVcCB0aW1lciBGbGFnICovCiAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX1dVVEYpOwoKICAgIC8qIENvbmZpZ3VyZSB0aGUgV2FrZS11cCBUaW1lciBjb3VudGVyICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+V1VUUiA9IDBVOwoKICAgIC8qIENsZWFyIHRoZSBXYWtlLXVwIFRpbWVyIGNsb2NrIHNvdXJjZSBiaXRzIGluIENSIHJlZ2lzdGVyICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKCiAgICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLwogICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdClSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xNkJJVFM7CgogICAgLyogUlRDIFdha2VVcFRpbWVyIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOwoKICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOwoKICAgIC8qIENvbmZpZ3VyZSB0aGUgSW50ZXJydXB0IGluIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKCiAgICAvKiBFbmFibGUgdGhlIFdha2UtdXAgVGltZXIgKi8KICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgLyogRW5hYmxlIHRoZSBSVEMgZ2xvYmFsIEludGVycnVwdCAqLwogICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19JUlFuKTsKCiAgICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgSVJRIHByaW9yaXR5ICovCiAgICBpZiAoVGlja1ByaW9yaXR5IDwgKDFVTCA8PCBfX05WSUNfUFJJT19CSVRTKSkKICAgIHsKICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOwogICAgICB1d1RpY2tQcmlvID0gVGlja1ByaW9yaXR5OwogICAgfQogICAgZWxzZQogICAgewogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICB9CiAgfQogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBEaXNhYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBkaXNhYmxpbmcgUlRDX1dLVVAgaW50ZXJydXB0LgogICogQHBhcmFtICBOb25lCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIERpc2FibGUgV0FLRSBVUCBUSU1FUiBJbnRlcnJ1cHQgKi8KICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9XVVQpOwogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQGJyaWVmICBSZXN1bWUgVGljayBpbmNyZW1lbnQuCiAgKiBAbm90ZSAgIEVuYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgRW5hYmxpbmcgUlRDX1dLVVAgaW50ZXJydXB0LgogICogQHBhcmFtICBOb25lCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCnsKICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CiAgLyogRW5hYmxlICBXQUtFIFVQIFRJTUVSICBpbnRlcnJ1cHQgKi8KICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX1dVVCk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFdha2UgVXAgVGltZXIgRXZlbnQgQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX1dLVVAgaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQogICogUlRDX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAogICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCiAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQp7CiAgSEFMX0luY1RpY2soKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyAgV0FLRSBVUCBUSU1FUiAgaW50ZXJydXB0IHJlcXVlc3QuCiAgKiBAcGFyYW0gIE5vbmUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgUlRDX0lSUUhhbmRsZXIodm9pZCkKewogIEhBTF9SVENFeF9XYWtlVXBUaW1lcklSUUhhbmRsZXIoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCgo=