LyoKICogQ09NIHByb3h5L3N0dWIgZmFjdG9yeSAoQ1N0ZFBTRmFjdG9yeSkgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2luY2x1ZGUgIm9iamJhc2UuaCIKCiNpbmNsdWRlICJycGNwcm94eS5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlICJjcHNmLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChvbGUpOwoKc3RhdGljIEJPT0wgRmluZFByb3h5SW5mbyhjb25zdCBQcm94eUZpbGVJbmZvICoqcFByb3h5RmlsZUxpc3QsIFJFRklJRCByaWlkLCBjb25zdCBQcm94eUZpbGVJbmZvICoqcFByb3h5SW5mbywgaW50ICpwSW5kZXgpCnsKICB3aGlsZSAoKnBQcm94eUZpbGVMaXN0KSB7CiAgICBpZiAoKCpwUHJveHlGaWxlTGlzdCktPnBJSURMb29rdXBSdG4ocmlpZCwgcEluZGV4KSkgewogICAgICAqcFByb3h5SW5mbyA9ICpwUHJveHlGaWxlTGlzdDsKICAgICAgVFJBQ0UoImZvdW5kOiBQcm94eUluZm8gJXAgSW5kZXggJWRcbiIsICpwUHJveHlJbmZvLCAqcEluZGV4KTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgICBwUHJveHlGaWxlTGlzdCsrOwogIH0KICBUUkFDRSgibm90IGZvdW5kXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBDU3RkUFNGYWN0b3J5X1F1ZXJ5SW50ZXJmYWNlKExQUFNGQUNUT1JZQlVGRkVSIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCAqb2JqKQp7CiAgQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqVGhpcyA9IChDU3RkUFNGYWN0b3J5QnVmZmVyICopaWZhY2U7CiAgVFJBQ0UoIiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIixpZmFjZSxkZWJ1Z3N0cl9ndWlkKHJpaWQpLG9iaik7CiAgaWYgKElzRXF1YWxHVUlEKCZJSURfSVVua25vd24scmlpZCkgfHwKICAgICAgSXNFcXVhbEdVSUQoJklJRF9JUFNGYWN0b3J5QnVmZmVyLHJpaWQpKSB7CiAgICAqb2JqID0gVGhpczsKICAgIFRoaXMtPlJlZkNvdW50Kys7CiAgICByZXR1cm4gU19PSzsKICB9CiAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgQ1N0ZFBTRmFjdG9yeV9BZGRSZWYoTFBQU0ZBQ1RPUllCVUZGRVIgaWZhY2UpCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBUUkFDRSgiKCVwKS0+QWRkUmVmKClcbiIsaWZhY2UpOwogIHJldHVybiArKyhUaGlzLT5SZWZDb3VudCk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgQ1N0ZFBTRmFjdG9yeV9SZWxlYXNlKExQUFNGQUNUT1JZQlVGRkVSIGlmYWNlKQp7CiAgQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqVGhpcyA9IChDU3RkUFNGYWN0b3J5QnVmZmVyICopaWZhY2U7CiAgVFJBQ0UoIiglcCktPlJlbGVhc2UoKVxuIixpZmFjZSk7CiAgcmV0dXJuIC0tKFRoaXMtPlJlZkNvdW50KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIENTdGRQU0ZhY3RvcnlfQ3JlYXRlUHJveHkoTFBQU0ZBQ1RPUllCVUZGRVIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVTktOT1dOIHBVbmtPdXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJQQ1BST1hZQlVGRkVSICpwcFByb3h5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCAqcHB2KQp7CiAgQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqVGhpcyA9IChDU3RkUFNGYWN0b3J5QnVmZmVyICopaWZhY2U7CiAgY29uc3QgUHJveHlGaWxlSW5mbyAqUHJveHlJbmZvOwogIGludCBJbmRleDsKICBUUkFDRSgiKCVwKS0+Q3JlYXRlUHJveHkoJXAsJXMsJXAsJXApXG4iLGlmYWNlLHBVbmtPdXRlciwKICAgICAgIGRlYnVnc3RyX2d1aWQocmlpZCkscHBQcm94eSxwcHYpOwogIGlmICghRmluZFByb3h5SW5mbyhUaGlzLT5wUHJveHlGaWxlTGlzdCxyaWlkLCZQcm94eUluZm8sJkluZGV4KSkKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwogIHJldHVybiBTdGRQcm94eV9Db25zdHJ1Y3QocmlpZCwgcFVua091dGVyLCBQcm94eUluZm8tPnBOYW1lc0FycmF5W0luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5SW5mby0+cFByb3h5VnRibExpc3RbSW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlJbmZvLT5wU3R1YlZ0YmxMaXN0W0luZGV4XSwgaWZhY2UsIHBwUHJveHksIHBwdik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBDU3RkUFNGYWN0b3J5X0NyZWF0ZVN0dWIoTFBQU0ZBQ1RPUllCVUZGRVIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVU5LTk9XTiBwVW5rU2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSUENTVFVCQlVGRkVSICpwcFN0dWIpCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBjb25zdCBQcm94eUZpbGVJbmZvICpQcm94eUluZm87CiAgaW50IEluZGV4OwogIFRSQUNFKCIoJXApLT5DcmVhdGVTdHViKCVzLCVwLCVwKVxuIixpZmFjZSxkZWJ1Z3N0cl9ndWlkKHJpaWQpLAogICAgICAgcFVua1NlcnZlcixwcFN0dWIpOwogIGlmICghRmluZFByb3h5SW5mbyhUaGlzLT5wUHJveHlGaWxlTGlzdCxyaWlkLCZQcm94eUluZm8sJkluZGV4KSkKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwogIHJldHVybiBDU3RkU3R1YkJ1ZmZlcl9Db25zdHJ1Y3QocmlpZCwgcFVua1NlcnZlciwgUHJveHlJbmZvLT5wTmFtZXNBcnJheVtJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eUluZm8tPnBTdHViVnRibExpc3RbSW5kZXhdLCBpZmFjZSwgcHBTdHViKTsKfQoKc3RhdGljIElQU0ZhY3RvcnlCdWZmZXJWdGJsIENTdGRQU0ZhY3RvcnlfVnRibCA9CnsKICBDU3RkUFNGYWN0b3J5X1F1ZXJ5SW50ZXJmYWNlLAogIENTdGRQU0ZhY3RvcnlfQWRkUmVmLAogIENTdGRQU0ZhY3RvcnlfUmVsZWFzZSwKICBDU3RkUFNGYWN0b3J5X0NyZWF0ZVByb3h5LAogIENTdGRQU0ZhY3RvcnlfQ3JlYXRlU3R1Ygp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJEbGxHZXRDbGFzc09iamVjdCBbUlBDUlQ0LkBdCiAqLwpIUkVTVUxUIFdJTkFQSSBOZHJEbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3h5RmlsZUluZm8gKipwUHJveHlGaWxlTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDTFNJRCAqcGNsc2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTdGRQU0ZhY3RvcnlCdWZmZXIgKnBQU0ZhY3RvcnlCdWZmZXIpCnsKICAqcHB2ID0gTlVMTDsKICBpZiAoIXBQU0ZhY3RvcnlCdWZmZXItPmxwVnRibCkgewogICAgcFBTRmFjdG9yeUJ1ZmZlci0+bHBWdGJsID0gJkNTdGRQU0ZhY3RvcnlfVnRibDsKICAgIHBQU0ZhY3RvcnlCdWZmZXItPlJlZkNvdW50ID0gMDsKICAgIHBQU0ZhY3RvcnlCdWZmZXItPnBQcm94eUZpbGVMaXN0ID0gcFByb3h5RmlsZUxpc3Q7CiAgfQogIGlmIChJc0VxdWFsR1VJRChyY2xzaWQsIHBjbHNpZCkpCiAgICByZXR1cm4gSVBTRmFjdG9yeUJ1ZmZlcl9RdWVyeUludGVyZmFjZSgoTFBQU0ZBQ1RPUllCVUZGRVIpcFBTRmFjdG9yeUJ1ZmZlciwgaWlkLCBwcHYpOwogIHJldHVybiBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckRsbENhblVubG9hZE5vdyBbUlBDUlQ0LkBdCiAqLwpIUkVTVUxUIFdJTkFQSSBOZHJEbGxDYW5VbmxvYWROb3coQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqcFBTRmFjdG9yeUJ1ZmZlcikKewogIHJldHVybiAhKHBQU0ZhY3RvcnlCdWZmZXItPlJlZkNvdW50KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJEbGxSZWdpc3RlclByb3h5IFtSUENSVDQuQF0KICovCkhSRVNVTFQgV0lOQVBJIE5kckRsbFJlZ2lzdGVyUHJveHkoSE1PRFVMRSBoRGxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJveHlGaWxlSW5mbyAqKnBQcm94eUZpbGVMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0xTSUQgKnBjbHNpZCkKewogIExQU1RSIGNsc2lkOwogIGNoYXIga2V5bmFtZVsxMjBdLCBtb2R1bGVbTUFYX1BBVEhdOwogIEhLRVkga2V5LCBzdWJrZXk7CiAgRFdPUkQgbGVuOwoKICBUUkFDRSgiKCVwLCVwLCVzKVxuIiwgaERsbCwgcFByb3h5RmlsZUxpc3QsIGRlYnVnc3RyX2d1aWQocGNsc2lkKSk7CiAgVXVpZFRvU3RyaW5nQSgoVVVJRCopcGNsc2lkLCAodW5zaWduZWQgY2hhcioqKSZjbHNpZCk7CgogIC8qIHJlZ2lzdGVyIGludGVyZmFjZXMgdG8gcG9pbnQgdG8gY2xzaWQgKi8KICB3aGlsZSAoKnBQcm94eUZpbGVMaXN0KSB7CiAgICB1bnNpZ25lZCB1OwogICAgZm9yICh1PTA7IHU8KCpwUHJveHlGaWxlTGlzdCktPlRhYmxlU2l6ZTsgdSsrKSB7CiAgICAgIENJbnRlcmZhY2VTdHViVnRibCAqcHJveHkgPSAoKnBQcm94eUZpbGVMaXN0KS0+cFN0dWJWdGJsTGlzdFt1XTsKICAgICAgUENJbnRlcmZhY2VOYW1lIG5hbWUgPSAoKnBQcm94eUZpbGVMaXN0KS0+cE5hbWVzQXJyYXlbdV07CiAgICAgIExQU1RSIGlpZDsKCiAgICAgIFRSQUNFKCJyZWdpc3RlcmluZyAlcyAlcyA9PiAlc1xuIiwgbmFtZSwgZGVidWdzdHJfZ3VpZChwcm94eS0+aGVhZGVyLnBpaWQpLCBjbHNpZCk7CgogICAgICBVdWlkVG9TdHJpbmdBKChVVUlEKilwcm94eS0+aGVhZGVyLnBpaWQsICh1bnNpZ25lZCBjaGFyKiopJmlpZCk7CiAgICAgIHNucHJpbnRmKGtleW5hbWUsIHNpemVvZihrZXluYW1lKSwgIkludGVyZmFjZVxceyVzfSIsIGlpZCk7CiAgICAgIFJwY1N0cmluZ0ZyZWVBKCh1bnNpZ25lZCBjaGFyKiopJmlpZCk7CiAgICAgIGlmIChSZWdDcmVhdGVLZXlFeEEoSEtFWV9DTEFTU0VTX1JPT1QsIGtleW5hbWUsIDAsIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLCBOVUxMLCAma2V5LCBOVUxMKSA9PSBFUlJPUl9TVUNDRVNTKSB7CiAgICAgICAgaWYgKG5hbWUpCiAgICAgICAgICBSZWdTZXRWYWx1ZUV4QShrZXksIE5VTEwsIDAsIFJFR19TWiwgbmFtZSwgc3RybGVuKG5hbWUpKTsKICAgICAgICBpZiAoUmVnQ3JlYXRlS2V5RXhBKGtleSwgIlByb3h5U3R1YkNsc2lkMzIiLCAwLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLCBOVUxMLCAmc3Via2V5LCBOVUxMKSA9PSBFUlJPUl9TVUNDRVNTKSB7CiAgICAgICAgICBzbnByaW50Zihtb2R1bGUsIHNpemVvZihtb2R1bGUpLCAieyVzfSIsIGNsc2lkKTsKICAgICAgICAgIFJlZ1NldFZhbHVlRXhBKHN1YmtleSwgTlVMTCwgMCwgUkVHX1NaLCBtb2R1bGUsIHN0cmxlbihtb2R1bGUpKTsKICAgICAgICAgIFJlZ0Nsb3NlS2V5KHN1YmtleSk7CiAgICAgICAgfQogICAgICAgIFJlZ0Nsb3NlS2V5KGtleSk7CiAgICAgIH0KICAgIH0KICAgIHBQcm94eUZpbGVMaXN0Kys7CiAgfQoKICAvKiByZWdpc3RlciBjbHNpZCB0byBwb2ludCB0byBtb2R1bGUgKi8KICBzbnByaW50ZihrZXluYW1lLCBzaXplb2Yoa2V5bmFtZSksICJDTFNJRFxceyVzfSIsIGNsc2lkKTsKICBsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZUEoaERsbCwgbW9kdWxlLCBzaXplb2YobW9kdWxlKSk7CiAgaWYgKGxlbiAmJiBsZW4gPCBzaXplb2YobW9kdWxlKSkgewogICAgVFJBQ0UoInJlZ2lzdGVyaW5nIENMU0lEICVzID0+ICVzXG4iLCBjbHNpZCwgbW9kdWxlKTsKICAgIGlmIChSZWdDcmVhdGVLZXlFeEEoSEtFWV9DTEFTU0VTX1JPT1QsIGtleW5hbWUsIDAsIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XUklURSwgTlVMTCwgJmtleSwgTlVMTCkgPT0gRVJST1JfU1VDQ0VTUykgewogICAgICBpZiAoUmVnQ3JlYXRlS2V5RXhBKGtleSwgIkluUHJvY1NlcnZlcjMyIiwgMCwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV1JJVEUsIE5VTEwsICZzdWJrZXksIE5VTEwpID09IEVSUk9SX1NVQ0NFU1MpIHsKICAgICAgICBSZWdTZXRWYWx1ZUV4QShzdWJrZXksIE5VTEwsIDAsIFJFR19TWiwgbW9kdWxlLCBzdHJsZW4obW9kdWxlKSk7CiAgICAgICAgUmVnQ2xvc2VLZXkoc3Via2V5KTsKICAgICAgfQogICAgICBSZWdDbG9zZUtleShrZXkpOwogICAgfQogIH0KCiAgLyogZG9uZSAqLwogIFJwY1N0cmluZ0ZyZWVBKCh1bnNpZ25lZCBjaGFyKiopJmNsc2lkKTsKICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJEbGxVbnJlZ2lzdGVyUHJveHkgW1JQQ1JUNC5AXQogKi8KSFJFU1VMVCBXSU5BUEkgTmRyRGxsVW5yZWdpc3RlclByb3h5KEhNT0RVTEUgaERsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJveHlGaWxlSW5mbyAqKnBQcm94eUZpbGVMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDTFNJRCAqcGNsc2lkKQp7CiAgTFBTVFIgY2xzaWQ7CiAgY2hhciBrZXluYW1lWzEyMF0sIG1vZHVsZVtNQVhfUEFUSF07CiAgRFdPUkQgbGVuOwoKICBUUkFDRSgiKCVwLCVwLCVzKVxuIiwgaERsbCwgcFByb3h5RmlsZUxpc3QsIGRlYnVnc3RyX2d1aWQocGNsc2lkKSk7CiAgVXVpZFRvU3RyaW5nQSgoVVVJRCopcGNsc2lkLCAodW5zaWduZWQgY2hhcioqKSZjbHNpZCk7CgogIC8qIHVucmVnaXN0ZXIgaW50ZXJmYWNlcyAqLwogIHdoaWxlICgqcFByb3h5RmlsZUxpc3QpIHsKICAgIHVuc2lnbmVkIHU7CiAgICBmb3IgKHU9MDsgdTwoKnBQcm94eUZpbGVMaXN0KS0+VGFibGVTaXplOyB1KyspIHsKICAgICAgQ0ludGVyZmFjZVN0dWJWdGJsICpwcm94eSA9ICgqcFByb3h5RmlsZUxpc3QpLT5wU3R1YlZ0YmxMaXN0W3VdOwogICAgICBQQ0ludGVyZmFjZU5hbWUgbmFtZSA9ICgqcFByb3h5RmlsZUxpc3QpLT5wTmFtZXNBcnJheVt1XTsKICAgICAgTFBTVFIgaWlkOwoKICAgICAgVFJBQ0UoInVucmVnaXN0ZXJpbmcgJXMgJXMgPD0gJXNcbiIsIG5hbWUsIGRlYnVnc3RyX2d1aWQocHJveHktPmhlYWRlci5waWlkKSwgY2xzaWQpOwoKICAgICAgVXVpZFRvU3RyaW5nQSgoVVVJRCopcHJveHktPmhlYWRlci5waWlkLCAodW5zaWduZWQgY2hhcioqKSZpaWQpOwogICAgICBzbnByaW50ZihrZXluYW1lLCBzaXplb2Yoa2V5bmFtZSksICJJbnRlcmZhY2VcXHslc30iLCBpaWQpOwogICAgICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZpaWQpOwogICAgICBSZWdEZWxldGVLZXlBKEhLRVlfQ0xBU1NFU19ST09ULCBrZXluYW1lKTsKICAgIH0KICAgIHBQcm94eUZpbGVMaXN0Kys7CiAgfQoKICAvKiB1bnJlZ2lzdGVyIGNsc2lkICovCiAgc25wcmludGYoa2V5bmFtZSwgc2l6ZW9mKGtleW5hbWUpLCAiQ0xTSURcXHslc30iLCBjbHNpZCk7CiAgbGVuID0gR2V0TW9kdWxlRmlsZU5hbWVBKGhEbGwsIG1vZHVsZSwgc2l6ZW9mKG1vZHVsZSkpOwogIGlmIChsZW4gJiYgbGVuIDwgc2l6ZW9mKG1vZHVsZSkpIHsKICAgIFRSQUNFKCJ1bnJlZ2lzdGVyaW5nIENMU0lEICVzIDw9ICVzXG4iLCBjbHNpZCwgbW9kdWxlKTsKICAgIFJlZ0RlbGV0ZUtleUEoSEtFWV9DTEFTU0VTX1JPT1QsIGtleW5hbWUpOwogIH0KCiAgLyogZG9uZSAqLwogIFJwY1N0cmluZ0ZyZWVBKCh1bnNpZ25lZCBjaGFyKiopJmNsc2lkKTsKICByZXR1cm4gU19PSzsKfQo=