LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAkRGF0ZTogICAgICAgIDUuIEZlYnJ1YXJ5IDIwMTMKICogJFJldmlzaW9uOiAgICBWMS4wMgogKgogKiBQcm9qZWN0OiAgICAgIENNU0lTLVJUT1MgQVBJCiAqIFRpdGxlOiAgICAgICAgY21zaXNfb3MuYwogKgogKiBWZXJzaW9uIDAuMDIKICogICAgSW5pdGlhbCBQcm9wb3NhbCBQaGFzZQogKiBWZXJzaW9uIDAuMDMKICogICAgb3NLZXJuZWxTdGFydCBhZGRlZCwgb3B0aW9uYWwgZmVhdHVyZTogbWFpbiBzdGFydGVkIGFzIHRocmVhZAogKiAgICBvc1NlbWFwaG9yZXMgaGF2ZSBzdGFuZGFyZCBiZWhhdmlvcgogKiAgICBvc1RpbWVyQ3JlYXRlIGRvZXMgbm90IHN0YXJ0IHRoZSB0aW1lciwgYWRkZWQgb3NUaW1lclN0YXJ0CiAqICAgIG9zVGhyZWFkUGFzcyBpcyByZW5hbWVkIHRvIG9zVGhyZWFkWWllbGQKICogVmVyc2lvbiAxLjAxCiAqICAgIFN1cHBvcnQgZm9yIEMrKyBpbnRlcmZhY2UKICogICAgIC0gY29uc3QgYXR0cmlidXRlIHJlbW92ZWQgZnJvbSB0aGUgb3NYeHh4RGVmX3QgdHlwZWRlZidzCiAqICAgICAtIGNvbnN0IGF0dHJpYnV0ZSBhZGRlZCB0byB0aGUgb3NYeHh4RGVmIG1hY3JvcwogKiAgICBBZGRlZDogb3NUaW1lckRlbGV0ZSwgb3NNdXRleERlbGV0ZSwgb3NTZW1hcGhvcmVEZWxldGUKICogICAgQWRkZWQ6IG9zS2VybmVsSW5pdGlhbGl6ZQogKiBWZXJzaW9uIDEuMDIKICogICAgQ29udHJvbCBmdW5jdGlvbnMgZm9yIHNob3J0IHRpbWVvdXRzIGluIG1pY3Jvc2Vjb25kIHJlc29sdXRpb246CiAqICAgIEFkZGVkOiBvc0tlcm5lbFN5c1RpY2ssIG9zS2VybmVsU3lzVGlja0ZyZXF1ZW5jeSwgb3NLZXJuZWxTeXNUaWNrTWljcm9TZWMKICogICAgUmVtb3ZlZDogb3NTaWduYWxHZXQgCiAqICAgIAogKiAgCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcyBJbnRlcm5hdGlvbmFsIE4uVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEzIEFSTSBMSU1JVEVECiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqICAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQVJNICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBCRQogKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAiY21zaXNfb3MuaCIKCi8qCiAqIEFSTSBDb21waWxlciA0LzUKICovCiNpZiAgIGRlZmluZWQgKCBfX0NDX0FSTSApCgogICNkZWZpbmUgX19BU00gICAgICAgICAgICBfX2FzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgI2RlZmluZSBfX0lOTElORSAgICAgICAgIF9faW5saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICNkZWZpbmUgX19TVEFUSUNfSU5MSU5FICBzdGF0aWMgX19pbmxpbmUKCiAgI2luY2x1ZGUgImNtc2lzX2FybWNjLmgiCgovKgogKiBHTlUgQ29tcGlsZXIKICovCiNlbGlmIGRlZmluZWQgKCBfX0dOVUNfXyApCgogICNkZWZpbmUgX19BU00gICAgICAgICAgICBfX2FzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBhc20ga2V5d29yZCBmb3IgR05VIENvbXBpbGVyICAgICAgICAgICovCiAgI2RlZmluZSBfX0lOTElORSAgICAgICAgIGlubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGlubGluZSBrZXl3b3JkIGZvciBHTlUgQ29tcGlsZXIgICAgICAgKi8KICAjZGVmaW5lIF9fU1RBVElDX0lOTElORSAgc3RhdGljIGlubGluZQoKICAjaW5jbHVkZSAiY21zaXNfZ2NjLmgiCgoKLyoKICogSUFSIENvbXBpbGVyCiAqLwojZWxpZiBkZWZpbmVkICggX19JQ0NBUk1fXyApCgogICNpZm5kZWYgICBfX0FTTQogICAgI2RlZmluZSBfX0FTTSAgICAgICAgICAgICAgICAgICAgIF9fYXNtCiAgI2VuZGlmCiAgI2lmbmRlZiAgIF9fSU5MSU5FCiAgICAjZGVmaW5lIF9fSU5MSU5FICAgICAgICAgICAgICAgICAgaW5saW5lCiAgI2VuZGlmCiAgI2lmbmRlZiAgIF9fU1RBVElDX0lOTElORQogICAgI2RlZmluZSBfX1NUQVRJQ19JTkxJTkUgICAgICAgICAgIHN0YXRpYyBpbmxpbmUKICAjZW5kaWYKCiAgI2luY2x1ZGUgPGNtc2lzX2lhci5oPgojZW5kaWYKCmV4dGVybiB2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIodm9pZCk7CgovKiBDb252ZXJ0IGZyb20gQ01TSVMgdHlwZSBvc1ByaW9yaXR5IHRvIEZyZWVSVE9TIHByaW9yaXR5IG51bWJlciAqLwpzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSBtYWtlRnJlZVJ0b3NQcmlvcml0eSAob3NQcmlvcml0eSBwcmlvcml0eSkKewogIHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgZnByaW9yaXR5ID0gdHNrSURMRV9QUklPUklUWTsKICAKICBpZiAocHJpb3JpdHkgIT0gb3NQcmlvcml0eUVycm9yKSB7CiAgICBmcHJpb3JpdHkgKz0gKHByaW9yaXR5IC0gb3NQcmlvcml0eUlkbGUpOwogIH0KICAKICByZXR1cm4gZnByaW9yaXR5Owp9CgojaWYgKElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgPT0gMSkKLyogQ29udmVydCBmcm9tIEZyZWVSVE9TIHByaW9yaXR5IG51bWJlciB0byBDTVNJUyB0eXBlIG9zUHJpb3JpdHkgKi8Kc3RhdGljIG9zUHJpb3JpdHkgbWFrZUNtc2lzUHJpb3JpdHkgKHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgZnByaW9yaXR5KQp7CiAgb3NQcmlvcml0eSBwcmlvcml0eSA9IG9zUHJpb3JpdHlFcnJvcjsKICAKICBpZiAoKGZwcmlvcml0eSAtIHRza0lETEVfUFJJT1JJVFkpIDw9IChvc1ByaW9yaXR5UmVhbHRpbWUgLSBvc1ByaW9yaXR5SWRsZSkpIHsKICAgIHByaW9yaXR5ID0gKG9zUHJpb3JpdHkpKChpbnQpb3NQcmlvcml0eUlkbGUgKyAoaW50KShmcHJpb3JpdHkgLSB0c2tJRExFX1BSSU9SSVRZKSk7CiAgfQogIAogIHJldHVybiBwcmlvcml0eTsKfQojZW5kaWYKCgovKiBEZXRlcm1pbmUgd2hldGhlciB3ZSBhcmUgaW4gdGhyZWFkIG1vZGUgb3IgaGFuZGxlciBtb2RlLiAqLwpzdGF0aWMgaW50IGluSGFuZGxlck1vZGUgKHZvaWQpCnsKICByZXR1cm4gX19nZXRfSVBTUigpICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKiBLZXJuZWwgQ29udHJvbCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgoqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUlRPUyBLZXJuZWwgZm9yIGNyZWF0aW5nIG9iamVjdHMuCiogQHJldHZhbCBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zS2VybmVsSW5pdGlhbGl6ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zU3RhdHVzIG9zS2VybmVsSW5pdGlhbGl6ZSAodm9pZCk7CgovKioKKiBAYnJpZWYgIFN0YXJ0IHRoZSBSVE9TIEtlcm5lbCB3aXRoIGV4ZWN1dGluZyB0aGUgc3BlY2lmaWVkIHRocmVhZC4KKiBAcGFyYW0gIHRocmVhZF9kZWYgICAgdGhyZWFkIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NUaHJlYWQuCiogQHBhcmFtICBhcmd1bWVudCAgICAgIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHRocmVhZCBmdW5jdGlvbiBhcyBzdGFydCBhcmd1bWVudC4KKiBAcmV0dmFsIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0tlcm5lbFN0YXJ0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NTdGF0dXMgb3NLZXJuZWxTdGFydCAodm9pZCkKewogIHZUYXNrU3RhcnRTY2hlZHVsZXIoKTsKICAKICByZXR1cm4gb3NPSzsKfQoKLyoqCiogQGJyaWVmICBDaGVjayBpZiB0aGUgUlRPUyBrZXJuZWwgaXMgYWxyZWFkeSBzdGFydGVkCiogQHBhcmFtICBOb25lCiogQHJldHZhbCAoMCkgUlRPUyBpcyBub3Qgc3RhcnRlZAoqICAgICAgICAgKDEpIFJUT1MgaXMgc3RhcnRlZAoqICAgICAgICAgKC0xKSBpZiB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgaW4gRnJlZVJUT1NDb25maWcuaCAKKiBAbm90ZSAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0tlcm5lbFJ1bm5pbmcgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwppbnQzMl90IG9zS2VybmVsUnVubmluZyh2b2lkKQp7CiNpZiAoICggSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApICkKICBpZiAoeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSgpID09IHRhc2tTQ0hFRFVMRVJfTk9UX1NUQVJURUQpCiAgICByZXR1cm4gMDsKICBlbHNlCiAgICByZXR1cm4gMTsKI2Vsc2UKCXJldHVybiAoLTEpOwojZW5kaWYJCn0KCiNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1N5c1RpY2spICAmJiAgKG9zRmVhdHVyZV9TeXNUaWNrICE9IDApKSAgICAgLy8gU3lzdGVtIFRpbWVyIGF2YWlsYWJsZQovKioKKiBAYnJpZWYgIEdldCB0aGUgdmFsdWUgb2YgdGhlIEtlcm5lbCBTeXNUaWNrIHRpbWVyCiogQHBhcmFtICBOb25lCiogQHJldHZhbCBOb25lCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zS2VybmVsU3lzVGljayBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCnVpbnQzMl90IG9zS2VybmVsU3lzVGljayh2b2lkKQp7CiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgcmV0dXJuIHhUYXNrR2V0VGlja0NvdW50RnJvbUlTUigpOwogIH0KICBlbHNlIHsKICAgIHJldHVybiB4VGFza0dldFRpY2tDb3VudCgpOwogIH0KfQojZW5kaWYgICAgLy8gU3lzdGVtIFRpbWVyIGF2YWlsYWJsZQovKioqKioqKioqKioqKioqKioqKioqKiogVGhyZWFkIE1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgoqIEBicmllZiAgQ3JlYXRlIGEgdGhyZWFkIGFuZCBhZGQgaXQgdG8gQWN0aXZlIFRocmVhZHMgYW5kIHNldCBpdCB0byBzdGF0ZSBSRUFEWS4KKiBAcGFyYW0gIHRocmVhZF9kZWYgICAgdGhyZWFkIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NUaHJlYWQuCiogQHBhcmFtICBhcmd1bWVudCAgICAgIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHRocmVhZCBmdW5jdGlvbiBhcyBzdGFydCBhcmd1bWVudC4KKiBAcmV0dmFsIHRocmVhZCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NUaHJlYWRJZCBvc1RocmVhZENyZWF0ZSAoY29uc3Qgb3NUaHJlYWREZWZfdCAqdGhyZWFkX2RlZiwgdm9pZCAqYXJndW1lbnQpCnsKICBUYXNrSGFuZGxlX3QgaGFuZGxlOwogIAojaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQogIGlmKCh0aHJlYWRfZGVmLT5idWZmZXIgIT0gTlVMTCkgJiYgKHRocmVhZF9kZWYtPmNvbnRyb2xibG9jayAhPSBOVUxMKSkgewogICAgaGFuZGxlID0geFRhc2tDcmVhdGVTdGF0aWMoKFRhc2tGdW5jdGlvbl90KXRocmVhZF9kZWYtPnB0aHJlYWQsKGNvbnN0IHBvcnRDSEFSICopdGhyZWFkX2RlZi0+bmFtZSwKICAgICAgICAgICAgICB0aHJlYWRfZGVmLT5zdGFja3NpemUsIGFyZ3VtZW50LCBtYWtlRnJlZVJ0b3NQcmlvcml0eSh0aHJlYWRfZGVmLT50cHJpb3JpdHkpLAogICAgICAgICAgICAgIHRocmVhZF9kZWYtPmJ1ZmZlciwgdGhyZWFkX2RlZi0+Y29udHJvbGJsb2NrKTsKICB9CiAgZWxzZSB7CiAgICBpZiAoeFRhc2tDcmVhdGUoKFRhc2tGdW5jdGlvbl90KXRocmVhZF9kZWYtPnB0aHJlYWQsKGNvbnN0IHBvcnRDSEFSICopdGhyZWFkX2RlZi0+bmFtZSwKICAgICAgICAgICAgICB0aHJlYWRfZGVmLT5zdGFja3NpemUsIGFyZ3VtZW50LCBtYWtlRnJlZVJ0b3NQcmlvcml0eSh0aHJlYWRfZGVmLT50cHJpb3JpdHkpLAogICAgICAgICAgICAgICZoYW5kbGUpICE9IHBkUEFTUykgIHsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IAogIH0KI2VsaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCgogICAgaGFuZGxlID0geFRhc2tDcmVhdGVTdGF0aWMoKFRhc2tGdW5jdGlvbl90KXRocmVhZF9kZWYtPnB0aHJlYWQsKGNvbnN0IHBvcnRDSEFSICopdGhyZWFkX2RlZi0+bmFtZSwKICAgICAgICAgICAgICB0aHJlYWRfZGVmLT5zdGFja3NpemUsIGFyZ3VtZW50LCBtYWtlRnJlZVJ0b3NQcmlvcml0eSh0aHJlYWRfZGVmLT50cHJpb3JpdHkpLAogICAgICAgICAgICAgIHRocmVhZF9kZWYtPmJ1ZmZlciwgdGhyZWFkX2RlZi0+Y29udHJvbGJsb2NrKTsKI2Vsc2UKICBpZiAoeFRhc2tDcmVhdGUoKFRhc2tGdW5jdGlvbl90KXRocmVhZF9kZWYtPnB0aHJlYWQsKGNvbnN0IHBvcnRDSEFSICopdGhyZWFkX2RlZi0+bmFtZSwKICAgICAgICAgICAgICAgICAgIHRocmVhZF9kZWYtPnN0YWNrc2l6ZSwgYXJndW1lbnQsIG1ha2VGcmVlUnRvc1ByaW9yaXR5KHRocmVhZF9kZWYtPnRwcmlvcml0eSksCiAgICAgICAgICAgICAgICAgICAmaGFuZGxlKSAhPSBwZFBBU1MpICB7CiAgICByZXR1cm4gTlVMTDsKICB9ICAgICAKI2VuZGlmCiAgCiAgcmV0dXJuIGhhbmRsZTsKfQoKLyoqCiogQGJyaWVmICBSZXR1cm4gdGhlIHRocmVhZCBJRCBvZiB0aGUgY3VycmVudCBydW5uaW5nIHRocmVhZC4KKiBAcmV0dmFsIHRocmVhZCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkR2V0SWQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1RocmVhZElkIG9zVGhyZWFkR2V0SWQgKHZvaWQpCnsKI2lmICggKCBJTkNMVURFX3hUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUgPT0gMSApIHx8ICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICkKICByZXR1cm4geFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpOwojZWxzZQoJcmV0dXJuIE5VTEw7CiNlbmRpZgp9CgovKioKKiBAYnJpZWYgIFRlcm1pbmF0ZSBleGVjdXRpb24gb2YgYSB0aHJlYWQgYW5kIHJlbW92ZSBpdCBmcm9tIEFjdGl2ZSBUaHJlYWRzLgoqIEBwYXJhbSAgIHRocmVhZF9pZCAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkVGVybWluYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NTdGF0dXMgb3NUaHJlYWRUZXJtaW5hdGUgKG9zVGhyZWFkSWQgdGhyZWFkX2lkKQp7CiNpZiAoSU5DTFVERV92VGFza0RlbGV0ZSA9PSAxKQogIHZUYXNrRGVsZXRlKHRocmVhZF9pZCk7CiAgcmV0dXJuIG9zT0s7CiNlbHNlCiAgcmV0dXJuIG9zRXJyb3JPUzsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiAgUGFzcyBjb250cm9sIHRvIG5leHQgdGhyZWFkIHRoYXQgaXMgaW4gc3RhdGUgXGIgUkVBRFkuCiogQHJldHZhbCBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkWWllbGQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1N0YXR1cyBvc1RocmVhZFlpZWxkICh2b2lkKQp7CiAgdGFza1lJRUxEKCk7CiAgCiAgcmV0dXJuIG9zT0s7Cn0KCi8qKgoqIEBicmllZiAgIENoYW5nZSBwcmlvcml0eSBvZiBhbiBhY3RpdmUgdGhyZWFkLgoqIEBwYXJhbSAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgoqIEBwYXJhbSAgIHByaW9yaXR5ICAgICAgbmV3IHByaW9yaXR5IHZhbHVlIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaHJlYWRTZXRQcmlvcml0eSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zU3RhdHVzIG9zVGhyZWFkU2V0UHJpb3JpdHkgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBvc1ByaW9yaXR5IHByaW9yaXR5KQp7CiNpZiAoSU5DTFVERV92VGFza1ByaW9yaXR5U2V0ID09IDEpCiAgdlRhc2tQcmlvcml0eVNldCh0aHJlYWRfaWQsIG1ha2VGcmVlUnRvc1ByaW9yaXR5KHByaW9yaXR5KSk7CiAgcmV0dXJuIG9zT0s7CiNlbHNlCiAgcmV0dXJuIG9zRXJyb3JPUzsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiAgIEdldCBjdXJyZW50IHByaW9yaXR5IG9mIGFuIGFjdGl2ZSB0aHJlYWQuCiogQHBhcmFtICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCiogQHJldHZhbCAgY3VycmVudCBwcmlvcml0eSB2YWx1ZSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RocmVhZEdldFByaW9yaXR5IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NQcmlvcml0eSBvc1RocmVhZEdldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCkKewojaWYgKElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgPT0gMSkKICBpZiAoaW5IYW5kbGVyTW9kZSgpKQogIHsKICAgIHJldHVybiBtYWtlQ21zaXNQcmlvcml0eSh1eFRhc2tQcmlvcml0eUdldEZyb21JU1IodGhyZWFkX2lkKSk7ICAKICB9CiAgZWxzZQogIHsgIAogICAgcmV0dXJuIG1ha2VDbXNpc1ByaW9yaXR5KHV4VGFza1ByaW9yaXR5R2V0KHRocmVhZF9pZCkpOwogIH0KI2Vsc2UKICByZXR1cm4gb3NQcmlvcml0eUVycm9yOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqIEdlbmVyaWMgV2FpdCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiogQGJyaWVmICAgV2FpdCBmb3IgVGltZW91dCAoVGltZSBEZWxheSkKKiBAcGFyYW0gICBtaWxsaXNlYyAgICAgIHRpbWUgZGVsYXkgdmFsdWUKKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zRGVsYXkgKHVpbnQzMl90IG1pbGxpc2VjKQp7CiNpZiBJTkNMVURFX3ZUYXNrRGVsYXkKICBUaWNrVHlwZV90IHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CiAgCiAgdlRhc2tEZWxheSh0aWNrcyA/IHRpY2tzIDogMSk7ICAgICAgICAgIC8qIE1pbmltdW0gZGVsYXkgPSAxIHRpY2sgKi8KICAKICByZXR1cm4gb3NPSzsKI2Vsc2UKICAodm9pZCkgbWlsbGlzZWM7CiAgCiAgcmV0dXJuIG9zRXJyb3JSZXNvdXJjZTsKI2VuZGlmCn0KCiNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1dhaXQpICAmJiAgKG9zRmVhdHVyZV9XYWl0ICE9IDApKSAvKiBHZW5lcmljIFdhaXQgYXZhaWxhYmxlICovCi8qKgoqIEBicmllZiAgV2FpdCBmb3IgU2lnbmFsLCBNZXNzYWdlLCBNYWlsLCBvciBUaW1lb3V0CiogQHBhcmFtICAgbWlsbGlzZWMgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0CiogQHJldHZhbCAgZXZlbnQgdGhhdCBjb250YWlucyBzaWduYWwsIG1lc3NhZ2UsIG9yIG1haWwgaW5mb3JtYXRpb24gb3IgZXJyb3IgY29kZS4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NXYWl0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NFdmVudCBvc1dhaXQgKHVpbnQzMl90IG1pbGxpc2VjKTsKCiNlbmRpZiAgLyogR2VuZXJpYyBXYWl0IGF2YWlsYWJsZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqICBUaW1lciBNYW5hZ2VtZW50IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgoqIEBicmllZiAgQ3JlYXRlIGEgdGltZXIuCiogQHBhcmFtICB0aW1lcl9kZWYgICAgIHRpbWVyIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1RpbWVyLgoqIEBwYXJhbSAgdHlwZSAgICAgICAgICBvc1RpbWVyT25jZSBmb3Igb25lLXNob3Qgb3Igb3NUaW1lclBlcmlvZGljIGZvciBwZXJpb2RpYyBiZWhhdmlvci4KKiBAcGFyYW0gIGFyZ3VtZW50ICAgICAgYXJndW1lbnQgdG8gdGhlIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KKiBAcmV0dmFsICB0aW1lciBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGltZXJDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1RpbWVySWQgb3NUaW1lckNyZWF0ZSAoY29uc3Qgb3NUaW1lckRlZl90ICp0aW1lcl9kZWYsIG9zX3RpbWVyX3R5cGUgdHlwZSwgdm9pZCAqYXJndW1lbnQpCnsKI2lmIChjb25maWdVU0VfVElNRVJTID09IDEpCgojaWYoICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKSAKICBpZih0aW1lcl9kZWYtPmNvbnRyb2xibG9jayAhPSBOVUxMKSB7CiAgICByZXR1cm4geFRpbWVyQ3JlYXRlU3RhdGljKChjb25zdCBjaGFyICopIiIsCiAgICAgICAgICAgICAgICAgICAgICAxLCAvLyBwZXJpb2Qgc2hvdWxkIGJlIGZpbGxlZCB3aGVuIHN0YXJ0aW5nIHRoZSBUaW1lciB1c2luZyBvc1RpbWVyU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IG9zVGltZXJQZXJpb2RpYykgPyBwZFRSVUUgOiBwZEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAoVGFza0Z1bmN0aW9uX3QpdGltZXJfZGVmLT5wdGltZXIsCiAgICAgICAgICAgICAgICAgICAgICAoU3RhdGljVGltZXJfdCAqKXRpbWVyX2RlZi0+Y29udHJvbGJsb2NrKTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4geFRpbWVyQ3JlYXRlKChjb25zdCBjaGFyICopIiIsCiAgICAgICAgICAgICAgICAgICAgICAxLCAvLyBwZXJpb2Qgc2hvdWxkIGJlIGZpbGxlZCB3aGVuIHN0YXJ0aW5nIHRoZSBUaW1lciB1c2luZyBvc1RpbWVyU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IG9zVGltZXJQZXJpb2RpYykgPyBwZFRSVUUgOiBwZEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAoVGFza0Z1bmN0aW9uX3QpdGltZXJfZGVmLT5wdGltZXIpOwogfQojZWxpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKICByZXR1cm4geFRpbWVyQ3JlYXRlU3RhdGljKChjb25zdCBjaGFyICopIiIsCiAgICAgICAgICAgICAgICAgICAgICAxLCAvLyBwZXJpb2Qgc2hvdWxkIGJlIGZpbGxlZCB3aGVuIHN0YXJ0aW5nIHRoZSBUaW1lciB1c2luZyBvc1RpbWVyU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IG9zVGltZXJQZXJpb2RpYykgPyBwZFRSVUUgOiBwZEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAoVGFza0Z1bmN0aW9uX3QpdGltZXJfZGVmLT5wdGltZXIsCiAgICAgICAgICAgICAgICAgICAgICAoU3RhdGljVGltZXJfdCAqKXRpbWVyX2RlZi0+Y29udHJvbGJsb2NrKTsgIAojZWxzZQogIHJldHVybiB4VGltZXJDcmVhdGUoKGNvbnN0IGNoYXIgKikiIiwKICAgICAgICAgICAgICAgICAgICAgIDEsIC8vIHBlcmlvZCBzaG91bGQgYmUgZmlsbGVkIHdoZW4gc3RhcnRpbmcgdGhlIFRpbWVyIHVzaW5nIG9zVGltZXJTdGFydAogICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gb3NUaW1lclBlcmlvZGljKSA/IHBkVFJVRSA6IHBkRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBhcmd1bWVudCwKICAgICAgICAgICAgICAgICAgICAgIChUYXNrRnVuY3Rpb25fdCl0aW1lcl9kZWYtPnB0aW1lcik7CiNlbmRpZgoKI2Vsc2UgCglyZXR1cm4gTlVMTDsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiAgU3RhcnQgb3IgcmVzdGFydCBhIHRpbWVyLgoqIEBwYXJhbSAgdGltZXJfaWQgICAgICB0aW1lciBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGltZXJDcmVhdGUuCiogQHBhcmFtICBtaWxsaXNlYyAgICAgIHRpbWUgZGVsYXkgdmFsdWUgb2YgdGhlIHRpbWVyLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RpbWVyU3RhcnQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1N0YXR1cyBvc1RpbWVyU3RhcnQgKG9zVGltZXJJZCB0aW1lcl9pZCwgdWludDMyX3QgbWlsbGlzZWMpCnsKICBvc1N0YXR1cyByZXN1bHQgPSBvc09LOwojaWYgKGNvbmZpZ1VTRV9USU1FUlMgPT0gMSkgIAogIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuID0gcGRGQUxTRTsKICBUaWNrVHlwZV90IHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CgogIGlmICh0aWNrcyA9PSAwKQogICAgdGlja3MgPSAxOwogICAgCiAgaWYgKGluSGFuZGxlck1vZGUoKSkgCiAgewogICAgaWYgKHhUaW1lckNoYW5nZVBlcmlvZEZyb21JU1IodGltZXJfaWQsIHRpY2tzLCAmdGFza1dva2VuKSAhPSBwZFBBU1MpCiAgICB7CiAgICAgIHJlc3VsdCA9IG9zRXJyb3JPUzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7ICAgICAKICAgIH0KICB9CiAgZWxzZSAKICB7CiAgICBpZiAoeFRpbWVyQ2hhbmdlUGVyaW9kKHRpbWVyX2lkLCB0aWNrcywgMCkgIT0gcGRQQVNTKQogICAgICByZXN1bHQgPSBvc0Vycm9yT1M7CiAgfQoKI2Vsc2UgCiAgcmVzdWx0ID0gb3NFcnJvck9TOwojZW5kaWYKICByZXR1cm4gcmVzdWx0Owp9CgovKioKKiBAYnJpZWYgIFN0b3AgYSB0aW1lci4KKiBAcGFyYW0gIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyQ3JlYXRlCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RpbWVyU3RvcCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zU3RhdHVzIG9zVGltZXJTdG9wIChvc1RpbWVySWQgdGltZXJfaWQpCnsKICBvc1N0YXR1cyByZXN1bHQgPSBvc09LOwojaWYgKGNvbmZpZ1VTRV9USU1FUlMgPT0gMSkgIAogIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuID0gcGRGQUxTRTsKCiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgaWYgKHhUaW1lclN0b3BGcm9tSVNSKHRpbWVyX2lkLCAmdGFza1dva2VuKSAhPSBwZFBBU1MpIHsKICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKICAgIH0KICAgIHBvcnRFTkRfU1dJVENISU5HX0lTUih0YXNrV29rZW4pOwogIH0KICBlbHNlIHsKICAgIGlmICh4VGltZXJTdG9wKHRpbWVyX2lkLCAwKSAhPSBwZFBBU1MpIHsKICAgICAgcmVzdWx0ID0gb3NFcnJvck9TOwogICAgfQogIH0KI2Vsc2UgCiAgcmVzdWx0ID0gb3NFcnJvck9TOwojZW5kaWYgCiAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqCiogQGJyaWVmICBEZWxldGUgYSB0aW1lci4KKiBAcGFyYW0gIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyQ3JlYXRlCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RpbWVyRGVsZXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NTdGF0dXMgb3NUaW1lckRlbGV0ZSAob3NUaW1lcklkIHRpbWVyX2lkKQp7Cm9zU3RhdHVzIHJlc3VsdCA9IG9zT0s7CgojaWYgKGNvbmZpZ1VTRV9USU1FUlMgPT0gMSkKCiAgIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKICAgICByZXR1cm4gb3NFcnJvcklTUjsKICB9CiAgZWxzZSB7IAogICAgaWYgKCh4VGltZXJEZWxldGUodGltZXJfaWQsIG9zV2FpdEZvcmV2ZXIgKSkgIT0gcGRQQVNTKSB7CiAgICAgIHJlc3VsdCA9IG9zRXJyb3JPUzsKICAgIH0KICB9IAogICAgCiNlbHNlIAogIHJlc3VsdCA9IG9zRXJyb3JPUzsKI2VuZGlmIAogCiAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgU2lnbmFsIE1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgoqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgU2lnbmFsIEZsYWdzIG9mIGFuIGFjdGl2ZSB0aHJlYWQuCiogQHBhcmFtICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKiBAcGFyYW0gIHNpZ25hbHMgICAgICAgc3BlY2lmaWVzIHRoZSBzaWduYWwgZmxhZ3Mgb2YgdGhlIHRocmVhZCB0aGF0IHNob3VsZCBiZSBzZXQuCiogQHJldHZhbCBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NpZ25hbFNldCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCmludDMyX3Qgb3NTaWduYWxTZXQgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbCkKewojaWYoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCQogIEJhc2VUeXBlX3QgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRGQUxTRTsKICB1aW50MzJfdCB1bFByZXZpb3VzTm90aWZpY2F0aW9uVmFsdWUgPSAwOwogIAogIGlmIChpbkhhbmRsZXJNb2RlKCkpCiAgewogICAgaWYoeFRhc2tHZW5lcmljTm90aWZ5RnJvbUlTUiggdGhyZWFkX2lkICwgKHVpbnQzMl90KXNpZ25hbCwgZVNldEJpdHMsICZ1bFByZXZpb3VzTm90aWZpY2F0aW9uVmFsdWUsICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSAhPSBwZFBBU1MgKQogICAgICByZXR1cm4gMHg4MDAwMDAwMDsKICAgIAogICAgcG9ydFlJRUxEX0ZST01fSVNSKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKICB9ICAKICBlbHNlIGlmKHhUYXNrR2VuZXJpY05vdGlmeSggdGhyZWFkX2lkICwgKHVpbnQzMl90KXNpZ25hbCwgZVNldEJpdHMsICZ1bFByZXZpb3VzTm90aWZpY2F0aW9uVmFsdWUpICE9IHBkUEFTUyApCiAgICByZXR1cm4gMHg4MDAwMDAwMDsKICAKICByZXR1cm4gdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlOwojZWxzZQogICh2b2lkKSB0aHJlYWRfaWQ7CiAgKHZvaWQpIHNpZ25hbDsKCiAgcmV0dXJuIDB4ODAwMDAwMDA7IC8qIFRhc2sgTm90aWZpY2F0aW9uIG5vdCBzdXBwb3J0ZWQgKi8gCQojZW5kaWYKfQoKLyoqCiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIFNpZ25hbCBGbGFncyBvZiBhbiBhY3RpdmUgdGhyZWFkLgoqIEBwYXJhbSAgdGhyZWFkX2lkICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCiogQHBhcmFtICBzaWduYWxzICAgIHNwZWNpZmllcyB0aGUgc2lnbmFsIGZsYWdzIG9mIHRoZSB0aHJlYWQgdGhhdCBzaGFsbCBiZSBjbGVhcmVkLgoqIEByZXR2YWwgIHByZXZpb3VzIHNpZ25hbCBmbGFncyBvZiB0aGUgc3BlY2lmaWVkIHRocmVhZCBvciAweDgwMDAwMDAwIGluIGNhc2Ugb2YgaW5jb3JyZWN0IHBhcmFtZXRlcnMuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zU2lnbmFsQ2xlYXIgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwppbnQzMl90IG9zU2lnbmFsQ2xlYXIgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbCk7CgovKioKKiBAYnJpZWYgIFdhaXQgZm9yIG9uZSBvciBtb3JlIFNpZ25hbCBGbGFncyB0byBiZWNvbWUgc2lnbmFsZWQgZm9yIHRoZSBjdXJyZW50IFxiIFJVTk5JTkcgdGhyZWFkLgoqIEBwYXJhbSAgc2lnbmFscyAgIHdhaXQgdW50aWwgYWxsIHNwZWNpZmllZCBzaWduYWwgZmxhZ3Mgc2V0IG9yIDAgZm9yIGFueSBzaW5nbGUgc2lnbmFsIGZsYWcuCiogQHBhcmFtICBtaWxsaXNlYyAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiogQHJldHZhbCAgZXZlbnQgZmxhZyBpbmZvcm1hdGlvbiBvciBlcnJvciBjb2RlLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NpZ25hbFdhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc0V2ZW50IG9zU2lnbmFsV2FpdCAoaW50MzJfdCBzaWduYWxzLCB1aW50MzJfdCBtaWxsaXNlYykKewogIG9zRXZlbnQgcmV0OwoKI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQoJCiAgVGlja1R5cGVfdCB0aWNrczsKCiAgcmV0LnZhbHVlLnNpZ25hbHMgPSAwOyAgCiAgdGlja3MgPSAwOwogIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSB7CiAgICB0aWNrcyA9IHBvcnRNQVhfREVMQVk7CiAgfQogIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIHsKICAgIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CiAgICBpZiAodGlja3MgPT0gMCkgewogICAgICB0aWNrcyA9IDE7CiAgICB9CiAgfSAgCiAgCiAgaWYgKGluSGFuZGxlck1vZGUoKSkKICB7CiAgICByZXQuc3RhdHVzID0gb3NFcnJvcklTUjsgIC8qTm90IGFsbG93ZWQgaW4gSVNSKi8KICB9CiAgZWxzZQogIHsKICAgIGlmKHhUYXNrTm90aWZ5V2FpdCggMCwodWludDMyX3QpIHNpZ25hbHMsICh1aW50MzJfdCAqKSZyZXQudmFsdWUuc2lnbmFscywgdGlja3MpICE9IHBkVFJVRSkKICAgIHsKICAgICAgaWYodGlja3MgPT0gMCkgIHJldC5zdGF0dXMgPSBvc09LOwogICAgICBlbHNlICByZXQuc3RhdHVzID0gb3NFdmVudFRpbWVvdXQ7CiAgICB9CiAgICBlbHNlIGlmKHJldC52YWx1ZS5zaWduYWxzIDwgMCkKICAgIHsKICAgICAgcmV0LnN0YXR1cyA9ICBvc0Vycm9yVmFsdWU7ICAgICAKICAgIH0KICAgIGVsc2UgIHJldC5zdGF0dXMgPSAgb3NFdmVudFNpZ25hbDsKICB9CiNlbHNlCiAgKHZvaWQpIHNpZ25hbHM7CiAgKHZvaWQpIG1pbGxpc2VjOwoJCiAgcmV0LnN0YXR1cyA9ICBvc0Vycm9yT1M7CS8qIFRhc2sgTm90aWZpY2F0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KI2VuZGlmCiAgCiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE11dGV4IE1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgoqIEBicmllZiAgQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgTXV0ZXggb2JqZWN0CiogQHBhcmFtICBtdXRleF9kZWYgICAgIG11dGV4IGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NNdXRleC4KKiBAcmV0dmFsICBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTXV0ZXhDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc011dGV4SWQgb3NNdXRleENyZWF0ZSAoY29uc3Qgb3NNdXRleERlZl90ICptdXRleF9kZWYpCnsKI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSkKCiNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKCiAgaWYgKG11dGV4X2RlZi0+Y29udHJvbGJsb2NrICE9IE5VTEwpIHsKICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlTXV0ZXhTdGF0aWMoIG11dGV4X2RlZi0+Y29udHJvbGJsb2NrICk7CiAgICAgfQogIGVsc2UgewogICAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpOyAKICB9CiNlbGlmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljKCBtdXRleF9kZWYtPmNvbnRyb2xibG9jayApOwojZWxzZSAgCiAgICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZU11dGV4KCk7IAojZW5kaWYKI2Vsc2UKICByZXR1cm4gTlVMTDsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiBXYWl0IHVudGlsIGEgTXV0ZXggYmVjb21lcyBhdmFpbGFibGUKKiBAcGFyYW0gbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCiogQHBhcmFtIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc011dGV4V2FpdCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zU3RhdHVzIG9zTXV0ZXhXYWl0IChvc011dGV4SWQgbXV0ZXhfaWQsIHVpbnQzMl90IG1pbGxpc2VjKQp7CiAgVGlja1R5cGVfdCB0aWNrczsKICBwb3J0QkFTRV9UWVBFIHRhc2tXb2tlbiA9IHBkRkFMU0U7ICAKICAKICAKICBpZiAobXV0ZXhfaWQgPT0gTlVMTCkgewogICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIAogIHRpY2tzID0gMDsKICBpZiAobWlsbGlzZWMgPT0gb3NXYWl0Rm9yZXZlcikgewogICAgdGlja3MgPSBwb3J0TUFYX0RFTEFZOwogIH0KICBlbHNlIGlmIChtaWxsaXNlYyAhPSAwKSB7CiAgICB0aWNrcyA9IG1pbGxpc2VjIC8gcG9ydFRJQ0tfUEVSSU9EX01TOwogICAgaWYgKHRpY2tzID09IDApIHsKICAgICAgdGlja3MgPSAxOwogICAgfQogIH0KICAKICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CiAgICBpZiAoeFNlbWFwaG9yZVRha2VGcm9tSVNSKG11dGV4X2lkLCAmdGFza1dva2VuKSAhPSBwZFRSVUUpIHsKICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKICAgIH0KCXBvcnRFTkRfU1dJVENISU5HX0lTUih0YXNrV29rZW4pOwogIH0gCiAgZWxzZSBpZiAoeFNlbWFwaG9yZVRha2UobXV0ZXhfaWQsIHRpY2tzKSAhPSBwZFRSVUUpIHsKICAgIHJldHVybiBvc0Vycm9yT1M7CiAgfQogIAogIHJldHVybiBvc09LOwp9CgovKioKKiBAYnJpZWYgUmVsZWFzZSBhIE11dGV4IHRoYXQgd2FzIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleFdhaXQKKiBAcGFyYW0gbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc011dGV4UmVsZWFzZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zU3RhdHVzIG9zTXV0ZXhSZWxlYXNlIChvc011dGV4SWQgbXV0ZXhfaWQpCnsKICBvc1N0YXR1cyByZXN1bHQgPSBvc09LOwogIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuID0gcGRGQUxTRTsKICAKICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CiAgICBpZiAoeFNlbWFwaG9yZUdpdmVGcm9tSVNSKG11dGV4X2lkLCAmdGFza1dva2VuKSAhPSBwZFRSVUUpIHsKICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKICAgIH0KICAgIHBvcnRFTkRfU1dJVENISU5HX0lTUih0YXNrV29rZW4pOwogIH0KICBlbHNlIGlmICh4U2VtYXBob3JlR2l2ZShtdXRleF9pZCkgIT0gcGRUUlVFKSAKICB7CiAgICByZXN1bHQgPSBvc0Vycm9yT1M7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCi8qKgoqIEBicmllZiBEZWxldGUgYSBNdXRleAoqIEBwYXJhbSBtdXRleF9pZCAgbXV0ZXggSUQgb2J0YWluZWQgYnkgXHJlZiBvc011dGV4Q3JlYXRlLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNdXRleERlbGV0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zU3RhdHVzIG9zTXV0ZXhEZWxldGUgKG9zTXV0ZXhJZCBtdXRleF9pZCkKewogIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKICAgIHJldHVybiBvc0Vycm9ySVNSOwogIH0KCiAgdlF1ZXVlRGVsZXRlKG11dGV4X2lkKTsKCiAgcmV0dXJuIG9zT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKiAgU2VtYXBob3JlIE1hbmFnZW1lbnQgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfU2VtYXBob3JlKSAgJiYgIChvc0ZlYXR1cmVfU2VtYXBob3JlICE9IDApKQoKLyoqCiogQGJyaWVmIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIFNlbWFwaG9yZSBvYmplY3QgdXNlZCBmb3IgbWFuYWdpbmcgcmVzb3VyY2VzCiogQHBhcmFtIHNlbWFwaG9yZV9kZWYgc2VtYXBob3JlIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmUuCiogQHBhcmFtIGNvdW50ICAgICAgICAgbnVtYmVyIG9mIGF2YWlsYWJsZSByZXNvdXJjZXMuCiogQHJldHZhbCAgc2VtYXBob3JlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTZW1hcGhvcmVDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1NlbWFwaG9yZUlkIG9zU2VtYXBob3JlQ3JlYXRlIChjb25zdCBvc1NlbWFwaG9yZURlZl90ICpzZW1hcGhvcmVfZGVmLCBpbnQzMl90IGNvdW50KQp7IAojaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCgogIG9zU2VtYXBob3JlSWQgc2VtYTsKICAKICBpZiAoc2VtYXBob3JlX2RlZi0+Y29udHJvbGJsb2NrICE9IE5VTEwpewogICAgaWYgKGNvdW50ID09IDEpIHsKICAgICAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnlTdGF0aWMoIHNlbWFwaG9yZV9kZWYtPmNvbnRyb2xibG9jayApOwogICAgfQogICAgZWxzZSB7CiNpZiAoY29uZmlnVVNFX0NPVU5USU5HX1NFTUFQSE9SRVMgPT0gMSApCiAgICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmdTdGF0aWMoIGNvdW50LCBjb3VudCwgc2VtYXBob3JlX2RlZi0+Y29udHJvbGJsb2NrICk7CiNlbHNlCiAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgIH0KICB9CiAgZWxzZSB7CiAgICBpZiAoY291bnQgPT0gMSkgewogICAgICB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KHNlbWEpOwogICAgICByZXR1cm4gc2VtYTsKICAgIH0KICAgIGVsc2UgewojaWYgKGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKQkKICAgICAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZyhjb3VudCwgY291bnQpOwojZWxzZQogICAgICByZXR1cm4gTlVMTDsKI2VuZGlmICAgIAogICAgfQogIH0KI2VsaWYgKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAvLyBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAwCiAgaWYoY291bnQgPT0gMSkgewogICAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnlTdGF0aWMoIHNlbWFwaG9yZV9kZWYtPmNvbnRyb2xibG9jayApOwogIH0KICBlbHNlCiAgewojaWYgKGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKQogICAgICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nU3RhdGljKCBjb3VudCwgY291bnQsIHNlbWFwaG9yZV9kZWYtPmNvbnRyb2xibG9jayApOwojZWxzZQogICAgICByZXR1cm4gTlVMTDsKI2VuZGlmICAgIAogIH0KI2Vsc2UgIC8vIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMCAgJiYgY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMQogIG9zU2VtYXBob3JlSWQgc2VtYTsKIAogIGlmIChjb3VudCA9PSAxKSB7CiAgICB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KHNlbWEpOwogICAgcmV0dXJuIHNlbWE7CiAgfQogIGVsc2UgewojaWYgKGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKQkKICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoY291bnQsIGNvdW50KTsKI2Vsc2UKICAgIHJldHVybiBOVUxMOwojZW5kaWYKICB9CiNlbmRpZgp9CgovKioKKiBAYnJpZWYgV2FpdCB1bnRpbCBhIFNlbWFwaG9yZSB0b2tlbiBiZWNvbWVzIGF2YWlsYWJsZQoqIEBwYXJhbSAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlLgoqIEBwYXJhbSAgbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKiBAcmV0dmFsICBudW1iZXIgb2YgYXZhaWxhYmxlIHRva2Vucywgb3IgLTEgaW4gY2FzZSBvZiBpbmNvcnJlY3QgcGFyYW1ldGVycy4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTZW1hcGhvcmVXYWl0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8KaW50MzJfdCBvc1NlbWFwaG9yZVdhaXQgKG9zU2VtYXBob3JlSWQgc2VtYXBob3JlX2lkLCB1aW50MzJfdCBtaWxsaXNlYykKewogIFRpY2tUeXBlX3QgdGlja3M7CiAgcG9ydEJBU0VfVFlQRSB0YXNrV29rZW4gPSBwZEZBTFNFOyAgCiAgCiAgCiAgaWYgKHNlbWFwaG9yZV9pZCA9PSBOVUxMKSB7CiAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgCiAgdGlja3MgPSAwOwogIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSB7CiAgICB0aWNrcyA9IHBvcnRNQVhfREVMQVk7CiAgfQogIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIHsKICAgIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CiAgICBpZiAodGlja3MgPT0gMCkgewogICAgICB0aWNrcyA9IDE7CiAgICB9CiAgfQogIAogIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKICAgIGlmICh4U2VtYXBob3JlVGFrZUZyb21JU1Ioc2VtYXBob3JlX2lkLCAmdGFza1dva2VuKSAhPSBwZFRSVUUpIHsKICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKICAgIH0KCXBvcnRFTkRfU1dJVENISU5HX0lTUih0YXNrV29rZW4pOwogIH0gIAogIGVsc2UgaWYgKHhTZW1hcGhvcmVUYWtlKHNlbWFwaG9yZV9pZCwgdGlja3MpICE9IHBkVFJVRSkgewogICAgcmV0dXJuIG9zRXJyb3JPUzsKICB9CiAgCiAgcmV0dXJuIG9zT0s7Cn0KCi8qKgoqIEBicmllZiBSZWxlYXNlIGEgU2VtYXBob3JlIHRva2VuCiogQHBhcmFtICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmUuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NlbWFwaG9yZVJlbGVhc2Ugc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1N0YXR1cyBvc1NlbWFwaG9yZVJlbGVhc2UgKG9zU2VtYXBob3JlSWQgc2VtYXBob3JlX2lkKQp7CiAgb3NTdGF0dXMgcmVzdWx0ID0gb3NPSzsKICBwb3J0QkFTRV9UWVBFIHRhc2tXb2tlbiA9IHBkRkFMU0U7CiAgCiAgCiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgaWYgKHhTZW1hcGhvcmVHaXZlRnJvbUlTUihzZW1hcGhvcmVfaWQsICZ0YXNrV29rZW4pICE9IHBkVFJVRSkgewogICAgICByZXR1cm4gb3NFcnJvck9TOwogICAgfQogICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CiAgfQogIGVsc2UgewogICAgaWYgKHhTZW1hcGhvcmVHaXZlKHNlbWFwaG9yZV9pZCkgIT0gcGRUUlVFKSB7CiAgICAgIHJlc3VsdCA9IG9zRXJyb3JPUzsKICAgIH0KICB9CiAgCiAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqCiogQGJyaWVmIERlbGV0ZSBhIFNlbWFwaG9yZQoqIEBwYXJhbSAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTZW1hcGhvcmVEZWxldGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1N0YXR1cyBvc1NlbWFwaG9yZURlbGV0ZSAob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQpCnsKICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CiAgICByZXR1cm4gb3NFcnJvcklTUjsKICB9CgogIHZTZW1hcGhvcmVEZWxldGUoc2VtYXBob3JlX2lkKTsKCiAgcmV0dXJuIG9zT0s7IAp9CgojZW5kaWYgICAgLyogVXNlIFNlbWFwaG9yZXMgKi8KCi8qKioqKioqKioqKioqKioqKioqICAgTWVtb3J5IFBvb2wgTWFuYWdlbWVudCBGdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfUG9vbCkgICYmICAob3NGZWF0dXJlX1Bvb2wgIT0gMCkpIAoKLy9UT0RPCi8vVGhpcyBpcyBhIHByaW1pdGl2ZSBhbmQgaW5lZmZpY2llbnQgd3JhcHBlciBhcm91bmQgdGhlIGV4aXN0aW5nIEZyZWVSVE9TIG1lbW9yeSBtYW5hZ2VtZW50LgovL0EgYmV0dGVyIGltcGxlbWVudGF0aW9uIHdpbGwgaGF2ZSB0byBtb2RpZnkgaGVhcF94LmMhCgoKdHlwZWRlZiBzdHJ1Y3Qgb3NfcG9vbF9jYiB7CiAgdm9pZCAqcG9vbDsKICB1aW50OF90ICptYXJrZXJzOwogIHVpbnQzMl90IHBvb2xfc3o7CiAgdWludDMyX3QgaXRlbV9zejsKICB1aW50MzJfdCBjdXJyZW50SW5kZXg7Cn0gb3NfcG9vbF9jYl90OwoKCi8qKgoqIEBicmllZiBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBtZW1vcnkgcG9vbAoqIEBwYXJhbSAgcG9vbF9kZWYgICAgICBtZW1vcnkgcG9vbCBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbC4KKiBAcmV0dmFsICBtZW1vcnkgcG9vbCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zUG9vbENyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zUG9vbElkIG9zUG9vbENyZWF0ZSAoY29uc3Qgb3NQb29sRGVmX3QgKnBvb2xfZGVmKQp7CiNpZiAoY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSkKICBvc1Bvb2xJZCB0aGVQb29sOwogIGludCBpdGVtU2l6ZSA9IDQgKiAoKHBvb2xfZGVmLT5pdGVtX3N6ICsgMykgLyA0KTsKICB1aW50MzJfdCBpOwogIAogIC8qIEZpcnN0IGhhdmUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcG9vbCBjb250cm9sIGJsb2NrLiAqLwogdGhlUG9vbCA9IHB2UG9ydE1hbGxvYyhzaXplb2Yob3NfcG9vbF9jYl90KSk7CgogIAogIGlmICh0aGVQb29sKSB7CiAgICB0aGVQb29sLT5wb29sX3N6ID0gcG9vbF9kZWYtPnBvb2xfc3o7CiAgICB0aGVQb29sLT5pdGVtX3N6ID0gaXRlbVNpemU7CiAgICB0aGVQb29sLT5jdXJyZW50SW5kZXggPSAwOwogICAgCiAgICAvKiBNZW1vcnkgZm9yIG1hcmtlcnMgKi8KICAgIHRoZVBvb2wtPm1hcmtlcnMgPSBwdlBvcnRNYWxsb2MocG9vbF9kZWYtPnBvb2xfc3opOwogICAKICAgIGlmICh0aGVQb29sLT5tYXJrZXJzKSB7CiAgICAgIC8qIE5vdyBhbGxvY2F0ZSB0aGUgcG9vbCBpdHNlbGYuICovCiAgICAgdGhlUG9vbC0+cG9vbCA9IHB2UG9ydE1hbGxvYyhwb29sX2RlZi0+cG9vbF9zeiAqIGl0ZW1TaXplKTsKICAgICAgCiAgICAgIGlmICh0aGVQb29sLT5wb29sKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvb2xfZGVmLT5wb29sX3N6OyBpKyspIHsKICAgICAgICAgIHRoZVBvb2wtPm1hcmtlcnNbaV0gPSAwOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICB2UG9ydEZyZWUodGhlUG9vbC0+bWFya2Vycyk7CiAgICAgICAgdlBvcnRGcmVlKHRoZVBvb2wpOwogICAgICAgIHRoZVBvb2wgPSBOVUxMOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgdlBvcnRGcmVlKHRoZVBvb2wpOwogICAgICB0aGVQb29sID0gTlVMTDsKICAgIH0KICB9CgogIHJldHVybiB0aGVQb29sOwogCiNlbHNlCiAgcmV0dXJuIE5VTEw7CiNlbmRpZgp9CgovKioKKiBAYnJpZWYgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1lbW9yeSBwb29sCiogQHBhcmFtIHBvb2xfaWQgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbENyZWF0ZS4KKiBAcmV0dmFsICBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIG9yIE5VTEwgaW4gY2FzZSBvZiBubyBtZW1vcnkgYXZhaWxhYmxlLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xBbGxvYyBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCnZvaWQgKm9zUG9vbEFsbG9jIChvc1Bvb2xJZCBwb29sX2lkKQp7CiAgaW50IGR1bW15ID0gMDsKICB2b2lkICpwID0gTlVMTDsKICB1aW50MzJfdCBpOwogIHVpbnQzMl90IGluZGV4OwogIAogIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKICAgIGR1bW15ID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOwogIH0KICBlbHNlIHsKICAgIHZQb3J0RW50ZXJDcml0aWNhbCgpOwogIH0KICAKICBmb3IgKGkgPSAwOyBpIDwgcG9vbF9pZC0+cG9vbF9zejsgaSsrKSB7CiAgICBpbmRleCA9IChwb29sX2lkLT5jdXJyZW50SW5kZXggKyBpKSAlIHBvb2xfaWQtPnBvb2xfc3o7CiAgICAKICAgIGlmIChwb29sX2lkLT5tYXJrZXJzW2luZGV4XSA9PSAwKSB7CiAgICAgIHBvb2xfaWQtPm1hcmtlcnNbaW5kZXhdID0gMTsKICAgICAgcCA9ICh2b2lkICopKCh1aW50MzJfdCkocG9vbF9pZC0+cG9vbCkgKyAoaW5kZXggKiBwb29sX2lkLT5pdGVtX3N6KSk7CiAgICAgIHBvb2xfaWQtPmN1cnJlbnRJbmRleCA9IGluZGV4OwogICAgICBicmVhazsKICAgIH0KICB9CiAgCiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKGR1bW15KTsKICB9CiAgZWxzZSB7CiAgICB2UG9ydEV4aXRDcml0aWNhbCgpOwogIH0KICAKICByZXR1cm4gcDsKfQoKLyoqCiogQGJyaWVmIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gYSBtZW1vcnkgcG9vbCBhbmQgc2V0IG1lbW9yeSBibG9jayB0byB6ZXJvCiogQHBhcmFtICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCiogQHJldHZhbCAgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvciBOVUxMIGluIGNhc2Ugb2Ygbm8gbWVtb3J5IGF2YWlsYWJsZS4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NQb29sQ0FsbG9jIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kdm9pZCAqb3NQb29sQ0FsbG9jIChvc1Bvb2xJZCBwb29sX2lkKQp7CiAgdm9pZCAqcCA9IG9zUG9vbEFsbG9jKHBvb2xfaWQpOwogIAogIGlmIChwICE9IE5VTEwpCiAgewogICAgbWVtc2V0KHAsIDAsIHNpemVvZihwb29sX2lkLT5wb29sX3N6KSk7CiAgfQogIAogIHJldHVybiBwOwp9CgovKioKKiBAYnJpZWYgUmV0dXJuIGFuIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgYmFjayB0byBhIHNwZWNpZmljIG1lbW9yeSBwb29sCiogQHBhcmFtICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCiogQHBhcmFtICBibG9jayAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgdGhhdCBpcyByZXR1cm5lZCB0byB0aGUgbWVtb3J5IHBvb2wuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xGcmVlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NTdGF0dXMgb3NQb29sRnJlZSAob3NQb29sSWQgcG9vbF9pZCwgdm9pZCAqYmxvY2spCnsKICB1aW50MzJfdCBpbmRleDsKICAKICBpZiAocG9vbF9pZCA9PSBOVUxMKSB7CiAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgCiAgaWYgKGJsb2NrID09IE5VTEwpIHsKICAgIHJldHVybiBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICAKICBpZiAoYmxvY2sgPCBwb29sX2lkLT5wb29sKSB7CiAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgCiAgaW5kZXggPSAodWludDMyX3QpYmxvY2sgLSAodWludDMyX3QpKHBvb2xfaWQtPnBvb2wpOwogIGlmIChpbmRleCAlIHBvb2xfaWQtPml0ZW1fc3opIHsKICAgIHJldHVybiBvc0Vycm9yUGFyYW1ldGVyOwogIH0KICBpbmRleCA9IGluZGV4IC8gcG9vbF9pZC0+aXRlbV9zejsKICBpZiAoaW5kZXggPj0gcG9vbF9pZC0+cG9vbF9zeikgewogICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIAogIHBvb2xfaWQtPm1hcmtlcnNbaW5kZXhdID0gMDsKICAKICByZXR1cm4gb3NPSzsKfQoKCiNlbmRpZiAgIC8qIFVzZSBNZW1vcnkgUG9vbCBNYW5hZ2VtZW50ICovCgovKioqKioqKioqKioqKioqKioqKiAgIE1lc3NhZ2UgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX01lc3NhZ2VRKSAgJiYgIChvc0ZlYXR1cmVfTWVzc2FnZVEgIT0gMCkpIC8qIFVzZSBNZXNzYWdlIFF1ZXVlcyAqLwoKLyoqCiogQGJyaWVmIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE1lc3NhZ2UgUXVldWUKKiBAcGFyYW0gcXVldWVfZGVmICAgICBxdWV1ZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTWVzc2FnZVEuCiogQHBhcmFtICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCAob2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQpIG9yIE5VTEwuCiogQHJldHZhbCAgbWVzc2FnZSBxdWV1ZSBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWVzc2FnZUNyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zTWVzc2FnZVFJZCBvc01lc3NhZ2VDcmVhdGUgKGNvbnN0IG9zTWVzc2FnZVFEZWZfdCAqcXVldWVfZGVmLCBvc1RocmVhZElkIHRocmVhZF9pZCkKewogICh2b2lkKSB0aHJlYWRfaWQ7CiAgCiNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKCiAgaWYgKChxdWV1ZV9kZWYtPmJ1ZmZlciAhPSBOVUxMKSAmJiAocXVldWVfZGVmLT5jb250cm9sYmxvY2sgIT0gTlVMTCkpIHsKICAgIHJldHVybiB4UXVldWVDcmVhdGVTdGF0aWMocXVldWVfZGVmLT5xdWV1ZV9zeiwgcXVldWVfZGVmLT5pdGVtX3N6LCBxdWV1ZV9kZWYtPmJ1ZmZlciwgcXVldWVfZGVmLT5jb250cm9sYmxvY2spOwogIH0KICBlbHNlIHsKICAgIHJldHVybiB4UXVldWVDcmVhdGUocXVldWVfZGVmLT5xdWV1ZV9zeiwgcXVldWVfZGVmLT5pdGVtX3N6KTsKICB9CiNlbGlmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKICByZXR1cm4geFF1ZXVlQ3JlYXRlU3RhdGljKHF1ZXVlX2RlZi0+cXVldWVfc3osIHF1ZXVlX2RlZi0+aXRlbV9zeiwgcXVldWVfZGVmLT5idWZmZXIsIHF1ZXVlX2RlZi0+Y29udHJvbGJsb2NrKTsKI2Vsc2UgIAogIHJldHVybiB4UXVldWVDcmVhdGUocXVldWVfZGVmLT5xdWV1ZV9zeiwgcXVldWVfZGVmLT5pdGVtX3N6KTsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiBQdXQgYSBNZXNzYWdlIHRvIGEgUXVldWUuCiogQHBhcmFtICBxdWV1ZV9pZCAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNZXNzYWdlQ3JlYXRlLgoqIEBwYXJhbSAgaW5mbyAgICAgIG1lc3NhZ2UgaW5mb3JtYXRpb24uCiogQHBhcmFtICBtaWxsaXNlYyAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiogQHJldHZhbCBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWVzc2FnZVB1dCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zU3RhdHVzIG9zTWVzc2FnZVB1dCAob3NNZXNzYWdlUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBpbmZvLCB1aW50MzJfdCBtaWxsaXNlYykKewogIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuID0gcGRGQUxTRTsKICBUaWNrVHlwZV90IHRpY2tzOwogIAogIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CiAgaWYgKHRpY2tzID09IDApIHsKICAgIHRpY2tzID0gMTsKICB9CiAgCiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgaWYgKHhRdWV1ZVNlbmRGcm9tSVNSKHF1ZXVlX2lkLCAmaW5mbywgJnRhc2tXb2tlbikgIT0gcGRUUlVFKSB7CiAgICAgIHJldHVybiBvc0Vycm9yT1M7CiAgICB9CiAgICBwb3J0RU5EX1NXSVRDSElOR19JU1IodGFza1dva2VuKTsKICB9CiAgZWxzZSB7CiAgICBpZiAoeFF1ZXVlU2VuZChxdWV1ZV9pZCwgJmluZm8sIHRpY2tzKSAhPSBwZFRSVUUpIHsKICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKICAgIH0KICB9CiAgCiAgcmV0dXJuIG9zT0s7Cn0KCi8qKgoqIEBicmllZiBHZXQgYSBNZXNzYWdlIG9yIFdhaXQgZm9yIGEgTWVzc2FnZSBmcm9tIGEgUXVldWUuCiogQHBhcmFtICBxdWV1ZV9pZCAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNZXNzYWdlQ3JlYXRlLgoqIEBwYXJhbSAgbWlsbGlzZWMgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgoqIEByZXR2YWwgZXZlbnQgaW5mb3JtYXRpb24gdGhhdCBpbmNsdWRlcyBzdGF0dXMgY29kZS4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNZXNzYWdlR2V0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NFdmVudCBvc01lc3NhZ2VHZXQgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCnsKICBwb3J0QkFTRV9UWVBFIHRhc2tXb2tlbjsKICBUaWNrVHlwZV90IHRpY2tzOwogIG9zRXZlbnQgZXZlbnQ7CiAgCiAgZXZlbnQuZGVmLm1lc3NhZ2VfaWQgPSBxdWV1ZV9pZDsKICBldmVudC52YWx1ZS52ID0gMDsKICAKICBpZiAocXVldWVfaWQgPT0gTlVMTCkgewogICAgZXZlbnQuc3RhdHVzID0gb3NFcnJvclBhcmFtZXRlcjsKICAgIHJldHVybiBldmVudDsKICB9CiAgCiAgdGFza1dva2VuID0gcGRGQUxTRTsKICAKICB0aWNrcyA9IDA7CiAgaWYgKG1pbGxpc2VjID09IG9zV2FpdEZvcmV2ZXIpIHsKICAgIHRpY2tzID0gcG9ydE1BWF9ERUxBWTsKICB9CiAgZWxzZSBpZiAobWlsbGlzZWMgIT0gMCkgewogICAgdGlja3MgPSBtaWxsaXNlYyAvIHBvcnRUSUNLX1BFUklPRF9NUzsKICAgIGlmICh0aWNrcyA9PSAwKSB7CiAgICAgIHRpY2tzID0gMTsKICAgIH0KICB9CiAgCiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgaWYgKHhRdWV1ZVJlY2VpdmVGcm9tSVNSKHF1ZXVlX2lkLCAmZXZlbnQudmFsdWUudiwgJnRhc2tXb2tlbikgPT0gcGRUUlVFKSB7CiAgICAgIC8qIFdlIGhhdmUgbWFpbCAqLwogICAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50TWVzc2FnZTsKICAgIH0KICAgIGVsc2UgewogICAgICBldmVudC5zdGF0dXMgPSBvc09LOwogICAgfQogICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CiAgfQogIGVsc2UgewogICAgaWYgKHhRdWV1ZVJlY2VpdmUocXVldWVfaWQsICZldmVudC52YWx1ZS52LCB0aWNrcykgPT0gcGRUUlVFKSB7CiAgICAgIC8qIFdlIGhhdmUgbWFpbCAqLwogICAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50TWVzc2FnZTsKICAgIH0KICAgIGVsc2UgewogICAgICBldmVudC5zdGF0dXMgPSAodGlja3MgPT0gMCkgPyBvc09LIDogb3NFdmVudFRpbWVvdXQ7CiAgICB9CiAgfQogIAogIHJldHVybiBldmVudDsKfQoKI2VuZGlmICAgICAvKiBVc2UgTWVzc2FnZSBRdWV1ZXMgKi8KCi8qKioqKioqKioqKioqKioqKioqKiAgIE1haWwgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqLwojaWYgKGRlZmluZWQgKG9zRmVhdHVyZV9NYWlsUSkgICYmICAob3NGZWF0dXJlX01haWxRICE9IDApKSAgLyogVXNlIE1haWwgUXVldWVzICovCgoKdHlwZWRlZiBzdHJ1Y3Qgb3NfbWFpbFFfY2IgewogIGNvbnN0IG9zTWFpbFFEZWZfdCAqcXVldWVfZGVmOwogIFF1ZXVlSGFuZGxlX3QgaGFuZGxlOwogIG9zUG9vbElkIHBvb2w7Cn0gb3NfbWFpbFFfY2JfdDsKCi8qKgoqIEBicmllZiBDcmVhdGUgYW5kIEluaXRpYWxpemUgbWFpbCBxdWV1ZQoqIEBwYXJhbSAgcXVldWVfZGVmICAgICByZWZlcmVuY2UgdG8gdGhlIG1haWwgcXVldWUgZGVmaW5pdGlvbiBvYnRhaW4gd2l0aCBccmVmIG9zTWFpbFEKKiBAcGFyYW0gICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCAob2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQpIG9yIE5VTEwuCiogQHJldHZhbCBtYWlsIHF1ZXVlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NNYWlsUUlkIG9zTWFpbENyZWF0ZSAoY29uc3Qgb3NNYWlsUURlZl90ICpxdWV1ZV9kZWYsIG9zVGhyZWFkSWQgdGhyZWFkX2lkKQp7CiNpZiAoY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSkKICAodm9pZCkgdGhyZWFkX2lkOwogIAogIG9zUG9vbERlZl90IHBvb2xfZGVmID0ge3F1ZXVlX2RlZi0+cXVldWVfc3osIHF1ZXVlX2RlZi0+aXRlbV9zeiwgTlVMTH07CiAgCiAgLyogQ3JlYXRlIGEgbWFpbCBxdWV1ZSBjb250cm9sIGJsb2NrICovCgogICoocXVldWVfZGVmLT5jYikgPSBwdlBvcnRNYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19tYWlsUV9jYikpOwoKICBpZiAoKihxdWV1ZV9kZWYtPmNiKSA9PSBOVUxMKSB7CiAgICByZXR1cm4gTlVMTDsKICB9CiAgKCoocXVldWVfZGVmLT5jYikpLT5xdWV1ZV9kZWYgPSBxdWV1ZV9kZWY7CiAgCiAgLyogQ3JlYXRlIGEgcXVldWUgaW4gRnJlZVJUT1MgKi8KICAoKihxdWV1ZV9kZWYtPmNiKSktPmhhbmRsZSA9IHhRdWV1ZUNyZWF0ZShxdWV1ZV9kZWYtPnF1ZXVlX3N6LCBzaXplb2Yodm9pZCAqKSk7CgoKICBpZiAoKCoocXVldWVfZGVmLT5jYikpLT5oYW5kbGUgPT0gTlVMTCkgewogICAgdlBvcnRGcmVlKCoocXVldWVfZGVmLT5jYikpOwogICAgcmV0dXJuIE5VTEw7CiAgfQogIAogIC8qIENyZWF0ZSBhIG1haWwgcG9vbCAqLwogICgqKHF1ZXVlX2RlZi0+Y2IpKS0+cG9vbCA9IG9zUG9vbENyZWF0ZSgmcG9vbF9kZWYpOwogIGlmICgoKihxdWV1ZV9kZWYtPmNiKSktPnBvb2wgPT0gTlVMTCkgewogICAgLy9UT0RPOiBEZWxldGUgcXVldWUuIEhvdyB0byBkbyBpdCBpbiBGcmVlUlRPUz8KICAgIHZQb3J0RnJlZSgqKHF1ZXVlX2RlZi0+Y2IpKTsKICAgIHJldHVybiBOVUxMOwogIH0KICAKICByZXR1cm4gKihxdWV1ZV9kZWYtPmNiKTsKI2Vsc2UKICByZXR1cm4gTlVMTDsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgbWFpbAoqIEBwYXJhbSAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCiogQHBhcmFtICBtaWxsaXNlYyAgICAgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgoqIEByZXR2YWwgcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgdGhhdCBjYW4gYmUgZmlsbGVkIHdpdGggbWFpbCBvciBOVUxMIGluIGNhc2UgZXJyb3IuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbEFsbG9jIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kdm9pZCAqb3NNYWlsQWxsb2MgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCnsKICAodm9pZCkgbWlsbGlzZWM7CiAgdm9pZCAqcDsKICAKICAKICBpZiAocXVldWVfaWQgPT0gTlVMTCkgewogICAgcmV0dXJuIE5VTEw7CiAgfQogIAogIHAgPSBvc1Bvb2xBbGxvYyhxdWV1ZV9pZC0+cG9vbCk7CiAgCiAgcmV0dXJuIHA7Cn0KCi8qKgoqIEBicmllZiBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgbWFpbCBhbmQgc2V0IG1lbW9yeSBibG9jayB0byB6ZXJvCiogQHBhcmFtICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KKiBAcGFyYW0gIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiogQHJldHZhbCBwb2ludGVyIHRvIG1lbW9yeSBibG9jayB0aGF0IGNhbiBiZSBmaWxsZWQgd2l0aCBtYWlsIG9yIE5VTEwgaW4gY2FzZSBlcnJvci4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQ0FsbG9jIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kdm9pZCAqb3NNYWlsQ0FsbG9jIChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKQp7CiAgdWludDMyX3QgaTsKICB2b2lkICpwID0gb3NNYWlsQWxsb2MocXVldWVfaWQsIG1pbGxpc2VjKTsKICAKICBpZiAocCkgewogICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlX2lkLT5xdWV1ZV9kZWYtPml0ZW1fc3o7IGkrKykgewogICAgICAoKHVpbnQ4X3QgKilwKVtpXSA9IDA7CiAgICB9CiAgfQogIAogIHJldHVybiBwOwp9CgovKioKKiBAYnJpZWYgUHV0IGEgbWFpbCB0byBhIHF1ZXVlCiogQHBhcmFtICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KKiBAcGFyYW0gIG1haWwgICAgICAgICAgbWVtb3J5IGJsb2NrIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggXHJlZiBvc01haWxBbGxvYyBvciBccmVmIG9zTWFpbENBbGxvYy4KKiBAcmV0dmFsIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsUHV0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKi8Kb3NTdGF0dXMgb3NNYWlsUHV0IChvc01haWxRSWQgcXVldWVfaWQsIHZvaWQgKm1haWwpCnsKICBwb3J0QkFTRV9UWVBFIHRhc2tXb2tlbjsKICAKICAKICBpZiAocXVldWVfaWQgPT0gTlVMTCkgewogICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIAogIHRhc2tXb2tlbiA9IHBkRkFMU0U7CiAgCiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgaWYgKHhRdWV1ZVNlbmRGcm9tSVNSKHF1ZXVlX2lkLT5oYW5kbGUsICZtYWlsLCAmdGFza1dva2VuKSAhPSBwZFRSVUUpIHsKICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKICAgIH0KICAgIHBvcnRFTkRfU1dJVENISU5HX0lTUih0YXNrV29rZW4pOwogIH0KICBlbHNlIHsKICAgIGlmICh4UXVldWVTZW5kKHF1ZXVlX2lkLT5oYW5kbGUsICZtYWlsLCAwKSAhPSBwZFRSVUUpIHsgCiAgICAgIHJldHVybiBvc0Vycm9yT1M7CiAgICB9CiAgfQogIAogIHJldHVybiBvc09LOwp9CgovKioKKiBAYnJpZWYgR2V0IGEgbWFpbCBmcm9tIGEgcXVldWUKKiBAcGFyYW0gIHF1ZXVlX2lkICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgoqIEBwYXJhbSBtaWxsaXNlYyAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAoqIEByZXR2YWwgZXZlbnQgdGhhdCBjb250YWlucyBtYWlsIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbEdldCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCiovCm9zRXZlbnQgb3NNYWlsR2V0IChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKQp7CiAgcG9ydEJBU0VfVFlQRSB0YXNrV29rZW47CiAgVGlja1R5cGVfdCB0aWNrczsKICBvc0V2ZW50IGV2ZW50OwogIAogIGV2ZW50LmRlZi5tYWlsX2lkID0gcXVldWVfaWQ7CiAgCiAgaWYgKHF1ZXVlX2lkID09IE5VTEwpIHsKICAgIGV2ZW50LnN0YXR1cyA9IG9zRXJyb3JQYXJhbWV0ZXI7CiAgICByZXR1cm4gZXZlbnQ7CiAgfQogIAogIHRhc2tXb2tlbiA9IHBkRkFMU0U7CiAgCiAgdGlja3MgPSAwOwogIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSB7CiAgICB0aWNrcyA9IHBvcnRNQVhfREVMQVk7CiAgfQogIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIHsKICAgIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CiAgICBpZiAodGlja3MgPT0gMCkgewogICAgICB0aWNrcyA9IDE7CiAgICB9CiAgfQogIAogIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKICAgIGlmICh4UXVldWVSZWNlaXZlRnJvbUlTUihxdWV1ZV9pZC0+aGFuZGxlLCAmZXZlbnQudmFsdWUucCwgJnRhc2tXb2tlbikgPT0gcGRUUlVFKSB7CiAgICAgIC8qIFdlIGhhdmUgbWFpbCAqLwogICAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50TWFpbDsKICAgIH0KICAgIGVsc2UgewogICAgICBldmVudC5zdGF0dXMgPSBvc09LOwogICAgfQogICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CiAgfQogIGVsc2UgewogICAgaWYgKHhRdWV1ZVJlY2VpdmUocXVldWVfaWQtPmhhbmRsZSwgJmV2ZW50LnZhbHVlLnAsIHRpY2tzKSA9PSBwZFRSVUUpIHsKICAgICAgLyogV2UgaGF2ZSBtYWlsICovCiAgICAgIGV2ZW50LnN0YXR1cyA9IG9zRXZlbnRNYWlsOwogICAgfQogICAgZWxzZSB7CiAgICAgIGV2ZW50LnN0YXR1cyA9ICh0aWNrcyA9PSAwKSA/IG9zT0sgOiBvc0V2ZW50VGltZW91dDsKICAgIH0KICB9CiAgCiAgcmV0dXJuIGV2ZW50Owp9CgovKioKKiBAYnJpZWYgRnJlZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgbWFpbAoqIEBwYXJhbSAgcXVldWVfaWQgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgoqIEBwYXJhbSAgbWFpbCAgICAgcG9pbnRlciB0byB0aGUgbWVtb3J5IGJsb2NrIHRoYXQgd2FzIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxHZXQuCiogQHJldHZhbCBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbEZyZWUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoqLwpvc1N0YXR1cyBvc01haWxGcmVlIChvc01haWxRSWQgcXVldWVfaWQsIHZvaWQgKm1haWwpCnsKICBpZiAocXVldWVfaWQgPT0gTlVMTCkgewogICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CiAgfQogIAogIHJldHVybiBvc1Bvb2xGcmVlKHF1ZXVlX2lkLT5wb29sLCBtYWlsKTsKfQojZW5kaWYgIC8qIFVzZSBNYWlsIFF1ZXVlcyAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBBZGRpdGlvbmFsIHNwZWNpZmljIEFQSXMgdG8gRnJlZSBSVE9TICoqKioqKioqKioqKi8KLyoqCiogQGJyaWVmICBIYW5kbGVzIHRoZSB0aWNrIGluY3JlbWVudAoqIEBwYXJhbSAgbm9uZS4KKiBAcmV0dmFsIG5vbmUuCiovCnZvaWQgb3NTeXN0aWNrSGFuZGxlcih2b2lkKQp7CgojaWYgKElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSAgPT0gMSApCiAgaWYgKHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSAhPSB0YXNrU0NIRURVTEVSX05PVF9TVEFSVEVEKQogIHsKI2VuZGlmICAvKiBJTkNMVURFX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUgKi8gIAogICAgeFBvcnRTeXNUaWNrSGFuZGxlcigpOwojaWYgKElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSAgPT0gMSApCiAgfQojZW5kaWYgIC8qIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSAqLyAgCn0KCiNpZiAoIElOQ0xVREVfZVRhc2tHZXRTdGF0ZSA9PSAxICkKLyoqCiogQGJyaWVmICBPYnRhaW4gdGhlIHN0YXRlIG9mIGFueSB0aHJlYWQuCiogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgoqIEByZXR2YWwgIHRoZSBzdGFlIG9mIHRoZSB0aHJlYWQsIHN0YXRlcyBhcmUgZW5jb2RlZCBieSB0aGUgb3NUaHJlYWRTdGF0ZSBlbnVtZXJhdGVkIHR5cGUuCiovCm9zVGhyZWFkU3RhdGUgb3NUaHJlYWRHZXRTdGF0ZShvc1RocmVhZElkIHRocmVhZF9pZCkKewogIGVUYXNrU3RhdGUgVGhyZWFkU3RhdGU7CiAgb3NUaHJlYWRTdGF0ZSByZXN1bHQ7CiAgCiAgVGhyZWFkU3RhdGUgPSBlVGFza0dldFN0YXRlKHRocmVhZF9pZCk7CiAgCiAgc3dpdGNoIChUaHJlYWRTdGF0ZSkKICB7CiAgY2FzZSBlUnVubmluZyA6CiAgICByZXN1bHQgPSBvc1RocmVhZFJ1bm5pbmc7CiAgICBicmVhazsKICBjYXNlIGVSZWFkeSA6CiAgICByZXN1bHQgPSBvc1RocmVhZFJlYWR5OwogICAgYnJlYWs7CiAgY2FzZSBlQmxvY2tlZCA6CiAgICByZXN1bHQgPSBvc1RocmVhZEJsb2NrZWQ7CiAgICBicmVhazsKICBjYXNlIGVTdXNwZW5kZWQgOgogICAgcmVzdWx0ID0gb3NUaHJlYWRTdXNwZW5kZWQ7CiAgICBicmVhazsKICBjYXNlIGVEZWxldGVkIDoKICAgIHJlc3VsdCA9IG9zVGhyZWFkRGVsZXRlZDsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICByZXN1bHQgPSBvc1RocmVhZEVycm9yOwogIH0gCiAgCiAgcmV0dXJuIHJlc3VsdDsKfQojZW5kaWYgLyogSU5DTFVERV9lVGFza0dldFN0YXRlICovCgojaWYgKElOQ0xVREVfZVRhc2tHZXRTdGF0ZSA9PSAxKQovKioKKiBAYnJpZWYgQ2hlY2sgaWYgYSB0aHJlYWQgaXMgYWxyZWFkeSBzdXNwZW5kZWQgb3Igbm90LgoqIEBwYXJhbSB0aHJlYWRfaWQgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgoqIEByZXR2YWwgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqLwpvc1N0YXR1cyBvc1RocmVhZElzU3VzcGVuZGVkKG9zVGhyZWFkSWQgdGhyZWFkX2lkKQp7CiAgaWYgKGVUYXNrR2V0U3RhdGUodGhyZWFkX2lkKSA9PSBlU3VzcGVuZGVkKQogICAgcmV0dXJuIG9zT0s7CiAgZWxzZQogICAgcmV0dXJuIG9zRXJyb3JPUzsKfQojZW5kaWYgLyogSU5DTFVERV9lVGFza0dldFN0YXRlICovCi8qKgoqIEBicmllZiAgU3VzcGVuZCBleGVjdXRpb24gb2YgYSB0aHJlYWQuCiogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKi8Kb3NTdGF0dXMgb3NUaHJlYWRTdXNwZW5kIChvc1RocmVhZElkIHRocmVhZF9pZCkKewojaWYgKElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEpCiAgICB2VGFza1N1c3BlbmQodGhyZWFkX2lkKTsKICAKICByZXR1cm4gb3NPSzsKI2Vsc2UKICByZXR1cm4gb3NFcnJvclJlc291cmNlOwojZW5kaWYKfQoKLyoqCiogQGJyaWVmICBSZXN1bWUgZXhlY3V0aW9uIG9mIGEgc3VzcGVuZGVkIHRocmVhZC4KKiBAcGFyYW0gICB0aHJlYWRfaWQgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqLwpvc1N0YXR1cyBvc1RocmVhZFJlc3VtZSAob3NUaHJlYWRJZCB0aHJlYWRfaWQpCnsKI2lmIChJTkNMVURFX3ZUYXNrU3VzcGVuZCA9PSAxKSAgCiAgaWYoaW5IYW5kbGVyTW9kZSgpKQogIHsKICAgIGlmICh4VGFza1Jlc3VtZUZyb21JU1IodGhyZWFkX2lkKSA9PSBwZFRSVUUpCiAgICB7CiAgICAgIHBvcnRZSUVMRF9GUk9NX0lTUihwZFRSVUUpOwogICAgfQogIH0KICBlbHNlCiAgewogICAgdlRhc2tSZXN1bWUodGhyZWFkX2lkKTsKICB9CiAgcmV0dXJuIG9zT0s7CiNlbHNlCiAgcmV0dXJuIG9zRXJyb3JSZXNvdXJjZTsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiAgU3VzcGVuZCBleGVjdXRpb24gb2YgYSBhbGwgYWN0aXZlIHRocmVhZHMuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqLwpvc1N0YXR1cyBvc1RocmVhZFN1c3BlbmRBbGwgKHZvaWQpCnsKICB2VGFza1N1c3BlbmRBbGwoKTsKICAKICByZXR1cm4gb3NPSzsKfQoKLyoqCiogQGJyaWVmICBSZXN1bWUgZXhlY3V0aW9uIG9mIGEgYWxsIHN1c3BlbmRlZCB0aHJlYWRzLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKi8Kb3NTdGF0dXMgb3NUaHJlYWRSZXN1bWVBbGwgKHZvaWQpCnsKICBpZiAoeFRhc2tSZXN1bWVBbGwoKSA9PSBwZFRSVUUpCiAgICByZXR1cm4gb3NPSzsKICBlbHNlCiAgICByZXR1cm4gb3NFcnJvck9TOwogIAp9CgovKioKKiBAYnJpZWYgIERlbGF5IGEgdGFzayB1bnRpbCBhIHNwZWNpZmllZCB0aW1lCiogQHBhcmFtICAgUHJldmlvdXNXYWtlVGltZSAgIFBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0aGF0IGhvbGRzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSAKKiAgICAgICAgICB0YXNrIHdhcyBsYXN0IHVuYmxvY2tlZC4gUHJldmlvdXNXYWtlVGltZSBtdXN0IGJlIGluaXRpYWxpc2VkIHdpdGggdGhlIGN1cnJlbnQgdGltZQoqICAgICAgICAgIHByaW9yIHRvIGl0cyBmaXJzdCB1c2UgKFByZXZpb3VzV2FrZVRpbWUgPSBvc0tlcm5lbFN5c1RpY2soKSApCiogQHBhcmFtICAgbWlsbGlzZWMgICAgdGltZSBkZWxheSB2YWx1ZQoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKi8Kb3NTdGF0dXMgb3NEZWxheVVudGlsICh1aW50MzJfdCAqUHJldmlvdXNXYWtlVGltZSwgdWludDMyX3QgbWlsbGlzZWMpCnsKI2lmIElOQ0xVREVfdlRhc2tEZWxheVVudGlsCiAgVGlja1R5cGVfdCB0aWNrcyA9IChtaWxsaXNlYyAvIHBvcnRUSUNLX1BFUklPRF9NUyk7CiAgdlRhc2tEZWxheVVudGlsKChUaWNrVHlwZV90ICopIFByZXZpb3VzV2FrZVRpbWUsIHRpY2tzID8gdGlja3MgOiAxKTsKICAKICByZXR1cm4gb3NPSzsKI2Vsc2UKICAodm9pZCkgbWlsbGlzZWM7CiAgKHZvaWQpIFByZXZpb3VzV2FrZVRpbWU7CiAgCiAgcmV0dXJuIG9zRXJyb3JSZXNvdXJjZTsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiAgIEFib3J0IHRoZSBkZWxheSBmb3IgYSBzcGVjaWZpYyB0aHJlYWQKKiBAcGFyYW0gICB0aHJlYWRfaWQgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQgICAKKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zQWJvcnREZWxheShvc1RocmVhZElkIHRocmVhZF9pZCkKewojaWYgSU5DTFVERV94VGFza0Fib3J0RGVsYXkKICAKICB4VGFza0Fib3J0RGVsYXkodGhyZWFkX2lkKTsKICAKICByZXR1cm4gb3NPSzsKI2Vsc2UKICAodm9pZCkgdGhyZWFkX2lkOwogIAogIHJldHVybiBvc0Vycm9yUmVzb3VyY2U7CiNlbmRpZgp9CgovKioKKiBAYnJpZWYgICBMaXN0cyBhbGwgdGhlIGN1cnJlbnQgdGhyZWFkcywgYWxvbmcgd2l0aCB0aGVpciBjdXJyZW50IHN0YXRlIAoqICAgICAgICAgIGFuZCBzdGFjayB1c2FnZSBoaWdoIHdhdGVyIG1hcmsuCiogQHBhcmFtICAgYnVmZmVyICAgQSBidWZmZXIgaW50byB3aGljaCB0aGUgYWJvdmUgbWVudGlvbmVkIGRldGFpbHMKKiAgICAgICAgICB3aWxsIGJlIHdyaXR0ZW4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zVGhyZWFkTGlzdCAodWludDhfdCAqYnVmZmVyKQp7CiNpZiAoICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyA9PSAxICkgKQogIHZUYXNrTGlzdCgoY2hhciAqKWJ1ZmZlcik7CiNlbmRpZgogIHJldHVybiBvc09LOwp9CgovKioKKiBAYnJpZWYgIFJlY2VpdmUgYW4gaXRlbSBmcm9tIGEgcXVldWUgd2l0aG91dCByZW1vdmluZyB0aGUgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KKiBAcGFyYW0gIHF1ZXVlX2lkICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01lc3NhZ2VDcmVhdGUuCiogQHBhcmFtICBtaWxsaXNlYyAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiogQHJldHZhbCBldmVudCBpbmZvcm1hdGlvbiB0aGF0IGluY2x1ZGVzIHN0YXR1cyBjb2RlLgoqLwpvc0V2ZW50IG9zTWVzc2FnZVBlZWsgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCnsKICBUaWNrVHlwZV90IHRpY2tzOwogIG9zRXZlbnQgZXZlbnQ7CiAgCiAgZXZlbnQuZGVmLm1lc3NhZ2VfaWQgPSBxdWV1ZV9pZDsKICAKICBpZiAocXVldWVfaWQgPT0gTlVMTCkgewogICAgZXZlbnQuc3RhdHVzID0gb3NFcnJvclBhcmFtZXRlcjsKICAgIHJldHVybiBldmVudDsKICB9CiAgCiAgdGlja3MgPSAwOwogIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSB7CiAgICB0aWNrcyA9IHBvcnRNQVhfREVMQVk7CiAgfQogIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIHsKICAgIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CiAgICBpZiAodGlja3MgPT0gMCkgewogICAgICB0aWNrcyA9IDE7CiAgICB9CiAgfQogIAogIGlmICh4UXVldWVQZWVrKHF1ZXVlX2lkLCAmZXZlbnQudmFsdWUudiwgdGlja3MpID09IHBkVFJVRSkgCiAgewogICAgLyogV2UgaGF2ZSBtYWlsICovCiAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50TWVzc2FnZTsKICB9CiAgZWxzZSAKICB7CiAgICBldmVudC5zdGF0dXMgPSAodGlja3MgPT0gMCkgPyBvc09LIDogb3NFdmVudFRpbWVvdXQ7CiAgfQogIAogIHJldHVybiBldmVudDsKfQoKLyoqCiogQGJyaWVmICBHZXQgdGhlIG51bWJlciBvZiBtZXNzYWdlZCBzdG9yZWQgaW4gYSBxdWV1ZS4KKiBAcGFyYW0gIHF1ZXVlX2lkICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01lc3NhZ2VDcmVhdGUuCiogQHJldHZhbCBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIGEgcXVldWUuCiovCnVpbnQzMl90IG9zTWVzc2FnZVdhaXRpbmcob3NNZXNzYWdlUUlkIHF1ZXVlX2lkKQp7CiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgcmV0dXJuIHV4UXVldWVNZXNzYWdlc1dhaXRpbmdGcm9tSVNSKHF1ZXVlX2lkKTsKICB9CiAgZWxzZQogIHsKICAgIHJldHVybiB1eFF1ZXVlTWVzc2FnZXNXYWl0aW5nKHF1ZXVlX2lkKTsKICB9Cn0KCi8qKgoqIEBicmllZiAgR2V0IHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gYSBtZXNzYWdlIHF1ZXVlLgoqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKiBAcmV0dmFsIGF2YWlsYWJsZSBzcGFjZSBpbiBhIG1lc3NhZ2UgcXVldWUuCiovCnVpbnQzMl90IG9zTWVzc2FnZUF2YWlsYWJsZVNwYWNlKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCkgIAp7CiAgcmV0dXJuIHV4UXVldWVTcGFjZXNBdmFpbGFibGUocXVldWVfaWQpOwp9CgovKioKKiBAYnJpZWYgRGVsZXRlIGEgTWVzc2FnZSBRdWV1ZQoqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zTWVzc2FnZURlbGV0ZSAob3NNZXNzYWdlUUlkIHF1ZXVlX2lkKQp7CiAgaWYgKGluSGFuZGxlck1vZGUoKSkgewogICAgcmV0dXJuIG9zRXJyb3JJU1I7CiAgfQoKICB2UXVldWVEZWxldGUocXVldWVfaWQpOwoKICByZXR1cm4gb3NPSzsgCn0KCi8qKgoqIEBicmllZiAgQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgUmVjdXJzaXZlIE11dGV4CiogQHBhcmFtICBtdXRleF9kZWYgICAgIG11dGV4IGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NNdXRleC4KKiBAcmV0dmFsICBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuLgoqLwpvc011dGV4SWQgb3NSZWN1cnNpdmVNdXRleENyZWF0ZSAoY29uc3Qgb3NNdXRleERlZl90ICptdXRleF9kZWYpCnsKI2lmIChjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgPT0gMSkKI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQoKICBpZiAobXV0ZXhfZGVmLT5jb250cm9sYmxvY2sgIT0gTlVMTCl7CiAgICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4U3RhdGljKCBtdXRleF9kZWYtPmNvbnRyb2xibG9jayApOwogIH0KICBlbHNlIHsKICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXgoKTsKICB9CiNlbGlmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4U3RhdGljKCBtdXRleF9kZWYtPmNvbnRyb2xibG9jayApOwojZWxzZSAKICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4KCk7CiNlbmRpZgojZWxzZQogIHJldHVybiBOVUxMOwojZW5kaWYJCn0KCi8qKgoqIEBicmllZiAgUmVsZWFzZSBhIFJlY3Vyc2l2ZSBNdXRleAoqIEBwYXJhbSAgIG11dGV4X2lkICAgICAgbXV0ZXggSUQgb2J0YWluZWQgYnkgXHJlZiBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKi8Kb3NTdGF0dXMgb3NSZWN1cnNpdmVNdXRleFJlbGVhc2UgKG9zTXV0ZXhJZCBtdXRleF9pZCkKewojaWYgKGNvbmZpZ1VTRV9SRUNVUlNJVkVfTVVURVhFUyA9PSAxKQogIG9zU3RhdHVzIHJlc3VsdCA9IG9zT0s7CiAKICBpZiAoeFNlbWFwaG9yZUdpdmVSZWN1cnNpdmUobXV0ZXhfaWQpICE9IHBkVFJVRSkgCiAgewogICAgcmVzdWx0ID0gb3NFcnJvck9TOwogIH0KICByZXR1cm4gcmVzdWx0OwojZWxzZQoJcmV0dXJuIG9zRXJyb3JSZXNvdXJjZTsKI2VuZGlmCn0KCi8qKgoqIEBicmllZiAgUmVsZWFzZSBhIFJlY3Vyc2l2ZSBNdXRleAoqIEBwYXJhbSAgIG11dGV4X2lkICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NSZWN1cnNpdmVNdXRleENyZWF0ZS4KKiBAcGFyYW0gbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zUmVjdXJzaXZlTXV0ZXhXYWl0IChvc011dGV4SWQgbXV0ZXhfaWQsIHVpbnQzMl90IG1pbGxpc2VjKQp7CiNpZiAoY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEpCiAgVGlja1R5cGVfdCB0aWNrczsKICAKICBpZiAobXV0ZXhfaWQgPT0gTlVMTCkKICB7CiAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKICB9CiAgCiAgdGlja3MgPSAwOwogIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSAKICB7CiAgICB0aWNrcyA9IHBvcnRNQVhfREVMQVk7CiAgfQogIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIAogIHsKICAgIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CiAgICBpZiAodGlja3MgPT0gMCkgCiAgICB7CiAgICAgIHRpY2tzID0gMTsKICAgIH0KICB9CiAgCiAgaWYgKHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlKG11dGV4X2lkLCB0aWNrcykgIT0gcGRUUlVFKSAKICB7CiAgICByZXR1cm4gb3NFcnJvck9TOwogIH0KICByZXR1cm4gb3NPSzsKI2Vsc2UKCXJldHVybiBvc0Vycm9yUmVzb3VyY2U7CiNlbmRpZgp9CgovKioKKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgdmFsdWUgb2YgYSBjb3VudGluZyBzZW1hcGhvcmUKKiBAcGFyYW0gIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlX2lkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCiogQHJldHZhbCAgY291bnQgdmFsdWUKKi8KdWludDMyX3Qgb3NTZW1hcGhvcmVHZXRDb3VudChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCkKewogIHJldHVybiB1eFNlbWFwaG9yZUdldENvdW50KHNlbWFwaG9yZV9pZCk7Cn0K