LyogRGlyZWN0M0QgVGV4dHVyZQogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVMTUVSCiAqIENvcHlyaWdodCAoYykgMjAwNiBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgRGlyZWN0M0RUZXh0dXJlMi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKI2luY2x1ZGUgImV4Y3B0LmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gaW50ZXJmYWNlcy4gVGhleSBhcmUgdGh1bmtzIHRvIElEaXJlY3REcmF3U3VyZmFjZTcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfQWRkUmVmKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX1JlbGVhc2UoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Cn0KCgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFRleHR1cmUgaW50ZXJmYWNlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlMTo6SW5pdGlhbGl6ZQogKgogKiBUaGUgc2RrIHNheXMgaXQncyBub3QgaW1wbGVtZW50ZWQKICoKICogUGFyYW1zOgogKiAgPwogKgogKiBSZXR1cm5zCiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0luaXRpYWxpemUoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UgKkRpcmVjdDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlICpERFN1cmZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgRGlyZWN0M0REZXZpY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIEREU3VyZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSBOb3QgaW1wbGVtZW50ZWRcbiIsIFRoaXMsIGQzZCwgc3VyZik7CiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIFVuY2hlY2tlZCAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTI6OlBhbGV0dGVDaGFuZ2VkCiAqCiAqIEluZm9ybXMgdGhlIHRleHR1cmUgYWJvdXQgYSBwYWxldHRlIGNoYW5nZQogKgogKiBQYXJhbXM6CiAqICBTdGFydDogU3RhcnQgaW5kZXggb2YgdGhlIGNoYW5nZQogKiAgQ291bnQ6IFRoZSBudW1iZXIgb2YgY2hhbmdlZCBlbnRyaWVzCiAqCiAqIFJldHVybnMKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF9QYWxldHRlQ2hhbmdlZChJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CiAgICBGSVhNRSgiKCVwKS0+KCUwOGx4LCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIFN0YXJ0LCBDb3VudCk7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9QYWxldHRlQ2hhbmdlZChJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBDb3VudCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglMDhseCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVGV4dHVyZTIgaW50ZXJmYWNlLlxuIiwgVGhpcywgU3RhcnQsIENvdW50KTsKCiAgICByZXR1cm4gSURpcmVjdDNEVGV4dHVyZTJfUGFsZXR0ZUNoYW5nZWQoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFRleHR1cmU6OlVubG9hZAogKgogKiBEWDUgU0RLOiAiVGhlIElEaXJlY3QzRFRleHR1cmUyOjpVbmxvYWQgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAogKgogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfVU5TVVBQT1JURUQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVGV4dHVyZUltcGxfMV9VbmxvYWQoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKTogbm90IGltcGxlbWVudGVkIVxuIiwgVGhpcyk7CiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlMjo6R2V0SGFuZGxlCiAqCiAqIFJldHVybnMgaGFuZGxlIGZvciB0aGUgdGV4dHVyZS4gQXQgdGhlIG1vbWVudCwgdGhlIGludGVyZmFjZQogKiB0byB0aGUgSVdpbmVEM0RUZXh0dXJlIGlzIHVzZWQuCiAqCiAqIFBhcmFtczoKICogIERpcmVjdDNERGV2aWNlMjogRGV2aWNlIHRoaXMgaGFuZGxlIGlzIGFzc2lnbmVkIHRvCiAqICBIYW5kbGU6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGhhbmRsZSBhdC4KICoKICogUmV0dXJuczoKICogIEQzRF9PSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RUZXh0dXJlSW1wbF9HZXRIYW5kbGUoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UyICpEaXJlY3QzRERldmljZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRFWFRVUkVIQU5ETEUgKmxwSGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAqZDNkID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgRGlyZWN0M0REZXZpY2UyKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgZDNkLCBscEhhbmRsZSk7CgogICAgaWYoIVRoaXMtPkhhbmRsZSkKICAgIHsKICAgICAgICBUaGlzLT5IYW5kbGUgPSBJRGlyZWN0M0REZXZpY2VJbXBsX0NyZWF0ZUhhbmRsZShkM2QpOwogICAgICAgIGlmKFRoaXMtPkhhbmRsZSkKICAgICAgICB7CiAgICAgICAgICAgIGQzZC0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS5wdHIgPSBUaGlzOwogICAgICAgICAgICBkM2QtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0udHlwZSA9IEREcmF3SGFuZGxlX1RleHR1cmU7CiAgICAgICAgfQogICAgfQogICAgKmxwSGFuZGxlID0gVGhpcy0+SGFuZGxlOwoKICAgIFRSQUNFKCIgcmV0dXJuaW5nIGhhbmRsZSAlMDhseC5cbiIsICpscEhhbmRsZSk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfR2V0SGFuZGxlKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEREVWSUNFIGxwRGlyZWN0M0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVEVYVFVSRUhBTkRMRSBscEhhbmRsZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAqZDNkID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBscERpcmVjdDNERGV2aWNlKTsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVGV4dHVyZTIgaW50ZXJmYWNlLlxuIiwgVGhpcywgZDNkLCBscEhhbmRsZSk7CgogICAgcmV0dXJuIElEaXJlY3QzRFRleHR1cmUyX0dldEhhbmRsZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RUZXh0dXJlMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKGQzZCwgSURpcmVjdDNERGV2aWNlMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwSGFuZGxlKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnZXRfc3ViX21pbWFwbGV2ZWwKICoKICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBtaXBtYXAgbGV2ZWwKICoKICogdGV4X3B0cjogU3VyZmFjZSBvZiB3aGljaCB0byByZXR1cm4gdGhlIG5leHQgbGV2ZWwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqCmdldF9zdWJfbWltYXBsZXZlbChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0ZXhfcHRyKQp7CiAgICAvKiBOb3cgZ28gZG93biB0aGUgbWlwbWFwIGNoYWluIHRvIHRoZSBuZXh0IHN1cmZhY2UgKi8KICAgIHN0YXRpYyBERFNDQVBTMiBtaXBtYXBfY2FwcyA9IHsgRERTQ0FQU19NSVBNQVAgfCBERFNDQVBTX1RFWFRVUkUsIDAsIDAsIDAgfTsKICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IG5leHRfbGV2ZWw7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmX3B0cjsKICAgIEhSRVNVTFQgaHI7CgogICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShJQ09NX0lOVEVSRkFDRSh0ZXhfcHRyLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pcG1hcF9jYXBzLCAmbmV4dF9sZXZlbCk7CiAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIE5VTEw7CgogICAgc3VyZl9wdHIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBuZXh0X2xldmVsKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShuZXh0X2xldmVsKTsKCiAgICByZXR1cm4gc3VyZl9wdHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlMjo6TG9hZAogKgogKiBMb2FkcyBhIHRleHR1cmUgY3JlYXRlZCB3aXRoIHRoZSBERFNDQVBTX0FMTE9DT05MT0FECiAqCiAqIFRoaXMgZnVuY3Rpb24gaXNuJ3QgcmVsYXllZCB0byBXaW5lRDNEIGJlY2F1c2UgdGhlIHdob2xlIGludGVyZmFjZSBpcwogKiBpbXBsZW1lbnRlZCBpbiBERHJhdyBvbmx5LiBGb3Igc3BlZWQgaW1wcm92ZW1lbnRzIGEgaW1wbGVtZW50YXRpb24gd2hpY2gKICogdGFrZXMgT3BlbkdMIG1vcmUgaW50byBhY2NvdW50IGNvdWxkIGJlIHBsYWNlZCBpbnRvIFdpbmVEM0QuCiAqCiAqIFBhcmFtczoKICogIEQzRFRleHR1cmUyOiBBZGRyZXNzIG9mIHRoZSB0ZXh0dXJlIHRvIGxvYWQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVGV4dHVyZUltcGxfTG9hZChJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZTIgKkQzRFRleHR1cmUyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3JjX3B0ciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBEM0RUZXh0dXJlMik7CiAgICBJV2luZUQzRFBhbGV0dGUgKndpbmVfcGFsLCAqd2luZV9wYWxfc3JjOwogICAgSURpcmVjdERyYXdQYWxldHRlICpwYWwgPSBOVUxMLCAqcGFsX3NyYyA9IE5VTEw7CiAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICpwYWxfaW1wbCwgKnBhbF9pbXBsX3NyYzsKICAgIEhSRVNVTFQgcmV0X3ZhbHVlID0gRDNEX09LOwoKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBzcmNfcHRyKTsKCiAgICBpZiAoKChzcmNfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkgIT0gKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKSkgfHwKICAgICAgICAoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQgIT0gVGhpcy0+c3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQpKQogICAgewogICAgICAgIEVSUigiVHJ5aW5nIHRvIGxvYWQgc3VyZmFjZXMgd2l0aCBkaWZmZXJlbnQgbWlwLW1hcCBjb3VudHMgIVxuIik7CiAgICB9CgogICAgd2hpbGUoMSkKICAgIHsKICAgICAgICBERFNVUkZBQ0VERVNDICpzcmNfZCwgKmRzdF9kOwoKICAgICAgICBUUkFDRSgiIGNvcHlpbmcgc3VyZmFjZSAlcCB0byBzdXJmYWNlICVwIChtaXBtYXAgbGV2ZWwgJWQpXG4iLCBzcmNfcHRyLCBUaGlzLCBzcmNfcHRyLT5taXBtYXBfbGV2ZWwpOwoKICAgICAgICBpZiAoIFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfQUxMT0NPTkxPQUQgKQogICAgICAgICAgICAvKiBJZiB0aGUgc3VyZmFjZSBpcyBub3QgYWxsb2NhdGVkIGFuZCBpdHMgbG9jYXRpb24gaXMgbm90IHlldCBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgZm9yY2UgaXQgdG8gdmlkZW8gbWVtb3J5ICovIAogICAgICAgICAgICBpZiAoICEoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfU1lTVEVNTUVNT1JZfEREU0NBUFNfVklERU9NRU1PUlkpKSApCiAgICAgICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19WSURFT01FTU9SWTsKCiAgICAgICAgLyogU3VwcHJlc3MgdGhlIEFMTE9DT05MT0FEIGZsYWcgKi8KICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJj0gfkREU0NBUFNfQUxMT0NPTkxPQUQ7CgogICAgICAgIC8qIEdldCB0aGUgcGFsZXR0ZXMgKi8KICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFN1cmZhY2VfR2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwgJndpbmVfcGFsKTsKICAgICAgICBpZiggcmV0X3ZhbHVlICE9IEQzRF9PSykKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiSVdpbmVEM0RTdXJmYWNlOjpHZXRQYWxldHRlIGZhaWxlZCEgVGhpcyBpcyB1bmV4cGVjdGVkXG4iKTsKICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgIH0KICAgICAgICBpZih3aW5lX3BhbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEUGFsZXR0ZV9HZXRQYXJlbnQod2luZV9wYWwsIChJVW5rbm93biAqKikgJnBhbCk7CiAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiSVdpbmVEM0RQYWxldHRlOjpHZXRQYXJlbnQgZmFpbGVkISBUaGlzIGlzIHVuZXhwZWN0ZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhbF9pbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBwYWwpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcGFsX2ltcGwgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0dldFBhbGV0dGUoc3JjX3B0ci0+V2luZUQzRFN1cmZhY2UsICZ3aW5lX3BhbF9zcmMpOwogICAgICAgIGlmKCByZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgIHsKICAgICAgICAgICAgRVJSKCJJV2luZUQzRFN1cmZhY2U6OkdldFBhbGV0dGUgZmFpbGVkISBUaGlzIGlzIHVuZXhwZWN0ZWRcbiIpOwogICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgfQogICAgICAgIGlmKHdpbmVfcGFsX3NyYykKICAgICAgICB7CiAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEUGFsZXR0ZV9HZXRQYXJlbnQod2luZV9wYWxfc3JjLCAoSVVua25vd24gKiopICZwYWxfc3JjKTsKICAgICAgICAgICAgaWYocmV0X3ZhbHVlICE9IEQzRF9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJJV2luZUQzRFBhbGV0dGU6OkdldFBhcmVudCBmYWlsZWQhIFRoaXMgaXMgdW5leHBlY3RlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFsX2ltcGxfc3JjID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBwYWxfc3JjKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcGFsX2ltcGxfc3JjID0gTlVMTDsKICAgICAgICB9CgogICAgICAgIC8qIEFmdGVyIHNlZWluZyBzb21lIGxvZ3MsIG5vdCBzdXJlIGF0IGFsbCBhYm91dCB0aGlzLi4uICovCiAgICAgICAgaWYgKHBhbF9pbXBsID09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfU2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwgd2luZV9wYWwpOwogICAgICAgICAgICBpZiAocGFsX2ltcGxfc3JjICE9IE5VTEwpIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UocGFsX2ltcGxfc3JjLCBJRGlyZWN0RHJhd1BhbGV0dGUpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHBhbF9pbXBsX3NyYyAhPSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgcGFsZW50WzI1Nl07CiAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcyhJQ09NX0lOVEVSRkFDRShwYWxfaW1wbF9zcmMsIElEaXJlY3REcmF3UGFsZXR0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTYsIHBhbGVudCk7CiAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhJQ09NX0lOVEVSRkFDRShwYWxfaW1wbCwgSURpcmVjdERyYXdQYWxldHRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDI1NiwgcGFsZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQ29weSBvbmUgc3VyZmFjZSBvbiB0aGUgb3RoZXIgKi8KICAgICAgICBkc3RfZCA9IChERFNVUkZBQ0VERVNDICopJihUaGlzLT5zdXJmYWNlX2Rlc2MpOwogICAgICAgIHNyY19kID0gKEREU1VSRkFDRURFU0MgKikmKHNyY19wdHItPnN1cmZhY2VfZGVzYyk7CgogICAgICAgIGlmICgoc3JjX2QtPmR3V2lkdGggIT0gZHN0X2QtPmR3V2lkdGgpIHx8IChzcmNfZC0+ZHdIZWlnaHQgIT0gZHN0X2QtPmR3SGVpZ2h0KSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFNob3VsZCBhbHNvIGNoZWNrIGZvciBzYW1lIHBpeGVsIGZvcm1hdCwgdTEubFBpdGNoLCAuLi4gKi8KICAgICAgICAgICAgRVJSKCJFcnJvciBpbiBzdXJmYWNlIHNpemVzXG4iKTsKICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBXSU5FRDNETE9DS0VEX1JFQ1QgcFNyY1JlY3QsIHBEc3RSZWN0OwoKICAgICAgICAgICAgLyogTFBESVJFQ1QzRERFVklDRTIgZDNkZCA9IChMUERJUkVDVDNEREVWSUNFMikgVGhpcy0+RDNEZGV2aWNlOyAqLwogICAgICAgICAgICAvKiBJIHNob3VsZCBwdXQgYSBtYWNybyBmb3IgdGhlIGNhbGN1bHVzIG9mIGJwcCAqLwoKICAgICAgICAgICAgLyogQ29weSBhbHNvIHRoZSBDb2xvcktleWluZyBzdHVmZiAqLwogICAgICAgICAgICBpZiAoc3JjX2QtPmR3RmxhZ3MgJiBERFNEX0NLU1JDQkxUKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkc3RfZC0+ZHdGbGFncyB8PSBERFNEX0NLU1JDQkxUOwogICAgICAgICAgICAgICAgZHN0X2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWU7CiAgICAgICAgICAgICAgICBkc3RfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSA9IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBDb3B5IHRoZSBtYWluIG1lbW9yeSB0ZXh0dXJlIGludG8gdGhlIHN1cmZhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgT3BlbkdMCiAgICAgICAgICAgICAgdGV4dHVyZSBvYmplY3QuICovCgogICAgICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFN1cmZhY2VfTG9ja1JlY3Qoc3JjX3B0ci0+V2luZUQzRFN1cmZhY2UsICZwU3JjUmVjdCwgTlVMTCwgMCk7CiAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiICglcCkgTG9ja2luZyB0aGUgc291cmNlIHN1cmZhY2UgZmFpbGVkXG4iLCBUaGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0xvY2tSZWN0KFRoaXMtPldpbmVEM0RTdXJmYWNlLCAmcERzdFJlY3QsIE5VTEwsIDApOwogICAgICAgICAgICBpZihyZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIiAoJXApIExvY2tpbmcgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UgZmFpbGVkXG4iLCBUaGlzKTsKICAgICAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KHNyY19wdHItPldpbmVEM0RTdXJmYWNlKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfRk9VUkNDKQogICAgICAgICAgICAgICAgbWVtY3B5KHBEc3RSZWN0LnBCaXRzLCBwU3JjUmVjdC5wQml0cywgc3JjX3B0ci0+c3VyZmFjZV9kZXNjLnUxLmR3TGluZWFyU2l6ZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG1lbWNweShwRHN0UmVjdC5wQml0cywgcFNyY1JlY3QucEJpdHMsIHBTcmNSZWN0LlBpdGNoICogc3JjX2QtPmR3SGVpZ2h0KTsKCiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KHNyY19wdHItPldpbmVEM0RTdXJmYWNlKTsKICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1VubG9ja1JlY3QoVGhpcy0+V2luZUQzRFN1cmZhY2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNyY19wdHItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKQogICAgICAgIHsKICAgICAgICAgICAgc3JjX3B0ciA9IGdldF9zdWJfbWltYXBsZXZlbChzcmNfcHRyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc3JjX3B0ciA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkKICAgICAgICB7CiAgICAgICAgICAgIFRoaXMgPSBnZXRfc3ViX21pbWFwbGV2ZWwoVGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFRoaXMgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgaWYgKChzcmNfcHRyID09IE5VTEwpIHx8IChUaGlzID09IE5VTEwpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNyY19wdHIgIT0gVGhpcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCIgTG9hZGluZyBzdXJmYWNlIHdpdGggZGlmZmVyZW50IG1pcG1hcCBzdHJ1Y3R1cmUgISEhXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJldF92YWx1ZTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfTG9hZChJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFRleHR1cmUgKkQzRFRleHR1cmUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRleHR1cmUgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBEM0RUZXh0dXJlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIFRoaXMsIFRleHR1cmUpOwoKICAgIHJldHVybiBJRGlyZWN0M0RUZXh0dXJlMl9Mb2FkKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3QzRFRleHR1cmUyLCBEM0RUZXh0dXJlKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBUaGUgVlRhYmxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmNvbnN0IElEaXJlY3QzRFRleHR1cmUyVnRibCBJRGlyZWN0M0RUZXh0dXJlMl9WdGJsID0KewogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9SZWxlYXNlLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfR2V0SGFuZGxlLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfUGFsZXR0ZUNoYW5nZWQsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF9Mb2FkLAp9OwoKCmNvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIElEaXJlY3QzRFRleHR1cmUxX1Z0YmwgPQp7CiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1JlbGVhc2UsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0luaXRpYWxpemUsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0dldEhhbmRsZSwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUGFsZXR0ZUNoYW5nZWQsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0xvYWQsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1VubG9hZCwKfTsK