LyoKICoJQXV0b0NvbXBsZXRlIGludGVyZmFjZXMgaW1wbGVtZW50YXRpb24uCiAqCiAqCUNvcHlyaWdodCAyMDA0CU1heGltZSBCZWxsZW5n6SA8bWF4aW1lLmJlbGxlbmdlQGxhcG9zdGUubmV0PgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgovKgogIEltcGxlbWVudGVkOgogIC0gQUNPX0FVVE9BUFBFTkQgc3R5bGUKICAtIEFDT19BVVRPU1VHR0VTVCBzdHlsZQogIC0gQUNPX1VQRE9XTktFWURST1BTTElTVCBzdHlsZQoKICAtIEhhbmRsZSBwd3pzUmVnS2V5UGF0aCBhbmQgcHdzelF1aWNrQ29tcGxldGUgaW4gSW5pdAoKICBUT0RPOgogIC0gaW1wbGVtZW50IEFDT19TRUFSQ0ggc3R5bGUKICAtIGltcGxlbWVudCBBQ09fRklMVEVSUFJFRklYRVMgc3R5bGUKICAtIGltcGxlbWVudCBBQ09fVVNFVEFCIHN0eWxlCiAgLSBpbXBsZW1lbnQgQUNPX1JUTFJFQURJTkcgc3R5bGUKICAKICovCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAidW5kb2NzaGVsbC5oIgojaW5jbHVkZSAic2hsd2FwaS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIm9iamJhc2UuaCIKCiNpbmNsdWRlICJwaWRsLmgiCiNpbmNsdWRlICJzaGxndWlkLmgiCiNpbmNsdWRlICJzaGxvYmouaCIKI2luY2x1ZGUgInNobGRpc3AuaCIKI2luY2x1ZGUgImRlYnVnaGxwLmgiCgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChzaGVsbCk7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBJQ09NX1ZGSUVMRChJQXV0b0NvbXBsZXRlKTsKICAgIElDT01fVlRBQkxFIChJQXV0b0NvbXBsZXRlMikgKiBscHZ0YmxBdXRvQ29tcGxldGUyOwogICAgRFdPUkQgcmVmOwogICAgQk9PTCAgZW5hYmxlZDsKICAgIEhXTkQgaHduZEVkaXQ7CiAgICBIV05EIGh3bmRMaXN0Qm94OwogICAgV05EUFJPQyB3cE9yaWdFZGl0UHJvYzsKICAgIFdORFBST0Mgd3BPcmlnTEJveFByb2M7CiAgICBXQ0hBUiAqdHh0YmFja3VwOwogICAgV0NIQVIgKnF1aWNrQ29tcGxldGU7CiAgICBJRW51bVN0cmluZyAqZW51bXN0cjsKICAgIEFVVE9DT01QTEVURU9QVElPTlMgb3B0aW9uczsKfSBJQXV0b0NvbXBsZXRlSW1wbDsKCnN0YXRpYyBzdHJ1Y3QgSUNPTV9WVEFCTEUoSUF1dG9Db21wbGV0ZSkgYWN2dDsKc3RhdGljIHN0cnVjdCBJQ09NX1ZUQUJMRShJQXV0b0NvbXBsZXRlMikgYWMydnQ7CgojZGVmaW5lIF9JQXV0b0NvbXBsZXRlMl9PZmZzZXQgKChpbnQpKCYoKChJQXV0b0NvbXBsZXRlSW1wbCopMCktPmxwdnRibEF1dG9Db21wbGV0ZTIpKSkKI2RlZmluZSBfSUNPTV9USElTX0Zyb21fSUF1dG9Db21wbGV0ZTIoY2xhc3MsIG5hbWUpIGNsYXNzKiBUaGlzID0gKGNsYXNzKikoKChjaGFyKiluYW1lKS1fSUF1dG9Db21wbGV0ZTJfT2Zmc2V0KTsKCi8qCiAgY29udmVydHMgVGhpcyB0byBhIGludGVyZmFjZSBwb2ludGVyCiovCiNkZWZpbmUgX0lVbmtub3duXyhUaGlzKSAoSVVua25vd24qKSYoVGhpcy0+bHBWdGJsKQojZGVmaW5lIF9JQXV0b0NvbXBsZXRlMl8oVGhpcykgIChJQXV0b0NvbXBsZXRlMiopJihUaGlzLT5scHZ0YmxBdXRvQ29tcGxldGUyKSAKCnN0YXRpYyBMUkVTVUxUIEFQSUVOVFJZIEFDRWRpdFN1YmNsYXNzUHJvYyhIV05EIGh3bmQsIFVJTlQgdU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CnN0YXRpYyBMUkVTVUxUIEFQSUVOVFJZIEFDTEJveFN1YmNsYXNzUHJvYyhIV05EIGh3bmQsIFVJTlQgdU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElBdXRvQ29tcGxldGVfQ29uc3RydWN0b3IKICovCkhSRVNVTFQgV0lOQVBJIElBdXRvQ29tcGxldGVfQ29uc3RydWN0b3IoSVVua25vd24gKiBwVW5rT3V0ZXIsIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHYpCnsKICAgIElBdXRvQ29tcGxldGVJbXBsICpscGFjOwoKICAgIGlmIChwVW5rT3V0ZXIgJiYgIUlzRXF1YWxJSUQgKHJpaWQsICZJSURfSVVua25vd24pKQoJcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKCiAgICBscGFjID0gKElBdXRvQ29tcGxldGVJbXBsKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwKICAgICAgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElBdXRvQ29tcGxldGVJbXBsKSk7CiAgICBpZiAoIWxwYWMpIAoJcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgogICAgbHBhYy0+cmVmID0gMTsKICAgIGxwYWMtPmxwVnRibCA9ICZhY3Z0OwogICAgbHBhYy0+bHB2dGJsQXV0b0NvbXBsZXRlMiA9ICZhYzJ2dDsKICAgIGxwYWMtPmVuYWJsZWQgPSBUUlVFOwogICAgbHBhYy0+ZW51bXN0ciA9IE5VTEw7CiAgICBscGFjLT5vcHRpb25zID0gQUNPX0FVVE9BUFBFTkQ7CiAgICBscGFjLT53cE9yaWdFZGl0UHJvYyA9IE5VTEw7CiAgICBscGFjLT5od25kTGlzdEJveCA9IE5VTEw7CiAgICBscGFjLT50eHRiYWNrdXAgPSBOVUxMOwogICAgbHBhYy0+cXVpY2tDb21wbGV0ZSA9IE5VTEw7CiAgICAKICAgIGlmICghU1VDQ0VFREVEIChJVW5rbm93bl9RdWVyeUludGVyZmFjZSAoX0lVbmtub3duXyAobHBhYyksIHJpaWQsIHBwdikpKSB7CglJVW5rbm93bl9SZWxlYXNlIChfSVVua25vd25fIChscGFjKSk7CglyZXR1cm4gRV9OT0lOVEVSRkFDRTsKICAgIH0KICAgIAogICAgVFJBQ0UoIi0tICglcCktPlxuIixscGFjKTsKCiAgICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBBdXRvQ29tcGxldGVfUXVlcnlJbnRlcmZhY2UKICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQXV0b0NvbXBsZXRlX2ZuUXVlcnlJbnRlcmZhY2UoCiAgICBJQXV0b0NvbXBsZXRlICogaWZhY2UsCiAgICBSRUZJSUQgcmlpZCwKICAgIExQVk9JRCAqcHB2T2JqKQp7CiAgICBJQ09NX1RISVMoSUF1dG9Db21wbGV0ZUltcGwsIGlmYWNlKTsKICAgIAogICAgVFJBQ0UoIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLCBUaGlzLCBzaGRlYnVnc3RyX2d1aWQocmlpZCksIHBwdk9iaik7CiAgICAqcHB2T2JqID0gTlVMTDsKCiAgICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAKICAgIHsKCSpwcHZPYmogPSBUaGlzOwogICAgfSAKICAgIGVsc2UgaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lBdXRvQ29tcGxldGUpKQogICAgewoJKnBwdk9iaiA9IChJQXV0b0NvbXBsZXRlKilUaGlzOwogICAgfQogICAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSUF1dG9Db21wbGV0ZTIpKQogICAgewoJKnBwdk9iaiA9IF9JQXV0b0NvbXBsZXRlMl8gKFRoaXMpOwogICAgfQoKICAgIGlmICgqcHB2T2JqKQogICAgewoJSUF1dG9Db21wbGV0ZV9BZGRSZWYoKElBdXRvQ29tcGxldGUqKSpwcHZPYmopOwoJVFJBQ0UoIi0tIEludGVyZmFjZTogKCVwKS0+KCVwKVxuIiwgcHB2T2JqLCAqcHB2T2JqKTsKCXJldHVybiBTX09LOwogICAgfQogICAgVFJBQ0UoIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7CiAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsJCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZV9mbkFkZFJlZgogKi8Kc3RhdGljIFVMT05HIFdJTkFQSSBJQXV0b0NvbXBsZXRlX2ZuQWRkUmVmKAoJSUF1dG9Db21wbGV0ZSAqIGlmYWNlKQp7CiAgICBJQ09NX1RISVMoSUF1dG9Db21wbGV0ZUltcGwsaWZhY2UpOwogICAgCiAgICBUUkFDRSgiKCVwKS0+KCVsdSlcbiIsVGhpcyxUaGlzLT5yZWYpOwogICAgcmV0dXJuICsrKFRoaXMtPnJlZik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZV9mblJlbGVhc2UKICovCnN0YXRpYyBVTE9ORyBXSU5BUEkgSUF1dG9Db21wbGV0ZV9mblJlbGVhc2UoCglJQXV0b0NvbXBsZXRlICogaWZhY2UpCnsKICAgIElDT01fVEhJUyhJQXV0b0NvbXBsZXRlSW1wbCxpZmFjZSk7CiAgICAKICAgIFRSQUNFKCIoJXApLT4oJWx1KVxuIixUaGlzLFRoaXMtPnJlZik7CgogICAgaWYgKCEtLShUaGlzLT5yZWYpKSB7CglUUkFDRSgiIGRlc3Ryb3lpbmcgSUF1dG9Db21wbGV0ZSglcClcbiIsVGhpcyk7CglpZiAoVGhpcy0+cXVpY2tDb21wbGV0ZSkKCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5xdWlja0NvbXBsZXRlKTsKCWlmIChUaGlzLT50eHRiYWNrdXApCgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dHh0YmFja3VwKTsKCWlmIChUaGlzLT5od25kTGlzdEJveCkKCSAgICBEZXN0cm95V2luZG93KFRoaXMtPmh3bmRMaXN0Qm94KTsKCWlmIChUaGlzLT5lbnVtc3RyKQoJICAgIElFbnVtU3RyaW5nX1JlbGVhc2UoVGhpcy0+ZW51bXN0cik7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuIFRoaXMtPnJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJQXV0b0NvbXBsZXRlX2ZuRW5hYmxlCiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUF1dG9Db21wbGV0ZV9mbkVuYWJsZSgKICAgIElBdXRvQ29tcGxldGUgKiBpZmFjZSwKICAgIEJPT0wgZkVuYWJsZSkKewogICAgSUNPTV9USElTKElBdXRvQ29tcGxldGVJbXBsLCBpZmFjZSk7CgogICAgSFJFU1VMVCBociA9IFNfT0s7CgogICAgVFJBQ0UoIiglcCktPiglcylcbiIsIFRoaXMsIChmRW5hYmxlKT8idHJ1ZSI6ImZhbHNlIik7CgogICAgVGhpcy0+ZW5hYmxlZCA9IGZFbmFibGU7CgogICAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElBdXRvQ29tcGxldGVfZm5Jbml0CiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUF1dG9Db21wbGV0ZV9mbkluaXQoCiAgICBJQXV0b0NvbXBsZXRlICogaWZhY2UsCiAgICBIV05EIGh3bmRFZGl0LAogICAgSVVua25vd24gKnB1bmtBQ0wsCiAgICBMUENPTEVTVFIgcHd6c1JlZ0tleVBhdGgsCiAgICBMUENPTEVTVFIgcHdzelF1aWNrQ29tcGxldGUpCnsKICAgIElDT01fVEhJUyhJQXV0b0NvbXBsZXRlSW1wbCwgaWZhY2UpOwogICAgc3RhdGljIGNvbnN0IFdDSEFSIGxiTmFtZVtdID0geydMJywnaScsJ3MnLCd0JywnQicsJ28nLCd4JywwfTsKCiAgICBUUkFDRSgiKCVwKS0+KDB4JTA4bHgsICVwLCAlcywgJXMpXG4iLCAKCSAgVGhpcywgKGxvbmcpaHduZEVkaXQsIHB1bmtBQ0wsIGRlYnVnc3RyX3cocHd6c1JlZ0tleVBhdGgpLCBkZWJ1Z3N0cl93KHB3c3pRdWlja0NvbXBsZXRlKSk7CgogICAgaWYgKFRoaXMtPm9wdGlvbnMgJiBBQ09fQVVUT1NVR0dFU1QpIFRSQUNFKCIgQUNPX0FVVE9TVUdHRVNUXG4iKTsKICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX0FVVE9BUFBFTkQpIFRSQUNFKCIgQUNPX0FVVE9BUFBFTkRcbiIpOwogICAgaWYgKFRoaXMtPm9wdGlvbnMgJiBBQ09fU0VBUkNIKSBGSVhNRSgiIEFDT19TRUFSQ0ggbm90IHN1cHBvcnRlZFxuIik7CiAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19GSUxURVJQUkVGSVhFUykgRklYTUUoIiBBQ09fRklMVEVSUFJFRklYRVMgbm90IHN1cHBvcnRlZFxuIik7CiAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19VU0VUQUIpIEZJWE1FKCIgQUNPX1VTRVRBQiBub3Qgc3VwcG9ydGVkXG4iKTsKICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX1VQRE9XTktFWURST1BTTElTVCkgVFJBQ0UoIiBBQ09fVVBET1dOS0VZRFJPUFNMSVNUXG4iKTsKICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX1JUTFJFQURJTkcpIEZJWE1FKCIgQUNPX1JUTFJFQURJTkcgbm90IHN1cHBvcnRlZFxuIik7CgogICAgVGhpcy0+aHduZEVkaXQgPSBod25kRWRpdDsKCiAgICBpZiAoIVNVQ0NFRURFRCAoSVVua25vd25fUXVlcnlJbnRlcmZhY2UgKHB1bmtBQ0wsICZJSURfSUVudW1TdHJpbmcsIChMUFZPSUQqKSZUaGlzLT5lbnVtc3RyKSkpIHsKCVRSQUNFKCJObyBJRW51bVN0cmluZyBpbnRlcmZhY2VcbiIpOwoJcmV0dXJuICBFX05PSU5URVJGQUNFOwogICAgfQoKICAgIFRoaXMtPndwT3JpZ0VkaXRQcm9jID0gKFdORFBST0MpIFNldFdpbmRvd0xvbmdQdHJXKCBod25kRWRpdCwgR1dMUF9XTkRQUk9DLCAoTE9OR19QVFIpIEFDRWRpdFN1YmNsYXNzUHJvYyk7CiAgICBTZXRXaW5kb3dMb25nUHRyVyggaHduZEVkaXQsIEdXTFBfVVNFUkRBVEEsIChMT05HX1BUUilUaGlzKTsKCiAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPU1VHR0VTVCkgewoJSFdORCBod25kUGFyZW50OwoKCWh3bmRQYXJlbnQgPSBHZXRQYXJlbnQoVGhpcy0+aHduZEVkaXQpOwoJCgkvKiBGSVhNRSA6IFRoZSBsaXN0Ym94IHNob3VsZCBiZSByZXNpemFibGUgd2l0aCB0aGUgbW91c2UuIFdTX1RISUNLRlJBTUUgbG9va3MgdWdseSAqLwoJVGhpcy0+aHduZExpc3RCb3ggPSBDcmVhdGVXaW5kb3dFeFcoMCwgbGJOYW1lLCBOVUxMLCAKCQkJCQkgICAgV1NfQk9SREVSIHwgV1NfQ0hJTEQgfCBXU19WU0NST0xMIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9USUZZIHwgTEJTX05PSU5URUdSQUxIRUlHSFQsIAoJCQkJCSAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAoJCQkJCSAgICBod25kUGFyZW50LCBOVUxMLCAKCQkJCQkgICAgKEhJTlNUQU5DRSlHZXRXaW5kb3dMb25nQSggaHduZFBhcmVudCwgR1dMX0hJTlNUQU5DRSApLCBOVUxMKTsKCQkJCQkgICAgCglpZiAoVGhpcy0+aHduZExpc3RCb3gpIHsKCSAgICBUaGlzLT53cE9yaWdMQm94UHJvYyA9IChXTkRQUk9DKSBTZXRXaW5kb3dMb25nUHRyVyggVGhpcy0+aHduZExpc3RCb3gsIEdXTFBfV05EUFJPQywgKExPTkdfUFRSKSBBQ0xCb3hTdWJjbGFzc1Byb2MpOwoJICAgIFNldFdpbmRvd0xvbmdQdHJXKCBUaGlzLT5od25kTGlzdEJveCwgR1dMUF9VU0VSREFUQSwgKExPTkdfUFRSKVRoaXMpOwoJfQogICAgfQoKICAgIGlmIChwd3pzUmVnS2V5UGF0aCkgewoJV0NIQVIgKmtleTsKCVdDSEFSIHJlc3VsdFtNQVhfUEFUSF07CglXQ0hBUiAqdmFsdWU7CglIS0VZIGhLZXkgPSAwOwoJTE9ORyByZXM7CglMT05HIGxlbjsKCgkvKiBwd3N6UmVnS2V5UGF0aCBjb250YWlucyB0aGUga2V5IGFzIHdlbGwgYXMgdGhlIHZhbHVlLCBzbyB3ZSBzcGxpdCAqLwoJa2V5ID0gKFdDSEFSKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgKGxzdHJsZW5XKHB3enNSZWdLZXlQYXRoKSsxKSpzaXplb2YoV0NIQVIpKTsKCXN0cmNweVcoa2V5LCBwd3pzUmVnS2V5UGF0aCk7Cgl2YWx1ZSA9IHN0cnJjaHJXKGtleSwgJ1xcJyk7CgkqdmFsdWUgPSAwOwoJdmFsdWUrKzsKCS8qIE5vdyB2YWx1ZSBjb250YWlucyB0aGUgdmFsdWUgYW5kIGJ1ZmZlciB0aGUga2V5ICovCglyZXMgPSBSZWdPcGVuS2V5RXhXKEhLRVlfQ1VSUkVOVF9VU0VSLCBrZXksIDAsIEtFWV9SRUFELCAmaEtleSk7CglpZiAocmVzICE9IEVSUk9SX1NVQ0NFU1MpIHsKCSAgICAvKiBpZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgTVNETiBzdGF0ZXMgd2UgbXVzdCBzZWVrIGluIEhLRVlfTE9DQUxfTUFDSElORSAqLwoJICAgIHJlcyA9IFJlZ09wZW5LZXlFeFcoSEtFWV9MT0NBTF9NQUNISU5FLCBrZXksIDAsIEtFWV9SRUFELCAmaEtleSk7ICAKCX0KCWlmIChyZXMgPT0gRVJST1JfU1VDQ0VTUykgewoJICAgIHJlcyA9IFJlZ1F1ZXJ5VmFsdWVXKGhLZXksIHZhbHVlLCByZXN1bHQsICZsZW4pOwoJICAgIGlmIChyZXMgPT0gRVJST1JfU1VDQ0VTUykgewoJCVRoaXMtPnF1aWNrQ29tcGxldGUgPSAoV0NIQVIqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4qc2l6ZW9mKFdDSEFSKSk7CgkJc3RyY3B5VyhUaGlzLT5xdWlja0NvbXBsZXRlLCByZXN1bHQpOwoJICAgIH0KCSAgICBSZWdDbG9zZUtleShoS2V5KTsKCX0KCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGtleSk7CiAgICB9CgogICAgaWYgKChwd3N6UXVpY2tDb21wbGV0ZSkgJiYgKCFUaGlzLT5xdWlja0NvbXBsZXRlKSkgewoJVGhpcy0+cXVpY2tDb21wbGV0ZSA9IChXQ0hBUiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIChsc3RybGVuVyhwd3N6UXVpY2tDb21wbGV0ZSkrMSkqc2l6ZW9mKFdDSEFSKSk7Cglsc3RyY3B5VyhUaGlzLT5xdWlja0NvbXBsZXRlLCBwd3N6UXVpY2tDb21wbGV0ZSk7CiAgICB9CgogICAgcmV0dXJuIFNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgSUF1dG9Db21wbGV0ZV9mblZUYWJsZQogKi8Kc3RhdGljIElDT01fVlRBQkxFIChJQXV0b0NvbXBsZXRlKSBhY3Z0ID0KewogICAgSUNPTV9NU1ZUQUJMRV9DT01QQVRfRHVtbXlSVFRJVkFMVUUKICAgIElBdXRvQ29tcGxldGVfZm5RdWVyeUludGVyZmFjZSwKICAgIElBdXRvQ29tcGxldGVfZm5BZGRSZWYsCiAgICBJQXV0b0NvbXBsZXRlX2ZuUmVsZWFzZSwKICAgIElBdXRvQ29tcGxldGVfZm5Jbml0LAogICAgSUF1dG9Db21wbGV0ZV9mbkVuYWJsZSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgQXV0b0NvbXBsZXRlMl9RdWVyeUludGVyZmFjZQogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElBdXRvQ29tcGxldGUyX2ZuUXVlcnlJbnRlcmZhY2UoCiAgICBJQXV0b0NvbXBsZXRlMiAqIGlmYWNlLAogICAgUkVGSUlEIHJpaWQsCiAgICBMUFZPSUQgKnBwdk9iaikKewogICAgX0lDT01fVEhJU19Gcm9tX0lBdXRvQ29tcGxldGUyKElBdXRvQ29tcGxldGVJbXBsLCBpZmFjZSk7CgogICAgVFJBQ0UgKCIoJXApLT4oJXMsJXApXG4iLCBUaGlzLCBzaGRlYnVnc3RyX2d1aWQgKHJpaWQpLCBwcHZPYmopOwoKICAgIHJldHVybiBJQXV0b0NvbXBsZXRlX1F1ZXJ5SW50ZXJmYWNlKChJQXV0b0NvbXBsZXRlKilUaGlzLCByaWlkLCBwcHZPYmopOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElBdXRvQ29tcGxldGUyX2ZuQWRkUmVmCiAqLwpzdGF0aWMgVUxPTkcgV0lOQVBJIElBdXRvQ29tcGxldGUyX2ZuQWRkUmVmKAoJSUF1dG9Db21wbGV0ZTIgKiBpZmFjZSkKewogICAgX0lDT01fVEhJU19Gcm9tX0lBdXRvQ29tcGxldGUyKElBdXRvQ29tcGxldGVJbXBsLGlmYWNlKTsKCiAgICBUUkFDRSAoIiglcCktPihjb3VudD0lbHUpXG4iLCBUaGlzLCBUaGlzLT5yZWYpOwoKICAgIHJldHVybiBJQXV0b0NvbXBsZXRlMl9BZGRSZWYoKElBdXRvQ29tcGxldGUqKVRoaXMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElBdXRvQ29tcGxldGUyX2ZuUmVsZWFzZQogKi8Kc3RhdGljIFVMT05HIFdJTkFQSSBJQXV0b0NvbXBsZXRlMl9mblJlbGVhc2UoCglJQXV0b0NvbXBsZXRlMiAqIGlmYWNlKQp7CiAgICBfSUNPTV9USElTX0Zyb21fSUF1dG9Db21wbGV0ZTIoSUF1dG9Db21wbGV0ZUltcGwsaWZhY2UpOwoKICAgIFRSQUNFICgiKCVwKS0+KGNvdW50PSVsdSlcbiIsIFRoaXMsIFRoaXMtPnJlZik7CgogICAgcmV0dXJuIElBdXRvQ29tcGxldGVfUmVsZWFzZSgoSUF1dG9Db21wbGV0ZSopVGhpcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSUF1dG9Db21wbGV0ZTJfZm5FbmFibGUKICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQXV0b0NvbXBsZXRlMl9mbkVuYWJsZSgKICAgIElBdXRvQ29tcGxldGUyICogaWZhY2UsCiAgICBCT09MIGZFbmFibGUpCnsKICAgIF9JQ09NX1RISVNfRnJvbV9JQXV0b0NvbXBsZXRlMihJQXV0b0NvbXBsZXRlSW1wbCwgaWZhY2UpOwoKICAgIFRSQUNFICgiKCVwKS0+KCVzKVxuIiwgVGhpcywgKGZFbmFibGUpPyJ0cnVlIjoiZmFsc2UiKTsKCiAgICByZXR1cm4gSUF1dG9Db21wbGV0ZV9FbmFibGUoKElBdXRvQ29tcGxldGUqKVRoaXMsIGZFbmFibGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElBdXRvQ29tcGxldGUyX2ZuSW5pdAogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElBdXRvQ29tcGxldGUyX2ZuSW5pdCgKICAgIElBdXRvQ29tcGxldGUyICogaWZhY2UsCiAgICBIV05EIGh3bmRFZGl0LAogICAgSVVua25vd24gKnB1bmtBQ0wsCiAgICBMUENPTEVTVFIgcHd6c1JlZ0tleVBhdGgsCiAgICBMUENPTEVTVFIgcHdzelF1aWNrQ29tcGxldGUpCnsKICAgIF9JQ09NX1RISVNfRnJvbV9JQXV0b0NvbXBsZXRlMihJQXV0b0NvbXBsZXRlSW1wbCwgaWZhY2UpOwoKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSUF1dG9Db21wbGV0ZV9Jbml0KChJQXV0b0NvbXBsZXRlKilUaGlzLCBod25kRWRpdCwgcHVua0FDTCwgcHd6c1JlZ0tleVBhdGgsIHB3c3pRdWlja0NvbXBsZXRlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBJQXV0b0NvbXBsZXRlX2ZuR2V0T3B0aW9ucwogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElBdXRvQ29tcGxldGUyX2ZuR2V0T3B0aW9ucygKICAgIElBdXRvQ29tcGxldGUyICogaWZhY2UsCiAgICBEV09SRCAqcGR3RmxhZykKewogICAgSFJFU1VMVCBociA9IFNfT0s7CgogICAgX0lDT01fVEhJU19Gcm9tX0lBdXRvQ29tcGxldGUyKElBdXRvQ29tcGxldGVJbXBsLCBpZmFjZSk7CgogICAgVFJBQ0UoIiglcCkgLT4gKCVwKVxuIiwgVGhpcywgcGR3RmxhZyk7CgogICAgKnBkd0ZsYWcgPSBUaGlzLT5vcHRpb25zOwoKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBJQXV0b0NvbXBsZXRlX2ZuU2V0T3B0aW9ucwogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElBdXRvQ29tcGxldGUyX2ZuU2V0T3B0aW9ucygKICAgIElBdXRvQ29tcGxldGUyICogaWZhY2UsCiAgICBEV09SRCBkd0ZsYWcpCnsKICAgIEhSRVNVTFQgaHIgPSBTX09LOwoKICAgIF9JQ09NX1RISVNfRnJvbV9JQXV0b0NvbXBsZXRlMihJQXV0b0NvbXBsZXRlSW1wbCwgaWZhY2UpOwoKICAgIFRSQUNFKCIoJXApIC0+ICgweCVseClcbiIsIFRoaXMsIGR3RmxhZyk7CgogICAgVGhpcy0+b3B0aW9ucyA9IGR3RmxhZzsKCiAgICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgSUF1dG9Db21wbGV0ZTJfZm5WVGFibGUKICovCnN0YXRpYyBJQ09NX1ZUQUJMRSAoSUF1dG9Db21wbGV0ZTIpIGFjMnZ0ID0KewogICAgSUNPTV9NU1ZUQUJMRV9DT01QQVRfRHVtbXlSVFRJVkFMVUUKICAgIElBdXRvQ29tcGxldGUyX2ZuUXVlcnlJbnRlcmZhY2UsCiAgICBJQXV0b0NvbXBsZXRlMl9mbkFkZFJlZiwKICAgIElBdXRvQ29tcGxldGUyX2ZuUmVsZWFzZSwKICAgIElBdXRvQ29tcGxldGUyX2ZuSW5pdCwKICAgIElBdXRvQ29tcGxldGUyX2ZuRW5hYmxlLAogICAgLyogSUF1dG9Db21wbGV0ZTIgKi8KICAgIElBdXRvQ29tcGxldGUyX2ZuU2V0T3B0aW9ucywKICAgIElBdXRvQ29tcGxldGUyX2ZuR2V0T3B0aW9ucywKfTsKCi8qCiAgV2luZG93IHByb2NlZHVyZSBmb3IgYXV0b2NvbXBsZXRpb24KICovCnN0YXRpYyBMUkVTVUxUIEFQSUVOVFJZIEFDRWRpdFN1YmNsYXNzUHJvYyhIV05EIGh3bmQsIFVJTlQgdU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKewogICAgSUNPTV9USElTKElBdXRvQ29tcGxldGVJbXBsLCBHZXRXaW5kb3dMb25nUHRyVyhod25kLCBHV0xQX1VTRVJEQVRBKSk7CiAgICBMUE9MRVNUUiBzdHJzOwogICAgSFJFU1VMVCBocjsKICAgIFdDSEFSIGh3bmRUZXh0WzI1NV07CiAgICBXQ0hBUiAqaHduZFFDVGV4dDsKICAgIFJFQ1QgcjsKICAgIEJPT0wgY29udHJvbCwgZmlsbGVkLCBkaXNwbGF5YWxsID0gRkFMU0U7CiAgICBpbnQgY3B0LCBoZWlnaHQsIHNlbDsKCiAgICBpZiAoIVRoaXMtPmVuYWJsZWQpIHJldHVybiBDYWxsV2luZG93UHJvY1coVGhpcy0+d3BPcmlnRWRpdFByb2MsIGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKCiAgICBzd2l0Y2ggKHVNc2cpCiAgICB7CgljYXNlIENCX1NIT1dEUk9QRE9XTjoKCSAgICBTaG93V2luZG93KFRoaXMtPmh3bmRMaXN0Qm94LCBTV19ISURFKTsKCSAgICBicmVhazsKCWNhc2UgV01fS0lMTEZPQ1VTOgoJICAgIGlmICgoVGhpcy0+b3B0aW9ucyAmJiBBQ09fQVVUT1NVR0dFU1QpICYmIAoJCSgoSFdORCl3UGFyYW0gIT0gVGhpcy0+aHduZExpc3RCb3gpKQoJICAgIHsKCQlTaG93V2luZG93KFRoaXMtPmh3bmRMaXN0Qm94LCBTV19ISURFKTsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIFdNX0tFWVVQOgoJICAgIAoJICAgIEdldFdpbmRvd1RleHRXKCBod25kLCAoTFBXU1RSKWh3bmRUZXh0LCAyNTUpOwogICAgICAKCSAgICBzd2l0Y2god1BhcmFtKSB7CgkJY2FzZSBWS19SRVRVUk46CgkJICAgIC8qIElmIHF1aWNrQ29tcGxldGUgaXMgc2V0IGFuZCBjb250cm9sIGlzIHByZXNzZWQsIHJlcGxhY2UgdGhlIHN0cmluZyAqLwoJCSAgICBjb250cm9sID0gR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDA7CQkgICAgCgkJICAgIGlmIChjb250cm9sICYmIFRoaXMtPnF1aWNrQ29tcGxldGUpIHsKCQkJaHduZFFDVGV4dCA9IChXQ0hBUiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIAoJCQkJCQkgICAgICAgKGxzdHJsZW5XKFRoaXMtPnF1aWNrQ29tcGxldGUpK2xzdHJsZW5XKGh3bmRUZXh0KSkqc2l6ZW9mKFdDSEFSKSk7CgkJCXNlbCA9IHNwcmludGZXKGh3bmRRQ1RleHQsIFRoaXMtPnF1aWNrQ29tcGxldGUsIGh3bmRUZXh0KTsKCQkJU2VuZE1lc3NhZ2VXKGh3bmQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0paHduZFFDVGV4dCk7CgkJCVNlbmRNZXNzYWdlVyhod25kLCBFTV9TRVRTRUwsIDAsIHNlbCk7CgkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGh3bmRRQ1RleHQpOwoJCSAgICB9CgoJCSAgICBTaG93V2luZG93KFRoaXMtPmh3bmRMaXN0Qm94LCBTV19ISURFKTsKCQkgICAgcmV0dXJuIDA7CgkJY2FzZSBWS19MRUZUOgoJCWNhc2UgVktfUklHSFQ6CgkJICAgIHJldHVybiAwOwoJCWNhc2UgVktfVVA6CSAgICAgIAoJCWNhc2UgVktfRE9XTjoKCQkgICAgLyogVHdvIGNhc2VzIGhlcmUgOiAKCQkgICAgICAgLSBpZiB0aGUgbGlzdGJveCBpcyBub3QgdmlzaWJsZSwgZGlzcGxheXMgaXQgCgkJICAgICAgIHdpdGggYWxsIHRoZSBlbnRyaWVzIGlmIHRoZSBzdHlsZSBBQ09fVVBET1dOS0VZRFJPUFNMSVNUCgkJICAgICAgIGlzIHByZXNlbnQgYnV0IGRvZXMgbm90IHNlbGVjdCBhbnl0aGluZy4KCQkgICAgICAgLSBpZiB0aGUgbGlzdGJveCBpcyB2aXNpYmxlLCBjaGFuZ2UgdGhlIHNlbGVjdGlvbgoJCSAgICAqLwoJCSAgICBpZiAoIChUaGlzLT5vcHRpb25zICYgKEFDT19BVVRPU1VHR0VTVCB8IEFDT19VUERPV05LRVlEUk9QU0xJU1QpKSAKCQkJICYmICghSXNXaW5kb3dWaXNpYmxlKFRoaXMtPmh3bmRMaXN0Qm94KSAmJiAoISAqaHduZFRleHQpKSApCgkJICAgIHsKCQkJIC8qIFdlIG11c3QgZGlzcGF5cyBhbGwgdGhlIGVudHJpZXMgKi8KCQkJIGRpc3BsYXlhbGwgPSBUUlVFOwoJCSAgICB9IGVsc2UgewoJCQlpZiAoSXNXaW5kb3dWaXNpYmxlKFRoaXMtPmh3bmRMaXN0Qm94KSkgewoJCQkgICAgaW50IGNvdW50OwoKCQkJICAgIGNvdW50ID0gU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9HRVRDT1VOVCwgMCwgMCk7CgkJCSAgICAvKiBDaGFuZ2UgdGhlIHNlbGVjdGlvbiAqLwoJCQkgICAgc2VsID0gU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9HRVRDVVJTRUwsIDAsIDApOwoJCQkgICAgaWYgKHdQYXJhbSA9PSBWS19VUCkKCQkJCXNlbCA9ICgoc2VsLTEpPDApP2NvdW50LTE6c2VsLTE7CgkJCSAgICBlbHNlCgkJCQlzZWwgPSAoKHNlbCsxKT49IGNvdW50KT8tMTpzZWwrMTsKCQkJICAgIFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfU0VUQ1VSU0VMLCBzZWwsIDApOwoJCQkgICAgaWYgKHNlbCAhPSAtMSkgewoJCQkJV0NIQVIgKm1zZzsKCQkJCWludCBsZW47CgkJCQkKCQkJCWxlbiA9IFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfR0VUVEVYVExFTiwgc2VsLCAoTFBBUkFNKU5VTEwpOwoJCQkJbXNnID0gKFdDSEFSKikgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIChsZW4rMSkqc2l6ZW9mKFdDSEFSKSk7CgkJCQlTZW5kTWVzc2FnZVcoVGhpcy0+aHduZExpc3RCb3gsIExCX0dFVFRFWFQsIHNlbCwgKExQQVJBTSltc2cpOwoJCQkJU2VuZE1lc3NhZ2VXKGh3bmQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pbXNnKTsKCQkJCVNlbmRNZXNzYWdlVyhod25kLCBFTV9TRVRTRUwsIGxzdHJsZW5XKG1zZyksIGxzdHJsZW5XKG1zZykpOwoJCQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbXNnKTsKCQkJICAgIH0gZWxzZSB7CgkJCQlTZW5kTWVzc2FnZVcoaHduZCwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSlUaGlzLT50eHRiYWNrdXApOwoJCQkJU2VuZE1lc3NhZ2VXKGh3bmQsIEVNX1NFVFNFTCwgbHN0cmxlblcoVGhpcy0+dHh0YmFja3VwKSwgbHN0cmxlblcoVGhpcy0+dHh0YmFja3VwKSk7CgkJCSAgICB9CQkJCgkJCX0gCQkKCQkJcmV0dXJuIDA7CgkJICAgIH0KCQkgICAgYnJlYWs7CgkJY2FzZSBWS19CQUNLOgoJCWNhc2UgVktfREVMRVRFOgoJCSAgICBpZiAoKCEgKmh3bmRUZXh0KSAmJiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPU1VHR0VTVCkpIHsKCQkJU2hvd1dpbmRvdyhUaGlzLT5od25kTGlzdEJveCwgU1dfSElERSk7CgkJCXJldHVybiBDYWxsV2luZG93UHJvY1coVGhpcy0+d3BPcmlnRWRpdFByb2MsIGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKCQkgICAgfQoJCSAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPQVBQRU5EKSB7CgkJCURXT1JEIGI7CgkJCVNlbmRNZXNzYWdlVyhod25kLCBFTV9HRVRTRUwsIChXUEFSQU0pJmIsIChMUEFSQU0pTlVMTCk7CgkJCWlmIChiPjEpIHsKCQkJICAgIGh3bmRUZXh0W2ItMV0gPSAnXDAnOwoJCQl9IGVsc2UgewoJCQkgICAgaHduZFRleHRbMF0gPSAnXDAnOwoJCQkgICAgU2V0V2luZG93VGV4dFcoaHduZCwgaHduZFRleHQpOyAKCQkJfQkJCQoJCSAgICB9CgkJICAgIGJyZWFrOwoJCWRlZmF1bHQ6CQkgICAgCgkJICAgIDsKCSAgICB9CiAgICAgIAoJICAgIFNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfUkVTRVRDT05URU5ULCAwLCAwKTsKCgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dHh0YmFja3VwKTsKCSAgICBUaGlzLT50eHRiYWNrdXAgPSAoV0NIQVIqKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwKCQkJCQkJIEhFQVBfWkVST19NRU1PUlksIGxzdHJsZW5XKGh3bmRUZXh0KSpzaXplb2YoV0NIQVIpKTsJCQkJCQkJICAgICAgCgkgICAgbHN0cmNweVcoVGhpcy0+dHh0YmFja3VwLCBod25kVGV4dCk7CgoJICAgIC8qIFJldHVybnMgaWYgdGhlcmUgaXMgbm8gdGV4dCB0byBzZWFyY2ggYW5kIHdlIGRvZXNuJ3Qgd2FudCB0byBkaXNwbGF5IGFsbCB0aGUgZW50cmllcyAqLwoJICAgIGlmICgoIWRpc3BsYXlhbGwpICYmICghICpod25kVGV4dCkgKQoJCWJyZWFrOwoJICAgIAoJICAgIElFbnVtU3RyaW5nX1Jlc2V0KFRoaXMtPmVudW1zdHIpOwoJICAgIGZpbGxlZCA9IEZBTFNFOwoJICAgIGZvcihjcHQgPSAwOzspIHsKCQlociA9IElFbnVtU3RyaW5nX05leHQoVGhpcy0+ZW51bXN0ciwgMSwgJnN0cnMsIE5VTEwpOwoJCWlmIChociAhPSBTX09LKQoJCSAgICBicmVhazsKCgkJaWYgKChMUFdTVFIpc3Ryc3RyVyhzdHJzLCBod25kVGV4dCkgPT0gc3RycykgewoJCSAgICAKCQkgICAgaWYgKFRoaXMtPm9wdGlvbnMgJiBBQ09fQVVUT0FQUEVORCkgewoJCQlTZXRXaW5kb3dUZXh0Vyhod25kLCBzdHJzKTsKCQkJU2VuZE1lc3NhZ2VXKGh3bmQsIEVNX1NFVFNFTCwgbHN0cmxlblcoaHduZFRleHQpLCBsc3RybGVuVyhzdHJzKSk7CgkJCWJyZWFrOwoJCSAgICB9CQkKCgkJICAgIGlmIChUaGlzLT5vcHRpb25zICYgQUNPX0FVVE9TVUdHRVNUKSB7CgkJCVNlbmRNZXNzYWdlVyhUaGlzLT5od25kTGlzdEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKXN0cnMpOwoJCQlmaWxsZWQgPSBUUlVFOwoJCQljcHQrKzsKCQkgICAgfQoJCX0JCQoJICAgIH0KCSAgICAKCSAgICBpZiAoVGhpcy0+b3B0aW9ucyAmIEFDT19BVVRPU1VHR0VTVCkgewoJCWlmIChmaWxsZWQpIHsKCQkgICAgaGVpZ2h0ID0gU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9HRVRJVEVNSEVJR0hULCAwLCAwKTsKCQkgICAgU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9DQVJFVE9GRiwgMCwgMCk7CgkJICAgIEdldFdpbmRvd1JlY3QoaHduZCwgJnIpOwoJCSAgICBTZXRQYXJlbnQoVGhpcy0+aHduZExpc3RCb3gsIEhXTkRfREVTS1RPUCk7CgkJICAgIC8qIEl0IHNlZW1zIHRoYXQgV2luZG93cyBYUCBkaXNwbGF5cyA3IGxpbmVzIGF0IG1vc3QgCgkJICAgICAgIGFuZCBvdGhlcndpc2UgZGlzcGxheXMgYSB2ZXJ0aWNhbCBzY3JvbGwgYmFyICovCgkJICAgIFNldFdpbmRvd1BvcyhUaGlzLT5od25kTGlzdEJveCwgSFdORF9UT1AsIAoJCQkJIHIubGVmdCwgci5ib3R0b20gKyAxLCByLnJpZ2h0IC0gci5sZWZ0LCBtaW4oaGVpZ2h0ICogNywgaGVpZ2h0KihjcHQrMSkpLCAKCQkJCSBTV1BfU0hPV1dJTkRPVyApOwoJCX0gZWxzZSB7CgkJICAgIFNob3dXaW5kb3coVGhpcy0+aHduZExpc3RCb3gsIFNXX0hJREUpOwoJCX0KCSAgICB9CgkgICAgCgkgICAgYnJlYWs7IAoJZGVmYXVsdDoKCSAgICByZXR1cm4gQ2FsbFdpbmRvd1Byb2NXKFRoaXMtPndwT3JpZ0VkaXRQcm9jLCBod25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7CgkgICAgCiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBMUkVTVUxUIEFQSUVOVFJZIEFDTEJveFN1YmNsYXNzUHJvYyhIV05EIGh3bmQsIFVJTlQgdU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKewogICAgSUNPTV9USElTKElBdXRvQ29tcGxldGVJbXBsLCBHZXRXaW5kb3dMb25nUHRyVyhod25kLCBHV0xQX1VTRVJEQVRBKSk7CiAgICBXQ0hBUiAqbXNnOwogICAgaW50IHNlbCA9IC0xLCBsZW47CgogICAgc3dpdGNoICh1TXNnKSB7CgljYXNlIFdNX01PVVNFTU9WRToKCSAgICBzZWwgPSBTZW5kTWVzc2FnZVcoaHduZCwgTEJfSVRFTUZST01QT0lOVCwgMCwgbFBhcmFtKTsKCSAgICBTZW5kTWVzc2FnZVcoaHduZCwgTEJfU0VUQ1VSU0VMLCAoV1BBUkFNKXNlbCwgKExQQVJBTSkwKTsKCSAgICBicmVhazsKCWNhc2UgV01fTEJVVFRPTkRPV046CgkgICAgbGVuID0gU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRMaXN0Qm94LCBMQl9HRVRURVhUTEVOLCBzZWwsIChMUEFSQU0pTlVMTCk7CgkgICAgbXNnID0gKFdDSEFSKikgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIChsZW4rMSkqc2l6ZW9mKFdDSEFSKSk7CgkgICAgc2VsID0gKElOVClTZW5kTWVzc2FnZVcoaHduZCwgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKCSAgICBTZW5kTWVzc2FnZVcoaHduZCwgTEJfR0VUVEVYVCwgc2VsLCAoTFBBUkFNKW1zZyk7CgkgICAgU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRFZGl0LCBXTV9TRVRURVhULCAwLCAoTFBBUkFNKW1zZyk7CgkgICAgU2VuZE1lc3NhZ2VXKFRoaXMtPmh3bmRFZGl0LCBFTV9TRVRTRUwsIDAsIGxzdHJsZW5XKG1zZykpOwoJICAgIFNob3dXaW5kb3coaHduZCwgU1dfSElERSk7CgkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbXNnKTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgcmV0dXJuIENhbGxXaW5kb3dQcm9jVyhUaGlzLT53cE9yaWdMQm94UHJvYywgaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOwogICAgfQogICAgcmV0dXJuIDA7Cn0K