LyogV2luZG93cyBHVUkgQmVoYXZpb3VyIFRlc3RlcgogKgogKiBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8d2luZG93cy5oPgoKI2luY2x1ZGUgImd1aXRlc3QucmgiCgovKiBjaGVja3MgdG8gaW5jbHVkZSAqLwojZGVmaW5lIExPR0dJTkcgLyogY2FuIGJlIHVuZGVmaW5lZCB1bmRlciBXaW5lIGFuZCB1c2UgLWRlYnVnbXNnICttZXNzYWdlIGluc3RlYWQgKi8KI2RlZmluZSBNQUlOX1NUWUxFIFdTX09WRVJMQVBQRURXSU5ET1d8V1NfSFNDUk9MTAojZGVmaW5lIE1BSU5fRVhTVFlMRSAwCiN1bmRlZiBURVNUX0RFU1RST1lfTUFJTgojZGVmaW5lIFNIT1dfU1VCCiN1bmRlZiBURVNUX0RJQUxPRwojZGVmaW5lIFJFU0laRV9ESUFMT0cKI3VuZGVmIFRFU1RfU1VCRElBTE9HCiN1bmRlZiBURVNUX0NPTU1DVEwKCi8qKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiogR0xPQkFMIFZBUklBQkxFUyAqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKiovCgpISU5TVEFOQ0UgaEluc3Q7CkRXT1JEIFN0YXJ0VGltZTsKSFdORCBoTGlzdEJveCxoTWFpblduZCxoU3ViV25kOwpIV05EIGhCdXR0b25bNF09ezAsMCwwLDB9OwpIV05EIGhEaWFsb2c9MCxoR3JvdXA9MCxoU3ViRGxnPTA7CldORFBST0Mgd25kQnV0dG9uWzRdLHduZERpYWxvZyx3bmRHcm91cCx3bmRTdWJEbGc7CkJPT0wgQ2xpY2tlZD0wLFJlYWR5PTA7CmludCBTdGF0ZT0wLFJlYz0wOwojZGVmaW5lIFNUQVRFX0NSRUFURSAwCiNkZWZpbmUgU1RBVEVfREVTVFJPWSAxCiNkZWZpbmUgU1RBVEVfU0hPVyAyCiNkZWZpbmUgU1RBVEVfVVBEQVRFIDMKI2RlZmluZSBTVEFURV9ESUFMT0cgNAojZGVmaW5lIFNUQVRFX1RFU1QgNQojZGVmaW5lIFNUQVRFX0RJUkVDVCA2CiNkZWZpbmUgU1RBVEVfRElTUEFUQ0ggNwojZGVmaW5lIFNUQVRFX1JFQ1VSUyA4CmNoYXIqU3RhdGVOYW1lW109ewogIkNyZWF0IiwKICJEZXN0ciIsCiAiU2hvdyAiLAogIlVwZGF0IiwKICJEaWFsZyIsCiAiVGVzdCAiLAogIkNhbGwgIiwKICJEaXNwICIsCiAiUkNhbGwiCn07CgpzdGF0aWMgY2hhciB3Y2xhc3NuYW1lW10gPSAiR1VJVGVzdENsYXNzIjsKc3RhdGljIGNoYXIgd2NjbGFzc25hbWVbXSA9ICJHVUlUZXN0Q2hpbGRDbGFzcyI7CnN0YXRpYyBjaGFyIHdpbm5hbWVbXSA9ICJHVUlUZXN0IjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKiBMT0dHSU5HIEZBQ0lMSVRJRVMgKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgTVNHTkFNRVMgewogaW50IG1zZzsKIGNoYXIqbmFtZTsKfSBNc2dOYW1lc1tdPXsKI2RlZmluZSBNU0coeCkge3gsI3h9LAojZGVmaW5lIE1TRzIoeCx5KSB7eSwjeH0sCiNkZWZpbmUgRU5ETVNHIHswfQoKLyogd2UgZ2V0IHRoZXNlIGluIENyZWF0ZVdpbmRvdyAqLwpNU0coV01fR0VUTUlOTUFYSU5GTykKTVNHKFdNX05DQ1JFQVRFKQpNU0coV01fTkNDQUxDU0laRSkKTVNHKFdNX0NSRUFURSkKTVNHKFdNX1BBUkVOVE5PVElGWSkKCi8qIHdlIGdldCB0aGVzZSBpbiBTaG93V2luZG93ICovCk1TRyhXTV9TSE9XV0lORE9XKQpNU0coV01fV0lORE9XUE9TQ0hBTkdJTkcpCk1TRyhXTV9RVUVSWU5FV1BBTEVUVEUpCk1TRyhXTV9BQ1RJVkFURUFQUCkKTVNHKFdNX05DQUNUSVZBVEUpCk1TRyhXTV9HRVRURVhUKQpNU0coV01fQUNUSVZBVEUpCk1TRyhXTV9TRVRGT0NVUykKTVNHKFdNX05DUEFJTlQpCk1TRyhXTV9FUkFTRUJLR05EKQpNU0coV01fV0lORE9XUE9TQ0hBTkdFRCkKTVNHKFdNX1NJWkUpCk1TRyhXTV9NT1ZFKQoKLyogd2UgZ2V0IHRoZXNlIGluIERlc3Ryb3lXaW5kb3cgKi8KTVNHKFdNX0tJTExGT0NVUykKTVNHKFdNX0RFU1RST1kpCk1TRyhXTV9OQ0RFU1RST1kpCgovKiB3ZSBnZXQgdGhlc2UgZGlyZWN0bHkgc2VudCAqLwpNU0coV01fTkNISVRURVNUKQpNU0coV01fU0VUQ1VSU09SKQpNU0coV01fTU9VU0VBQ1RJVkFURSkKTVNHKFdNX0NISUxEQUNUSVZBVEUpCk1TRyhXTV9DT01NQU5EKQpNU0coV01fU1lTQ09NTUFORCkKCi8qIHBvc3RlZCBldmVudHMgKi8KTVNHKFdNX01PVVNFTU9WRSkKTVNHKFdNX05DTU9VU0VNT1ZFKQpNU0coV01fUEFJTlQpCk1TRyhXTV9MQlVUVE9ORE9XTikKTVNHKFdNX0xCVVRUT05VUCkKTVNHKFdNX0xCVVRUT05EQkxDTEspCk1TRyhXTV9OQ0xCVVRUT05ET1dOKQpNU0coV01fTkNMQlVUVE9OVVApCk1TRyhXTV9OQ0xCVVRUT05EQkxDTEspCgpNU0coV01fS0VZRE9XTikKTVNHKFdNX0tFWVVQKQpNU0coV01fQ0hBUikKCiNpZmRlZiBXSU4zMgpNU0coV01fQ1RMQ09MT1JCVE4pCk1TRyhXTV9DVExDT0xPUkRMRykKTVNHKFdNX0NUTENPTE9SU1RBVElDKQojZWxzZQpNU0coV01fQ1RMQ09MT1IpCiNlbmRpZgoKLyogbW92aW5nIGFuZCBzaXppbmcgKi8KTVNHMihXTV9FTlRFUlNJWkVNT1ZFLDB4MDIzMSkKTVNHMihXTV9FWElUU0laRU1PVkUsMHgwMjMyKQojaWZkZWYgV0lOMzIKTVNHKFdNX1NJWklORykKI2VuZGlmCgovKiBtZW51cy9kaWFsb2cgYm94ZXMgKi8KTVNHKFdNX0NBTkNFTE1PREUpCk1TRyhXTV9FTkFCTEUpCk1TRyhXTV9TRVRGT05UKQpNU0coV01fSU5JVERJQUxPRykKTVNHKFdNX0dFVERMR0NPREUpCk1TRyhXTV9FTlRFUklETEUpCgovKiBzY3JvbGwgYmFycyAqLwpNU0coV01fSFNDUk9MTCkKTVNHKFdNX1ZTQ1JPTEwpCgovKiBnZXR0aW5nIHRoZXNlIGZyb20gV2luZSBidXQgbm90IGZyb20gV2luZG93cyAqLwpNU0cyKFdNX1NFVFZJU0lCTEUsMHgwMDA5KSAvKiB1bmhlYXJkIG9mIGluIEJDKysgNC41MiAqLwojaWZkZWYgV0lOMzIKTVNHKFdNX0NBUFRVUkVDSEFOR0VEKQojZW5kaWYKCkVORE1TR307CgpzdHJ1Y3QgTVNHTkFNRVMgQnV0TXNnc1tdPXsKTVNHKEJNX1NFVFNUQVRFKQpNU0coQk1fU0VUU1RZTEUpCgpFTkRNU0d9OwoKY2hhcipNc2dOYW1lKFVJTlQgbXNnLEhXTkQgaFduZCkKewogaW50IGk7CiBzdGF0aWMgY2hhciBidWZmZXJbNjRdLHdjbGFzc1s2NF07CiBHZXRDbGFzc05hbWUoaFduZCx3Y2xhc3Msc2l6ZW9mKHdjbGFzcykpOwoKI2RlZmluZSBNU0dTRUFSQ0gobXNncykgeyBcCiAgZm9yIChpPTA7IG1zZ3NbaV0ubmFtZSYmbXNnc1tpXS5tc2chPW1zZzsgaSsrKTsgXAogIGlmIChtc2dzW2ldLm5hbWUpIHJldHVybiBtc2dzW2ldLm5hbWU7IFwKIH0KCiBpZiAoIXN0cmljbXAod2NsYXNzLCJCdXR0b24iKSkgTVNHU0VBUkNIKEJ1dE1zZ3MpOwogTVNHU0VBUkNIKE1zZ05hbWVzKTsKIC8qIFdNX1VTRVIgKi8KIGlmIChtc2c+PVdNX1VTRVIpIHsKICBzcHJpbnRmKGJ1ZmZlciwiV01fVVNFUislMDR4eyVzfSIsbXNnLVdNX1VTRVIsd2NsYXNzKTsKICByZXR1cm4gYnVmZmVyOwogfQogLyogbWVzc2FnZSBub3QgZm91bmQgKi8KIHNwcmludGYoYnVmZmVyLCIlMDR4eyVzfSIsbXNnLHdjbGFzcyk7CiByZXR1cm4gYnVmZmVyOwp9CgpjaGFyKlduZE5hbWUoSFdORCBoV25kLGludCBzdGF0ZSkKewogc3RhdGljIGNoYXIgYnVmZmVyWzE2XTsKIGlmICghaFduZCkgcmV0dXJuICIwMDAwIjsKIGlmIChoV25kPT1oTWFpblduZCB8fCAoc3RhdGU9PVNUQVRFX0NSRUFURSAmJiAhaE1haW5XbmQpKSByZXR1cm4gIm1haW4iOwogaWYgKGhXbmQ9PWhTdWJXbmQgfHwgKHN0YXRlPT1TVEFURV9DUkVBVEUgJiYgIWhTdWJXbmQpKSByZXR1cm4gImNobGQiOwogaWYgKGhXbmQ9PWhEaWFsb2cgfHwgKHN0YXRlPT1TVEFURV9ESUFMT0cgJiYgIWhEaWFsb2cpKSByZXR1cm4gInRkbGciOwogaWYgKGhXbmQ9PWhHcm91cCkgcmV0dXJuICJ0Z3JwIjsKIGlmIChoV25kPT1oQnV0dG9uWzBdKSByZXR1cm4gImJ1dDEiOwogaWYgKGhXbmQ9PWhCdXR0b25bMV0pIHJldHVybiAiYnV0MiI7CiBpZiAoaFduZD09aEJ1dHRvblsyXSkgcmV0dXJuICJidXQzIjsKIGlmIChoV25kPT1oQnV0dG9uWzNdKSByZXR1cm4gImJ1dDQiOwogaWYgKGhXbmQ9PWhTdWJEbGcgfHwgKHN0YXRlPT1TVEFURV9DUkVBVEUgJiYgIWhTdWJEbGcpKSByZXR1cm4gInNkbGciOwogaWYgKGhEaWFsb2cpIHsKICBpbnQgaWQ9R2V0RGxnQ3RybElEKGhXbmQpOwogIGlmIChpZCkgewogICBzcHJpbnRmKGJ1ZmZlciwiZGxnaXRlbSglZCkiLGlkKTsKICAgcmV0dXJuIGJ1ZmZlcjsKICB9CiB9CiBzcHJpbnRmKGJ1ZmZlciwiJTA0eCIsaFduZCk7CiByZXR1cm4gYnVmZmVyOwp9Cgp2b2lkIExvZyhjb25zdCBjaGFyKmZtdCkKewojaWZkZWYgTE9HR0lORwogaWYgKCFDbGlja2VkKSBTZW5kTWVzc2FnZShoTGlzdEJveCxMQl9BRERTVFJJTkcsMCwoTFBBUkFNKWZtdCk7CiNlbmRpZgp9Cgp2b2lkIExvZ2YoY29uc3QgY2hhcipmbXQsLi4uKQp7CiB2YV9saXN0IHBhcjsKIHN0YXRpYyBjaGFyIGJ1ZmZlclsyNTZdOwoKIHZhX3N0YXJ0KHBhcixmbXQpOwogdnNwcmludGYoYnVmZmVyLGZtdCxwYXIpOwogdmFfZW5kKHBhcik7CiBMb2coYnVmZmVyKTsKfQoKdm9pZCBMb2dDaGlsZE9yZGVyKEhXTkQgaFduZCkKewogSFdORCBoV25kQ2hpbGQgPSBHZXRXaW5kb3coaFduZCxHV19DSElMRCk7CiBzdGF0aWMgY2hhciBidWZmZXJbMjU2XTsKCiBzdHJjcHkoYnVmZmVyLCJjaGlsZCBsaXN0OiIpOwogd2hpbGUgKGhXbmRDaGlsZCkgewogIHN0cmNhdChzdHJjYXQoYnVmZmVyLCIgIiksV25kTmFtZShoV25kQ2hpbGQsU3RhdGUpKTsKICBoV25kQ2hpbGQ9R2V0V2luZG93KGhXbmRDaGlsZCxHV19IV05ETkVYVCk7CiB9CiBMb2coYnVmZmVyKTsKfQoKdm9pZCBMb2dNZXNzYWdlKGludCBzdGF0ZSxIV05EIGhXbmQsVUlOVCBtc2csV1BBUkFNIHdQYXJhbSxMUEFSQU0gbFBhcmFtLGNoYXIqbmFtZSkKewogc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CiBEV09SRCB0aWNrPUdldFRpY2tDb3VudCgpLVN0YXJ0VGltZTsKIGNoYXIqbXNnbmFtZT1Nc2dOYW1lKG1zZyxoV25kKTsKIGlmICghbmFtZSkgbmFtZT1XbmROYW1lKGhXbmQsc3RhdGUpOwogc3dpdGNoIChtc2cpIHsKICBjYXNlIFdNX1NFVEZPQ1VTOgogIGNhc2UgV01fS0lMTEZPQ1VTOgogIGNhc2UgV01fU0VUQ1VSU09SOgogICBMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglcywlMDh4KSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKICAgICAgICBuYW1lLG1zZ25hbWUsV25kTmFtZSgoSFdORCl3UGFyYW0sU3RhdGUpLGxQYXJhbSk7CiAgIGJyZWFrOwojaWZkZWYgV0lOMzIKICBjYXNlIFdNX0VOVEVSSURMRToKICBjYXNlIFdNX0NUTENPTE9SQlROOgogIGNhc2UgV01fQ1RMQ09MT1JETEc6CiAgIExvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCUwOHgsJXMpIix0aWNrLFN0YXRlTmFtZVtzdGF0ZV0sUmVjLAogICAgICAgIG5hbWUsbXNnbmFtZSx3UGFyYW0sV25kTmFtZSgoSFdORClsUGFyYW0sU3RhdGUpKTsKICAgYnJlYWs7CiNlbHNlCiAgY2FzZSBXTV9FTlRFUklETEU6CiAgY2FzZSBXTV9DVExDT0xPUjoKICAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJTA4eCwlMDR4OiVzKSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKICAgICAgICBuYW1lLG1zZ25hbWUsd1BhcmFtLEhJV09SRChsUGFyYW0pLFduZE5hbWUoKEhXTkQpTE9XT1JEKGxQYXJhbSksU3RhdGUpKTsKICAgYnJlYWs7CiNlbmRpZgogIGNhc2UgV01fV0lORE9XUE9TQ0hBTkdJTkc6CiAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0VEOgogICB7CiAgICBXSU5ET1dQT1MqcG9zPShXSU5ET1dQT1MqKWxQYXJhbTsKI2lmZGVmIFdJTjMyCgkgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJTA4eCwlcCkiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCgkJCW5hbWUsbXNnbmFtZSx3UGFyYW0scG9zKTsKI2Vsc2UKCSBMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglMDR4LCVwKSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKCQkJbmFtZSxtc2duYW1lLHdQYXJhbSxwb3MpOwojZW5kaWYKCSBzdHJjcHkoYnVmZmVyLCJGTEFHUzoiKTsKCSBpZiAocG9zLT5mbGFncyZTV1BfRFJBV0ZSQU1FKSBzdHJjYXQoYnVmZmVyLCIgRFJBV0ZSQU1FIik7CgkgaWYgKHBvcy0+ZmxhZ3MmU1dQX0hJREVXSU5ET1cpIHN0cmNhdChidWZmZXIsIiBISURFV0lORE9XIik7CgkgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PQUNUSVZBVEUpIHN0cmNhdChidWZmZXIsIiBOT0FDVElWQVRFIik7CgkgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PQ09QWUJJVFMpIHN0cmNhdChidWZmZXIsIiBOT0NPUFlCSVRTIik7CgkgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PTU9WRSkgc3RyY2F0KGJ1ZmZlciwiIE5PTU9WRSIpOwoJIGlmIChwb3MtPmZsYWdzJlNXUF9OT09XTkVSWk9SREVSKSBzdHJjYXQoYnVmZmVyLCIgTk9PV05FUlpPUkRFUiIpOwoJIGlmIChwb3MtPmZsYWdzJlNXUF9OT1NJWkUpIHN0cmNhdChidWZmZXIsIiBOT1NJWkUiKTsKCSBpZiAocG9zLT5mbGFncyZTV1BfTk9SRURSQVcpIHN0cmNhdChidWZmZXIsIiBOT1JFRFJBVyIpOwoJIGlmIChwb3MtPmZsYWdzJlNXUF9OT1pPUkRFUikgc3RyY2F0KGJ1ZmZlciwiIE5PWk9SREVSIik7CgkgaWYgKHBvcy0+ZmxhZ3MmU1dQX1NIT1dXSU5ET1cpIHN0cmNhdChidWZmZXIsIiBTSE9XV0lORE9XIik7CgkgTG9nKGJ1ZmZlcik7Cgl9CglicmVhazsKICBjYXNlIFdNX1NZU0NPTU1BTkQ6Cgl7CgkgY2hhcipjbWQ9TlVMTDsKCSBzd2l0Y2ggKHdQYXJhbSYweEZGRjApIHsKI2RlZmluZSBDQVNFKHgpIGNhc2UgU0NfIyN4OiBjbWQ9I3g7IGJyZWFrOwoJICBDQVNFKENMT1NFKQoJICBDQVNFKERFRkFVTFQpCgkgIENBU0UoSE9US0VZKQoJICBDQVNFKEhTQ1JPTEwpCgkgIENBU0UoS0VZTUVOVSkKCSAgQ0FTRShNQVhJTUlaRSkKCSAgQ0FTRShNSU5JTUlaRSkKCSAgQ0FTRShNT1VTRU1FTlUpCgkgIENBU0UoTU9WRSkKCSAgQ0FTRShORVhUV0lORE9XKQoJICBDQVNFKFBSRVZXSU5ET1cpCgkgIENBU0UoUkVTVE9SRSkKCSAgQ0FTRShTQ1JFRU5TQVZFKQoJICBDQVNFKFNJWkUpCgkgIENBU0UoVEFTS0xJU1QpCgkgIENBU0UoVlNDUk9MTCkKI3VuZGVmIENBU0UKCSB9CgkgaWYgKGNtZCkgewoJICBMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglcysleCwlMDh4KSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKCQkJIG5hbWUsbXNnbmFtZSxjbWQsd1BhcmFtJjB4RixsUGFyYW0pOwoJIH0gZWxzZSBnb3RvIEdFTkVSSUNfTVNHOwoJfQoJYnJlYWs7CiAgY2FzZSBXTV9IU0NST0xMOgogIGNhc2UgV01fVlNDUk9MTDoKCXsKCSBjaGFyKmNtZD1OVUxMOwoJIHN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIHsKI2RlZmluZSBDQVNFKHgpIGNhc2UgU0JfIyN4OiBjbWQ9I3g7IGJyZWFrOwojZGVmaW5lIENBU0UyKGgsdikgY2FzZSBTQl8jI2g6IGlmIChtc2c9PVdNX0hTQ1JPTEwpIGNtZD0jaDsgZWxzZSBjbWQ9I3Y7IGJyZWFrOwoJICBDQVNFKEJPVFRPTSkKCSAgQ0FTRShFTkRTQ1JPTEwpCgkgIENBU0UyKExJTkVMRUZULExJTkVVUCkKCSAgQ0FTRTIoTElORVJJR0hULExJTkVET1dOKQoJICBDQVNFMihQQUdFTEVGVCxQQUdFVVApCgkgIENBU0UyKFBBR0VSSUdIVCxQQUdFRE9XTikKCSAgQ0FTRShUSFVNQlBPU0lUSU9OKQoJICBDQVNFKFRIVU1CVFJBQ0spCiAgICAgQ0FTRShUT1ApCiN1bmRlZiBDQVNFCgkgfQoJIGlmIChjbWQpIHsKI2lmZGVmIFdJTjMyCgkgIExvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCVzLCUwNHgsJXMpIix0aWNrLFN0YXRlTmFtZVtzdGF0ZV0sUmVjLAoJCQkgbmFtZSxtc2duYW1lLGNtZCxISVdPUkQod1BhcmFtKSxXbmROYW1lKChIV05EKWxQYXJhbSxTdGF0ZSkpOwojZWxzZQoJICBMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglMDR4LCUwNHgsJXMpIix0aWNrLFN0YXRlTmFtZVtzdGF0ZV0sUmVjLAoJCQkgbmFtZSxtc2duYW1lLGNtZCxMT1dPUkQobFBhcmFtKSxXbmROYW1lKChIV05EKUhJV09SRChsUGFyYW0pLFN0YXRlKSk7CiNlbmRpZgoJIH0gZWxzZSBnb3RvIEdFTkVSSUNfTVNHOwoJfQoJYnJlYWs7CiAgZGVmYXVsdDoKR0VORVJJQ19NU0c6CiNpZmRlZiBXSU4zMgoJTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJTA4eCwlMDh4KSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKCQkgIG5hbWUsbXNnbmFtZSx3UGFyYW0sbFBhcmFtKTsKI2Vsc2UKCUxvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCUwNHgsJTA4eCkiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCgkJICBuYW1lLG1zZ25hbWUsd1BhcmFtLGxQYXJhbSk7CiNlbmRpZgogfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqIEdSQVBISUNTIEZBQ0lMSVRJRVMgKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQYWludChIV05EIGhXbmQpCnsKIEhEQyBkYzsKIFBBSU5UU1RSVUNUIHBzOwogZGM9QmVnaW5QYWludChoV25kLCZwcyk7CiBFbmRQYWludChoV25kLCZwcyk7Cn0KCnZvaWQgRmlsbFBhdHRlcm4oSFdORCBoV25kLEhEQyBwZGMpCnsKIEhEQyBkYz1wZGM/cGRjOkdldERDKGhXbmQpOwogSEJSVVNIIG9sZGJydXNoOwogUkVDVCByZWN0OwogaWYgKCFkYykgewogIExvZ2YoImZhaWxlZCB0byBhY3F1aXJlIERDIGZvciB3aW5kb3cgJXMiLFduZE5hbWUoaFduZCxTdGF0ZSkpOwogIHJldHVybjsKIH0gZWxzZSB7CiAgTG9nZigiYWNxdWlyZWQgREMgZm9yICVzIHdpbmRvdyAlcywgcGFpbnRpbmciLAogICAgICAgSXNXaW5kb3dWaXNpYmxlKGhXbmQpPyJ2aXNpYmxlIjoiaW52aXNpYmxlIixXbmROYW1lKGhXbmQsU3RhdGUpKTsKIH0KIEdldENsaWVudFJlY3QoaFduZCwmcmVjdCk7CiBvbGRicnVzaD1TZWxlY3RPYmplY3QoZGMsR2V0U3RvY2tPYmplY3QoTFRHUkFZX0JSVVNIKSk7CiBQYXRCbHQoZGMsMCwwLHJlY3QucmlnaHQscmVjdC5ib3R0b20sUEFUQ09QWSk7CiBTZWxlY3RPYmplY3QoZGMsb2xkYnJ1c2gpOwogaWYgKCFwZGMpIFJlbGVhc2VEQyhoV25kLGRjKTsKfQoKdm9pZCBQYWludFBhdHRlcm4oSFdORCBoV25kKQp7CiBIREMgZGM7CiBQQUlOVFNUUlVDVCBwczsKIGRjPUJlZ2luUGFpbnQoaFduZCwmcHMpOwogRmlsbFBhdHRlcm4oaFduZCxkYyk7CiBFbmRQYWludChoV25kLCZwcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqIFdJTkRPVyBQUk9DRURVUkVTICoqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBNQUlOIFdJTkRPVyAqLwpMUkVTVUxUIEZBUiBDQUxMQkFDSyBfZXhwb3J0IE1haW5XaW5kb3dQcm9jKEhXTkQgaFduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCnsKIExSRVNVTFQgbFJlc3VsdD0wOwogUkVDVCByZWN0OwogaW50IE9sZFN0YXRlPVN0YXRlOwoKIFN0YXRlPVNUQVRFX1JFQ1VSUzsgUmVjKys7CiBpZiAoIUNsaWNrZWQpIExvZ01lc3NhZ2UoT2xkU3RhdGUsaFduZCxtc2csd1BhcmFtLGxQYXJhbSxOVUxMKTsKIHN3aXRjaCAobXNnKSB7CiAgY2FzZSBXTV9OQ0hJVFRFU1Q6CiAgIGxSZXN1bHQ9RGVmV2luZG93UHJvYyhoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKICAgYnJlYWs7CiAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKICBjYXNlIFdNX0NIQVI6CiAgIGlmICghQ2xpY2tlZCkgewogICAgU2V0UGFyZW50KGhMaXN0Qm94LGhXbmQpOwogICAgR2V0Q2xpZW50UmVjdChoV25kLCZyZWN0KTsKICAgIE1vdmVXaW5kb3coaExpc3RCb3gsMCwwLHJlY3QucmlnaHQscmVjdC5ib3R0b20sVFJVRSk7CiAgICBTaG93V2luZG93KGhMaXN0Qm94LFNXX1NIT1cpOwogICAgU2V0Rm9jdXMoaExpc3RCb3gpOwogICAgQ2xpY2tlZD1UUlVFOwogICB9CiAgIGJyZWFrOwogIGNhc2UgV01fU0laRToKICAgR2V0Q2xpZW50UmVjdChoV25kLCZyZWN0KTsKICAgaWYgKENsaWNrZWQpIHsKICAgIE1vdmVXaW5kb3coaExpc3RCb3gsMCwwLHJlY3QucmlnaHQscmVjdC5ib3R0b20sVFJVRSk7CiAgIH0KICAgTW92ZVdpbmRvdyhoU3ViV25kLDAscmVjdC5ib3R0b20vMixyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLShyZWN0LmJvdHRvbS8yKSxUUlVFKTsKICAgYnJlYWs7CiAgY2FzZSBXTV9QQUlOVDoKICAgUGFpbnQoaFduZCk7CiAgIGJyZWFrOwogIGNhc2UgV01fREVTVFJPWToKICAgUG9zdFF1aXRNZXNzYWdlKDApOwogICBicmVhazsKICBkZWZhdWx0OgogICBsUmVzdWx0PURlZldpbmRvd1Byb2MoaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7CiB9CiBTdGF0ZT1PbGRTdGF0ZTsgUmVjLS07CiByZXR1cm4gbFJlc3VsdDsKfQoKLyogQ0hJTEQgV0lORE9XICovCkxSRVNVTFQgRkFSIENBTExCQUNLIF9leHBvcnQgU3ViV2luZG93UHJvYyhIV05EIGhXbmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiBMUkVTVUxUIGxSZXN1bHQ9MDsKIFJFQ1QgcmVjdDsKIGludCBPbGRTdGF0ZT1TdGF0ZTsKCiBTdGF0ZT1TVEFURV9SRUNVUlM7IFJlYysrOwogaWYgKCFDbGlja2VkKSBMb2dNZXNzYWdlKE9sZFN0YXRlLGhXbmQsbXNnLHdQYXJhbSxsUGFyYW0sTlVMTCk7CiBzd2l0Y2ggKG1zZykgewogIGNhc2UgV01fUEFJTlQ6CiAgIFBhaW50KGhXbmQpOwogICBicmVhazsKICBkZWZhdWx0OgogICBsUmVzdWx0PURlZldpbmRvd1Byb2MoaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7CiB9CiBTdGF0ZT1PbGRTdGF0ZTsgUmVjLS07CiByZXR1cm4gbFJlc3VsdDsKfQoKQk9PTCBGQVIgQ0FMTEJBQ0sgX2V4cG9ydCBTdWJEaWFsb2dQcm9jKEhXTkQgaFduZERsZywgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwoKLyogU1VCQ0xBU1NFRCBDT05UUk9MUyAqLwpMUkVTVUxUIEZBUiBDQUxMQkFDSyBfZXhwb3J0IFN1YkNsYXNzV2luZG93UHJvYyhIV05EIGhXbmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiBMUkVTVUxUIGxSZXN1bHQ9MDsKIFJFQ1QgcmVjdDsKIGludCBPbGRTdGF0ZT1TdGF0ZTsKIGludCBCdXQ9LTE7CgogaWYgKGhXbmQ9PWhCdXR0b25bMF0pIEJ1dD0wOyBlbHNlCiBpZiAoaFduZD09aEJ1dHRvblsxXSkgQnV0PTE7IGVsc2UKIGlmIChoV25kPT1oQnV0dG9uWzJdKSBCdXQ9MjsgZWxzZQogaWYgKGhXbmQ9PWhCdXR0b25bM10pIEJ1dD0zOwoKIFN0YXRlPVNUQVRFX1JFQ1VSUzsgUmVjKys7CiBpZiAoIUNsaWNrZWQpIHsKICBMb2dNZXNzYWdlKE9sZFN0YXRlLGhXbmQsbXNnLHdQYXJhbSxsUGFyYW0sTlVMTCk7CiAgaWYgKEJ1dCE9LTEpIHsKICAgbFJlc3VsdD1DYWxsV2luZG93UHJvYygoRkFSUFJPQyl3bmRCdXR0b25bQnV0XSxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKICAgaWYgKG1zZz09V01fTEJVVFRPTlVQKSB7CiAgICBMb2dDaGlsZE9yZGVyKEdldFBhcmVudChoV25kKSk7CiAgIH0KICB9CiAgZWxzZSBpZiAoaFduZD09aERpYWxvZykgewogICBsUmVzdWx0PUNhbGxXaW5kb3dQcm9jKChGQVJQUk9DKXduZERpYWxvZyxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKICB9CiAgZWxzZSBpZiAoaFduZD09aFN1YkRsZykgewogICBsUmVzdWx0PUNhbGxXaW5kb3dQcm9jKChGQVJQUk9DKXduZFN1YkRsZyxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKICB9CiAgZWxzZSBpZiAoaFduZD09aEdyb3VwKSB7CiAgIGxSZXN1bHQ9Q2FsbFdpbmRvd1Byb2MoKEZBUlBST0Mpd25kR3JvdXAsaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7CiAgIGlmIChtc2c9PVdNX1NFVEZPQ1VTKSB7CiAgICAvKiBjcmVhdGUgc3ViZGlhbG9nICovCiAgICBpZiAoaFN1YkRsZykgewojaWYgMAogICAgIFNldFJlY3QoJnJlY3QsMCwwLDEsMSk7CiAgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwmcmVjdCxGQUxTRSk7CiNlbmRpZgogICAgfSBlbHNlIHsKI2lmZGVmIFRFU1RfU1VCRElBTE9HCiAgICAgU3RhdGU9U1RBVEVfQ1JFQVRFOwogICAgIGhTdWJEbGc9Q3JlYXRlRGlhbG9nKGhJbnN0LE1BS0VJTlRSRVNPVVJDRSgyKSxoV25kLChGQVJQUk9DKVN1YkRpYWxvZ1Byb2MpOwogICAgIFN0YXRlPVNUQVRFX1JFQ1VSUzsKI2Vsc2UKI2lmZGVmIFJFU0laRV9ESUFMT0cKICAgICBHZXRXaW5kb3dSZWN0KEdldFBhcmVudChoV25kKSwmcmVjdCk7CiAgICAgcmVjdC5yaWdodCsrOwogICAgIFNldFdpbmRvd1BvcyhHZXRQYXJlbnQoaFduZCksMCwwLDAsCiAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LHJlY3QuYm90dG9tLXJlY3QudG9wLAogICAgICAgICAgICAgICAgICBTV1BfTk9NT1ZFfFNXUF9OT1pPUkRFUik7CiNlbmRpZgojZW5kaWYKICAgIH0KICAgfQogIH0KIH0KIFN0YXRlPU9sZFN0YXRlOyBSZWMtLTsKIHJldHVybiBsUmVzdWx0Owp9CgovKiBNQUlOIERJQUxPRyBQUk9DRURVUkUgKi8KQk9PTCBGQVIgQ0FMTEJBQ0sgX2V4cG9ydCBUZXN0RGlhbG9nUHJvYyhIV05EIGhXbmREbGcsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiBCT09MIGJSZXN1bHQ9MDsKIFJFQ1QgcmVjdDsKIGludCBPbGRTdGF0ZT1TdGF0ZTsKIGludCBCdXQ9LTE7CgogU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKIGlmICghQ2xpY2tlZCkgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kRGxnLG1zZyx3UGFyYW0sbFBhcmFtLCJkbGdwIik7CiBzd2l0Y2ggKG1zZykgewogIGNhc2UgV01fSU5JVERJQUxPRzoKICAgaERpYWxvZyA9IGhXbmREbGc7CiAgIC8qIHN1YmNsYXNzIGRpYWxvZyB3aW5kb3cgcHJvYyAqLwogICB3bmREaWFsb2cgPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhEaWFsb2csR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKICAgTG9nZigiZGlhbG9nIHZpc2libGU9JXMiLElzV2luZG93VmlzaWJsZShoV25kRGxnKT8iVFJVRSI6IkZBTFNFIik7CiAgIC8qIHN1YmNsYXNzIE9LIGJ1dHRvbiAqLwogICBoQnV0dG9uWzNdID0gR2V0RGxnSXRlbShoV25kRGxnLElET0spOwogICB3bmRCdXR0b25bM10gPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhCdXR0b25bM10sR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKICAgLyogc3ViY2xhc3MgZ3JvdXAgYm94ICovCiAgIGhHcm91cCA9IEdldERsZ0l0ZW0oaFduZERsZyxJRENfR1JPVVBCT1gxKTsKICAgd25kR3JvdXAgPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhHcm91cCxHV0xfV05EUFJPQywoTE9ORylTdWJDbGFzc1dpbmRvd1Byb2MpOwoKI2lmZGVmIFJFU0laRV9ESUFMT0cKICAgR2V0V2luZG93UmVjdChoV25kRGxnLCZyZWN0KTsKICAgcmVjdC5yaWdodC0tOwogICBTZXRXaW5kb3dQb3MoaFduZERsZywwLDAsMCwKICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LHJlY3QuYm90dG9tLXJlY3QudG9wLAogICAgICAgICAgICAgICAgU1dQX05PTU9WRXxTV1BfTk9aT1JERVIpOwovLyAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShoV25kRGxnLElEQ0FOQ0VMKSxTV19ISURFKTsKI2VuZGlmCgogICBiUmVzdWx0PVRSVUU7IC8qIHdlIGRvbid0IGRvIFNldEZvY3VzICovCiAgIGJyZWFrOwogIGNhc2UgV01fUEFJTlQ6CiAgIFBhaW50UGF0dGVybihoV25kRGxnKTsKICAgYlJlc3VsdD1UUlVFOwogICBicmVhazsKICBjYXNlIFdNX0NPTU1BTkQ6CiAgIEVuZERpYWxvZyhoV25kRGxnLExPV09SRCh3UGFyYW0pKTsKICAgYlJlc3VsdD1UUlVFOwogICBicmVhazsKICBjYXNlIFdNX0NMT1NFOgogICBFbmREaWFsb2coaFduZERsZyxJRENBTkNFTCk7CiAgIGJSZXN1bHQ9VFJVRTsKICAgYnJlYWs7CiAgY2FzZSBXTV9OQ0RFU1RST1k6CiAgIGhEaWFsb2cgPSAwOwogICBicmVhazsKIH0KIFN0YXRlPU9sZFN0YXRlOyBSZWMtLTsKIHJldHVybiBiUmVzdWx0Owp9CgovKiBTVUJESUFMT0cgUFJPQ0VEVVJFICovCkJPT0wgRkFSIENBTExCQUNLIF9leHBvcnQgU3ViRGlhbG9nUHJvYyhIV05EIGhXbmREbGcsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiBCT09MIGJSZXN1bHQ9MDsKIFJFQ1QgcmVjdDsKIGludCBPbGRTdGF0ZT1TdGF0ZTsKIGludCBCdXQ9LTE7CgogU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKIGlmICghQ2xpY2tlZCkgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kRGxnLG1zZyx3UGFyYW0sbFBhcmFtLE5VTEwpOwogc3dpdGNoIChtc2cpIHsKICBjYXNlIFdNX0lOSVRESUFMT0c6CiAgIGhTdWJEbGcgPSBoV25kRGxnOwogICAvKiBzdWJjbGFzcyBkaWFsb2cgd2luZG93IHByb2MgKi8KICAgd25kU3ViRGxnID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhoRGlhbG9nLEdXTF9XTkRQUk9DLChMT05HKVN1YkNsYXNzV2luZG93UHJvYyk7CgogICBiUmVzdWx0PVRSVUU7IC8qIHdlIGRvbid0IGRvIFNldEZvY3VzICovCiAgIGJyZWFrOwogIGNhc2UgV01fTkNERVNUUk9ZOgogICBoU3ViRGxnID0gMDsKICAgYnJlYWs7CiB9CiBTdGF0ZT1PbGRTdGF0ZTsgUmVjLS07CiByZXR1cm4gYlJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqLwovKioqIE1BSU4gUFJPR1JBTSAqKiovCi8qKioqKioqKioqKioqKioqKioqKi8KCkJPT0wgQXBwSW5pdCh2b2lkKQp7CiBXTkRDTEFTUyB3Y2xhc3M7Cgogd2NsYXNzLnN0eWxlID0gQ1NfSFJFRFJBV3xDU19WUkVEUkFXOwogd2NsYXNzLmxwZm5XbmRQcm9jID0gTWFpbldpbmRvd1Byb2M7CiB3Y2xhc3MuY2JDbHNFeHRyYSA9IDA7CiB3Y2xhc3MuY2JXbmRFeHRyYSA9IDA7CiB3Y2xhc3MuaEluc3RhbmNlID0gaEluc3Q7CiB3Y2xhc3MuaEljb24gPSBMb2FkSWNvbihoSW5zdCxNQUtFSU5UUkVTT1VSQ0UoMSkpOwogd2NsYXNzLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKDAsSURDX0FSUk9XKTsKIHdjbGFzcy5oYnJCYWNrZ3JvdW5kID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOwogd2NsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7CiB3Y2xhc3MubHBzekNsYXNzTmFtZSA9IHdjbGFzc25hbWU7CiBpZiAoIVJlZ2lzdGVyQ2xhc3MoJndjbGFzcykpIHJldHVybiBGQUxTRTsKIHdjbGFzcy5scGZuV25kUHJvYyA9IFN1YldpbmRvd1Byb2M7CiB3Y2xhc3MubHBzekNsYXNzTmFtZSA9IHdjY2xhc3NuYW1lOwogaWYgKCFSZWdpc3RlckNsYXNzKCZ3Y2xhc3MpKSByZXR1cm4gRkFMU0U7CiByZXR1cm4gVFJVRTsKfQoKaW50IFBBU0NBTCBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgTFBTVFIgbHBzekNtZExpbmUsIGludCBuQ21kU2hvdykKewogTVNHIG1zZzsKIFJFQ1QgcmVjdDsKCiBoSW5zdCA9IGhJbnN0YW5jZTsKIGlmICghaFByZXZJbnN0YW5jZSkKICBpZiAoIUFwcEluaXQoKSkKICAgcmV0dXJuIDA7CgogU3RhcnRUaW1lPUdldFRpY2tDb3VudCgpOwogaExpc3RCb3ggPSBDcmVhdGVXaW5kb3coIkxJU1RCT1giLCJNZXNzYWdlcyIsV1NfQk9SREVSfFdTX1ZTQ1JPTEx8V1NfQ0hJTER8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQlNfSEFTU1RSSU5HU3xMQlNfTk9USUZZfExCU19XQU5US0VZQk9BUkRJTlBVVCwKICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsR2V0RGVza3RvcFdpbmRvdygpLDAsaEluc3QsMCk7CiBpZiAoIWhMaXN0Qm94KSB7CiAgTWVzc2FnZUJveCgwLCJDb3VsZCBub3QgY3JlYXRlIGxpc3QgYm94IiwiRXJyb3IiLE1CX09LKTsKIH0KCiBTdGF0ZT1TVEFURV9DUkVBVEU7CiBoTWFpblduZCA9IENyZWF0ZVdpbmRvd0V4KE1BSU5fRVhTVFlMRSx3Y2xhc3NuYW1lLHdpbm5hbWUsTUFJTl9TVFlMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwwLDQwMCwzMDAsMCwwLGhJbnN0LDApOwogaWYgKCFoTWFpblduZCkgcmV0dXJuIDA7CiBTdGF0ZT1TVEFURV9TSE9XOwogU2hvd1dpbmRvdyhoTWFpblduZCxuQ21kU2hvdyk7CiNpZmRlZiBURVNUX0RFU1RST1lfTUFJTgogU3RhdGU9U1RBVEVfREVTVFJPWTsKIERlc3Ryb3lXaW5kb3coaE1haW5XbmQpOwogU3RhdGU9U1RBVEVfRElSRUNUOwogd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywwLDAsMCkpIHsKICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwogIFN0YXRlPVNUQVRFX0RJU1BBVENIOwogIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKICBTdGF0ZT1TVEFURV9ESVJFQ1Q7CiB9CiBTdGF0ZT1TVEFURV9DUkVBVEU7CiBoTWFpblduZCA9IENyZWF0ZVdpbmRvd0V4KE1BSU5fRVhTVFlMRSx3Y2xhc3NuYW1lLHdpbm5hbWUsTUFJTl9TVFlMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwwLDQwMCwzMDAsMCwwLGhJbnN0LDApOwogaWYgKCFoTWFpblduZCkgcmV0dXJuIDA7CiBTdGF0ZT1TVEFURV9TSE9XOwogU2hvd1dpbmRvdyhoTWFpblduZCxuQ21kU2hvdyk7CiNlbmRpZgovKiB1cGRhdGUsIHNvIG5vIFdNX1BBSU5UcyBhcmUgcGVuZGluZyAqLwogU3RhdGU9U1RBVEVfVVBEQVRFOwovLyBVcGRhdGVXaW5kb3coaE1haW5XbmQpOwogUmVhZHk9VFJVRTsKLyogZmlsbCBjbGllbnQgYXJlYSB3aXRoIGEgcGF0dGVybiAqLwogRmlsbFBhdHRlcm4oaE1haW5XbmQsMCk7Ci8qIGNyZWF0ZSBzdWJ3aW5kb3cgKi8KIFN0YXRlPVNUQVRFX0NSRUFURTsKIEdldENsaWVudFJlY3QoaE1haW5XbmQsJnJlY3QpOwogaFN1YlduZCA9IENyZWF0ZVdpbmRvdyh3Y2NsYXNzbmFtZSx3aW5uYW1lLFdTX0NISUxEfFdTX0JPUkRFUnxXU19DTElQU0lCTElOR1MsCiAgICAgICAgICAgICAgICAgICAgICAgIDAscmVjdC5ib3R0b20vMixyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLShyZWN0LmJvdHRvbS8yKSxoTWFpblduZCwwLGhJbnN0LDApOwogaWYgKCFoU3ViV25kKSByZXR1cm4gMDsKLyogY3JlYXRlIGJ1dHRvbnMgKi8KIGhCdXR0b25bMF0gPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsIjEiLFdTX0NISUxEfFdTX0NMSVBTSUJMSU5HU3xXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICA4LDgsNDgsMjAsaE1haW5XbmQsMCxoSW5zdCwwKTsKIGhCdXR0b25bMV0gPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsIjIiLFdTX0NISUxEfFdTX0NMSVBTSUJMSU5HU3xXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwxMiw0OCwyMCxoTWFpblduZCwwLGhJbnN0LDApOwogaEJ1dHRvblsyXSA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwiMyIsV1NfQ0hJTER8V1NfQ0xJUFNJQkxJTkdTfFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2LDE2LDQ4LDIwLGhNYWluV25kLDAsaEluc3QsMCk7Ci8qIHN1YmNsYXNzIHRoZW0gKi8KIHduZEJ1dHRvblswXSA9IChXTkRQUk9DKVNldFdpbmRvd0xvbmcoaEJ1dHRvblswXSxHV0xfV05EUFJPQywoTE9ORylTdWJDbGFzc1dpbmRvd1Byb2MpOwogd25kQnV0dG9uWzFdID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhoQnV0dG9uWzFdLEdXTF9XTkRQUk9DLChMT05HKVN1YkNsYXNzV2luZG93UHJvYyk7CiB3bmRCdXR0b25bMl0gPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhCdXR0b25bMl0sR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKLyogc2hvdyB0aGVtICovCiBTdGF0ZT1TVEFURV9VUERBVEU7CiBVcGRhdGVXaW5kb3coaEJ1dHRvblswXSk7CiBMb2dDaGlsZE9yZGVyKGhNYWluV25kKTsKIExvZ2YoImJ1dDEgdmlzaWJsZT0lZCIsSXNXaW5kb3dWaXNpYmxlKGhCdXR0b25bMF0pKTsKCi8qIG5vdyByZXBhcmVudCB0aGUgYnV0dG9uIHRvIG91ciAoaW52aXNpYmxlKSBzdWJ3aW5kb3cgKi8KIFN0YXRlPVNUQVRFX1RFU1Q7CiAvKiBpbiBkaWZmZXJlbnQgb3JkZXIsIHNlZWluZyB3aG8gZ2V0cyB0b3Btb3N0ICovCiBTZXRQYXJlbnQoaEJ1dHRvblswXSxoU3ViV25kKTsKIFNldFBhcmVudChoQnV0dG9uWzJdLGhTdWJXbmQpOwogU2V0UGFyZW50KGhCdXR0b25bMV0saFN1YlduZCk7CiBMb2dDaGlsZE9yZGVyKGhTdWJXbmQpOwovKiB0aGUgYnV0dG9uIHNob3VsZCBub3cgYmUgaW52aXNpYmxlICovCiBMb2dmKCJidXQxIHZpc2libGU9JWQiLElzV2luZG93VmlzaWJsZShoQnV0dG9uWzBdKSk7Ci8qIHNlZSBpZiB3ZSBjYW4gZHJhdyBvbiB0aGVtICovCiBGaWxsUGF0dGVybihoQnV0dG9uWzBdLDApOwoKI2lmZGVmIFNIT1dfU1VCCiBTdGF0ZT1TVEFURV9TSE9XOwogU2hvd1dpbmRvdyhoU3ViV25kLFNXX1NIT1dOT1JNQUwpOwogU3RhdGU9U1RBVEVfVVBEQVRFOwogVXBkYXRlV2luZG93KGhTdWJXbmQpOwogRmlsbFBhdHRlcm4oaFN1YlduZCwwKTsKLy8gSW52YWxpZGF0ZVJlY3QoaE1haW5XbmQsTlVMTCxUUlVFKTsKIExvZ2YoImJ1dDEgdmlzaWJsZT0lZCIsSXNXaW5kb3dWaXNpYmxlKGhCdXR0b25bMF0pKTsKI2VuZGlmCgojaWZkZWYgVEVTVF9ESUFMT0cKIFN0YXRlPVNUQVRFX0RJQUxPRzsKIERpYWxvZ0JveChoSW5zdCxNQUtFSU5UUkVTT1VSQ0UoMSksaE1haW5XbmQsKEZBUlBST0MpVGVzdERpYWxvZ1Byb2MpOwojZW5kaWYKI2lmZGVmIFRFU1RfQ09NTUNUTAogewogIERXT1JEIGFyclsxNl07CiAgQ0hPT1NFQ09MT1IgY2M9e3NpemVvZihjYyksMCxoSW5zdCwwLGFyciwwfTsKICBDaG9vc2VDb2xvcigmY2MpOwogfQojZW5kaWYKCiBTdGF0ZT1TVEFURV9ESVJFQ1Q7CiB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLDAsMCwwKSkgewogIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CiAgU3RhdGU9U1RBVEVfRElTUEFUQ0g7CiAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwogIFN0YXRlPVNUQVRFX0RJUkVDVDsKIH0KIHJldHVybiAwOwp9CgoK