LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgVE9QIE1PRFVMRSBPRiBTUEFTUyAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICRNb2R1bGU6ICAgVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8gCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxICAgICAgKiAqLwovKiAqICBNUEkgZnVlciBJbmZvcm1hdGlrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICAgKiAqLwovKiAqICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VICAgICAgICAqICovCi8qICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlICAgICAgICogKi8KLyogKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgKiAqLwovKiAqICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCAgKiAqLwovKiAqICBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuICAgICAqICovCi8qICogIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTICAgICogKi8KLyogKiAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgKiAqLwovKiAqICBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgICAgKiAqLwovKiAqICBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAqICovCi8qICogIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSAgICAgICogKi8KLyogKiAgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFJldmlzaW9uJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFN0YXRlJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAkRGF0ZSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJEF1dGhvciQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBDb250YWN0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIENocmlzdG9waCBXZWlkZW5iYWNoICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgTVBJIGZ1ZXIgSW5mb3JtYXRpayAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBTdHVobHNhdHplbmhhdXN3ZWcgODUgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIDY2MTIzIFNhYXJicnVlY2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgRW1haWw6IHdlaWRlbmJAbXBpLXNiLm1wZy5kZSAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBHZXJtYW55ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCi8qICRSQ1NmaWxlJCAqLwoKLyoqKiBNQUlOIExPT1AgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImRmZy5oIgojaW5jbHVkZSAiZGVmcy5oIgojaW5jbHVkZSAiaWEuaCIKI2luY2x1ZGUgInJ1bGVzLWluZi5oIgojaW5jbHVkZSAicnVsZXMtc29ydC5oIgojaW5jbHVkZSAicnVsZXMtc3BsaXQuaCIKI2luY2x1ZGUgInRlcm1pbmF0b3IuaCIKI2luY2x1ZGUgInJ1bGVzLXJlZC5oIgojaW5jbHVkZSAiYW5hbHl6ZS5oIgojaW5jbHVkZSAiY2xvY2suaCIKI2luY2x1ZGUgInN0cmluZ3N4LmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJjb250ZXh0LmgiCiNpbmNsdWRlICJjbmYuaCIKI2luY2x1ZGUgInNlYXJjaC5oIgojaW5jbHVkZSAiaGFzaGFycmF5LmgiCiNpbmNsdWRlICJjbG9zdXJlLmgiCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgoKc3RhdGljIGNvbnN0IGNoYXIgKm15YmFzZW5hbWUoY29uc3QgY2hhciAqc3RyKSB7CiAgY29uc3QgY2hhciAqYmFzZSA9IHN0cnJjaHIoc3RyLCAnLycpOwogIHJldHVybiBiYXNlID8gYmFzZSsxIDogc3RyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFR5cGVzIGFuZCBWYXJpYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGNvbnN0IGNoYXIgKnRvcF9JbnB1dEZpbGU7CgpzdGF0aWMgT1BUSUQgdG9wX1JlbW92ZUZpbGVPcHRJZDsKCnR5cGVkZWYgZW51bSB7dG9wX1BST09GLCB0b3BfQ09NUExFVElPTiwgdG9wX1JFU09VUkNFfSB0b3BfU0VBUkNIUkVTVUxUOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogQ2F0Y2ggU2lnbmFscyBTZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgKGRlZmluZWQoU1BBU1NfU0lHTkFMUykpCiNpbmNsdWRlIDxzaWduYWwuaD4KCnN0YXRpYyBQUk9PRlNFQVJDSCAqdG9wX1BST09GU0VBUkNIOwoKc3RhdGljIHZvaWQgdG9wX1NpZ0hhbmRsZXIoaW50IFNpZ25hbCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgCiAgUkVUVVJOUzogCiAgRUZGRUNUOiAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIGlmIChTaWduYWwgPT0gU0lHU0VHViB8fCBTaWduYWwgPT0gU0lHQlVTKSB7CiAgICBwdXRzKCJcblxuXHRTUEFTUyBpcyBnb2luZyB0byBjcmFzaC4gVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgYSIpOwogICAgcHV0cygiXHRidWcgaW4gU1BBU1MuICBQbGVhc2Ugc2VuZCBhIGNvcHkgb2YgdGhlIGlucHV0IGZpbGUocykgdG9nZXRoZXIiKTsKICAgIHB1dHMoIlx0d2l0aCB0aGUgdXNlZCBvcHRpb25zIHRvIHdlaWRlbmJAbXBpLXNiLm1wZy5kZSwgYW5kIHNvbWVvbmUgd2lsbCIpOwogICAgcHV0cygiXHR0cnkgdG8gZml4IHRoZSBwcm9ibGVtLlxuIik7CiAgICBhYm9ydCgpOwogIH0KCiAgaWYgKFNpZ25hbCA9PSBTSUdJTlQgfHwgU2lnbmFsID09IFNJR1RFUk0pIHsKICAgIGNsb2NrX1N0b3BQYXNzZWRUaW1lKGNsb2NrX09WRVJBTEwpOwogICAgcHJpbnRmKCJcblNQQVNTICVzICIsIG1pc2NfVkVSU0lPTik7CiAgICBwdXRzKCJcblNQQVNTIGJlaXNlaXRlOiBSYW4gb3V0IG9mIHRpbWUuIFNQQVNTIHdhcyBraWxsZWQuIik7CiAgICBwcmludGYoIlByb2JsZW06ICVzICIsIAoJICAgKHRvcF9JbnB1dEZpbGUgIT0gKGNoYXIqKU5VTEwgPyBteWJhc2VuYW1lKHRvcF9JbnB1dEZpbGUpIDogIlJlYWQgZnJvbSBzdGRpbi4iKSk7CiAgICBwcmludGYoIlxuU1BBU1MgZGVyaXZlZCAlZCBjbGF1c2VzLCBiYWNrdHJhY2tlZCAlZCBjbGF1c2VzICIKCSAgICJhbmQga2VwdCAlZCBjbGF1c2VzLiIsCgkgICAoKnRvcF9QUk9PRlNFQVJDSCA9PSAoUFJPT0ZTRUFSQ0gpTlVMTCA/IDAgOiBwcmZzX0Rlcml2ZWRDbGF1c2VzKCp0b3BfUFJPT0ZTRUFSQ0gpKSwKCSAgICgqdG9wX1BST09GU0VBUkNIID09IChQUk9PRlNFQVJDSClOVUxMID8gMCA6IHByZnNfQmFja3RyYWNrZWRDbGF1c2VzKCp0b3BfUFJPT0ZTRUFSQ0gpKSwKCSAgICgqdG9wX1BST09GU0VBUkNIID09IChQUk9PRlNFQVJDSClOVUxMID8gMCA6IHByZnNfS2VwdENsYXVzZXMoKnRvcF9QUk9PRlNFQVJDSCkpKTsKICAgIGZwdXRzKCJcblNQQVNTIHNwZW50XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX09WRVJBTEwpOwogICAgZnB1dHMoIiBvbiB0aGUgcHJvYmxlbS5cblx0XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0lOUFVUKTsKICAgIGZwdXRzKCIgZm9yIHRoZSBpbnB1dC5cblx0XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0NORik7CiAgICBmcHV0cygiIGZvciB0aGUgRkxPVFRFUiBDTkYgdHJhbnNsYXRpb24uXG5cdFx0Iiwgc3Rkb3V0KTsKICAgIGNsb2NrX1ByaW50VGltZShjbG9ja19JTkZFUkVOQ0UpOwogICAgZnB1dHMoIiBmb3IgaW5mZXJlbmNlcy5cblx0XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0JBQ0tUUkFDSyk7CiAgICBmcHV0cygiIGZvciB0aGUgYmFja3RyYWNraW5nLlxuXHRcdCIsIHN0ZG91dCk7CiAgICBjbG9ja19QcmludFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICAgIHB1dHMoIiBmb3IgdGhlIHJlZHVjdGlvbi4iKTsKICB9CgogIGlmIChvcHRzX0lzU2V0KHRvcF9SZW1vdmVGaWxlT3B0SWQpKQogICAgcmVtb3ZlKHRvcF9JbnB1dEZpbGUpOwoKICBleGl0KEVYSVRfRkFJTFVSRSk7Cn0KCiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogQ2xhdXNlIFNlbGVjdGlvbiBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgQ0xBVVNFIHRvcF9TZWxlY3RDbGF1c2VEZXB0aChMSVNUIExpc3QsIEZMQUdTVE9SRSBGbGFncykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIGNsYXVzZXMgYW5kIGEgZmxhZyBzdG9yZS4KICBSRVRVUk5TOiBBIGNsYXVzZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGNsYXVzZSBmcm9tIHRoZSBsaXN0IGFjY29yZGluZwogICAgICAgICAgIHRvIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CgkgICAxLiBtaW5pbWFsIGRlcHRoCiAgICAgICAgICAgMi4gbWluaW1hbCB3ZWlnaHQKCSAgIDNhLiBtYXhpbWFsIG51bWJlciBvZiB2YXJpYWJsZSBvY2N1cnJlbmNlcywgaWYgdGhlIGZsYWcKCSAgICAgICAnUHJlZlZhcicgaXMgVFJVRQoJICAgM2IuIG1pbmltYWwgbnVtYmVyIG9mIHZhcmlhYmxlIG9jY3VycmVuY2VzLCBpZiAnUHJlZlZhcicKCSAgICAgICBpcyBGQUxTRQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBDTEFVU0UgUmVzdWx0OwogIE5BVCAgICBWYXJzLE5ld1ZhcnMsV2VpZ2h0LERlcHRoLE5ld0RlcHRoOwoKICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwogIERlcHRoICA9IGNsYXVzZV9EZXB0aChSZXN1bHQpOwogIFdlaWdodCA9IGNsYXVzZV9XZWlnaHQoUmVzdWx0KTsKICBWYXJzICAgPSBjbGF1c2VfTnVtYmVyT2ZWYXJPY2NzKFJlc3VsdCk7CiAgTGlzdCAgID0gbGlzdF9DZHIoTGlzdCk7CgogIHdoaWxlICghbGlzdF9FbXB0eShMaXN0KSkgewogICAgTmV3RGVwdGggPSAgY2xhdXNlX0RlcHRoKGxpc3RfQ2FyKExpc3QpKTsKICAgIGlmIChOZXdEZXB0aCA8PSBEZXB0aCkgewogICAgICBpZiAoTmV3RGVwdGggPCBEZXB0aCB8fCBjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKExpc3QpKSA8IFdlaWdodCkgewoJRGVwdGggID0gTmV3RGVwdGg7CglSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChSZXN1bHQpOwoJVmFycyAgID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhsaXN0X0NhcihMaXN0KSk7CiAgICAgIH0KICAgICAgZWxzZQoJaWYgKGNsYXVzZV9XZWlnaHQobGlzdF9DYXIoTGlzdCkpID09IFdlaWdodCkgewoJICBOZXdWYXJzID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhsaXN0X0NhcihMaXN0KSk7CgkgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QUkVGVkFSKSkgewoJICAgIGlmIChWYXJzIDwgTmV3VmFycykgewoJICAgICAgRGVwdGggID0gTmV3RGVwdGg7CgkgICAgICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICAgICAgV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChSZXN1bHQpOwoJICAgICAgVmFycyAgID0gTmV3VmFyczsKCSAgICB9CgkgIH0KCSAgZWxzZQoJICAgIGlmIChWYXJzID4gTmV3VmFycykgewoJICAgICAgRGVwdGggID0gTmV3RGVwdGg7CgkgICAgICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICAgICAgV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChSZXN1bHQpOwoJICAgICAgVmFycyAgID0gTmV3VmFyczsKCSAgICB9Cgl9CiAgICB9CiAgICBMaXN0ID0gbGlzdF9DZHIoTGlzdCk7CiAgfQoKICByZXR1cm4gUmVzdWx0Owp9CgoKc3RhdGljIENMQVVTRSB0b3BfU2VsZWN0TWluaW1hbFdlaWdodENsYXVzZShMSVNUIExpc3QsIEZMQUdTVE9SRSBGbGFncykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIGNsYXVzZXMgYW5kIGEgZmxhZyBzdG9yZS4KICBSRVRVUk5TOiBBIGNsYXVzZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGNsYXVzZSB3aXRoIG1pbmltYWwgd2VpZ2h0LgogICAgICAgICAgIElmIG1vcmUgdGhhbiBvbmUgY2xhdXNlIGhhcyBtaW5pbWFsIHdlaWdodCBhbmQgdGhlIGZsYWcKCSAgICdQcmVmVmFyJyBpcyBUUlVFLCBhIGNsYXVzZSB3aXRoIG1heGltYWwgbnVtYmVyIG9mIHZhcmlhYmxlCgkgICBvY2N1cnJlbmNlcyBpcyBzZWxlY3RlZC4gSWYgJ1ByZWZWYXInIGlzIEZBTFNFLCBhIGNsYXVzZSB3aXRoCgkgICBtaW5pbWFsIG51bWJlciBvZiB2YXJpYWJsZSBvY2N1cnJlbmNlcyBpcyBzZWxlY3RlZC4KCSAgIElmIHR3byBjbGF1c2VzIGFyZSBlcXVhbCB3aXRoIHJlc3BlY3QgdG8gdGhlIHR3byBjcml0ZXJpYQoJICAgdGhlIGNsYXVzZSB3aXRoIHRoZSBzbWFsbGVyIGxpc3QgcG9zaXRpb24gaXMgc2VsZWN0ZWQuCiAgQ0FVVElPTjogVEhFIExJU1QgSEFTIFRPIEJZIFNPUlRFRCBCWSBXRUlHSFQgSU4gQVNDRU5ESU5HIE9SREVSIQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBDTEFVU0UgUmVzdWx0OwogIE5BVCAgICBWYXJzLCBOZXdWYXJzLCBXZWlnaHQ7CgojaWZkZWYgQ0hFQ0sKICAvKiBDaGVjayBpbnZhcmlhbnQ6IExpc3QgaGFzIHRvIGJlIHNvcnRlZCBieSB3ZWlnaHQgKGFzY2VuZGluZykgKi8KICBMSVNUIFNjYW47CiAgV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChsaXN0X0NhcihMaXN0KSk7CiAgZm9yIChTY2FuID0gbGlzdF9DZHIoTGlzdCk7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpIHsKICAgIE5BVCBOZXdXZWlnaHQ7CiAgICBOZXdXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKFNjYW4pKTsKICAgIGlmIChOZXdXZWlnaHQgPCBXZWlnaHQpIHsKICAgICAgbWlzY19TdGFydEVycm9yUmVwb3J0KCk7CiAgICAgIG1pc2NfRXJyb3JSZXBvcnQoIlxuIEluIHRvcF9TZWxlY3RNaW5pbWFsQ29uV2VpZ2h0Q2xhdXNlOiBjbGF1c2UgbGlzdCAiKTsKICAgICAgbWlzY19FcnJvclJlcG9ydCgiaXNuJ3Qgc29ydGVkIGJ5IHdlaWdodCIpOwogICAgICBtaXNjX0ZpbmlzaEVycm9yUmVwb3J0KCk7CiAgICB9CiAgICBXZWlnaHQgPSBOZXdXZWlnaHQ7CiAgfQojZW5kaWYKCiAgUmVzdWx0ID0gKENMQVVTRSlsaXN0X0NhcihMaXN0KTsKICBXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgVmFycyAgID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhSZXN1bHQpOwogIExpc3QgICA9IGxpc3RfQ2RyKExpc3QpOwoKICB3aGlsZSAoIWxpc3RfRW1wdHkoTGlzdCkpIHsKICAgIGlmIChjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKExpc3QpKSA9PSBXZWlnaHQpIHsKICAgICAgTmV3VmFycyA9IGNsYXVzZV9OdW1iZXJPZlZhck9jY3MobGlzdF9DYXIoTGlzdCkpOwogICAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFJFRlZBUikpIHsKCWlmIChWYXJzIDwgTmV3VmFycykgewoJICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICBXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CgkgIFZhcnMgICA9IE5ld1ZhcnM7Cgl9CiAgICAgIH0KICAgICAgZWxzZQoJaWYgKFZhcnMgPiBOZXdWYXJzKSB7CgkgIFJlc3VsdCA9IChDTEFVU0UpbGlzdF9DYXIoTGlzdCk7CgkgIFdlaWdodCA9IGNsYXVzZV9XZWlnaHQoUmVzdWx0KTsKCSAgVmFycyAgID0gTmV3VmFyczsKCX0KICAgIH0KICAgIGVsc2UKICAgICAgcmV0dXJuIFJlc3VsdDsKICAgIExpc3QgPSBsaXN0X0NkcihMaXN0KTsKICB9CiAgcmV0dXJuIFJlc3VsdDsKfQoKCnN0YXRpYyBDTEFVU0UgdG9wX1NlbGVjdE1pbmltYWxDb25XZWlnaHRDbGF1c2UoTElTVCBMaXN0LCBGTEFHU1RPUkUgRmxhZ3MpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgbm9uLWVtcHR5IGxpc3Qgb2YgY2xhdXNlcyBhbmQgYSBmbGFnIHN0b3JlLgogIFJFVFVSTlM6IEEgY2xhdXNlIHNlbGVjdGVkIGZyb20gdGhlIGxpc3QuCiAgRUZGRUNUOiAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgY2xhdXNlIGZyb20gdGhlIGxpc3QgaW4gYQogICAgICAgICAgIHNpbWlsYXIgd2F5IGFzIHRoZSBmdW5jdGlvbiB0b3BfU2VsZWN0TWluaW1hbFdlaWdodENsYXVzZS4KCSAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBjb25qZWN0dXJlIGNsYXVzZXMgYXJlCgkgICBwcmVmZXJyZWQgb3ZlciBheGlvbSBjbGF1c2VzLCBiZWNhdXNlIHRoZWlyIHdlaWdodAoJICAgaXMgZGl2aWRlZCBieSBhIGZhY3RvciBnaXZlbiBieSB0aGUgZmxhZyAnUHJlZkNvbicuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIENMQVVTRSBSZXN1bHQ7CiAgTkFUICAgIE5ld1dlaWdodCxXZWlnaHQsIE5ld1ZhcnMsIFZhcnMsIEZhY3RvcjsKCiAgUmVzdWx0ID0gKENMQVVTRSlsaXN0X0NhcihMaXN0KTsKICBGYWN0b3IgPSBmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QUkVGQ09OKTsKICBXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgaWYgKGNsYXVzZV9HZXRGbGFnKFJlc3VsdCwgQ09OQ0xBVVNFKSkKICAgIFdlaWdodCA9IFdlaWdodCAvIEZhY3RvcjsKICBWYXJzICAgPSBjbGF1c2VfTnVtYmVyT2ZWYXJPY2NzKGxpc3RfQ2FyKExpc3QpKTsKICBMaXN0ICAgPSBsaXN0X0NkcihMaXN0KTsKCiAgd2hpbGUgKCFsaXN0X0VtcHR5KExpc3QpKSB7CiAgICBOZXdXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKExpc3QpKTsKICAgIGlmIChjbGF1c2VfR2V0RmxhZyhsaXN0X0NhcihMaXN0KSxDT05DTEFVU0UpKQogICAgICBOZXdXZWlnaHQgPSBOZXdXZWlnaHQgLyBGYWN0b3I7CiAgICBpZiAoTmV3V2VpZ2h0IDwgV2VpZ2h0KSB7CiAgICAgIFdlaWdodCA9IE5ld1dlaWdodDsKICAgICAgUmVzdWx0ID0gbGlzdF9DYXIoTGlzdCk7CiAgICAgIFZhcnMgICA9IGNsYXVzZV9OdW1iZXJPZlZhck9jY3MobGlzdF9DYXIoTGlzdCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgIGlmIChOZXdXZWlnaHQgPT0gV2VpZ2h0KSB7CglOZXdWYXJzID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhsaXN0X0NhcihMaXN0KSk7CglpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFJFRlZBUikpIHsKCSAgaWYgKFZhcnMgPCBOZXdWYXJzKSB7CgkgICAgUmVzdWx0ID0gKENMQVVTRSlsaXN0X0NhcihMaXN0KTsKCSAgICBXZWlnaHQgPSBOZXdXZWlnaHQ7CgkgICAgVmFycyAgID0gTmV3VmFyczsKCSAgfQoJfQoJZWxzZQoJICBpZiAoVmFycyA+IE5ld1ZhcnMpIHsKCSAgICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICAgIFdlaWdodCA9IE5ld1dlaWdodDsKCSAgICBWYXJzICAgPSBOZXdWYXJzOwoJICB9CiAgICAgIH0KICAgIH0KCiAgICBMaXN0ID0gbGlzdF9DZHIoTGlzdCk7CiAgfQogIHJldHVybiBSZXN1bHQ7Cn0KCgovKnN0YXRpYyBDTEFVU0UgdG9wX1NlbGVjdENsYXVzZURlcHRoKExJU1QgTGlzdCkqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIGxpc3Qgb2YgY2xhdXNlcy4KICBSRVRVUk5TOiBBIGNsYXVzZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LgogIEVGRkVDVDogIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qewogIENMQVVTRSBSZXN1bHQ7CiAgaW50ICAgIE1pbiwgRGVwdGg7CgogIFJlc3VsdCA9IChDTEFVU0UpbGlzdF9DYXIoTGlzdCk7CiAgRGVwdGggID0gY2xhdXNlX0RlcHRoKFJlc3VsdCk7CiAgTWluICAgID0gRGVwdGggKiBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgTGlzdCAgID0gbGlzdF9DZHIoTGlzdCk7CgogIGlmIChEZXB0aCA9PSAwKQogICAgcmV0dXJuIFJlc3VsdDsKCiAgd2hpbGUgKCFsaXN0X0VtcHR5KExpc3QpKSB7CiAgICBEZXB0aCA9ICBjbGF1c2VfRGVwdGgobGlzdF9DYXIoTGlzdCkpOwogICAgaWYgKE1pbiA+IERlcHRoICogY2xhdXNlX1dlaWdodChsaXN0X0NhcihMaXN0KSkpIHsKICAgICAgUmVzdWx0ID0gbGlzdF9DYXIoTGlzdCk7CiAgICAgIGlmIChEZXB0aCA9PSAwKQoJcmV0dXJuIFJlc3VsdDsKICAgICAgTWluICAgID0gY2xhdXNlX0RlcHRoKFJlc3VsdCkgKiBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgICB9CiAgICBMaXN0ID0gbGlzdF9DZHIoTGlzdCk7CiAgfQoKICByZXR1cm4gUmVzdWx0Owp9Ki8KCgpzdGF0aWMgTElTVCB0b3BfR2V0TGl0ZXJhbHNGb3JTcGxpdHRpbmcoQ0xBVVNFIENsYXVzZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBjbGF1c2UuCiAgUkVUVVJOUzogQSBsaXN0IG9mIHN1Y2NlZGVudCBsaXRlcmFsIGluZGljZXMgd2hlcmUgZXZlcnkgc2luZ2xlCiAgICAgICAgICAgbGl0ZXJhbCBkb2Vzbid0IHNoYXJlIGFueSB2YXJpYWJsZXMgd2l0aCBvdGhlciBsaXRlcmFscy4KCSAgIElmIHRoZSBjbGF1c2UgaXMgaG9ybiwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCogVmFyaWFibGVzOyAgLyogQW4gYXJyYXksIG1hcHBpbmcgbGl0ZXJhbCBpbmRleCB0byBsaXN0IG9mIHZhcmlhYmxlcyAqLwogIGludCAgIGksIGo7CiAgQk9PTCAgU3RvcDsKICBMSVNUICBGYWlsZWQsIFJlc3VsdDsKCiAgUmVzdWx0ID0gbGlzdF9OaWwoKTsKCiAgLyogU3BlY2lhbCBjYXNlOiBob3JuIGNsYXVzZSAqLwogIGlmIChjbGF1c2VfSXNIb3JuQ2xhdXNlKENsYXVzZSkpCiAgICByZXR1cm4gUmVzdWx0OwoKICAvKiBTcGVjaWFsIGNhc2U6IGNsYXVzZSBpcyBncm91bmQsIHNvIHJldHVybiBhbGwgc3VjY2VkZW50IGxpdGVyYWxzICovCiAgaWYgKGNsYXVzZV9Jc0dyb3VuZChDbGF1c2UpKSB7CiAgICBmb3IgKGkgPSBjbGF1c2VfTGFzdFN1Y2NlZGVudExpdEluZGV4KENsYXVzZSk7CgkgaSA+PSBjbGF1c2VfRmlyc3RTdWNjZWRlbnRMaXRJbmRleChDbGF1c2UpOyBpLS0pCiAgICAgIFJlc3VsdCA9IGxpc3RfQ29ucygoUE9JTlRFUilpLCBSZXN1bHQpOwogICAgcmV0dXJuIFJlc3VsdDsKICB9CgogIFZhcmlhYmxlcyA9IG1lbW9yeV9NYWxsb2Moc2l6ZW9mKExJU1QpICogY2xhdXNlX0xlbmd0aChDbGF1c2UpKTsKICAvKiBJbml0aWFsaXplIHRoZSBhcnJheSAqLwogIGZvciAoaSA9IGNsYXVzZV9GaXJzdExpdEluZGV4KCk7IGkgPD0gY2xhdXNlX0xhc3RMaXRJbmRleChDbGF1c2UpOyBpKyspCiAgICBWYXJpYWJsZXNbaV0gPSB0ZXJtX1ZhcmlhYmxlU3ltYm9scyhjbGF1c2VfR2V0TGl0ZXJhbEF0b20oQ2xhdXNlLCBpKSk7CgogIC8qIDxGYWlsZWQ+IGlzIHRoZSBzZXQgb2YgbGl0ZXJhbHMgdGhhdCBzaGFyZSB2YXJpYWJsZXMgd2l0aCBvdGhlciBsaXRlcmFscyAqLwogIEZhaWxlZCA9IGxpc3RfTmlsKCk7CiAgZm9yIChpID0gY2xhdXNlX0xhc3RTdWNjZWRlbnRMaXRJbmRleChDbGF1c2UpOwogICAgICAgaSA+PSBjbGF1c2VfRmlyc3RTdWNjZWRlbnRMaXRJbmRleChDbGF1c2UpOyBpLS0pIHsKICAgIGlmIChsaXN0X0VtcHR5KFZhcmlhYmxlc1tpXSkpCiAgICAgIFJlc3VsdCA9IGxpc3RfQ29ucygoUE9JTlRFUilpLCBSZXN1bHQpOwogICAgZWxzZSBpZiAoIWxpc3RfUG9pbnRlck1lbWJlcihGYWlsZWQsIChQT0lOVEVSKWkpKSB7CiAgICAgIC8qIFdlIGRvbid0IGtub3cgeWV0IHdoZXRoZXIgdGhlIGxpdGVyYWwgc2hhcmVzIHZhcmlhYmxlcyAqLwogICAgICBTdG9wID0gRkFMU0U7CiAgICAgIGZvciAoaiA9IGNsYXVzZV9GaXJzdExpdEluZGV4KCk7CgkgICBqIDw9IGNsYXVzZV9MYXN0TGl0SW5kZXgoQ2xhdXNlKSAmJiAhU3RvcDsgaisrKSB7CglpZiAoaSAhPSBqICYmIGxpc3RfSGFzSW50ZXJzZWN0aW9uKFZhcmlhYmxlc1tpXSwgVmFyaWFibGVzW2pdKSkgewoJICBTdG9wICAgPSBUUlVFOyAgLyogTGl0ZXJhbCBpc260dCBjYW5kaWRhdGUgZm9yICJvcHRpbWFsIiBzcGxpdHRpbmcgKi8KCSAgRmFpbGVkID0gbGlzdF9Db25zKChQT0lOVEVSKWksIEZhaWxlZCk7CgkgIEZhaWxlZCA9IGxpc3RfQ29ucygoUE9JTlRFUilqLCBGYWlsZWQpOwoJfQogICAgICB9CiAgICAgIGlmICghU3RvcCkKCVJlc3VsdCA9IGxpc3RfQ29ucygoUE9JTlRFUilpLCBSZXN1bHQpOwogICAgfQogIH0KICAKICAvKiBDbGVhbnVwICovCiAgZm9yIChpID0gY2xhdXNlX0ZpcnN0TGl0SW5kZXgoKTsgaSA8PSBjbGF1c2VfTGFzdExpdEluZGV4KENsYXVzZSk7IGkrKykKICAgIGxpc3RfRGVsZXRlKFZhcmlhYmxlc1tpXSk7CiAgbWVtb3J5X0ZyZWUoVmFyaWFibGVzLCBzaXplb2YoTElTVCkgKiBjbGF1c2VfTGVuZ3RoKENsYXVzZSkpOwogIGxpc3RfRGVsZXRlKEZhaWxlZCk7CiAgcmV0dXJuIFJlc3VsdDsKfQoKCnN0YXRpYyBpbnQgdG9wX0dldE9wdGltYWxTcGxpdExpdGVyYWxJbmRleChQUk9PRlNFQVJDSCBTZWFyY2gsIENMQVVTRSBDbGF1c2UsCgkJCQkJICAgQk9PTCBVc2FibGVzKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mc2VhcmNoIG9iamVjdCwgYSBjbGF1c2UgYW5kIGEgYm9vbGVhbiBmbGFnLgogIFJFVFVSTlM6IFRoZSBpbmRleCBvZiB0aGUgcG9zaXRpdmUgbGl0ZXJhbCBmcm9tIDxDbGF1c2U+CiAgICAgICAgICAgd2l0aCB0aGUgZ3JlYXRlc3QgbnVtYmVyIG9mIGluc3RhbmNlcyAobWF5YmUgMCkgd2l0aGluCgkgICB0aGUgV29ya2VkT2ZmL1VzYWJsZSBzZXRzIG9mIHRoZSBwcm9vZiBzZWFyY2ggb2JqZWN0LgoJICAgVGhlIGxpdGVyYWwgbXVzdG4ndCBzaGFyZSBhbnkgdmFyaWFibGVzIHdpdGggb3RoZXIgbGl0ZXJhbHMuCgkgICBJZiB0aGUgY2xhdXNlIGRvZXNuJ3QgaGF2ZSBhIHN1aXRhYmxlIGxpdGVyYWwsIGEgbmVnYXRpdmUKCSAgIG51bWJlciBpcyByZXR1cm5lZC4KICBFRkZFQ1Q6ICBJZiA8VXNhYmxlcz4gaXMgRkFMU0UsIG9ubHkgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMKCSAgIHdpdGhpbiB0aGUgV29ya2VkT2ZmIHNldCBpcyBjb25zaWRlcmVkLCBvdGhlcndpc2UKCSAgIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHdpdGhpbiBib3RoIGNsYXVzZSBzZXRzIGlzIGNvbnNpZGVyZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgICAgU3BsaXRMaXRzOwogIExJVEVSQUwgTGl0ZXJhbDsKICBOQVQgICAgIENvdW50LCBNYXhJbnN0YW5jZXM7CiAgaW50ICAgICBSZXN1bHQ7CgogIE1heEluc3RhbmNlcyA9IC0xOwogIFNwbGl0TGl0cyAgICA9IHRvcF9HZXRMaXRlcmFsc0ZvclNwbGl0dGluZyhDbGF1c2UpOwogIFJlc3VsdCAgICAgICA9IC0xOwoKICBmb3IgKCA7ICFsaXN0X0VtcHR5KFNwbGl0TGl0cyk7IFNwbGl0TGl0cyA9IGxpc3RfUG9wKFNwbGl0TGl0cykpIHsKICAgIExpdGVyYWwgPSBjbGF1c2VfR2V0TGl0ZXJhbChDbGF1c2UsIChpbnQpbGlzdF9DYXIoU3BsaXRMaXRzKSk7CiAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGluc3RhbmNlcyAqLwogICAgQ291bnQgPSBwcmZzX0dldE51bWJlck9mSW5zdGFuY2VzKFNlYXJjaCwgTGl0ZXJhbCwgVXNhYmxlcyk7CiAgICBpZiAoQ291bnQgPiBNYXhJbnN0YW5jZXMpIHsKICAgICAgUmVzdWx0ID0gKGludClsaXN0X0NhcihTcGxpdExpdHMpOwogICAgICBNYXhJbnN0YW5jZXMgPSBDb3VudDsKICAgIH0KICB9CiAgcmV0dXJuIFJlc3VsdDsKfQoKCi8qIEVLOiBoaWVyIGxhc3NlbiBvZGVyIG5hY2ggc2VhcmNoLmMgb2RlciBuYWNoIHJ1bGVzLXNwbGl0LmM/ICovCnN0YXRpYyBDTEFVU0UgdG9wX0dldFBvd2VyZnVsU3BsaXRDbGF1c2UoUFJPT0ZTRUFSQ0ggU2VhcmNoLCBCT09MIFVzYWJsZXMsCgkJCQkJIGludCogTGl0SW5kZXgpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgcHJvb2ZzZWFyY2ggb2JqZWN0LCBhIGJvb2xlYW4gZmxhZyBhbmQgYSBwb2ludGVyIHRvIGEgbGl0ZXJhbAogICAgICAgICAgIGluZGV4IHdoaWNoIGlzIHVzZWQgYXMgcmV0dXJuIHZhbHVlLgogIFJFVFVSTlM6IEEgY2xhdXNlIGZyb20gdGhlIHVzYWJsZSBzZXQgdGhhdCB3YXMgc2VsZWN0ZWQgYXMgZ2l2ZW4gY2xhdXNlLgogICAgICAgICAgIElmZiBubyBzdWl0YWJsZSBjbGF1c2Ugd2FzIGZvdW5kIE5VTEwgaXMgcmV0dXJuZWQgYW5kIDwqTGl0SW5kZXg+CgkgICBpcyBzZXQgdG8gLTEuCgkgICBJZmYgYSBzdWl0YWJsZSBjbGF1c2Ugd2FzIGZvdW5kLCB0aGlzIGNsYXVzZSBpcyByZXR1cm5lZCBhbmQKCSAgIDwqTGl0SW5kZXg+IGlzIHNldCB0byB0aGUgaW5kZXggb2YgdGhlICJvcHRpbWFsIiBsaXRlcmFsLgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGNsYXVzZSBmcm9tIHRoZSAidXNhYmxlIiBzZXQgYW5kCiAgICAgICAgICAgYSBsaXRlcmFsIHRoYXQgYXJlICJvcHRpbWFsIiBmb3IgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBzcGxpdHRpbmcKCSAgIHJ1bGUgd2l0aCByZXNwZWN0IHRvIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CiAgICAgICAgICAgMSkgdGhlIGxpdGVyYWwgbXVzdCBvY2N1ciBpbiB0aGUgc3VjY2VkZW50IG9mIHRoZSBub24taG9ybiBjbGF1c2UsCgkgICAyKSB0aGUgbGl0ZXJhbCBtdXN0bid0IHNoYXJlIGFueSB2YXJpYWJsZXMgd2l0aCBvdGhlciBsaXRlcmFscywKICAgICAgICAgICAzKSB0aGUgY2xhdXNlIG11c3QgaGF2ZSBhIHNvbHZlZCBjb25zdHJhaW50LAoJICAgNCkgdGhlIGF0b20gbXVzdCBoYXZlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMKICAgICAgICAgICAgICBhKSB3aXRoaW4gdGhlIHNldCBvZiAid29ya2Vkb2ZmIiBjbGF1c2VzLCBpZmYgPFVzYWJsZXM+PUZBTFNFCiAgICAgICAgICAgICAgYikgd2l0aGluIHRoZSBzZXQgb2YgInVzYWJsZSIgYW5kICJ3b3JrZWRvZmYiIGNsYXVzZXMsCiAgICAgICAgICAgICAgICAgaWZmICJVc2FibGVzIj1UUlVFCgkgICA1KSB0aGUgYXRvbSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGluc3RhbmNlIGluIGFub3RoZXIgY2xhdXNlLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUICAgU2NhbiwgU3BsaXRMaXRzOwogIE5BVCAgICBNYXhOck9mSW5zdGFuY2VzLCBOck9mSW5zdGFuY2VzOwogIENMQVVTRSBDbGF1c2UsIE9wdGltYWxDbGF1c2U7CiAgVEVSTSAgIEF0b207CiAgU0hBUkVEX0lOREVYIFdPSW5kZXgsIFVzSW5kZXg7CgogIE9wdGltYWxDbGF1c2UgICAgPSBOVUxMOwogICpMaXRJbmRleCAgICAgICAgPSAtMTsKICBNYXhOck9mSW5zdGFuY2VzID0gMDsKICBXT0luZGV4ICAgICAgICAgID0gcHJmc19Xb3JrZWRPZmZTaGFyaW5nSW5kZXgoU2VhcmNoKTsKICBVc0luZGV4ICAgICAgICAgID0gcHJmc19Vc2FibGVTaGFyaW5nSW5kZXgoU2VhcmNoKTsKCiAgLyogUHJlcGFyZSB0aGUgdGVybSBzdGFtcCAqLwogIGlmICh0ZXJtX1N0YW1wT3ZlcmZsb3coc2hhcmluZ19TdGFtcElEKFdPSW5kZXgpKSkKICAgIHNoYXJpbmdfUmVzZXRBbGxUZXJtU3RhbXBzKFdPSW5kZXgpOwogIGlmIChVc2FibGVzICYmIHRlcm1fU3RhbXBPdmVyZmxvdyhzaGFyaW5nX1N0YW1wSUQoVXNJbmRleCkpKQogICAgc2hhcmluZ19SZXNldEFsbFRlcm1TdGFtcHMoVXNJbmRleCk7CiAgdGVybV9TdGFydFN0YW1wKCk7CgogIGZvciAoU2NhbiA9IHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpOyAhbGlzdF9FbXB0eShTY2FuKTsKICAgICAgIFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgQ2xhdXNlID0gbGlzdF9DYXIoU2Nhbik7CiAgICBpZiAoY2xhdXNlX0hhc1NvbHZlZENvbnN0cmFpbnQoQ2xhdXNlKSAmJiAhY2xhdXNlX0lzSG9ybkNsYXVzZShDbGF1c2UpKSB7CiAgICAgIC8qIEdldCBhIGxpc3Qgb2Ygc3BsaXR0YWJsZSBsaXRlcmFsIGluZGljZXMgKi8KICAgICAgU3BsaXRMaXRzID0gdG9wX0dldExpdGVyYWxzRm9yU3BsaXR0aW5nKENsYXVzZSk7CiAgICAgIGZvciAoIDsgIWxpc3RfRW1wdHkoU3BsaXRMaXRzKTsgU3BsaXRMaXRzID0gbGlzdF9Qb3AoU3BsaXRMaXRzKSkgewoJTElURVJBTCBMaXRlcmFsOwoKCUxpdGVyYWwgPSBjbGF1c2VfR2V0TGl0ZXJhbChDbGF1c2UsIChpbnQpbGlzdF9DYXIoU3BsaXRMaXRzKSk7CglBdG9tICAgID0gY2xhdXNlX0xpdGVyYWxBdG9tKExpdGVyYWwpOwogCWlmICghdGVybV9BbHJlYWR5VmlzaXRlZChBdG9tKSkgewoJICAvKiBEb24ndCB2aXNpdCBhdG9tIG1vcmUgdGhhbiBvbmNlICovCiAJICB0ZXJtX1NldFRlcm1TdGFtcChBdG9tKTsKCSAgLyogQ291bnQgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgKi8KCSAgTnJPZkluc3RhbmNlcyA9IHByZnNfR2V0TnVtYmVyT2ZJbnN0YW5jZXMoU2VhcmNoLCBMaXRlcmFsLCBVc2FibGVzKTsKCSAgaWYgKE5yT2ZJbnN0YW5jZXMgPiBNYXhOck9mSW5zdGFuY2VzIHx8IE9wdGltYWxDbGF1c2UgPT0gTlVMTCB8fAoJICAgICAgKE5yT2ZJbnN0YW5jZXMgPT0gTWF4TnJPZkluc3RhbmNlcyAmJgoJICAgICAgIC8qIFByZWZlciBzaG9ydGVyIGNsYXVzZXMgZm9yIHNwbGl0dGluZyEgKi8KCSAgICAgICBjbGF1c2VfTGVuZ3RoKENsYXVzZSkgPCBjbGF1c2VfTGVuZ3RoKE9wdGltYWxDbGF1c2UpKSkgewoJICAgIE9wdGltYWxDbGF1c2UgICAgPSBDbGF1c2U7CgkgICAgTWF4TnJPZkluc3RhbmNlcyA9IE5yT2ZJbnN0YW5jZXM7CgkgICAgKkxpdEluZGV4ICAgICAgICA9IChpbnQpbGlzdF9DYXIoU3BsaXRMaXRzKTsKCSAgfQogCX0KICAgICAgfQogICAgfQogIH0KICB0ZXJtX1N0b3BTdGFtcCgpOwoKICAvKiBUaGUgc3BsaXR0YWJsZSBsaXRlcmFsIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaW5zdGFuY2UgdG8gYmUgdXNlZnVsICovCiAgLyogcmVkdWNpbmcgb3RoZXIgY2xhdXNlcy4gSWYgPFVzYWJsZXM+IGlzIFRSVUUsIHRoZSBsaXRlcmFsIG11c3QgZXZlbiAqLwogIC8qIGhhdmUgdHdvIGluc3RhbmNlcywgc2luY2UgdGhlIGxpdGVyYWwgb2YgdGhlIGdpdmVuIGNsYXVzZSBpcyBpbiB0aGUgKi8KICAvKiB1c2FibGUgaW5kZXgsIHRvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKE1heE5yT2ZJbnN0YW5jZXMgPT0gMCB8fCAoVXNhYmxlcyAmJiBNYXhOck9mSW5zdGFuY2VzID09IDEpKSB7CiAgICAqTGl0SW5kZXggICAgID0gLTE7CiAgICBPcHRpbWFsQ2xhdXNlID0gTlVMTDsKICB9CgogIHJldHVybiBPcHRpbWFsQ2xhdXNlOwp9CgoKc3RhdGljIExJU1QgdG9wX0Z1bGxSZWR1Y3Rpb25TZWxlY3RHaXZlbkNvbXB1dGVEZXJpdmFibGVzKFBST09GU0VBUkNIIFNlYXJjaCwKCQkJCQkJCSAgQ0xBVVNFICpTcGxpdENsYXVzZSwKCQkJCQkJCSAgaW50ICpDb3VudGVyKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mIHNlYXJjaCBvYmplY3QsIGEgcG9pbnRlciB0byBhIGNsYXVzZSByZXN1bHRpbmcgZnJvbSBhCiAgICAgICAgICAgcHJldmlvdXMgc3BsaXR0aW5nIHN0ZXAsIGFuZCBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb3VudGVyLgogIFJFVFVSTlM6IEEgbGlzdCBvZiBkZXJpdmVkIGNsYXVzZXMuCiAgRUZGRUNUOiAgSW4gdGhpcyBmdW5jdGlvbiBhIGNsYXVzZSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBzZXQgb2YKICAgICAgICAgICAidXNhYmxlIiBjbGF1c2VzLiBBZnRlciBhIGNsYXVzZSB3YXMgc2VsZWN0ZWQgYXMgImdpdmVuIGNsYXVzZSIsCgkgICBpbmZlcmVuY2VzIGJldHdlZW4gdGhlIGdpdmVuIGNsYXVzZSBhbmQgdGhlICJ3b3JrZWQgb2ZmIiBjbGF1c2VzCgkgICBhcmUgbWFkZS4gVGhlIHNlbGVjdGlvbiB3b3JrcyBhcyBmb2xsb3dzOgoJICAgMSkgSWYgPCpTcGxpdENsYXVzZT4gaXMgbm90IE5VTEwsIHRoZSBzcGxpdCBjbGF1c2UKCSAgICAgIGlzIHNlbGVjdGVkIGFzICJnaXZlbiBjbGF1c2UiLiA8KlNwbGl0Q2xhdXNlPiBzaG91bGQgcmVzdWx0CgkgICAgICBmcm9tIHNwbGl0dGluZwoJICAgMikgSWYgPCpTcGxpdENsYXVzZT4gaXMgTlVMTCwgd2UgdHJ5IHRvIGZpbmQgYSBjbGF1c2UgdGhhdCBpcwoJICAgICAgIm9wdGltYWwiIGZvciBzcGxpdHRpbmcuIFRoaXMgaXMgZG9uZSBieSBzZWxlY3RpbmcgYSBsaXRlcmFsCgkgICAgICA8TD4gaW4gYSBjbGF1c2UsIHN1Y2ggdGhhdCA8TD4gaXMgdmFyaWFibGUtZGlzam9pbnQgZnJvbQoJICAgICAgdGhlIHJlc3Qgb2YgdGhlIGNsYXVzZSwgYW5kIHRoZSBhdG9tIG9mIDxMPiBoYXMgdGhlIG1heGltdW0KCSAgICAgIG51bWJlciBvZiBpbnN0YW5jZXMgd2l0aGluIHRoZSBzZXQgb2YgInVzYWJsZSIgYW5kICJ3b3Jrb2ZmIgoJICAgICAgY2xhdXNlcy4KCSAgIDMpIElmIHRoZSBwcmV2aW91cyBzdGVwcyBmYWlsZWQsIGEgY2xhdXNlIGlzIHNlbGVjdGVkIGJ5IHdlaWdodAoJICAgICAgb3IgYnkgZGVwdGgsIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyAiV0RSYXRpbyIsICJQcmVmVmFyIgoJICAgICAgYW5kICJQcmVmQ29uIi4gVGhlbiBzcGxpdHRpbmcgaXMgdHJpZWQgb24gdGhlIHNlbGVjdGVkIGNsYXVzZS4KCSAgICAgIElmIHRoZSBjbGF1c2UgaXMgYSBub24taG9ybiBjbGF1c2UsIHdlIHRyeSB0byBmaW5kIGEgcG9zaXRpdmUKCSAgICAgIGxpdGVyYWwgPEw+IGFuZCBhIHNldCBvZiBuZWdhdGl2ZSBsaXRlcmFscyA8Tj4sIHN1Y2ggdGhhdCA8Tj4KCSAgICAgIGFuZCA8TD4gYXJlIHZhcmlhYmxlIGRpc2pvaW50IGZyb20gdGhlIHJlc3Qgb2YgdGhlIGNsYXVzZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgQ0xBVVNFICAgICBHaXZlbkNsYXVzZSwgVGVybWluYXRvckNsYXVzZTsKICBMSVNUICAgICAgIERlcml2YWJsZXMsIFNwbGl0TGl0czsKICBGTEFHU1RPUkUgIEZsYWdzOwogIFBSRUNFREVOQ0UgUHJlY2VkZW5jZTsKICBpbnQgICAgICAgIExpdEluZGV4OwoKICBHaXZlbkNsYXVzZSA9IE5VTEw7CiAgRGVyaXZhYmxlcyAgPSBsaXN0X05pbCgpOwogIEZsYWdzICAgICAgID0gcHJmc19TdG9yZShTZWFyY2gpOwogIFByZWNlZGVuY2UgID0gcHJmc19QcmVjZWRlbmNlKFNlYXJjaCk7CgogIC8qIDEpIElmIHRoZSBsYXN0IGdpdmVuIGNsYXVzZSB3YXMgc3BsaXQgb3IgaWYgYmFja3RyYWNraW5nIHdhcyBhcHBsaWVkLCAqLwogIC8qIHRoZW4gY2hvb3NlIHRoZSBjbGF1c2UgcmVzdWx0aW5nIGZyb20gdGhlIHNwbGl0dGluZyBzdGVwIGFzICAgICAgICAqLwogIC8qIGdpdmVuIGNsYXVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIEFUVEVOVElPTjogU2luY2UgdGhlIDxTcGxpdENsYXVzZT4gbWlnaHQgaGF2ZSBiZWVuIHJlZHVjZWQgc2luY2UgICAqLwogIC8qIHRoZSB0aW1lIHRoZSB2YXJpYWJsZSB3YXMgc2V0LCB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgICAgICAgICAgICAqLwogIC8qIDxTcGxpdENsYXVzZT4gaXMgc3RpbGwgZWxlbWVudCBvZiB0aGUgc2V0IG9mIHVzYWJsZSBjbGF1c2VzLiAgICAgICAqLwogIGlmICgqU3BsaXRDbGF1c2UgIT0gTlVMTCAmJgogICAgICBsaXN0X1BvaW50ZXJNZW1iZXIocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksICpTcGxpdENsYXVzZSkpCiAgICBHaXZlbkNsYXVzZSA9ICpTcGxpdENsYXVzZTsKICAKICAqU3BsaXRDbGF1c2UgPSBOVUxMOwoKICBpZiAoR2l2ZW5DbGF1c2UgPT0gTlVMTCkgewogICAgaWYgKHByZnNfU3BsaXRDb3VudGVyKFNlYXJjaCkgIT0gMCkKICAgICAgLyogMikgVHJ5IHRvIGZpbmQgYW4gIm9wdGltYWwiIHNwbGl0dGluZyBjbGF1c2UsIHRoYXQgZG9lc24ndCBzaGFyZSAqLwogICAgICAvKiAgICB2YXJpYWJsZXMgd2l0aCBhbnkgb3RoZXIgbGl0ZXJhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIEdpdmVuQ2xhdXNlID0gdG9wX0dldFBvd2VyZnVsU3BsaXRDbGF1c2UoU2VhcmNoLCBGQUxTRSwgJkxpdEluZGV4KTsKICAgICAgCiAgICBpZiAoR2l2ZW5DbGF1c2UgIT0gTlVMTCkgewogICAgICAvKiBGb3VuZCAib3B0aW1hbCIgc3BsaXQgY2xhdXNlLCBzbyBhcHBseSBzcGxpdHRpbmcgKi8KICAgICAgU3BsaXRMaXRzID0gbGlzdF9MaXN0KGNsYXVzZV9HZXRMaXRlcmFsKEdpdmVuQ2xhdXNlLCBMaXRJbmRleCkpOwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX0RvU3BsaXR0aW5nKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIFNwbGl0TGl0cyk7CiAgICAgIGxpc3RfRGVsZXRlKFNwbGl0TGl0cyk7ICAgICAgCiAgICB9IGVsc2UgewogICAgICAvKiAzKSBTcGxpdHRpbmcgd2Fzbid0IGFwcGxpZWQsIHNvIHVzZSB0aGUgb3RoZXIgc3RyYXRlZ2llcyAqLwogICAgICBpZiAoKCpDb3VudGVyKSAlIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1dEUkFUSU8pID09IDApCglHaXZlbkNsYXVzZSA9IHRvcF9TZWxlY3RDbGF1c2VEZXB0aChwcmZzX1VzYWJsZUNsYXVzZXMoU2VhcmNoKSwgRmxhZ3MpOwogICAgICBlbHNlIHsKCWlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QUkVGQ09OKSAhPSBmbGFnX1BSRUZDT05VTkNIQU5HRUQpCgkgIEdpdmVuQ2xhdXNlID0gdG9wX1NlbGVjdE1pbmltYWxDb25XZWlnaHRDbGF1c2UocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksCgkJCQkJCQkgRmxhZ3MpOwoJZWxzZQoJICBHaXZlbkNsYXVzZSA9IHRvcF9TZWxlY3RNaW5pbWFsV2VpZ2h0Q2xhdXNlKHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpLAoJCQkJCQkgICAgICBGbGFncyk7CiAgICAgIH0KICAgICAgKCpDb3VudGVyKSsrOyAvKiBFSzogaGllciBsYXNzZW4sIG9kZXIgZWluZSBLbGFtbWVyZWJlbmUgbmFjaCBhdXNzZW4/ICovCiAgICB9CiAgfQoKICBpZiAoKlNwbGl0Q2xhdXNlID09IE5VTEwgJiYgcHJmc19TcGxpdENvdW50ZXIoU2VhcmNoKSAhPSAwKSB7CiAgICAvKiBUcnkgdG8gZmluZCB0aGUgIm9wdGltYWwiIGxpdGVyYWwgZm9yIHNwbGl0dGluZyB0aGUgY2xhdXNlLiAqLwogICAgLyogVGhpcyBtYWtlcyBzZW5zZSBmb3IgYSBjbGF1c2UgdGhhdCBpcyB0aGUgcmlnaHQgcGFydCBvZiBhICAgKi8KICAgIC8qIHNwbGl0dGluZyBzdGVwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBMaXRJbmRleCA9IHRvcF9HZXRPcHRpbWFsU3BsaXRMaXRlcmFsSW5kZXgoU2VhcmNoLCBHaXZlbkNsYXVzZSwgRkFMU0UpOwogICAgaWYgKExpdEluZGV4ID49IDApIHsKICAgICAgU3BsaXRMaXRzID0gbGlzdF9MaXN0KGNsYXVzZV9HZXRMaXRlcmFsKEdpdmVuQ2xhdXNlLCBMaXRJbmRleCkpOwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX0RvU3BsaXR0aW5nKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIFNwbGl0TGl0cyk7CiAgICAgIGxpc3RfRGVsZXRlKFNwbGl0TGl0cyk7CiAgICB9IGVsc2UgewogICAgICAvKiBPcHRpbWFsIHNwbGl0dGluZyB3YXNuJ3QgcG9zc2libGUsIHNvIHRyeSB0aGUgb2xkLXN0eWxlIHNwbGl0dGluZy4gKi8KICAgICAgLyogSGVyZSBhIHNwbGl0IGlzIGRvbmUgaWYgYSBwb3NpdGl2ZSBsaXRlcmFsIGRvZXNuJ3Qgc2hhcmUgdmFyaWFibGVzICovCiAgICAgIC8qIHdpdGggYW5vdGhlciBQT1NJVElWRSBsaXRlcmFsLiAqLwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX1BlcmZvcm1TcGxpdHRpbmcoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CiAgICB9CiAgfQoKICBwcmZzX0V4dHJhY3RVc2FibGUoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CgogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QR0lWRU4pKSB7CiAgICBmcHV0cygiXG5cdEdpdmVuIGNsYXVzZTogIiwgc3Rkb3V0KTsKICAgIGNsYXVzZV9QcmludChHaXZlbkNsYXVzZSk7CiAgICBmZmx1c2goc3Rkb3V0KTsKICB9CiAgCiAgaWYgKCpTcGxpdENsYXVzZSAhPSBOVUxMKQogICAgRGVyaXZhYmxlcyA9IGxpc3RfTGlzdCgqU3BsaXRDbGF1c2UpOwogIGVsc2UgewogICAgLyogTm8gc3BsaXR0aW5nIHdhcyBhcHBsaWVkICovCiAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUlRFUikgIT0gZmxhZ19SVEVST0ZGKSB7CiAgICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19SRURVQ1RJT04pOwogICAgICBUZXJtaW5hdG9yQ2xhdXNlID0gcmVkX1Rlcm1pbmF0b3IoR2l2ZW5DbGF1c2UsCgkJCQkJZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUlRFUiksCgkJCQkJcHJmc19Xb3JrZWRPZmZTaGFyaW5nSW5kZXgoU2VhcmNoKSwKCQkJCQlwcmZzX1VzYWJsZVNoYXJpbmdJbmRleChTZWFyY2gpLCBGbGFncywKCQkJCQlQcmVjZWRlbmNlKTsKICAgICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICAgICAgCiAgICAgIGlmIChUZXJtaW5hdG9yQ2xhdXNlICE9IE5VTEwpIHsKCS8qIEFuIGVtcHR5IGNsYXVzZSB3YXMgZGVyaXZlZCBieSB0aGUgInRlcm1pbmF0b3IiIHJ1bGUgKi8KCURlcml2YWJsZXMgPSBsaXN0X0xpc3QoVGVybWluYXRvckNsYXVzZSk7CglwcmZzX0luc2VydFVzYWJsZUNsYXVzZShTZWFyY2gsIEdpdmVuQ2xhdXNlKTsKICAgICAgfQogICAgfQogICAgaWYgKGxpc3RfRW1wdHkoRGVyaXZhYmxlcykpIHsKICAgICAgLyogTm8gc3BsaXR0aW5nIHdhcyBhcHBsaWVkLCBubyBlbXB0eSBjbGF1c2Ugd2FzIGZvdW5kIGJ5IHRlcm1pbmF0b3IgKi8KICAgICAgY2xhdXNlX1NlbGVjdExpdGVyYWwoR2l2ZW5DbGF1c2UsIEZsYWdzKTsKICAgICAgLypjbGF1c2VfU2V0U3BlY2lhbEZsYWdzKEdpdmVuQ2xhdXNlLGFuYV9Tb3J0RGVjcmVhc2luZygpKTsqLwogICAgICBwcmZzX0luc2VydFdvcmtlZE9mZkNsYXVzZShTZWFyY2gsIEdpdmVuQ2xhdXNlKTsKICAgICAgY2xvY2tfU3RhcnRDb3VudGVyKGNsb2NrX0lORkVSRU5DRSk7CiAgICAgIERlcml2YWJsZXMgPSBpbmZfRGVyaXZhYmxlQ2xhdXNlcyhTZWFyY2gsIEdpdmVuQ2xhdXNlKTsKICAgICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfSU5GRVJFTkNFKTsKICAgIH0KICB9CgogIHByZnNfSW5jRGVyaXZlZENsYXVzZXMoU2VhcmNoLCBsaXN0X0xlbmd0aChEZXJpdmFibGVzKSk7CgogIHJldHVybiBEZXJpdmFibGVzOwp9CgoKc3RhdGljIExJU1QgdG9wX0xhenlSZWR1Y3Rpb25TZWxlY3RHaXZlbkNvbXB1dGVEZXJpdmFibGVzKFBST09GU0VBUkNIIFNlYXJjaCwKCQkJCQkJCSAgQ0xBVVNFICpTcGxpdENsYXVzZSwKCQkJCQkJCSAgaW50ICpDb3VudGVyKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mIHNlYXJjaCBvYmplY3QsIGEgcG9pbnRlciB0byBhIGNsYXVzZSByZXN1bHRpbmcgZnJvbSBhCiAgICAgICAgICAgcHJldmlvdXMgc3BsaXR0aW5nIHN0ZXAsIGFuZCBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb3VudGVyLgogIFJFVFVSTlM6IEEgbGlzdCBvZiBkZXJpdmVkIGNsYXVzZXMuCiAgRUZGRUNUOiAgSW4gdGhpcyBmdW5jdGlvbiBhIGNsYXVzZSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBzZXQgb2YKICAgICAgICAgICAidXNhYmxlIiBjbGF1c2VzLiBBZnRlciBhIGNsYXVzZSB3YXMgc2VsZWN0ZWQgYXMgImdpdmVuIGNsYXVzZSIsCgkgICBpbmZlcmVuY2VzIGJldHdlZW4gdGhlIGdpdmVuIGNsYXVzZSBhbmQgdGhlICJ3b3JrZWQgb2ZmIiBjbGF1c2VzCgkgICBhcmUgbWFkZS4gVGFrZSBhIGxvb2sgYXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvbgoJICAgdG9wX0Z1bGxSZWR1Y3Rpb24uLi4gZm9yIG1vcmUgZGV0YWlscy4KCSAgIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBvdGhlciBmdW5jdGlvbiwKCSAgIHNpbmNlIGNsYXVzZXMgaW4gdGhlIHNldCBvZiB1c2FibGUgY2xhdXNlcyBtYXkgYmUgcmVkdWNpYmxlLgoJICAgQmVjYXVzZSBvZiB0aGlzIGZhY3QsIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGdpdmVuIGNsYXVzZQoJICAgaGFzIHRvIGJlIGRvbmUgaW4gYSBsb29wLiBBZnRlciBwaWNraW5nIGEgImNhbmRpZGF0ZSIgY2xhdXNlCgkgICB0aGUgY2xhdXNlIGlzIGludGVyLXJlZHVjZWQgd2l0aCB0aGUgIndvcmtlZCBvZmYiIHNldC4KCSAgIElmIHRoZSBjYW5kaWRhdGUgc3RpbGwgZXhpc3RzIGFmdGVyIHRoZSByZWR1Y3Rpb24gaXQgaXMKCSAgIHNlbGVjdGVkIGFzIGdpdmVuIGNsYXVzZSwgZWxzZSBhbm90aGVyIHVzYWJsZSBjbGF1c2UgaXMgcGlja2VkCgkgICBhcyBjYW5kaWRhdGUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIENMQVVTRSAgICAgR2l2ZW5DbGF1c2UsIFRlcm1pbmF0b3JDbGF1c2U7CiAgTElTVCAgICAgICBEZXJpdmFibGVzOwogIEZMQUdTVE9SRSAgRmxhZ3M7CiAgUFJFQ0VERU5DRSBQcmVjZWRlbmNlOwogIGludCAgICAgICAgTGl0SW5kZXg7CgogIEdpdmVuQ2xhdXNlICAgICAgPSAoQ0xBVVNFKU5VTEw7CiAgVGVybWluYXRvckNsYXVzZSA9IChDTEFVU0UpTlVMTDsKICBEZXJpdmFibGVzICAgICAgID0gbGlzdF9OaWwoKTsKICBGbGFncyAgICAgICAgICAgID0gcHJmc19TdG9yZShTZWFyY2gpOwogIFByZWNlZGVuY2UgICAgICAgPSBwcmZzX1ByZWNlZGVuY2UoU2VhcmNoKTsKCiAgd2hpbGUgKEdpdmVuQ2xhdXNlID09IChDTEFVU0UpTlVMTCAmJgoJICFsaXN0X0VtcHR5KHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpKSkgewogICAgLyogVGhlIHNlbGVjdGVkIGNsYXVzZSBtYXkgYmUgcmVkdW5kYW50ICovCgogICAgaWYgKCpTcGxpdENsYXVzZSAhPSBOVUxMICYmCglsaXN0X1BvaW50ZXJNZW1iZXIocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksICpTcGxpdENsYXVzZSkpCiAgICAgIEdpdmVuQ2xhdXNlID0gKlNwbGl0Q2xhdXNlOwoKICAgICpTcGxpdENsYXVzZSAgPSBOVUxMOwoKICAgIC8qIFRyeSBzZWxlY3RpbmcgYSBjbGF1c2UgdGhhdCBpcyBvcHRpbWFsIGZvciBzcGxpdHRpbmcgKi8KICAgIGlmIChHaXZlbkNsYXVzZSA9PSBOVUxMKSB7CiAgICAgIGlmIChwcmZzX1NwbGl0Q291bnRlcihTZWFyY2gpICE9IDApIHsKCUdpdmVuQ2xhdXNlID0gdG9wX0dldFBvd2VyZnVsU3BsaXRDbGF1c2UoU2VhcmNoLCBGQUxTRSwgJkxpdEluZGV4KTsKCS8qIFRoZSB2YWx1ZSBvZiA8TGl0SW5kZXg+IGlzbid0IHVzZWQgaGVyZS4gKi8KICAgICAgfQoKICAgICAgaWYgKEdpdmVuQ2xhdXNlID09IE5VTEwpIHsKCS8qIE5vIG9wdGltYWwgY2xhdXNlIGZvciBzcGxpdHRpbmcgZm91bmQgKi8KCWlmICgoKkNvdW50ZXIpICUgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfV0RSQVRJTykgPT0gMCkKCSAgR2l2ZW5DbGF1c2UgPSB0b3BfU2VsZWN0Q2xhdXNlRGVwdGgocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksIEZsYWdzKTsKCWVsc2UgewoJICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFJFRkNPTikgIT0gZmxhZ19QUkVGQ09OVU5DSEFOR0VEKQoJICAgIEdpdmVuQ2xhdXNlID0gdG9wX1NlbGVjdE1pbmltYWxDb25XZWlnaHRDbGF1c2UocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksCgkJCQkJCQkgICBGbGFncyk7CgkgIGVsc2UKCSAgICBHaXZlbkNsYXVzZSA9IHRvcF9TZWxlY3RNaW5pbWFsV2VpZ2h0Q2xhdXNlKHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpLAoJCQkJCQkJRmxhZ3MpOwoJfQoJKCpDb3VudGVyKSsrOwogICAgICB9CiAgICB9CiAgICBwcmZzX0V4dHJhY3RVc2FibGUoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CgogICAgLyogUmVkdWNlIHRoZSBzZWxlY3RlZCBjbGF1c2UgKi8KICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19SRURVQ1RJT04pOwogICAgR2l2ZW5DbGF1c2UgPSByZWRfQ29tcGxldGVSZWR1Y3Rpb25PbkRlcml2ZWRDbGF1c2UoU2VhcmNoLCBHaXZlbkNsYXVzZSwgCgkJCQkJCSAgICAgICByZWRfV09SS0VET0ZGKTsKICAgIGNsb2NrX1N0b3BBZGRQYXNzZWRUaW1lKGNsb2NrX1JFRFVDVElPTik7CiAgfQoKICBpZiAoR2l2ZW5DbGF1c2UgPT0gKENMQVVTRSlOVUxMKQogICAgLyogU2V0IG9mIHVzYWJsZSBjbGF1c2VzIGlzIGVtcHR5ICovCiAgICByZXR1cm4gbGlzdF9OaWwoKTsKCiAgCiAgaWYgKGNsYXVzZV9Jc0VtcHR5Q2xhdXNlKEdpdmVuQ2xhdXNlKSkgewogICAgRGVyaXZhYmxlcyA9IGxpc3RfTGlzdChHaXZlbkNsYXVzZSk7CiAgICByZXR1cm4gRGVyaXZhYmxlczsKICB9CiAgZWxzZSB7CiAgICAvKiBSZWR1Y2UgV29ya2Vkb2ZmIGNsYXVzZXMgd2l0aCBzZWxlY3RlZCBjbGF1c2UgKi8KICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19SRURVQ1RJT04pOwogICAgRGVyaXZhYmxlcyA9IHJlZF9CYWNrUmVkdWN0aW9uKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIHJlZF9XT1JLRURPRkYpOwogICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICB9CgogIC8qIFByaW50IHNlbGVjdGVkIGNsYXVzZSAqLwogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QR0lWRU4pKSB7CiAgICBmcHV0cygiXG5cdEdpdmVuIGNsYXVzZTogIiwgc3Rkb3V0KTsKICAgIGNsYXVzZV9QcmludChHaXZlbkNsYXVzZSk7IAogICAgZmZsdXNoKHN0ZG91dCk7CiAgfSAgICAgCgogIC8qIFRyeSBzcGxpdHRpbmcgKi8KICBpZiAocHJmc19TcGxpdENvdW50ZXIoU2VhcmNoKSAhPSAwKSB7CiAgICAvKiBGaXJzdCB0cnkgIm9wdGltYWwiIHNwbGl0dGluZyBvbiB0aGUgc2VsZWN0ZWQgY2xhdXNlICovCiAgICBMaXRJbmRleCA9IHRvcF9HZXRPcHRpbWFsU3BsaXRMaXRlcmFsSW5kZXgoU2VhcmNoLCBHaXZlbkNsYXVzZSwgRkFMU0UpOwoKICAgIGlmIChMaXRJbmRleCA+PSAwKSB7CiAgICAgIExJU1QgU3BsaXRMaXRzOwoKICAgICAgU3BsaXRMaXRzID0gbGlzdF9MaXN0KGNsYXVzZV9HZXRMaXRlcmFsKEdpdmVuQ2xhdXNlLCBMaXRJbmRleCkpOwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX0RvU3BsaXR0aW5nKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIFNwbGl0TGl0cyk7CiAgICAgIGxpc3RfRGVsZXRlKFNwbGl0TGl0cyk7ICAgICAgCiAgICB9IGVsc2UgewogICAgICAvKiBUcnkgdGhlIG9sZCBzcGxpdHRpbmcgdGhhdCBhbGxvd3MgbmVnYXRpdmUgbGl0ZXJhbHMgICAqLwogICAgICAvKiBzaGFyaW5nIHZhcmlhYmxlcyB3aXRoIHRoZSBzZWxlY3RlZCBwb3NpdGl2ZSBsaXRlcmFsLiAqLwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX1BlcmZvcm1TcGxpdHRpbmcoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CiAgICB9CiAgfSAKICAKICBpZiAoKlNwbGl0Q2xhdXNlICE9IE5VTEwpIHsKICAgIERlcml2YWJsZXMgPSBsaXN0X0NvbnMoKlNwbGl0Q2xhdXNlLCBEZXJpdmFibGVzKTsKICB9IGVsc2UgewogICAgLyogVHJ5IHRlcm1pbmF0b3IgcmVkdWN0aW9uIG9ubHkgZm9yIGEgY2xhdXNlIHRoYXQgd2Fzbid0IHNwbGl0dGVkLiAqLwogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1JURVIpICE9IGZsYWdfUlRFUk9GRikgewogICAgICBUZXJtaW5hdG9yQ2xhdXNlID0gcmVkX1Rlcm1pbmF0b3IoR2l2ZW5DbGF1c2UsCgkJCQkJZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUlRFUiksCgkJCQkJcHJmc19Xb3JrZWRPZmZTaGFyaW5nSW5kZXgoU2VhcmNoKSwKCQkJCQlwcmZzX1VzYWJsZVNoYXJpbmdJbmRleChTZWFyY2gpLAoJCQkJCUZsYWdzLCBQcmVjZWRlbmNlKTsKICAgICAgaWYgKFRlcm1pbmF0b3JDbGF1c2UgIT0gTlVMTCkgewoJRGVyaXZhYmxlcyA9IGxpc3RfQ29ucyhUZXJtaW5hdG9yQ2xhdXNlLCBEZXJpdmFibGVzKTsKCXByZnNfSW5zZXJ0VXNhYmxlQ2xhdXNlKFNlYXJjaCwgR2l2ZW5DbGF1c2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoVGVybWluYXRvckNsYXVzZSA9PSAoQ0xBVVNFKU5VTEwpIHsgICAKICAgICAgY2xhdXNlX1NlbGVjdExpdGVyYWwoR2l2ZW5DbGF1c2UsIEZsYWdzKTsKICAgICAgLyogY2xhdXNlX1NldFNwZWNpYWxGbGFncyhHaXZlbkNsYXVzZSxhbmFfU29ydERlY3JlYXNpbmcoKSk7Ki8KICAgICAgcHJmc19JbnNlcnRXb3JrZWRPZmZDbGF1c2UoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CiAgICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19JTkZFUkVOQ0UpOwogICAgICBEZXJpdmFibGVzID0gbGlzdF9OY29uYyhEZXJpdmFibGVzLAoJCQkgICAgICBpbmZfRGVyaXZhYmxlQ2xhdXNlcyhTZWFyY2gsIEdpdmVuQ2xhdXNlKSk7CiAgICAgIGNsb2NrX1N0b3BBZGRQYXNzZWRUaW1lKGNsb2NrX0lORkVSRU5DRSk7CiAgICB9CiAgfQogIAogIHByZnNfSW5jRGVyaXZlZENsYXVzZXMoU2VhcmNoLCBsaXN0X0xlbmd0aChEZXJpdmFibGVzKSk7CgogIHJldHVybiBEZXJpdmFibGVzOwp9CgoKc3RhdGljIFBST09GU0VBUkNIIHRvcF9Qcm9vZlNlYXJjaChQUk9PRlNFQVJDSCBTZWFyY2gsIExJU1QgUHJvYmxlbUNsYXVzZXMsCgkJCQkgICBGTEFHU1RPUkUgSW5wdXRGbGFncywgTElTVCBVc2VyUHJlY2VkZW5jZSwgaW50ICpCb3VuZEFwcGxpZWQpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgcHJvb2Ygc2VhcmNoIG9iamVjdCwgYSBsaXN0IG9mIGNsYXVzZXMsIGEgZmxhZyBzdG9yZQogICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGZsYWdzIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhbmQgZnJvbQogICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCBhIGxpc3QgY29udGFpbmluZyB0aGUgcHJlY2VkZW5jZSBhcwoJICAgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBhbmQgYSBwb2ludGVyIHRvIGFuIGludGVnZXIuCiAgUkVUVVJOUzogVGhlIHNhbWUgcHJvb2Ygc2VhcmNoIG9iamVjdAogIEVGRkVDVFM6IAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUICAgICAgIFNjYW4sRW1wdHlDbGF1c2VzLERlcml2YWJsZXM7CiAgTElTVCAgICAgICBVc2VkRW1wdHlDbGF1c2VzOwogIENMQVVTRSAgICAgU3BsaXRDbGF1c2UsSGlnaGVzdExldmVsRW1wdHlDbGF1c2U7CiAgRkxBR1NUT1JFICBGbGFnczsKICBQUkVDRURFTkNFIFByZWNlZGVuY2U7CiAgaW50ICAgICAgICBDb3VudGVyLCBBY3RCb3VuZCwgQm91bmRNb2RlLCBCb3VuZExvb3BzOwoKICBIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSA9IChDTEFVU0UpTlVMTDsKICBVc2VkRW1wdHlDbGF1c2VzICAgICAgICA9IGxpc3RfTmlsKCk7CiAgRW1wdHlDbGF1c2VzICAgICAgICAgICAgPSBsaXN0X05pbCgpOwogIERlcml2YWJsZXMgICAgICAgICAgICAgID0gbGlzdF9OaWwoKTsKICBGbGFncyAgICAgICAgICAgICAgICAgICA9IHByZnNfU3RvcmUoU2VhcmNoKTsKICBQcmVjZWRlbmNlICAgICAgICAgICAgICA9IHByZnNfUHJlY2VkZW5jZShTZWFyY2gpOwogIENvdW50ZXIgICAgICAgICAgICAgICAgID0gMTsKCiAgY2xvY2tfSW5pdENvdW50ZXIoY2xvY2tfUkVEVUNUSU9OKTsKICBjbG9ja19Jbml0Q291bnRlcihjbG9ja19CQUNLVFJBQ0spOwogIGNsb2NrX0luaXRDb3VudGVyKGNsb2NrX0lORkVSRU5DRSk7CgogIC8qIEltcG9ydGFudCAhIFJlY29tcHV0ZXMgV2VpZ2h0ICEgKi8KICBhbmFfQW5hbHl6ZVByb2JsZW0oU2VhcmNoLCBQcm9ibGVtQ2xhdXNlcyk7CiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0FVVE8pKSB7CiAgICBwcmZzX0luc3RhbGxGaW5pdGVNb25hZGljUHJlZGljYXRlcyhTZWFyY2gsIFByb2JsZW1DbGF1c2VzLCBhbmFfRmluTW9uUHJlZExpc3QoKSk7CiAgICBhbmFfQXV0b0NvbmZpZ3VyYXRpb24oUHJvYmxlbUNsYXVzZXMsIEZsYWdzLCBQcmVjZWRlbmNlKTsKICAgIC8qIEZpbGUgYW5kIGlucHV0IGZsYWdzIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgKi8KICAgIGZsYWdfVHJhbnNmZXJTZXRGbGFncyhJbnB1dEZsYWdzLCBGbGFncyk7CiAgfQoKICAvKiBSZWFycmFuZ2UgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIHByZWNlZGVuY2UgYWNjb3JkaW5nIHRvIHVzZXIncyBzcGVjaWZpY2F0aW9uLiAqLwogIHN5bWJvbF9SZWFycmFuZ2VQcmVjZWRlbmNlKFByZWNlZGVuY2UsIFVzZXJQcmVjZWRlbmNlKTsKCiAgZm9yIChTY2FuID0gUHJvYmxlbUNsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpCiAgICBjbGF1c2VfT3JpZW50QW5kUmVJbml0KGxpc3RfQ2FyKFNjYW4pLCBGbGFncywgUHJlY2VkZW5jZSk7CgogIC8qIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFuYV9BbmFseXplUHJvYmxlbSBhbmQgUmVvcmllbnRhdGlvbiAqLwogIGFuYV9BbmFseXplU29ydFN0cnVjdHVyZShQcm9ibGVtQ2xhdXNlcywgRmxhZ3MsIFByZWNlZGVuY2UpOwoKICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfQVVUTykpIHsKICAgIGFuYV9FeHBsb2l0U29ydEFuYWx5c2lzKEZsYWdzKTsKICAgIC8qIEZpbGUgYW5kIGlucHV0IGZsYWdzIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgKi8KICAgIGZsYWdfVHJhbnNmZXJTZXRGbGFncyhJbnB1dEZsYWdzLCBGbGFncyk7CiAgfQogIHByZnNfU2V0U3BsaXRDb3VudGVyKFNlYXJjaCwgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfU1BMSVRTKSk7CgogIEFjdEJvdW5kICAgICAgID0gZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfQk9VTkRTVEFSVCk7CiAgQm91bmRNb2RlICAgICAgPSBmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19CT1VORE1PREUpOwogIEJvdW5kTG9vcHMgICAgID0gZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfQk9VTkRMT09QUyk7CiAgKkJvdW5kQXBwbGllZCAgPSAtMTsKCiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BQUk9CTEVNKSkgewogICAgcHV0cygiIik7CiAgICBwdXRzKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNQQVNTLVNUQVJULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgIHB1dHMoIklucHV0IFByb2JsZW06Iik7CiAgICBjbGF1c2VfTGlzdFByaW50KFByb2JsZW1DbGF1c2VzKTsKICAgIGFuYV9QcmludChGbGFncywgUHJlY2VkZW5jZSk7CiAgfQoKICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfU09SVFMpICE9IGZsYWdfU09SVFNPRkYpIHsKICAgIEJPT0wgU3Ryb25nOwogICAgU3Ryb25nID0gKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1NPUlRTKSA9PSBmbGFnX1NPUlRTTU9OQURJQ0FMTCk7CiAgICBmb3IgKFNjYW4gPSBQcm9ibGVtQ2xhdXNlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkKICAgICAgY2xhdXNlX1NldFNvcnRDb25zdHJhaW50KChDTEFVU0UpbGlzdF9DYXIoU2NhbiksU3Ryb25nLEZsYWdzLCBQcmVjZWRlbmNlKTsKICB9CgogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19SSU5QVVQpKSB7CiAgICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfUkVEVUNUSU9OKTsKICAgIEVtcHR5Q2xhdXNlcyA9IHJlZF9SZWR1Y2VJbnB1dChTZWFyY2gsIFByb2JsZW1DbGF1c2VzKTsKICAgIGNsb2NrX1N0b3BBZGRQYXNzZWRUaW1lKGNsb2NrX1JFRFVDVElPTik7CiAgICBpZiAobGlzdF9FbXB0eShFbXB0eUNsYXVzZXMpICYmIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1NBVElOUFVUKSkKICAgICAgRW1wdHlDbGF1c2VzID0gcmVkX1NhdElucHV0KFNlYXJjaCk7CiAgfQogIGVsc2UgewogICAgZm9yIChTY2FuPVByb2JsZW1DbGF1c2VzOyAhbGlzdF9FbXB0eShTY2FuKTsgU2Nhbj1saXN0X0NkcihTY2FuKSkKICAgICAgcHJmc19JbnNlcnRVc2FibGVDbGF1c2UoU2VhcmNoLCBsaXN0X0NhcihTY2FuKSk7CiAgfQogIERlcml2YWJsZXMgPSBsaXN0X05pbCgpOwoKICBpZiAoYW5hX1NvcnRSZXN0cmljdGlvbnMoKSB8fAogICAgICAoYW5hX1Vuc29sdmVkU29ydFJlc3RyaWN0aW9ucygpICYmCiAgICAgICBmbGFnX0dldEZsYWdWYWx1ZShGbGFncyxmbGFnX1NPUlRTKSA9PSBmbGFnX1NPUlRTTU9OQURJQ0FMTCkpIHsKICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19SU1NUKSkKICAgICAgcHJmc19TZXRTdGF0aWNTb3J0VGhlb3J5KFNlYXJjaCxzb3J0X0FwcHJveFN0YXRpY1NvcnRUaGVvcnkocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksRmxhZ3MsUHJlY2VkZW5jZSkpOwogICAgcHJmc19TZXREeW5hbWljU29ydFRoZW9yeShTZWFyY2gsc29ydF9UaGVvcnlDcmVhdGUoKSk7CiAgfQoKICAvKiBGaXggbGl0ZXJhbCBvcmRlciBpbiBjbGF1c2VzIGluIHRoZSB1c2FibGUgc2V0LgogICAgIFNpbmNlIHRoZXkgYXJlIHNoYXJlZCwgd2UgaGF2ZSB0byBleHRyYWN0IHRoZW0gZnJvbQogICAgIHRoZSBzaGFyaW5nIGJlZm9yZSBmaXhpbmcgdGhlbS4gQWZ0ZXJ3YXJkcywgd2UgaGF2ZSB0bwogICAgIGluc2VydCB0aGVtIGluIHRoZSBzaGFyaW5nIGFnYWluLgogICovIAogIGZvciAoU2NhbiA9IHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpOwogICAgICAgIWxpc3RfRW1wdHkoU2Nhbik7CiAgICAgICBTY2FuID0gbGlzdF9DZHIoU2NhbikpIHsKICAgIENMQVVTRSBjbGF1c2U7CiAgICBjbGF1c2UgPSBsaXN0X0NhcihTY2FuKTsKICAgIGNsYXVzZV9NYWtlVW5zaGFyZWQoY2xhdXNlLHByZnNfVXNhYmxlU2hhcmluZ0luZGV4KFNlYXJjaCkpOwogICAgY2xhdXNlX0ZpeExpdGVyYWxPcmRlcihjbGF1c2UsIEZsYWdzLCBQcmVjZWRlbmNlKTsKICAgIGNsYXVzZV9JbnNlcnRJbnRvU2hhcmluZyhjbGF1c2UsIHByZnNfVXNhYmxlU2hhcmluZ0luZGV4KFNlYXJjaCksCgkJCSAgICAgcHJmc19TdG9yZShTZWFyY2gpLCBwcmZzX1ByZWNlZGVuY2UoU2VhcmNoKSk7CiAgfQoKICAvKiBDYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBjb3VudHMgZm9yIHRoZSBzeW1ib2xzIGluIHRoZSB1c2FibGUgc2V0LiAqLwogIGZvciAoU2NhbiA9IHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpOwogICAgICAgIWxpc3RfRW1wdHkoU2Nhbik7CiAgICAgICBTY2FuID0gbGlzdF9DZHIoU2NhbikpIHsKICAgIENMQVVTRSBjbGF1c2U7CiAgICBjbGF1c2UgPSBsaXN0X0NhcihTY2FuKTsKCiAgICBjbGF1c2VfQ291bnRTeW1ib2xzKGNsYXVzZSk7CiAgfQoKICAvKiBTb3J0IHVzYWJsZSBzZXQuICovCiAgcHJmc19TZXRVc2FibGVDbGF1c2VzKFNlYXJjaCwgCgkJCWxpc3RfU29ydChwcmZzX1VzYWJsZUNsYXVzZXMoU2VhcmNoKSwgCgkJCQkgIChCT09MICgqKSAodm9pZCAqLCB2b2lkICopKSBjbGF1c2VfQ29tcGFyZUFic3RyYWN0TEVRKSk7CgogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19TT1MpKSB7CiAgICBEZXJpdmFibGVzID0gbGlzdF9Db3B5KHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpKTsKICAgIGZvciAoU2Nhbj1EZXJpdmFibGVzOyFsaXN0X0VtcHR5KFNjYW4pO1NjYW49bGlzdF9DZHIoU2NhbikpCiAgICAgIGlmICghY2xhdXNlX0dldEZsYWcobGlzdF9DYXIoU2NhbiksIENPTkNMQVVTRSkpCglwcmZzX01vdmVVc2FibGVXb3JrZWRPZmYoU2VhcmNoLGxpc3RfQ2FyKFNjYW4pKTsKICAgIGxpc3RfRGVsZXRlKERlcml2YWJsZXMpOwogIH0KCiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BQUk9CTEVNKSkgewogICAgcHV0cygiXG5Qcm9jZXNzZWQgUHJvYmxlbToiKTsKICAgIHB1dHMoIlxuV29ya2VkIE9mZiBDbGF1c2VzOiIpOwogICAgY2xhdXNlX0xpc3RQcmludChwcmZzX1dvcmtlZE9mZkNsYXVzZXMoU2VhcmNoKSk7CiAgICBwdXRzKCJcblVzYWJsZSBDbGF1c2VzOiIpOwogICAgY2xhdXNlX0xpc3RQcmludChwcmZzX1VzYWJsZUNsYXVzZXMoU2VhcmNoKSk7CiAgfQoKICB3aGlsZSAoKGxpc3RfRW1wdHkoRW1wdHlDbGF1c2VzKSB8fCAhcHJmc19TcGxpdFN0YWNrRW1wdHkoU2VhcmNoKSkgJiYgCgkgcHJmc19Mb29wcyhTZWFyY2gpICE9IDAgJiYKCSAoKCpCb3VuZEFwcGxpZWQgIT0gLTEpIHx8ICFsaXN0X0VtcHR5KHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpKSkgJiYKCSAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsZmxhZ19USU1FTElNSVQpID09IGZsYWdfVElNRUxJTUlUVU5MSU1JVEVEIHx8CgkgIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLGZsYWdfVElNRUxJTUlUKSA+IGNsb2NrX0dldFNlY29uZHMoY2xvY2tfT1ZFUkFMTCkpKSB7CgogICAgRGVyaXZhYmxlcyAgICA9IGxpc3RfTmlsKCk7CiAgICBTcGxpdENsYXVzZSAgID0gKENMQVVTRSlOVUxMOwogICAgKkJvdW5kQXBwbGllZCA9IC0xOwoKICAgIHdoaWxlICgobGlzdF9FbXB0eShFbXB0eUNsYXVzZXMpIHx8ICFwcmZzX1NwbGl0U3RhY2tFbXB0eShTZWFyY2gpKSAmJiAKCSAgIHByZnNfTG9vcHMoU2VhcmNoKSAhPSAwICYmCgkgICAoIWxpc3RfRW1wdHkocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCkpIHx8ICFsaXN0X0VtcHR5KEVtcHR5Q2xhdXNlcykpICYmCgkgICAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsZmxhZ19USU1FTElNSVQpID09IGZsYWdfVElNRUxJTUlUVU5MSU1JVEVEIHx8CgkgICAgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsZmxhZ19USU1FTElNSVQpID4gY2xvY2tfR2V0U2Vjb25kcyhjbG9ja19PVkVSQUxMKSkpIHsKICAgICAgCiAgICAgIGlmICghbGlzdF9FbXB0eShFbXB0eUNsYXVzZXMpKSB7CgkvKiBCYWNrdHJhY2tpbmcgKi8KCWNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19CQUNLVFJBQ0spOwoJRGVyaXZhYmxlcyA9IHNwbGl0X0JhY2t0cmFjayhTZWFyY2gsIEhpZ2hlc3RMZXZlbEVtcHR5Q2xhdXNlLAoJCQkJICAgICAmU3BsaXRDbGF1c2UpOwoJY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfQkFDS1RSQUNLKTsKCXByZnNfSW5jQmFja3RyYWNrZWRDbGF1c2VzKFNlYXJjaCwgbGlzdF9MZW5ndGgoRGVyaXZhYmxlcykpOwogICAgICAKCWlmIChwcmZzX1NwbGl0U3RhY2tFbXB0eShTZWFyY2gpKQoJICBEZXJpdmFibGVzID0gbGlzdF9OY29uYyhFbXB0eUNsYXVzZXMsIERlcml2YWJsZXMpOwoJZWxzZSB7CgkgIGZvciAoIDsgIWxpc3RfRW1wdHkoRW1wdHlDbGF1c2VzKTsgRW1wdHlDbGF1c2VzID0gbGlzdF9Qb3AoRW1wdHlDbGF1c2VzKSkKCSAgICBpZiAobGlzdF9DYXIoRW1wdHlDbGF1c2VzKSAhPSBIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSkKCSAgICAgIGNsYXVzZV9EZWxldGUobGlzdF9DYXIoRW1wdHlDbGF1c2VzKSk7CgkgIHByZnNfSW5zZXJ0RG9jUHJvb2ZDbGF1c2UoU2VhcmNoLCBIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSk7CgkgIC8qIEtlZXAgSGlnaGVzdExldmVsRW1wdHlDbGF1c2UgZm9yIGZpbmRpbmcgdGhlIHRlcm1zIHJlcXVpcmVkICovCgkgIC8qIGZvciB0aGUgcHJvb2YuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19ET0NQUk9PRikpCgkgICAgVXNlZEVtcHR5Q2xhdXNlcyA9IGxpc3RfQ29ucyhIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSwgVXNlZEVtcHR5Q2xhdXNlcyk7CgkgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19ET0NTUExJVCkpCgkgICAgcHJpbnRmKCJcblx0IFNwbGl0IEJhY2t0cmFja2luZyBsZXZlbCAlZDoiLHByZnNfVmFsaWRMZXZlbChTZWFyY2gpKTsKCX0KCUVtcHR5Q2xhdXNlcyAgICAgICAgICAgID0gbGlzdF9OaWwoKTsKCUhpZ2hlc3RMZXZlbEVtcHR5Q2xhdXNlID0gKENMQVVTRSlOVUxMOwogICAgICB9CiAgICAgIGVsc2UgeyAgIC8qIG5vIGVtcHR5IGNsYXVzZSBmb3VuZCAqLwoKI2lmZGVmIENIRUNLCglpZiAoIXByZnNfQ2hlY2soU2VhcmNoKSkgewoJICBtaXNjX1N0YXJ0RXJyb3JSZXBvcnQoKTsKCSAgbWlzY19FcnJvclJlcG9ydCgiXG4gSW4gdG9wX1Byb29mU2VhcmNoOiBJbGxlZ2FsIHN0YXRlIG9mIHNlYXJjaCBpbiBTUEFTUy5cbiIpOwoJICBtaXNjX0ZpbmlzaEVycm9yUmVwb3J0KCk7Cgl9CglpZiAoIWFuYV9FcXVhdGlvbnMoKSkKCSAgcmVkX0NoZWNrU3BsaXRTdWJzdW1wdGlvbkNvbmRpdGlvbihTZWFyY2gpOwojZW5kaWYgCgoJaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0ZVTExSRUQpKQoJICBEZXJpdmFibGVzID0gdG9wX0Z1bGxSZWR1Y3Rpb25TZWxlY3RHaXZlbkNvbXB1dGVEZXJpdmFibGVzKFNlYXJjaCwgJlNwbGl0Q2xhdXNlLCAmQ291bnRlcik7CgllbHNlCgkgIERlcml2YWJsZXMgPSB0b3BfTGF6eVJlZHVjdGlvblNlbGVjdEdpdmVuQ29tcHV0ZURlcml2YWJsZXMoU2VhcmNoLCAmU3BsaXRDbGF1c2UsICZDb3VudGVyKTsKICAgICAgfQoKICAgICAgLyogUHJpbnQgdGhlIGRlcml2ZWQgY2xhdXNlcywgaWYgcmVxdWlyZWQgKi8KICAgICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BERVIpKQoJZm9yIChTY2FuPURlcml2YWJsZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKSB7CgkgIGZwdXRzKCJcbkRlcml2ZWQ6ICIsIHN0ZG91dCk7IAoJICBjbGF1c2VfUHJpbnQobGlzdF9DYXIoU2NhbikpOwoJfQoKICAgICAgLyogUGFydGl0aW9uIHRoZSBkZXJpdmVkIGNsYXVzZXMgaW50byBlbXB0eSBhbmQgbm9uLWVtcHR5IGNsYXVzZXMgKi8KICAgICAgRGVyaXZhYmxlcyA9IHNwbGl0X0V4dHJhY3RFbXB0eUNsYXVzZXMoRGVyaXZhYmxlcywgJkVtcHR5Q2xhdXNlcyk7CgogICAgICAvKiBBcHBseSByZWR1Y3Rpb24gcnVsZXMgKi8KICAgICAgY2xvY2tfU3RhcnRDb3VudGVyKGNsb2NrX1JFRFVDVElPTik7CiAgICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19GVUxMUkVEKSkgewoJRW1wdHlDbGF1c2VzID0gCgkgIGxpc3RfTmNvbmMoRW1wdHlDbGF1c2VzLAoJCSAgICAgcmVkX0NvbXBsZXRlUmVkdWN0aW9uT25EZXJpdmVkQ2xhdXNlcyhTZWFyY2gsIERlcml2YWJsZXMsCgkJCQkJCQkgICByZWRfQUxMLCBBY3RCb3VuZCwKCQkJCQkJCSAgIEJvdW5kTW9kZSwKCQkJCQkJCSAgIEJvdW5kQXBwbGllZCkpOwogICAgICB9IGVsc2UgewoJRW1wdHlDbGF1c2VzID0KCSAgbGlzdF9OY29uYyhFbXB0eUNsYXVzZXMsCgkJICAgICByZWRfQ29tcGxldGVSZWR1Y3Rpb25PbkRlcml2ZWRDbGF1c2VzKFNlYXJjaCwgRGVyaXZhYmxlcywKCQkJCQkJCSAgIHJlZF9XT1JLRURPRkYsCgkJCQkJCQkgICBBY3RCb3VuZCwgQm91bmRNb2RlLAoJCQkJCQkJICAgQm91bmRBcHBsaWVkKSk7CiAgICAgIH0KICAgICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICAgICAgCgogICAgICBpZiAoIWxpc3RfRW1wdHkoRW1wdHlDbGF1c2VzKSkgewoJSGlnaGVzdExldmVsRW1wdHlDbGF1c2UgPSBzcGxpdF9TbWFsbGVzdFNwbGl0TGV2ZWxDbGF1c2UoRW1wdHlDbGF1c2VzKTsKCWlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QRU1QVFlDTEFVU0UpKSB7CgkgIGZwdXRzKCJcbkVtcHR5Q2xhdXNlOiAiLCBzdGRvdXQpOwoJICBjbGF1c2VfUHJpbnQoSGlnaGVzdExldmVsRW1wdHlDbGF1c2UpOwoJfQogICAgICB9CiAgICAgIHByZnNfRGVjTG9vcHMoU2VhcmNoKTsKICAgIH0KICAKICAgIGlmIChBY3RCb3VuZCAhPSBmbGFnX0JPVU5EU1RBUlRVTkxJTUlURUQgJiYKCUJvdW5kTW9kZSAhPSBmbGFnX0JPVU5ETU9ERVVOTElNSVRFRCkgewogICAgICBCb3VuZExvb3BzLS07CiAgICAgIGlmIChCb3VuZExvb3BzID09IGZsYWdfQk9VTkRMT09QU01JTikKCUFjdEJvdW5kID0gZmxhZ19CT1VORFNUQVJUVU5MSU1JVEVEOwogICAgICBlbHNlCglBY3RCb3VuZCA9ICpCb3VuZEFwcGxpZWQ7CiAgICAgIGlmICgqQm91bmRBcHBsaWVkICE9IC0xKSB7CglwcmZzX1N3YXBJbmRleGVzKFNlYXJjaCk7CglpZiAgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLGZsYWdfUEJJTkMpKQoJICBwcmludGYoIlxuXG5cdCAtLS0tIE5ldyBDbGF1c2UgJXMgQm91bmQ6ICUyZCAtLS0tXG4iLAoJCSAoQm91bmRNb2RlPT1mbGFnX0JPVU5ETU9ERVJFU1RSSUNURURCWURFUFRIKSA/ICJUZXJtIERlcHRoIiA6ICJXZWlnaHQiLEFjdEJvdW5kKTsKICAgICAgfQogICAgfQogIH0KICBwcmZzX1NldEVtcHR5Q2xhdXNlcyhTZWFyY2gsIEVtcHR5Q2xhdXNlcyk7CiAgcHJmc19TZXRVc2VkRW1wdHlDbGF1c2VzKFNlYXJjaCwgVXNlZEVtcHR5Q2xhdXNlcyk7CgogIHJldHVybiBTZWFyY2g7Cn0KCgpzdGF0aWMgdm9pZCB0b3BfRmxvdHRlcihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdLCBMSVNUIElucHV0Q2xhdXNlcykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAKICBSRVRVUk5TOiBOb3RoaW5nLgogIEVGRkVDVDogIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBGSUxFICpPdXRwdXQ7CiAgY2hhciAqZGVzY3JpcHRpb247CiAgY29uc3QgY2hhciAqY3JlYXRvciA9ICJcblx0Q05GIGdlbmVyYXRlZCBieSBGTE9UVEVSICIgbWlzY19WRVJTSU9OICIgKn0iOwogIGludCAgc2l6ZTsKICBpbnQgIGNyZWF0b3Jfc2l6ZTsKCiAgaWYgKGFyZ2MgPCBvcHRzX0luZGljYXRvcigpKzIpCiAgICBPdXRwdXQgPSBzdGRvdXQ7CiAgZWxzZQogICAgT3V0cHV0ID0gbWlzY19PcGVuRmlsZShhcmd2W29wdHNfSW5kaWNhdG9yKCkrMV0sInciKTsKCiAgY3JlYXRvcl9zaXplID0gKGludClzdHJsZW4oY3JlYXRvcik7CiAgc2l6ZSAgICAgICAgPSAoaW50KXN0cmxlbihkZmdfUHJvYmxlbURlc2NyaXB0aW9uKCkpICsgY3JlYXRvcl9zaXplOwogIGRlc2NyaXB0aW9uID0gKGNoYXIqKW1lbW9yeV9NYWxsb2Moc2l6ZW9mKGNoYXIpKnNpemUpOwogIHN0cm5jcHkoZGVzY3JpcHRpb24sZGZnX1Byb2JsZW1EZXNjcmlwdGlvbigpLHNpemUtY3JlYXRvcl9zaXplLTMpOwogIHN0cmNweShkZXNjcmlwdGlvbitzaXplLWNyZWF0b3Jfc2l6ZS0zLCBjcmVhdG9yKTsKCiAgCiAgY2xhdXNlX0ZQcmludENuZkRGR1Byb2JsZW0oT3V0cHV0LCBkZmdfUHJvYmxlbU5hbWUoKSwgZGZnX1Byb2JsZW1BdXRob3IoKSwgCgkJCSAgICAgZGZnX1Byb2JsZW1TdGF0dXNTdHJpbmcoKSwgZGVzY3JpcHRpb24sIElucHV0Q2xhdXNlcyk7CiAgCiAgZnB1dHMoIlxuRkxPVFRFUiBuZWVkZWRcdCIsIHN0ZG91dCk7CiAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0lOUFVUKTsKICBwdXRzKCIgZm9yIHRoZSBpbnB1dC4iKTsKICBmcHV0cygiXHRcdCIsIHN0ZG91dCk7CiAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0NORik7CiAgZnB1dHMoIiBmb3IgdGhlICBDTkYgdHJhbnNsYXRpb24uIiwgc3Rkb3V0KTsKICAKCiAgaWYgKE91dHB1dCAhPSBzdGRvdXQpCiAgICBtaXNjX0Nsb3NlRmlsZShPdXRwdXQsYXJndltvcHRzX0luZGljYXRvcigpKzFdKTsKICBtZW1vcnlfRnJlZShkZXNjcmlwdGlvbiwgc2l6ZW9mKGNoYXIpKnNpemUpOwp9CgpzdGF0aWMgQk9PTCB0b3BfQ2FsbGVkRmxvdHRlcihjb25zdCBjaGFyKiBDYWxsKQp7CiAgaW50IGxlbmd0aDsKICBsZW5ndGggPSBzdHJsZW4oQ2FsbCk7CiAgcmV0dXJuIHN0cmluZ19FcXVhbCgoQ2FsbCArIChsZW5ndGggPiA3ID8gbGVuZ3RoIC0gNyA6IDApKSwgIkZMT1RURVIiKTsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIE1haW4gRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkKewogIExJU1QgICAgICAgICAgICAgIElucHV0Q2xhdXNlcyxTY2FuLEF4aW9tcyxDb25qZWN0dXJlcywgU29ydHMsIFF1ZXJ5Q2xhdXNlcywgCiAgICBMYWJlbENsYXVzZXMsIFF1ZXJ5UGFpciwgUHJvYmxlbUNsYXVzZXMsIExhYmVsbGlzdCwgU29ydGxhYmVsbGlzdCwgCiAgICBTeW1ibGlzdCwgVXNlclByZWNlZGVuY2U7CiAgUFJPT0ZTRUFSQ0ggICAgICAgU2VhcmNoLCBGbG90dGVyU2VhcmNoOwogIC8qIDxJbnB1dEZsYWdzPiBhcmUgdGhlIGZsYWdzIGZyb20gdGhlIHByb2JsZW0gZmlsZSBhbmQgdGhlIGNvbW1hbmQgbGluZS4gKi8KICBGTEFHU1RPUkUgICAgICAgICBJbnB1dEZsYWdzLCBGbGFnczsKICAvKiA8SW5wdXRQcmVjZWRlbmNlPiBpcyB0aGUgcHJlY2VkZW5jZSBhZnRlciByZWFkaW5nIHRoZSBwcm9ibGVtIGZpbGUuICovCiAgUFJFQ0VERU5DRSAgICAgICAgSW5wdXRQcmVjZWRlbmNlLCBQcmVjZWRlbmNlOwogIEZJTEUqICAgICAgICAgICAgIElucHV0U3RyZWFtOyAKICBIQVNIICAgICAgICAgICAgICBUZXJtTGFiZWxUb0NsYXVzZWxpc3QsIENsYXVzZVRvVGVybUxhYmVsbGlzdDsKICB0b3BfU0VBUkNIUkVTVUxUICBSZXN1bHQ7CgogIFNlYXJjaCA9IChQUk9PRlNFQVJDSClOVUxMOwogIAojaWYgKGRlZmluZWQoU1BBU1NfU0lHTkFMUykpCiAgdG9wX1BST09GU0VBUkNIID0gJlNlYXJjaDsKICBzaWduYWwoU0lHSU5ULCB0b3BfU2lnSGFuZGxlcik7CiAgc2lnbmFsKFNJR1RFUk0sIHRvcF9TaWdIYW5kbGVyKTsKICBzaWduYWwoU0lHU0VHViwgdG9wX1NpZ0hhbmRsZXIpOwogIHNpZ25hbChTSUdCVVMsIHRvcF9TaWdIYW5kbGVyKTsKI2VuZGlmCgogIGNsb2NrX0luaXQoKTsKICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfT1ZFUkFMTCk7CiAgbWVtb3J5X0luaXQobWVtb3J5X19VTkxJTUlURUQpOwogIGF0ZXhpdChtZW1vcnlfRnJlZUFsbE1lbSk7CiAgc3ltYm9sX0luaXQoVFJVRSk7CiAgc3RhY2tfSW5pdCgpOwogIGhhc2hfSW5pdCgpOwogIHNvcnRfSW5pdCgpOwogIHRlcm1fSW5pdCgpOwoKICBJbnB1dFByZWNlZGVuY2UgPSBzeW1ib2xfQ3JlYXRlUHJlY2VkZW5jZSgpOwogIGZvbF9Jbml0KFRSVUUsIElucHV0UHJlY2VkZW5jZSk7CiAgY29udF9Jbml0KCk7CiAgdW5pZnlfSW5pdCgpOwogIGZsYWdfSW5pdCgpOwogIHN1YnNfSW5pdCgpOwogIGNsYXVzZV9Jbml0KCk7CiAgcmVkX0luaXQoKTsKICByZW5fSW5pdCgpOwogIGRwX0luaXQoKTsKICBvcHRzX0luaXQoKTsKICBhbmFfSW5pdCgpOwogIGNjX0luaXQoKTsKCiAgLyogQnVpbGQgcHJvb2Ygc2VhcmNoIG9iamVjdCB0byBzdG9yZSBkZWZpbml0aW9ucyBpbiAqLwogIFNlYXJjaCAgICAgID0gcHJmc19DcmVhdGUoKTsKICBJbnB1dEZsYWdzICA9IGZsYWdfQ3JlYXRlU3RvcmUoKTsKCiAgLyogZGVjbGFyZSBhbGwgb3B0aW9ucyAqLwogIG9wdHNfRGVjbGFyZVNQQVNTRmxhZ3NBc09wdGlvbnMoKTsKICB0b3BfUmVtb3ZlRmlsZU9wdElkID0gb3B0c19EZWNsYXJlKCJyZiIsIG9wdHNfTk9BUkdUWVBFKTsKCiAgaWYgKCFvcHRzX1JlYWQoYXJnYywgYXJndikpIAogICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKCiAgIC8qIENoZWNrIHdoZXRoZXIgZmxhZ19TVERJTiBpcyBzZXQgaW4gdGhlIGNvbW1hbmQgbGluZSAqLwogIGZsYWdfSW5pdFN0b3JlQnlEZWZhdWx0cyhJbnB1dEZsYWdzKTsKICBvcHRzX1NldEZsYWdzKElucHV0RmxhZ3MpOwoKICBpZiAoYXJnYyA8IG9wdHNfSW5kaWNhdG9yKCkrMSAmJiAhZmxhZ19HZXRGbGFnVmFsdWUoSW5wdXRGbGFncyxmbGFnX1NURElOKSkgewogICAgLyogTm8gaW5wdXQgZmlsZSwgbm8gc3RkaW4gaW5wdXQgKi8KICAgIHByaW50ZigiXG5cdCAgICAgICAgICAlcyAlcyIsYXJndlswXSxtaXNjX1ZFUlNJT04pOwogICAgaWYgKHRvcF9DYWxsZWRGbG90dGVyKGFyZ3ZbMF0pIHx8CglmbGFnX0dldEZsYWdWYWx1ZShJbnB1dEZsYWdzLCBmbGFnX0ZMT1RURVIpKQogICAgICBwdXRzKCJcblx0ICAgICAgIFVzYWdlOiBGTE9UVEVSIFtvcHRpb25zXSBbPGlucHV0LWZpbGU+XSBbPG91dHB1dC1maWxlPl1cbiIpOwogICAgZWxzZQogICAgICBwdXRzKCJcblx0ICAgICAgIFVzYWdlOiBTUEFTUyBbb3B0aW9uc10gWzxpbnB1dC1maWxlPl0gXG4iKTsKICAgIHB1dHMoIlBvc3NpYmxlIG9wdGlvbnM6XG4iKTsKICAgIG9wdHNfUHJpbnRTUEFTU05hbWVzKCk7IAogICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICB9CiAgRmxvdHRlclNlYXJjaCA9IE5VTEw7CgogIEF4aW9tcyA9IENvbmplY3R1cmVzID0gU29ydHMgPSBMYWJlbGxpc3QgPSBTb3J0bGFiZWxsaXN0ID0gVXNlclByZWNlZGVuY2UgPSBsaXN0X05pbCgpOwogIAogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShJbnB1dEZsYWdzLCBmbGFnX1NURElOKSkgewogICAgdG9wX0lucHV0RmlsZSA9IChjaGFyKilOVUxMOwogICAgSW5wdXRTdHJlYW0gICA9IHN0ZGluOwogIH0gZWxzZSB7CiAgICB0b3BfSW5wdXRGaWxlID0gYXJndltvcHRzX0luZGljYXRvcigpXTsKICAgIElucHV0U3RyZWFtID0gbWlzY19PcGVuRmlsZSh0b3BfSW5wdXRGaWxlLCAiciIpOwogIH0KICAKICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfSU5QVVQpOwogIGZsYWdfQ2xlYW5TdG9yZShJbnB1dEZsYWdzKTsgIC8qIE1hcmsgYWxsIGZsYWdzIGFzIHVuc2V0ICovCgogIC8qIE5vdyBhZGQgZmxhZ3MgZnJvbSBmaWxlIHRvIElucHV0RmxhZ3MgYW5kIHNldCBwcmVjZWRlbmNlICovCiAgSW5wdXRDbGF1c2VzID0gZGZnX0RGR1BhcnNlcihJbnB1dFN0cmVhbSwgSW5wdXRGbGFncywgSW5wdXRQcmVjZWRlbmNlLCAmQXhpb21zLAoJCQkgICAgICAgJkNvbmplY3R1cmVzLCAmU29ydHMsICZVc2VyUHJlY2VkZW5jZSk7IAoKICAvKiBBZGQvb3ZlcndyaXRlIHdpdGggY29tbWFuZCBsaW5lIGZsYWdzICovCiAgb3B0c19TZXRGbGFncyhJbnB1dEZsYWdzKTsKICBGbGFncyAgICAgID0gcHJmc19TdG9yZShTZWFyY2gpOwogIFByZWNlZGVuY2UgPSBwcmZzX1ByZWNlZGVuY2UoU2VhcmNoKTsKICAvKiBUaGUgRmxhZ3Mgd2VyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBkZWZhdWx0IGZsYWcgdmFsdWVzLiAgKi8KICAvKiBUaGlzIHZhbHVlcyBhcmUgbm93IG92ZXJ3cml0dGVuIGJ5IGNvbW1hbmQgbGluZSBmbGFncyBhbmQgZmxhZ3MgKi8KICAvKiBmcm9tIHRoZSBpbnB1dCBmaWxlLiAqLwogIGZsYWdfVHJhbnNmZXJTZXRGbGFncyhJbnB1dEZsYWdzLCBGbGFncyk7CiAgLyogRnJvbSBub3cgb24gdGhlIGlucHV0IGZsYWdzIGFyZSBub3QgY2hhbmdlZCEgKi8KCiAgLyogVHJhbnNmZXIgaW5wdXQgcHJlY2VkZW5jZSB0byBzZWFyY2ggb2JqZWN0ICovCiAgc3ltYm9sX1RyYW5zZmVyUHJlY2VkZW5jZShJbnB1dFByZWNlZGVuY2UsIFByZWNlZGVuY2UpOwoKCiAgLyogQ29tcGxhaW4gYWJvdXQgbWlzc2luZyBpbnB1dCBjbGF1c2VzL2Zvcm11bGFlIHdoZW4gaW4gKi8KICAvKiBub24taW50ZXJhY3RpdmUgbW9kZSAqLwogIGlmICghZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfSU5URVJBQ1RJVkUpICYmIGxpc3RfRW1wdHkoQXhpb21zKSAmJgogICAgICBsaXN0X0VtcHR5KENvbmplY3R1cmVzKSAmJiBsaXN0X0VtcHR5KElucHV0Q2xhdXNlcykpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBObyBmb3JtdWxhZSBhbmQgY2xhdXNlcyBmb3VuZCBpbiBpbnB1dCBmaWxlIVxuIik7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgY25mX0luaXQoRmxhZ3MpOyAgLyogRGVwZW5kcyBvbiBTdHJvbmcgU2tvbGVtaXphdGlvbiBGbGFnICovCgogIC8qIERvY1Byb29mIGlzIHJlcXVpcmVkIGZvciBpbnRlcmFjdGl2ZSBtb2RlICovCiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0lOVEVSQUNUSVZFKSkgewogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YsIGZsYWdfRE9DUFJPT0ZPTik7CiAgfQoKICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpKQogICAgcHJmc19BZGREb2NQcm9vZlNoYXJpbmdJbmRleChTZWFyY2gpOwoKICAvKiBDcmVhdGUgbmVjZXNzYXJ5IGhhc2hhcnJheXMgKi8KICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpKSB7CiAgICBUZXJtTGFiZWxUb0NsYXVzZWxpc3QgPSBoc2hfQ3JlYXRlKCk7CiAgICBDbGF1c2VUb1Rlcm1MYWJlbGxpc3QgPSBoc2hfQ3JlYXRlKCk7CiAgfQogIGVsc2UgewogICAgVGVybUxhYmVsVG9DbGF1c2VsaXN0ID0gTlVMTDsKICAgIENsYXVzZVRvVGVybUxhYmVsbGlzdCA9IE5VTEw7CiAgfQogIAogIC8qIEJ1aWxkIGNvbmplY3R1cmUgZm9ybXVsYSBhbmQgbmVnYXRlIGl0OiBDb25qZWN0dXJlcyBhcmUgdGFrZW4gZGlzanVuY3RpdmVseSEhKi8KICBmb3IgKFNjYW4gPSBDb25qZWN0dXJlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkKICAgIGxpc3RfUnBsYWNkKGxpc3RfQ2FyKFNjYW4pLCAoTElTVCl0ZXJtX0NyZWF0ZShmb2xfTm90KCksIAoJCQkJCQkgIGxpc3RfTGlzdChsaXN0X1BhaXJTZWNvbmQobGlzdF9DYXIoU2NhbikpKSkpOwoKICBjbG9ja19TdG9wUGFzc2VkVGltZShjbG9ja19JTlBVVCk7CgogIGlmICh0b3BfSW5wdXRGaWxlKSB7CiAgICBtaXNjX0Nsb3NlRmlsZShJbnB1dFN0cmVhbSx0b3BfSW5wdXRGaWxlKTsKICAgIGlmIChvcHRzX0lzU2V0KHRvcF9SZW1vdmVGaWxlT3B0SWQpKQogICAgICByZW1vdmUodG9wX0lucHV0RmlsZSk7CiAgfQoKICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfQ05GKTsKCiAgaWYgKGxpc3RfRW1wdHkoSW5wdXRDbGF1c2VzKSkgewogICAgTkFUIFRlcm1jb3VudDsKCiAgICBUZXJtY291bnQgID0gMDsKICAgIAogICAgLyogQ3JlYXRlIGxhYmVscyBmb3IgZm9ybXVsYWUgd2l0aG91dCB0aGVtICovCiAgICBmb3IgKFNjYW4gPSBBeGlvbXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbiksIFRlcm1jb3VudCsrKSB7CiAgICAgIGlmIChsaXN0X1BhaXJGaXJzdChsaXN0X0NhcihTY2FuKSkgPT0gTlVMTCkgewoJY2hhciBMWzEwMF07CgljaGFyKiBMYWJlbDsKCXNwcmludGYoTCwgImF4aW9tJWQiLCBUZXJtY291bnQpOwoJTGFiZWwgPSBzdHJpbmdfU3RyaW5nQ29weShMKTsKCWxpc3RfUnBsYWNhKGxpc3RfQ2FyKFNjYW4pLCBMYWJlbCk7CglpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpICYmCgkgICAgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUExBQkVMUykpIHsKCSAgcHJpbnRmKCJcbkFkZGVkIGxhYmVsICVzIGZvciBheGlvbSBcbiIsIExhYmVsKTsKCSAgZm9sX1ByZXR0eVByaW50REZHKChURVJNKSBsaXN0X1BhaXJTZWNvbmQobGlzdF9DYXIoU2NhbikpKTsKCX0KICAgICAgfQogICAgfQogICAgVGVybWNvdW50ICA9IDA7CiAgICBmb3IgKFNjYW4gPSBTb3J0czsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgICBjaGFyIExbMTAwXTsKICAgICAgY2hhciogTGFiZWw7CiAgICAgIHNwcmludGYoTCwgImRlY2xhcmF0aW9uJWQiLCBUZXJtY291bnQpOwogICAgICBMYWJlbCA9IHN0cmluZ19TdHJpbmdDb3B5KEwpOwogICAgICBsaXN0X1JwbGFjYShsaXN0X0NhcihTY2FuKSwgTGFiZWwpOwogICAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpICYmCgkgIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BMQUJFTFMpKSB7CglwcmludGYoIlxuQWRkZWQgbGFiZWwgJXMgZm9yIGRlY2xhcmF0aW9uIFxuIiwgTGFiZWwpOwoJZm9sX1ByZXR0eVByaW50REZHKChURVJNKSBsaXN0X1BhaXJTZWNvbmQobGlzdF9DYXIoU2NhbikpKTsKICAgICAgfQogICAgICBTb3J0bGFiZWxsaXN0ID0gbGlzdF9Db25zKExhYmVsLCBTb3J0bGFiZWxsaXN0KTsKICAgIH0KICAgIEF4aW9tcyA9IGxpc3RfTmNvbmMoQXhpb21zLCBTb3J0cyk7CgoKICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19BUFBMWURFRlMpICE9IGZsYWdfQVBQTFlERUZTT0ZGKSB7CiAgICAgIGRlZl9FeHRyYWN0RGVmc0Zyb21UZXJtbGlzdChTZWFyY2gsIEF4aW9tcywgQ29uamVjdHVyZXMpOyAKICAgICAgQ29uamVjdHVyZXMgPSBkZWZfQXBwbHlEZWZpbml0aW9uVG9UZXJtTGlzdChwcmZzX0RlZmluaXRpb25zKFNlYXJjaCksCgkJCQkJCSAgQ29uamVjdHVyZXMsIEZsYWdzLAoJCQkJCQkgIFByZWNlZGVuY2UpOwogICAgfQoKICAgIC8qIFdlIG11c3Qga2VlcCB0aGUgbGlzdCBvZiBzeW1ib2xzIGJlY2F1c2UgdGhleSBjYW4ndCBiZSBmcmVlZCBpbiBjbmZfRmxvdHRlciAqLwogICAgU3ltYmxpc3QgPSBsaXN0X05pbCgpOwoKICAgIC8qIEF4aW9tcyBpcyBsaXN0IG9mIHBhaXJzLCBjb25qZWN0dXJlcyBpcyBsaXN0IG9mIHRlcm1zICovCiAgICAvKiBBIFByb29mU2VhcmNoIG9iamVjdCBpcyBvbmx5IHJldHVybmVkIGFuZCB0aGUgc3ltYm9scyBrZXB0IGluIFN5bWJsaXN0CiAgICAgICBpZiBmbGFnX0lOVEVSQUNUSVZFIGlzIHNldCAqLwogICAgRmxvdHRlclNlYXJjaCA9IGNuZl9GbG90dGVyKEF4aW9tcyxDb25qZWN0dXJlcywmSW5wdXRDbGF1c2VzLCAmTGFiZWxsaXN0LAoJCQkJVGVybUxhYmVsVG9DbGF1c2VsaXN0LCBDbGF1c2VUb1Rlcm1MYWJlbGxpc3QsCgkJCQlGbGFncywgUHJlY2VkZW5jZSwgJlN5bWJsaXN0KTsKCiAgICBJbnB1dENsYXVzZXMgPSBjbGF1c2VfTGlzdFNvcnRXZWlnaGVkKElucHV0Q2xhdXNlcyk7CiAgICBjbGF1c2VfU2V0Q291bnRlcigxKTsKICAgIGZvciAoU2NhbiA9IElucHV0Q2xhdXNlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgICBjbGF1c2VfTmV3TnVtYmVyKGxpc3RfQ2FyKFNjYW4pKTsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBkZmdfRGVsZXRlRm9ybXVsYVBhaXJMaXN0KEF4aW9tcyk7CiAgICBkZmdfRGVsZXRlRm9ybXVsYVBhaXJMaXN0KFNvcnRzKTsKICAgIGRmZ19EZWxldGVGb3JtdWxhUGFpckxpc3QoQ29uamVjdHVyZXMpOwogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0FQUExZREVGUykgIT0gZmxhZ19BUFBMWURFRlNPRkYpIHsKICAgICAgLyogRXh0cmFjdCBsaXN0IG9mIGRlZmluaXRpb25zICovCiAgICAgIGRlZl9FeHRyYWN0RGVmc0Zyb21DbGF1c2VsaXN0KFNlYXJjaCwgSW5wdXRDbGF1c2VzKTsKICAgICAgZGVmX0ZsYXR0ZW5EZWZpbml0aW9uc0Rlc3RydWN0aXZlKFNlYXJjaCk7CiAgICAgIGZvciAoU2Nhbj1wcmZzX0RlZmluaXRpb25zKFNlYXJjaCk7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKQoJSW5wdXRDbGF1c2VzID0gZGVmX0FwcGx5RGVmVG9DbGF1c2VsaXN0KFNlYXJjaCwgKERFRikgbGlzdF9DYXIoU2NhbiksCgkJCQkJCUlucHV0Q2xhdXNlcywgVFJVRSk7CiAgICB9CiAgfQoKICBjbG9ja19TdG9wUGFzc2VkVGltZShjbG9ja19DTkYpOwoKICBpZiAodG9wX0NhbGxlZEZsb3R0ZXIoYXJndlswXSkgfHwgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRkxPVFRFUikpIHsKICAgIHRvcF9GbG90dGVyKGFyZ2MsYXJndixJbnB1dENsYXVzZXMpOwogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfVElNRUxJTUlULCAgIDApOyAgICAgICAvKiBFeGl0IE5vIE91dHB1dCAqLwogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfSU5URVJBQ1RJVkUsIGZsYWdfSU5URVJBQ1RJVkVPRkYpOwogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFBST0JMRU0sICAgIGZsYWdfUFBST0JMRU1PRkYpOwogIH0KCiAgbWVtb3J5X1Jlc3RyaWN0KGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX01FTU9SWSkpOwoKICBkbyB7CiAgICBMSVNUIGRlZmxpc3Q7CiAgICBpbnQgIEJvdW5kQXBwbGllZDsKICAgIFByb2JsZW1DbGF1c2VzID0gbGlzdF9OaWwoKTsKICAgIExhYmVsQ2xhdXNlcyAgID0gbGlzdF9OaWwoKTsKICAgIFJlc3VsdCAgICAgICAgID0gdG9wX1JFU09VUkNFOwoKICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19JTlRFUkFDVElWRSkpIHsKICAgICAgUXVlcnlQYWlyID0gaWFfR2V0TmV4dFJlcXVlc3QoSW5wdXRTdHJlYW0sIEZsYWdzKTsKICAgICAgLyogQSBwYWlyICg8Zm9ybXVsYSxsYWJlbGxpc3Q+KSAqLwogICAgICAvKiBHZXQgbGlzdCBvZiBjbGF1c2VzIGRlcml2YWJsZSBmcm9tIGZvcm11bGFlIHdpdGggbGFiZWxzIGluIGxhYmVsbGlzdCAqLwogICAgICBpZiAobGlzdF9FbXB0eShRdWVyeVBhaXIpKSB7CglicmVhazsKICAgICAgfQogICAgICBmb3IgKFNjYW49bGlzdF9QYWlyU2Vjb25kKFF1ZXJ5UGFpcik7IWxpc3RfRW1wdHkoU2Nhbik7U2Nhbj1saXN0X0NkcihTY2FuKSkgewoJTElTVCBsOwoJbCA9IGhzaF9HZXRXaXRoQ29tcGFyZUZ1bmMoVGVybUxhYmVsVG9DbGF1c2VsaXN0LCBsaXN0X0NhcihTY2FuKSwKCQkJCSAgIChCT09MICgqKShQT0lOVEVSLCBQT0lOVEVSKSkgY25mX0xhYmVsRXF1YWwsCgkJCQkgICAodW5zaWduZWQgbG9uZyAoKikoUE9JTlRFUikpIGhzaF9TdHJpbmdIYXNoS2V5KTsKCglsID0gbGlzdF9Qb2ludGVyRGVsZXRlRHVwbGljYXRlcyhsaXN0X0NvcHkobCkpOwoJTGFiZWxDbGF1c2VzID0gbGlzdF9OY29uYyhsLCBMYWJlbENsYXVzZXMpOwogICAgICB9CiAgICAgIC8qIEdldCBsaXN0IG9mIGNsYXVzZXMgZGVyaXZhYmxlIGZyb20gc29ydHMgKi8KICAgICAgZm9yIChTY2FuPVNvcnRsYWJlbGxpc3Q7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKSB7CglMSVNUIGw7CglsID0gaHNoX0dldFdpdGhDb21wYXJlRnVuYyhUZXJtTGFiZWxUb0NsYXVzZWxpc3QsIGxpc3RfQ2FyKFNjYW4pLAoJCQkJICAgKEJPT0wgKCopKFBPSU5URVIsIFBPSU5URVIpKSBjbmZfTGFiZWxFcXVhbCwKCQkJCSAgICh1bnNpZ25lZCBsb25nICgqKShQT0lOVEVSKSkgaHNoX1N0cmluZ0hhc2hLZXkpOwoKCWwgPSBsaXN0X1BvaW50ZXJEZWxldGVEdXBsaWNhdGVzKGxpc3RfQ29weShsKSk7CglMYWJlbENsYXVzZXMgPSBsaXN0X05jb25jKGwsIExhYmVsQ2xhdXNlcyk7CiAgICAgIH0JCgogICAgICAvKiBGb3IgbGFiZWxjbGF1c2VzIGNvcGllcyBhcmUgaW50cm9kdWNlZCAqLwogICAgICAvKiBTbyBhbiB1cGRhdGUgdG8gdGhlIGNsYXVzZSB0byB0ZXJtIG1hcHBpbmcgaXMgbmVjZXNzYXJ5ICovCiAgICAgIGZvciAoU2Nhbj1MYWJlbENsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKSB7CglDTEFVU0UgQzsKCUxJU1QgbDsKCUMgPSAoQ0xBVVNFKSBsaXN0X0NhcihTY2FuKTsKCWwgPSBsaXN0X0NvcHkoaHNoX0dldChDbGF1c2VUb1Rlcm1MYWJlbGxpc3QsIEMpKTsKCWwgPSBjbmZfRGVsZXRlRHVwbGljYXRlTGFiZWxzRnJvbUxpc3QobCk7CglsaXN0X1JwbGFjYShTY2FuLCBjbGF1c2VfQ29weShDKSk7Cgloc2hfUHV0TGlzdChDbGF1c2VUb1Rlcm1MYWJlbGxpc3QsIGxpc3RfQ2FyKFNjYW4pLCBsKTsKICAgICAgfQogICAgICBRdWVyeUNsYXVzZXMgICA9IGNuZl9RdWVyeUZsb3R0ZXIoRmxvdHRlclNlYXJjaCwgbGlzdF9QYWlyRmlyc3QoUXVlcnlQYWlyKSwKCQkJCQkmU3ltYmxpc3QpOwogICAgICBQcm9ibGVtQ2xhdXNlcyA9IGxpc3RfTmNvbmMoUXVlcnlDbGF1c2VzLCBMYWJlbENsYXVzZXMpOwoKICAgICAgZm9yIChTY2FuPWxpc3RfUGFpclNlY29uZChRdWVyeVBhaXIpOyAhbGlzdF9FbXB0eShTY2FuKTsgU2Nhbj0gbGlzdF9DZHIoU2NhbikpCglzdHJpbmdfU3RyaW5nRnJlZShsaXN0X0NhcihTY2FuKSk7IC8qIEZyZWUgdGhlIGxhYmVsIHN0cmluZ3MgKi8KICAgICAgbGlzdF9EZWxldGUobGlzdF9QYWlyU2Vjb25kKFF1ZXJ5UGFpcikpOwogICAgICBsaXN0X1BhaXJGcmVlKFF1ZXJ5UGFpcik7CiAgICAgIGNsb2NrX0luaXRDb3VudGVyKGNsb2NrX09WRVJBTEwpOwogICAgICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfT1ZFUkFMTCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgUHJvYmxlbUNsYXVzZXMgPSBJbnB1dENsYXVzZXM7CiAgICAgIElucHV0Q2xhdXNlcyAgID0gbGlzdF9OaWwoKTsKICAgIH0KCgogICAgcHJmc19TZXRTcGxpdENvdW50ZXIoU2VhcmNoLGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1NQTElUUykpOwogICAgcHJmc19TZXRMb29wcyhTZWFyY2gsZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfTE9PUFMpKTsKICAgIHByZnNfU2V0QmFja3RyYWNrZWRDbGF1c2VzKFNlYXJjaCwgMCk7CiAgICBCb3VuZEFwcGxpZWQgPSAtMTsKICAgIFNlYXJjaCA9IHRvcF9Qcm9vZlNlYXJjaChTZWFyY2gsIFByb2JsZW1DbGF1c2VzLCBJbnB1dEZsYWdzLCBVc2VyUHJlY2VkZW5jZSwgJkJvdW5kQXBwbGllZCk7CiAgCiAgICBpZiAoKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1RJTUVMSU1JVCkgPT0gZmxhZ19USU1FTElNSVRVTkxJTUlURUQgfHwKCSBmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19USU1FTElNSVQpID4gY2xvY2tfR2V0U2Vjb25kcyhjbG9ja19PVkVSQUxMKSkgJiYKCXByZnNfTG9vcHMoU2VhcmNoKSAhPSAwICYmCgkoQm91bmRBcHBsaWVkID09IC0xIHx8ICFsaXN0X0VtcHR5KHByZnNfRW1wdHlDbGF1c2VzKFNlYXJjaCkpKSkgewogICAgICBpZiAobGlzdF9FbXB0eShwcmZzX0VtcHR5Q2xhdXNlcyhTZWFyY2gpKSkKCVJlc3VsdCA9IHRvcF9DT01QTEVUSU9OOwogICAgICBlbHNlCglSZXN1bHQgPSB0b3BfUFJPT0Y7CiAgICB9CiAgIAogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1RJTUVMSU1JVCkgIT0gMCkgewogICAgICAvKiBTdG9wIFNQQVNTIGltbWVkaWF0ZWx5ICovCiAgICAgIHByaW50ZigiXG5TUEFTUyAlcyAiLCBtaXNjX1ZFUlNJT04pOwogICAgICBmcHV0cygiXG5TUEFTUyBiZWlzZWl0ZTogIiwgc3Rkb3V0KTsKICAgICAgc3dpdGNoIChSZXN1bHQpIHsKICAgICAgY2FzZSB0b3BfUkVTT1VSQ0U6CglpZiAocHJmc19Mb29wcyhTZWFyY2gpICE9IDApCgkgIGZwdXRzKCJSYW4gb3V0IG9mIHRpbWUuIiwgc3Rkb3V0KTsKCWVsc2UKCSAgZnB1dHMoIk1heGltYWwgbnVtYmVyIG9mIGxvb3BzIGV4Y2VlZGVkLiIsIHN0ZG91dCk7CglicmVhazsKICAgICAgY2FzZSB0b3BfUFJPT0Y6CglmcHV0cygiUHJvb2YgZm91bmQuIiwgc3Rkb3V0KTsKCWJyZWFrOwogICAgICBkZWZhdWx0OiAgICAgICAgLyogQ29tcGxldGlvbiAqLwoJZnB1dHMoIkNvbXBsZXRpb24gZm91bmQuIiwgc3Rkb3V0KTsKICAgICAgfQogICAgICBwcmludGYoIlxuUHJvYmxlbTogJXMgIiwKCSAgICAgKHRvcF9JbnB1dEZpbGUgIT0gKGNoYXIqKU5VTEwgPyBteWJhc2VuYW1lKHRvcF9JbnB1dEZpbGUpIDogIlJlYWQgZnJvbSBzdGRpbi4iKSk7CiAgICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QU1RBVElTVElDKSkgewoJY2xvY2tfU3RvcFBhc3NlZFRpbWUoY2xvY2tfT1ZFUkFMTCk7CglwcmludGYoIlxuU1BBU1MgZGVyaXZlZCAlZCBjbGF1c2VzLCIsIHByZnNfRGVyaXZlZENsYXVzZXMoU2VhcmNoKSk7CglwcmludGYoIiBiYWNrdHJhY2tlZCAlZCBjbGF1c2VzIiwgcHJmc19CYWNrdHJhY2tlZENsYXVzZXMoU2VhcmNoKSk7CglwcmludGYoIiBhbmQga2VwdCAlZCBjbGF1c2VzLiIsIHByZnNfS2VwdENsYXVzZXMoU2VhcmNoKSk7CglmcHV0cygiXG5TUEFTUyBzcGVudFx0Iiwgc3Rkb3V0KTsKCWNsb2NrX1ByaW50VGltZShjbG9ja19PVkVSQUxMKTsKCWZwdXRzKCIgb24gdGhlIHByb2JsZW0uXG5cdFx0Iiwgc3Rkb3V0KTsKCWNsb2NrX1ByaW50VGltZShjbG9ja19JTlBVVCk7CglmcHV0cygiIGZvciB0aGUgaW5wdXQuXG5cdFx0Iiwgc3Rkb3V0KTsKCWNsb2NrX1ByaW50VGltZShjbG9ja19DTkYpOwoJZnB1dHMoIiBmb3IgdGhlIEZMT1RURVIgQ05GIHRyYW5zbGF0aW9uLlxuXHRcdCIsIHN0ZG91dCk7CgljbG9ja19QcmludFRpbWUoY2xvY2tfSU5GRVJFTkNFKTsKCWZwdXRzKCIgZm9yIGluZmVyZW5jZXMuXG5cdFx0Iiwgc3Rkb3V0KTsKICAgICAgICBjbG9ja19QcmludFRpbWUoY2xvY2tfQkFDS1RSQUNLKTsKCWZwdXRzKCIgZm9yIHRoZSBiYWNrdHJhY2tpbmcuXG5cdFx0Iiwgc3Rkb3V0KTsKCWNsb2NrX1ByaW50VGltZShjbG9ja19SRURVQ1RJT04pOwoJcHV0cygiIGZvciB0aGUgcmVkdWN0aW9uLiIpOwogICAgICB9CiAgICAgIGlmIChSZXN1bHQgIT0gdG9wX1BST09GICYmCgkgIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0ZQTU9ERUwpICE9IGZsYWdfRlBNT0RFTE9GRikgewoJRklMRSAqT3V0cHV0OwoJY2hhciBuYW1lWzEwMF07Cgljb25zdCBjaGFyICogY3JlYXRvciA9ICJ7KlNQQVNTICIgbWlzY19WRVJTSU9OICIgKn0iOwoJQk9PTCBQcmludFBvdFByb2R1Y3RpdmU7CgoJc3RyY3B5KG5hbWUsICh0b3BfSW5wdXRGaWxlICE9IChjaGFyKilOVUxMID8gdG9wX0lucHV0RmlsZSA6ICJTUEFTUyIpKTsKCWlmIChSZXN1bHQgPT0gdG9wX0NPTVBMRVRJT04pCgkgIHN0cmNhdChuYW1lLCAiLm1vZGVsIik7CgllbHNlCgkgIHN0cmNhdChuYW1lLCAiLmNsYXVzZXMiKTsKCU91dHB1dCA9IG1pc2NfT3BlbkZpbGUobmFtZSwidyIpOwoJUHJpbnRQb3RQcm9kdWN0aXZlID0gKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0ZQTU9ERUwpID09CgkJCSAgICAgIGZsYWdfRlBNT0RFTFBPVEVOVElBTExZUFJPRFVDVElWRUNMQVVTRVMpOwoJaWYgKFJlc3VsdCA9PSB0b3BfQ09NUExFVElPTikKCSAgY2xhdXNlX0ZQcmludENuZkZvcm11bGFzREZHUHJvYmxlbShPdXRwdXQsIFByaW50UG90UHJvZHVjdGl2ZSwKCQkJCQkgICAgICJ7KkNvbXBsZXRpb25fYnlfU1BBU1MqfSIsCgkJCQkJICAgICBjcmVhdG9yLCAic2F0aXNmaWFibGUiLAoJCQkJCSAgICAgZGZnX1Byb2JsZW1EZXNjcmlwdGlvbigpLAoJCQkJCSAgICAgcHJmc19Xb3JrZWRPZmZDbGF1c2VzKFNlYXJjaCksCgkJCQkJICAgICBsaXN0X05pbCgpLCBGbGFncywgUHJlY2VkZW5jZSk7CgllbHNlCgkgIGNsYXVzZV9GUHJpbnRDbmZGb3JtdWxhc0RGR1Byb2JsZW0oT3V0cHV0LCBQcmludFBvdFByb2R1Y3RpdmUsCgkJCQkJICAgICAieypDbGF1c2VzX2dlbmVyYXRlZF9ieV9TUEFTUyp9IiwKCQkJCQkgICAgIGNyZWF0b3IsICJ1bmtub3duIiwKCQkJCQkgICAgIGRmZ19Qcm9ibGVtRGVzY3JpcHRpb24oKSwKCQkJCQkgICAgIHByZnNfV29ya2VkT2ZmQ2xhdXNlcyhTZWFyY2gpLAoJCQkJCSAgICAgcHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksIEZsYWdzLAoJCQkJCSAgICAgUHJlY2VkZW5jZSk7CgltaXNjX0Nsb3NlRmlsZShPdXRwdXQsIG5hbWUpOwoJaWYgKFJlc3VsdCA9PSB0b3BfQ09NUExFVElPTikKCSAgcHJpbnRmKCJcbkNvbXBsZXRpb24gcHJpbnRlZCB0bzogJXNcbiIsIG5hbWUpOwoJZWxzZQoJICBwcmludGYoIlxuQ2xhdXNlcyBwcmludGVkIHRvOiAlc1xuIiwgbmFtZSk7CiAgICAgIH0KICAgIAogICAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpICYmIFJlc3VsdCAhPSB0b3BfUkVTT1VSQ0UpIHsKCWlmIChSZXN1bHQgPT0gdG9wX0NPTVBMRVRJT04pIHsKCSAgcHV0cygiXG5cbiBUaGUgc2F0dXJhdGVkIHNldCBvZiB3b3JrZWQtb2ZmIGNsYXVzZXMgaXMgOiIpOwoJICBjbGF1c2VfTGlzdFByaW50KHByZnNfV29ya2VkT2ZmQ2xhdXNlcyhTZWFyY2gpKTsKCX0KCWVsc2UgewoJICBMSVNUIFVzZWRDbGF1c2VzLCBVc2VkVGVybXM7CgkgIGlmICghdG9wX0lucHV0RmlsZSkKCSAgICB0b3BfSW5wdXRGaWxlID0gIlNQQVNTIjsKCSAgVXNlZENsYXVzZXMgPSBkcF9QcmludFByb29mKFNlYXJjaCwgcHJmc19FbXB0eUNsYXVzZXMoU2VhcmNoKSwKCQkJCSAgICAgIHRvcF9JbnB1dEZpbGUpOwoJICAvKiBGaW5kIHRlcm1zIHJlcXVpcmVkIGZvciBwcm9vZiAqLwoJICBVc2VkVGVybXMgPSBsaXN0X05pbCgpOwoKCSAgZm9yIChTY2FuID0gVXNlZENsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpCgkgICAgaWYgKGNsYXVzZV9Jc0Zyb21JbnB1dCgoQ0xBVVNFKSBsaXN0X0NhcihTY2FuKSkpIHsKCSAgICAgIExJU1QgTDsKCSAgICAgIEwgPSBoc2hfR2V0KENsYXVzZVRvVGVybUxhYmVsbGlzdCwgbGlzdF9DYXIoU2NhbikpOwoJICAgICAgTCA9IGxpc3RfQ29weShMKTsKCSAgICAgIEwgPSBjbmZfRGVsZXRlRHVwbGljYXRlTGFiZWxzRnJvbUxpc3QoTCk7CgkgICAgICBVc2VkVGVybXMgPSBsaXN0X05jb25jKFVzZWRUZXJtcywgTCk7CgkgICAgfQoJICBsaXN0X0RlbGV0ZShVc2VkQ2xhdXNlcyk7CgkgIFVzZWRUZXJtcyA9IGNuZl9EZWxldGVEdXBsaWNhdGVMYWJlbHNGcm9tTGlzdChVc2VkVGVybXMpOwoJICBmcHV0cygiXG5Gb3JtdWxhZSB1c2VkIGluIHRoZSBwcm9vZiA6Iiwgc3Rkb3V0KTsKCSAgZm9yIChTY2FuID0gVXNlZFRlcm1zOyAhbGlzdF9FbXB0eShTY2FuKTsgU2NhbiA9IGxpc3RfQ2RyKFNjYW4pKSAKCSAgICBpZiAoIShzdHJuY21wKChjaGFyKikgbGlzdF9DYXIoU2NhbiksICJfU09SVF8iLCA2KSA9PSAwKSkKCSAgICAgIHByaW50ZigiICVzIiwgKGNoYXIqKSBsaXN0X0NhcihTY2FuKSk7CgkgIHB1dGNoYXIoJ1xuJyk7CgkgIGxpc3RfRGVsZXRlKFVzZWRUZXJtcyk7Cgl9CiAgICAgIH0KICAgIH0KICAgIAogICAgLyogRGVsZXRlIG1hcHBpbmcgZm9yIHRoZSBjbGF1c2UgY29waWVzIG9mIHRoZSBsYWJlbGNsYXVzZXMgKi8KICAgIGZvciAoU2NhbiA9IExhYmVsQ2xhdXNlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW49bGlzdF9DZHIoU2NhbikpCiAgICAgIGhzaF9EZWxJdGVtKENsYXVzZVRvVGVybUxhYmVsbGlzdCwgbGlzdF9DYXIoU2NhbikpOwogICAgCiAgICBsaXN0X0RlbGV0ZShQcm9ibGVtQ2xhdXNlcyk7CiAKICAgIGZmbHVzaChzdGRvdXQpOwoKICAgIC8qIEtlZXAgZGVmaW5pdGlvbnMgKi8KICAgIGRlZmxpc3QgPSBwcmZzX0RlZmluaXRpb25zKFNlYXJjaCk7CiAgICBwcmZzX1NldERlZmluaXRpb25zKFNlYXJjaCwgbGlzdF9OaWwoKSk7CiAgICBwcmZzX0NsZWFuKFNlYXJjaCk7CiAgICBwcmZzX1NldERlZmluaXRpb25zKFNlYXJjaCwgZGVmbGlzdCk7CgogICAgc3ltYm9sX1RyYW5zZmVyUHJlY2VkZW5jZShJbnB1dFByZWNlZGVuY2UsIFByZWNlZGVuY2UpOwogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BQUk9CTEVNKSkKICAgICAgZnB1dHMoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TUEFTUy1TVE9QLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgc3Rkb3V0KTsKICB9IHdoaWxlIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19JTlRFUkFDVElWRSkgJiYKCSAgIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19USU1FTElNSVQpICE9IDApKTsKCiAgZm9yIChTY2FuID0gSW5wdXRDbGF1c2VzOyAhbGlzdF9FbXB0eShTY2FuKTsgU2Nhbj1saXN0X0NkcihTY2FuKSkKICAgIGNsYXVzZV9PcmllbnRBbmRSZUluaXQobGlzdF9DYXIoU2NhbiksIEZsYWdzLCBQcmVjZWRlbmNlKTsKCiAgLyogQ2xlYW51cCBGbG90dGVyIGRhdGEgc3RydWN0dXJlcyAqLwogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19JTlRFUkFDVElWRSkpIHsKICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19ET0NQUk9PRikpCiAgICAgIGxpc3RfRGVsZXRlKFN5bWJsaXN0KTsKICAgIGVsc2UgCiAgICAgIHN5bWJvbF9EZWxldGVTeW1ib2xMaXN0KFN5bWJsaXN0KTsKICAgIC8qICBzeW1ib2xfUmVzZXRTa29sZW1JbmRleCgpOyAqLwogICAgaWYgKEZsb3R0ZXJTZWFyY2ggIT0gTlVMTCkgCiAgICAgIHByZnNfRGVsZXRlKEZsb3R0ZXJTZWFyY2gpOwogIH0KICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUEZMQUdTKSkgewogICAgcHV0Y2hhcignXG4nKTsKICAgIGZsYWdfUHJpbnQoRmxhZ3MpOwogIH0KICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpKSB7CiAgICBoc2hfRGVsZXRlKFRlcm1MYWJlbFRvQ2xhdXNlbGlzdCk7CiAgICBoc2hfRGVsZXRlKENsYXVzZVRvVGVybUxhYmVsbGlzdCk7CiAgfQogIGZvciAoU2NhbiA9IExhYmVsbGlzdDsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkKICAgIHN0cmluZ19TdHJpbmdGcmVlKGxpc3RfQ2FyKFNjYW4pKTsKICBsaXN0X0RlbGV0ZShMYWJlbGxpc3QpOwogIGxpc3RfRGVsZXRlKFNvcnRsYWJlbGxpc3QpOwogIGxpc3RfRGVsZXRlKFVzZXJQcmVjZWRlbmNlKTsKCiAgY25mX0ZyZWUoRmxhZ3MpOwoKICBwcmZzX0RlbGV0ZShTZWFyY2gpOwogIGNsYXVzZV9EZWxldGVDbGF1c2VMaXN0KElucHV0Q2xhdXNlcyk7CiAgZmxhZ19EZWxldGVTdG9yZShJbnB1dEZsYWdzKTsKICBzeW1ib2xfRGVsZXRlUHJlY2VkZW5jZShJbnB1dFByZWNlZGVuY2UpOwoKICBjY19GcmVlKCk7CiAgYW5hX0ZyZWUoKTsKICBzb3J0X0ZyZWUoKTsKICB1bmlmeV9GcmVlKCk7CiAgY29udF9GcmVlKCk7CiAgZm9sX0ZyZWUoKTsKICBzeW1ib2xfRnJlZUFsbFN5bWJvbHMoKTsKICBkZmdfRnJlZSgpOwogIG9wdHNfRnJlZSgpOwojaWZkZWYgQ0hFQ0sKICBtZW1vcnlfUHJpbnQoKTsKICBtZW1vcnlfUHJpbnRMZWFrcygpOwojZW5kaWYKICBwdXRjaGFyKCdcbicpOwogIHJldHVybiAwOwp9Cg==