LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDkgU2FtIExhbnRpbmdhCgogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAgIFNhbSBMYW50aW5nYQogICAgc2xvdWtlbkBsaWJzZGwub3JnCiovCiNpbmNsdWRlICJTRExfY29uZmlnLmgiCgovKiAgCiAgICBOb3RlOiBUaGlzIGZpbGUgaGFzbid0IGJlZW4gbW9kaWZpZWQgc28gdGVjaG5pY2FsbHkgd2UgaGF2ZSB0byBrZWVwIHRoZSBkaXNjbGFpbWVyIDotKAogICAgCiAgICBDb3B5cmlnaHQ6ICCpIENvcHlyaWdodCAyMDAyIEFwcGxlIENvbXB1dGVyLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgRGlzY2xhaW1lcjogSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAgICAgICAgICAgKCJBcHBsZSIpIGluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIKICAgICAgICAgICAgdXNlLCBpbnN0YWxsYXRpb24sIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlCiAgICAgICAgICAgIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsCiAgICAgICAgICAgIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCgogICAgICAgICAgICBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0CiAgICAgICAgICAgIHRvIHRoZXNlIHRlcm1zLCBBcHBsZSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgdW5kZXIgQXBwbGXVcwogICAgICAgICAgICBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLAogICAgICAgICAgICByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0CiAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5IGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUKICAgICAgICAgICAgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dCBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4KICAgICAgICAgICAgdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mCiAgICAgICAgICAgIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgb3IgbG9nb3Mgb2YKICAgICAgICAgICAgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKICAgICAgICAgICAgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gIEV4Y2VwdCBhcwogICAgICAgICAgICBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwKICAgICAgICAgICAgYXJlIGdyYW50ZWQgYnkgQXBwbGUgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQKICAgICAgICAgICAgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlCiAgICAgICAgICAgIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCgogICAgICAgICAgICBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PCiAgICAgICAgICAgIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRAogICAgICAgICAgICBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgICAgICAgICAgIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOCiAgICAgICAgICAgIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KCiAgICAgICAgICAgIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SCiAgICAgICAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKICAgICAgICAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAgICAgICAgICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTgogICAgICAgICAgICBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVAogICAgICAgICAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRiBBUFBMRSBIQVMgQkVFTgogICAgICAgICAgICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgQ0FHdWFyZC5jcAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgSW5jbHVkZXMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiovCiNpbmNsdWRlICJTRExfc3RkaW5jLmgiCgovKiNkZWZpbmUgTkRFQlVHIDEqLwovKgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiovCiNkZWZpbmUgYXNzZXJ0KFgpCgoKI2luY2x1ZGUgIlNETE9TWENBR3VhcmQuaCIKCi8qI3dhcm5pbmcgICAgICBOZWVkIGEgdHJ5LWJhc2VkIExvY2tlciB0b28qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBTRExPU1hDQUd1YXJkCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIGludCBTRExPU1hDQUd1YXJkX0xvY2soU0RMT1NYQ0FHdWFyZCAqY2FnKQp7CiAgICBpbnQgdGhlQW5zd2VyID0gMDsKICAgIAogICAgaWYocHRocmVhZF9zZWxmKCkgIT0gY2FnLT5tT3duZXIpCiAgICB7CiAgICAgICAgT1NTdGF0dXMgdGhlRXJyb3IgPSBwdGhyZWFkX211dGV4X2xvY2soJmNhZy0+bU11dGV4KTsKICAgICAgICAodm9pZCl0aGVFcnJvcjsKICAgICAgICBhc3NlcnQodGhlRXJyb3IgPT0gMCk7CiAgICAgICAgY2FnLT5tT3duZXIgPSBwdGhyZWFkX3NlbGYoKTsKICAgICAgICB0aGVBbnN3ZXIgPSAxOwogICAgfQoKICAgIHJldHVybiB0aGVBbnN3ZXI7Cn0KCnN0YXRpYyB2b2lkICAgIFNETE9TWENBR3VhcmRfVW5sb2NrKFNETE9TWENBR3VhcmQgKmNhZykKewogICAgT1NTdGF0dXMgdGhlRXJyb3I7CiAgICBhc3NlcnQocHRocmVhZF9zZWxmKCkgPT0gY2FnLT5tT3duZXIpOwoKICAgIGNhZy0+bU93bmVyID0gMDsKICAgIHRoZUVycm9yID0gcHRocmVhZF9tdXRleF91bmxvY2soJmNhZy0+bU11dGV4KTsKICAgICh2b2lkKXRoZUVycm9yOwogICAgYXNzZXJ0KHRoZUVycm9yID09IDApOwp9CgpzdGF0aWMgaW50IFNETE9TWENBR3VhcmRfVHJ5IChTRExPU1hDQUd1YXJkICpjYWcsIGludCAqb3V0V2FzTG9ja2VkKQp7CiAgICBpbnQgdGhlQW5zd2VyID0gMDsKICAgICpvdXRXYXNMb2NrZWQgPSAwOwogICAgCiAgICBpZiAocHRocmVhZF9zZWxmKCkgPT0gY2FnLT5tT3duZXIpIHsKICAgICAgICB0aGVBbnN3ZXIgPSAxOwogICAgICAgICpvdXRXYXNMb2NrZWQgPSAwOwogICAgfSBlbHNlIHsKICAgICAgICBPU1N0YXR1cyB0aGVFcnJvciA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmY2FnLT5tTXV0ZXgpOwogICAgICAgIGlmICh0aGVFcnJvciA9PSAwKSB7CiAgICAgICAgICAgIGNhZy0+bU93bmVyID0gcHRocmVhZF9zZWxmKCk7CiAgICAgICAgICAgIHRoZUFuc3dlciA9IDE7CiAgICAgICAgICAgICpvdXRXYXNMb2NrZWQgPSAxOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIHRoZUFuc3dlcjsKfQoKc3RhdGljIHZvaWQgICAgU0RMT1NYQ0FHdWFyZF9XYWl0KFNETE9TWENBR3VhcmQgKmNhZykKewogICAgT1NTdGF0dXMgdGhlRXJyb3I7CiAgICBhc3NlcnQocHRocmVhZF9zZWxmKCkgPT0gY2FnLT5tT3duZXIpOwoKICAgIGNhZy0+bU93bmVyID0gMDsKCiAgICB0aGVFcnJvciA9IHB0aHJlYWRfY29uZF93YWl0KCZjYWctPm1Db25kVmFyLCAmY2FnLT5tTXV0ZXgpOwogICAgKHZvaWQpdGhlRXJyb3I7CiAgICBhc3NlcnQodGhlRXJyb3IgPT0gMCk7CiAgICBjYWctPm1Pd25lciA9IHB0aHJlYWRfc2VsZigpOwp9CgpzdGF0aWMgdm9pZCAgICBTRExPU1hDQUd1YXJkX05vdGlmeShTRExPU1hDQUd1YXJkICpjYWcpCnsKICAgIE9TU3RhdHVzIHRoZUVycm9yID0gcHRocmVhZF9jb25kX3NpZ25hbCgmY2FnLT5tQ29uZFZhcik7CiAgICAodm9pZCl0aGVFcnJvcjsKICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKfQoKClNETE9TWENBR3VhcmQgKm5ld19TRExPU1hDQUd1YXJkKHZvaWQpCnsKICAgIE9TU3RhdHVzIHRoZUVycm9yOwogICAgU0RMT1NYQ0FHdWFyZCAqY2FnID0gKFNETE9TWENBR3VhcmQgKikgU0RMX21hbGxvYyhzaXplb2YgKFNETE9TWENBR3VhcmQpKTsKICAgIGlmIChjYWcgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIFNETF9tZW1zZXQoY2FnLCAnXDAnLCBzaXplb2YgKCpjYWcpKTsKCiAgICAjZGVmaW5lIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRChtKSBjYWctPm0gPSBTRExPU1hDQUd1YXJkXyMjbQogICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKExvY2spOwogICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKFVubG9jayk7CiAgICBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QoVHJ5KTsKICAgIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRChXYWl0KTsKICAgIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRChOb3RpZnkpOwogICAgI3VuZGVmIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRAoKICAgIHRoZUVycm9yID0gcHRocmVhZF9tdXRleF9pbml0KCZjYWctPm1NdXRleCwgTlVMTCk7CiAgICAodm9pZCl0aGVFcnJvcjsKICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKICAgIAogICAgdGhlRXJyb3IgPSBwdGhyZWFkX2NvbmRfaW5pdCgmY2FnLT5tQ29uZFZhciwgTlVMTCk7CiAgICAodm9pZCl0aGVFcnJvcjsKICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKICAgIAogICAgY2FnLT5tT3duZXIgPSAwOwogICAgcmV0dXJuIGNhZzsKfQoKdm9pZCBkZWxldGVfU0RMT1NYQ0FHdWFyZChTRExPU1hDQUd1YXJkICpjYWcpCnsKICAgIGlmIChjYWcgIT0gTlVMTCkKICAgIHsKICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmNhZy0+bU11dGV4KTsKICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmY2FnLT5tQ29uZFZhcik7CiAgICAgICAgU0RMX2ZyZWUoY2FnKTsKICAgIH0KfQoK